dop-wallet-v6 1.1.5 → 1.1.7
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/README.md +0 -2
- package/dist/services/artifacts/artifact-downloader.d.ts +1 -1
- package/dist/services/artifacts/artifact-downloader.js +20 -20
- package/dist/services/artifacts/artifact-downloader.js.map +1 -1
- package/dist/services/artifacts/artifact-hash.d.ts +1 -2
- package/dist/services/artifacts/artifact-hash.js +8 -8
- package/dist/services/artifacts/artifact-hash.js.map +1 -1
- package/dist/services/artifacts/artifact-store.d.ts +0 -1
- package/dist/services/artifacts/artifact-util.d.ts +1 -1
- package/dist/services/artifacts/artifact-util.js +18 -26
- package/dist/services/artifacts/artifact-util.js.map +1 -1
- package/dist/services/artifacts/json/artifact-v2-hashes.json +0 -65
- package/dist/services/dop/core/artifacts.d.ts +3 -3
- package/dist/services/dop/core/artifacts.js +6 -8
- package/dist/services/dop/core/artifacts.js.map +1 -1
- package/dist/services/dop/core/engine.d.ts +2 -2
- package/dist/services/dop/core/engine.js +13 -16
- package/dist/services/dop/core/engine.js.map +1 -1
- package/dist/services/dop/core/prover.d.ts +1 -1
- package/dist/services/dop/core/prover.js +2 -2
- package/dist/services/dop/core/prover.js.map +1 -1
- package/dist/services/dop/core/providers.d.ts +3 -3
- package/dist/services/dop/core/providers.js +16 -16
- package/dist/services/dop/core/providers.js.map +1 -1
- package/dist/services/dop/core/shields.d.ts +1 -1
- package/dist/services/dop/core/shields.js +2 -2
- package/dist/services/dop/core/shields.js.map +1 -1
- package/dist/services/dop/history/transaction-history.d.ts +2 -2
- package/dist/services/dop/history/transaction-history.js +14 -14
- package/dist/services/dop/history/transaction-history.js.map +1 -1
- package/dist/services/dop/process/extract-first-note.d.ts +2 -2
- package/dist/services/dop/process/extract-first-note.js +15 -15
- package/dist/services/dop/process/extract-first-note.js.map +1 -1
- package/dist/services/dop/quick-sync/empty-events.d.ts +1 -1
- package/dist/services/dop/quick-sync/empty-events.js.map +1 -1
- package/dist/services/dop/quick-sync/graph-type-formatters.d.ts +1 -1
- package/dist/services/dop/quick-sync/graph-type-formatters.js +15 -15
- package/dist/services/dop/quick-sync/graph-type-formatters.js.map +1 -1
- package/dist/services/dop/quick-sync/graphql/index.js +5 -5
- package/dist/services/dop/quick-sync/graphql/index.js.map +1 -1
- package/dist/services/dop/quick-sync/quick-sync-graph.d.ts +1 -1
- package/dist/services/dop/quick-sync/quick-sync-graph.js +17 -17
- package/dist/services/dop/quick-sync/quick-sync-graph.js.map +1 -1
- package/dist/services/dop/util/bytes.d.ts +1 -1
- package/dist/services/dop/util/bytes.js +7 -7
- package/dist/services/dop/util/bytes.js.map +1 -1
- package/dist/services/dop/util/commitment.d.ts +2 -1
- package/dist/services/dop/util/commitment.js +4 -5
- package/dist/services/dop/util/commitment.js.map +1 -1
- package/dist/services/dop/util/crypto.d.ts +2 -2
- package/dist/services/dop/util/crypto.js +15 -15
- package/dist/services/dop/util/crypto.js.map +1 -1
- package/dist/services/dop/util/db.d.ts +1 -1
- package/dist/services/dop/util/db.js +2 -2
- package/dist/services/dop/util/db.js.map +1 -1
- package/dist/services/dop/wallets/balance-update.d.ts +2 -2
- package/dist/services/dop/wallets/balance-update.js +6 -6
- package/dist/services/dop/wallets/balance-update.js.map +1 -1
- package/dist/services/dop/wallets/balances.d.ts +2 -2
- package/dist/services/dop/wallets/balances.js.map +1 -1
- package/dist/services/dop/wallets/wallets.d.ts +2 -4
- package/dist/services/dop/wallets/wallets.js +12 -27
- package/dist/services/dop/wallets/wallets.js.map +1 -1
- package/dist/services/ethers/ethers-util.js +2 -2
- package/dist/services/ethers/ethers-util.js.map +1 -1
- package/dist/services/transactions/proof-cache.d.ts +1 -1
- package/dist/services/transactions/proof-cache.js +16 -16
- package/dist/services/transactions/proof-cache.js.map +1 -1
- package/dist/services/transactions/tx-cross-contract-calls.d.ts +4 -2
- package/dist/services/transactions/tx-cross-contract-calls.js +117 -269
- package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -1
- package/dist/services/transactions/tx-gas-details.d.ts +1 -1
- package/dist/services/transactions/tx-gas-details.js +24 -36
- package/dist/services/transactions/tx-gas-details.js.map +1 -1
- package/dist/services/transactions/tx-gas-relayer-fee-estimator.d.ts +4 -1
- package/dist/services/transactions/tx-gas-relayer-fee-estimator.js +88 -187
- package/dist/services/transactions/tx-gas-relayer-fee-estimator.js.map +1 -1
- package/dist/services/transactions/tx-generator.d.ts +5 -4
- package/dist/services/transactions/tx-generator.js +42 -71
- package/dist/services/transactions/tx-generator.js.map +1 -1
- package/dist/services/transactions/tx-notes.d.ts +2 -2
- package/dist/services/transactions/tx-notes.js +13 -13
- package/dist/services/transactions/tx-notes.js.map +1 -1
- package/dist/services/transactions/tx-nullifiers.d.ts +1 -1
- package/dist/services/transactions/tx-nullifiers.js.map +1 -1
- package/dist/services/transactions/tx-proof-transfer.d.ts +3 -4
- package/dist/services/transactions/tx-proof-transfer.js +19 -13
- package/dist/services/transactions/tx-proof-transfer.js.map +1 -1
- package/dist/services/transactions/tx-proof-unshield.d.ts +4 -3
- package/dist/services/transactions/tx-proof-unshield.js +87 -146
- package/dist/services/transactions/tx-proof-unshield.js.map +1 -1
- package/dist/services/transactions/tx-shield-base-token.d.ts +2 -2
- package/dist/services/transactions/tx-shield-base-token.js +10 -13
- package/dist/services/transactions/tx-shield-base-token.js.map +1 -1
- package/dist/services/transactions/tx-shield.d.ts +1 -1
- package/dist/services/transactions/tx-shield.js +12 -16
- package/dist/services/transactions/tx-shield.js.map +1 -1
- package/dist/services/transactions/tx-transfer.d.ts +2 -1
- package/dist/services/transactions/tx-transfer.js +16 -55
- package/dist/services/transactions/tx-transfer.js.map +1 -1
- package/dist/services/transactions/tx-unshield.d.ts +3 -1
- package/dist/services/transactions/tx-unshield.js +40 -119
- package/dist/services/transactions/tx-unshield.js.map +1 -1
- package/dist/utils/blocked-address.js +3 -3
- package/dist/utils/blocked-address.js.map +1 -1
- package/dist/utils/error.js +2 -2
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/gas-price.d.ts +1 -1
- package/dist/utils/gas-price.js +13 -13
- package/dist/utils/gas-price.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setGasDetailsForTransaction = exports.gasEstimateResponse = exports.getGasEstimate = void 0;
|
|
4
|
-
const
|
|
4
|
+
const dop_sharedmodel_1 = require("dop-sharedmodel");
|
|
5
5
|
const dop_1 = require("../dop");
|
|
6
6
|
const error_1 = require("../../utils/error");
|
|
7
|
-
const
|
|
7
|
+
const dop_engine_1 = require("dop-engine");
|
|
8
8
|
const getGasEstimate = async (networkName, transaction, fromWalletAddress, sendWithPublicWallet, isCrossContractCall) => {
|
|
9
|
-
const evmGasType = (0,
|
|
9
|
+
const evmGasType = (0, dop_sharedmodel_1.getEVMGasTypeForTransaction)(networkName, sendWithPublicWallet);
|
|
10
10
|
// Add 'from' field, which is required, as a mock address.
|
|
11
11
|
// Note that DEPOSIT needs a real address, as it checks the balance for transfer.
|
|
12
12
|
const estimateGasTransactionRequest = {
|
|
@@ -14,13 +14,11 @@ const getGasEstimate = async (networkName, transaction, fromWalletAddress, sendW
|
|
|
14
14
|
from: fromWalletAddress,
|
|
15
15
|
type: evmGasType,
|
|
16
16
|
};
|
|
17
|
-
console.log("estimateGasTransactionRequest:::1", estimateGasTransactionRequest);
|
|
18
17
|
if (shouldRemoveGasLimitForL2GasEstimate(networkName)) {
|
|
19
18
|
delete estimateGasTransactionRequest.gasLimit;
|
|
20
19
|
}
|
|
21
20
|
try {
|
|
22
21
|
const gasEstimate = await estimateGas(networkName, estimateGasTransactionRequest, isCrossContractCall);
|
|
23
|
-
console.log("before gasEstimate", gasEstimate);
|
|
24
22
|
return gasEstimate;
|
|
25
23
|
}
|
|
26
24
|
catch (err) {
|
|
@@ -28,21 +26,13 @@ const getGasEstimate = async (networkName, transaction, fromWalletAddress, sendW
|
|
|
28
26
|
}
|
|
29
27
|
};
|
|
30
28
|
exports.getGasEstimate = getGasEstimate;
|
|
31
|
-
0xe4899c1300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000261705b09939a2271eb98b782fb02435c02beeda000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024e9a059a3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000261705b09939a2271eb98b782fb02435c02beeda000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184bf8d1c5b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000082389495bb548e00e901f8ac82e9761152898834000000000000000000000000000000000000000000000000000000000000000120cd37ba9a49df5deeddb3f6355431c55d21b8aeaa6a2a91dddd12378bd76ebc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000504b0dc14f036567d6deb04c09480a1f36c4682faa260c0bf15ff98e66714d252592874afaf1beb2866a003fd1677caaf7b128cbd075709aa8d494dbf482c04d3958b0826a15613654d15cce9a622b2dc1553ead6243f9c77fbc6f15d01c985f8026f7ae910774362b20aa14a3e4f6bb8e8762038d58f4094576bd9ffe92c87200000000000000000000000000000000000000000000000000000000;
|
|
32
29
|
const estimateGas = (networkName, transaction, isCrossContractCall) => {
|
|
33
30
|
const provider = (0, dop_1.getFallbackProviderForNetwork)(networkName);
|
|
34
|
-
console.log("before isCrossContractCall", isCrossContractCall);
|
|
35
31
|
if (isCrossContractCall) {
|
|
36
32
|
// Includes custom error handler for relay-adapt transactions.
|
|
37
|
-
return
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
return provider.estimateGas(transaction);
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
console.log("before error:::", e);
|
|
44
|
-
return new Promise(resolve => resolve);
|
|
33
|
+
return dop_engine_1.RelayAdaptContract.estimateGasWithErrorHandler(provider, transaction);
|
|
45
34
|
}
|
|
35
|
+
return provider.estimateGas(transaction);
|
|
46
36
|
};
|
|
47
37
|
/**
|
|
48
38
|
* Gas estimates can fail for relay-adapt transactions on L2s like Arbitrum.
|
|
@@ -50,21 +40,21 @@ const estimateGas = (networkName, transaction, isCrossContractCall) => {
|
|
|
50
40
|
*/
|
|
51
41
|
const shouldRemoveGasLimitForL2GasEstimate = (networkName) => {
|
|
52
42
|
switch (networkName) {
|
|
53
|
-
case
|
|
54
|
-
case
|
|
43
|
+
case dop_sharedmodel_1.NetworkName.Arbitrum:
|
|
44
|
+
case dop_sharedmodel_1.NetworkName.ArbitrumGoerli:
|
|
55
45
|
return true;
|
|
56
|
-
case
|
|
57
|
-
case
|
|
46
|
+
case dop_sharedmodel_1.NetworkName.Xlayer:
|
|
47
|
+
case dop_sharedmodel_1.NetworkName.XlayerTestnet:
|
|
58
48
|
return true;
|
|
59
|
-
case
|
|
49
|
+
case dop_sharedmodel_1.NetworkName.Dop:
|
|
60
50
|
throw new Error('Invalid network for transaction');
|
|
61
|
-
case
|
|
62
|
-
case
|
|
63
|
-
case
|
|
64
|
-
case
|
|
65
|
-
case
|
|
66
|
-
case
|
|
67
|
-
case
|
|
51
|
+
case dop_sharedmodel_1.NetworkName.Ethereum:
|
|
52
|
+
case dop_sharedmodel_1.NetworkName.BNBChain:
|
|
53
|
+
case dop_sharedmodel_1.NetworkName.Polygon:
|
|
54
|
+
case dop_sharedmodel_1.NetworkName.EthereumRopsten_DEPRECATED:
|
|
55
|
+
case dop_sharedmodel_1.NetworkName.EthereumGoerli:
|
|
56
|
+
case dop_sharedmodel_1.NetworkName.PolygonMumbai:
|
|
57
|
+
case dop_sharedmodel_1.NetworkName.Hardhat:
|
|
68
58
|
return false;
|
|
69
59
|
}
|
|
70
60
|
};
|
|
@@ -72,42 +62,40 @@ const gasEstimateResponse = (gasEstimate, relayerFeeCommitment, isGasEstimateWit
|
|
|
72
62
|
// TODO: This variance will be different on L2s.
|
|
73
63
|
// However, it's small enough that it shouldn't matter very much.
|
|
74
64
|
const gasEstimateWithDummyProofVariance = isGasEstimateWithDummyProof
|
|
75
|
-
? gasEstimate + BigInt(
|
|
65
|
+
? gasEstimate + BigInt(dop_engine_1.GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION)
|
|
76
66
|
: gasEstimate;
|
|
77
|
-
console.log("gasEstimateWithDummyProofVariance:::2", gasEstimateWithDummyProofVariance);
|
|
78
67
|
const response = {
|
|
79
68
|
gasEstimate: gasEstimateWithDummyProofVariance,
|
|
80
69
|
relayerFeeCommitment,
|
|
81
70
|
};
|
|
82
|
-
console.log("before DopTransactionGasEstimateResponse return:::1");
|
|
83
71
|
return response;
|
|
84
72
|
};
|
|
85
73
|
exports.gasEstimateResponse = gasEstimateResponse;
|
|
86
74
|
const setGasDetailsForTransaction = (networkName, transaction, gasDetails, sendWithPublicWallet) => {
|
|
87
75
|
const { gasEstimate } = gasDetails;
|
|
88
76
|
// eslint-disable-next-line no-param-reassign
|
|
89
|
-
transaction.gasLimit = (0,
|
|
90
|
-
const evmGasType = (0,
|
|
77
|
+
transaction.gasLimit = (0, dop_sharedmodel_1.calculateGasLimit)(gasEstimate);
|
|
78
|
+
const evmGasType = (0, dop_sharedmodel_1.getEVMGasTypeForTransaction)(networkName, sendWithPublicWallet);
|
|
91
79
|
if (gasDetails.evmGasType !== evmGasType) {
|
|
92
80
|
const transactionType = sendWithPublicWallet ? 'self-signed' : 'Relayer';
|
|
93
|
-
throw new Error(`Invalid evmGasType for ${networkName} (${transactionType}): expected Type${evmGasType}, received Type${gasDetails.evmGasType} in gasDetails. Retrieve appropriate gas type with getEVMGasTypeForTransaction (dop-sharedmodel
|
|
81
|
+
throw new Error(`Invalid evmGasType for ${networkName} (${transactionType}): expected Type${evmGasType}, received Type${gasDetails.evmGasType} in gasDetails. Retrieve appropriate gas type with getEVMGasTypeForTransaction (dop-sharedmodel).`);
|
|
94
82
|
}
|
|
95
83
|
// eslint-disable-next-line no-param-reassign
|
|
96
84
|
transaction.type = gasDetails.evmGasType;
|
|
97
85
|
switch (gasDetails.evmGasType) {
|
|
98
|
-
case
|
|
86
|
+
case dop_sharedmodel_1.EVMGasType.Type0: {
|
|
99
87
|
// eslint-disable-next-line no-param-reassign
|
|
100
88
|
transaction.gasPrice = gasDetails.gasPrice;
|
|
101
89
|
// eslint-disable-next-line no-param-reassign
|
|
102
90
|
delete transaction.accessList;
|
|
103
91
|
break;
|
|
104
92
|
}
|
|
105
|
-
case
|
|
93
|
+
case dop_sharedmodel_1.EVMGasType.Type1: {
|
|
106
94
|
// eslint-disable-next-line no-param-reassign
|
|
107
95
|
transaction.gasPrice = gasDetails.gasPrice;
|
|
108
96
|
break;
|
|
109
97
|
}
|
|
110
|
-
case
|
|
98
|
+
case dop_sharedmodel_1.EVMGasType.Type2: {
|
|
111
99
|
// eslint-disable-next-line no-param-reassign
|
|
112
100
|
transaction.maxFeePerGas = gasDetails.maxFeePerGas;
|
|
113
101
|
// eslint-disable-next-line no-param-reassign
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-gas-details.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-gas-details.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DopTransactionGasEstimateResponse,\n EVMGasType,\n calculateGasLimit,\n NetworkName,\n getEVMGasTypeForTransaction,\n CommitmentSummary,\n TransactionGasDetails,\n} from 'dop-sharedmodel-v5';\nimport { getFallbackProviderForNetwork } from '../dop';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport {\n GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION,\n RelayAdaptContract,\n} from 'dop-engine-v5';\nimport { ContractTransaction } from 'ethers';\n\nexport const getGasEstimate = async (\n networkName: NetworkName,\n transaction: ContractTransaction,\n fromWalletAddress: string,\n sendWithPublicWallet: boolean,\n isCrossContractCall: boolean,\n): Promise<bigint> => {\n const evmGasType = getEVMGasTypeForTransaction(\n networkName,\n sendWithPublicWallet,\n );\n\n // Add 'from' field, which is required, as a mock address.\n // Note that DEPOSIT needs a real address, as it checks the balance for transfer.\n const estimateGasTransactionRequest: ContractTransaction = {\n ...transaction,\n from: fromWalletAddress,\n type: evmGasType,\n };\n console.log(\"estimateGasTransactionRequest:::1\", estimateGasTransactionRequest);\n\n\n if (shouldRemoveGasLimitForL2GasEstimate(networkName)) {\n delete estimateGasTransactionRequest.gasLimit;\n }\n\n try {\n const gasEstimate = await estimateGas(\n networkName,\n estimateGasTransactionRequest,\n isCrossContractCall,\n );\n console.log(\"before gasEstimate\", gasEstimate);\n\n return gasEstimate;\n } catch (err) {\n throw reportAndSanitizeError(getGasEstimate.name, err);\n }\n};\n\n0xe4899c1300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000261705b09939a2271eb98b782fb02435c02beeda000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024e9a059a3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000261705b09939a2271eb98b782fb02435c02beeda000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184bf8d1c5b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000082389495bb548e00e901f8ac82e9761152898834000000000000000000000000000000000000000000000000000000000000000120cd37ba9a49df5deeddb3f6355431c55d21b8aeaa6a2a91dddd12378bd76ebc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000504b0dc14f036567d6deb04c09480a1f36c4682faa260c0bf15ff98e66714d252592874afaf1beb2866a003fd1677caaf7b128cbd075709aa8d494dbf482c04d3958b0826a15613654d15cce9a622b2dc1553ead6243f9c77fbc6f15d01c985f8026f7ae910774362b20aa14a3e4f6bb8e8762038d58f4094576bd9ffe92c87200000000000000000000000000000000000000000000000000000000\n\nconst estimateGas = (\n networkName: NetworkName,\n transaction: ContractTransaction,\n isCrossContractCall: boolean,\n): Promise<bigint> => {\n const provider = getFallbackProviderForNetwork(networkName);\n console.log(\"before isCrossContractCall\", isCrossContractCall);\n\n if (isCrossContractCall) {\n // Includes custom error handler for relay-adapt transactions.\n return RelayAdaptContract.estimateGasWithErrorHandler(\n provider,\n transaction,\n );\n }\n try{\n\n return provider.estimateGas(transaction);\n }catch(e){\n console.log(\"before error:::\", e)\n return new Promise(resolve => resolve)\n }\n};\n\n/**\n * Gas estimates can fail for relay-adapt transactions on L2s like Arbitrum.\n * This occurs on cross-contract calls (relay-adapt) which have a manual minimum gas limit set by Dop Engine.\n */\nconst shouldRemoveGasLimitForL2GasEstimate = (networkName: NetworkName) => {\n switch (networkName) {\n case NetworkName.Arbitrum:\n case NetworkName.ArbitrumGoerli:\n return true;\n case NetworkName.Xlayer:\n case NetworkName.XlayerTestnet:\n return true;\n case NetworkName.Dop:\n throw new Error('Invalid network for transaction');\n case NetworkName.Ethereum:\n case NetworkName.BNBChain:\n case NetworkName.Polygon:\n case NetworkName.EthereumRopsten_DEPRECATED:\n case NetworkName.EthereumGoerli:\n case NetworkName.PolygonMumbai:\n case NetworkName.Hardhat:\n return false;\n }\n};\n\nexport const gasEstimateResponse = (\n gasEstimate: bigint,\n relayerFeeCommitment: Optional<CommitmentSummary>,\n isGasEstimateWithDummyProof: boolean,\n): DopTransactionGasEstimateResponse => {\n // TODO: This variance will be different on L2s.\n // However, it's small enough that it shouldn't matter very much.\n const gasEstimateWithDummyProofVariance = isGasEstimateWithDummyProof\n ? gasEstimate + BigInt(GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION)\n : gasEstimate;\n\n console.log(\"gasEstimateWithDummyProofVariance:::2\", gasEstimateWithDummyProofVariance);\n\n const response: DopTransactionGasEstimateResponse = {\n gasEstimate: gasEstimateWithDummyProofVariance,\n relayerFeeCommitment,\n };\n console.log(\"before DopTransactionGasEstimateResponse return:::1\");\n\n\n return response;\n};\n\nexport const setGasDetailsForTransaction = (\n networkName: NetworkName,\n transaction: ContractTransaction,\n gasDetails: TransactionGasDetails,\n sendWithPublicWallet: boolean,\n) => {\n const { gasEstimate } = gasDetails;\n\n // eslint-disable-next-line no-param-reassign\n transaction.gasLimit = calculateGasLimit(gasEstimate);\n\n const evmGasType = getEVMGasTypeForTransaction(\n networkName,\n sendWithPublicWallet,\n );\n\n if (gasDetails.evmGasType !== evmGasType) {\n const transactionType = sendWithPublicWallet ? 'self-signed' : 'Relayer';\n throw new Error(\n `Invalid evmGasType for ${networkName} (${transactionType}): expected Type${evmGasType}, received Type${gasDetails.evmGasType} in gasDetails. Retrieve appropriate gas type with getEVMGasTypeForTransaction (dop-sharedmodel-v5).`,\n );\n }\n\n // eslint-disable-next-line no-param-reassign\n transaction.type = gasDetails.evmGasType;\n\n switch (gasDetails.evmGasType) {\n case EVMGasType.Type0: {\n // eslint-disable-next-line no-param-reassign\n transaction.gasPrice = gasDetails.gasPrice;\n // eslint-disable-next-line no-param-reassign\n delete transaction.accessList;\n break;\n }\n case EVMGasType.Type1: {\n // eslint-disable-next-line no-param-reassign\n transaction.gasPrice = gasDetails.gasPrice;\n break;\n }\n case EVMGasType.Type2: {\n // eslint-disable-next-line no-param-reassign\n transaction.maxFeePerGas = gasDetails.maxFeePerGas;\n // eslint-disable-next-line no-param-reassign\n transaction.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas;\n break;\n }\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"tx-gas-details.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-gas-details.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DopTransactionGasEstimateResponse,\n EVMGasType,\n calculateGasLimit,\n NetworkName,\n getEVMGasTypeForTransaction,\n CommitmentSummary,\n TransactionGasDetails,\n} from 'dop-sharedmodel';\nimport { getFallbackProviderForNetwork } from '../dop';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport {\n GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION,\n RelayAdaptContract,\n} from 'dop-engine';\nimport { ContractTransaction } from 'ethers';\n\nexport const getGasEstimate = async (\n networkName: NetworkName,\n transaction: ContractTransaction,\n fromWalletAddress: string,\n sendWithPublicWallet: boolean,\n isCrossContractCall: boolean,\n): Promise<bigint> => {\n const evmGasType = getEVMGasTypeForTransaction(\n networkName,\n sendWithPublicWallet,\n );\n\n // Add 'from' field, which is required, as a mock address.\n // Note that DEPOSIT needs a real address, as it checks the balance for transfer.\n const estimateGasTransactionRequest: ContractTransaction = {\n ...transaction,\n from: fromWalletAddress,\n type: evmGasType,\n };\n\n if (shouldRemoveGasLimitForL2GasEstimate(networkName)) {\n delete estimateGasTransactionRequest.gasLimit;\n }\n\n try {\n const gasEstimate = await estimateGas(\n networkName,\n estimateGasTransactionRequest,\n isCrossContractCall,\n );\n\n return gasEstimate;\n } catch (err) {\n throw reportAndSanitizeError(getGasEstimate.name, err);\n }\n};\n\nconst estimateGas = (\n networkName: NetworkName,\n transaction: ContractTransaction,\n isCrossContractCall: boolean,\n): Promise<bigint> => {\n const provider = getFallbackProviderForNetwork(networkName);\n\n if (isCrossContractCall) {\n // Includes custom error handler for relay-adapt transactions.\n return RelayAdaptContract.estimateGasWithErrorHandler(\n provider,\n transaction,\n );\n }\n return provider.estimateGas(transaction);\n};\n\n/**\n * Gas estimates can fail for relay-adapt transactions on L2s like Arbitrum.\n * This occurs on cross-contract calls (relay-adapt) which have a manual minimum gas limit set by Dop Engine.\n */\nconst shouldRemoveGasLimitForL2GasEstimate = (networkName: NetworkName) => {\n switch (networkName) {\n case NetworkName.Arbitrum:\n case NetworkName.ArbitrumGoerli:\n return true;\n case NetworkName.Xlayer:\n case NetworkName.XlayerTestnet:\n return true;\n case NetworkName.Dop:\n throw new Error('Invalid network for transaction');\n case NetworkName.Ethereum:\n case NetworkName.BNBChain:\n case NetworkName.Polygon:\n case NetworkName.EthereumRopsten_DEPRECATED:\n case NetworkName.EthereumGoerli:\n case NetworkName.PolygonMumbai:\n case NetworkName.Hardhat:\n return false;\n }\n};\n\nexport const gasEstimateResponse = (\n gasEstimate: bigint,\n relayerFeeCommitment: Optional<CommitmentSummary>,\n isGasEstimateWithDummyProof: boolean,\n): DopTransactionGasEstimateResponse => {\n // TODO: This variance will be different on L2s.\n // However, it's small enough that it shouldn't matter very much.\n const gasEstimateWithDummyProofVariance = isGasEstimateWithDummyProof\n ? gasEstimate + BigInt(GAS_ESTIMATE_VARIANCE_DUMMY_TO_ACTUAL_TRANSACTION)\n : gasEstimate;\n\n\n\n const response: DopTransactionGasEstimateResponse = {\n gasEstimate: gasEstimateWithDummyProofVariance,\n relayerFeeCommitment,\n };\n\n return response;\n};\n\nexport const setGasDetailsForTransaction = (\n networkName: NetworkName,\n transaction: ContractTransaction,\n gasDetails: TransactionGasDetails,\n sendWithPublicWallet: boolean,\n) => {\n const { gasEstimate } = gasDetails;\n\n // eslint-disable-next-line no-param-reassign\n transaction.gasLimit = calculateGasLimit(gasEstimate);\n\n const evmGasType = getEVMGasTypeForTransaction(\n networkName,\n sendWithPublicWallet,\n );\n\n if (gasDetails.evmGasType !== evmGasType) {\n const transactionType = sendWithPublicWallet ? 'self-signed' : 'Relayer';\n throw new Error(\n `Invalid evmGasType for ${networkName} (${transactionType}): expected Type${evmGasType}, received Type${gasDetails.evmGasType} in gasDetails. Retrieve appropriate gas type with getEVMGasTypeForTransaction (dop-sharedmodel).`,\n );\n }\n\n // eslint-disable-next-line no-param-reassign\n transaction.type = gasDetails.evmGasType;\n\n switch (gasDetails.evmGasType) {\n case EVMGasType.Type0: {\n // eslint-disable-next-line no-param-reassign\n transaction.gasPrice = gasDetails.gasPrice;\n // eslint-disable-next-line no-param-reassign\n delete transaction.accessList;\n break;\n }\n case EVMGasType.Type1: {\n // eslint-disable-next-line no-param-reassign\n transaction.gasPrice = gasDetails.gasPrice;\n break;\n }\n case EVMGasType.Type2: {\n // eslint-disable-next-line no-param-reassign\n transaction.maxFeePerGas = gasDetails.maxFeePerGas;\n // eslint-disable-next-line no-param-reassign\n transaction.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas;\n break;\n }\n }\n};\n"]}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TransactionStruct } from 'dop-engine';
|
|
2
|
+
import { NetworkName, TransactionGasDetails, DopERC20Amount, DopTransactionGasEstimateResponse, FeeTokenDetails, DopERC20AmountRecipient } from 'dop-sharedmodel';
|
|
3
|
+
import { ContractTransaction } from 'ethers';
|
|
2
4
|
export declare const calculateRelayerFeeERC20Amount: (feeTokenDetails: FeeTokenDetails, gasDetails: TransactionGasDetails) => DopERC20Amount;
|
|
5
|
+
export declare const gasEstimateResponseDummyProofIterativeRelayerFee: (generateDummyTransactionStructsWithRelayerFee: (relayerFeeERC20Amount: Optional<DopERC20Amount>) => Promise<TransactionStruct[]>, generateTransaction: (serializedTransactions: TransactionStruct[]) => Promise<ContractTransaction>, networkName: NetworkName, dopWalletID: string, erc20AmountRecipients: DopERC20AmountRecipient[], originalGasDetails: TransactionGasDetails, feeTokenDetails: Optional<FeeTokenDetails>, sendWithPublicWallet: boolean, isCrossContractCall: boolean) => Promise<DopTransactionGasEstimateResponse>;
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.calculateRelayerFeeERC20Amount = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.gasEstimateResponseDummyProofIterativeRelayerFee = exports.calculateRelayerFeeERC20Amount = void 0;
|
|
4
|
+
const dop_sharedmodel_1 = require("dop-sharedmodel");
|
|
5
|
+
const tx_generator_1 = require("./tx-generator");
|
|
6
|
+
const tx_gas_details_1 = require("./tx-gas-details");
|
|
7
|
+
const balance_update_1 = require("../dop/wallets/balance-update");
|
|
8
|
+
const dop_1 = require("../dop");
|
|
9
|
+
const commitment_1 = require("../dop/util/commitment");
|
|
5
10
|
const MAX_ITERATIONS_RELAYER_FEE_REESTIMATION = 5;
|
|
6
11
|
const calculateRelayerFeeERC20Amount = (feeTokenDetails, gasDetails) => {
|
|
7
12
|
const tokenFeePerUnitGas = BigInt(feeTokenDetails.feePerUnitGas);
|
|
8
13
|
const oneUnitGas = 10n ** 18n;
|
|
9
|
-
const maximumGas = (0,
|
|
14
|
+
const maximumGas = (0, dop_sharedmodel_1.calculateMaximumGas)(gasDetails);
|
|
10
15
|
const tokenFee = (tokenFeePerUnitGas * maximumGas) / oneUnitGas;
|
|
11
16
|
return {
|
|
12
17
|
tokenAddress: feeTokenDetails.tokenAddress,
|
|
@@ -14,196 +19,92 @@ const calculateRelayerFeeERC20Amount = (feeTokenDetails, gasDetails) => {
|
|
|
14
19
|
};
|
|
15
20
|
};
|
|
16
21
|
exports.calculateRelayerFeeERC20Amount = calculateRelayerFeeERC20Amount;
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const relayerFeeCommitment = transactionStructs[transactionIndex];
|
|
23
|
-
const relayerFeeCommitmentIndex = 0;
|
|
24
|
-
return convertTransactionStructToCommitmentSummary(
|
|
25
|
-
relayerFeeCommitment,
|
|
26
|
-
relayerFeeCommitmentIndex,
|
|
27
|
-
);
|
|
22
|
+
const getRelayerFeeCommitment = (transactionStructs) => {
|
|
23
|
+
const transactionIndex = 0;
|
|
24
|
+
const relayerFeeCommitment = transactionStructs[transactionIndex];
|
|
25
|
+
const relayerFeeCommitmentIndex = 0;
|
|
26
|
+
return (0, commitment_1.convertTransactionStructToCommitmentSummary)(relayerFeeCommitment, relayerFeeCommitmentIndex);
|
|
28
27
|
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
): Promise<DopTransactionGasEstimateResponse> => {
|
|
45
|
-
const wallet = walletForID(dopWalletID);
|
|
46
|
-
|
|
47
|
-
// Use dead address for private transaction gas estimate
|
|
48
|
-
const fromWalletAddress = DUMMY_FROM_ADDRESS;
|
|
49
|
-
|
|
50
|
-
const isGasEstimateWithDummyProof = true;
|
|
51
|
-
|
|
52
|
-
const dummyRelayerFee = feeTokenDetails
|
|
53
|
-
? createDummyRelayerFeeERC20Amount(feeTokenDetails.tokenAddress)
|
|
54
|
-
: undefined;
|
|
55
|
-
|
|
56
|
-
let serializedTransactions =
|
|
57
|
-
await generateDummyTransactionStructsWithRelayerFee(dummyRelayerFee);
|
|
58
|
-
let transaction = await generateTransaction(serializedTransactions);
|
|
59
|
-
|
|
60
|
-
let gasEstimate = await getGasEstimate(
|
|
61
|
-
networkName,
|
|
62
|
-
transaction,
|
|
63
|
-
fromWalletAddress,
|
|
64
|
-
sendWithPublicWallet,
|
|
65
|
-
isCrossContractCall,
|
|
66
|
-
);
|
|
67
|
-
console.log("gasEstimateForUnprovenTransfer gasEstimate::", gasEstimate)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (sendWithPublicWallet) {
|
|
71
|
-
return gasEstimateResponse(
|
|
72
|
-
gasEstimate,
|
|
73
|
-
undefined, // relayerFeeCommitment
|
|
74
|
-
isGasEstimateWithDummyProof,
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (!feeTokenDetails) {
|
|
79
|
-
throw new Error(
|
|
80
|
-
'Must have Relayer Fee details or sendWithPublicWallet field.',
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Find any erc20Amount in transfer that matches token of relayer fee, if exists.
|
|
85
|
-
const relayerFeeMatchingSendingERC20Amount = erc20AmountRecipients.find(
|
|
86
|
-
erc20AmountRecipient =>
|
|
87
|
-
erc20AmountRecipient.tokenAddress.toLowerCase() ===
|
|
88
|
-
feeTokenDetails.tokenAddress.toLowerCase(),
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Get private balance of matching token.
|
|
92
|
-
const balanceForRelayerFeeERC20 = await balanceForERC20Token(
|
|
93
|
-
wallet,
|
|
94
|
-
networkName,
|
|
95
|
-
feeTokenDetails.tokenAddress,
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
let relayerFeeCommitment = getRelayerFeeCommitment(serializedTransactions);
|
|
99
|
-
|
|
100
|
-
// Iteratively calculate new relayer fee and estimate new gas amount.
|
|
101
|
-
// This change if the number of circuits changes because of the additional Relayer Fees.
|
|
102
|
-
for (let i = 0; i < MAX_ITERATIONS_RELAYER_FEE_REESTIMATION; i += 1) {
|
|
103
|
-
const updatedGasDetails: TransactionGasDetails = {
|
|
104
|
-
...originalGasDetails,
|
|
105
|
-
gasEstimate,
|
|
106
|
-
};
|
|
107
|
-
const updatedRelayerFee: DopERC20Amount =
|
|
108
|
-
calculateRelayerFeeERC20Amount(feeTokenDetails, updatedGasDetails);
|
|
109
|
-
|
|
110
|
-
// If Relayer fee causes overflow with the token balance,
|
|
111
|
-
// then use the MAX amount for Relayer Fee, which is BALANCE - SENDING AMOUNT.
|
|
112
|
-
if (
|
|
113
|
-
balanceForRelayerFeeERC20 > 0n &&
|
|
114
|
-
relayerFeeMatchingSendingERC20Amount &&
|
|
115
|
-
// eslint-disable-next-line no-await-in-loop
|
|
116
|
-
(await relayerFeeWillOverflowBalance(
|
|
117
|
-
balanceForRelayerFeeERC20,
|
|
118
|
-
relayerFeeMatchingSendingERC20Amount,
|
|
119
|
-
updatedRelayerFee,
|
|
120
|
-
))
|
|
121
|
-
) {
|
|
122
|
-
updatedRelayerFee.amount =
|
|
123
|
-
balanceForRelayerFeeERC20 - relayerFeeMatchingSendingERC20Amount.amount;
|
|
28
|
+
const gasEstimateResponseDummyProofIterativeRelayerFee = async (generateDummyTransactionStructsWithRelayerFee, generateTransaction, networkName, dopWalletID, erc20AmountRecipients, originalGasDetails, feeTokenDetails, sendWithPublicWallet, isCrossContractCall) => {
|
|
29
|
+
const wallet = (0, dop_1.walletForID)(dopWalletID);
|
|
30
|
+
// Use dead address for private transaction gas estimate
|
|
31
|
+
const fromWalletAddress = tx_generator_1.DUMMY_FROM_ADDRESS;
|
|
32
|
+
const isGasEstimateWithDummyProof = true;
|
|
33
|
+
const dummyRelayerFee = feeTokenDetails
|
|
34
|
+
? (0, tx_generator_1.createDummyRelayerFeeERC20Amount)(feeTokenDetails.tokenAddress)
|
|
35
|
+
: undefined;
|
|
36
|
+
let serializedTransactions = await generateDummyTransactionStructsWithRelayerFee(dummyRelayerFee);
|
|
37
|
+
let transaction = await generateTransaction(serializedTransactions);
|
|
38
|
+
let gasEstimate = await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, sendWithPublicWallet, isCrossContractCall);
|
|
39
|
+
console.log("gasEstimateForUnprovenTransfer gasEstimate::", gasEstimate);
|
|
40
|
+
if (sendWithPublicWallet) {
|
|
41
|
+
return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, undefined, // relayerFeeCommitment
|
|
42
|
+
isGasEstimateWithDummyProof);
|
|
124
43
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// eslint-disable-next-line no-await-in-loop
|
|
128
|
-
await generateDummyTransactionStructsWithRelayerFee(updatedRelayerFee);
|
|
129
|
-
|
|
130
|
-
relayerFeeCommitment = getRelayerFeeCommitment(newSerializedTransactions);
|
|
131
|
-
|
|
132
|
-
if (
|
|
133
|
-
compareCircuitSizesTransactionStructs(
|
|
134
|
-
newSerializedTransactions,
|
|
135
|
-
serializedTransactions,
|
|
136
|
-
)
|
|
137
|
-
) {
|
|
138
|
-
// Same circuit sizes, no need to run further gas estimates.
|
|
139
|
-
return gasEstimateResponse(
|
|
140
|
-
gasEstimate,
|
|
141
|
-
relayerFeeCommitment,
|
|
142
|
-
isGasEstimateWithDummyProof,
|
|
143
|
-
);
|
|
44
|
+
if (!feeTokenDetails) {
|
|
45
|
+
throw new Error('Must have Relayer Fee details or sendWithPublicWallet field.');
|
|
144
46
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
//
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
47
|
+
// Find any erc20Amount in transfer that matches token of relayer fee, if exists.
|
|
48
|
+
const relayerFeeMatchingSendingERC20Amount = erc20AmountRecipients.find(erc20AmountRecipient => erc20AmountRecipient.tokenAddress.toLowerCase() ===
|
|
49
|
+
feeTokenDetails.tokenAddress.toLowerCase());
|
|
50
|
+
// Get private balance of matching token.
|
|
51
|
+
const balanceForRelayerFeeERC20 = await (0, balance_update_1.balanceForERC20Token)(wallet, networkName, feeTokenDetails.tokenAddress);
|
|
52
|
+
let relayerFeeCommitment = getRelayerFeeCommitment(serializedTransactions);
|
|
53
|
+
// Iteratively calculate new relayer fee and estimate new gas amount.
|
|
54
|
+
// This change if the number of circuits changes because of the additional Relayer Fees.
|
|
55
|
+
for (let i = 0; i < MAX_ITERATIONS_RELAYER_FEE_REESTIMATION; i += 1) {
|
|
56
|
+
const updatedGasDetails = {
|
|
57
|
+
...originalGasDetails,
|
|
58
|
+
gasEstimate,
|
|
59
|
+
};
|
|
60
|
+
const updatedRelayerFee = (0, exports.calculateRelayerFeeERC20Amount)(feeTokenDetails, updatedGasDetails);
|
|
61
|
+
// If Relayer fee causes overflow with the token balance,
|
|
62
|
+
// then use the MAX amount for Relayer Fee, which is BALANCE - SENDING AMOUNT.
|
|
63
|
+
if (balanceForRelayerFeeERC20 > 0n &&
|
|
64
|
+
relayerFeeMatchingSendingERC20Amount &&
|
|
65
|
+
// eslint-disable-next-line no-await-in-loop
|
|
66
|
+
(await relayerFeeWillOverflowBalance(balanceForRelayerFeeERC20, relayerFeeMatchingSendingERC20Amount, updatedRelayerFee))) {
|
|
67
|
+
updatedRelayerFee.amount =
|
|
68
|
+
balanceForRelayerFeeERC20 - relayerFeeMatchingSendingERC20Amount.amount;
|
|
69
|
+
}
|
|
70
|
+
const newSerializedTransactions =
|
|
71
|
+
// eslint-disable-next-line no-await-in-loop
|
|
72
|
+
await generateDummyTransactionStructsWithRelayerFee(updatedRelayerFee);
|
|
73
|
+
relayerFeeCommitment = getRelayerFeeCommitment(newSerializedTransactions);
|
|
74
|
+
if (compareCircuitSizesTransactionStructs(newSerializedTransactions, serializedTransactions)) {
|
|
75
|
+
// Same circuit sizes, no need to run further gas estimates.
|
|
76
|
+
return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, relayerFeeCommitment, isGasEstimateWithDummyProof);
|
|
77
|
+
}
|
|
78
|
+
serializedTransactions = newSerializedTransactions;
|
|
79
|
+
// eslint-disable-next-line no-await-in-loop
|
|
80
|
+
transaction = await generateTransaction(serializedTransactions);
|
|
81
|
+
// eslint-disable-next-line no-await-in-loop
|
|
82
|
+
const newGasEstimate = await (0, tx_gas_details_1.getGasEstimate)(networkName, transaction, fromWalletAddress, sendWithPublicWallet, isCrossContractCall);
|
|
83
|
+
if (newGasEstimate === gasEstimate) {
|
|
84
|
+
return (0, tx_gas_details_1.gasEstimateResponse)(newGasEstimate, relayerFeeCommitment, isGasEstimateWithDummyProof);
|
|
85
|
+
}
|
|
86
|
+
gasEstimate = newGasEstimate;
|
|
166
87
|
}
|
|
167
|
-
gasEstimate
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return gasEstimateResponse(
|
|
171
|
-
gasEstimate,
|
|
172
|
-
relayerFeeCommitment,
|
|
173
|
-
isGasEstimateWithDummyProof,
|
|
174
|
-
);
|
|
88
|
+
return (0, tx_gas_details_1.gasEstimateResponse)(gasEstimate, relayerFeeCommitment, isGasEstimateWithDummyProof);
|
|
175
89
|
};
|
|
176
|
-
|
|
177
|
-
const compareCircuitSizesTransactionStructs = (
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
// return false;
|
|
189
|
-
// }
|
|
190
|
-
if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {
|
|
191
|
-
return false;
|
|
90
|
+
exports.gasEstimateResponseDummyProofIterativeRelayerFee = gasEstimateResponseDummyProofIterativeRelayerFee;
|
|
91
|
+
const compareCircuitSizesTransactionStructs = (serializedA, serializedB) => {
|
|
92
|
+
if (serializedA.length !== serializedB.length) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
for (let i = 0; i < serializedA.length; i += 1) {
|
|
96
|
+
if (serializedA[i].commitments.length !== serializedB[i].commitments.length) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
192
102
|
}
|
|
193
|
-
|
|
194
|
-
return true;
|
|
103
|
+
return true;
|
|
195
104
|
};
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
relayerFeeERC20Amount: DopERC20Amount,
|
|
201
|
-
) => {
|
|
202
|
-
const sendingAmount = sendingERC20Amount.amount;
|
|
203
|
-
const relayerFeeAmount = relayerFeeERC20Amount.amount;
|
|
204
|
-
|
|
205
|
-
return sendingAmount + relayerFeeAmount > tokenBalance;
|
|
105
|
+
const relayerFeeWillOverflowBalance = async (tokenBalance, sendingERC20Amount, relayerFeeERC20Amount) => {
|
|
106
|
+
const sendingAmount = sendingERC20Amount.amount;
|
|
107
|
+
const relayerFeeAmount = relayerFeeERC20Amount.amount;
|
|
108
|
+
return sendingAmount + relayerFeeAmount > tokenBalance;
|
|
206
109
|
};
|
|
207
|
-
|
|
208
|
-
*/
|
|
209
110
|
//# sourceMappingURL=tx-gas-relayer-fee-estimator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-gas-relayer-fee-estimator.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-gas-relayer-fee-estimator.ts"],"names":[],"mappings":";;;AACA,2DAS4B;AAW5B,MAAM,uCAAuC,GAAG,CAAC,CAAC;AAE3C,MAAM,8BAA8B,GAAG,CAC5C,eAAgC,EAChC,UAAiC,EACjB,EAAE;IAClB,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAA,wCAAmB,EAAC,UAAU,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,CAAC,kBAAkB,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;IAChE,OAAO;QACL,YAAY,EAAE,eAAe,CAAC,YAAY;QAC1C,MAAM,EAAE,QAAQ;KACjB,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,8BAA8B,kCAYzC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+LE","sourcesContent":["import { TransactionStruct } from 'dop-engine-v5';\nimport {\n NetworkName,\n TransactionGasDetails,\n DopERC20Amount,\n DopTransactionGasEstimateResponse,\n FeeTokenDetails,\n calculateMaximumGas,\n DopERC20AmountRecipient,\n CommitmentSummary,\n} from 'dop-sharedmodel-v5';\nimport {\n DUMMY_FROM_ADDRESS,\n createDummyRelayerFeeERC20Amount,\n} from './tx-generator';\nimport { getGasEstimate, gasEstimateResponse } from './tx-gas-details';\nimport { balanceForERC20Token } from '../dop/wallets/balance-update';\nimport { walletForID } from '../dop';\nimport { convertTransactionStructToCommitmentSummary } from '../dop/util/commitment';\nimport { ContractTransaction } from 'ethers';\n\nconst MAX_ITERATIONS_RELAYER_FEE_REESTIMATION = 5;\n\nexport const calculateRelayerFeeERC20Amount = (\n feeTokenDetails: FeeTokenDetails,\n gasDetails: TransactionGasDetails,\n): DopERC20Amount => {\n const tokenFeePerUnitGas = BigInt(feeTokenDetails.feePerUnitGas);\n const oneUnitGas = 10n ** 18n;\n const maximumGas = calculateMaximumGas(gasDetails);\n const tokenFee = (tokenFeePerUnitGas * maximumGas) / oneUnitGas;\n return {\n tokenAddress: feeTokenDetails.tokenAddress,\n amount: tokenFee,\n };\n};\n/*\nconst getRelayerFeeCommitment = (\n transactionStructs: TransactionStruct[],\n): CommitmentSummary => {\n const transactionIndex = 0;\n const relayerFeeCommitment = transactionStructs[transactionIndex];\n const relayerFeeCommitmentIndex = 0;\n return convertTransactionStructToCommitmentSummary(\n relayerFeeCommitment,\n relayerFeeCommitmentIndex,\n );\n};\n\nexport const gasEstimateResponseDummyProofIterativeRelayerFee = async (\n generateDummyTransactionStructsWithRelayerFee: (\n relayerFeeERC20Amount: Optional<DopERC20Amount>,\n ) => Promise<TransactionStruct[]>,\n generateTransaction: (\n serializedTransactions: TransactionStruct[],\n ) => Promise<ContractTransaction>,\n networkName: NetworkName,\n dopWalletID: string,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n isCrossContractCall: boolean,\n): Promise<DopTransactionGasEstimateResponse> => {\n const wallet = walletForID(dopWalletID);\n\n // Use dead address for private transaction gas estimate\n const fromWalletAddress = DUMMY_FROM_ADDRESS;\n\n const isGasEstimateWithDummyProof = true;\n\n const dummyRelayerFee = feeTokenDetails\n ? createDummyRelayerFeeERC20Amount(feeTokenDetails.tokenAddress)\n : undefined;\n\n let serializedTransactions =\n await generateDummyTransactionStructsWithRelayerFee(dummyRelayerFee);\n let transaction = await generateTransaction(serializedTransactions);\n\n let gasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n isCrossContractCall,\n );\n console.log(\"gasEstimateForUnprovenTransfer gasEstimate::\", gasEstimate)\n\n\n if (sendWithPublicWallet) {\n return gasEstimateResponse(\n gasEstimate,\n undefined, // relayerFeeCommitment\n isGasEstimateWithDummyProof,\n );\n }\n\n if (!feeTokenDetails) {\n throw new Error(\n 'Must have Relayer Fee details or sendWithPublicWallet field.',\n );\n }\n\n // Find any erc20Amount in transfer that matches token of relayer fee, if exists.\n const relayerFeeMatchingSendingERC20Amount = erc20AmountRecipients.find(\n erc20AmountRecipient =>\n erc20AmountRecipient.tokenAddress.toLowerCase() ===\n feeTokenDetails.tokenAddress.toLowerCase(),\n );\n\n // Get private balance of matching token.\n const balanceForRelayerFeeERC20 = await balanceForERC20Token(\n wallet,\n networkName,\n feeTokenDetails.tokenAddress,\n );\n\n let relayerFeeCommitment = getRelayerFeeCommitment(serializedTransactions);\n\n // Iteratively calculate new relayer fee and estimate new gas amount.\n // This change if the number of circuits changes because of the additional Relayer Fees.\n for (let i = 0; i < MAX_ITERATIONS_RELAYER_FEE_REESTIMATION; i += 1) {\n const updatedGasDetails: TransactionGasDetails = {\n ...originalGasDetails,\n gasEstimate,\n };\n const updatedRelayerFee: DopERC20Amount =\n calculateRelayerFeeERC20Amount(feeTokenDetails, updatedGasDetails);\n\n // If Relayer fee causes overflow with the token balance,\n // then use the MAX amount for Relayer Fee, which is BALANCE - SENDING AMOUNT.\n if (\n balanceForRelayerFeeERC20 > 0n &&\n relayerFeeMatchingSendingERC20Amount &&\n // eslint-disable-next-line no-await-in-loop\n (await relayerFeeWillOverflowBalance(\n balanceForRelayerFeeERC20,\n relayerFeeMatchingSendingERC20Amount,\n updatedRelayerFee,\n ))\n ) {\n updatedRelayerFee.amount =\n balanceForRelayerFeeERC20 - relayerFeeMatchingSendingERC20Amount.amount;\n }\n\n const newSerializedTransactions =\n // eslint-disable-next-line no-await-in-loop\n await generateDummyTransactionStructsWithRelayerFee(updatedRelayerFee);\n\n relayerFeeCommitment = getRelayerFeeCommitment(newSerializedTransactions);\n\n if (\n compareCircuitSizesTransactionStructs(\n newSerializedTransactions,\n serializedTransactions,\n )\n ) {\n // Same circuit sizes, no need to run further gas estimates.\n return gasEstimateResponse(\n gasEstimate,\n relayerFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n }\n\n serializedTransactions = newSerializedTransactions;\n\n // eslint-disable-next-line no-await-in-loop\n transaction = await generateTransaction(serializedTransactions);\n\n // eslint-disable-next-line no-await-in-loop\n const newGasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n isCrossContractCall,\n );\n\n if (newGasEstimate === gasEstimate) {\n return gasEstimateResponse(\n newGasEstimate,\n relayerFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n }\n gasEstimate = newGasEstimate;\n }\n\n return gasEstimateResponse(\n gasEstimate,\n relayerFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n};\n\nconst compareCircuitSizesTransactionStructs = (\n serializedA: TransactionStruct[],\n serializedB: TransactionStruct[],\n) => {\n if (serializedA.length !== serializedB.length) {\n return false;\n }\n for (let i = 0; i < serializedA.length; i += 1) {\n // if (\n // serializedA[i].commitments.length !== serializedB[i].commitments.length\n // ) {\n // return false;\n // }\n if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {\n return false;\n }\n }\n return true;\n};\n\nconst relayerFeeWillOverflowBalance = async (\n tokenBalance: bigint,\n sendingERC20Amount: DopERC20Amount,\n relayerFeeERC20Amount: DopERC20Amount,\n) => {\n const sendingAmount = sendingERC20Amount.amount;\n const relayerFeeAmount = relayerFeeERC20Amount.amount;\n\n return sendingAmount + relayerFeeAmount > tokenBalance;\n};\n\n*/"]}
|
|
1
|
+
{"version":3,"file":"tx-gas-relayer-fee-estimator.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-gas-relayer-fee-estimator.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransactionStruct } from 'dop-engine';\nimport {\n NetworkName,\n TransactionGasDetails,\n DopERC20Amount,\n DopTransactionGasEstimateResponse,\n FeeTokenDetails,\n calculateMaximumGas,\n DopERC20AmountRecipient,\n CommitmentSummary,\n} from 'dop-sharedmodel';\nimport {\n DUMMY_FROM_ADDRESS,\n createDummyRelayerFeeERC20Amount,\n} from './tx-generator';\nimport { getGasEstimate, gasEstimateResponse } from './tx-gas-details';\nimport { balanceForERC20Token } from '../dop/wallets/balance-update';\nimport { walletForID } from '../dop';\nimport { convertTransactionStructToCommitmentSummary } from '../dop/util/commitment';\nimport { ContractTransaction } from 'ethers';\n\nconst MAX_ITERATIONS_RELAYER_FEE_REESTIMATION = 5;\n\nexport const calculateRelayerFeeERC20Amount = (\n feeTokenDetails: FeeTokenDetails,\n gasDetails: TransactionGasDetails,\n): DopERC20Amount => {\n const tokenFeePerUnitGas = BigInt(feeTokenDetails.feePerUnitGas);\n const oneUnitGas = 10n ** 18n;\n const maximumGas = calculateMaximumGas(gasDetails);\n const tokenFee = (tokenFeePerUnitGas * maximumGas) / oneUnitGas;\n return {\n tokenAddress: feeTokenDetails.tokenAddress,\n amount: tokenFee,\n };\n};\n\nconst getRelayerFeeCommitment = (\n transactionStructs: TransactionStruct[],\n): CommitmentSummary => {\n const transactionIndex = 0;\n const relayerFeeCommitment = transactionStructs[transactionIndex];\n const relayerFeeCommitmentIndex = 0;\n return convertTransactionStructToCommitmentSummary(\n relayerFeeCommitment,\n relayerFeeCommitmentIndex,\n );\n};\n\nexport const gasEstimateResponseDummyProofIterativeRelayerFee = async (\n generateDummyTransactionStructsWithRelayerFee: (\n relayerFeeERC20Amount: Optional<DopERC20Amount>,\n ) => Promise<TransactionStruct[]>,\n generateTransaction: (\n serializedTransactions: TransactionStruct[],\n ) => Promise<ContractTransaction>,\n networkName: NetworkName,\n dopWalletID: string,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n originalGasDetails: TransactionGasDetails,\n feeTokenDetails: Optional<FeeTokenDetails>,\n sendWithPublicWallet: boolean,\n isCrossContractCall: boolean,\n): Promise<DopTransactionGasEstimateResponse> => {\n const wallet = walletForID(dopWalletID);\n\n // Use dead address for private transaction gas estimate\n const fromWalletAddress = DUMMY_FROM_ADDRESS;\n\n const isGasEstimateWithDummyProof = true;\n\n const dummyRelayerFee = feeTokenDetails\n ? createDummyRelayerFeeERC20Amount(feeTokenDetails.tokenAddress)\n : undefined;\n\n let serializedTransactions =\n await generateDummyTransactionStructsWithRelayerFee(dummyRelayerFee);\n let transaction = await generateTransaction(serializedTransactions);\n\n let gasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n isCrossContractCall,\n );\nconsole.log(\"gasEstimateForUnprovenTransfer gasEstimate::\", gasEstimate)\n\n\n if (sendWithPublicWallet) {\n return gasEstimateResponse(\n gasEstimate,\n undefined, // relayerFeeCommitment\n isGasEstimateWithDummyProof,\n );\n }\n\n if (!feeTokenDetails) {\n throw new Error(\n 'Must have Relayer Fee details or sendWithPublicWallet field.',\n );\n }\n\n // Find any erc20Amount in transfer that matches token of relayer fee, if exists.\n const relayerFeeMatchingSendingERC20Amount = erc20AmountRecipients.find(\n erc20AmountRecipient =>\n erc20AmountRecipient.tokenAddress.toLowerCase() ===\n feeTokenDetails.tokenAddress.toLowerCase(),\n );\n\n // Get private balance of matching token.\n const balanceForRelayerFeeERC20 = await balanceForERC20Token(\n wallet,\n networkName,\n feeTokenDetails.tokenAddress,\n );\n\n let relayerFeeCommitment = getRelayerFeeCommitment(serializedTransactions);\n\n // Iteratively calculate new relayer fee and estimate new gas amount.\n // This change if the number of circuits changes because of the additional Relayer Fees.\n for (let i = 0; i < MAX_ITERATIONS_RELAYER_FEE_REESTIMATION; i += 1) {\n const updatedGasDetails: TransactionGasDetails = {\n ...originalGasDetails,\n gasEstimate,\n };\n const updatedRelayerFee: DopERC20Amount =\n calculateRelayerFeeERC20Amount(feeTokenDetails, updatedGasDetails);\n\n // If Relayer fee causes overflow with the token balance,\n // then use the MAX amount for Relayer Fee, which is BALANCE - SENDING AMOUNT.\n if (\n balanceForRelayerFeeERC20 > 0n &&\n relayerFeeMatchingSendingERC20Amount &&\n // eslint-disable-next-line no-await-in-loop\n (await relayerFeeWillOverflowBalance(\n balanceForRelayerFeeERC20,\n relayerFeeMatchingSendingERC20Amount,\n updatedRelayerFee,\n ))\n ) {\n updatedRelayerFee.amount =\n balanceForRelayerFeeERC20 - relayerFeeMatchingSendingERC20Amount.amount;\n }\n\n const newSerializedTransactions =\n // eslint-disable-next-line no-await-in-loop\n await generateDummyTransactionStructsWithRelayerFee(updatedRelayerFee);\n\n relayerFeeCommitment = getRelayerFeeCommitment(newSerializedTransactions);\n\n if (\n compareCircuitSizesTransactionStructs(\n newSerializedTransactions,\n serializedTransactions,\n )\n ) {\n // Same circuit sizes, no need to run further gas estimates.\n return gasEstimateResponse(\n gasEstimate,\n relayerFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n }\n\n serializedTransactions = newSerializedTransactions;\n\n // eslint-disable-next-line no-await-in-loop\n transaction = await generateTransaction(serializedTransactions);\n\n // eslint-disable-next-line no-await-in-loop\n const newGasEstimate = await getGasEstimate(\n networkName,\n transaction,\n fromWalletAddress,\n sendWithPublicWallet,\n isCrossContractCall,\n );\n\n if (newGasEstimate === gasEstimate) {\n return gasEstimateResponse(\n newGasEstimate,\n relayerFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n }\n gasEstimate = newGasEstimate;\n }\n\n return gasEstimateResponse(\n gasEstimate,\n relayerFeeCommitment,\n isGasEstimateWithDummyProof,\n );\n};\n\nconst compareCircuitSizesTransactionStructs = (\n serializedA: TransactionStruct[],\n serializedB: TransactionStruct[],\n) => {\n if (serializedA.length !== serializedB.length) {\n return false;\n }\n for (let i = 0; i < serializedA.length; i += 1) {\n if (\n serializedA[i].commitments.length !== serializedB[i].commitments.length\n ) {\n return false;\n }\n if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {\n return false;\n }\n }\n return true;\n};\n\nconst relayerFeeWillOverflowBalance = async (\n tokenBalance: bigint,\n sendingERC20Amount: DopERC20Amount,\n relayerFeeERC20Amount: DopERC20Amount,\n) => {\n const sendingAmount = sendingERC20Amount.amount;\n const relayerFeeAmount = relayerFeeERC20Amount.amount;\n\n return sendingAmount + relayerFeeAmount > tokenBalance;\n};\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { AdaptID, TransactionStruct, ProverProgressCallback } from 'dop-engine
|
|
2
|
-
import { DopERC20Amount, DopERC20AmountRecipient, NetworkName, ProofType, DopNFTAmountRecipient } from 'dop-sharedmodel
|
|
1
|
+
import { AdaptID, TransactionStruct, ProverProgressCallback } from 'dop-engine';
|
|
2
|
+
import { DopERC20Amount, DopERC20AmountRecipient, NetworkName, ProofType, DopNFTAmountRecipient } from 'dop-sharedmodel';
|
|
3
3
|
import { ContractTransaction } from 'ethers';
|
|
4
4
|
export declare const DUMMY_FROM_ADDRESS = "0x000000000000000000000000000000000000dEaD";
|
|
5
|
-
export declare const generateProofTransactions: (proofType: ProofType, networkName: NetworkName, dopWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: DopERC20AmountRecipient[], nftAmountRecipients: DopNFTAmountRecipient[], relayerFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>, sendWithPublicWallet: boolean, relayAdaptID: Optional<AdaptID>, useDummyProof: boolean, overallBatchMinGasPrice: Optional<bigint>, progressCallback: ProverProgressCallback
|
|
5
|
+
export declare const generateProofTransactions: (proofType: ProofType, networkName: NetworkName, dopWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: DopERC20AmountRecipient[], nftAmountRecipients: DopNFTAmountRecipient[], relayerFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>, sendWithPublicWallet: boolean, relayAdaptID: Optional<AdaptID>, useDummyProof: boolean, overallBatchMinGasPrice: Optional<bigint>, progressCallback: ProverProgressCallback) => Promise<TransactionStruct[]>;
|
|
6
6
|
export declare const nullifiersForTransactions: (transactions: TransactionStruct[]) => string[];
|
|
7
7
|
export declare const createDummyRelayerFeeERC20Amount: (feeTokenAddress: string) => DopERC20Amount;
|
|
8
|
-
export declare const generateDummyProofTransactions: (proofType: ProofType, networkName: NetworkName, dopWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: DopERC20AmountRecipient[], nftAmountRecipients: DopNFTAmountRecipient[], relayerFeeERC20Amount: Optional<DopERC20Amount>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint
|
|
8
|
+
export declare const generateDummyProofTransactions: (proofType: ProofType, networkName: NetworkName, dopWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: DopERC20AmountRecipient[], nftAmountRecipients: DopNFTAmountRecipient[], relayerFeeERC20Amount: Optional<DopERC20Amount>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>) => Promise<TransactionStruct[]>;
|
|
9
9
|
export declare const generateTransact: (txs: TransactionStruct[], networkName: NetworkName, useDummyProof?: boolean) => Promise<ContractTransaction>;
|
|
10
|
+
export declare const generateUnshieldBaseToken: (txs: TransactionStruct[], networkName: NetworkName, toWalletAddress: string, relayAdaptParamsRandom: string, useDummyProof?: boolean) => Promise<ContractTransaction>;
|