@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,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetContractEvents = void 0;
4
+ const StarknetEvents_1 = require("../../base/modules/StarknetEvents");
5
+ const starknet_1 = require("starknet");
6
+ const Utils_1 = require("../../../utils/Utils");
7
+ class StarknetContractEvents extends StarknetEvents_1.StarknetEvents {
8
+ constructor(root, abi) {
9
+ super(root);
10
+ this.abi = abi;
11
+ }
12
+ toStarknetAbiEvents(blockEvents) {
13
+ const abiEvents = starknet_1.events.getAbiEvents(this.abi);
14
+ const abiStructs = starknet_1.CallData.getAbiStruct(this.abi);
15
+ const abiEnums = starknet_1.CallData.getAbiEnum(this.abi);
16
+ const result = starknet_1.events.parseEvents(blockEvents, abiEvents, abiStructs, abiEnums);
17
+ if (result.length !== blockEvents.length)
18
+ throw new Error("Invalid event detected, please check provided ABI");
19
+ return result.map((value, index) => {
20
+ const starknetEvent = blockEvents[index];
21
+ const name = Object.keys(value)[0];
22
+ return {
23
+ name: name,
24
+ txHash: starknetEvent.transaction_hash,
25
+ params: value[name],
26
+ blockNumber: starknetEvent.block_number,
27
+ blockHash: starknetEvent.block_hash,
28
+ data: starknetEvent.data,
29
+ keys: starknetEvent.keys
30
+ };
31
+ });
32
+ }
33
+ toFilter(events, keys) {
34
+ const filterArray = [];
35
+ filterArray.push(events.map(name => {
36
+ const arr = name.split(":");
37
+ const eventName = arr[arr.length - 1];
38
+ return (0, Utils_1.toHex)(starknet_1.hash.starknetKeccak(eventName));
39
+ }));
40
+ if (keys != null)
41
+ keys.forEach(key => filterArray.push(key == null ? [] : [key]));
42
+ return filterArray;
43
+ }
44
+ /**
45
+ * Returns the events occuring in a range of starknet block as identified by the contract and keys,
46
+ * returns pending events if no startHeight & endHeight is passed
47
+ *
48
+ * @param events
49
+ * @param keys
50
+ * @param startBlockHeight
51
+ * @param endBlockHeight
52
+ */
53
+ async getContractBlockEvents(events, keys, startBlockHeight, endBlockHeight = startBlockHeight) {
54
+ const blockEvents = await super.getBlockEvents(this.root.contract.address, this.toFilter(events, keys), startBlockHeight, endBlockHeight);
55
+ return this.toStarknetAbiEvents(blockEvents);
56
+ }
57
+ /**
58
+ * Runs a search forawrds in time, processing the events for a specific topic public key
59
+ *
60
+ * @param events
61
+ * @param keys
62
+ * @param processor called for every event, should return a value if the correct event was found, or null
63
+ * if the search should continue
64
+ * @param abortSignal
65
+ */
66
+ async findInContractEvents(events, keys, processor, abortSignal) {
67
+ return this.findInEvents(this.root.contract.address, this.toFilter(events, keys), async (events) => {
68
+ const parsedEvents = this.toStarknetAbiEvents(events);
69
+ for (let event of parsedEvents) {
70
+ const result = await processor(event);
71
+ if (result != null)
72
+ return result;
73
+ }
74
+ }, abortSignal);
75
+ }
76
+ }
77
+ exports.StarknetContractEvents = StarknetContractEvents;
@@ -0,0 +1,19 @@
1
+ import { StarknetChainEventsBrowser } from "./StarknetChainEventsBrowser";
2
+ import { StarknetSwapContract } from "../swaps/StarknetSwapContract";
3
+ export declare class StarknetChainEvents extends StarknetChainEventsBrowser {
4
+ private readonly directory;
5
+ constructor(directory: string, starknetSwapContract: StarknetSwapContract, pollIntervalSeconds?: number);
6
+ /**
7
+ * Retrieves last signature & slot from filesystem
8
+ *
9
+ * @private
10
+ */
11
+ private getLastEventData;
12
+ /**
13
+ * Saves last signature & slot to the filesystem
14
+ *
15
+ * @private
16
+ */
17
+ private saveLastEventData;
18
+ init(): Promise<void>;
19
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetChainEvents = void 0;
4
+ const StarknetChainEventsBrowser_1 = require("./StarknetChainEventsBrowser");
5
+ const fs = require("fs/promises");
6
+ const BLOCKHEIGHT_FILENAME = "/strk-blockheight.txt";
7
+ class StarknetChainEvents extends StarknetChainEventsBrowser_1.StarknetChainEventsBrowser {
8
+ constructor(directory, starknetSwapContract, pollIntervalSeconds) {
9
+ super(starknetSwapContract, pollIntervalSeconds);
10
+ this.directory = directory;
11
+ }
12
+ /**
13
+ * Retrieves last signature & slot from filesystem
14
+ *
15
+ * @private
16
+ */
17
+ async getLastEventData() {
18
+ try {
19
+ const txt = (await fs.readFile(this.directory + BLOCKHEIGHT_FILENAME)).toString();
20
+ const arr = txt.split(";");
21
+ if (arr.length < 2)
22
+ return {
23
+ blockNumber: parseInt(arr[0]),
24
+ txHash: null
25
+ };
26
+ return {
27
+ blockNumber: parseInt(arr[0]),
28
+ txHash: arr[1]
29
+ };
30
+ }
31
+ catch (e) {
32
+ return {
33
+ blockNumber: null,
34
+ txHash: null
35
+ };
36
+ }
37
+ }
38
+ /**
39
+ * Saves last signature & slot to the filesystem
40
+ *
41
+ * @private
42
+ */
43
+ saveLastEventData(blockNumber, txHash) {
44
+ return fs.writeFile(this.directory + BLOCKHEIGHT_FILENAME, blockNumber.toString() + ";" + txHash);
45
+ }
46
+ async init() {
47
+ const { blockNumber, txHash } = await this.getLastEventData();
48
+ await this.setupPoll(blockNumber, txHash, (blockNumber, txHash) => this.saveLastEventData(blockNumber, txHash));
49
+ }
50
+ }
51
+ exports.StarknetChainEvents = StarknetChainEvents;
@@ -0,0 +1,73 @@
1
+ import { ChainEvents, ClaimEvent, EventListener, InitializeEvent, RefundEvent } from "@atomiqlabs/base";
2
+ import { StarknetSwapData } from "../swaps/StarknetSwapData";
3
+ import { StarknetSwapContract } from "../swaps/StarknetSwapContract";
4
+ import { BigNumberish, Provider } from "starknet";
5
+ import { StarknetAbiEvent } from "../contract/modules/StarknetContractEvents";
6
+ import { EscrowManagerAbiType } from "../swaps/EscrowManagerAbi";
7
+ import { ExtractAbiFunctionNames } from "abi-wan-kanabi/dist/kanabi";
8
+ import { IClaimHandler } from "../swaps/handlers/claim/ClaimHandlers";
9
+ export type StarknetTraceCall = {
10
+ calldata: string[];
11
+ contract_address: string;
12
+ entry_point_selector: string;
13
+ calls: StarknetTraceCall[];
14
+ };
15
+ /**
16
+ * Solana on-chain event handler for front-end systems without access to fs, uses pure WS to subscribe, might lose
17
+ * out on some events if the network is unreliable, front-end systems should take this into consideration and not
18
+ * rely purely on events
19
+ */
20
+ export declare class StarknetChainEventsBrowser implements ChainEvents<StarknetSwapData> {
21
+ protected readonly listeners: EventListener<StarknetSwapData>[];
22
+ protected readonly provider: Provider;
23
+ protected readonly starknetSwapContract: StarknetSwapContract;
24
+ protected eventListeners: number[];
25
+ protected readonly logger: {
26
+ debug: (msg: any, ...args: any[]) => void;
27
+ info: (msg: any, ...args: any[]) => void;
28
+ warn: (msg: any, ...args: any[]) => void;
29
+ error: (msg: any, ...args: any[]) => void;
30
+ };
31
+ protected initFunctionName: ExtractAbiFunctionNames<EscrowManagerAbiType>;
32
+ protected initEntryPointSelector: bigint;
33
+ protected stopped: boolean;
34
+ protected pollIntervalSeconds: number;
35
+ private timeout;
36
+ constructor(starknetSwapContract: StarknetSwapContract, pollIntervalSeconds?: number);
37
+ findInitSwapData(call: StarknetTraceCall, escrowHash: BigNumberish, claimHandler: IClaimHandler<any, any>): StarknetSwapData;
38
+ /**
39
+ * Returns async getter for fetching on-demand initialize event swap data
40
+ *
41
+ * @param event
42
+ * @param claimHandler
43
+ * @private
44
+ * @returns {() => Promise<StarknetSwapData>} getter to be passed to InitializeEvent constructor
45
+ */
46
+ private getSwapDataGetter;
47
+ protected parseInitializeEvent(event: StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Initialize">): InitializeEvent<StarknetSwapData>;
48
+ protected parseRefundEvent(event: StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Refund">): RefundEvent<StarknetSwapData>;
49
+ protected parseClaimEvent(event: StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Claim">): ClaimEvent<StarknetSwapData>;
50
+ /**
51
+ * Processes event as received from the chain, parses it & calls event listeners
52
+ *
53
+ * @param events
54
+ * @param currentBlockNumber
55
+ * @param currentBlockTimestamp
56
+ * @protected
57
+ */
58
+ protected processEvents(events: StarknetAbiEvent<EscrowManagerAbiType, "escrow_manager::events::Initialize" | "escrow_manager::events::Refund" | "escrow_manager::events::Claim">[], currentBlockNumber: number, currentBlockTimestamp: number): Promise<void>;
59
+ protected checkEvents(lastBlockNumber: number, lastTxHash: string): Promise<{
60
+ txHash: string;
61
+ blockNumber: number;
62
+ }>;
63
+ /**
64
+ * Sets up event handlers listening for swap events over websocket
65
+ *
66
+ * @protected
67
+ */
68
+ protected setupPoll(lastBlockNumber?: number, lastTxHash?: string, saveLatestProcessedBlockNumber?: (blockNumber: number, lastTxHash: string) => Promise<void>): Promise<void>;
69
+ init(): Promise<void>;
70
+ stop(): Promise<void>;
71
+ registerListener(cbk: EventListener<StarknetSwapData>): void;
72
+ unregisterListener(cbk: EventListener<StarknetSwapData>): boolean;
73
+ }
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StarknetChainEventsBrowser = void 0;
4
+ const base_1 = require("@atomiqlabs/base");
5
+ const Utils_1 = require("../../utils/Utils");
6
+ const starknet_1 = require("starknet");
7
+ /**
8
+ * Solana on-chain event handler for front-end systems without access to fs, uses pure WS to subscribe, might lose
9
+ * out on some events if the network is unreliable, front-end systems should take this into consideration and not
10
+ * rely purely on events
11
+ */
12
+ class StarknetChainEventsBrowser {
13
+ constructor(starknetSwapContract, pollIntervalSeconds = 5) {
14
+ this.listeners = [];
15
+ this.eventListeners = [];
16
+ this.logger = (0, Utils_1.getLogger)("StarknetChainEventsBrowser: ");
17
+ this.initFunctionName = "initialize";
18
+ this.initEntryPointSelector = BigInt(starknet_1.hash.starknetKeccak(this.initFunctionName));
19
+ this.provider = starknetSwapContract.provider;
20
+ this.starknetSwapContract = starknetSwapContract;
21
+ this.pollIntervalSeconds = pollIntervalSeconds;
22
+ }
23
+ findInitSwapData(call, escrowHash, claimHandler) {
24
+ if (BigInt(call.contract_address) === BigInt(this.starknetSwapContract.contract.address) &&
25
+ BigInt(call.entry_point_selector) === this.initEntryPointSelector) {
26
+ //Found, check correct escrow hash
27
+ const { escrow, extraData } = (0, Utils_1.parseInitFunctionCalldata)(call.calldata, claimHandler);
28
+ if ("0x" + escrow.getEscrowHash() === (0, Utils_1.toHex)(escrowHash)) {
29
+ if (extraData.length !== 0) {
30
+ escrow.setExtraData((0, Utils_1.bytes31SpanToBuffer)(extraData, 42).toString("hex"));
31
+ }
32
+ return escrow;
33
+ }
34
+ }
35
+ for (let _call of call.calls) {
36
+ const found = this.findInitSwapData(_call, escrowHash, claimHandler);
37
+ if (found != null)
38
+ return found;
39
+ }
40
+ return null;
41
+ }
42
+ /**
43
+ * Returns async getter for fetching on-demand initialize event swap data
44
+ *
45
+ * @param event
46
+ * @param claimHandler
47
+ * @private
48
+ * @returns {() => Promise<StarknetSwapData>} getter to be passed to InitializeEvent constructor
49
+ */
50
+ getSwapDataGetter(event, claimHandler) {
51
+ return async () => {
52
+ const trace = await this.provider.getTransactionTrace(event.txHash);
53
+ if (trace == null)
54
+ return null;
55
+ if (trace.execute_invocation.revert_reason != null)
56
+ return null;
57
+ return this.findInitSwapData(trace.execute_invocation, event.params.escrow_hash, claimHandler);
58
+ };
59
+ }
60
+ parseInitializeEvent(event) {
61
+ const escrowHashBuffer = (0, Utils_1.bigNumberishToBuffer)(event.params.escrow_hash, 32);
62
+ const escrowHash = escrowHashBuffer.toString("hex");
63
+ const claimHandlerHex = (0, Utils_1.toHex)(event.params.claim_handler);
64
+ const claimHandler = this.starknetSwapContract.claimHandlersByAddress[claimHandlerHex];
65
+ if (claimHandler == null) {
66
+ this.logger.warn("parseInitializeEvent(" + escrowHash + "): Unknown claim handler with claim: " + claimHandlerHex);
67
+ return null;
68
+ }
69
+ const swapType = claimHandler.getType();
70
+ this.logger.debug("InitializeEvent claimHash: " + (0, Utils_1.toHex)(event.params.claim_data) + " escrowHash: " + escrowHash);
71
+ return new base_1.InitializeEvent(escrowHash, swapType, (0, Utils_1.onceAsync)(this.getSwapDataGetter(event, claimHandler)));
72
+ }
73
+ parseRefundEvent(event) {
74
+ const escrowHashBuffer = (0, Utils_1.bigNumberishToBuffer)(event.params.escrow_hash, 32);
75
+ const escrowHash = escrowHashBuffer.toString("hex");
76
+ this.logger.debug("RefundEvent claimHash: " + (0, Utils_1.toHex)(event.params.claim_data) + " escrowHash: " + escrowHash);
77
+ return new base_1.RefundEvent(escrowHash);
78
+ }
79
+ parseClaimEvent(event) {
80
+ const escrowHashBuffer = (0, Utils_1.bigNumberishToBuffer)(event.params.escrow_hash, 32);
81
+ const escrowHash = escrowHashBuffer.toString("hex");
82
+ const claimHandlerHex = (0, Utils_1.toHex)(event.params.claim_handler);
83
+ const claimHandler = this.starknetSwapContract.claimHandlersByAddress[claimHandlerHex];
84
+ if (claimHandler == null) {
85
+ this.logger.warn("parseClaimEvent(" + escrowHash + "): Unknown claim handler with claim: " + claimHandlerHex);
86
+ return null;
87
+ }
88
+ const witnessResult = claimHandler.parseWitnessResult(event.params.witness_result);
89
+ this.logger.debug("ClaimEvent claimHash: " + (0, Utils_1.toHex)(event.params.claim_data) +
90
+ " witnessResult: " + witnessResult + " escrowHash: " + escrowHash);
91
+ return new base_1.ClaimEvent(escrowHash, witnessResult);
92
+ }
93
+ /**
94
+ * Processes event as received from the chain, parses it & calls event listeners
95
+ *
96
+ * @param events
97
+ * @param currentBlockNumber
98
+ * @param currentBlockTimestamp
99
+ * @protected
100
+ */
101
+ async processEvents(events, currentBlockNumber, currentBlockTimestamp) {
102
+ const blockTimestampsCache = {};
103
+ const getBlockTimestamp = async (blockNumber) => {
104
+ const blockNumberString = blockNumber.toString();
105
+ blockTimestampsCache[blockNumberString] ?? (blockTimestampsCache[blockNumberString] = (await this.provider.getBlockWithTxHashes(blockNumber)).timestamp);
106
+ return blockTimestampsCache[blockNumberString];
107
+ };
108
+ const parsedEvents = [];
109
+ for (let event of events) {
110
+ let parsedEvent;
111
+ switch (event.name) {
112
+ case "escrow_manager::events::Claim":
113
+ parsedEvent = this.parseClaimEvent(event);
114
+ break;
115
+ case "escrow_manager::events::Refund":
116
+ parsedEvent = this.parseRefundEvent(event);
117
+ break;
118
+ case "escrow_manager::events::Initialize":
119
+ parsedEvent = this.parseInitializeEvent(event);
120
+ break;
121
+ }
122
+ const timestamp = (event.blockNumber == null || event.blockNumber === currentBlockNumber) ? currentBlockTimestamp : await getBlockTimestamp(event.blockNumber);
123
+ parsedEvent.meta = {
124
+ blockTime: timestamp,
125
+ txId: event.txHash,
126
+ timestamp //Maybe deprecated
127
+ };
128
+ parsedEvents.push(parsedEvent);
129
+ }
130
+ for (let listener of this.listeners) {
131
+ await listener(parsedEvents);
132
+ }
133
+ }
134
+ async checkEvents(lastBlockNumber, lastTxHash) {
135
+ //Get pending events
136
+ let pendingEvents = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], []);
137
+ if (lastTxHash != null) {
138
+ const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(pendingEvents, val => val.txHash === lastTxHash);
139
+ if (latestProcessedEventIndex !== -1)
140
+ pendingEvents.splice(0, latestProcessedEventIndex + 1);
141
+ }
142
+ if (pendingEvents.length > 0) {
143
+ await this.processEvents(pendingEvents, null, Math.floor(Date.now() / 1000));
144
+ lastTxHash = pendingEvents[pendingEvents.length - 1].txHash;
145
+ }
146
+ const currentBlock = await this.provider.getBlockWithTxHashes("latest");
147
+ const currentBlockNumber = currentBlock.block_number;
148
+ if (lastBlockNumber != null && currentBlockNumber > lastBlockNumber) {
149
+ const events = await this.starknetSwapContract.Events.getContractBlockEvents(["escrow_manager::events::Initialize", "escrow_manager::events::Claim", "escrow_manager::events::Refund"], [], lastBlockNumber + 1, currentBlockNumber);
150
+ if (lastTxHash != null) {
151
+ const latestProcessedEventIndex = (0, Utils_1.findLastIndex)(events, val => val.txHash === lastTxHash);
152
+ if (latestProcessedEventIndex !== -1)
153
+ events.splice(0, latestProcessedEventIndex + 1);
154
+ }
155
+ if (events.length > 0) {
156
+ await this.processEvents(events, currentBlockNumber, currentBlock.timestamp);
157
+ lastTxHash = events[events.length - 1].txHash;
158
+ }
159
+ }
160
+ return {
161
+ txHash: lastTxHash,
162
+ blockNumber: currentBlockNumber
163
+ };
164
+ }
165
+ /**
166
+ * Sets up event handlers listening for swap events over websocket
167
+ *
168
+ * @protected
169
+ */
170
+ async setupPoll(lastBlockNumber, lastTxHash, saveLatestProcessedBlockNumber) {
171
+ this.stopped = false;
172
+ let func;
173
+ func = async () => {
174
+ await this.checkEvents(lastBlockNumber, lastTxHash).then(({ blockNumber, txHash }) => {
175
+ lastBlockNumber = blockNumber;
176
+ lastTxHash = txHash;
177
+ if (saveLatestProcessedBlockNumber != null)
178
+ return saveLatestProcessedBlockNumber(blockNumber, lastTxHash);
179
+ }).catch(e => {
180
+ this.logger.error("setupPoll(): Failed to fetch starknet log: ", e);
181
+ });
182
+ if (this.stopped)
183
+ return;
184
+ this.timeout = setTimeout(func, this.pollIntervalSeconds * 1000);
185
+ };
186
+ await func();
187
+ }
188
+ init() {
189
+ this.setupPoll();
190
+ return Promise.resolve();
191
+ }
192
+ async stop() {
193
+ this.stopped = true;
194
+ if (this.timeout != null)
195
+ clearTimeout(this.timeout);
196
+ this.eventListeners = [];
197
+ }
198
+ registerListener(cbk) {
199
+ this.listeners.push(cbk);
200
+ }
201
+ unregisterListener(cbk) {
202
+ const index = this.listeners.indexOf(cbk);
203
+ if (index >= 0) {
204
+ this.listeners.splice(index, 1);
205
+ return true;
206
+ }
207
+ return false;
208
+ }
209
+ }
210
+ exports.StarknetChainEventsBrowser = StarknetChainEventsBrowser;