@atomiqlabs/chain-evm 1.0.0-dev.75 → 1.0.0-dev.77
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/LICENSE +201 -201
- package/dist/chains/botanix/BotanixChainType.d.ts +13 -13
- package/dist/chains/botanix/BotanixChainType.js +2 -2
- package/dist/chains/botanix/BotanixInitializer.d.ts +30 -30
- package/dist/chains/botanix/BotanixInitializer.js +122 -122
- package/dist/chains/citrea/CitreaBtcRelay.d.ts +21 -21
- package/dist/chains/citrea/CitreaBtcRelay.js +43 -43
- package/dist/chains/citrea/CitreaChainType.d.ts +13 -13
- package/dist/chains/citrea/CitreaChainType.js +2 -2
- package/dist/chains/citrea/CitreaFees.d.ts +29 -29
- package/dist/chains/citrea/CitreaFees.js +67 -67
- package/dist/chains/citrea/CitreaInitializer.d.ts +30 -30
- package/dist/chains/citrea/CitreaInitializer.js +129 -129
- package/dist/chains/citrea/CitreaSpvVaultContract.d.ts +15 -15
- package/dist/chains/citrea/CitreaSpvVaultContract.js +74 -74
- package/dist/chains/citrea/CitreaSwapContract.d.ts +22 -22
- package/dist/chains/citrea/CitreaSwapContract.js +96 -96
- package/dist/chains/citrea/CitreaTokens.d.ts +9 -9
- package/dist/chains/citrea/CitreaTokens.js +20 -20
- package/dist/evm/btcrelay/BtcRelayAbi.d.ts +198 -198
- package/dist/evm/btcrelay/BtcRelayAbi.js +261 -261
- package/dist/evm/btcrelay/BtcRelayTypechain.d.ts +172 -172
- package/dist/evm/btcrelay/BtcRelayTypechain.js +2 -2
- package/dist/evm/btcrelay/EVMBtcRelay.d.ts +197 -197
- package/dist/evm/btcrelay/EVMBtcRelay.js +435 -435
- package/dist/evm/btcrelay/headers/EVMBtcHeader.d.ts +33 -33
- package/dist/evm/btcrelay/headers/EVMBtcHeader.js +84 -84
- package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.d.ts +56 -56
- package/dist/evm/btcrelay/headers/EVMBtcStoredHeader.js +123 -123
- package/dist/evm/chain/EVMChainInterface.d.ts +51 -51
- package/dist/evm/chain/EVMChainInterface.js +89 -89
- package/dist/evm/chain/EVMModule.d.ts +9 -9
- package/dist/evm/chain/EVMModule.js +13 -13
- package/dist/evm/chain/modules/ERC20Abi.d.ts +168 -168
- package/dist/evm/chain/modules/ERC20Abi.js +225 -225
- package/dist/evm/chain/modules/EVMAddresses.d.ts +10 -10
- package/dist/evm/chain/modules/EVMAddresses.js +30 -30
- package/dist/evm/chain/modules/EVMBlocks.d.ts +20 -20
- package/dist/evm/chain/modules/EVMBlocks.js +64 -64
- package/dist/evm/chain/modules/EVMEvents.d.ts +36 -36
- package/dist/evm/chain/modules/EVMEvents.js +122 -122
- package/dist/evm/chain/modules/EVMFees.d.ts +36 -36
- package/dist/evm/chain/modules/EVMFees.js +74 -74
- package/dist/evm/chain/modules/EVMSignatures.d.ts +29 -29
- package/dist/evm/chain/modules/EVMSignatures.js +68 -68
- package/dist/evm/chain/modules/EVMTokens.d.ts +70 -70
- package/dist/evm/chain/modules/EVMTokens.js +142 -142
- package/dist/evm/chain/modules/EVMTransactions.d.ts +94 -94
- package/dist/evm/chain/modules/EVMTransactions.js +286 -286
- package/dist/evm/contract/EVMContractBase.d.ts +22 -22
- package/dist/evm/contract/EVMContractBase.js +34 -34
- package/dist/evm/contract/EVMContractModule.d.ts +8 -8
- package/dist/evm/contract/EVMContractModule.js +11 -11
- package/dist/evm/contract/modules/EVMContractEvents.d.ts +42 -42
- package/dist/evm/contract/modules/EVMContractEvents.js +75 -75
- package/dist/evm/events/EVMChainEvents.d.ts +22 -22
- package/dist/evm/events/EVMChainEvents.js +69 -69
- package/dist/evm/events/EVMChainEventsBrowser.d.ts +102 -102
- package/dist/evm/events/EVMChainEventsBrowser.js +413 -404
- package/dist/evm/providers/JsonRpcProviderWithRetries.d.ts +15 -15
- package/dist/evm/providers/JsonRpcProviderWithRetries.js +19 -19
- package/dist/evm/providers/ReconnectingWebSocketProvider.d.ts +22 -22
- package/dist/evm/providers/ReconnectingWebSocketProvider.js +87 -87
- package/dist/evm/providers/SocketProvider.d.ts +111 -111
- package/dist/evm/providers/SocketProvider.js +334 -334
- package/dist/evm/providers/WebSocketProviderWithRetries.d.ts +17 -17
- package/dist/evm/providers/WebSocketProviderWithRetries.js +19 -19
- package/dist/evm/spv_swap/EVMSpvVaultContract.d.ts +79 -79
- package/dist/evm/spv_swap/EVMSpvVaultContract.js +482 -482
- package/dist/evm/spv_swap/EVMSpvVaultData.d.ts +39 -39
- package/dist/evm/spv_swap/EVMSpvVaultData.js +0 -180
- package/dist/evm/spv_swap/EVMSpvWithdrawalData.d.ts +19 -19
- package/dist/evm/spv_swap/EVMSpvWithdrawalData.js +55 -55
- package/dist/evm/spv_swap/SpvVaultContractAbi.d.ts +91 -91
- package/dist/evm/spv_swap/SpvVaultContractAbi.js +849 -849
- package/dist/evm/spv_swap/SpvVaultContractTypechain.d.ts +450 -450
- package/dist/evm/spv_swap/SpvVaultContractTypechain.js +2 -2
- package/dist/evm/swaps/EVMSwapContract.d.ts +193 -193
- package/dist/evm/swaps/EVMSwapContract.js +378 -378
- package/dist/evm/swaps/EVMSwapData.d.ts +66 -66
- package/dist/evm/swaps/EVMSwapData.js +260 -260
- package/dist/evm/swaps/EVMSwapModule.d.ts +9 -9
- package/dist/evm/swaps/EVMSwapModule.js +11 -11
- package/dist/evm/swaps/EscrowManagerAbi.d.ts +120 -120
- package/dist/evm/swaps/EscrowManagerAbi.js +985 -985
- package/dist/evm/swaps/EscrowManagerTypechain.d.ts +475 -475
- package/dist/evm/swaps/EscrowManagerTypechain.js +2 -2
- package/dist/evm/swaps/handlers/IHandler.d.ts +13 -13
- package/dist/evm/swaps/handlers/IHandler.js +2 -2
- package/dist/evm/swaps/handlers/claim/ClaimHandlers.d.ts +10 -10
- package/dist/evm/swaps/handlers/claim/ClaimHandlers.js +13 -13
- package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.d.ts +20 -20
- package/dist/evm/swaps/handlers/claim/HashlockClaimHandler.js +39 -39
- package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +24 -24
- package/dist/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +59 -59
- package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +25 -25
- package/dist/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +51 -51
- package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +21 -21
- package/dist/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +28 -28
- package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +48 -48
- package/dist/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +63 -63
- package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -17
- package/dist/evm/swaps/handlers/refund/TimelockRefundHandler.js +28 -28
- package/dist/evm/swaps/modules/EVMLpVault.d.ts +69 -69
- package/dist/evm/swaps/modules/EVMLpVault.js +134 -134
- package/dist/evm/swaps/modules/EVMSwapClaim.d.ts +54 -54
- package/dist/evm/swaps/modules/EVMSwapClaim.js +137 -137
- package/dist/evm/swaps/modules/EVMSwapInit.d.ts +88 -88
- package/dist/evm/swaps/modules/EVMSwapInit.js +274 -274
- package/dist/evm/swaps/modules/EVMSwapRefund.d.ts +62 -62
- package/dist/evm/swaps/modules/EVMSwapRefund.js +167 -167
- package/dist/evm/typechain/common.d.ts +50 -50
- package/dist/evm/typechain/common.js +2 -2
- package/dist/evm/wallet/EVMBrowserSigner.d.ts +5 -5
- package/dist/evm/wallet/EVMBrowserSigner.js +11 -11
- package/dist/evm/wallet/EVMPersistentSigner.d.ts +29 -29
- package/dist/evm/wallet/EVMPersistentSigner.js +222 -222
- package/dist/evm/wallet/EVMSigner.d.ts +11 -11
- package/dist/evm/wallet/EVMSigner.js +24 -24
- package/dist/index.d.ts +44 -44
- package/dist/index.js +60 -60
- package/dist/utils/Utils.d.ts +17 -17
- package/dist/utils/Utils.js +81 -81
- package/package.json +39 -39
- package/src/chains/botanix/BotanixChainType.ts +28 -28
- package/src/chains/botanix/BotanixInitializer.ts +171 -171
- package/src/chains/citrea/CitreaBtcRelay.ts +57 -57
- package/src/chains/citrea/CitreaChainType.ts +28 -28
- package/src/chains/citrea/CitreaFees.ts +77 -77
- package/src/chains/citrea/CitreaInitializer.ts +178 -178
- package/src/chains/citrea/CitreaSpvVaultContract.ts +75 -75
- package/src/chains/citrea/CitreaSwapContract.ts +102 -102
- package/src/chains/citrea/CitreaTokens.ts +21 -21
- package/src/evm/btcrelay/BtcRelayAbi.ts +258 -258
- package/src/evm/btcrelay/BtcRelayTypechain.ts +371 -371
- package/src/evm/btcrelay/EVMBtcRelay.ts +537 -537
- package/src/evm/btcrelay/headers/EVMBtcHeader.ts +109 -109
- package/src/evm/btcrelay/headers/EVMBtcStoredHeader.ts +152 -152
- package/src/evm/chain/EVMChainInterface.ts +155 -155
- package/src/evm/chain/EVMModule.ts +21 -21
- package/src/evm/chain/modules/ERC20Abi.ts +222 -222
- package/src/evm/chain/modules/EVMAddresses.ts +28 -28
- package/src/evm/chain/modules/EVMBlocks.ts +75 -75
- package/src/evm/chain/modules/EVMEvents.ts +139 -139
- package/src/evm/chain/modules/EVMFees.ts +104 -104
- package/src/evm/chain/modules/EVMSignatures.ts +76 -76
- package/src/evm/chain/modules/EVMTokens.ts +155 -155
- package/src/evm/chain/modules/EVMTransactions.ts +325 -325
- package/src/evm/contract/EVMContractBase.ts +63 -63
- package/src/evm/contract/EVMContractModule.ts +16 -16
- package/src/evm/contract/modules/EVMContractEvents.ts +102 -102
- package/src/evm/events/EVMChainEvents.ts +82 -82
- package/src/evm/events/EVMChainEventsBrowser.ts +534 -525
- package/src/evm/providers/JsonRpcProviderWithRetries.ts +24 -24
- package/src/evm/providers/ReconnectingWebSocketProvider.ts +101 -101
- package/src/evm/providers/SocketProvider.ts +368 -368
- package/src/evm/providers/WebSocketProviderWithRetries.ts +27 -27
- package/src/evm/spv_swap/EVMSpvVaultContract.ts +615 -615
- package/src/evm/spv_swap/EVMSpvVaultData.ts +224 -224
- package/src/evm/spv_swap/EVMSpvWithdrawalData.ts +70 -70
- package/src/evm/spv_swap/SpvVaultContractAbi.ts +846 -846
- package/src/evm/spv_swap/SpvVaultContractTypechain.ts +685 -685
- package/src/evm/swaps/EVMSwapContract.ts +600 -600
- package/src/evm/swaps/EVMSwapData.ts +378 -378
- package/src/evm/swaps/EVMSwapModule.ts +16 -16
- package/src/evm/swaps/EscrowManagerAbi.ts +982 -982
- package/src/evm/swaps/EscrowManagerTypechain.ts +723 -723
- package/src/evm/swaps/handlers/IHandler.ts +17 -17
- package/src/evm/swaps/handlers/claim/ClaimHandlers.ts +20 -20
- package/src/evm/swaps/handlers/claim/HashlockClaimHandler.ts +46 -46
- package/src/evm/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +82 -82
- package/src/evm/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +76 -76
- package/src/evm/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +46 -46
- package/src/evm/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +115 -115
- package/src/evm/swaps/handlers/refund/TimelockRefundHandler.ts +37 -37
- package/src/evm/swaps/modules/EVMLpVault.ts +154 -154
- package/src/evm/swaps/modules/EVMSwapClaim.ts +172 -172
- package/src/evm/swaps/modules/EVMSwapInit.ts +328 -328
- package/src/evm/swaps/modules/EVMSwapRefund.ts +229 -229
- package/src/evm/typechain/common.ts +131 -131
- package/src/evm/wallet/EVMBrowserSigner.ts +11 -11
- package/src/evm/wallet/EVMPersistentSigner.ts +298 -298
- package/src/evm/wallet/EVMSigner.ts +31 -31
- package/src/index.ts +53 -53
- package/src/utils/Utils.ts +92 -92
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
import {IClaimHandler} from "../ClaimHandlers";
|
|
2
|
-
import {BigIntBufferUtils, ChainSwapType, RelaySynchronizer} from "@atomiqlabs/base";
|
|
3
|
-
import {EVMBtcRelay} from "../../../../btcrelay/EVMBtcRelay";
|
|
4
|
-
import { EVMBtcStoredHeader } from "../../../../btcrelay/headers/EVMBtcStoredHeader";
|
|
5
|
-
import {EVMTx} from "../../../../chain/modules/EVMTransactions";
|
|
6
|
-
import {getLogger} from "../../../../../utils/Utils";
|
|
7
|
-
import {keccak256} from "ethers";
|
|
8
|
-
import {Buffer} from "buffer";
|
|
9
|
-
import {EVMSwapData} from "../../../EVMSwapData";
|
|
10
|
-
|
|
11
|
-
export type BitcoinCommitmentData = {
|
|
12
|
-
btcRelay: EVMBtcRelay<any>,
|
|
13
|
-
confirmations: number
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type BitcoinWitnessData = {
|
|
17
|
-
tx: { blockhash: string, confirmations: number, txid: string, hex: string, height: number },
|
|
18
|
-
requiredConfirmations: number,
|
|
19
|
-
commitedHeader?: EVMBtcStoredHeader,
|
|
20
|
-
btcRelay?: EVMBtcRelay<any>,
|
|
21
|
-
synchronizer?: RelaySynchronizer<EVMBtcStoredHeader, EVMTx, any>
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const logger = getLogger("IBitcoinClaimHandler: ");
|
|
25
|
-
|
|
26
|
-
export abstract class IBitcoinClaimHandler<C, W extends BitcoinWitnessData> implements IClaimHandler<C & BitcoinCommitmentData, W> {
|
|
27
|
-
|
|
28
|
-
public readonly address: string;
|
|
29
|
-
|
|
30
|
-
constructor(address: string) {
|
|
31
|
-
this.address = address;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
public static readonly address = "";
|
|
35
|
-
public static readonly type: ChainSwapType = ChainSwapType.CHAIN_TXID;
|
|
36
|
-
public static readonly gas: number = 10_000;
|
|
37
|
-
|
|
38
|
-
protected serializeCommitment(data: BitcoinCommitmentData): Buffer {
|
|
39
|
-
const buffer = Buffer.alloc(24);
|
|
40
|
-
buffer.writeUint32BE(data.confirmations, 0);
|
|
41
|
-
Buffer.from(data.btcRelay.contractAddress.substring(2), "hex").copy(buffer, 4, 0, 20);
|
|
42
|
-
return buffer;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
getCommitment(data: C & BitcoinCommitmentData): string {
|
|
46
|
-
return keccak256(this.serializeCommitment(data));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
protected async _getWitness(
|
|
50
|
-
signer: string,
|
|
51
|
-
swapData: EVMSwapData,
|
|
52
|
-
{tx, btcRelay, commitedHeader, synchronizer, requiredConfirmations}: BitcoinWitnessData,
|
|
53
|
-
commitment: C,
|
|
54
|
-
feeRate?: string
|
|
55
|
-
): Promise<{
|
|
56
|
-
initialTxns: EVMTx[];
|
|
57
|
-
witness: Buffer,
|
|
58
|
-
commitment: Buffer,
|
|
59
|
-
blockheader: Buffer,
|
|
60
|
-
merkleProof: Buffer
|
|
61
|
-
}> {
|
|
62
|
-
const serializedCommitment: Buffer = this.serializeCommitment({
|
|
63
|
-
...commitment,
|
|
64
|
-
btcRelay,
|
|
65
|
-
confirmations: requiredConfirmations
|
|
66
|
-
});
|
|
67
|
-
const commitmentHash = keccak256(serializedCommitment);
|
|
68
|
-
|
|
69
|
-
if(!swapData.isClaimData(commitmentHash)) throw new Error("Invalid commit data");
|
|
70
|
-
|
|
71
|
-
const merkleProof = await btcRelay.bitcoinRpc.getMerkleProof(tx.txid, tx.blockhash);
|
|
72
|
-
logger.debug("getWitness(): merkle proof computed: ", merkleProof);
|
|
73
|
-
|
|
74
|
-
const txs: EVMTx[] = [];
|
|
75
|
-
if(commitedHeader==null) {
|
|
76
|
-
const headers = await EVMBtcRelay.getCommitedHeadersAndSynchronize(
|
|
77
|
-
signer, btcRelay,
|
|
78
|
-
[{blockheight: tx.height, requiredConfirmations, blockhash: tx.blockhash}],
|
|
79
|
-
txs, synchronizer, feeRate
|
|
80
|
-
);
|
|
81
|
-
if(headers==null) throw new Error("Cannot fetch committed header!");
|
|
82
|
-
commitedHeader = headers[tx.blockhash];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const serializedHeader = commitedHeader.serialize();
|
|
86
|
-
|
|
87
|
-
const serializedMerkleProof = Buffer.concat([
|
|
88
|
-
BigIntBufferUtils.toBuffer(BigInt(merkleProof.pos), "be", 4),
|
|
89
|
-
BigIntBufferUtils.toBuffer(BigInt(merkleProof.merkle.length), "be", 32),
|
|
90
|
-
...merkleProof.merkle
|
|
91
|
-
]);
|
|
92
|
-
|
|
93
|
-
return {
|
|
94
|
-
initialTxns: txs,
|
|
95
|
-
witness: Buffer.concat([
|
|
96
|
-
serializedCommitment,
|
|
97
|
-
serializedHeader,
|
|
98
|
-
serializedMerkleProof
|
|
99
|
-
]),
|
|
100
|
-
commitment: serializedCommitment,
|
|
101
|
-
blockheader: serializedHeader,
|
|
102
|
-
merkleProof: serializedMerkleProof
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
abstract getWitness(signer: string, data: EVMSwapData, witnessData: W, feeRate?: string): Promise<{
|
|
107
|
-
initialTxns: EVMTx[];
|
|
108
|
-
witness: Buffer
|
|
109
|
-
}>;
|
|
110
|
-
|
|
111
|
-
abstract getGas(data: EVMSwapData): number;
|
|
112
|
-
|
|
113
|
-
abstract getType(): ChainSwapType;
|
|
114
|
-
|
|
115
|
-
}
|
|
1
|
+
import {IClaimHandler} from "../ClaimHandlers";
|
|
2
|
+
import {BigIntBufferUtils, ChainSwapType, RelaySynchronizer} from "@atomiqlabs/base";
|
|
3
|
+
import {EVMBtcRelay} from "../../../../btcrelay/EVMBtcRelay";
|
|
4
|
+
import { EVMBtcStoredHeader } from "../../../../btcrelay/headers/EVMBtcStoredHeader";
|
|
5
|
+
import {EVMTx} from "../../../../chain/modules/EVMTransactions";
|
|
6
|
+
import {getLogger} from "../../../../../utils/Utils";
|
|
7
|
+
import {keccak256} from "ethers";
|
|
8
|
+
import {Buffer} from "buffer";
|
|
9
|
+
import {EVMSwapData} from "../../../EVMSwapData";
|
|
10
|
+
|
|
11
|
+
export type BitcoinCommitmentData = {
|
|
12
|
+
btcRelay: EVMBtcRelay<any>,
|
|
13
|
+
confirmations: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type BitcoinWitnessData = {
|
|
17
|
+
tx: { blockhash: string, confirmations: number, txid: string, hex: string, height: number },
|
|
18
|
+
requiredConfirmations: number,
|
|
19
|
+
commitedHeader?: EVMBtcStoredHeader,
|
|
20
|
+
btcRelay?: EVMBtcRelay<any>,
|
|
21
|
+
synchronizer?: RelaySynchronizer<EVMBtcStoredHeader, EVMTx, any>
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const logger = getLogger("IBitcoinClaimHandler: ");
|
|
25
|
+
|
|
26
|
+
export abstract class IBitcoinClaimHandler<C, W extends BitcoinWitnessData> implements IClaimHandler<C & BitcoinCommitmentData, W> {
|
|
27
|
+
|
|
28
|
+
public readonly address: string;
|
|
29
|
+
|
|
30
|
+
constructor(address: string) {
|
|
31
|
+
this.address = address;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public static readonly address = "";
|
|
35
|
+
public static readonly type: ChainSwapType = ChainSwapType.CHAIN_TXID;
|
|
36
|
+
public static readonly gas: number = 10_000;
|
|
37
|
+
|
|
38
|
+
protected serializeCommitment(data: BitcoinCommitmentData): Buffer {
|
|
39
|
+
const buffer = Buffer.alloc(24);
|
|
40
|
+
buffer.writeUint32BE(data.confirmations, 0);
|
|
41
|
+
Buffer.from(data.btcRelay.contractAddress.substring(2), "hex").copy(buffer, 4, 0, 20);
|
|
42
|
+
return buffer;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getCommitment(data: C & BitcoinCommitmentData): string {
|
|
46
|
+
return keccak256(this.serializeCommitment(data));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
protected async _getWitness(
|
|
50
|
+
signer: string,
|
|
51
|
+
swapData: EVMSwapData,
|
|
52
|
+
{tx, btcRelay, commitedHeader, synchronizer, requiredConfirmations}: BitcoinWitnessData,
|
|
53
|
+
commitment: C,
|
|
54
|
+
feeRate?: string
|
|
55
|
+
): Promise<{
|
|
56
|
+
initialTxns: EVMTx[];
|
|
57
|
+
witness: Buffer,
|
|
58
|
+
commitment: Buffer,
|
|
59
|
+
blockheader: Buffer,
|
|
60
|
+
merkleProof: Buffer
|
|
61
|
+
}> {
|
|
62
|
+
const serializedCommitment: Buffer = this.serializeCommitment({
|
|
63
|
+
...commitment,
|
|
64
|
+
btcRelay,
|
|
65
|
+
confirmations: requiredConfirmations
|
|
66
|
+
});
|
|
67
|
+
const commitmentHash = keccak256(serializedCommitment);
|
|
68
|
+
|
|
69
|
+
if(!swapData.isClaimData(commitmentHash)) throw new Error("Invalid commit data");
|
|
70
|
+
|
|
71
|
+
const merkleProof = await btcRelay.bitcoinRpc.getMerkleProof(tx.txid, tx.blockhash);
|
|
72
|
+
logger.debug("getWitness(): merkle proof computed: ", merkleProof);
|
|
73
|
+
|
|
74
|
+
const txs: EVMTx[] = [];
|
|
75
|
+
if(commitedHeader==null) {
|
|
76
|
+
const headers = await EVMBtcRelay.getCommitedHeadersAndSynchronize(
|
|
77
|
+
signer, btcRelay,
|
|
78
|
+
[{blockheight: tx.height, requiredConfirmations, blockhash: tx.blockhash}],
|
|
79
|
+
txs, synchronizer, feeRate
|
|
80
|
+
);
|
|
81
|
+
if(headers==null) throw new Error("Cannot fetch committed header!");
|
|
82
|
+
commitedHeader = headers[tx.blockhash];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const serializedHeader = commitedHeader.serialize();
|
|
86
|
+
|
|
87
|
+
const serializedMerkleProof = Buffer.concat([
|
|
88
|
+
BigIntBufferUtils.toBuffer(BigInt(merkleProof.pos), "be", 4),
|
|
89
|
+
BigIntBufferUtils.toBuffer(BigInt(merkleProof.merkle.length), "be", 32),
|
|
90
|
+
...merkleProof.merkle
|
|
91
|
+
]);
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
initialTxns: txs,
|
|
95
|
+
witness: Buffer.concat([
|
|
96
|
+
serializedCommitment,
|
|
97
|
+
serializedHeader,
|
|
98
|
+
serializedMerkleProof
|
|
99
|
+
]),
|
|
100
|
+
commitment: serializedCommitment,
|
|
101
|
+
blockheader: serializedHeader,
|
|
102
|
+
merkleProof: serializedMerkleProof
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
abstract getWitness(signer: string, data: EVMSwapData, witnessData: W, feeRate?: string): Promise<{
|
|
107
|
+
initialTxns: EVMTx[];
|
|
108
|
+
witness: Buffer
|
|
109
|
+
}>;
|
|
110
|
+
|
|
111
|
+
abstract getGas(data: EVMSwapData): number;
|
|
112
|
+
|
|
113
|
+
abstract getType(): ChainSwapType;
|
|
114
|
+
|
|
115
|
+
}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import {IHandler} from "../IHandler";
|
|
2
|
-
import {BigIntBufferUtils} from "@atomiqlabs/base";
|
|
3
|
-
import {EVMSwapData} from "../../EVMSwapData";
|
|
4
|
-
import {EVMTx} from "../../../chain/modules/EVMTransactions";
|
|
5
|
-
|
|
6
|
-
export class TimelockRefundHandler implements IHandler<bigint, never> {
|
|
7
|
-
|
|
8
|
-
public readonly address: string;
|
|
9
|
-
public static readonly gas: number = 5_000;
|
|
10
|
-
|
|
11
|
-
constructor(address: string) {
|
|
12
|
-
this.address = address;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public getCommitment(data: bigint): string {
|
|
16
|
-
return "0x"+BigIntBufferUtils.toBuffer(data, "be", 32).toString("hex");
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public getWitness(signer: string, data: EVMSwapData): Promise<{
|
|
20
|
-
initialTxns: EVMTx[],
|
|
21
|
-
witness: Buffer
|
|
22
|
-
}> {
|
|
23
|
-
const expiry = TimelockRefundHandler.getExpiry(data);
|
|
24
|
-
const currentTimestamp = BigInt(Math.floor(Date.now()/1000));
|
|
25
|
-
if(expiry > currentTimestamp) throw new Error("Not expired yet!");
|
|
26
|
-
return Promise.resolve({initialTxns: [], witness: Buffer.alloc(0)});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
getGas(): number {
|
|
30
|
-
return TimelockRefundHandler.gas;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public static getExpiry(data: EVMSwapData): bigint {
|
|
34
|
-
const expiryDataBuffer = Buffer.from(data.refundData.startsWith("0x") ? data.refundData.substring(2) : data.refundData, "hex");
|
|
35
|
-
return BigIntBufferUtils.fromBuffer(expiryDataBuffer, "be");
|
|
36
|
-
}
|
|
37
|
-
|
|
1
|
+
import {IHandler} from "../IHandler";
|
|
2
|
+
import {BigIntBufferUtils} from "@atomiqlabs/base";
|
|
3
|
+
import {EVMSwapData} from "../../EVMSwapData";
|
|
4
|
+
import {EVMTx} from "../../../chain/modules/EVMTransactions";
|
|
5
|
+
|
|
6
|
+
export class TimelockRefundHandler implements IHandler<bigint, never> {
|
|
7
|
+
|
|
8
|
+
public readonly address: string;
|
|
9
|
+
public static readonly gas: number = 5_000;
|
|
10
|
+
|
|
11
|
+
constructor(address: string) {
|
|
12
|
+
this.address = address;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public getCommitment(data: bigint): string {
|
|
16
|
+
return "0x"+BigIntBufferUtils.toBuffer(data, "be", 32).toString("hex");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public getWitness(signer: string, data: EVMSwapData): Promise<{
|
|
20
|
+
initialTxns: EVMTx[],
|
|
21
|
+
witness: Buffer
|
|
22
|
+
}> {
|
|
23
|
+
const expiry = TimelockRefundHandler.getExpiry(data);
|
|
24
|
+
const currentTimestamp = BigInt(Math.floor(Date.now()/1000));
|
|
25
|
+
if(expiry > currentTimestamp) throw new Error("Not expired yet!");
|
|
26
|
+
return Promise.resolve({initialTxns: [], witness: Buffer.alloc(0)});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
getGas(): number {
|
|
30
|
+
return TimelockRefundHandler.gas;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static getExpiry(data: EVMSwapData): bigint {
|
|
34
|
+
const expiryDataBuffer = Buffer.from(data.refundData.startsWith("0x") ? data.refundData.substring(2) : data.refundData, "hex");
|
|
35
|
+
return BigIntBufferUtils.fromBuffer(expiryDataBuffer, "be");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
38
|
}
|
|
@@ -1,155 +1,155 @@
|
|
|
1
|
-
import { IntermediaryReputationType } from "@atomiqlabs/base";
|
|
2
|
-
import { EVMSwapModule } from "../EVMSwapModule";
|
|
3
|
-
import {TransactionRequest} from "ethers";
|
|
4
|
-
import {EVMFees} from "../../chain/modules/EVMFees";
|
|
5
|
-
import {EVMTx} from "../../chain/modules/EVMTransactions";
|
|
6
|
-
|
|
7
|
-
export class EVMLpVault extends EVMSwapModule {
|
|
8
|
-
|
|
9
|
-
private static readonly GasCosts = {
|
|
10
|
-
WITHDRAW: 100_000 + 21_000,
|
|
11
|
-
DEPOSIT: 100_000 + 21_000
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Action for withdrawing funds from the LP vault
|
|
16
|
-
*
|
|
17
|
-
* @param signer
|
|
18
|
-
* @param token
|
|
19
|
-
* @param amount
|
|
20
|
-
* @param feeRate
|
|
21
|
-
* @private
|
|
22
|
-
*/
|
|
23
|
-
private async Withdraw(signer: string, token: string, amount: bigint, feeRate: string): Promise<TransactionRequest> {
|
|
24
|
-
const tx = await this.swapContract.withdraw.populateTransaction(token, amount, signer);
|
|
25
|
-
tx.from = signer;
|
|
26
|
-
tx.gasLimit = BigInt(EVMLpVault.GasCosts.WITHDRAW);
|
|
27
|
-
EVMFees.applyFeeRate(tx, EVMLpVault.GasCosts.WITHDRAW, feeRate);
|
|
28
|
-
return tx;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Action for depositing funds to the LP vault
|
|
33
|
-
*
|
|
34
|
-
* @param signer
|
|
35
|
-
* @param token
|
|
36
|
-
* @param amount
|
|
37
|
-
* @param feeRate
|
|
38
|
-
* @private
|
|
39
|
-
*/
|
|
40
|
-
private async Deposit(signer: string, token: string, amount: bigint, feeRate: string): Promise<TransactionRequest> {
|
|
41
|
-
const tx = await this.swapContract.deposit.populateTransaction(token, amount, {
|
|
42
|
-
value: token.toLowerCase()===this.root.getNativeCurrencyAddress().toLowerCase() ? amount : 0n
|
|
43
|
-
});
|
|
44
|
-
tx.from = signer;
|
|
45
|
-
EVMFees.applyFeeRate(tx, EVMLpVault.GasCosts.DEPOSIT, feeRate);
|
|
46
|
-
return tx;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Returns intermediary's reputation & vault balance for a specific token
|
|
51
|
-
*
|
|
52
|
-
* @param address
|
|
53
|
-
* @param token
|
|
54
|
-
*/
|
|
55
|
-
public async getIntermediaryData(address: string, token: string): Promise<{
|
|
56
|
-
balance: bigint,
|
|
57
|
-
reputation: IntermediaryReputationType
|
|
58
|
-
}> {
|
|
59
|
-
const [balance, reputation] = await Promise.all([
|
|
60
|
-
this.getIntermediaryBalance(address, token),
|
|
61
|
-
this.getIntermediaryReputation(address, token)
|
|
62
|
-
]);
|
|
63
|
-
|
|
64
|
-
return {balance, reputation};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Returns intermediary's reputation for a specific token
|
|
69
|
-
*
|
|
70
|
-
* @param address
|
|
71
|
-
* @param token
|
|
72
|
-
*/
|
|
73
|
-
public async getIntermediaryReputation(address: string, token: string): Promise<IntermediaryReputationType> {
|
|
74
|
-
const filter = Object.keys(this.contract.claimHandlersByAddress).map(claimHandler => ({owner: address, token, claimHandler}));
|
|
75
|
-
const resp = await this.swapContract.getReputation(filter);
|
|
76
|
-
if(resp.length!==filter.length) throw new Error("getIntermediaryReputation(): Invalid response length");
|
|
77
|
-
|
|
78
|
-
const result: any = {};
|
|
79
|
-
Object.keys(this.contract.claimHandlersByAddress).forEach((address, index) => {
|
|
80
|
-
const handler = this.contract.claimHandlersByAddress[address.toLowerCase()];
|
|
81
|
-
const handlerResp = resp[index];
|
|
82
|
-
result[handler.getType()] = {
|
|
83
|
-
successVolume: handlerResp[0].amount,
|
|
84
|
-
successCount: handlerResp[0].count,
|
|
85
|
-
coopCloseVolume: handlerResp[1].amount,
|
|
86
|
-
coopCloseCount: handlerResp[1].count,
|
|
87
|
-
failVolume: handlerResp[2].amount,
|
|
88
|
-
failCount: handlerResp[2].count,
|
|
89
|
-
};
|
|
90
|
-
});
|
|
91
|
-
return result as any;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Returns the balance of the token an intermediary has in his LP vault
|
|
96
|
-
*
|
|
97
|
-
* @param address
|
|
98
|
-
* @param token
|
|
99
|
-
*/
|
|
100
|
-
public async getIntermediaryBalance(address: string, token: string): Promise<bigint> {
|
|
101
|
-
const [balance] = await this.swapContract.getBalance([{owner: address, token}]);
|
|
102
|
-
|
|
103
|
-
this.logger.debug("getIntermediaryBalance(): token LP balance fetched, token: "+token.toString()+
|
|
104
|
-
" address: "+address+" amount: "+(balance==null ? "null" : balance.toString()));
|
|
105
|
-
|
|
106
|
-
return balance;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Creates transactions for withdrawing funds from the LP vault, creates ATA if it doesn't exist and unwraps
|
|
111
|
-
* WSOL to SOL if required
|
|
112
|
-
*
|
|
113
|
-
* @param signer
|
|
114
|
-
* @param token
|
|
115
|
-
* @param amount
|
|
116
|
-
* @param feeRate
|
|
117
|
-
*/
|
|
118
|
-
public async txsWithdraw(signer: string, token: string, amount: bigint, feeRate?: string): Promise<EVMTx[]> {
|
|
119
|
-
feeRate ??= await this.root.Fees.getFeeRate();
|
|
120
|
-
const withdrawTx = await this.Withdraw(signer, token, amount, feeRate);
|
|
121
|
-
|
|
122
|
-
this.logger.debug("txsWithdraw(): withdraw TX created, token: "+token.toString()+
|
|
123
|
-
" amount: "+amount.toString(10));
|
|
124
|
-
|
|
125
|
-
return [withdrawTx];
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Creates transaction for depositing funds into the LP vault, wraps SOL to WSOL if required
|
|
130
|
-
*
|
|
131
|
-
* @param signer
|
|
132
|
-
* @param token
|
|
133
|
-
* @param amount
|
|
134
|
-
* @param feeRate
|
|
135
|
-
*/
|
|
136
|
-
public async txsDeposit(signer: string, token: string, amount: bigint, feeRate?: string): Promise<EVMTx[]> {
|
|
137
|
-
feeRate ??= await this.root.Fees.getFeeRate();
|
|
138
|
-
|
|
139
|
-
const txs: EVMTx[] = [];
|
|
140
|
-
|
|
141
|
-
//Approve first
|
|
142
|
-
if(token.toLowerCase()!==this.root.getNativeCurrencyAddress().toLowerCase()) {
|
|
143
|
-
const approveTx = await this.root.Tokens.checkAndGetApproveTx(signer, token, amount, this.contract.contractAddress, feeRate);
|
|
144
|
-
if(approveTx!=null) txs.push(approveTx);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
txs.push(await this.Deposit(signer, token, amount, feeRate));
|
|
148
|
-
|
|
149
|
-
this.logger.debug("txsDeposit(): deposit TX created, token: "+token.toString()+
|
|
150
|
-
" amount: "+amount.toString(10));
|
|
151
|
-
|
|
152
|
-
return txs;
|
|
153
|
-
}
|
|
154
|
-
|
|
1
|
+
import { IntermediaryReputationType } from "@atomiqlabs/base";
|
|
2
|
+
import { EVMSwapModule } from "../EVMSwapModule";
|
|
3
|
+
import {TransactionRequest} from "ethers";
|
|
4
|
+
import {EVMFees} from "../../chain/modules/EVMFees";
|
|
5
|
+
import {EVMTx} from "../../chain/modules/EVMTransactions";
|
|
6
|
+
|
|
7
|
+
export class EVMLpVault extends EVMSwapModule {
|
|
8
|
+
|
|
9
|
+
private static readonly GasCosts = {
|
|
10
|
+
WITHDRAW: 100_000 + 21_000,
|
|
11
|
+
DEPOSIT: 100_000 + 21_000
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Action for withdrawing funds from the LP vault
|
|
16
|
+
*
|
|
17
|
+
* @param signer
|
|
18
|
+
* @param token
|
|
19
|
+
* @param amount
|
|
20
|
+
* @param feeRate
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
23
|
+
private async Withdraw(signer: string, token: string, amount: bigint, feeRate: string): Promise<TransactionRequest> {
|
|
24
|
+
const tx = await this.swapContract.withdraw.populateTransaction(token, amount, signer);
|
|
25
|
+
tx.from = signer;
|
|
26
|
+
tx.gasLimit = BigInt(EVMLpVault.GasCosts.WITHDRAW);
|
|
27
|
+
EVMFees.applyFeeRate(tx, EVMLpVault.GasCosts.WITHDRAW, feeRate);
|
|
28
|
+
return tx;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Action for depositing funds to the LP vault
|
|
33
|
+
*
|
|
34
|
+
* @param signer
|
|
35
|
+
* @param token
|
|
36
|
+
* @param amount
|
|
37
|
+
* @param feeRate
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
40
|
+
private async Deposit(signer: string, token: string, amount: bigint, feeRate: string): Promise<TransactionRequest> {
|
|
41
|
+
const tx = await this.swapContract.deposit.populateTransaction(token, amount, {
|
|
42
|
+
value: token.toLowerCase()===this.root.getNativeCurrencyAddress().toLowerCase() ? amount : 0n
|
|
43
|
+
});
|
|
44
|
+
tx.from = signer;
|
|
45
|
+
EVMFees.applyFeeRate(tx, EVMLpVault.GasCosts.DEPOSIT, feeRate);
|
|
46
|
+
return tx;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns intermediary's reputation & vault balance for a specific token
|
|
51
|
+
*
|
|
52
|
+
* @param address
|
|
53
|
+
* @param token
|
|
54
|
+
*/
|
|
55
|
+
public async getIntermediaryData(address: string, token: string): Promise<{
|
|
56
|
+
balance: bigint,
|
|
57
|
+
reputation: IntermediaryReputationType
|
|
58
|
+
}> {
|
|
59
|
+
const [balance, reputation] = await Promise.all([
|
|
60
|
+
this.getIntermediaryBalance(address, token),
|
|
61
|
+
this.getIntermediaryReputation(address, token)
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
return {balance, reputation};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Returns intermediary's reputation for a specific token
|
|
69
|
+
*
|
|
70
|
+
* @param address
|
|
71
|
+
* @param token
|
|
72
|
+
*/
|
|
73
|
+
public async getIntermediaryReputation(address: string, token: string): Promise<IntermediaryReputationType> {
|
|
74
|
+
const filter = Object.keys(this.contract.claimHandlersByAddress).map(claimHandler => ({owner: address, token, claimHandler}));
|
|
75
|
+
const resp = await this.swapContract.getReputation(filter);
|
|
76
|
+
if(resp.length!==filter.length) throw new Error("getIntermediaryReputation(): Invalid response length");
|
|
77
|
+
|
|
78
|
+
const result: any = {};
|
|
79
|
+
Object.keys(this.contract.claimHandlersByAddress).forEach((address, index) => {
|
|
80
|
+
const handler = this.contract.claimHandlersByAddress[address.toLowerCase()];
|
|
81
|
+
const handlerResp = resp[index];
|
|
82
|
+
result[handler.getType()] = {
|
|
83
|
+
successVolume: handlerResp[0].amount,
|
|
84
|
+
successCount: handlerResp[0].count,
|
|
85
|
+
coopCloseVolume: handlerResp[1].amount,
|
|
86
|
+
coopCloseCount: handlerResp[1].count,
|
|
87
|
+
failVolume: handlerResp[2].amount,
|
|
88
|
+
failCount: handlerResp[2].count,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
return result as any;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Returns the balance of the token an intermediary has in his LP vault
|
|
96
|
+
*
|
|
97
|
+
* @param address
|
|
98
|
+
* @param token
|
|
99
|
+
*/
|
|
100
|
+
public async getIntermediaryBalance(address: string, token: string): Promise<bigint> {
|
|
101
|
+
const [balance] = await this.swapContract.getBalance([{owner: address, token}]);
|
|
102
|
+
|
|
103
|
+
this.logger.debug("getIntermediaryBalance(): token LP balance fetched, token: "+token.toString()+
|
|
104
|
+
" address: "+address+" amount: "+(balance==null ? "null" : balance.toString()));
|
|
105
|
+
|
|
106
|
+
return balance;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Creates transactions for withdrawing funds from the LP vault, creates ATA if it doesn't exist and unwraps
|
|
111
|
+
* WSOL to SOL if required
|
|
112
|
+
*
|
|
113
|
+
* @param signer
|
|
114
|
+
* @param token
|
|
115
|
+
* @param amount
|
|
116
|
+
* @param feeRate
|
|
117
|
+
*/
|
|
118
|
+
public async txsWithdraw(signer: string, token: string, amount: bigint, feeRate?: string): Promise<EVMTx[]> {
|
|
119
|
+
feeRate ??= await this.root.Fees.getFeeRate();
|
|
120
|
+
const withdrawTx = await this.Withdraw(signer, token, amount, feeRate);
|
|
121
|
+
|
|
122
|
+
this.logger.debug("txsWithdraw(): withdraw TX created, token: "+token.toString()+
|
|
123
|
+
" amount: "+amount.toString(10));
|
|
124
|
+
|
|
125
|
+
return [withdrawTx];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Creates transaction for depositing funds into the LP vault, wraps SOL to WSOL if required
|
|
130
|
+
*
|
|
131
|
+
* @param signer
|
|
132
|
+
* @param token
|
|
133
|
+
* @param amount
|
|
134
|
+
* @param feeRate
|
|
135
|
+
*/
|
|
136
|
+
public async txsDeposit(signer: string, token: string, amount: bigint, feeRate?: string): Promise<EVMTx[]> {
|
|
137
|
+
feeRate ??= await this.root.Fees.getFeeRate();
|
|
138
|
+
|
|
139
|
+
const txs: EVMTx[] = [];
|
|
140
|
+
|
|
141
|
+
//Approve first
|
|
142
|
+
if(token.toLowerCase()!==this.root.getNativeCurrencyAddress().toLowerCase()) {
|
|
143
|
+
const approveTx = await this.root.Tokens.checkAndGetApproveTx(signer, token, amount, this.contract.contractAddress, feeRate);
|
|
144
|
+
if(approveTx!=null) txs.push(approveTx);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
txs.push(await this.Deposit(signer, token, amount, feeRate));
|
|
148
|
+
|
|
149
|
+
this.logger.debug("txsDeposit(): deposit TX created, token: "+token.toString()+
|
|
150
|
+
" amount: "+amount.toString(10));
|
|
151
|
+
|
|
152
|
+
return txs;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
155
|
}
|