@atomiqlabs/chain-starknet 1.0.0-beta.0

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.
Files changed (136) hide show
  1. package/LICENSE +201 -0
  2. package/dist/get_serialized_block.d.ts +1 -0
  3. package/dist/get_serialized_block.js +28 -0
  4. package/dist/index.d.ts +34 -0
  5. package/dist/index.js +50 -0
  6. package/dist/starknet/StarknetChainType.d.ts +9 -0
  7. package/dist/starknet/StarknetChainType.js +2 -0
  8. package/dist/starknet/StarknetInitializer.d.ts +18 -0
  9. package/dist/starknet/StarknetInitializer.js +49 -0
  10. package/dist/starknet/base/StarknetAction.d.ts +27 -0
  11. package/dist/starknet/base/StarknetAction.js +73 -0
  12. package/dist/starknet/base/StarknetBase.d.ts +34 -0
  13. package/dist/starknet/base/StarknetBase.js +29 -0
  14. package/dist/starknet/base/StarknetModule.d.ts +14 -0
  15. package/dist/starknet/base/StarknetModule.js +13 -0
  16. package/dist/starknet/base/modules/ERC20Abi.d.ts +755 -0
  17. package/dist/starknet/base/modules/ERC20Abi.js +1032 -0
  18. package/dist/starknet/base/modules/StarknetAccounts.d.ts +6 -0
  19. package/dist/starknet/base/modules/StarknetAccounts.js +24 -0
  20. package/dist/starknet/base/modules/StarknetAddresses.d.ts +9 -0
  21. package/dist/starknet/base/modules/StarknetAddresses.js +26 -0
  22. package/dist/starknet/base/modules/StarknetBlocks.d.ts +19 -0
  23. package/dist/starknet/base/modules/StarknetBlocks.js +49 -0
  24. package/dist/starknet/base/modules/StarknetEvents.d.ts +44 -0
  25. package/dist/starknet/base/modules/StarknetEvents.js +88 -0
  26. package/dist/starknet/base/modules/StarknetFees.d.ts +55 -0
  27. package/dist/starknet/base/modules/StarknetFees.js +102 -0
  28. package/dist/starknet/base/modules/StarknetSignatures.d.ts +30 -0
  29. package/dist/starknet/base/modules/StarknetSignatures.js +71 -0
  30. package/dist/starknet/base/modules/StarknetTokens.d.ts +67 -0
  31. package/dist/starknet/base/modules/StarknetTokens.js +97 -0
  32. package/dist/starknet/base/modules/StarknetTransactions.d.ts +87 -0
  33. package/dist/starknet/base/modules/StarknetTransactions.js +226 -0
  34. package/dist/starknet/btcrelay/BtcRelayAbi.d.ts +250 -0
  35. package/dist/starknet/btcrelay/BtcRelayAbi.js +341 -0
  36. package/dist/starknet/btcrelay/StarknetBtcRelay.d.ts +166 -0
  37. package/dist/starknet/btcrelay/StarknetBtcRelay.js +323 -0
  38. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.d.ts +32 -0
  39. package/dist/starknet/btcrelay/headers/StarknetBtcHeader.js +74 -0
  40. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.d.ts +52 -0
  41. package/dist/starknet/btcrelay/headers/StarknetBtcStoredHeader.js +113 -0
  42. package/dist/starknet/contract/StarknetContractBase.d.ts +13 -0
  43. package/dist/starknet/contract/StarknetContractBase.js +18 -0
  44. package/dist/starknet/contract/modules/StarknetContractEvents.d.ts +40 -0
  45. package/dist/starknet/contract/modules/StarknetContractEvents.js +77 -0
  46. package/dist/starknet/events/StarknetChainEvents.d.ts +19 -0
  47. package/dist/starknet/events/StarknetChainEvents.js +51 -0
  48. package/dist/starknet/events/StarknetChainEventsBrowser.d.ts +73 -0
  49. package/dist/starknet/events/StarknetChainEventsBrowser.js +210 -0
  50. package/dist/starknet/swaps/EscrowManagerAbi.d.ts +445 -0
  51. package/dist/starknet/swaps/EscrowManagerAbi.js +601 -0
  52. package/dist/starknet/swaps/StarknetSwapContract.d.ts +215 -0
  53. package/dist/starknet/swaps/StarknetSwapContract.js +452 -0
  54. package/dist/starknet/swaps/StarknetSwapData.d.ts +74 -0
  55. package/dist/starknet/swaps/StarknetSwapData.js +316 -0
  56. package/dist/starknet/swaps/StarknetSwapModule.d.ts +9 -0
  57. package/dist/starknet/swaps/StarknetSwapModule.js +12 -0
  58. package/dist/starknet/swaps/handlers/IHandler.d.ts +13 -0
  59. package/dist/starknet/swaps/handlers/IHandler.js +2 -0
  60. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.d.ts +13 -0
  61. package/dist/starknet/swaps/handlers/claim/ClaimHandlers.js +13 -0
  62. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.d.ts +22 -0
  63. package/dist/starknet/swaps/handlers/claim/HashlockClaimHandler.js +44 -0
  64. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.d.ts +25 -0
  65. package/dist/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.js +48 -0
  66. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.d.ts +26 -0
  67. package/dist/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.js +40 -0
  68. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.d.ts +20 -0
  69. package/dist/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.js +29 -0
  70. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.d.ts +64 -0
  71. package/dist/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.js +86 -0
  72. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.d.ts +17 -0
  73. package/dist/starknet/swaps/handlers/refund/TimelockRefundHandler.js +27 -0
  74. package/dist/starknet/swaps/modules/StarknetLpVault.d.ts +69 -0
  75. package/dist/starknet/swaps/modules/StarknetLpVault.js +122 -0
  76. package/dist/starknet/swaps/modules/StarknetSwapClaim.d.ts +53 -0
  77. package/dist/starknet/swaps/modules/StarknetSwapClaim.js +100 -0
  78. package/dist/starknet/swaps/modules/StarknetSwapInit.d.ts +84 -0
  79. package/dist/starknet/swaps/modules/StarknetSwapInit.js +164 -0
  80. package/dist/starknet/swaps/modules/StarknetSwapRefund.d.ts +64 -0
  81. package/dist/starknet/swaps/modules/StarknetSwapRefund.js +131 -0
  82. package/dist/starknet/swaps/modules/SwapClaim.d.ts +54 -0
  83. package/dist/starknet/swaps/modules/SwapClaim.js +115 -0
  84. package/dist/starknet/swaps/modules/SwapInit.d.ts +79 -0
  85. package/dist/starknet/swaps/modules/SwapInit.js +174 -0
  86. package/dist/starknet/swaps/modules/SwapRefund.d.ts +63 -0
  87. package/dist/starknet/swaps/modules/SwapRefund.js +149 -0
  88. package/dist/starknet/wallet/StarknetKeypairWallet.d.ts +6 -0
  89. package/dist/starknet/wallet/StarknetKeypairWallet.js +26 -0
  90. package/dist/starknet/wallet/StarknetSigner.d.ts +12 -0
  91. package/dist/starknet/wallet/StarknetSigner.js +46 -0
  92. package/dist/utils/Utils.d.ts +38 -0
  93. package/dist/utils/Utils.js +255 -0
  94. package/package.json +39 -0
  95. package/src/index.ts +41 -0
  96. package/src/starknet/StarknetChainType.ts +20 -0
  97. package/src/starknet/StarknetInitializer.ts +75 -0
  98. package/src/starknet/base/StarknetAction.ts +90 -0
  99. package/src/starknet/base/StarknetBase.ts +56 -0
  100. package/src/starknet/base/StarknetModule.ts +20 -0
  101. package/src/starknet/base/modules/ERC20Abi.ts +1029 -0
  102. package/src/starknet/base/modules/StarknetAccounts.ts +26 -0
  103. package/src/starknet/base/modules/StarknetAddresses.ts +23 -0
  104. package/src/starknet/base/modules/StarknetBlocks.ts +59 -0
  105. package/src/starknet/base/modules/StarknetEvents.ts +105 -0
  106. package/src/starknet/base/modules/StarknetFees.ts +136 -0
  107. package/src/starknet/base/modules/StarknetSignatures.ts +91 -0
  108. package/src/starknet/base/modules/StarknetTokens.ts +116 -0
  109. package/src/starknet/base/modules/StarknetTransactions.ts +254 -0
  110. package/src/starknet/btcrelay/BtcRelayAbi.ts +338 -0
  111. package/src/starknet/btcrelay/StarknetBtcRelay.ts +415 -0
  112. package/src/starknet/btcrelay/headers/StarknetBtcHeader.ts +101 -0
  113. package/src/starknet/btcrelay/headers/StarknetBtcStoredHeader.ts +142 -0
  114. package/src/starknet/contract/StarknetContractBase.ts +29 -0
  115. package/src/starknet/contract/modules/StarknetContractEvents.ts +108 -0
  116. package/src/starknet/events/StarknetChainEvents.ts +63 -0
  117. package/src/starknet/events/StarknetChainEventsBrowser.ts +289 -0
  118. package/src/starknet/swaps/EscrowManagerAbi.ts +600 -0
  119. package/src/starknet/swaps/StarknetSwapContract.ts +694 -0
  120. package/src/starknet/swaps/StarknetSwapData.ts +441 -0
  121. package/src/starknet/swaps/StarknetSwapModule.ts +17 -0
  122. package/src/starknet/swaps/handlers/IHandler.ts +20 -0
  123. package/src/starknet/swaps/handlers/claim/ClaimHandlers.ts +23 -0
  124. package/src/starknet/swaps/handlers/claim/HashlockClaimHandler.ts +54 -0
  125. package/src/starknet/swaps/handlers/claim/btc/BitcoinNoncedOutputClaimHandler.ts +73 -0
  126. package/src/starknet/swaps/handlers/claim/btc/BitcoinOutputClaimHandler.ts +67 -0
  127. package/src/starknet/swaps/handlers/claim/btc/BitcoinTxIdClaimHandler.ts +49 -0
  128. package/src/starknet/swaps/handlers/claim/btc/IBitcoinClaimHandler.ts +151 -0
  129. package/src/starknet/swaps/handlers/refund/TimelockRefundHandler.ts +39 -0
  130. package/src/starknet/swaps/modules/StarknetLpVault.ts +148 -0
  131. package/src/starknet/swaps/modules/StarknetSwapClaim.ts +142 -0
  132. package/src/starknet/swaps/modules/StarknetSwapInit.ts +226 -0
  133. package/src/starknet/swaps/modules/StarknetSwapRefund.ts +202 -0
  134. package/src/starknet/wallet/StarknetKeypairWallet.ts +34 -0
  135. package/src/starknet/wallet/StarknetSigner.ts +55 -0
  136. package/src/utils/Utils.ts +247 -0
