@atomiqlabs/chain-evm 1.0.0-dev.89 → 1.0.0-dev.93
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 +125 -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 +132 -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 +54 -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 +46 -46
- package/dist/evm/chain/modules/EVMEvents.js +151 -137
- 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 +288 -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 +412 -412
- package/dist/evm/providers/JsonRpcProviderWithRetries.d.ts +16 -16
- package/dist/evm/providers/JsonRpcProviderWithRetries.js +27 -27
- package/dist/evm/providers/ReconnectingWebSocketProvider.d.ts +22 -22
- package/dist/evm/providers/ReconnectingWebSocketProvider.js +91 -91
- package/dist/evm/providers/SocketProvider.d.ts +111 -111
- package/dist/evm/providers/SocketProvider.js +336 -336
- package/dist/evm/providers/WebSocketProviderWithRetries.d.ts +17 -17
- package/dist/evm/providers/WebSocketProviderWithRetries.js +23 -23
- package/dist/evm/spv_swap/EVMSpvVaultContract.d.ts +107 -79
- package/dist/evm/spv_swap/EVMSpvVaultContract.js +578 -482
- package/dist/evm/spv_swap/EVMSpvVaultData.d.ts +40 -39
- package/dist/evm/spv_swap/EVMSpvVaultData.js +184 -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 +199 -193
- package/dist/evm/swaps/EVMSwapContract.js +394 -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 +230 -230
- 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 +19 -19
- package/dist/utils/Utils.js +98 -98
- package/package.json +39 -39
- package/src/chains/botanix/BotanixChainType.ts +28 -28
- package/src/chains/botanix/BotanixInitializer.ts +175 -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 +182 -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 +158 -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 +182 -156
- 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 +327 -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 +533 -533
- package/src/evm/providers/JsonRpcProviderWithRetries.ts +33 -33
- package/src/evm/providers/ReconnectingWebSocketProvider.ts +106 -106
- package/src/evm/providers/SocketProvider.ts +371 -371
- package/src/evm/providers/WebSocketProviderWithRetries.ts +34 -34
- package/src/evm/spv_swap/EVMSpvVaultContract.ts +723 -615
- package/src/evm/spv_swap/EVMSpvVaultData.ts +228 -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 +621 -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 +307 -307
- package/src/evm/wallet/EVMSigner.ts +31 -31
- package/src/index.ts +53 -53
- package/src/utils/Utils.ts +111 -111
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
import {EVMSigner} from "../../wallet/EVMSigner";
|
|
2
|
-
import {EVMModule} from "../EVMModule";
|
|
3
|
-
import {EVMChainInterface} from "../EVMChainInterface";
|
|
4
|
-
import {sha256, verifyTypedData, TypedDataField} from "ethers";
|
|
5
|
-
|
|
6
|
-
const DataHash = [
|
|
7
|
-
{ name: "dataHash", type: "bytes32" }
|
|
8
|
-
];
|
|
9
|
-
|
|
10
|
-
export class EVMSignatures extends EVMModule<any> {
|
|
11
|
-
|
|
12
|
-
private readonly domainName: string;
|
|
13
|
-
|
|
14
|
-
constructor(root: EVMChainInterface<any>, domainName: string = "atomiq.exchange") {
|
|
15
|
-
super(root);
|
|
16
|
-
this.domainName = domainName;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public async signTypedMessage(contract: string, signer: EVMSigner, type: TypedDataField[], typeName: string, message: object): Promise<string> {
|
|
20
|
-
return signer.account.signTypedData({
|
|
21
|
-
name: this.domainName,
|
|
22
|
-
version: "1",
|
|
23
|
-
chainId: BigInt(this.root.evmChainId),
|
|
24
|
-
verifyingContract: contract
|
|
25
|
-
}, {[typeName]: type}, message);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public async isValidSignature(contract: string, signature: string, address: string, type: TypedDataField[], typeName: string, message: object): Promise<boolean> {
|
|
29
|
-
return Promise.resolve(address === verifyTypedData({
|
|
30
|
-
name: this.domainName,
|
|
31
|
-
version: "1",
|
|
32
|
-
chainId: BigInt(this.root.evmChainId),
|
|
33
|
-
verifyingContract: contract
|
|
34
|
-
}, {[typeName]: type}, message, signature));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
///////////////////
|
|
38
|
-
//// Data signatures
|
|
39
|
-
/**
|
|
40
|
-
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
41
|
-
* expose their private key (i.e. backend based, not browser wallet based)
|
|
42
|
-
*
|
|
43
|
-
* @param signer
|
|
44
|
-
* @param data data to sign
|
|
45
|
-
*/
|
|
46
|
-
public getDataSignature(signer: EVMSigner, data: Buffer): Promise<string> {
|
|
47
|
-
return signer.account.signTypedData({
|
|
48
|
-
name: this.domainName,
|
|
49
|
-
version: "1",
|
|
50
|
-
chainId: BigInt(this.root.evmChainId),
|
|
51
|
-
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
52
|
-
}, {DataHash}, {
|
|
53
|
-
dataHash: sha256(data)
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
59
|
-
* sha256 hash of the message)
|
|
60
|
-
*
|
|
61
|
-
* @param data signed data
|
|
62
|
-
* @param signature data signature
|
|
63
|
-
* @param address public key of the signer
|
|
64
|
-
*/
|
|
65
|
-
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
66
|
-
return Promise.resolve(address === verifyTypedData({
|
|
67
|
-
name: this.domainName,
|
|
68
|
-
version: "1",
|
|
69
|
-
chainId: BigInt(this.root.evmChainId),
|
|
70
|
-
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
71
|
-
}, {DataHash}, {
|
|
72
|
-
dataHash: sha256(data)
|
|
73
|
-
}, signature));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|
|
1
|
+
import {EVMSigner} from "../../wallet/EVMSigner";
|
|
2
|
+
import {EVMModule} from "../EVMModule";
|
|
3
|
+
import {EVMChainInterface} from "../EVMChainInterface";
|
|
4
|
+
import {sha256, verifyTypedData, TypedDataField} from "ethers";
|
|
5
|
+
|
|
6
|
+
const DataHash = [
|
|
7
|
+
{ name: "dataHash", type: "bytes32" }
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export class EVMSignatures extends EVMModule<any> {
|
|
11
|
+
|
|
12
|
+
private readonly domainName: string;
|
|
13
|
+
|
|
14
|
+
constructor(root: EVMChainInterface<any>, domainName: string = "atomiq.exchange") {
|
|
15
|
+
super(root);
|
|
16
|
+
this.domainName = domainName;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public async signTypedMessage(contract: string, signer: EVMSigner, type: TypedDataField[], typeName: string, message: object): Promise<string> {
|
|
20
|
+
return signer.account.signTypedData({
|
|
21
|
+
name: this.domainName,
|
|
22
|
+
version: "1",
|
|
23
|
+
chainId: BigInt(this.root.evmChainId),
|
|
24
|
+
verifyingContract: contract
|
|
25
|
+
}, {[typeName]: type}, message);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public async isValidSignature(contract: string, signature: string, address: string, type: TypedDataField[], typeName: string, message: object): Promise<boolean> {
|
|
29
|
+
return Promise.resolve(address === verifyTypedData({
|
|
30
|
+
name: this.domainName,
|
|
31
|
+
version: "1",
|
|
32
|
+
chainId: BigInt(this.root.evmChainId),
|
|
33
|
+
verifyingContract: contract
|
|
34
|
+
}, {[typeName]: type}, message, signature));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
///////////////////
|
|
38
|
+
//// Data signatures
|
|
39
|
+
/**
|
|
40
|
+
* Produces a signature over the sha256 of a specified data Buffer, only works with providers which
|
|
41
|
+
* expose their private key (i.e. backend based, not browser wallet based)
|
|
42
|
+
*
|
|
43
|
+
* @param signer
|
|
44
|
+
* @param data data to sign
|
|
45
|
+
*/
|
|
46
|
+
public getDataSignature(signer: EVMSigner, data: Buffer): Promise<string> {
|
|
47
|
+
return signer.account.signTypedData({
|
|
48
|
+
name: this.domainName,
|
|
49
|
+
version: "1",
|
|
50
|
+
chainId: BigInt(this.root.evmChainId),
|
|
51
|
+
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
52
|
+
}, {DataHash}, {
|
|
53
|
+
dataHash: sha256(data)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Checks whether a signature is a valid signature produced by the account over a data message (computes
|
|
59
|
+
* sha256 hash of the message)
|
|
60
|
+
*
|
|
61
|
+
* @param data signed data
|
|
62
|
+
* @param signature data signature
|
|
63
|
+
* @param address public key of the signer
|
|
64
|
+
*/
|
|
65
|
+
public isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean> {
|
|
66
|
+
return Promise.resolve(address === verifyTypedData({
|
|
67
|
+
name: this.domainName,
|
|
68
|
+
version: "1",
|
|
69
|
+
chainId: BigInt(this.root.evmChainId),
|
|
70
|
+
verifyingContract: "0x0000000000000000000000000000000000000000"
|
|
71
|
+
}, {DataHash}, {
|
|
72
|
+
dataHash: sha256(data)
|
|
73
|
+
}, signature));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
}
|
|
@@ -1,155 +1,155 @@
|
|
|
1
|
-
import {EVMModule} from "../EVMModule";
|
|
2
|
-
import {Contract, TransactionRequest} from "ethers";
|
|
3
|
-
import {ERC20Abi} from "./ERC20Abi";
|
|
4
|
-
import {EVMAddresses} from "./EVMAddresses";
|
|
5
|
-
import {EVMFees} from "./EVMFees";
|
|
6
|
-
import {EVMSwapData} from "../../swaps/EVMSwapData";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export class EVMTokens extends EVMModule<any> {
|
|
10
|
-
|
|
11
|
-
public static readonly ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
12
|
-
|
|
13
|
-
public static readonly GasCosts = {
|
|
14
|
-
TRANSFER: 80_000 + 21_000,
|
|
15
|
-
APPROVE: 80_000 + 21_000
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
private getContract(address: string) {
|
|
19
|
-
return new Contract(address, ERC20Abi, this.root.provider);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
///////////////////
|
|
23
|
-
//// Tokens
|
|
24
|
-
/**
|
|
25
|
-
* Checks if the provided string is a valid starknet token
|
|
26
|
-
*
|
|
27
|
-
* @param token
|
|
28
|
-
*/
|
|
29
|
-
public isValidToken(token: string) {
|
|
30
|
-
return EVMAddresses.isValidAddress(token);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Returns the token balance of the address
|
|
35
|
-
*
|
|
36
|
-
* @param address
|
|
37
|
-
* @param token
|
|
38
|
-
*/
|
|
39
|
-
public async getTokenBalance(address: string, token: string): Promise<bigint> {
|
|
40
|
-
let balance: bigint;
|
|
41
|
-
if(token === "0x0000000000000000000000000000000000000000") {
|
|
42
|
-
balance = await this.provider.getBalance(address);
|
|
43
|
-
} else {
|
|
44
|
-
const erc20 = this.getContract(token);
|
|
45
|
-
balance = await erc20.balanceOf(address);
|
|
46
|
-
}
|
|
47
|
-
this.logger.debug("getTokenBalance(): token balance fetched, token: "+token+
|
|
48
|
-
" address: "+address+" amount: "+balance.toString(10));
|
|
49
|
-
|
|
50
|
-
return balance;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Returns the authorized allowance of specific address towards a spender contract
|
|
55
|
-
*
|
|
56
|
-
* @param spender A contract trying to spend user's erc20 balance
|
|
57
|
-
* @param address Wallet address
|
|
58
|
-
* @param token ERC-20 token
|
|
59
|
-
*/
|
|
60
|
-
public async getTokenAllowance(spender: string, address: string, token: string): Promise<bigint> {
|
|
61
|
-
if(token === "0x0000000000000000000000000000000000000000") return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;
|
|
62
|
-
const erc20 = this.getContract(token);
|
|
63
|
-
return await erc20.allowance(address, spender);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Returns the native currency address
|
|
68
|
-
*/
|
|
69
|
-
public getNativeCurrencyAddress(): string {
|
|
70
|
-
return "0x0000000000000000000000000000000000000000";
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
///////////////////
|
|
74
|
-
//// Transfers
|
|
75
|
-
/**
|
|
76
|
-
* Creates transactions for sending the over the tokens
|
|
77
|
-
*
|
|
78
|
-
* @param signer
|
|
79
|
-
* @param token token to send
|
|
80
|
-
* @param amount amount of the token to send
|
|
81
|
-
* @param recipient recipient's address
|
|
82
|
-
* @param feeRate fee rate to use for the transactions
|
|
83
|
-
* @private
|
|
84
|
-
*/
|
|
85
|
-
public async Transfer(signer: string, token: string, amount: bigint, recipient: string, feeRate?: string): Promise<TransactionRequest> {
|
|
86
|
-
let tx: TransactionRequest;
|
|
87
|
-
if(token===this.getNativeCurrencyAddress()) {
|
|
88
|
-
tx = {
|
|
89
|
-
to: recipient,
|
|
90
|
-
value: amount
|
|
91
|
-
};
|
|
92
|
-
} else {
|
|
93
|
-
tx = await this.getContract(token).transfer.populateTransaction(recipient, amount);
|
|
94
|
-
}
|
|
95
|
-
tx.from = signer;
|
|
96
|
-
EVMFees.applyFeeRate(tx, EVMTokens.GasCosts.TRANSFER, feeRate ?? await this.root.Fees.getFeeRate());
|
|
97
|
-
|
|
98
|
-
this.logger.debug("txsTransfer(): transfer TX created, recipient: "+recipient.toString()+
|
|
99
|
-
" token: "+token.toString()+ " amount: "+amount.toString(10));
|
|
100
|
-
|
|
101
|
-
return tx;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
///////////////////
|
|
105
|
-
//// Approval
|
|
106
|
-
/**
|
|
107
|
-
* Creates transactions for approving spending of tokens
|
|
108
|
-
*
|
|
109
|
-
* @param signer
|
|
110
|
-
* @param token token to send
|
|
111
|
-
* @param amount amount of the token to send
|
|
112
|
-
* @param spender recipient's address
|
|
113
|
-
* @param feeRate fee rate to use for the transactions
|
|
114
|
-
* @private
|
|
115
|
-
*/
|
|
116
|
-
public async Approve(signer: string, token: string, amount: bigint, spender: string, feeRate?: string): Promise<TransactionRequest> {
|
|
117
|
-
if(token===this.getNativeCurrencyAddress()) return null;
|
|
118
|
-
|
|
119
|
-
const tx = await this.getContract(token).approve.populateTransaction(spender, amount);
|
|
120
|
-
tx.from = signer;
|
|
121
|
-
EVMFees.applyFeeRate(tx, EVMTokens.GasCosts.APPROVE, feeRate ?? await this.root.Fees.getFeeRate());
|
|
122
|
-
|
|
123
|
-
this.logger.debug("txsTransfer(): approve TX created, spender: "+spender.toString()+
|
|
124
|
-
" token: "+token.toString()+ " amount: "+amount.toString(10));
|
|
125
|
-
|
|
126
|
-
return tx;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Checks whether an approve transaction is required for a given token and either returns the tx
|
|
131
|
-
* or null in case the approve is not required
|
|
132
|
-
*
|
|
133
|
-
* @param signer
|
|
134
|
-
* @param token token to approve for
|
|
135
|
-
* @param amount amount of the token to send
|
|
136
|
-
* @param spender spending contract address
|
|
137
|
-
* @param feeRate fee rate to use for the transactions
|
|
138
|
-
*/
|
|
139
|
-
public async checkAndGetApproveTx(signer: string, token: string, amount: bigint, spender: string, feeRate?: string): Promise<TransactionRequest | null> {
|
|
140
|
-
const alreadyApproved = await this.getTokenAllowance(spender, signer, token);
|
|
141
|
-
if(alreadyApproved >= amount) return null;
|
|
142
|
-
return await this.Approve(signer, token, amount, spender, feeRate);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async getApproveFee(feeRate?: string): Promise<bigint> {
|
|
146
|
-
feeRate ??= await this.root.Fees.getFeeRate();
|
|
147
|
-
return EVMFees.getGasFee(EVMTokens.GasCosts.APPROVE, feeRate);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async getTransferFee(feeRate?: string): Promise<bigint> {
|
|
151
|
-
feeRate ??= await this.root.Fees.getFeeRate();
|
|
152
|
-
return EVMFees.getGasFee(EVMTokens.GasCosts.APPROVE, feeRate);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
}
|
|
1
|
+
import {EVMModule} from "../EVMModule";
|
|
2
|
+
import {Contract, TransactionRequest} from "ethers";
|
|
3
|
+
import {ERC20Abi} from "./ERC20Abi";
|
|
4
|
+
import {EVMAddresses} from "./EVMAddresses";
|
|
5
|
+
import {EVMFees} from "./EVMFees";
|
|
6
|
+
import {EVMSwapData} from "../../swaps/EVMSwapData";
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export class EVMTokens extends EVMModule<any> {
|
|
10
|
+
|
|
11
|
+
public static readonly ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
12
|
+
|
|
13
|
+
public static readonly GasCosts = {
|
|
14
|
+
TRANSFER: 80_000 + 21_000,
|
|
15
|
+
APPROVE: 80_000 + 21_000
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
private getContract(address: string) {
|
|
19
|
+
return new Contract(address, ERC20Abi, this.root.provider);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
///////////////////
|
|
23
|
+
//// Tokens
|
|
24
|
+
/**
|
|
25
|
+
* Checks if the provided string is a valid starknet token
|
|
26
|
+
*
|
|
27
|
+
* @param token
|
|
28
|
+
*/
|
|
29
|
+
public isValidToken(token: string) {
|
|
30
|
+
return EVMAddresses.isValidAddress(token);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Returns the token balance of the address
|
|
35
|
+
*
|
|
36
|
+
* @param address
|
|
37
|
+
* @param token
|
|
38
|
+
*/
|
|
39
|
+
public async getTokenBalance(address: string, token: string): Promise<bigint> {
|
|
40
|
+
let balance: bigint;
|
|
41
|
+
if(token === "0x0000000000000000000000000000000000000000") {
|
|
42
|
+
balance = await this.provider.getBalance(address);
|
|
43
|
+
} else {
|
|
44
|
+
const erc20 = this.getContract(token);
|
|
45
|
+
balance = await erc20.balanceOf(address);
|
|
46
|
+
}
|
|
47
|
+
this.logger.debug("getTokenBalance(): token balance fetched, token: "+token+
|
|
48
|
+
" address: "+address+" amount: "+balance.toString(10));
|
|
49
|
+
|
|
50
|
+
return balance;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Returns the authorized allowance of specific address towards a spender contract
|
|
55
|
+
*
|
|
56
|
+
* @param spender A contract trying to spend user's erc20 balance
|
|
57
|
+
* @param address Wallet address
|
|
58
|
+
* @param token ERC-20 token
|
|
59
|
+
*/
|
|
60
|
+
public async getTokenAllowance(spender: string, address: string, token: string): Promise<bigint> {
|
|
61
|
+
if(token === "0x0000000000000000000000000000000000000000") return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;
|
|
62
|
+
const erc20 = this.getContract(token);
|
|
63
|
+
return await erc20.allowance(address, spender);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Returns the native currency address
|
|
68
|
+
*/
|
|
69
|
+
public getNativeCurrencyAddress(): string {
|
|
70
|
+
return "0x0000000000000000000000000000000000000000";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
///////////////////
|
|
74
|
+
//// Transfers
|
|
75
|
+
/**
|
|
76
|
+
* Creates transactions for sending the over the tokens
|
|
77
|
+
*
|
|
78
|
+
* @param signer
|
|
79
|
+
* @param token token to send
|
|
80
|
+
* @param amount amount of the token to send
|
|
81
|
+
* @param recipient recipient's address
|
|
82
|
+
* @param feeRate fee rate to use for the transactions
|
|
83
|
+
* @private
|
|
84
|
+
*/
|
|
85
|
+
public async Transfer(signer: string, token: string, amount: bigint, recipient: string, feeRate?: string): Promise<TransactionRequest> {
|
|
86
|
+
let tx: TransactionRequest;
|
|
87
|
+
if(token===this.getNativeCurrencyAddress()) {
|
|
88
|
+
tx = {
|
|
89
|
+
to: recipient,
|
|
90
|
+
value: amount
|
|
91
|
+
};
|
|
92
|
+
} else {
|
|
93
|
+
tx = await this.getContract(token).transfer.populateTransaction(recipient, amount);
|
|
94
|
+
}
|
|
95
|
+
tx.from = signer;
|
|
96
|
+
EVMFees.applyFeeRate(tx, EVMTokens.GasCosts.TRANSFER, feeRate ?? await this.root.Fees.getFeeRate());
|
|
97
|
+
|
|
98
|
+
this.logger.debug("txsTransfer(): transfer TX created, recipient: "+recipient.toString()+
|
|
99
|
+
" token: "+token.toString()+ " amount: "+amount.toString(10));
|
|
100
|
+
|
|
101
|
+
return tx;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
///////////////////
|
|
105
|
+
//// Approval
|
|
106
|
+
/**
|
|
107
|
+
* Creates transactions for approving spending of tokens
|
|
108
|
+
*
|
|
109
|
+
* @param signer
|
|
110
|
+
* @param token token to send
|
|
111
|
+
* @param amount amount of the token to send
|
|
112
|
+
* @param spender recipient's address
|
|
113
|
+
* @param feeRate fee rate to use for the transactions
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
public async Approve(signer: string, token: string, amount: bigint, spender: string, feeRate?: string): Promise<TransactionRequest> {
|
|
117
|
+
if(token===this.getNativeCurrencyAddress()) return null;
|
|
118
|
+
|
|
119
|
+
const tx = await this.getContract(token).approve.populateTransaction(spender, amount);
|
|
120
|
+
tx.from = signer;
|
|
121
|
+
EVMFees.applyFeeRate(tx, EVMTokens.GasCosts.APPROVE, feeRate ?? await this.root.Fees.getFeeRate());
|
|
122
|
+
|
|
123
|
+
this.logger.debug("txsTransfer(): approve TX created, spender: "+spender.toString()+
|
|
124
|
+
" token: "+token.toString()+ " amount: "+amount.toString(10));
|
|
125
|
+
|
|
126
|
+
return tx;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Checks whether an approve transaction is required for a given token and either returns the tx
|
|
131
|
+
* or null in case the approve is not required
|
|
132
|
+
*
|
|
133
|
+
* @param signer
|
|
134
|
+
* @param token token to approve for
|
|
135
|
+
* @param amount amount of the token to send
|
|
136
|
+
* @param spender spending contract address
|
|
137
|
+
* @param feeRate fee rate to use for the transactions
|
|
138
|
+
*/
|
|
139
|
+
public async checkAndGetApproveTx(signer: string, token: string, amount: bigint, spender: string, feeRate?: string): Promise<TransactionRequest | null> {
|
|
140
|
+
const alreadyApproved = await this.getTokenAllowance(spender, signer, token);
|
|
141
|
+
if(alreadyApproved >= amount) return null;
|
|
142
|
+
return await this.Approve(signer, token, amount, spender, feeRate);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async getApproveFee(feeRate?: string): Promise<bigint> {
|
|
146
|
+
feeRate ??= await this.root.Fees.getFeeRate();
|
|
147
|
+
return EVMFees.getGasFee(EVMTokens.GasCosts.APPROVE, feeRate);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async getTransferFee(feeRate?: string): Promise<bigint> {
|
|
151
|
+
feeRate ??= await this.root.Fees.getFeeRate();
|
|
152
|
+
return EVMFees.getGasFee(EVMTokens.GasCosts.APPROVE, feeRate);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
}
|