dop-wallet-v6 1.1.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/.eslintrc.js +73 -0
- package/.prettierrc.js +21 -0
- package/LICENSE +21 -0
- package/README.md +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/services/artifacts/artifact-downloader.d.ts +13 -0
- package/dist/services/artifacts/artifact-downloader.js +131 -0
- package/dist/services/artifacts/artifact-downloader.js.map +1 -0
- package/dist/services/artifacts/artifact-hash.d.ts +4 -0
- package/dist/services/artifacts/artifact-hash.js +54 -0
- package/dist/services/artifacts/artifact-hash.js.map +1 -0
- package/dist/services/artifacts/artifact-store.d.ts +12 -0
- package/dist/services/artifacts/artifact-store.js +12 -0
- package/dist/services/artifacts/artifact-store.js.map +1 -0
- package/dist/services/artifacts/artifact-util.d.ts +7 -0
- package/dist/services/artifacts/artifact-util.js +83 -0
- package/dist/services/artifacts/artifact-util.js.map +1 -0
- package/dist/services/artifacts/index.d.ts +2 -0
- package/dist/services/artifacts/index.js +19 -0
- package/dist/services/artifacts/index.js.map +1 -0
- package/dist/services/artifacts/json/artifact-v2-hashes.json +337 -0
- package/dist/services/dop/core/artifacts.d.ts +10 -0
- package/dist/services/dop/core/artifacts.js +69 -0
- package/dist/services/dop/core/artifacts.js.map +1 -0
- package/dist/services/dop/core/engine.d.ts +25 -0
- package/dist/services/dop/core/engine.js +103 -0
- package/dist/services/dop/core/engine.js.map +1 -0
- package/dist/services/dop/core/index.d.ts +5 -0
- package/dist/services/dop/core/index.js +22 -0
- package/dist/services/dop/core/index.js.map +1 -0
- package/dist/services/dop/core/prover.d.ts +3 -0
- package/dist/services/dop/core/prover.js +14 -0
- package/dist/services/dop/core/prover.js.map +1 -0
- package/dist/services/dop/core/providers.d.ts +18 -0
- package/dist/services/dop/core/providers.js +162 -0
- package/dist/services/dop/core/providers.js.map +1 -0
- package/dist/services/dop/core/shields.d.ts +7 -0
- package/dist/services/dop/core/shields.js +20 -0
- package/dist/services/dop/core/shields.js.map +1 -0
- package/dist/services/dop/history/transaction-history.d.ts +4 -0
- package/dist/services/dop/history/transaction-history.js +166 -0
- package/dist/services/dop/history/transaction-history.js.map +1 -0
- package/dist/services/dop/index.d.ts +4 -0
- package/dist/services/dop/index.js +21 -0
- package/dist/services/dop/index.js.map +1 -0
- package/dist/services/dop/process/extract-first-note.d.ts +6 -0
- package/dist/services/dop/process/extract-first-note.js +163 -0
- package/dist/services/dop/process/extract-first-note.js.map +1 -0
- package/dist/services/dop/process/index.d.ts +1 -0
- package/dist/services/dop/process/index.js +18 -0
- package/dist/services/dop/process/index.js.map +1 -0
- package/dist/services/dop/quick-sync/empty-events.d.ts +2 -0
- package/dist/services/dop/quick-sync/empty-events.js +9 -0
- package/dist/services/dop/quick-sync/empty-events.js.map +1 -0
- package/dist/services/dop/quick-sync/graph-type-formatters.d.ts +13 -0
- package/dist/services/dop/quick-sync/graph-type-formatters.js +168 -0
- package/dist/services/dop/quick-sync/graph-type-formatters.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-goerli/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-goerli/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-goerli/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-goerli/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-goerli/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-goerli/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-one/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-one/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-one/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-one/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-one/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/arbitrum-one/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/bsc/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/bsc/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/bsc/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/bsc/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/bsc/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/bsc/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/ethereum/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/ethereum/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/ethereum/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/ethereum/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/ethereum/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/ethereum/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/goerli/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/goerli/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/goerli/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/goerli/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/goerli/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/goerli/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/matic/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/matic/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/matic/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/matic/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/matic/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/matic/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/mumbai/introspectionSchema.d.ts +2 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/mumbai/introspectionSchema.js +24081 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/mumbai/introspectionSchema.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/mumbai/types.d.ts +1628 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/mumbai/types.js +4 -0
- package/dist/services/dop/quick-sync/graphql/.graphclient/sources/mumbai/types.js.map +1 -0
- package/dist/services/dop/quick-sync/graphql/index.d.ts +1976 -0
- package/dist/services/dop/quick-sync/graphql/index.js +512 -0
- package/dist/services/dop/quick-sync/graphql/index.js.map +1 -0
- package/dist/services/dop/quick-sync/quick-sync-graph.d.ts +2 -0
- package/dist/services/dop/quick-sync/quick-sync-graph.js +150 -0
- package/dist/services/dop/quick-sync/quick-sync-graph.js.map +1 -0
- package/dist/services/dop/util/bytes.d.ts +5 -0
- package/dist/services/dop/util/bytes.js +21 -0
- package/dist/services/dop/util/bytes.js.map +1 -0
- package/dist/services/dop/util/commitment.d.ts +2 -0
- package/dist/services/dop/util/commitment.js +17 -0
- package/dist/services/dop/util/commitment.js.map +1 -0
- package/dist/services/dop/util/crypto.d.ts +14 -0
- package/dist/services/dop/util/crypto.js +79 -0
- package/dist/services/dop/util/crypto.js.map +1 -0
- package/dist/services/dop/util/db.d.ts +2 -0
- package/dist/services/dop/util/db.js +6 -0
- package/dist/services/dop/util/db.js.map +1 -0
- package/dist/services/dop/util/index.d.ts +4 -0
- package/dist/services/dop/util/index.js +21 -0
- package/dist/services/dop/util/index.js.map +1 -0
- package/dist/services/dop/wallets/balance-update.d.ts +8 -0
- package/dist/services/dop/wallets/balance-update.js +90 -0
- package/dist/services/dop/wallets/balance-update.js.map +1 -0
- package/dist/services/dop/wallets/balances.d.ts +6 -0
- package/dist/services/dop/wallets/balances.js +57 -0
- package/dist/services/dop/wallets/balances.js.map +1 -0
- package/dist/services/dop/wallets/index.d.ts +4 -0
- package/dist/services/dop/wallets/index.js +21 -0
- package/dist/services/dop/wallets/index.js.map +1 -0
- package/dist/services/dop/wallets/wallets.d.ts +19 -0
- package/dist/services/dop/wallets/wallets.js +226 -0
- package/dist/services/dop/wallets/wallets.js.map +1 -0
- package/dist/services/ethers/ethers-util.d.ts +1 -0
- package/dist/services/ethers/ethers-util.js +9 -0
- package/dist/services/ethers/ethers-util.js.map +1 -0
- package/dist/services/ethers/index.d.ts +1 -0
- package/dist/services/ethers/index.js +18 -0
- package/dist/services/ethers/index.js.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.js +21 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/transactions/index.d.ts +13 -0
- package/dist/services/transactions/index.js +30 -0
- package/dist/services/transactions/index.js.map +1 -0
- package/dist/services/transactions/proof-cache.d.ts +27 -0
- package/dist/services/transactions/proof-cache.js +128 -0
- package/dist/services/transactions/proof-cache.js.map +1 -0
- package/dist/services/transactions/tx-cross-contract-calls.d.ts +9 -0
- package/dist/services/transactions/tx-cross-contract-calls.js +386 -0
- package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -0
- package/dist/services/transactions/tx-gas-details.d.ts +5 -0
- package/dist/services/transactions/tx-gas-details.js +120 -0
- package/dist/services/transactions/tx-gas-details.js.map +1 -0
- package/dist/services/transactions/tx-gas-relayer-fee-estimator.d.ts +2 -0
- package/dist/services/transactions/tx-gas-relayer-fee-estimator.js +209 -0
- package/dist/services/transactions/tx-gas-relayer-fee-estimator.js.map +1 -0
- package/dist/services/transactions/tx-generator.d.ts +9 -0
- package/dist/services/transactions/tx-generator.js +205 -0
- package/dist/services/transactions/tx-generator.js.map +1 -0
- package/dist/services/transactions/tx-notes.d.ts +10 -0
- package/dist/services/transactions/tx-notes.js +154 -0
- package/dist/services/transactions/tx-notes.js.map +1 -0
- package/dist/services/transactions/tx-nullifiers.d.ts +2 -0
- package/dist/services/transactions/tx-nullifiers.js +17 -0
- package/dist/services/transactions/tx-nullifiers.js.map +1 -0
- package/dist/services/transactions/tx-proof-transfer.d.ts +4 -0
- package/dist/services/transactions/tx-proof-transfer.js +49 -0
- package/dist/services/transactions/tx-proof-transfer.js.map +1 -0
- package/dist/services/transactions/tx-proof-unshield.d.ts +3 -0
- package/dist/services/transactions/tx-proof-unshield.js +183 -0
- package/dist/services/transactions/tx-proof-unshield.js.map +1 -0
- package/dist/services/transactions/tx-shield-base-token.d.ts +3 -0
- package/dist/services/transactions/tx-shield-base-token.js +61 -0
- package/dist/services/transactions/tx-shield-base-token.js.map +1 -0
- package/dist/services/transactions/tx-shield.d.ts +6 -0
- package/dist/services/transactions/tx-shield.js +84 -0
- package/dist/services/transactions/tx-shield.js.map +1 -0
- package/dist/services/transactions/tx-transfer.d.ts +2 -0
- package/dist/services/transactions/tx-transfer.js +78 -0
- package/dist/services/transactions/tx-transfer.js.map +1 -0
- package/dist/services/transactions/tx-unshield.d.ts +3 -0
- package/dist/services/transactions/tx-unshield.js +174 -0
- package/dist/services/transactions/tx-unshield.js.map +1 -0
- package/dist/utils/blocked-address.d.ts +2 -0
- package/dist/utils/blocked-address.js +21 -0
- package/dist/utils/blocked-address.js.map +1 -0
- package/dist/utils/error.d.ts +1 -0
- package/dist/utils/error.js +20 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/gas-price.d.ts +6 -0
- package/dist/utils/gas-price.js +31 -0
- package/dist/utils/gas-price.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/utils.d.ts +3 -0
- package/dist/utils/utils.js +47 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +85 -0
- package/postinstall.js +52 -0
- package/react-native-shims.js +42 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateRelayerFeeERC20Amount = void 0;
|
|
4
|
+
const dop_sharedmodel_v5_1 = require("dop-sharedmodel-v5");
|
|
5
|
+
const MAX_ITERATIONS_RELAYER_FEE_REESTIMATION = 5;
|
|
6
|
+
const calculateRelayerFeeERC20Amount = (feeTokenDetails, gasDetails) => {
|
|
7
|
+
const tokenFeePerUnitGas = BigInt(feeTokenDetails.feePerUnitGas);
|
|
8
|
+
const oneUnitGas = 10n ** 18n;
|
|
9
|
+
const maximumGas = (0, dop_sharedmodel_v5_1.calculateMaximumGas)(gasDetails);
|
|
10
|
+
const tokenFee = (tokenFeePerUnitGas * maximumGas) / oneUnitGas;
|
|
11
|
+
return {
|
|
12
|
+
tokenAddress: feeTokenDetails.tokenAddress,
|
|
13
|
+
amount: tokenFee,
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
exports.calculateRelayerFeeERC20Amount = calculateRelayerFeeERC20Amount;
|
|
17
|
+
/*
|
|
18
|
+
const getRelayerFeeCommitment = (
|
|
19
|
+
transactionStructs: TransactionStruct[],
|
|
20
|
+
): CommitmentSummary => {
|
|
21
|
+
const transactionIndex = 0;
|
|
22
|
+
const relayerFeeCommitment = transactionStructs[transactionIndex];
|
|
23
|
+
const relayerFeeCommitmentIndex = 0;
|
|
24
|
+
return convertTransactionStructToCommitmentSummary(
|
|
25
|
+
relayerFeeCommitment,
|
|
26
|
+
relayerFeeCommitmentIndex,
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const gasEstimateResponseDummyProofIterativeRelayerFee = async (
|
|
31
|
+
generateDummyTransactionStructsWithRelayerFee: (
|
|
32
|
+
relayerFeeERC20Amount: Optional<DopERC20Amount>,
|
|
33
|
+
) => Promise<TransactionStruct[]>,
|
|
34
|
+
generateTransaction: (
|
|
35
|
+
serializedTransactions: TransactionStruct[],
|
|
36
|
+
) => Promise<ContractTransaction>,
|
|
37
|
+
networkName: NetworkName,
|
|
38
|
+
dopWalletID: string,
|
|
39
|
+
erc20AmountRecipients: DopERC20AmountRecipient[],
|
|
40
|
+
originalGasDetails: TransactionGasDetails,
|
|
41
|
+
feeTokenDetails: Optional<FeeTokenDetails>,
|
|
42
|
+
sendWithPublicWallet: boolean,
|
|
43
|
+
isCrossContractCall: boolean,
|
|
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;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const newSerializedTransactions =
|
|
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
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
serializedTransactions = newSerializedTransactions;
|
|
147
|
+
|
|
148
|
+
// eslint-disable-next-line no-await-in-loop
|
|
149
|
+
transaction = await generateTransaction(serializedTransactions);
|
|
150
|
+
|
|
151
|
+
// eslint-disable-next-line no-await-in-loop
|
|
152
|
+
const newGasEstimate = await getGasEstimate(
|
|
153
|
+
networkName,
|
|
154
|
+
transaction,
|
|
155
|
+
fromWalletAddress,
|
|
156
|
+
sendWithPublicWallet,
|
|
157
|
+
isCrossContractCall,
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
if (newGasEstimate === gasEstimate) {
|
|
161
|
+
return gasEstimateResponse(
|
|
162
|
+
newGasEstimate,
|
|
163
|
+
relayerFeeCommitment,
|
|
164
|
+
isGasEstimateWithDummyProof,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
gasEstimate = newGasEstimate;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return gasEstimateResponse(
|
|
171
|
+
gasEstimate,
|
|
172
|
+
relayerFeeCommitment,
|
|
173
|
+
isGasEstimateWithDummyProof,
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const compareCircuitSizesTransactionStructs = (
|
|
178
|
+
serializedA: TransactionStruct[],
|
|
179
|
+
serializedB: TransactionStruct[],
|
|
180
|
+
) => {
|
|
181
|
+
if (serializedA.length !== serializedB.length) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
for (let i = 0; i < serializedA.length; i += 1) {
|
|
185
|
+
// if (
|
|
186
|
+
// serializedA[i].commitments.length !== serializedB[i].commitments.length
|
|
187
|
+
// ) {
|
|
188
|
+
// return false;
|
|
189
|
+
// }
|
|
190
|
+
if (serializedA[i].nullifiers.length !== serializedB[i].nullifiers.length) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return true;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const relayerFeeWillOverflowBalance = async (
|
|
198
|
+
tokenBalance: bigint,
|
|
199
|
+
sendingERC20Amount: DopERC20Amount,
|
|
200
|
+
relayerFeeERC20Amount: DopERC20Amount,
|
|
201
|
+
) => {
|
|
202
|
+
const sendingAmount = sendingERC20Amount.amount;
|
|
203
|
+
const relayerFeeAmount = relayerFeeERC20Amount.amount;
|
|
204
|
+
|
|
205
|
+
return sendingAmount + relayerFeeAmount > tokenBalance;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
*/
|
|
209
|
+
//# sourceMappingURL=tx-gas-relayer-fee-estimator.js.map
|
|
@@ -0,0 +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*/"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AdaptID, TransactionStruct, ProverProgressCallback } from 'dop-engine-v5';
|
|
2
|
+
import { DopERC20Amount, DopERC20AmountRecipient, NetworkName, ProofType, DopNFTAmountRecipient } from 'dop-sharedmodel-v5';
|
|
3
|
+
import { ContractTransaction } from 'ethers';
|
|
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, valueCheck: bigint) => Promise<TransactionStruct[]>;
|
|
6
|
+
export declare const nullifiersForTransactions: (transactions: TransactionStruct[]) => string[];
|
|
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>, valueCheck: bigint) => Promise<TransactionStruct[]>;
|
|
9
|
+
export declare const generateTransact: (txs: TransactionStruct[], networkName: NetworkName, useDummyProof?: boolean) => Promise<ContractTransaction>;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateTransact = exports.generateDummyProofTransactions = exports.createDummyRelayerFeeERC20Amount = exports.nullifiersForTransactions = exports.generateProofTransactions = exports.DUMMY_FROM_ADDRESS = void 0;
|
|
4
|
+
const dop_engine_v5_1 = require("dop-engine-v5");
|
|
5
|
+
const dop_sharedmodel_v5_1 = require("dop-sharedmodel-v5");
|
|
6
|
+
const engine_1 = require("../dop/core/engine");
|
|
7
|
+
const providers_1 = require("../dop/core/providers");
|
|
8
|
+
const tx_notes_1 = require("./tx-notes");
|
|
9
|
+
const prover_1 = require("../dop/core/prover");
|
|
10
|
+
const dop_1 = require("../dop");
|
|
11
|
+
const blocked_address_1 = require("../../utils/blocked-address");
|
|
12
|
+
const gas_price_1 = require("../../utils/gas-price");
|
|
13
|
+
const DUMMY_AMOUNT = 0n;
|
|
14
|
+
exports.DUMMY_FROM_ADDRESS = '0x000000000000000000000000000000000000dEaD';
|
|
15
|
+
const generateProofTransactions = async (proofType, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, relayerFeeERC20AmountRecipient, sendWithPublicWallet, relayAdaptID, useDummyProof, overallBatchMinGasPrice, progressCallback, valueCheck) => {
|
|
16
|
+
const dopWallet = (0, engine_1.fullWalletForID)(dopWalletID);
|
|
17
|
+
console.log("txs transactionsFromERC20Amounts111", proofType, erc20AmountRecipients, nftAmountRecipients, dopWallet, encryptionKey, showSenderAddressToRecipient, memoText, networkName, relayerFeeERC20AmountRecipient, sendWithPublicWallet, relayAdaptID, useDummyProof, overallBatchMinGasPrice, progressCallback, valueCheck);
|
|
18
|
+
const txs = await transactionsFromERC20Amounts(proofType, erc20AmountRecipients, nftAmountRecipients, dopWallet, encryptionKey, showSenderAddressToRecipient, memoText, networkName, relayerFeeERC20AmountRecipient, sendWithPublicWallet, relayAdaptID, useDummyProof, overallBatchMinGasPrice, progressCallback, valueCheck);
|
|
19
|
+
console.log("txs transactionsFromERC20Amounts", txs);
|
|
20
|
+
return txs;
|
|
21
|
+
};
|
|
22
|
+
exports.generateProofTransactions = generateProofTransactions;
|
|
23
|
+
const nullifiersForTransactions = (transactions) => {
|
|
24
|
+
return transactions
|
|
25
|
+
.map(transaction => transaction.nullifiers)
|
|
26
|
+
.flat();
|
|
27
|
+
// return transactions
|
|
28
|
+
// .map(transaction => transaction.commitments)
|
|
29
|
+
// .flat() as string[];
|
|
30
|
+
};
|
|
31
|
+
exports.nullifiersForTransactions = nullifiersForTransactions;
|
|
32
|
+
const createDummyRelayerFeeERC20Amount = (feeTokenAddress) => {
|
|
33
|
+
const relayerFeeERC20Amount = {
|
|
34
|
+
tokenAddress: feeTokenAddress,
|
|
35
|
+
amount: DUMMY_AMOUNT,
|
|
36
|
+
};
|
|
37
|
+
return relayerFeeERC20Amount;
|
|
38
|
+
};
|
|
39
|
+
exports.createDummyRelayerFeeERC20Amount = createDummyRelayerFeeERC20Amount;
|
|
40
|
+
const generateDummyProofTransactions = async (proofType, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, relayerFeeERC20Amount, sendWithPublicWallet, overallBatchMinGasPrice, valueCheck) => {
|
|
41
|
+
if (!relayerFeeERC20Amount && !sendWithPublicWallet) {
|
|
42
|
+
throw new Error('Must send with relayer or public wallet.');
|
|
43
|
+
}
|
|
44
|
+
const dopWallet = (0, engine_1.walletForID)(dopWalletID);
|
|
45
|
+
// Use self-wallet as dummy relayer address.
|
|
46
|
+
const relayerDopAddress = dopWallet.getAddress(undefined);
|
|
47
|
+
const relayerFeeERC20AmountRecipient = relayerFeeERC20Amount
|
|
48
|
+
? {
|
|
49
|
+
...relayerFeeERC20Amount,
|
|
50
|
+
recipientAddress: relayerDopAddress,
|
|
51
|
+
}
|
|
52
|
+
: undefined;
|
|
53
|
+
return (0, exports.generateProofTransactions)(proofType, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, relayerFeeERC20AmountRecipient, sendWithPublicWallet, undefined, // relayAdaptID
|
|
54
|
+
true, // useDummyProof
|
|
55
|
+
overallBatchMinGasPrice, () => { }, // progressCallback (not necessary for dummy txs)
|
|
56
|
+
valueCheck);
|
|
57
|
+
};
|
|
58
|
+
exports.generateDummyProofTransactions = generateDummyProofTransactions;
|
|
59
|
+
const generateTransact = async (txs, networkName, useDummyProof = false) => {
|
|
60
|
+
const dopSmartWalletContract = (0, providers_1.getDopSmartWalletContractForNetwork)(networkName);
|
|
61
|
+
const transaction = await dopSmartWalletContract.transact(txs);
|
|
62
|
+
if (useDummyProof) {
|
|
63
|
+
return {
|
|
64
|
+
...transaction,
|
|
65
|
+
from: exports.DUMMY_FROM_ADDRESS,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return transaction;
|
|
69
|
+
};
|
|
70
|
+
exports.generateTransact = generateTransact;
|
|
71
|
+
/*export const generateUnshieldBaseToken = async (
|
|
72
|
+
txs: TransactionStruct[],
|
|
73
|
+
networkName: NetworkName,
|
|
74
|
+
toWalletAddress: string,
|
|
75
|
+
relayAdaptParamsRandom: string,
|
|
76
|
+
useDummyProof = false,
|
|
77
|
+
): Promise<ContractTransaction> => {
|
|
78
|
+
assertValidEthAddress(toWalletAddress);
|
|
79
|
+
assertNotBlockedAddress(toWalletAddress);
|
|
80
|
+
|
|
81
|
+
const relayAdaptContract = getRelayAdaptContractForNetwork(networkName);
|
|
82
|
+
|
|
83
|
+
const transaction = await relayAdaptContract.populateUnshieldBaseToken(
|
|
84
|
+
txs,
|
|
85
|
+
toWalletAddress,
|
|
86
|
+
relayAdaptParamsRandom,
|
|
87
|
+
);
|
|
88
|
+
if (useDummyProof) {
|
|
89
|
+
return {
|
|
90
|
+
...transaction,
|
|
91
|
+
from: DUMMY_FROM_ADDRESS,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return transaction;
|
|
95
|
+
};*/
|
|
96
|
+
const transactionsFromERC20Amounts = async (proofType, erc20AmountRecipients, nftAmountRecipients, dopWallet, encryptionKey, showSenderAddressToRecipient, memoText, networkName, relayerFeeERC20AmountRecipient, sendWithPublicWallet, relayAdaptID, useDummyProof, overallBatchMinGasPrice, progressCallback, valueCheck) => {
|
|
97
|
+
const network = dop_sharedmodel_v5_1.NETWORK_CONFIG[networkName];
|
|
98
|
+
const { chain } = network;
|
|
99
|
+
console.log("generateProofTransactions chain000", chain);
|
|
100
|
+
// Removes overallBatchMinGasPrice for L2 networks.
|
|
101
|
+
const validatedOverallBatchMinGasPrice = (0, gas_price_1.shouldSetOverallBatchMinGasPriceForNetwork)(networkName)
|
|
102
|
+
? BigInt(overallBatchMinGasPrice ?? 0)
|
|
103
|
+
: BigInt(0);
|
|
104
|
+
console.log("generateProofTransactions transactionBatch000", validatedOverallBatchMinGasPrice);
|
|
105
|
+
const transactionBatch = new dop_engine_v5_1.TransactionBatch(chain, validatedOverallBatchMinGasPrice);
|
|
106
|
+
// const transactionBatchNew = new TransactionBatch(
|
|
107
|
+
// chain,
|
|
108
|
+
// validatedOverallBatchMinGasPrice,
|
|
109
|
+
// );
|
|
110
|
+
console.log("generateProofTransactions transactionBatch000", transactionBatch);
|
|
111
|
+
if (relayAdaptID) {
|
|
112
|
+
transactionBatch.setAdaptID(relayAdaptID);
|
|
113
|
+
}
|
|
114
|
+
if (relayerFeeERC20AmountRecipient && !sendWithPublicWallet) {
|
|
115
|
+
(0, dop_1.assertValidDopAddress)(relayerFeeERC20AmountRecipient.recipientAddress);
|
|
116
|
+
// Add Relayer Fee - must be first transaction in the batch, and first output for the transaction.
|
|
117
|
+
transactionBatch.addOutput((0, tx_notes_1.erc20NoteFromERC20AmountRecipient)(relayerFeeERC20AmountRecipient, dopWallet, dop_engine_v5_1.OutputType.RelayerFee, false, // showSenderAddressToRecipient - never show sender for Relayer fees
|
|
118
|
+
undefined));
|
|
119
|
+
}
|
|
120
|
+
console.log("generateProofTransactions erc20AmountRecipient11", erc20AmountRecipients);
|
|
121
|
+
erc20AmountRecipients.forEach((erc20AmountRecipient) => {
|
|
122
|
+
addTransactionOutputsERC20(proofType, transactionBatch, erc20AmountRecipient, dopWallet, showSenderAddressToRecipient, memoText);
|
|
123
|
+
});
|
|
124
|
+
nftAmountRecipients.forEach((nftAmountRecipient) => {
|
|
125
|
+
addTransactionOutputsNFT(proofType, transactionBatch, nftAmountRecipient, dopWallet, showSenderAddressToRecipient, memoText);
|
|
126
|
+
});
|
|
127
|
+
console.log("generateProofTransactions generateAllProofs bef", transactionBatch);
|
|
128
|
+
const txBatches = await generateAllProofs(transactionBatch, dopWallet, encryptionKey, useDummyProof, progressCallback, valueCheck);
|
|
129
|
+
console.log("txBatches generateAllProofs", txBatches);
|
|
130
|
+
return txBatches;
|
|
131
|
+
};
|
|
132
|
+
const addTransactionOutputsERC20 = (proofType, transactionBatch, erc20AmountRecipient, dopWallet, showSenderAddressToRecipient, memoText) => {
|
|
133
|
+
switch (proofType) {
|
|
134
|
+
case dop_sharedmodel_v5_1.ProofType.Transfer: {
|
|
135
|
+
addTransactionOutputsTransferERC20(transactionBatch, erc20AmountRecipient, dopWallet, showSenderAddressToRecipient, memoText);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case dop_sharedmodel_v5_1.ProofType.CrossContractCalls:
|
|
139
|
+
case dop_sharedmodel_v5_1.ProofType.UnshieldBaseToken:
|
|
140
|
+
case dop_sharedmodel_v5_1.ProofType.Unshield: {
|
|
141
|
+
addTransactionOutputsUnshieldERC20(transactionBatch, erc20AmountRecipient, false);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const addTransactionOutputsNFT = (proofType, transactionBatch, nftAmountRecipient, dopWallet, showSenderAddressToRecipient, memoText) => {
|
|
147
|
+
switch (proofType) {
|
|
148
|
+
case dop_sharedmodel_v5_1.ProofType.Transfer: {
|
|
149
|
+
addTransactionOutputsTransferNFT(transactionBatch, nftAmountRecipient, dopWallet, showSenderAddressToRecipient, memoText);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case dop_sharedmodel_v5_1.ProofType.CrossContractCalls:
|
|
153
|
+
case dop_sharedmodel_v5_1.ProofType.UnshieldBaseToken:
|
|
154
|
+
case dop_sharedmodel_v5_1.ProofType.Unshield: {
|
|
155
|
+
addTransactionOutputsUnshieldNFT(transactionBatch, nftAmountRecipient, false);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
const addTransactionOutputsTransferERC20 = (transactionBatch, erc20AmountRecipient, dopWallet, showSenderAddressToRecipient, memoText) => {
|
|
161
|
+
(0, dop_1.assertValidDopAddress)(erc20AmountRecipient.recipientAddress);
|
|
162
|
+
transactionBatch.addOutput((0, tx_notes_1.erc20NoteFromERC20AmountRecipient)(erc20AmountRecipient, dopWallet, dop_engine_v5_1.OutputType.Transfer, showSenderAddressToRecipient, memoText));
|
|
163
|
+
};
|
|
164
|
+
const addTransactionOutputsUnshieldERC20 = (transactionBatch, erc20AmountRecipient, allowOverride) => {
|
|
165
|
+
const { recipientAddress, amount } = erc20AmountRecipient;
|
|
166
|
+
(0, dop_1.assertValidEthAddress)(recipientAddress);
|
|
167
|
+
(0, blocked_address_1.assertNotBlockedAddress)(recipientAddress);
|
|
168
|
+
const tokenData = (0, dop_engine_v5_1.getTokenDataERC20)(erc20AmountRecipient.tokenAddress);
|
|
169
|
+
transactionBatch.addUnshieldData({
|
|
170
|
+
toAddress: recipientAddress,
|
|
171
|
+
value: amount,
|
|
172
|
+
tokenData,
|
|
173
|
+
allowOverride,
|
|
174
|
+
});
|
|
175
|
+
};
|
|
176
|
+
const addTransactionOutputsTransferNFT = (transactionBatch, nftAmountRecipient, dopWallet, showSenderAddressToRecipient, memoText) => {
|
|
177
|
+
(0, dop_1.assertValidDopAddress)(nftAmountRecipient.recipientAddress);
|
|
178
|
+
transactionBatch.addOutput((0, tx_notes_1.nftNoteFromNFTAmountRecipient)(nftAmountRecipient, dopWallet, showSenderAddressToRecipient, memoText));
|
|
179
|
+
};
|
|
180
|
+
const addTransactionOutputsUnshieldNFT = (transactionBatch, nftAmountRecipient, allowOverride) => {
|
|
181
|
+
const { recipientAddress, nftAddress, tokenSubID, nftTokenType, amount } = nftAmountRecipient;
|
|
182
|
+
(0, dop_1.assertValidEthAddress)(recipientAddress);
|
|
183
|
+
(0, blocked_address_1.assertNotBlockedAddress)(recipientAddress);
|
|
184
|
+
const tokenData = (0, dop_engine_v5_1.getTokenDataNFT)(nftAddress, nftTokenType, tokenSubID);
|
|
185
|
+
const value = nftTokenType === dop_sharedmodel_v5_1.NFTTokenType.ERC721 ? dop_engine_v5_1.ERC721_NOTE_VALUE : amount;
|
|
186
|
+
transactionBatch.addUnshieldData({
|
|
187
|
+
toAddress: recipientAddress,
|
|
188
|
+
value,
|
|
189
|
+
tokenData,
|
|
190
|
+
allowOverride,
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
const generateAllProofs = (transactionBatch, dopWallet, encryptionKey, useDummyProof, progressCallback, valueCheck) => {
|
|
194
|
+
const prover = (0, prover_1.getProver)();
|
|
195
|
+
// return useDummyProof
|
|
196
|
+
// ? transactionBatch.generateDummyTransactions(
|
|
197
|
+
// prover,
|
|
198
|
+
// dopWallet,
|
|
199
|
+
// encryptionKey,
|
|
200
|
+
// )
|
|
201
|
+
// :
|
|
202
|
+
console.log("generateProofTransactions generateAllProofs in 0", transactionBatch);
|
|
203
|
+
return transactionBatch.generateTransactions(prover, dopWallet, encryptionKey, progressCallback, valueCheck);
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=tx-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx-generator.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DopWallet,\n TransactionBatch,\n AdaptID,\n OutputType,\n TransactionStruct,\n ProverProgressCallback,\n getTokenDataERC20,\n getTokenDataNFT,\n ERC721_NOTE_VALUE,\n NFTTokenData,\n} from 'dop-engine-v5';\nimport {\n DopERC20Amount,\n DopERC20AmountRecipient,\n NetworkName,\n NETWORK_CONFIG,\n ProofType,\n DopNFTAmountRecipient,\n NFTTokenType,\n} from 'dop-sharedmodel-v5';\nimport { fullWalletForID, walletForID } from '../dop/core/engine';\nimport {\n getDopSmartWalletContractForNetwork,\n getRelayAdaptContractForNetwork,\n} from '../dop/core/providers';\nimport {\n erc20NoteFromERC20AmountRecipient,\n nftNoteFromNFTAmountRecipient,\n} from './tx-notes';\nimport { getProver } from '../dop/core/prover';\nimport { assertValidEthAddress, assertValidDopAddress } from '../dop';\nimport { assertNotBlockedAddress } from '../../utils/blocked-address';\nimport { shouldSetOverallBatchMinGasPriceForNetwork } from '../../utils/gas-price';\nimport { ContractTransaction } from 'ethers';\n\nconst DUMMY_AMOUNT = 0n;\nexport const DUMMY_FROM_ADDRESS = '0x000000000000000000000000000000000000dEaD';\n\nexport const generateProofTransactions = async (\n proofType: ProofType,\n networkName: NetworkName,\n dopWalletID: string,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n relayerFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n relayAdaptID: Optional<AdaptID>,\n useDummyProof: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: ProverProgressCallback,\n valueCheck: bigint,\n): Promise<TransactionStruct[]> => {\n const dopWallet = fullWalletForID(dopWalletID);\n\n console.log(\"txs transactionsFromERC20Amounts111\", proofType,\n erc20AmountRecipients,\n nftAmountRecipients,\n dopWallet,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n networkName,\n relayerFeeERC20AmountRecipient,\n sendWithPublicWallet,\n relayAdaptID,\n useDummyProof,\n overallBatchMinGasPrice,\n progressCallback,\n valueCheck\n );\n\n const txs: TransactionStruct[] = await transactionsFromERC20Amounts(\n proofType,\n erc20AmountRecipients,\n nftAmountRecipients,\n dopWallet,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n networkName,\n relayerFeeERC20AmountRecipient,\n sendWithPublicWallet,\n relayAdaptID,\n useDummyProof,\n overallBatchMinGasPrice,\n progressCallback,\n valueCheck,\n );\n console.log(\"txs transactionsFromERC20Amounts\", txs);\n return txs;\n};\n\nexport const nullifiersForTransactions = (\n transactions: TransactionStruct[],\n): string[] => {\n return transactions\n .map(transaction => transaction.nullifiers)\n .flat() as string[];\n // return transactions\n // .map(transaction => transaction.commitments)\n // .flat() as string[];\n};\n\nexport const createDummyRelayerFeeERC20Amount = (feeTokenAddress: string) => {\n const relayerFeeERC20Amount: DopERC20Amount = {\n tokenAddress: feeTokenAddress,\n amount: DUMMY_AMOUNT,\n };\n return relayerFeeERC20Amount;\n};\n\nexport const generateDummyProofTransactions = async (\n proofType: ProofType,\n networkName: NetworkName,\n dopWalletID: string,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n relayerFeeERC20Amount: Optional<DopERC20Amount>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n valueCheck: bigint,\n): Promise<TransactionStruct[]> => {\n if (!relayerFeeERC20Amount && !sendWithPublicWallet) {\n throw new Error('Must send with relayer or public wallet.');\n }\n\n const dopWallet = walletForID(dopWalletID);\n\n // Use self-wallet as dummy relayer address.\n const relayerDopAddress = dopWallet.getAddress(undefined);\n\n const relayerFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient> =\n relayerFeeERC20Amount\n ? {\n ...relayerFeeERC20Amount,\n recipientAddress: relayerDopAddress,\n }\n : undefined;\n\n return generateProofTransactions(\n proofType,\n networkName,\n dopWalletID,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayerFeeERC20AmountRecipient,\n sendWithPublicWallet,\n undefined, // relayAdaptID\n true, // useDummyProof\n overallBatchMinGasPrice,\n () => {}, // progressCallback (not necessary for dummy txs)\n valueCheck,\n );\n};\n\nexport const generateTransact = async (\n txs: TransactionStruct[],\n networkName: NetworkName,\n useDummyProof = false,\n): Promise<ContractTransaction> => {\n const dopSmartWalletContract =\n getDopSmartWalletContractForNetwork(networkName);\n\n const transaction = await dopSmartWalletContract.transact(txs);\n if (useDummyProof) {\n return {\n ...transaction,\n from: DUMMY_FROM_ADDRESS,\n };\n }\n return transaction;\n};\n\n/*export const generateUnshieldBaseToken = async (\n txs: TransactionStruct[],\n networkName: NetworkName,\n toWalletAddress: string,\n relayAdaptParamsRandom: string,\n useDummyProof = false,\n): Promise<ContractTransaction> => {\n assertValidEthAddress(toWalletAddress);\n assertNotBlockedAddress(toWalletAddress);\n\n const relayAdaptContract = getRelayAdaptContractForNetwork(networkName);\n\n const transaction = await relayAdaptContract.populateUnshieldBaseToken(\n txs,\n toWalletAddress,\n relayAdaptParamsRandom,\n );\n if (useDummyProof) {\n return {\n ...transaction,\n from: DUMMY_FROM_ADDRESS,\n };\n }\n return transaction;\n};*/\n\nconst transactionsFromERC20Amounts = async (\n proofType: ProofType,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n dopWallet: DopWallet,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n networkName: NetworkName,\n relayerFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n relayAdaptID: Optional<AdaptID>,\n useDummyProof: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: ProverProgressCallback,\n valueCheck: bigint,\n): Promise<TransactionStruct[]> => {\n const network = NETWORK_CONFIG[networkName];\n const { chain } = network;\n console.log(\"generateProofTransactions chain000\", chain);\n\n // Removes overallBatchMinGasPrice for L2 networks.\n const validatedOverallBatchMinGasPrice =\n shouldSetOverallBatchMinGasPriceForNetwork(networkName)\n ? BigInt(overallBatchMinGasPrice ?? 0)\n : BigInt(0);\n\n console.log(\"generateProofTransactions transactionBatch000\", validatedOverallBatchMinGasPrice);\n\n const transactionBatch = new TransactionBatch(\n chain,\n validatedOverallBatchMinGasPrice,\n );\n // const transactionBatchNew = new TransactionBatch(\n // chain,\n // validatedOverallBatchMinGasPrice,\n // );\n console.log(\"generateProofTransactions transactionBatch000\", transactionBatch);\n\n if (relayAdaptID) {\n transactionBatch.setAdaptID(relayAdaptID);\n }\n\n if (relayerFeeERC20AmountRecipient && !sendWithPublicWallet) {\n assertValidDopAddress(relayerFeeERC20AmountRecipient.recipientAddress);\n\n // Add Relayer Fee - must be first transaction in the batch, and first output for the transaction.\n transactionBatch.addOutput(\n erc20NoteFromERC20AmountRecipient(\n relayerFeeERC20AmountRecipient,\n dopWallet,\n OutputType.RelayerFee,\n false, // showSenderAddressToRecipient - never show sender for Relayer fees\n undefined, // memoText\n ),\n );\n }\n console.log(\"generateProofTransactions erc20AmountRecipient11\", erc20AmountRecipients);\n\n erc20AmountRecipients.forEach(\n (erc20AmountRecipient: DopERC20AmountRecipient) => {\n addTransactionOutputsERC20(\n proofType,\n transactionBatch,\n erc20AmountRecipient,\n dopWallet,\n showSenderAddressToRecipient,\n memoText,\n );\n },\n );\n\n nftAmountRecipients.forEach((nftAmountRecipient: DopNFTAmountRecipient) => {\n addTransactionOutputsNFT(\n proofType,\n transactionBatch,\n nftAmountRecipient,\n dopWallet,\n showSenderAddressToRecipient,\n memoText,\n );\n });\n console.log(\"generateProofTransactions generateAllProofs bef\", transactionBatch);\n \n const txBatches = await generateAllProofs(\n transactionBatch,\n dopWallet,\n encryptionKey,\n useDummyProof,\n progressCallback,\n valueCheck,\n );\n\n console.log(\"txBatches generateAllProofs\", txBatches)\n return txBatches;\n};\n\nconst addTransactionOutputsERC20 = (\n proofType: ProofType,\n transactionBatch: TransactionBatch,\n erc20AmountRecipient: DopERC20AmountRecipient,\n dopWallet: DopWallet,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n) => {\n switch (proofType) {\n case ProofType.Transfer: {\n addTransactionOutputsTransferERC20(\n transactionBatch,\n erc20AmountRecipient,\n dopWallet,\n showSenderAddressToRecipient,\n memoText,\n );\n break;\n }\n case ProofType.CrossContractCalls:\n case ProofType.UnshieldBaseToken:\n case ProofType.Unshield: {\n addTransactionOutputsUnshieldERC20(\n transactionBatch,\n erc20AmountRecipient,\n false, // allowOverride\n );\n break;\n }\n }\n};\n\nconst addTransactionOutputsNFT = (\n proofType: ProofType,\n transactionBatch: TransactionBatch,\n nftAmountRecipient: DopNFTAmountRecipient,\n dopWallet: DopWallet,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n) => {\n switch (proofType) {\n case ProofType.Transfer: {\n addTransactionOutputsTransferNFT(\n transactionBatch,\n nftAmountRecipient,\n dopWallet,\n showSenderAddressToRecipient,\n memoText,\n );\n break;\n }\n case ProofType.CrossContractCalls:\n case ProofType.UnshieldBaseToken:\n case ProofType.Unshield: {\n addTransactionOutputsUnshieldNFT(\n transactionBatch,\n nftAmountRecipient,\n false, // allowOverride\n );\n break;\n }\n }\n};\n\nconst addTransactionOutputsTransferERC20 = (\n transactionBatch: TransactionBatch,\n erc20AmountRecipient: DopERC20AmountRecipient,\n dopWallet: DopWallet,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n) => {\n assertValidDopAddress(erc20AmountRecipient.recipientAddress);\n\n transactionBatch.addOutput(\n erc20NoteFromERC20AmountRecipient(\n erc20AmountRecipient,\n dopWallet,\n OutputType.Transfer,\n showSenderAddressToRecipient,\n memoText,\n ),\n );\n};\n\nconst addTransactionOutputsUnshieldERC20 = (\n transactionBatch: TransactionBatch,\n erc20AmountRecipient: DopERC20AmountRecipient,\n allowOverride?: boolean,\n) => {\n const { recipientAddress, amount } = erc20AmountRecipient;\n\n assertValidEthAddress(recipientAddress);\n assertNotBlockedAddress(recipientAddress);\n\n const tokenData = getTokenDataERC20(erc20AmountRecipient.tokenAddress);\n\n transactionBatch.addUnshieldData({\n toAddress: recipientAddress,\n value: amount,\n tokenData,\n allowOverride,\n });\n};\n\nconst addTransactionOutputsTransferNFT = (\n transactionBatch: TransactionBatch,\n nftAmountRecipient: DopNFTAmountRecipient,\n dopWallet: DopWallet,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n) => {\n assertValidDopAddress(nftAmountRecipient.recipientAddress);\n\n transactionBatch.addOutput(\n nftNoteFromNFTAmountRecipient(\n nftAmountRecipient,\n dopWallet,\n showSenderAddressToRecipient,\n memoText,\n ),\n );\n};\n\nconst addTransactionOutputsUnshieldNFT = (\n transactionBatch: TransactionBatch,\n nftAmountRecipient: DopNFTAmountRecipient,\n allowOverride?: boolean,\n) => {\n const { recipientAddress, nftAddress, tokenSubID, nftTokenType, amount } =\n nftAmountRecipient;\n\n assertValidEthAddress(recipientAddress);\n assertNotBlockedAddress(recipientAddress);\n\n const tokenData: NFTTokenData = getTokenDataNFT(\n nftAddress,\n nftTokenType as 1 | 2,\n tokenSubID,\n );\n\n const value: bigint =\n nftTokenType === NFTTokenType.ERC721 ? ERC721_NOTE_VALUE : amount;\n\n transactionBatch.addUnshieldData({\n toAddress: recipientAddress,\n value,\n tokenData,\n allowOverride,\n });\n};\n\nconst generateAllProofs = (\n transactionBatch: TransactionBatch,\n dopWallet: DopWallet,\n encryptionKey: string,\n useDummyProof: boolean,\n progressCallback: ProverProgressCallback,\n valueCheck: bigint,\n): Promise<TransactionStruct[]> => {\n const prover = getProver();\n // return useDummyProof\n // ? transactionBatch.generateDummyTransactions(\n // prover,\n // dopWallet,\n // encryptionKey,\n // )\n // : \n console.log(\"generateProofTransactions generateAllProofs in 0\", transactionBatch);\n\n return transactionBatch.generateTransactions(\n prover,\n dopWallet,\n encryptionKey,\n progressCallback,\n valueCheck\n );\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { OutputType, TransactNote, DopWallet } from 'dop-engine-v5';
|
|
2
|
+
import { DopNFTAmountRecipient, DopERC20Amount, DopERC20AmountRecipient, DopNFTAmount, DopERC20Recipient } from 'dop-sharedmodel-v5';
|
|
3
|
+
export declare const erc20NoteFromERC20AmountRecipient: (erc20AmountRecipient: DopERC20AmountRecipient, dopWallet: DopWallet, outputType: OutputType, showSenderAddressToRecipient: boolean, memoText: Optional<string>) => TransactNote;
|
|
4
|
+
export declare const nftNoteFromNFTAmountRecipient: (nftAmountRecipient: DopNFTAmountRecipient, dopWallet: DopWallet, showSenderAddressToRecipient: boolean, memoText: Optional<string>) => TransactNote;
|
|
5
|
+
export declare const compareERC20AmountRecipients: (a: Optional<DopERC20AmountRecipient>, b: Optional<DopERC20AmountRecipient>) => boolean;
|
|
6
|
+
export declare const compareERC20AmountArrays: (a: Optional<DopERC20Amount[]>, b: Optional<DopERC20Amount[]>) => boolean;
|
|
7
|
+
export declare const compareERC20AmountRecipientArrays: (a: Optional<DopERC20AmountRecipient[]>, b: Optional<DopERC20AmountRecipient[]>) => boolean;
|
|
8
|
+
export declare const compareERC20RecipientArrays: (a: Optional<DopERC20Recipient[]>, b: Optional<DopERC20Recipient[]>) => boolean;
|
|
9
|
+
export declare const compareNFTAmountArrays: (a: Optional<DopNFTAmount[]>, b: Optional<DopNFTAmount[]>) => boolean;
|
|
10
|
+
export declare const compareNFTAmountRecipientArrays: (a: Optional<DopNFTAmountRecipient[]>, b: Optional<DopNFTAmountRecipient[]>) => boolean;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compareNFTAmountRecipientArrays = exports.compareNFTAmountArrays = exports.compareERC20RecipientArrays = exports.compareERC20AmountRecipientArrays = exports.compareERC20AmountArrays = exports.compareERC20AmountRecipients = exports.nftNoteFromNFTAmountRecipient = exports.erc20NoteFromERC20AmountRecipient = void 0;
|
|
4
|
+
const dop_engine_v5_1 = require("dop-engine-v5");
|
|
5
|
+
const dop_sharedmodel_v5_1 = require("dop-sharedmodel-v5");
|
|
6
|
+
const erc20NoteFromERC20AmountRecipient = (erc20AmountRecipient, dopWallet, outputType, showSenderAddressToRecipient, memoText) => {
|
|
7
|
+
const { amount, recipientAddress } = erc20AmountRecipient;
|
|
8
|
+
const receiverAddressData = dop_engine_v5_1.DopEngine.decodeAddress(recipientAddress);
|
|
9
|
+
const random = (0, dop_engine_v5_1.randomHex)(16);
|
|
10
|
+
const tokenData = (0, dop_engine_v5_1.getTokenDataERC20)(erc20AmountRecipient.tokenAddress);
|
|
11
|
+
return dop_engine_v5_1.TransactNote.createTransfer(receiverAddressData, dopWallet.addressKeys, random, amount, tokenData, dopWallet.getViewingKeyPair(), showSenderAddressToRecipient, outputType, memoText);
|
|
12
|
+
};
|
|
13
|
+
exports.erc20NoteFromERC20AmountRecipient = erc20NoteFromERC20AmountRecipient;
|
|
14
|
+
const nftNoteFromNFTAmountRecipient = (nftAmountRecipient, dopWallet, showSenderAddressToRecipient, memoText) => {
|
|
15
|
+
const { recipientAddress, nftAddress, nftTokenType, tokenSubID, amount } = nftAmountRecipient;
|
|
16
|
+
const random = (0, dop_engine_v5_1.randomHex)(16);
|
|
17
|
+
const receiverAddressData = dop_engine_v5_1.DopEngine.decodeAddress(recipientAddress);
|
|
18
|
+
const tokenData = (0, dop_engine_v5_1.getTokenDataNFT)(nftAddress, nftTokenType, tokenSubID);
|
|
19
|
+
switch (nftTokenType) {
|
|
20
|
+
case dop_sharedmodel_v5_1.NFTTokenType.ERC721:
|
|
21
|
+
return dop_engine_v5_1.TransactNote.createERC721Transfer(receiverAddressData, dopWallet.addressKeys, random, tokenData, dopWallet.getViewingKeyPair(), showSenderAddressToRecipient, memoText);
|
|
22
|
+
case dop_sharedmodel_v5_1.NFTTokenType.ERC1155:
|
|
23
|
+
return dop_engine_v5_1.TransactNote.createERC1155Transfer(receiverAddressData, dopWallet.addressKeys, random, tokenData, BigInt(amount), dopWallet.getViewingKeyPair(), showSenderAddressToRecipient, memoText);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.nftNoteFromNFTAmountRecipient = nftNoteFromNFTAmountRecipient;
|
|
27
|
+
const compareERC20Amounts = (a, b) => {
|
|
28
|
+
return a?.tokenAddress === b?.tokenAddress && a?.amount === b?.amount;
|
|
29
|
+
};
|
|
30
|
+
const compareERC20AmountRecipients = (a, b) => {
|
|
31
|
+
return (compareERC20Amounts(a, b) && a?.recipientAddress === b?.recipientAddress);
|
|
32
|
+
};
|
|
33
|
+
exports.compareERC20AmountRecipients = compareERC20AmountRecipients;
|
|
34
|
+
const compareERC20AmountArrays = (a, b) => {
|
|
35
|
+
if (!a && !b) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (!a || !b) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (a.length !== b.length) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
for (const erc20Amount of a) {
|
|
45
|
+
const found = b.find(ta => ta.tokenAddress === erc20Amount.tokenAddress);
|
|
46
|
+
if (!found) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (found.amount !== erc20Amount.amount) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
55
|
+
exports.compareERC20AmountArrays = compareERC20AmountArrays;
|
|
56
|
+
const compareERC20AmountRecipientArrays = (a, b) => {
|
|
57
|
+
if (!a && !b) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
if (!a || !b) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (a.length !== b.length) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
for (const erc20Amount of a) {
|
|
67
|
+
const found = b.find(ta => ta.tokenAddress === erc20Amount.tokenAddress &&
|
|
68
|
+
ta.recipientAddress === erc20Amount.recipientAddress);
|
|
69
|
+
if (!found) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (found.amount !== erc20Amount.amount) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
};
|
|
78
|
+
exports.compareERC20AmountRecipientArrays = compareERC20AmountRecipientArrays;
|
|
79
|
+
const compareERC20RecipientArrays = (a, b) => {
|
|
80
|
+
if (!a && !b) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (!a || !b) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (a.length !== b.length) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
for (const erc20Recipient of a) {
|
|
90
|
+
const found = b.find(ta => ta.tokenAddress === erc20Recipient.tokenAddress &&
|
|
91
|
+
ta.recipientAddress === erc20Recipient.recipientAddress) != null;
|
|
92
|
+
if (!found) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
};
|
|
98
|
+
exports.compareERC20RecipientArrays = compareERC20RecipientArrays;
|
|
99
|
+
const compareNFTAmountArrays = (a, b) => {
|
|
100
|
+
if (!a && !b) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
if (!a || !b) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
if (a.length !== b.length) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
for (const nftAmountRecipient of a) {
|
|
110
|
+
const found = b.find(ta => ta.nftAddress === nftAmountRecipient.nftAddress &&
|
|
111
|
+
ta.tokenSubID === nftAmountRecipient.tokenSubID);
|
|
112
|
+
if (!found) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
if (found.nftTokenType !== nftAmountRecipient.nftTokenType) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (found.amount !== nftAmountRecipient.amount) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
};
|
|
124
|
+
exports.compareNFTAmountArrays = compareNFTAmountArrays;
|
|
125
|
+
const compareNFTAmountRecipientArrays = (a, b) => {
|
|
126
|
+
if (!a && !b) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
if (!a || !b) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
if (a.length !== b.length) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
for (const nftAmountRecipient of a) {
|
|
136
|
+
const found = b.find(ta => ta.nftAddress === nftAmountRecipient.nftAddress &&
|
|
137
|
+
ta.tokenSubID === nftAmountRecipient.tokenSubID);
|
|
138
|
+
if (!found) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
if (found.nftTokenType !== nftAmountRecipient.nftTokenType) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (found.recipientAddress !== nftAmountRecipient.recipientAddress) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (found.amount !== nftAmountRecipient.amount) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
};
|
|
153
|
+
exports.compareNFTAmountRecipientArrays = compareNFTAmountRecipientArrays;
|
|
154
|
+
//# sourceMappingURL=tx-notes.js.map
|