@@ -0,0 +1,6 @@
1
+ import { StarknetModule } from "../StarknetModule";
2
+ import { StarknetTx } from "./StarknetTransactions";
3
+ import { DeployAccountContractPayload } from "starknet";
4
+ export declare class StarknetAccounts extends StarknetModule {
5
+ getAccountDeployTransaction(deploymentData: DeployAccountContractPayload): Promise<StarknetTx>;
6
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetAccounts = void 0;
4
+ const StarknetModule_1 = require("../StarknetModule");
5
+ class StarknetAccounts extends StarknetModule_1.StarknetModule {
6
+ async getAccountDeployTransaction(deploymentData) {
7
+ const feeDetails = this.root.Fees.getFeeDetails(5000, 0, await this.root.Fees.getFeeRate());
8
+ const details = {
9
+ ...feeDetails,
10
+ walletAddress: deploymentData.contractAddress,
11
+ cairoVersion: "1",
12
+ chainId: this.root.starknetChainId,
13
+ nonce: 0,
14
+ accountDeploymentData: [],
15
+ skipValidate: false
16
+ };
17
+ return {
18
+ type: "DEPLOY_ACCOUNT",
19
+ tx: deploymentData,
20
+ details
21
+ };
22
+ }
23
+ }
24
+ exports.StarknetAccounts = StarknetAccounts;
@@ -0,0 +1,9 @@
1
+ import { StarknetModule } from "../StarknetModule";
2
+ export declare class StarknetAddresses extends StarknetModule {
3
+ /**
4
+ * Checks whether an address is a valid starknet address
5
+ *
6
+ * @param value
7
+ */
8
+ isValidAddress(value: string): boolean;
9
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetAddresses = void 0;
4
+ const StarknetModule_1 = require("../StarknetModule");
5
+ const starknet_1 = require("starknet");
6
+ class StarknetAddresses extends StarknetModule_1.StarknetModule {
7
+ ///////////////////
8
+ //// Address utils
9
+ /**
10
+ * Checks whether an address is a valid starknet address
11
+ *
12
+ * @param value
13
+ */
14
+ isValidAddress(value) {
15
+ if (value.length !== 66)
16
+ return false;
17
+ try {
18
+ (0, starknet_1.validateAndParseAddress)(value);
19
+ return true;
20
+ }
21
+ catch (e) {
22
+ return false;
23
+ }
24
+ }
25
+ }
26
+ exports.StarknetAddresses = StarknetAddresses;
@@ -0,0 +1,19 @@
1
+ import { StarknetModule } from "../StarknetModule";
2
+ export type StarknetBlockTag = "pending" | "latest";
3
+ export declare class StarknetBlocks extends StarknetModule {
4
+ private BLOCK_CACHE_TIME;
5
+ private blockCache;
6
+ /**
7
+ * Initiates fetch of a given block & saves it to cache
8
+ *
9
+ * @private
10
+ * @param blockTag
11
+ */
12
+ private fetchAndSaveBlockTime;
13
+ /**
14
+ * Gets the block for a given blocktag, with caching
15
+ *
16
+ * @param blockTag
17
+ */
18
+ getBlockTime(blockTag: StarknetBlockTag): Promise<number>;
19
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetBlocks = void 0;
4
+ const StarknetModule_1 = require("../StarknetModule");
5
+ class StarknetBlocks extends StarknetModule_1.StarknetModule {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.BLOCK_CACHE_TIME = 5 * 1000;
9
+ this.blockCache = {};
10
+ }
11
+ /**
12
+ * Initiates fetch of a given block & saves it to cache
13
+ *
14
+ * @private
15
+ * @param blockTag
16
+ */
17
+ fetchAndSaveBlockTime(blockTag) {
18
+ const blockTimePromise = this.provider.getBlockWithTxHashes(blockTag).then(result => result.timestamp);
19
+ const timestamp = Date.now();
20
+ this.blockCache[blockTag] = {
21
+ blockTime: blockTimePromise,
22
+ timestamp
23
+ };
24
+ blockTimePromise.catch(e => {
25
+ if (this.blockCache[blockTag] != null && this.blockCache[blockTag].blockTime === blockTimePromise)
26
+ delete this.blockCache[blockTag];
27
+ throw e;
28
+ });
29
+ return {
30
+ blockTime: blockTimePromise,
31
+ timestamp
32
+ };
33
+ }
34
+ ///////////////////
35
+ //// Slots
36
+ /**
37
+ * Gets the block for a given blocktag, with caching
38
+ *
39
+ * @param blockTag
40
+ */
41
+ getBlockTime(blockTag) {
42
+ let cachedBlockData = this.blockCache[blockTag];
43
+ if (cachedBlockData == null || Date.now() - cachedBlockData.timestamp > this.BLOCK_CACHE_TIME) {
44
+ cachedBlockData = this.fetchAndSaveBlockTime(blockTag);
45
+ }
46
+ return cachedBlockData.blockTime;
47
+ }
48
+ }
49
+ exports.StarknetBlocks = StarknetBlocks;
@@ -0,0 +1,44 @@
1
+ import { StarknetModule } from "../StarknetModule";
2
+ export type StarknetEvent = {
3
+ block_hash: string;
4
+ block_number: number;
5
+ transaction_hash: string;
6
+ from_address: string;
7
+ keys: string[];
8
+ data: string[];
9
+ };
10
+ export declare class StarknetEvents extends StarknetModule {
11
+ readonly EVENTS_LIMIT = 100;
12
+ readonly FORWARD_BLOCK_RANGE = 2000;
13
+ /**
14
+ * Returns the all the events occuring in a block range as identified by the contract and keys
15
+ *
16
+ * @param contract
17
+ * @param keys
18
+ * @param startBlock
19
+ * @param endBlock
20
+ * @param abortSignal
21
+ */
22
+ getBlockEvents(contract: string, keys: string[][], startBlock?: number, endBlock?: number, abortSignal?: AbortSignal): Promise<StarknetEvent[]>;
23
+ /**
24
+ * Runs a search backwards in time, processing events from a specific contract and keys
25
+ *
26
+ * @param contract
27
+ * @param keys
28
+ * @param processor called for every batch of returned signatures, should return a value if the correct signature
29
+ * was found, or null if the search should continue
30
+ * @param abortSignal
31
+ */
32
+ findInEvents<T>(contract: string, keys: string[][], processor: (signatures: StarknetEvent[]) => Promise<T>, abortSignal?: AbortSignal): Promise<T>;
33
+ /**
34
+ * Runs a search forwards in time, processing events from a specific contract and keys
35
+ *
36
+ * @param contract
37
+ * @param keys
38
+ * @param processor called for every batch of returned signatures, should return a value if the correct signature
39
+ * was found, or null if the search should continue
40
+ * @param abortSignal
41
+ * @param logFetchLimit
42
+ */
43
+ findInEventsForward<T>(contract: string, keys: string[][], processor: (signatures: StarknetEvent[]) => Promise<T>, abortSignal?: AbortSignal, logFetchLimit?: number): Promise<T>;
44
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetEvents = void 0;
4
+ const StarknetModule_1 = require("../StarknetModule");
5
+ class StarknetEvents extends StarknetModule_1.StarknetModule {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.EVENTS_LIMIT = 100;
9
+ this.FORWARD_BLOCK_RANGE = 2000;
10
+ }
11
+ /**
12
+ * Returns the all the events occuring in a block range as identified by the contract and keys
13
+ *
14
+ * @param contract
15
+ * @param keys
16
+ * @param startBlock
17
+ * @param endBlock
18
+ * @param abortSignal
19
+ */
20
+ async getBlockEvents(contract, keys, startBlock, endBlock = startBlock, abortSignal) {
21
+ const events = [];
22
+ let result = null;
23
+ while (result == null || result?.continuation_token != null) {
24
+ result = await this.root.provider.getEvents({
25
+ address: contract,
26
+ from_block: startBlock == null ? "pending" : { block_number: startBlock },
27
+ to_block: endBlock == null ? "pending" : { block_number: endBlock },
28
+ keys,
29
+ chunk_size: this.EVENTS_LIMIT,
30
+ continuation_token: result?.continuation_token
31
+ });
32
+ if (abortSignal != null)
33
+ abortSignal.throwIfAborted();
34
+ events.push(...result.events);
35
+ }
36
+ return events;
37
+ }
38
+ /**
39
+ * Runs a search backwards in time, processing events from a specific contract and keys
40
+ *
41
+ * @param contract
42
+ * @param keys
43
+ * @param processor called for every batch of returned signatures, should return a value if the correct signature
44
+ * was found, or null if the search should continue
45
+ * @param abortSignal
46
+ */
47
+ async findInEvents(contract, keys, processor, abortSignal) {
48
+ const latestBlockNumber = await this.provider.getBlockNumber();
49
+ for (let blockNumber = latestBlockNumber; blockNumber >= 0; blockNumber -= this.FORWARD_BLOCK_RANGE) {
50
+ const eventsResult = await this.getBlockEvents(contract, keys, Math.max(blockNumber - this.FORWARD_BLOCK_RANGE, 0), blockNumber === latestBlockNumber ? null : blockNumber, abortSignal);
51
+ const result = await processor(eventsResult.reverse());
52
+ if (result != null)
53
+ return result;
54
+ }
55
+ return null;
56
+ }
57
+ /**
58
+ * Runs a search forwards in time, processing events from a specific contract and keys
59
+ *
60
+ * @param contract
61
+ * @param keys
62
+ * @param processor called for every batch of returned signatures, should return a value if the correct signature
63
+ * was found, or null if the search should continue
64
+ * @param abortSignal
65
+ * @param logFetchLimit
66
+ */
67
+ async findInEventsForward(contract, keys, processor, abortSignal, logFetchLimit) {
68
+ if (logFetchLimit == null || logFetchLimit > this.EVENTS_LIMIT)
69
+ logFetchLimit = this.EVENTS_LIMIT;
70
+ let eventsResult = null;
71
+ while (eventsResult == null || eventsResult?.continuation_token != null) {
72
+ eventsResult = await this.root.provider.getEvents({
73
+ address: contract,
74
+ to_block: "latest",
75
+ keys,
76
+ chunk_size: logFetchLimit ?? this.EVENTS_LIMIT,
77
+ continuation_token: eventsResult?.continuation_token
78
+ });
79
+ if (abortSignal != null)
80
+ abortSignal.throwIfAborted();
81
+ const result = await processor(eventsResult.events);
82
+ if (result != null)
83
+ return result;
84
+ }
85
+ return null;
86
+ }
87
+ }
88
+ exports.StarknetEvents = StarknetEvents;
@@ -0,0 +1,55 @@
1
+ import { Provider } from "starknet";
2
+ export declare class StarknetFees {
3
+ private readonly logger;
4
+ private readonly feeDA;
5
+ private readonly nonceDA;
6
+ private readonly provider;
7
+ private readonly gasToken;
8
+ private readonly maxFeeRate;
9
+ private readonly feeMultiplierPPM;
10
+ private blockFeeCache;
11
+ constructor(provider: Provider, gasToken?: "ETH" | "STRK", maxFeeRate?: number, feeMultiplier?: number, da?: {
12
+ fee?: "L1" | "L2";
13
+ nonce?: "L1" | "L2";
14
+ });
15
+ /**
16
+ * Gets starknet fee rate
17
+ *
18
+ * @private
19
+ * @returns {Promise<BN>} L1 gas price denominated in Wei
20
+ */
21
+ private _getFeeRate;
22
+ /**
23
+ * Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
24
+ *
25
+ * @private
26
+ */
27
+ getFeeRate(): Promise<string>;
28
+ getDefaultGasToken(): string;
29
+ /**
30
+ * Calculates the total gas fee fee paid for a given gas limit at a given fee rate
31
+ *
32
+ * @param gas
33
+ * @param feeRate
34
+ */
35
+ static getGasFee(gas: number, feeRate: string): bigint;
36
+ static getGasToken(feeRate: string): string;
37
+ getFeeDetails(L1GasLimit: number, L2GasLimit: number, feeRate: string): {
38
+ maxFee: string;
39
+ version: "0x3" | "0x1";
40
+ resourceBounds: {
41
+ l1_gas: {
42
+ max_amount: string;
43
+ max_price_per_unit: string;
44
+ };
45
+ l2_gas: {
46
+ max_amount: string;
47
+ max_price_per_unit: string;
48
+ };
49
+ };
50
+ tip: string;
51
+ paymasterData: any[];
52
+ nonceDataAvailabilityMode: "L1" | "L2";
53
+ feeDataAvailabilityMode: "L1" | "L2";
54
+ };
55
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetFees = void 0;
4
+ const Utils_1 = require("../../../utils/Utils");
5
+ const StarknetTokens_1 = require("./StarknetTokens");
6
+ const MAX_FEE_AGE = 5000;
7
+ const ERC20_ADDRESS_ETH = "";
8
+ const ERC20_ADDRESS_STRK = "";
9
+ class StarknetFees {
10
+ constructor(provider, gasToken = "ETH", maxFeeRate = gasToken === "ETH" ? 100000000000 /*100 GWei*/ : 1000000000000000 /*100 * 10000 GWei*/, feeMultiplier = 1.25, da) {
11
+ this.logger = (0, Utils_1.getLogger)("StarknetFees: ");
12
+ this.blockFeeCache = null;
13
+ this.provider = provider;
14
+ this.gasToken = gasToken;
15
+ this.maxFeeRate = BigInt(maxFeeRate);
16
+ this.feeDA = da?.fee ?? "L1";
17
+ this.nonceDA = da?.nonce ?? "L1";
18
+ this.feeMultiplierPPM = BigInt(Math.floor(feeMultiplier * 1000000));
19
+ }
20
+ /**
21
+ * Gets starknet fee rate
22
+ *
23
+ * @private
24
+ * @returns {Promise<BN>} L1 gas price denominated in Wei
25
+ */
26
+ async _getFeeRate() {
27
+ const block = await this.provider.getBlockWithTxHashes("latest");
28
+ let l1GasCost = (0, Utils_1.toBigInt)(this.gasToken === "ETH" ? block.l1_gas_price.price_in_wei : block.l1_gas_price.price_in_fri);
29
+ l1GasCost = l1GasCost * this.feeMultiplierPPM / 1000000n;
30
+ this.logger.debug("_getFeeRate(): L1 fee rate: " + l1GasCost.toString(10));
31
+ return l1GasCost;
32
+ }
33
+ /**
34
+ * Gets the gas price with caching, format: <gas price in Wei>;<transaction version: v1/v3>
35
+ *
36
+ * @private
37
+ */
38
+ async getFeeRate() {
39
+ if (this.blockFeeCache == null || Date.now() - this.blockFeeCache.timestamp > MAX_FEE_AGE) {
40
+ let obj = {
41
+ timestamp: Date.now(),
42
+ feeRate: null
43
+ };
44
+ obj.feeRate = this._getFeeRate().catch(e => {
45
+ if (this.blockFeeCache === obj)
46
+ this.blockFeeCache = null;
47
+ throw e;
48
+ });
49
+ this.blockFeeCache = obj;
50
+ }
51
+ let feeRate = await this.blockFeeCache.feeRate;
52
+ if (feeRate > this.maxFeeRate)
53
+ feeRate = this.maxFeeRate;
54
+ const fee = feeRate.toString(10) + ";" + (this.gasToken === "ETH" ? "v1" : "v3");
55
+ this.logger.debug("getFeeRate(): calculated fee: " + fee);
56
+ return fee;
57
+ }
58
+ getDefaultGasToken() {
59
+ return this.gasToken === "ETH" ? StarknetTokens_1.StarknetTokens.ERC20_ETH : StarknetTokens_1.StarknetTokens.ERC20_STRK;
60
+ }
61
+ /**
62
+ * Calculates the total gas fee fee paid for a given gas limit at a given fee rate
63
+ *
64
+ * @param gas
65
+ * @param feeRate
66
+ */
67
+ static getGasFee(gas, feeRate) {
68
+ if (feeRate == null)
69
+ return 0n;
70
+ const arr = feeRate.split(";");
71
+ const gasPrice = BigInt(arr[0]);
72
+ return gasPrice * BigInt(gas);
73
+ }
74
+ static getGasToken(feeRate) {
75
+ if (feeRate == null)
76
+ return null;
77
+ const arr = feeRate.split(";");
78
+ const txVersion = arr[1];
79
+ return txVersion === "v1" ? StarknetTokens_1.StarknetTokens.ERC20_ETH : StarknetTokens_1.StarknetTokens.ERC20_STRK;
80
+ }
81
+ getFeeDetails(L1GasLimit, L2GasLimit, feeRate) {
82
+ if (feeRate == null)
83
+ return null;
84
+ const arr = feeRate.split(";");
85
+ const gasPrice = BigInt(arr[0]);
86
+ const version = arr[1];
87
+ const maxFee = (0, Utils_1.toHex)(BigInt(L1GasLimit) * gasPrice, 16);
88
+ return {
89
+ maxFee: maxFee,
90
+ version: version === "v1" ? "0x1" : "0x3",
91
+ resourceBounds: {
92
+ l1_gas: { max_amount: (0, Utils_1.toHex)(L1GasLimit, 16), max_price_per_unit: (0, Utils_1.toHex)(gasPrice, 16) },
93
+ l2_gas: { max_amount: "0x0", max_price_per_unit: "0x0" }
94
+ },
95
+ tip: "0x0",
96
+ paymasterData: [],
97
+ nonceDataAvailabilityMode: this.nonceDA,
98
+ feeDataAvailabilityMode: this.feeDA
99
+ };
100
+ }
101
+ }
102
+ exports.StarknetFees = StarknetFees;
@@ -0,0 +1,30 @@
1
+ /// <reference types="node" />
2
+ import { Buffer } from "buffer";
3
+ import { StarknetModule } from "../StarknetModule";
4
+ import { StarknetSigner } from "../../wallet/StarknetSigner";
5
+ import { StarknetType, TypedData } from "starknet";
6
+ import { StarknetBase } from "../StarknetBase";
7
+ export declare class StarknetSignatures extends StarknetModule {
8
+ private readonly domain;
9
+ constructor(root: StarknetBase, domainName?: string);
10
+ getTypedMessage(type: StarknetType[], typeName: string, message: object): TypedData;
11
+ signTypedMessage(signer: StarknetSigner, type: StarknetType[], typeName: string, message: object): Promise<string>;
12
+ isValidSignature(signature: string, address: string, type: StarknetType[], typeName: string, message: object): Promise<boolean>;
13
+ /**
14
+ * Produces a signature over the sha256 of a specified data Buffer, only works with providers which
15
+ * expose their private key (i.e. backend based, not browser wallet based)
16
+ *
17
+ * @param signer
18
+ * @param data data to sign
19
+ */
20
+ getDataSignature(signer: StarknetSigner, data: Buffer): Promise<string>;
21
+ /**
22
+ * Checks whether a signature is a valid signature produced by the account over a data message (computes
23
+ * sha256 hash of the message)
24
+ *
25
+ * @param data signed data
26
+ * @param signature data signature
27
+ * @param address public key of the signer
28
+ */
29
+ isValidDataSignature(data: Buffer, signature: string, address: string): Promise<boolean>;
30
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetSignatures = void 0;
4
+ const createHash = require("create-hash");
5
+ const StarknetModule_1 = require("../StarknetModule");
6
+ const starknet_1 = require("starknet");
7
+ const Utils_1 = require("../../../utils/Utils");
8
+ const StarknetDomain = [
9
+ { name: 'name', type: 'shortstring' },
10
+ { name: 'version', type: 'shortstring' },
11
+ { name: 'chainId', type: 'shortstring' },
12
+ { name: 'revision', type: 'shortstring' },
13
+ ];
14
+ const DataHash = [
15
+ { name: 'Data hash', type: 'u256' }
16
+ ];
17
+ class StarknetSignatures extends StarknetModule_1.StarknetModule {
18
+ constructor(root, domainName = "atomiq.exchange") {
19
+ super(root);
20
+ this.domain = {
21
+ name: domainName,
22
+ version: '1',
23
+ chainId: starknet_1.shortString.decodeShortString(root.starknetChainId),
24
+ revision: '1'
25
+ };
26
+ }
27
+ getTypedMessage(type, typeName, message) {
28
+ return {
29
+ types: {
30
+ StarknetDomain,
31
+ [typeName]: type,
32
+ },
33
+ primaryType: typeName,
34
+ domain: this.domain,
35
+ message
36
+ };
37
+ }
38
+ async signTypedMessage(signer, type, typeName, message) {
39
+ const signature = await signer.account.signMessage(this.getTypedMessage(type, typeName, message));
40
+ return JSON.stringify(starknet_1.stark.formatSignature(signature));
41
+ }
42
+ async isValidSignature(signature, address, type, typeName, message) {
43
+ return new starknet_1.Account(this.provider, address, null).verifyMessage(this.getTypedMessage(type, typeName, message), JSON.parse(signature));
44
+ }
45
+ ///////////////////
46
+ //// Data signatures
47
+ /**
48
+ * Produces a signature over the sha256 of a specified data Buffer, only works with providers which
49
+ * expose their private key (i.e. backend based, not browser wallet based)
50
+ *
51
+ * @param signer
52
+ * @param data data to sign
53
+ */
54
+ getDataSignature(signer, data) {
55
+ const buff = createHash("sha256").update(data).digest();
56
+ return this.signTypedMessage(signer, DataHash, 'DataHash', { "Data hash": starknet_1.cairo.uint256((0, Utils_1.toHex)(buff)) });
57
+ }
58
+ /**
59
+ * Checks whether a signature is a valid signature produced by the account over a data message (computes
60
+ * sha256 hash of the message)
61
+ *
62
+ * @param data signed data
63
+ * @param signature data signature
64
+ * @param address public key of the signer
65
+ */
66
+ isValidDataSignature(data, signature, address) {
67
+ const buff = createHash("sha256").update(data).digest();
68
+ return this.isValidSignature(signature, address, DataHash, 'DataHash', { "Data hash": starknet_1.cairo.uint256((0, Utils_1.toHex)(buff)) });
69
+ }
70
+ }
71
+ exports.StarknetSignatures = StarknetSignatures;
@@ -0,0 +1,67 @@
1
+ import { StarknetModule } from "../StarknetModule";
2
+ import { StarknetAction } from "../StarknetAction";
3
+ export declare class StarknetTokens extends StarknetModule {
4
+ static readonly ERC20_ETH = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7";
5
+ static readonly ERC20_STRK = "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d";
6
+ static readonly GasCosts: {
7
+ TRANSFER: {
8
+ l1: number;
9
+ l2: number;
10
+ };
11
+ APPROVE: {
12
+ l1: number;
13
+ l2: number;
14
+ };
15
+ };
16
+ private getContract;
17
+ /**
18
+ * Action for transferring the erc20 token
19
+ *
20
+ * @param signer
21
+ * @param recipient
22
+ * @param token
23
+ * @param amount
24
+ * @constructor
25
+ * @private
26
+ */
27
+ private Transfer;
28
+ /**
29
+ * Approves spend of tokens for a specific spender
30
+ *
31
+ * @param signer
32
+ * @param spender
33
+ * @param token
34
+ * @param amount
35
+ * @constructor
36
+ * @private
37
+ */
38
+ Approve(signer: string, spender: string, token: string, amount: bigint): StarknetAction;
39
+ /**
40
+ * Checks if the provided string is a valid starknet token
41
+ *
42
+ * @param token
43
+ */
44
+ isValidToken(token: string): boolean;
45
+ /**
46
+ * Returns the token balance of the address
47
+ *
48
+ * @param address
49
+ * @param token
50
+ */
51
+ getTokenBalance(address: string, token: string): Promise<bigint>;
52
+ /**
53
+ * Returns the native currency address, return the default used by the fee module
54
+ */
55
+ getNativeCurrencyAddress(): string;
56
+ /**
57
+ * Creates transactions for sending the over the tokens
58
+ *
59
+ * @param signer
60
+ * @param token token to send
61
+ * @param amount amount of the token to send
62
+ * @param recipient recipient's address
63
+ * @param feeRate fee rate to use for the transactions
64
+ * @private
65
+ */
66
+ txsTransfer(signer: string, token: string, amount: bigint, recipient: string, feeRate?: string): Promise<import("./StarknetTransactions").StarknetTx[]>;
67
+ }