@matrix-privacy/wallet 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/matrix/core/__tests__/providers.test.js +2 -2
- package/dist/services/matrix/core/__tests__/providers.test.js.map +1 -1
- package/dist/services/matrix/core/load-provider.js +4 -1
- package/dist/services/matrix/core/load-provider.js.map +1 -1
- package/dist/services/matrix/core/merkletree.js +2 -2
- package/dist/services/matrix/core/merkletree.js.map +1 -1
- package/dist/services/matrix/core/shields.js +1 -1
- package/dist/services/matrix/core/shields.js.map +1 -1
- package/dist/services/matrix/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js +1 -1
- package/dist/services/matrix/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js.map +1 -1
- package/dist/services/matrix/wallets/__tests__/balances-live.test.js +2 -2
- package/dist/services/matrix/wallets/__tests__/balances-live.test.js.map +1 -1
- package/dist/services/matrix/wallets/__tests__/balances-update.test.js +1 -1
- package/dist/services/matrix/wallets/__tests__/balances-update.test.js.map +1 -1
- package/dist/services/matrix/wallets/balance-update.js +2 -2
- package/dist/services/matrix/wallets/balance-update.js.map +1 -1
- package/dist/services/matrix/wallets/wallets.js +3 -0
- package/dist/services/matrix/wallets/wallets.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js +1 -1
- package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js.map +1 -1
- package/dist/services/transactions/__tests__/tx-unshield.test.js +2 -2
- package/dist/services/transactions/__tests__/tx-unshield.test.js.map +1 -1
- package/dist/services/transactions/tx-cross-contract-calls.js +4 -4
- package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -1
- package/dist/services/transactions/tx-generator.js +3 -3
- package/dist/services/transactions/tx-generator.js.map +1 -1
- package/dist/services/transactions/tx-shield-base-token.js +1 -1
- package/dist/services/transactions/tx-shield-base-token.js.map +1 -1
- package/dist/services/transactions/tx-shield.js +1 -1
- package/dist/services/transactions/tx-shield.js.map +1 -1
- package/dist/services/transactions/tx-unshield.js +2 -2
- package/dist/services/transactions/tx-unshield.js.map +1 -1
- package/dist/tests/local-e2e.js +2 -2
- package/dist/tests/local-e2e.js.map +1 -1
- package/dist/tests/setup.test.js +1 -1
- package/dist/tests/setup.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-cross-contract-calls.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-cross-contract-calls.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon, { SinonStub, SinonSpy } from 'sinon';\nimport {\n MatrixWallet,\n TransactionBatch,\n getTokenDataERC20,\n MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2,\n TransactionStructV3,\n RelayAdaptV3Contract,\n} from '@matrix-privacy/engine';\nimport {\n MatrixERC20Amount,\n NetworkName,\n NETWORK_CONFIG,\n EVMGasType,\n MatrixERC20AmountRecipient,\n TransactionGasDetails,\n isDefined,\n} from '@matrix-privacy/shared-models';\nimport {\n closeTestEngine,\n initTestEngine,\n initTestEngineNetworks,\n} from '../../../tests/setup.test';\nimport {\n MOCK_BOUND_PARAMS_V3,\n MOCK_COMMITMENTS,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_ERC20_RECIPIENTS,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_FEE_TOKEN_DETAILS,\n MOCK_FORMATTED_BROADCASTER_FEE_COMMITMENT_CIPHERTEXT_V3,\n MOCK_MNEMONIC,\n MOCK_NFT_AMOUNTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n MOCK_NULLIFIERS,\n MOCK_TOKEN_ADDRESS,\n MOCK_TOKEN_ADDRESS_2,\n MOCK_TOKEN_AMOUNTS,\n MOCK_TOKEN_FEE,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n} from '../../../tests/mocks.test';\nimport {\n createMatrixWallet,\n fullWalletForID,\n} from '../../matrix/wallets/wallets';\nimport { setCachedProvedTransaction } from '../proof-cache';\nimport {\n createNFTTokenDataFromMatrixNFTAmount,\n gasEstimateForUnprovenCrossContractCalls,\n generateCrossContractCallsProof,\n getRelayAdaptTransactionError,\n parseRelayAdaptReturnValue,\n populateProvedCrossContractCalls,\n} from '../tx-cross-contract-calls';\nimport FormattedRelayAdaptErrorLogs from './json/formatted-relay-adapt-error-logs.json';\nimport { ContractTransaction, FallbackProvider } from 'ethers';\n\nlet gasEstimateStub: SinonStub;\nlet railProveStub: SinonStub;\nlet railDummyProveStub: SinonStub;\nlet relayAdaptPopulateCrossContractCalls: SinonStub;\nlet relayAdaptGasEstimateStub: SinonStub;\nlet addUnshieldDataSpy: SinonSpy;\nlet erc20NoteSpy: SinonSpy;\n\nlet matrixWallet: MatrixWallet;\nlet broadcasterFeeERC20AmountRecipient: MatrixERC20AmountRecipient;\n\nconst hardhatRelayAdaptContract =\n NETWORK_CONFIG[NetworkName.Hardhat].relayAdaptContract;\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst mockERC20TokenData0 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[0].tokenAddress,\n);\nconst mockERC20TokenData1 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[1].tokenAddress,\n);\nconst mockNFTTokenData0 = createNFTTokenDataFromMatrixNFTAmount(\n MOCK_NFT_AMOUNTS[0],\n);\nconst mockNFTTokenData1 = createNFTTokenDataFromMatrixNFTAmount(\n MOCK_NFT_AMOUNTS[1],\n);\n\nconst mockCrossContractCalls: ContractTransaction[] = [\n {\n to: MOCK_ETH_WALLET_ADDRESS,\n data: '0x0789',\n value: BigInt('0x01'),\n },\n {\n to: MOCK_ETH_WALLET_ADDRESS,\n data: '0x9789',\n value: BigInt('0x02'),\n },\n];\n\nconst MOCK_TOKEN_AMOUNTS_DIFFERENT: MatrixERC20Amount[] = [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: 100n,\n },\n {\n tokenAddress: MOCK_TOKEN_ADDRESS_2,\n amount: 300n,\n },\n];\n\nconst overallBatchMinGasPrice = BigInt('0x1000');\n\nconst minGasLimit = MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;\n\nconst gasDetails: TransactionGasDetails = {\n evmGasType: EVMGasType.Type1,\n gasEstimate: 2000n,\n gasPrice: overallBatchMinGasPrice,\n};\n\nconst stubRelayAdaptGasEstimate = () => {\n relayAdaptGasEstimateStub = Sinon.stub(\n RelayAdaptV3Contract,\n 'estimateGasWithErrorHandler',\n ).resolves(BigInt('200'));\n};\n\nconst stubGasEstimateSuccess = () => {\n gasEstimateStub = Sinon.stub(\n FallbackProvider.prototype,\n 'estimateGas',\n ).resolves(BigInt('200'));\n};\n\nconst stubRelayAdaptGasEstimateFailure = () => {\n relayAdaptGasEstimateStub = Sinon.stub(\n RelayAdaptV3Contract,\n 'estimateGasWithErrorHandler',\n ).rejects(new Error('RelayAdapt multicall failed at index UNKNOWN.'));\n};\n\nconst spyOnSetUnshield = () => {\n addUnshieldDataSpy = Sinon.spy(TransactionBatch.prototype, 'addUnshieldData');\n};\n\ndescribe('tx-cross-contract-calls', () => {\n before(async function run() {\n this.timeout(60_000);\n await initTestEngine();\n await initTestEngineNetworks();\n\n const matrixWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(matrixWalletInfo)) {\n throw new Error('Expected matrixWalletInfo');\n }\n matrixWallet = fullWalletForID(matrixWalletInfo.id);\n\n const broadcasterWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(broadcasterWalletInfo)) {\n throw new Error('Expected broadcasterWalletInfo');\n }\n const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;\n\n broadcasterFeeERC20AmountRecipient = {\n ...MOCK_TOKEN_FEE,\n recipientAddress: broadcasterMatrixAddress,\n };\n\n railProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateTransactions',\n ).resolves({\n provedTransactions: [\n {\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[],\n });\n railDummyProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateDummyTransactions',\n ).resolves([\n {\n commitments: MOCK_COMMITMENTS,\n boundParams: MOCK_BOUND_PARAMS_V3,\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[]);\n relayAdaptPopulateCrossContractCalls = Sinon.stub(\n RelayAdaptV3Contract.prototype,\n 'populateCrossContractCalls',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n });\n afterEach(() => {\n gasEstimateStub?.restore();\n addUnshieldDataSpy?.restore();\n erc20NoteSpy?.restore();\n relayAdaptGasEstimateStub?.restore();\n });\n after(async () => {\n railProveStub.restore();\n railDummyProveStub.restore();\n relayAdaptPopulateCrossContractCalls.restore();\n await closeTestEngine();\n });\n\n // GAS ESTIMATE\n\n it('Should get gas estimates for valid cross contract calls', async () => {\n stubRelayAdaptGasEstimate();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 1 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 1 - nft 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 2 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 2 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 2 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 2 - nft 1\n ]);\n // Add 9000 for the dummy tx variance\n // expect(rsp.gasEstimate).to.equal(9000n + 280n);\n expect(rsp.gasEstimate).to.equal(3_200_000n); // Cross Contract Minimum\n }).timeout(10_000);\n\n it('Should get gas estimates for valid cross contract calls, public wallet', async () => {\n stubRelayAdaptGasEstimate();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n true, // sendWithPublicWallet\n minGasLimit,\n );\n\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 1 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 1 - nft 1\n ]);\n // Add 9000 for the dummy tx variance\n // expect(rsp.gasEstimate).to.equal(9000n + 280n);\n expect(rsp.gasEstimate).to.equal(3_200_000n); // Cross Contract Minimum\n }).timeout(10_000);\n\n it('Should error on gas estimates for invalid cross contract calls', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n [{ data: 'abc' } as ContractTransaction], // Invalid\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n ),\n ).rejectedWith(`Cross-contract calls require to and data fields.`);\n });\n\n it('Should error on cross contract calls gas estimate for ethers rejections', async () => {\n stubRelayAdaptGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n ),\n ).rejectedWith('RelayAdapt multicall failed at index UNKNOWN.');\n });\n\n // PROVE AND SEND\n\n it('Should populate tx for valid cross contract calls', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateCrossContractCallsProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n minGasLimit,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // dummy proof - erc20 token 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // dummy proof - erc20 token 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // dummy proof - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // actual proof - nft 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // actual proof - erc20 token 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // actual proof - erc20 token 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // actual proof - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // actual proof - nft 1\n ]);\n const populateResponse = await populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails, // gasDetails\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(2400n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n });\n\n it('Should error on populate tx for invalid cross contract calls', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n [{ data: '123' } as ContractTransaction], // Invalid\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate cross contract calls tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate cross contract calls tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateCrossContractCallsProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n minGasLimit,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should decode and parse relay adapt error logs (from failed Sushi V2 LP removal)', () => {\n const transactionError = getRelayAdaptTransactionError(\n NetworkName.Hardhat,\n FormattedRelayAdaptErrorLogs,\n );\n expect(transactionError).to.equal('ds-math-sub-underflow');\n });\n\n it('Should parse relay adapt log revert data', () => {\n const transactionError = parseRelayAdaptReturnValue(\n NetworkName.Hardhat,\n `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006408c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001564732d6d6174682d7375622d756e646572666c6f77000000000000000000000000000000000000000000000000000000000000000000000000000000`,\n );\n expect(transactionError).to.equal('ds-math-sub-underflow');\n });\n\n it('Should parse relay adapt revert data from matrix cookbook', () => {\n const transactionError = parseRelayAdaptReturnValue(\n NetworkName.Hardhat,\n `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d52656c617941646170743a205265667573696e6720746f2063616c6c205261696c67756e20636f6e747261637400000000000000000000000000000000000000`,\n );\n expect(transactionError).to.equal(\n 'RelayAdapt: Refusing to call Matrix contract',\n );\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tx-cross-contract-calls.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-cross-contract-calls.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon, { SinonStub, SinonSpy } from 'sinon';\nimport {\n MatrixWallet,\n TransactionBatch,\n getTokenDataERC20,\n MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2,\n TransactionStructV3,\n RelayAdaptV3Contract,\n} from '@matrix-privacy/engine';\nimport {\n MatrixERC20Amount,\n NetworkName,\n getNetworkConfig,\n EVMGasType,\n MatrixERC20AmountRecipient,\n TransactionGasDetails,\n isDefined,\n} from '@matrix-privacy/shared-models';\nimport {\n closeTestEngine,\n initTestEngine,\n initTestEngineNetworks,\n} from '../../../tests/setup.test';\nimport {\n MOCK_BOUND_PARAMS_V3,\n MOCK_COMMITMENTS,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_ERC20_RECIPIENTS,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_FEE_TOKEN_DETAILS,\n MOCK_FORMATTED_BROADCASTER_FEE_COMMITMENT_CIPHERTEXT_V3,\n MOCK_MNEMONIC,\n MOCK_NFT_AMOUNTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n MOCK_NULLIFIERS,\n MOCK_TOKEN_ADDRESS,\n MOCK_TOKEN_ADDRESS_2,\n MOCK_TOKEN_AMOUNTS,\n MOCK_TOKEN_FEE,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n} from '../../../tests/mocks.test';\nimport {\n createMatrixWallet,\n fullWalletForID,\n} from '../../matrix/wallets/wallets';\nimport { setCachedProvedTransaction } from '../proof-cache';\nimport {\n createNFTTokenDataFromMatrixNFTAmount,\n gasEstimateForUnprovenCrossContractCalls,\n generateCrossContractCallsProof,\n getRelayAdaptTransactionError,\n parseRelayAdaptReturnValue,\n populateProvedCrossContractCalls,\n} from '../tx-cross-contract-calls';\nimport FormattedRelayAdaptErrorLogs from './json/formatted-relay-adapt-error-logs.json';\nimport { ContractTransaction, FallbackProvider } from 'ethers';\n\nlet gasEstimateStub: SinonStub;\nlet railProveStub: SinonStub;\nlet railDummyProveStub: SinonStub;\nlet relayAdaptPopulateCrossContractCalls: SinonStub;\nlet relayAdaptGasEstimateStub: SinonStub;\nlet addUnshieldDataSpy: SinonSpy;\nlet erc20NoteSpy: SinonSpy;\n\nlet matrixWallet: MatrixWallet;\nlet broadcasterFeeERC20AmountRecipient: MatrixERC20AmountRecipient;\n\nconst hardhatRelayAdaptContract =\n getNetworkConfig(NetworkName.Hardhat).relayAdaptContract;\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst mockERC20TokenData0 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[0].tokenAddress,\n);\nconst mockERC20TokenData1 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[1].tokenAddress,\n);\nconst mockNFTTokenData0 = createNFTTokenDataFromMatrixNFTAmount(\n MOCK_NFT_AMOUNTS[0],\n);\nconst mockNFTTokenData1 = createNFTTokenDataFromMatrixNFTAmount(\n MOCK_NFT_AMOUNTS[1],\n);\n\nconst mockCrossContractCalls: ContractTransaction[] = [\n {\n to: MOCK_ETH_WALLET_ADDRESS,\n data: '0x0789',\n value: BigInt('0x01'),\n },\n {\n to: MOCK_ETH_WALLET_ADDRESS,\n data: '0x9789',\n value: BigInt('0x02'),\n },\n];\n\nconst MOCK_TOKEN_AMOUNTS_DIFFERENT: MatrixERC20Amount[] = [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: 100n,\n },\n {\n tokenAddress: MOCK_TOKEN_ADDRESS_2,\n amount: 300n,\n },\n];\n\nconst overallBatchMinGasPrice = BigInt('0x1000');\n\nconst minGasLimit = MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;\n\nconst gasDetails: TransactionGasDetails = {\n evmGasType: EVMGasType.Type1,\n gasEstimate: 2000n,\n gasPrice: overallBatchMinGasPrice,\n};\n\nconst stubRelayAdaptGasEstimate = () => {\n relayAdaptGasEstimateStub = Sinon.stub(\n RelayAdaptV3Contract,\n 'estimateGasWithErrorHandler',\n ).resolves(BigInt('200'));\n};\n\nconst stubGasEstimateSuccess = () => {\n gasEstimateStub = Sinon.stub(\n FallbackProvider.prototype,\n 'estimateGas',\n ).resolves(BigInt('200'));\n};\n\nconst stubRelayAdaptGasEstimateFailure = () => {\n relayAdaptGasEstimateStub = Sinon.stub(\n RelayAdaptV3Contract,\n 'estimateGasWithErrorHandler',\n ).rejects(new Error('RelayAdapt multicall failed at index UNKNOWN.'));\n};\n\nconst spyOnSetUnshield = () => {\n addUnshieldDataSpy = Sinon.spy(TransactionBatch.prototype, 'addUnshieldData');\n};\n\ndescribe('tx-cross-contract-calls', () => {\n before(async function run() {\n this.timeout(60_000);\n await initTestEngine();\n await initTestEngineNetworks();\n\n const matrixWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(matrixWalletInfo)) {\n throw new Error('Expected matrixWalletInfo');\n }\n matrixWallet = fullWalletForID(matrixWalletInfo.id);\n\n const broadcasterWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(broadcasterWalletInfo)) {\n throw new Error('Expected broadcasterWalletInfo');\n }\n const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;\n\n broadcasterFeeERC20AmountRecipient = {\n ...MOCK_TOKEN_FEE,\n recipientAddress: broadcasterMatrixAddress,\n };\n\n railProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateTransactions',\n ).resolves({\n provedTransactions: [\n {\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[],\n });\n railDummyProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateDummyTransactions',\n ).resolves([\n {\n commitments: MOCK_COMMITMENTS,\n boundParams: MOCK_BOUND_PARAMS_V3,\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[]);\n relayAdaptPopulateCrossContractCalls = Sinon.stub(\n RelayAdaptV3Contract.prototype,\n 'populateCrossContractCalls',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n });\n afterEach(() => {\n gasEstimateStub?.restore();\n addUnshieldDataSpy?.restore();\n erc20NoteSpy?.restore();\n relayAdaptGasEstimateStub?.restore();\n });\n after(async () => {\n railProveStub.restore();\n railDummyProveStub.restore();\n relayAdaptPopulateCrossContractCalls.restore();\n await closeTestEngine();\n });\n\n // GAS ESTIMATE\n\n it('Should get gas estimates for valid cross contract calls', async () => {\n stubRelayAdaptGasEstimate();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 1 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 1 - nft 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 2 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 2 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 2 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 2 - nft 1\n ]);\n // Add 9000 for the dummy tx variance\n // expect(rsp.gasEstimate).to.equal(9000n + 280n);\n expect(rsp.gasEstimate).to.equal(3_200_000n); // Cross Contract Minimum\n }).timeout(10_000);\n\n it('Should get gas estimates for valid cross contract calls, public wallet', async () => {\n stubRelayAdaptGasEstimate();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n true, // sendWithPublicWallet\n minGasLimit,\n );\n\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 2\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // run 1 - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // run 1 - nft 1\n ]);\n // Add 9000 for the dummy tx variance\n // expect(rsp.gasEstimate).to.equal(9000n + 280n);\n expect(rsp.gasEstimate).to.equal(3_200_000n); // Cross Contract Minimum\n }).timeout(10_000);\n\n it('Should error on gas estimates for invalid cross contract calls', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n [{ data: 'abc' } as ContractTransaction], // Invalid\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n ),\n ).rejectedWith(`Cross-contract calls require to and data fields.`);\n });\n\n it('Should error on cross contract calls gas estimate for ethers rejections', async () => {\n stubRelayAdaptGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n minGasLimit,\n ),\n ).rejectedWith('RelayAdapt multicall failed at index UNKNOWN.');\n });\n\n // PROVE AND SEND\n\n it('Should populate tx for valid cross contract calls', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateCrossContractCallsProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n minGasLimit,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // dummy proof - erc20 token 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // dummy proof - erc20 token 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // dummy proof - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // actual proof - nft 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // actual proof - erc20 token 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // actual proof - erc20 token 1\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData0,\n value: BigInt('1'),\n allowOverride: false,\n },\n ], // actual proof - nft 0\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockNFTTokenData1,\n value: BigInt('2'),\n allowOverride: false,\n },\n ], // actual proof - nft 1\n ]);\n const populateResponse = await populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails, // gasDetails\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(2400n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n });\n\n it('Should error on populate tx for invalid cross contract calls', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n [{ data: '123' } as ContractTransaction], // Invalid\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate cross contract calls tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate cross contract calls tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateCrossContractCallsProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n minGasLimit,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedCrossContractCalls(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT,\n MOCK_NFT_AMOUNTS,\n MOCK_ERC20_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS,\n mockCrossContractCalls,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should decode and parse relay adapt error logs (from failed Sushi V2 LP removal)', () => {\n const transactionError = getRelayAdaptTransactionError(\n NetworkName.Hardhat,\n FormattedRelayAdaptErrorLogs,\n );\n expect(transactionError).to.equal('ds-math-sub-underflow');\n });\n\n it('Should parse relay adapt log revert data', () => {\n const transactionError = parseRelayAdaptReturnValue(\n NetworkName.Hardhat,\n `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006408c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001564732d6d6174682d7375622d756e646572666c6f77000000000000000000000000000000000000000000000000000000000000000000000000000000`,\n );\n expect(transactionError).to.equal('ds-math-sub-underflow');\n });\n\n it('Should parse relay adapt revert data from matrix cookbook', () => {\n const transactionError = parseRelayAdaptReturnValue(\n NetworkName.Hardhat,\n `0x5c0dee5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d52656c617941646170743a205265667573696e6720746f2063616c6c205261696c67756e20636f6e747261637400000000000000000000000000000000000000`,\n );\n expect(transactionError).to.equal(\n 'RelayAdapt: Refusing to call Matrix contract',\n );\n });\n});\n"]}
|
|
@@ -50,7 +50,7 @@ let addUnshieldDataSpy;
|
|
|
50
50
|
let erc20NoteSpy;
|
|
51
51
|
let matrixWallet;
|
|
52
52
|
let broadcasterFeeERC20AmountRecipient;
|
|
53
|
-
const hardhatRelayAdaptContract = shared_models_1.
|
|
53
|
+
const hardhatRelayAdaptContract = (0, shared_models_1.getNetworkConfig)(shared_models_1.NetworkName.Hardhat).relayAdaptContract;
|
|
54
54
|
chai_1.default.use(chai_as_promised_1.default);
|
|
55
55
|
const { expect } = chai_1.default;
|
|
56
56
|
const mockERC20TokenData0 = (0, engine_1.getTokenDataERC20)(mocks_test_1.MOCK_TOKEN_AMOUNTS[0].tokenAddress);
|
|
@@ -466,7 +466,7 @@ describe('tx-unshield', () => {
|
|
|
466
466
|
let hadOriginalProvider;
|
|
467
467
|
const MOCK_USER_ADDRESS = '0x1234567890123456789012345678901234567890';
|
|
468
468
|
const MOCK_RELAYER_ADDRESS = '0x9876543210987654321098765432109876543210';
|
|
469
|
-
const MOCK_MATRIX_PROXY_ADDRESS = shared_models_1.
|
|
469
|
+
const MOCK_MATRIX_PROXY_ADDRESS = (0, shared_models_1.getNetworkConfig)(shared_models_1.NetworkName.Hardhat).accumulatorContract;
|
|
470
470
|
const MOCK_SHIELD_TXID = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';
|
|
471
471
|
const ERC20_TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
472
472
|
beforeEach(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-unshield.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-unshield.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,wEAA8C;AAC9C,kDAAmD;AACnD,mDAQgC;AAChC,iEAQuC;AACvC,0DAImC;AACnC,0DAemC;AACnC,gDAQwB;AACxB,4DAI8B;AAC9B,sEAAwD;AACxD,2DAA6C;AAC7C,0DAGsC;AACtC,2DAAiG;AACjG,gDAA4D;AAE5D,8EAKgD;AAGhD,IAAI,eAA0B,CAAC;AAC/B,IAAI,aAAwB,CAAC;AAC7B,IAAI,kBAA6B,CAAC;AAClC,IAAI,gBAA2B,CAAC;AAChC,IAAI,mCAA8C,CAAC;AACnD,IAAI,kBAA4B,CAAC;AACjC,IAAI,YAAsB,CAAC;AAE3B,IAAI,YAA0B,CAAC;AAC/B,IAAI,kCAA8D,CAAC;AAEnE,MAAM,yBAAyB,GAC7B,8BAAc,CAAC,2BAAW,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC;AAEzD,cAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AACzB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAI,CAAC;AAExB,MAAM,mBAAmB,GAAG,IAAA,0BAAiB,EAC3C,+BAAkB,CAAC,CAAC,CAAC,CAAC,YAAY,CACnC,CAAC;AACF,MAAM,mBAAmB,GAAG,IAAA,0BAAiB,EAC3C,+BAAkB,CAAC,CAAC,CAAC,CAAC,YAAY,CACnC,CAAC;AACF,MAAM,iBAAiB,GAAG,IAAA,wBAAe,EACvC,gDAAmC,CAAC,CAAC,CAAC,CAAC,UAAU,EACjD,gDAAmC,CAAC,CAAC,CAAC,CAAC,YAAqB,EAC5D,gDAAmC,CAAC,CAAC,CAAC,CAAC,UAAU,CAClD,CAAC;AACF,MAAM,iBAAiB,GAAG,IAAA,wBAAe,EACvC,gDAAmC,CAAC,CAAC,CAAC,CAAC,UAAU,EACjD,gDAAmC,CAAC,CAAC,CAAC,CAAC,YAAqB,EAC5D,gDAAmC,CAAC,CAAC,CAAC,CAAC,UAAU,CAClD,CAAC;AAEF,MAAM,4BAA4B,GAAwB;IACxD;QACE,YAAY,EAAE,+BAAkB;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;KACvB;IACD;QACE,YAAY,EAAE,iCAAoB;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;KACvB;CACF,CAAC;AAEF,MAAM,uBAAuB,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEjD,MAAM,UAAU,GAA0B;IACxC,UAAU,EAAE,0BAAU,CAAC,KAAK;IAC5B,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,uBAAuB;CAClC,CAAC;AACF,MAAM,eAAe,GAA0B;IAC7C,UAAU,EAAE,0BAAU,CAAC,KAAK;IAC5B,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,uBAAuB;IACrC,oBAAoB,EAAE,uBAAuB;CAC9C,CAAC;AAEF,MAAM,oCAAoC,GACxC,+BAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrC,GAAG,WAAW;IACd,gBAAgB,EAAE,uCAA0B;CAC7C,CAAC,CAAC,CAAC;AAEN,MAAM,4BAA4B,GAChC,+BAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrC,GAAG,WAAW;IACd,gBAAgB,EAAE,oCAAuB;CAC1C,CAAC,CAAC,CAAC;AAEN,MAAM,sCAAsC,GAC1C,4BAA4B,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/C,GAAG,WAAW;IACd,gBAAgB,EAAE,oCAAuB;CAC1C,CAAC,CAAC,CAAC;AAEN,MAAM,sBAAsB,GAAG,GAAG,EAAE;IAClC,eAAe,GAAG,eAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CACzE,MAAM,CAAC,KAAK,CAAC,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,GAAG,EAAE;IAClC,eAAe,GAAG,eAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,OAAO,CACxE,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAC3C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,kBAAkB,GAAG,eAAK,CAAC,GAAG,CAAC,yBAAgB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,CAAC,KAAK,UAAU,GAAG;QACvB,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QACrB,MAAM,IAAA,2BAAc,GAAE,CAAC;QACvB,MAAM,IAAA,mCAAsB,GAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,MAAM,IAAA,4BAAkB,EAC/C,mCAAsB,EACtB,0BAAa,EACb,SAAS,CACV,CAAC;QACF,IAAI,CAAC,IAAA,yBAAS,EAAC,gBAAgB,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QACD,YAAY,GAAG,IAAA,yBAAe,EAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAEpD,MAAM,qBAAqB,GAAG,MAAM,IAAA,4BAAkB,EACpD,mCAAsB,EACtB,0BAAa,EACb,SAAS,CACV,CAAC;QACF,IAAI,CAAC,IAAA,yBAAS,EAAC,qBAAqB,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;SACnD;QACD,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,aAAa,CAAC;QAErE,kCAAkC,GAAG;YACnC,GAAG,2BAAc;YACjB,gBAAgB,EAAE,wBAAwB;SAC3C,CAAC;QAEF,aAAa,GAAG,eAAK,CAAC,IAAI,CACxB,yBAAgB,CAAC,SAAS,EAC1B,sBAAsB,CACvB,CAAC,QAAQ,CAAC;YACT,kBAAkB,EAAE;gBAClB;oBACE,UAAU,EAAE,4BAAe;iBAC5B;aACyB;SAC7B,CAAC,CAAC;QACH,kBAAkB,GAAG,eAAK,CAAC,IAAI,CAC7B,yBAAgB,CAAC,SAAS,EAC1B,2BAA2B,CAC5B,CAAC,QAAQ,CAAC;YACT;gBACE,WAAW,EAAE,6BAAgB;gBAC7B,WAAW,EAAE,iCAAoB;gBACjC,UAAU,EAAE,4BAAe;aAC5B;SACyB,CAAC,CAAC;QAC9B,gBAAgB,GAAG,eAAK,CAAC,IAAI,CAC3B,wBAAe,EACf,kBAAkB,CACnB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAyB,CAAC,CAAC;QACtD,mCAAmC,GAAG,eAAK,CAAC,IAAI,CAC9C,6BAAoB,CAAC,SAAS,EAC9B,2BAA2B,CAC5B,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAyB,CAAC,CAAC;QAEtD,yBAAyB;QACzB,MAAM,IAAA,kDAA8B,EAClC,YAAY,CAAC,WAAW,EACxB,+BAAkB,EAClB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,eAAe,EAAE,OAAO,EAAE,CAAC;QAC3B,kBAAkB,EAAE,OAAO,EAAE,CAAC;QAC9B,YAAY,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,aAAa,CAAC,OAAO,EAAE,CAAC;QACxB,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAC7B,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC3B,mCAAmC,CAAC,OAAO,EAAE,CAAC;QAC9C,IAAA,sCAAkB,GAAE,CAAC;QACrB,MAAM,IAAA,4BAAe,GAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAE1B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,sBAAsB,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,IAAA,4CAA8B,EAC9C,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,4BAA4B,EAC5B,EAAE,EAAE,sBAAsB;QAC1B,2DAA8C,EAC9C,mCAAsB,EACtB,KAAK,CACN,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF,EAAE,kBAAkB;SACtB,CAAC,CAAC;QACH,qCAAqC;QACrC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;IAEnB,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,sBAAsB,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,IAAA,oDAAsC,EACtD,iDAA6B,EAAE,qBAAqB;QACpD,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB;YACE;gBACE,YAAY,EAAE,+BAAkB;gBAChC,MAAM,EAAE,sCAAkB;gBAC1B,gBAAgB,EAAE,oCAAuB;aAC1C;SACF,EACD,EAAE,CACH,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,sCAAkB;oBACzB,aAAa,EAAE,KAAK;iBACrB;aACF;SACF,CAAC,CAAC;QACH,qCAAqC;QACrC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;IAEnB,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,sBAAsB,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,IAAA,4CAA8B,EAC5B,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,oCAAoC,EACpC,EAAE,EAAE,sBAAsB;QAC1B,2DAA8C,EAC9C,mCAAsB,EACtB,KAAK,CACN,CACF,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,sBAAsB,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,IAAA,4CAA8B,EAC5B,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,4BAA4B,EAC5B,EAAE,EAAE,sBAAsB;QAC1B,2DAA8C,EAC9C,mCAAsB,EACtB,KAAK,CACN,CACF,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,qCAAqC;IAErC,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,sBAAsB,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,IAAA,qDAAuC,EACvD,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,+BAAkB,CAAC,CAAC,CAAC,EACrB,2DAA8C,EAC9C,mCAAsB,EACtB,KAAK,CACN,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,yBAAyB;oBACpC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,yBAAyB;oBACpC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;SACF,CAAC,CAAC;QACH,qCAAqC;QACrC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;IAEnB,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,sBAAsB,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,IAAA,qDAAuC,EACvD,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,+BAAkB,CAAC,CAAC,CAAC,EACrB,2DAA8C,EAC9C,mCAAsB,EACtB,IAAI,CACL,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,yBAAyB;oBACpC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;SACF,CAAC,CAAC;QACH,qCAAqC;QACrC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;IAEnB,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,sBAAsB,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,IAAA,qDAAuC,EACrC,2BAAW,CAAC,OAAO,EACnB,uCAA0B,EAC1B,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,+BAAkB,CAAC,CAAC,CAAC,EACrB,2DAA8C,EAC9C,mCAAsB,EACtB,KAAK,CACN,CACF,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,sBAAsB,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,IAAA,qDAAuC,EACrC,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,+BAAkB,CAAC,CAAC,CAAC,EACrB,2DAA8C,EAC9C,mCAAsB,EACtB,KAAK,CACN,CACF,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAE5B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,sBAAsB,EAAE,CAAC;QACzB,IAAA,wCAA0B,EAAC,SAAS,CAAC,CAAC;QACtC,gBAAgB,EAAE,CAAC;QACnB,MAAM,IAAA,yCAAqB,EACzB,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,4BAA4B,EAC5B,gDAAmC,EACnC,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,iBAAiB;oBAC5B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;oBAChB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,iBAAiB;oBAC5B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;oBAChB,aAAa,EAAE,KAAK;iBACrB;aACF,EAAE,sBAAsB;SAC1B,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,IAAA,oCAAsB,EACnD,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,4BAA4B,EAC5B,gDAAmC,EACnC,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAChD,oEAAoE;YACpE,oEAAoE;SACrE,CAAC,CAAC;QAEH,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC;QAEzC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,sBAAsB,EAAE,CAAC;QACzB,IAAA,wCAA0B,EAAC,SAAS,CAAC,CAAC;QACtC,gBAAgB,EAAE,CAAC;QACnB,MAAM,IAAA,iDAA6B,EACjC,iDAA6B,EAAE,qBAAqB;QACpD,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB;YACE;gBACE,YAAY,EAAE,+BAAkB;gBAChC,MAAM,EAAE,sCAAkB;gBAC1B,gBAAgB,EAAE,oCAAuB;aAC1C;SACF,EACD,EAAE,EACF,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,oCAAuB;oBAClC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,sCAAkB;oBACzB,aAAa,EAAE,KAAK;iBACrB;aACF,EAAE,wBAAwB;SAC5B,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,IAAA,4CAA8B,EAC3D,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf;YACE;gBACE,YAAY,EAAE,+BAAkB;gBAChC,MAAM,EAAE,sCAAkB;gBAC1B,gBAAgB,EAAE,oCAAuB;aAC1C;SACF,EACD,EAAE,EACF,eAAe,CAChB,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAChD,oEAAoE;YACpE,oEAAoE;SACrE,CAAC,CAAC;QAEH,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC;QAEzC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,sBAAsB,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,IAAA,oCAAsB,EACpB,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,sCAAsC,EACtC,gDAAmC,EACnC,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CACF,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,sBAAsB,EAAE,CAAC;QACzB,IAAA,wCAA0B,EAAC,SAAS,CAAC,CAAC;QACtC,MAAM,MAAM,CACV,IAAA,oCAAsB,EACpB,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,4BAA4B,EAC5B,EAAE,EAAE,sBAAsB;QAC1B,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CACF,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,sBAAsB,EAAE,CAAC;QACzB,MAAM,IAAA,yCAAqB,EACzB,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,4BAA4B,EAC5B,EAAE,EAAE,sBAAsB;QAC1B,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,MAAM,MAAM,CACV,IAAA,oCAAsB,EACpB,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,sCAAsC,EACtC,EAAE,EAAE,sBAAsB;QAC1B,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CACF,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,uCAAuC;IAEvC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,sBAAsB,EAAE,CAAC;QACzB,IAAA,wCAA0B,EAAC,SAAS,CAAC,CAAC;QACtC,gBAAgB,EAAE,CAAC;QACnB,MAAM,IAAA,kDAA8B,EAClC,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,+BAAkB,CAAC,CAAC,CAAC,EACrB,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5C;gBACE;oBACE,SAAS,EAAE,yBAAyB;oBACpC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF;YACD;gBACE;oBACE,SAAS,EAAE,yBAAyB;oBACpC,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACvB,aAAa,EAAE,KAAK;iBACrB;aACF,EAAE,eAAe;SACnB,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,IAAA,6CAA+B,EAC5D,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,+BAAkB,CAAC,CAAC,CAAC,EACrB,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC;QAEzC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;IAEnB,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,sBAAsB,EAAE,CAAC;QACzB,MAAM,MAAM,CACV,IAAA,6CAA+B,EAC7B,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,4BAA4B,CAAC,CAAC,CAAC,EAC/B,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CACF,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,sBAAsB,EAAE,CAAC;QACzB,IAAA,wCAA0B,EAAC,SAAS,CAAC,CAAC;QACtC,MAAM,MAAM,CACV,IAAA,6CAA+B,EAC7B,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,oCAAuB,EACvB,+BAAkB,CAAC,CAAC,CAAC,EACrB,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CACF,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC1G,sBAAsB,EAAE,CAAC;QACzB,MAAM,IAAA,kDAA8B,EAClC,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,mCAAsB,EACtB,+BAAkB,CAAC,CAAC,CAAC,EACrB,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,MAAM,MAAM,CACV,IAAA,6CAA+B,EAC7B,2BAAW,CAAC,OAAO,EACnB,oCAAuB,EACvB,YAAY,CAAC,EAAE,EACf,4BAA4B,CAAC,CAAC,CAAC,EAC/B,kCAAkC,EAClC,KAAK,EAAE,uBAAuB;QAC9B,uBAAuB,EACvB,UAAU,CACX,CACF,CAAC,YAAY,CAAC,oCAAoC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAI,gBAA8C,CAAC;QACnD,IAAI,mBAA4B,CAAC;QAEjC,MAAM,iBAAiB,GAAG,4CAA4C,CAAC;QACvE,MAAM,oBAAoB,GAAG,4CAA4C,CAAC;QAC1E,MAAM,yBAAyB,GAAG,8BAAc,CAAC,2BAAW,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC;QAC1F,MAAM,gBAAgB,GAAG,oEAAoE,CAAC;QAC9F,MAAM,8BAA8B,GAAG,oEAAoE,CAAC;QAE5G,UAAU,CAAC,GAAG,EAAE;YACd,sCAAsC;YACtC,IAAI;gBACF,gBAAgB,GAAG,YAAY,CAAC,6BAA6B,CAAC,2BAAW,CAAC,OAAO,CAAC,CAAC;gBACnF,mBAAmB,GAAG,IAAI,CAAC;aAC5B;YAAC,MAAM;gBACN,gBAAgB,GAAG,SAAS,CAAC;gBAC7B,mBAAmB,GAAG,KAAK,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE;YACb,wCAAwC;YACxC,IAAI,mBAAmB,IAAI,gBAAgB,EAAE;gBAC3C,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;aACtE;iBAAM,IAAI,CAAC,mBAAmB,EAAE;gBAC/B,iCAAiC;gBACjC,OAAO,+BAAmB,CAAC,2BAAW,CAAC,OAAO,CAAC,CAAC;aACjD;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,qBAAqB,GAAG,CAC5B,WAAmB,EACnB,SAAiB,EACjB,eAAuB,+BAAkB,EACzC,EAAE;YACF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACjF,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAE7E,OAAO;gBACL,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE;oBACN,8BAA8B;oBAC9B,KAAK,UAAU,EAAE;oBACjB,KAAK,QAAQ,EAAE;iBAChB;gBACD,IAAI,EAAE,oEAAoE;gBAC1E,WAAW,EAAE,KAAK;gBAClB,eAAe,EAAE,gBAAgB;gBACjC,gBAAgB,EAAE,CAAC;gBACnB,SAAS,EAAE,aAAa;gBACxB,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC;aACT,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CAAC,IAAW,EAAE,EAAE;YACxC,OAAO;gBACL,EAAE,EAAE,yBAAyB;gBAC7B,IAAI,EAAE,oBAAoB;gBAC1B,eAAe,EAAE,IAAI;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;gBACvB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,aAAa;gBACxB,eAAe,EAAE,gBAAgB;gBACjC,IAAI;gBACJ,WAAW,EAAE,KAAK;gBAClB,aAAa,EAAE,EAAE;gBACjB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;gBACjC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC;gBACrC,MAAM,EAAE,CAAC;gBACT,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,CAAC;aACT,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,qBAAqB,GAAG,CAAC,WAAmB,EAAE,EAAE;YACpD,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,yBAAyB;gBAC7B,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;gBACxB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;gBACpB,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,CAAC;gBACP,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC,CAAC;QAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK;YACjD,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,CAAC;gBACD,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;aAClD,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,CACV,IAAA,+DAAiD,EAC/C,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CACF,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,sCAAsC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK;YACxD,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;gBACpE,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBAChC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtD,CAAC;aACK,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,CACV,IAAA,+DAAiD,EAC/C,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CACF,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK;YAC/E,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE;oBACzB,0BAA0B;oBAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;oBACvD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,CAAC;gBACD,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBAChC,0BAA0B;oBAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtD,CAAC;aACK,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,gEAAgE;YAChE,qCAAqC;YACrC,MAAM,MAAM,CACV,IAAA,+DAAiD,EAC/C,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CACF,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK;YAC/D,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE;oBACzB,iDAAiD;oBACjD,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC/B,CAAC;gBACD,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;aAClD,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,oDAAoD;YACpD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/C,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,EAAE,IAAI,CAAC,CAC/E,CAAC;YAEF,MAAM,WAAW,GAAG,IAAA,+DAAiD,EACnE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,MAAM,CACV,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAC5C,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,mCAAmC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK;YACtE,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;gBACpE,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBAChC,iDAAiD;oBACjD,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC/B,CAAC;aACK,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,oDAAoD;YACpD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/C,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,EAAE,IAAI,CAAC,CACtF,CAAC;YAEF,MAAM,WAAW,GAAG,IAAA,+DAAiD,EACnE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,MAAM,CACV,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAC5C,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,0CAA0C,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sFAAsF,EAAE,KAAK;YAC9F,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,WAAW,GAAG,qBAAqB,CACvC,iBAAiB,EACjB,yBAAyB,CAC1B,CAAC;YAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;YAEpE,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe;gBAC3C,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aACxC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,+DAAiD,EACpE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAC/D,iBAAiB,EACjB,uEAAuE,CACxE,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK;YAC9E,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,WAAW,GAAG,qBAAqB,CACvC,iBAAiB,EACjB,yBAAyB,CAC1B,CAAC;YAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;YAEjE,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe;gBAC3C,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aACxC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,+DAAiD,EACpE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAC/D,iBAAiB,CAClB,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK;YACvE,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,qBAAqB,GAAG,qBAAqB,CACjD,iBAAiB,EACjB,oCAAuB,CACxB,CAAC;YAEF,MAAM,mBAAmB,GAAG,qBAAqB,CAC/C,iBAAiB,EACjB,yBAAyB,CAC1B,CAAC;YAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC;gBACpC,qBAAqB;gBACrB,mBAAmB;aACpB,CAAC,CAAC;YACH,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;YAEpE,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe;gBAC3C,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aACxC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,+DAAiD,EACpE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAC/D,iBAAiB,CAClB,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK;YAClE,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,eAAe,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;YAEjE,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe;gBAC3C,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aACxC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,+DAAiD,EACpE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAC/D,iBAAiB,EACjB,oDAAoD,CACrD,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK;YACvD,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,OAAO,EAAE,+BAAkB;gBAC3B,MAAM,EAAE,CAAC,8BAA8B,CAAC;gBACxC,IAAI,EAAE,oEAAoE;gBAC1E,WAAW,EAAE,KAAK;gBAClB,eAAe,EAAE,gBAAgB;gBACjC,gBAAgB,EAAE,CAAC;gBACnB,SAAS,EAAE,aAAa;gBACxB,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC;aACT,CAAC;YAEF,MAAM,QAAQ,GAAG,qBAAqB,CACpC,iBAAiB,EACjB,yBAAyB,CAC1B,CAAC;YAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;YAEpE,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe;gBAC3C,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aACxC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,+DAAiD,EACpE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAC/D,iBAAiB,EACjB,iDAAiD,CAClD,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK;YAC1D,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;gBAChC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;aAClD,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,CACV,IAAA,+DAAiD,EAC/C,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CACF,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,4CAA4C,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK;YACtD,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;gBACpE,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aACjC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,CACV,IAAA,+DAAiD,EAC/C,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CACF,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,oDAAoD,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK;YAChE,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;YAErB,MAAM,YAAY,GAAG,4CAA4C,CAAC;YAClE,MAAM,YAAY,GAAG,4CAA4C,CAAC;YAElE,MAAM,YAAY,GAAG,qBAAqB,CACxC,YAAY,EACZ,yBAAyB,CAC1B,CAAC;YAEF,MAAM,YAAY,GAAG,qBAAqB,CACxC,YAAY,EACZ,yBAAyB,CAC1B,CAAC;YAEF,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;YACpE,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;YAEpE,MAAM,YAAY,GAAG;gBACnB,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe;gBAC3C,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aACxC,CAAC;YAET,IAAA,yCAA6B,EAAC,2BAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAA,+DAAiD,EACpE,2BAAW,CAAC,OAAO,EACnB,YAAY,CAAC,EAAE,EACf,gBAAgB,CACjB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBACrF,MAAM,YAAY,GAChB,aAAa,KAAK,YAAY,CAAC,WAAW,EAAE;oBAC5C,aAAa,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;aACjC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon, { SinonStub, SinonSpy } from 'sinon';\nimport {\n MatrixContracts,\n MatrixWallet,\n RelayAdaptV3Contract,\n TransactionBatch,\n TransactionStructV3,\n getTokenDataERC20,\n getTokenDataNFT,\n} from '@matrix-privacy/engine';\nimport {\n MatrixERC20Amount,\n NetworkName,\n NETWORK_CONFIG,\n EVMGasType,\n MatrixERC20AmountRecipient,\n TransactionGasDetails,\n isDefined,\n} from '@matrix-privacy/shared-models';\nimport {\n closeTestEngine,\n initTestEngine,\n initTestEngineNetworks,\n} from '../../../tests/setup.test';\nimport {\n MOCK_BOUND_PARAMS_V3,\n MOCK_COMMITMENTS,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_FEE_TOKEN_DETAILS,\n MOCK_MNEMONIC,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n MOCK_NULLIFIERS,\n MOCK_MATRIX_WALLET_ADDRESS,\n MOCK_TOKEN_ADDRESS,\n MOCK_TOKEN_ADDRESS_2,\n MOCK_TOKEN_AMOUNTS,\n MOCK_TOKEN_FEE,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n} from '../../../tests/mocks.test';\nimport {\n populateProvedUnshield,\n gasEstimateForUnprovenUnshield,\n populateProvedUnshieldBaseToken,\n gasEstimateForUnprovenUnshieldBaseToken,\n populateProvedUnshieldToOrigin,\n gasEstimateForUnprovenUnshieldToOrigin,\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin,\n} from '../tx-unshield';\nimport {\n generateUnshieldBaseTokenProof,\n generateUnshieldProof,\n generateUnshieldToOriginProof,\n} from '../tx-proof-unshield';\nimport * as txGasDetailsModule from '../tx-gas-details';\nimport * as matrixModule from '../../matrix';\nimport {\n createMatrixWallet,\n fullWalletForID,\n} from '../../matrix/wallets/wallets';\nimport { setFallbackProviderForNetwork, fallbackProviderMap } from '../../matrix/core/providers';\nimport { setCachedProvedTransaction } from '../proof-cache';\nimport { ContractTransaction, FallbackProvider } from 'ethers';\nimport {\n MOCK_SHIELD_TXID_FOR_BALANCES,\n MOCK_TOKEN_BALANCE,\n createEngineWalletBalancesStub,\n restoreEngineStubs,\n} from '../../../tests/stubs/engine-stubs.test';\n\n\nlet gasEstimateStub: SinonStub;\nlet railProveStub: SinonStub;\nlet railDummyProveStub: SinonStub;\nlet railTransactStub: SinonStub;\nlet relayAdaptPopulateUnshieldBaseToken: SinonStub;\nlet addUnshieldDataSpy: SinonSpy;\nlet erc20NoteSpy: SinonSpy;\n\nlet matrixWallet: MatrixWallet;\nlet broadcasterFeeERC20AmountRecipient: MatrixERC20AmountRecipient;\n\nconst hardhatRelayAdaptContract =\n NETWORK_CONFIG[NetworkName.Hardhat].relayAdaptContract;\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst mockERC20TokenData0 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[0].tokenAddress,\n);\nconst mockERC20TokenData1 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[1].tokenAddress,\n);\nconst mockNFTTokenData0 = getTokenDataNFT(\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].nftAddress,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].nftTokenType as 1 | 2,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].tokenSubID,\n);\nconst mockNFTTokenData1 = getTokenDataNFT(\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].nftAddress,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].nftTokenType as 1 | 2,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].tokenSubID,\n);\n\nconst MOCK_TOKEN_AMOUNTS_DIFFERENT: MatrixERC20Amount[] = [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: BigInt(0x0100),\n },\n {\n tokenAddress: MOCK_TOKEN_ADDRESS_2,\n amount: BigInt(0x0300),\n },\n];\n\nconst overallBatchMinGasPrice = BigInt('0x1000');\n\nconst gasDetails: TransactionGasDetails = {\n evmGasType: EVMGasType.Type1,\n gasEstimate: 1000n,\n gasPrice: overallBatchMinGasPrice,\n};\nconst gasDetailsType2: TransactionGasDetails = {\n evmGasType: EVMGasType.Type2,\n gasEstimate: 1000n,\n maxFeePerGas: overallBatchMinGasPrice,\n maxPriorityFeePerGas: overallBatchMinGasPrice,\n};\n\nconst MOCK_TOKEN_AMOUNT_RECIPIENTS_INVALID: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress: MOCK_MATRIX_WALLET_ADDRESS,\n }));\n\nconst MOCK_TOKEN_AMOUNT_RECIPIENTS: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n }));\n\nconst MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS_DIFFERENT.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n }));\n\nconst stubGasEstimateSuccess = () => {\n gasEstimateStub = Sinon.stub(txGasDetailsModule, 'getGasEstimate').resolves(\n BigInt('200'),\n );\n};\n\nconst stubGasEstimateFailure = () => {\n gasEstimateStub = Sinon.stub(txGasDetailsModule, 'getGasEstimate').rejects(\n new Error('test rejection - gas estimate'),\n );\n};\n\nconst spyOnSetUnshield = () => {\n addUnshieldDataSpy = Sinon.spy(TransactionBatch.prototype, 'addUnshieldData');\n};\n\ndescribe('tx-unshield', () => {\n before(async function run() {\n this.timeout(60_000);\n await initTestEngine();\n await initTestEngineNetworks();\n const matrixWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(matrixWalletInfo)) {\n throw new Error('Expected matrixWalletInfo');\n }\n matrixWallet = fullWalletForID(matrixWalletInfo.id);\n\n const broadcasterWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(broadcasterWalletInfo)) {\n throw new Error('Expected broadcasterWalletInfo');\n }\n const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;\n\n broadcasterFeeERC20AmountRecipient = {\n ...MOCK_TOKEN_FEE,\n recipientAddress: broadcasterMatrixAddress,\n };\n\n railProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateTransactions',\n ).resolves({\n provedTransactions: [\n {\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[],\n });\n railDummyProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateDummyTransactions',\n ).resolves([\n {\n commitments: MOCK_COMMITMENTS,\n boundParams: MOCK_BOUND_PARAMS_V3,\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[]);\n railTransactStub = Sinon.stub(\n MatrixContracts,\n 'generateTransact',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n relayAdaptPopulateUnshieldBaseToken = Sinon.stub(\n RelayAdaptV3Contract.prototype,\n 'populateUnshieldBaseToken',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n\n // For Unshield To Origin\n await createEngineWalletBalancesStub(\n matrixWallet.addressKeys,\n MOCK_TOKEN_ADDRESS,\n 0,\n );\n });\n afterEach(() => {\n gasEstimateStub?.restore();\n addUnshieldDataSpy?.restore();\n erc20NoteSpy?.restore();\n });\n after(async () => {\n railProveStub.restore();\n railDummyProveStub.restore();\n railTransactStub.restore();\n relayAdaptPopulateUnshieldBaseToken.restore();\n restoreEngineStubs();\n await closeTestEngine();\n });\n\n // UNSHIELD - GAS ESTIMATE\n\n it('Should get gas estimates for valid Unshield', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - token 2\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 2 - token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 2 - token 2\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should get gas estimates for valid Unshield To Origin', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshieldToOrigin(\n MOCK_SHIELD_TXID_FOR_BALANCES, // originalShieldTxid\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: MOCK_TOKEN_BALANCE,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n },\n ],\n [], // nftAmountRecipients\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: MOCK_TOKEN_BALANCE,\n allowOverride: false,\n },\n ],\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should error on gas estimates for invalid Unshield', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS_INVALID,\n [], // nftAmountRecipients\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('Invalid wallet address.');\n });\n\n it('Should error on unshield gas estimate for ethers rejections', async () => {\n stubGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('test rejection - gas estimate');\n });\n\n // UNSHIELD BASE TOKEN - GAS ESTIMATE\n\n it('Should get gas estimates for valid Unshield base token', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ],\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ],\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should get gas estimates for valid Unshield base token: public wallet', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n true, // sendWithPublicWallet\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ],\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should error on gas estimates for invalid Unshield base token', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_MATRIX_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('Invalid wallet address.');\n });\n\n it('Should error on unshield base token gas estimate for ethers rejections', async () => {\n stubGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('test rejection - gas estimate');\n });\n\n // UNSHIELD - PROVE AND SEND\n\n it('Should populate tx for valid Unshield', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateUnshieldProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 token 2\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockNFTTokenData0,\n value: BigInt(1),\n allowOverride: false,\n },\n ], // run 1 - NFT token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockNFTTokenData1,\n value: BigInt(2),\n allowOverride: false,\n },\n ], // run 1 - NFT token 2\n ]);\n const populateResponse = await populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(1200n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n });\n\n it('Should populate tx for valid Unshield To Origin', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateUnshieldToOriginProof(\n MOCK_SHIELD_TXID_FOR_BALANCES, // originalShieldTxid\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: MOCK_TOKEN_BALANCE,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n },\n ],\n [],\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: MOCK_TOKEN_BALANCE,\n allowOverride: false,\n },\n ], // run 1 - erc20 token 1\n ]);\n const populateResponse = await populateProvedUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: MOCK_TOKEN_BALANCE,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n },\n ],\n [],\n gasDetailsType2,\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasLimit).to.equal(1200n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(2);\n });\n\n it('Should error on populate tx for invalid Unshield', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate unshield tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate unshield tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateUnshieldProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n // UNSHIELD BASE TOKEN - PROVE AND SEND\n\n it('Should populate tx for valid Unshield Base Token', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateUnshieldBaseTokenProof(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // Dummy prove.\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // Actual prove\n ]);\n const populateResponse = await populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS[0],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n );\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(1200n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n }).timeout(60_000);\n\n it('Should error on populate tx for invalid Unshield Base Token', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT[1],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate Unshield Base Token tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_TOKEN_AMOUNTS[0],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate Unshield Base Token tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateUnshieldBaseTokenProof(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[1],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT[1],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n describe('Token unshield owner', () => {\n let originalProvider: FallbackProvider | undefined;\n let hadOriginalProvider: boolean;\n\n const MOCK_USER_ADDRESS = '0x1234567890123456789012345678901234567890';\n const MOCK_RELAYER_ADDRESS = '0x9876543210987654321098765432109876543210';\n const MOCK_MATRIX_PROXY_ADDRESS = NETWORK_CONFIG[NetworkName.Hardhat].accumulatorContract;\n const MOCK_SHIELD_TXID = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';\n const ERC20_TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n beforeEach(() => {\n // Save original provider if it exists\n try {\n originalProvider = matrixModule.getFallbackProviderForNetwork(NetworkName.Hardhat);\n hadOriginalProvider = true;\n } catch {\n originalProvider = undefined;\n hadOriginalProvider = false;\n }\n });\n\n afterEach(() => {\n // Restore original provider or clear it\n if (hadOriginalProvider && originalProvider) {\n setFallbackProviderForNetwork(NetworkName.Hardhat, originalProvider);\n } else if (!hadOriginalProvider) {\n // Clear the mock provider we set\n delete fallbackProviderMap[NetworkName.Hardhat];\n }\n });\n\n const createMockTransferLog = (\n fromAddress: string,\n toAddress: string,\n tokenAddress: string = MOCK_TOKEN_ADDRESS,\n ) => {\n const paddedFrom = fromAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const paddedTo = toAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n\n return {\n address: tokenAddress,\n topics: [\n ERC20_TRANSFER_EVENT_SIGNATURE,\n `0x${paddedFrom}`,\n `0x${paddedTo}`,\n ],\n data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',\n blockNumber: 12345,\n transactionHash: MOCK_SHIELD_TXID,\n transactionIndex: 0,\n blockHash: '0xblockhash',\n logIndex: 0,\n removed: false,\n index: 0,\n };\n };\n\n const createMockReceipt = (logs: any[]) => {\n return {\n to: MOCK_MATRIX_PROXY_ADDRESS,\n from: MOCK_RELAYER_ADDRESS,\n contractAddress: null,\n transactionIndex: 0,\n gasUsed: BigInt(100000),\n logsBloom: '0x',\n blockHash: '0xblockhash',\n transactionHash: MOCK_SHIELD_TXID,\n logs,\n blockNumber: 12345,\n confirmations: 10,\n cumulativeGasUsed: BigInt(100000),\n effectiveGasPrice: BigInt(1000000000),\n status: 1,\n type: 2,\n byzantium: true,\n hash: MOCK_SHIELD_TXID,\n index: 0,\n };\n };\n\n const createMockTransaction = (fromAddress: string) => {\n return {\n hash: MOCK_SHIELD_TXID,\n from: fromAddress,\n to: MOCK_MATRIX_PROXY_ADDRESS,\n nonce: 1,\n gasLimit: BigInt(200000),\n data: '0x',\n value: BigInt(0),\n chainId: BigInt(137),\n blockNumber: 12345,\n blockHash: '0xblockhash',\n index: 0,\n type: 2,\n accessList: [],\n };\n };\n\n it('Should reject when getTransaction fails', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => {\n throw new Error('RPC error: Transaction lookup failed');\n },\n getTransactionReceipt: async () => createMockReceipt([]),\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('RPC error: Transaction lookup failed');\n });\n\n it('Should reject when getTransactionReceipt fails', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),\n getTransactionReceipt: async () => {\n throw new Error('RPC error: Receipt lookup failed');\n },\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('RPC error: Receipt lookup failed');\n });\n\n it('Should reject when both getTransaction and getTransactionReceipt fail', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => {\n // Simulate slower failure\n await new Promise(resolve => setTimeout(resolve, 100));\n throw new Error('RPC error: Transaction lookup failed');\n },\n getTransactionReceipt: async () => {\n // Simulate faster failure\n throw new Error('RPC error: Receipt lookup failed');\n },\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n // Promise.all() should reject with whichever error occurs first\n // In this case, receipt fails faster\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith(/RPC error/);\n });\n\n it('Should timeout when getTransaction hangs indefinitely', async function () {\n this.timeout(10_000);\n\n const mockProvider = {\n getTransaction: async () => {\n // Simulate a hanging promise that never resolves\n return new Promise(() => {});\n },\n getTransactionReceipt: async () => createMockReceipt([]),\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n // Create a timeout wrapper to test hanging behavior\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Test timeout: getTransaction hung')), 2000)\n );\n\n const callPromise = getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n await expect(\n Promise.race([callPromise, timeoutPromise])\n ).to.be.rejectedWith('Test timeout: getTransaction hung');\n });\n\n it('Should timeout when getTransactionReceipt hangs indefinitely', async function () {\n this.timeout(10_000);\n\n const mockProvider = {\n getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),\n getTransactionReceipt: async () => {\n // Simulate a hanging promise that never resolves\n return new Promise(() => {});\n },\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n // Create a timeout wrapper to test hanging behavior\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Test timeout: getTransactionReceipt hung')), 2000)\n );\n\n const callPromise = getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n await expect(\n Promise.race([callPromise, timeoutPromise])\n ).to.be.rejectedWith('Test timeout: getTransactionReceipt hung');\n });\n\n it('Should extract true token owner from Transfer events in EIP-7702 gasless transaction', async function () {\n this.timeout(60_000);\n\n const transferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([transferLog]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n 'Should extract token owner from Transfer event, not tx.from (relayer)',\n );\n }\n });\n\n it('Should handle standard transactions where tx.from equals token owner', async function () {\n this.timeout(60_000);\n\n const transferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([transferLog]);\n const mockTransaction = createMockTransaction(MOCK_USER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n );\n }\n });\n\n it('Should ignore Transfer events not directed to Matrix contract', async function () {\n this.timeout(60_000);\n\n const irrelevantTransferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_ETH_WALLET_ADDRESS,\n );\n\n const relevantTransferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([\n irrelevantTransferLog,\n relevantTransferLog,\n ]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n );\n }\n });\n\n it('Should fallback to tx.from when no Transfer events found', async function () {\n this.timeout(60_000);\n\n const mockReceipt = createMockReceipt([]);\n const mockTransaction = createMockTransaction(MOCK_USER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n 'Should fallback to tx.from when no Transfer events',\n );\n }\n });\n\n it('Should handle malformed log topics gracefully', async function () {\n this.timeout(60_000);\n\n const malformedLog = {\n address: MOCK_TOKEN_ADDRESS,\n topics: [ERC20_TRANSFER_EVENT_SIGNATURE],\n data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',\n blockNumber: 12345,\n transactionHash: MOCK_SHIELD_TXID,\n transactionIndex: 0,\n blockHash: '0xblockhash',\n logIndex: 0,\n removed: false,\n index: 0,\n };\n\n const validLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([malformedLog, validLog]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n 'Should skip malformed log and process valid one',\n );\n }\n });\n\n it('Should throw error when transaction is not found', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => null,\n getTransactionReceipt: async () => createMockReceipt([]),\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('Could not find shield transaction from RPC');\n });\n\n it('Should throw error when receipt is not found', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),\n getTransactionReceipt: async () => null,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('Could not find shield transaction receipt from RPC');\n });\n\n it('Should handle multiple token owners by using first one', async function () {\n this.timeout(60_000);\n\n const user1Address = '0x1111111111111111111111111111111111111111';\n const user2Address = '0x2222222222222222222222222222222222222222';\n\n const transferLog1 = createMockTransferLog(\n user1Address,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const transferLog2 = createMockTransferLog(\n user2Address,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([transferLog1, transferLog2]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n const recipientAddr = result.erc20AmountRecipients[0].recipientAddress.toLowerCase();\n const isValidOwner =\n recipientAddr === user1Address.toLowerCase() ||\n recipientAddr === user2Address.toLowerCase();\n expect(isValidOwner).to.be.true;\n }\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tx-unshield.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-unshield.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon, { SinonStub, SinonSpy } from 'sinon';\nimport {\n MatrixContracts,\n MatrixWallet,\n RelayAdaptV3Contract,\n TransactionBatch,\n TransactionStructV3,\n getTokenDataERC20,\n getTokenDataNFT,\n} from '@matrix-privacy/engine';\nimport {\n MatrixERC20Amount,\n NetworkName,\n getNetworkConfig,\n EVMGasType,\n MatrixERC20AmountRecipient,\n TransactionGasDetails,\n isDefined,\n} from '@matrix-privacy/shared-models';\nimport {\n closeTestEngine,\n initTestEngine,\n initTestEngineNetworks,\n} from '../../../tests/setup.test';\nimport {\n MOCK_BOUND_PARAMS_V3,\n MOCK_COMMITMENTS,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_FEE_TOKEN_DETAILS,\n MOCK_MNEMONIC,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n MOCK_NULLIFIERS,\n MOCK_MATRIX_WALLET_ADDRESS,\n MOCK_TOKEN_ADDRESS,\n MOCK_TOKEN_ADDRESS_2,\n MOCK_TOKEN_AMOUNTS,\n MOCK_TOKEN_FEE,\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n} from '../../../tests/mocks.test';\nimport {\n populateProvedUnshield,\n gasEstimateForUnprovenUnshield,\n populateProvedUnshieldBaseToken,\n gasEstimateForUnprovenUnshieldBaseToken,\n populateProvedUnshieldToOrigin,\n gasEstimateForUnprovenUnshieldToOrigin,\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin,\n} from '../tx-unshield';\nimport {\n generateUnshieldBaseTokenProof,\n generateUnshieldProof,\n generateUnshieldToOriginProof,\n} from '../tx-proof-unshield';\nimport * as txGasDetailsModule from '../tx-gas-details';\nimport * as matrixModule from '../../matrix';\nimport {\n createMatrixWallet,\n fullWalletForID,\n} from '../../matrix/wallets/wallets';\nimport { setFallbackProviderForNetwork, fallbackProviderMap } from '../../matrix/core/providers';\nimport { setCachedProvedTransaction } from '../proof-cache';\nimport { ContractTransaction, FallbackProvider } from 'ethers';\nimport {\n MOCK_SHIELD_TXID_FOR_BALANCES,\n MOCK_TOKEN_BALANCE,\n createEngineWalletBalancesStub,\n restoreEngineStubs,\n} from '../../../tests/stubs/engine-stubs.test';\n\n\nlet gasEstimateStub: SinonStub;\nlet railProveStub: SinonStub;\nlet railDummyProveStub: SinonStub;\nlet railTransactStub: SinonStub;\nlet relayAdaptPopulateUnshieldBaseToken: SinonStub;\nlet addUnshieldDataSpy: SinonSpy;\nlet erc20NoteSpy: SinonSpy;\n\nlet matrixWallet: MatrixWallet;\nlet broadcasterFeeERC20AmountRecipient: MatrixERC20AmountRecipient;\n\nconst hardhatRelayAdaptContract =\n getNetworkConfig(NetworkName.Hardhat).relayAdaptContract;\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\nconst mockERC20TokenData0 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[0].tokenAddress,\n);\nconst mockERC20TokenData1 = getTokenDataERC20(\n MOCK_TOKEN_AMOUNTS[1].tokenAddress,\n);\nconst mockNFTTokenData0 = getTokenDataNFT(\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].nftAddress,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].nftTokenType as 1 | 2,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[0].tokenSubID,\n);\nconst mockNFTTokenData1 = getTokenDataNFT(\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].nftAddress,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].nftTokenType as 1 | 2,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD[1].tokenSubID,\n);\n\nconst MOCK_TOKEN_AMOUNTS_DIFFERENT: MatrixERC20Amount[] = [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: BigInt(0x0100),\n },\n {\n tokenAddress: MOCK_TOKEN_ADDRESS_2,\n amount: BigInt(0x0300),\n },\n];\n\nconst overallBatchMinGasPrice = BigInt('0x1000');\n\nconst gasDetails: TransactionGasDetails = {\n evmGasType: EVMGasType.Type1,\n gasEstimate: 1000n,\n gasPrice: overallBatchMinGasPrice,\n};\nconst gasDetailsType2: TransactionGasDetails = {\n evmGasType: EVMGasType.Type2,\n gasEstimate: 1000n,\n maxFeePerGas: overallBatchMinGasPrice,\n maxPriorityFeePerGas: overallBatchMinGasPrice,\n};\n\nconst MOCK_TOKEN_AMOUNT_RECIPIENTS_INVALID: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress: MOCK_MATRIX_WALLET_ADDRESS,\n }));\n\nconst MOCK_TOKEN_AMOUNT_RECIPIENTS: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n }));\n\nconst MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT: MatrixERC20AmountRecipient[] =\n MOCK_TOKEN_AMOUNTS_DIFFERENT.map(erc20Amount => ({\n ...erc20Amount,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n }));\n\nconst stubGasEstimateSuccess = () => {\n gasEstimateStub = Sinon.stub(txGasDetailsModule, 'getGasEstimate').resolves(\n BigInt('200'),\n );\n};\n\nconst stubGasEstimateFailure = () => {\n gasEstimateStub = Sinon.stub(txGasDetailsModule, 'getGasEstimate').rejects(\n new Error('test rejection - gas estimate'),\n );\n};\n\nconst spyOnSetUnshield = () => {\n addUnshieldDataSpy = Sinon.spy(TransactionBatch.prototype, 'addUnshieldData');\n};\n\ndescribe('tx-unshield', () => {\n before(async function run() {\n this.timeout(60_000);\n await initTestEngine();\n await initTestEngineNetworks();\n const matrixWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(matrixWalletInfo)) {\n throw new Error('Expected matrixWalletInfo');\n }\n matrixWallet = fullWalletForID(matrixWalletInfo.id);\n\n const broadcasterWalletInfo = await createMatrixWallet(\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_MNEMONIC,\n undefined, // creationBlockNumbers\n );\n if (!isDefined(broadcasterWalletInfo)) {\n throw new Error('Expected broadcasterWalletInfo');\n }\n const broadcasterMatrixAddress = broadcasterWalletInfo.matrixAddress;\n\n broadcasterFeeERC20AmountRecipient = {\n ...MOCK_TOKEN_FEE,\n recipientAddress: broadcasterMatrixAddress,\n };\n\n railProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateTransactions',\n ).resolves({\n provedTransactions: [\n {\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[],\n });\n railDummyProveStub = Sinon.stub(\n TransactionBatch.prototype,\n 'generateDummyTransactions',\n ).resolves([\n {\n commitments: MOCK_COMMITMENTS,\n boundParams: MOCK_BOUND_PARAMS_V3,\n nullifiers: MOCK_NULLIFIERS,\n },\n ] as (TransactionStructV3)[]);\n railTransactStub = Sinon.stub(\n MatrixContracts,\n 'generateTransact',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n relayAdaptPopulateUnshieldBaseToken = Sinon.stub(\n RelayAdaptV3Contract.prototype,\n 'populateUnshieldBaseToken',\n ).resolves({ data: '0x0123' } as ContractTransaction);\n\n // For Unshield To Origin\n await createEngineWalletBalancesStub(\n matrixWallet.addressKeys,\n MOCK_TOKEN_ADDRESS,\n 0,\n );\n });\n afterEach(() => {\n gasEstimateStub?.restore();\n addUnshieldDataSpy?.restore();\n erc20NoteSpy?.restore();\n });\n after(async () => {\n railProveStub.restore();\n railDummyProveStub.restore();\n railTransactStub.restore();\n relayAdaptPopulateUnshieldBaseToken.restore();\n restoreEngineStubs();\n await closeTestEngine();\n });\n\n // UNSHIELD - GAS ESTIMATE\n\n it('Should get gas estimates for valid Unshield', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - token 2\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 2 - token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 2 - token 2\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should get gas estimates for valid Unshield To Origin', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshieldToOrigin(\n MOCK_SHIELD_TXID_FOR_BALANCES, // originalShieldTxid\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: MOCK_TOKEN_BALANCE,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n },\n ],\n [], // nftAmountRecipients\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: MOCK_TOKEN_BALANCE,\n allowOverride: false,\n },\n ],\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should error on gas estimates for invalid Unshield', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS_INVALID,\n [], // nftAmountRecipients\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('Invalid wallet address.');\n });\n\n it('Should error on unshield gas estimate for ethers rejections', async () => {\n stubGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('test rejection - gas estimate');\n });\n\n // UNSHIELD BASE TOKEN - GAS ESTIMATE\n\n it('Should get gas estimates for valid Unshield base token', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ],\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ],\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should get gas estimates for valid Unshield base token: public wallet', async () => {\n stubGasEstimateSuccess();\n spyOnSetUnshield();\n const rsp = await gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n true, // sendWithPublicWallet\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ],\n ]);\n // Add 9000 for the dummy tx variance\n expect(rsp.gasEstimate).to.equal(9000n + 200n);\n }).timeout(30_000);\n\n it('Should error on gas estimates for invalid Unshield base token', async () => {\n stubGasEstimateSuccess();\n await expect(\n gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_MATRIX_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('Invalid wallet address.');\n });\n\n it('Should error on unshield base token gas estimate for ethers rejections', async () => {\n stubGasEstimateFailure();\n await expect(\n gasEstimateForUnprovenUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n MOCK_TRANSACTION_GAS_DETAILS_SERIALIZED_TYPE_2,\n MOCK_FEE_TOKEN_DETAILS,\n false, // sendWithPublicWallet\n ),\n ).rejectedWith('test rejection - gas estimate');\n });\n\n // UNSHIELD - PROVE AND SEND\n\n it('Should populate tx for valid Unshield', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateUnshieldProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // run 1 - erc20 token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData1,\n value: BigInt('0x0200'),\n allowOverride: false,\n },\n ], // run 1 - erc20 token 2\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockNFTTokenData0,\n value: BigInt(1),\n allowOverride: false,\n },\n ], // run 1 - NFT token 1\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockNFTTokenData1,\n value: BigInt(2),\n allowOverride: false,\n },\n ], // run 1 - NFT token 2\n ]);\n const populateResponse = await populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(1200n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n });\n\n it('Should populate tx for valid Unshield To Origin', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateUnshieldToOriginProof(\n MOCK_SHIELD_TXID_FOR_BALANCES, // originalShieldTxid\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: MOCK_TOKEN_BALANCE,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n },\n ],\n [],\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: MOCK_ETH_WALLET_ADDRESS,\n tokenData: mockERC20TokenData0,\n value: MOCK_TOKEN_BALANCE,\n allowOverride: false,\n },\n ], // run 1 - erc20 token 1\n ]);\n const populateResponse = await populateProvedUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n [\n {\n tokenAddress: MOCK_TOKEN_ADDRESS,\n amount: MOCK_TOKEN_BALANCE,\n recipientAddress: MOCK_ETH_WALLET_ADDRESS,\n },\n ],\n [],\n gasDetailsType2,\n );\n expect(populateResponse.nullifiers).to.deep.equal([\n '0x0000000000000000000000000000000000000000000000000000000000000001',\n '0x0000000000000000000000000000000000000000000000000000000000000002',\n ]);\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasLimit).to.equal(1200n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(2);\n });\n\n it('Should error on populate tx for invalid Unshield', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT,\n MOCK_NFT_AMOUNT_RECIPIENTS_UNSHIELD,\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate unshield tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate unshield tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateUnshieldProof(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNT_RECIPIENTS,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedUnshield(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNT_RECIPIENTS_DIFFERENT,\n [], // nftAmountRecipients\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n // UNSHIELD BASE TOKEN - PROVE AND SEND\n\n it('Should populate tx for valid Unshield Base Token', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n spyOnSetUnshield();\n await generateUnshieldBaseTokenProof(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[0],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n expect(addUnshieldDataSpy.called).to.be.true;\n expect(addUnshieldDataSpy.args).to.deep.equal([\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // Dummy prove.\n [\n {\n toAddress: hardhatRelayAdaptContract,\n tokenData: mockERC20TokenData0,\n value: BigInt('0x0100'),\n allowOverride: false,\n },\n ], // Actual prove\n ]);\n const populateResponse = await populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS[0],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n );\n\n const { transaction } = populateResponse;\n\n expect(transaction.nonce).to.equal(undefined);\n expect(transaction.gasPrice?.toString()).to.equal('4096');\n expect(transaction.gasLimit).to.equal(1200n);\n expect(transaction.value?.toString()).to.equal(undefined);\n expect(transaction.data).to.equal('0x0123');\n expect(transaction.to).to.equal(undefined);\n expect(transaction.chainId).to.equal(undefined);\n expect(transaction.type).to.equal(1);\n }).timeout(60_000);\n\n it('Should error on populate tx for invalid Unshield Base Token', async () => {\n stubGasEstimateSuccess();\n await expect(\n populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT[1],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate Unshield Base Token tx for unproved transaction', async () => {\n stubGasEstimateSuccess();\n setCachedProvedTransaction(undefined);\n await expect(\n populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_ETH_WALLET_ADDRESS,\n MOCK_TOKEN_AMOUNTS[0],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n it('Should error on populate Unshield Base Token tx when params changed (invalid cached proof)', async () => {\n stubGasEstimateSuccess();\n await generateUnshieldBaseTokenProof(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_DB_ENCRYPTION_KEY,\n MOCK_TOKEN_AMOUNTS[1],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n () => {}, // progressCallback\n );\n await expect(\n populateProvedUnshieldBaseToken(\n NetworkName.Hardhat,\n MOCK_ETH_WALLET_ADDRESS,\n matrixWallet.id,\n MOCK_TOKEN_AMOUNTS_DIFFERENT[1],\n broadcasterFeeERC20AmountRecipient,\n false, // sendWithPublicWallet\n overallBatchMinGasPrice,\n gasDetails,\n ),\n ).rejectedWith('Invalid proof for this transaction');\n });\n\n describe('Token unshield owner', () => {\n let originalProvider: FallbackProvider | undefined;\n let hadOriginalProvider: boolean;\n\n const MOCK_USER_ADDRESS = '0x1234567890123456789012345678901234567890';\n const MOCK_RELAYER_ADDRESS = '0x9876543210987654321098765432109876543210';\n const MOCK_MATRIX_PROXY_ADDRESS = getNetworkConfig(NetworkName.Hardhat).accumulatorContract;\n const MOCK_SHIELD_TXID = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';\n const ERC20_TRANSFER_EVENT_SIGNATURE = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';\n\n beforeEach(() => {\n // Save original provider if it exists\n try {\n originalProvider = matrixModule.getFallbackProviderForNetwork(NetworkName.Hardhat);\n hadOriginalProvider = true;\n } catch {\n originalProvider = undefined;\n hadOriginalProvider = false;\n }\n });\n\n afterEach(() => {\n // Restore original provider or clear it\n if (hadOriginalProvider && originalProvider) {\n setFallbackProviderForNetwork(NetworkName.Hardhat, originalProvider);\n } else if (!hadOriginalProvider) {\n // Clear the mock provider we set\n delete fallbackProviderMap[NetworkName.Hardhat];\n }\n });\n\n const createMockTransferLog = (\n fromAddress: string,\n toAddress: string,\n tokenAddress: string = MOCK_TOKEN_ADDRESS,\n ) => {\n const paddedFrom = fromAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const paddedTo = toAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n\n return {\n address: tokenAddress,\n topics: [\n ERC20_TRANSFER_EVENT_SIGNATURE,\n `0x${paddedFrom}`,\n `0x${paddedTo}`,\n ],\n data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',\n blockNumber: 12345,\n transactionHash: MOCK_SHIELD_TXID,\n transactionIndex: 0,\n blockHash: '0xblockhash',\n logIndex: 0,\n removed: false,\n index: 0,\n };\n };\n\n const createMockReceipt = (logs: any[]) => {\n return {\n to: MOCK_MATRIX_PROXY_ADDRESS,\n from: MOCK_RELAYER_ADDRESS,\n contractAddress: null,\n transactionIndex: 0,\n gasUsed: BigInt(100000),\n logsBloom: '0x',\n blockHash: '0xblockhash',\n transactionHash: MOCK_SHIELD_TXID,\n logs,\n blockNumber: 12345,\n confirmations: 10,\n cumulativeGasUsed: BigInt(100000),\n effectiveGasPrice: BigInt(1000000000),\n status: 1,\n type: 2,\n byzantium: true,\n hash: MOCK_SHIELD_TXID,\n index: 0,\n };\n };\n\n const createMockTransaction = (fromAddress: string) => {\n return {\n hash: MOCK_SHIELD_TXID,\n from: fromAddress,\n to: MOCK_MATRIX_PROXY_ADDRESS,\n nonce: 1,\n gasLimit: BigInt(200000),\n data: '0x',\n value: BigInt(0),\n chainId: BigInt(137),\n blockNumber: 12345,\n blockHash: '0xblockhash',\n index: 0,\n type: 2,\n accessList: [],\n };\n };\n\n it('Should reject when getTransaction fails', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => {\n throw new Error('RPC error: Transaction lookup failed');\n },\n getTransactionReceipt: async () => createMockReceipt([]),\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('RPC error: Transaction lookup failed');\n });\n\n it('Should reject when getTransactionReceipt fails', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),\n getTransactionReceipt: async () => {\n throw new Error('RPC error: Receipt lookup failed');\n },\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('RPC error: Receipt lookup failed');\n });\n\n it('Should reject when both getTransaction and getTransactionReceipt fail', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => {\n // Simulate slower failure\n await new Promise(resolve => setTimeout(resolve, 100));\n throw new Error('RPC error: Transaction lookup failed');\n },\n getTransactionReceipt: async () => {\n // Simulate faster failure\n throw new Error('RPC error: Receipt lookup failed');\n },\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n // Promise.all() should reject with whichever error occurs first\n // In this case, receipt fails faster\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith(/RPC error/);\n });\n\n it('Should timeout when getTransaction hangs indefinitely', async function () {\n this.timeout(10_000);\n\n const mockProvider = {\n getTransaction: async () => {\n // Simulate a hanging promise that never resolves\n return new Promise(() => {});\n },\n getTransactionReceipt: async () => createMockReceipt([]),\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n // Create a timeout wrapper to test hanging behavior\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Test timeout: getTransaction hung')), 2000)\n );\n\n const callPromise = getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n await expect(\n Promise.race([callPromise, timeoutPromise])\n ).to.be.rejectedWith('Test timeout: getTransaction hung');\n });\n\n it('Should timeout when getTransactionReceipt hangs indefinitely', async function () {\n this.timeout(10_000);\n\n const mockProvider = {\n getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),\n getTransactionReceipt: async () => {\n // Simulate a hanging promise that never resolves\n return new Promise(() => {});\n },\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n // Create a timeout wrapper to test hanging behavior\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Test timeout: getTransactionReceipt hung')), 2000)\n );\n\n const callPromise = getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n await expect(\n Promise.race([callPromise, timeoutPromise])\n ).to.be.rejectedWith('Test timeout: getTransactionReceipt hung');\n });\n\n it('Should extract true token owner from Transfer events in EIP-7702 gasless transaction', async function () {\n this.timeout(60_000);\n\n const transferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([transferLog]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n 'Should extract token owner from Transfer event, not tx.from (relayer)',\n );\n }\n });\n\n it('Should handle standard transactions where tx.from equals token owner', async function () {\n this.timeout(60_000);\n\n const transferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([transferLog]);\n const mockTransaction = createMockTransaction(MOCK_USER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n );\n }\n });\n\n it('Should ignore Transfer events not directed to Matrix contract', async function () {\n this.timeout(60_000);\n\n const irrelevantTransferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_ETH_WALLET_ADDRESS,\n );\n\n const relevantTransferLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([\n irrelevantTransferLog,\n relevantTransferLog,\n ]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n );\n }\n });\n\n it('Should fallback to tx.from when no Transfer events found', async function () {\n this.timeout(60_000);\n\n const mockReceipt = createMockReceipt([]);\n const mockTransaction = createMockTransaction(MOCK_USER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n 'Should fallback to tx.from when no Transfer events',\n );\n }\n });\n\n it('Should handle malformed log topics gracefully', async function () {\n this.timeout(60_000);\n\n const malformedLog = {\n address: MOCK_TOKEN_ADDRESS,\n topics: [ERC20_TRANSFER_EVENT_SIGNATURE],\n data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',\n blockNumber: 12345,\n transactionHash: MOCK_SHIELD_TXID,\n transactionIndex: 0,\n blockHash: '0xblockhash',\n logIndex: 0,\n removed: false,\n index: 0,\n };\n\n const validLog = createMockTransferLog(\n MOCK_USER_ADDRESS,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([malformedLog, validLog]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n expect(result.erc20AmountRecipients[0].recipientAddress).to.equal(\n MOCK_USER_ADDRESS,\n 'Should skip malformed log and process valid one',\n );\n }\n });\n\n it('Should throw error when transaction is not found', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => null,\n getTransactionReceipt: async () => createMockReceipt([]),\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('Could not find shield transaction from RPC');\n });\n\n it('Should throw error when receipt is not found', async function () {\n this.timeout(60_000);\n\n const mockProvider = {\n getTransaction: async () => createMockTransaction(MOCK_USER_ADDRESS),\n getTransactionReceipt: async () => null,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n await expect(\n getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n ),\n ).to.be.rejectedWith('Could not find shield transaction receipt from RPC');\n });\n\n it('Should handle multiple token owners by using first one', async function () {\n this.timeout(60_000);\n\n const user1Address = '0x1111111111111111111111111111111111111111';\n const user2Address = '0x2222222222222222222222222222222222222222';\n\n const transferLog1 = createMockTransferLog(\n user1Address,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const transferLog2 = createMockTransferLog(\n user2Address,\n MOCK_MATRIX_PROXY_ADDRESS,\n );\n\n const mockReceipt = createMockReceipt([transferLog1, transferLog2]);\n const mockTransaction = createMockTransaction(MOCK_RELAYER_ADDRESS);\n\n const mockProvider = {\n getTransaction: async () => mockTransaction,\n getTransactionReceipt: async () => mockReceipt,\n } as any;\n\n setFallbackProviderForNetwork(NetworkName.Hardhat, mockProvider);\n\n const result = await getERC20AndNFTAmountRecipientsForUnshieldToOrigin(\n NetworkName.Hardhat,\n matrixWallet.id,\n MOCK_SHIELD_TXID,\n );\n\n expect(result.erc20AmountRecipients).to.be.an('array');\n if (result.erc20AmountRecipients.length > 0) {\n const recipientAddr = result.erc20AmountRecipients[0].recipientAddress.toLowerCase();\n const isValidOwner =\n recipientAddr === user1Address.toLowerCase() ||\n recipientAddr === user2Address.toLowerCase();\n expect(isValidOwner).to.be.true;\n }\n });\n });\n});\n"]}
|
|
@@ -37,7 +37,7 @@ const createValidCrossContractCalls = (crossContractCalls) => {
|
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
const createRelayAdaptUnshieldERC20AmountRecipients = (networkName, unshieldERC20Amounts) => {
|
|
40
|
-
const chain = shared_models_1.
|
|
40
|
+
const chain = (0, shared_models_1.getNetworkConfig)(networkName).chain;
|
|
41
41
|
const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
|
|
42
42
|
const unshieldERC20AmountRecipients = unshieldERC20Amounts.map(unshieldERC20Amount => ({
|
|
43
43
|
...unshieldERC20Amount,
|
|
@@ -47,7 +47,7 @@ const createRelayAdaptUnshieldERC20AmountRecipients = (networkName, unshieldERC2
|
|
|
47
47
|
};
|
|
48
48
|
exports.createRelayAdaptUnshieldERC20AmountRecipients = createRelayAdaptUnshieldERC20AmountRecipients;
|
|
49
49
|
const createRelayAdaptUnshieldNFTAmountRecipients = (networkName, unshieldNFTAmounts) => {
|
|
50
|
-
const chain = shared_models_1.
|
|
50
|
+
const chain = (0, shared_models_1.getNetworkConfig)(networkName).chain;
|
|
51
51
|
const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
|
|
52
52
|
const unshieldNFTAmountRecipients = unshieldNFTAmounts.map(unshieldNFTAmount => ({
|
|
53
53
|
...unshieldNFTAmount,
|
|
@@ -96,7 +96,7 @@ const gasEstimateForUnprovenCrossContractCalls = async (networkName, matrixWalle
|
|
|
96
96
|
(0, proof_cache_1.setCachedProvedTransaction)(undefined);
|
|
97
97
|
const overallBatchMinGasPrice = 0n;
|
|
98
98
|
const validCrossContractCalls = createValidCrossContractCalls(crossContractCalls);
|
|
99
|
-
const chain = shared_models_1.
|
|
99
|
+
const chain = (0, shared_models_1.getNetworkConfig)(networkName).chain;
|
|
100
100
|
const relayAdaptUnshieldERC20AmountRecipients = (0, exports.createRelayAdaptUnshieldERC20AmountRecipients)(networkName, relayAdaptUnshieldERC20Amounts);
|
|
101
101
|
const relayAdaptUnshieldNFTAmountRecipients = (0, exports.createRelayAdaptUnshieldNFTAmountRecipients)(networkName, relayAdaptUnshieldNFTAmounts);
|
|
102
102
|
const shieldRandom = engine_1.ByteUtils.randomHex(16);
|
|
@@ -141,7 +141,7 @@ const generateCrossContractCallsProof = async (networkName, matrixWalletID, encr
|
|
|
141
141
|
const shieldRandom = engine_1.ByteUtils.randomHex(16);
|
|
142
142
|
const relayShieldRequests = await engine_1.RelayAdaptHelper.generateRelayShieldRequests(shieldRandom, relayAdaptShieldERC20Recipients, createRelayAdaptShieldNFTRecipients(relayAdaptShieldNFTRecipients));
|
|
143
143
|
const minimumGasLimit = minGasLimit ?? engine_1.MINIMUM_RELAY_ADAPT_CROSS_CONTRACT_CALLS_GAS_LIMIT_V2;
|
|
144
|
-
const { chain } = shared_models_1.
|
|
144
|
+
const { chain } = (0, shared_models_1.getNetworkConfig)(networkName);
|
|
145
145
|
const isBroadcasterTransaction = !sendWithPublicWallet;
|
|
146
146
|
const relayAdaptParamsRandom = engine_1.ByteUtils.randomHex(31);
|
|
147
147
|
const relayAdaptContract = engine_1.MatrixContracts.getRelayAdaptContract(chain);
|