@rosen-bridge/rosen-extractor 6.2.2 → 6.3.1

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 (42) hide show
  1. package/dist/lib/getRosenData/abstract/AbstractRosenDataExtractor.d.ts +14 -20
  2. package/dist/lib/getRosenData/abstract/types.d.ts +13 -13
  3. package/dist/lib/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.d.ts +15 -24
  4. package/dist/lib/getRosenData/bitcoin/BitcoinRosenExtractor.d.ts +15 -22
  5. package/dist/lib/getRosenData/bitcoin/BitcoinRpcRosenExtractor.d.ts +15 -22
  6. package/dist/lib/getRosenData/bitcoin/types.d.ts +66 -66
  7. package/dist/lib/getRosenData/bitcoin/utils.d.ts +1 -1
  8. package/dist/lib/getRosenData/cardano/CardanoBlockFrostRosenExtractor.d.ts +13 -16
  9. package/dist/lib/getRosenData/cardano/CardanoGraphQLRosenExtractor.d.ts +13 -16
  10. package/dist/lib/getRosenData/cardano/CardanoKoiosRosenExtractor.d.ts +13 -16
  11. package/dist/lib/getRosenData/cardano/CardanoOgmiosRosenExtractor.d.ts +13 -16
  12. package/dist/lib/getRosenData/cardano/CardanoRosenExtractor.d.ts +13 -16
  13. package/dist/lib/getRosenData/cardano/types.d.ts +90 -110
  14. package/dist/lib/getRosenData/cardano/utils.d.ts +8 -10
  15. package/dist/lib/getRosenData/const.d.ts +9 -9
  16. package/dist/lib/getRosenData/const.d.ts.map +1 -1
  17. package/dist/lib/getRosenData/const.js +3 -2
  18. package/dist/lib/getRosenData/doge/DogeEsploraRosenExtractor.d.ts +22 -0
  19. package/dist/lib/getRosenData/doge/DogeEsploraRosenExtractor.d.ts.map +1 -0
  20. package/dist/lib/getRosenData/doge/DogeEsploraRosenExtractor.js +104 -0
  21. package/dist/lib/getRosenData/doge/DogeRosenExtractor.d.ts +22 -0
  22. package/dist/lib/getRosenData/doge/DogeRosenExtractor.d.ts.map +1 -0
  23. package/dist/lib/getRosenData/doge/DogeRosenExtractor.js +112 -0
  24. package/dist/lib/getRosenData/doge/types.d.ts +59 -0
  25. package/dist/lib/getRosenData/doge/types.d.ts.map +1 -0
  26. package/dist/lib/getRosenData/doge/types.js +2 -0
  27. package/dist/lib/getRosenData/doge/utils.d.ts +13 -0
  28. package/dist/lib/getRosenData/doge/utils.d.ts.map +1 -0
  29. package/dist/lib/getRosenData/doge/utils.js +58 -0
  30. package/dist/lib/getRosenData/ergo/ErgoNodeRosenExtractor.d.ts +15 -22
  31. package/dist/lib/getRosenData/ergo/ErgoRosenExtractor.d.ts +9 -13
  32. package/dist/lib/getRosenData/ergo/types.d.ts +24 -24
  33. package/dist/lib/getRosenData/evm/EvmEthersRosenExtractor.d.ts +9 -15
  34. package/dist/lib/getRosenData/evm/EvmRosenExtractor.d.ts +9 -15
  35. package/dist/lib/getRosenData/evm/EvmRpcRosenExtractor.d.ts +19 -25
  36. package/dist/lib/getRosenData/evm/utils.d.ts +5 -5
  37. package/dist/lib/index.d.ts +1 -1
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +2 -2
  40. package/dist/lib/getRosenData/Utils.d.ts +0 -59
  41. package/dist/lib/getRosenData/Utils.d.ts.map +0 -1
  42. package/dist/lib/getRosenData/Utils.js +0 -96
@@ -1,146 +1,126 @@
1
1
  import { components } from '@blockfrost/openapi';
2
2
  interface PaymentAddr {
3
- bech32: string;
4
- cred: string;
3
+ bech32: string;
4
+ cred: string;
5
5
  }
6
6
  interface Asset {
7
- policy_id: string;
8
- asset_name: string;
9
- quantity: string;
7
+ policy_id: string;
8
+ asset_name: string;
9
+ quantity: string;
10
10
  }
11
11
  interface Utxo {
12
- payment_addr: PaymentAddr;
13
- stake_addr?: string | null;
14
- tx_hash: string;
15
- tx_index: number;
16
- value: string;
17
- asset_list: Array<Asset>;
12
+ payment_addr: PaymentAddr;
13
+ stake_addr?: string | null;
14
+ tx_hash: string;
15
+ tx_index: number;
16
+ value: string;
17
+ asset_list: Array<Asset>;
18
18
  }
19
19
  interface Metadata {
20
- [key: string]: Record<string, unknown>;
20
+ [key: string]: Record<string, unknown>;
21
21
  }
22
22
  interface KoiosTransaction {
23
- tx_hash: string;
24
- block_hash: string;
25
- inputs: Array<Utxo>;
26
- outputs: Array<Utxo>;
27
- metadata?: Metadata;
23
+ tx_hash: string;
24
+ block_hash: string;
25
+ inputs: Array<Utxo>;
26
+ outputs: Array<Utxo>;
27
+ metadata?: Metadata;
28
28
  }
29
29
  interface CardanoRosenData {
30
- toChain: string;
31
- toAddress: string;
32
- bridgeFee: string;
33
- networkFee: string;
34
- fromAddress: string;
30
+ toChain: string;
31
+ toAddress: string;
32
+ bridgeFee: string;
33
+ networkFee: string;
34
+ fromAddress: string;
35
35
  }
36
36
  interface CardanoMetadataRosenData {
37
- to: string;
38
- networkFee: string;
39
- bridgeFee: string;
40
- toAddress: string;
41
- fromAddress: string[];
37
+ to: string;
38
+ networkFee: string;
39
+ bridgeFee: string;
40
+ toAddress: string;
41
+ fromAddress: string[];
42
42
  }
43
43
  type ListObject = Array<MetadataObject>;
44
44
  type NativeValue = string | undefined;
45
45
  interface JsonObject {
46
- [key: string]: MetadataObject;
46
+ [key: string]: MetadataObject;
47
47
  }
48
48
  type MetadataObject = JsonObject | ListObject | NativeValue;
49
49
  interface CardanoAsset {
50
- policy_id: string;
51
- asset_name: string;
52
- quantity: string;
50
+ policy_id: string;
51
+ asset_name: string;
52
+ quantity: string;
53
53
  }
54
54
  interface CardanoUtxo {
55
- txId: string;
56
- index: number;
57
- value: bigint;
58
- assets: Array<CardanoAsset>;
55
+ txId: string;
56
+ index: number;
57
+ value: bigint;
58
+ assets: Array<CardanoAsset>;
59
59
  }
60
60
  interface CardanoBoxCandidate {
61
- address: string;
62
- value: bigint;
63
- assets: Array<CardanoAsset>;
61
+ address: string;
62
+ value: bigint;
63
+ assets: Array<CardanoAsset>;
64
64
  }
65
65
  type CardanoMetadata = Record<string, string | Record<string, any>>;
66
66
  interface CardanoTx {
67
- id: string;
68
- inputs: CardanoUtxo[];
69
- outputs: CardanoBoxCandidate[];
70
- fee: bigint;
71
- metadata?: CardanoMetadata;
67
+ id: string;
68
+ inputs: CardanoUtxo[];
69
+ outputs: CardanoBoxCandidate[];
70
+ fee: bigint;
71
+ metadata?: CardanoMetadata;
72
72
  }
73
73
  interface BlockFrostTransaction {
74
- utxos: components['schemas']['tx_content_utxo'];
75
- metadata: components['schemas']['tx_content_metadata'];
74
+ utxos: components['schemas']['tx_content_utxo'];
75
+ metadata: components['schemas']['tx_content_metadata'];
76
76
  }
77
- type BlockFrostOutputBox =
78
- components['schemas']['tx_content_utxo']['outputs'][0];
77
+ type BlockFrostOutputBox = components['schemas']['tx_content_utxo']['outputs'][0];
79
78
  type GraphQLBlockTxsQuery = {
80
- __typename?: 'Query';
81
- blocks: Array<{
82
- __typename?: 'Block';
83
- transactions: Array<{
84
- __typename?: 'Transaction';
85
- hash: any;
86
- fee: any;
87
- inputs: Array<{
88
- __typename?: 'TransactionInput';
89
- sourceTxIndex: number;
90
- sourceTxHash: any;
91
- value: any;
92
- tokens: Array<{
93
- __typename?: 'Token';
94
- quantity: string;
95
- asset: {
96
- __typename?: 'Asset';
97
- assetName?: any | null;
98
- policyId: any;
99
- };
79
+ __typename?: 'Query';
80
+ blocks: Array<{
81
+ __typename?: 'Block';
82
+ transactions: Array<{
83
+ __typename?: 'Transaction';
84
+ hash: any;
85
+ fee: any;
86
+ inputs: Array<{
87
+ __typename?: 'TransactionInput';
88
+ sourceTxIndex: number;
89
+ sourceTxHash: any;
90
+ value: any;
91
+ tokens: Array<{
92
+ __typename?: 'Token';
93
+ quantity: string;
94
+ asset: {
95
+ __typename?: 'Asset';
96
+ assetName?: any | null;
97
+ policyId: any;
98
+ };
99
+ } | null>;
100
+ }>;
101
+ outputs: Array<{
102
+ __typename?: 'TransactionOutput';
103
+ address: string;
104
+ value: any;
105
+ tokens: Array<{
106
+ __typename?: 'Token';
107
+ quantity: string;
108
+ asset: {
109
+ __typename?: 'Asset';
110
+ assetName?: any | null;
111
+ policyId: any;
112
+ };
113
+ }>;
114
+ } | null>;
115
+ metadata?: Array<{
116
+ __typename?: 'TransactionMetadata';
117
+ key: string;
118
+ value: any;
119
+ } | null> | null;
100
120
  } | null>;
101
- }>;
102
- outputs: Array<{
103
- __typename?: 'TransactionOutput';
104
- address: string;
105
- value: any;
106
- tokens: Array<{
107
- __typename?: 'Token';
108
- quantity: string;
109
- asset: {
110
- __typename?: 'Asset';
111
- assetName?: any | null;
112
- policyId: any;
113
- };
114
- }>;
115
- } | null>;
116
- metadata?: Array<{
117
- __typename?: 'TransactionMetadata';
118
- key: string;
119
- value: any;
120
- } | null> | null;
121
121
  } | null>;
122
- } | null>;
123
122
  };
124
- type GraphQLTransaction = NonNullable<
125
- NonNullable<GraphQLBlockTxsQuery['blocks'][0]>['transactions'][0]
126
- >;
123
+ type GraphQLTransaction = NonNullable<NonNullable<GraphQLBlockTxsQuery['blocks'][0]>['transactions'][0]>;
127
124
  type GraphQLTxOutput = NonNullable<GraphQLTransaction['outputs'][0]>;
128
- export {
129
- Utxo,
130
- KoiosTransaction,
131
- CardanoRosenData,
132
- CardanoMetadataRosenData,
133
- Metadata,
134
- MetadataObject,
135
- JsonObject,
136
- ListObject,
137
- NativeValue,
138
- CardanoMetadata,
139
- CardanoTx,
140
- CardanoBoxCandidate,
141
- BlockFrostTransaction,
142
- BlockFrostOutputBox,
143
- GraphQLTransaction,
144
- GraphQLTxOutput,
145
- };
146
- //# sourceMappingURL=types.d.ts.map
125
+ export { Utxo, KoiosTransaction, CardanoRosenData, CardanoMetadataRosenData, Metadata, MetadataObject, JsonObject, ListObject, NativeValue, CardanoMetadata, CardanoTx, CardanoBoxCandidate, BlockFrostTransaction, BlockFrostOutputBox, GraphQLTransaction, GraphQLTxOutput, };
126
+ //# sourceMappingURL=types.d.ts.map
@@ -3,13 +3,11 @@
3
3
  * @param data
4
4
  * @returns Rosen data or undefined if metadata is invalid
5
5
  */
6
- export declare const parseRosenData: (data: any) =>
7
- | {
8
- toChain: any;
9
- toAddress: any;
10
- bridgeFee: any;
11
- networkFee: any;
12
- fromAddress: any;
13
- }
14
- | undefined;
15
- //# sourceMappingURL=utils.d.ts.map
6
+ export declare const parseRosenData: (data: any) => {
7
+ toChain: any;
8
+ toAddress: any;
9
+ bridgeFee: any;
10
+ networkFee: any;
11
+ fromAddress: any;
12
+ } | undefined;
13
+ //# sourceMappingURL=utils.d.ts.map
@@ -1,10 +1,10 @@
1
- export declare const CARDANO_NATIVE_TOKEN = 'ada';
2
- export declare const ERGO_NATIVE_TOKEN = 'erg';
3
- export declare const BITCOIN_NATIVE_TOKEN = 'btc';
4
- export declare const BITCOIN_CHAIN = 'bitcoin';
5
- export declare const ETHEREUM_CHAIN = 'ethereum';
6
- export declare const ETHEREUM_NATIVE_TOKEN = 'eth';
7
- export declare const CARDANO_CHAIN = 'cardano';
8
- export declare const ERGO_CHAIN = 'ergo';
1
+ export declare const CARDANO_NATIVE_TOKEN = "ada";
2
+ export declare const ERGO_NATIVE_TOKEN = "erg";
3
+ export declare const BITCOIN_NATIVE_TOKEN = "btc";
4
+ export declare const BITCOIN_CHAIN = "bitcoin";
5
+ export declare const ETHEREUM_CHAIN = "ethereum";
6
+ export declare const BINANCE_CHAIN = "binance";
7
+ export declare const CARDANO_CHAIN = "cardano";
8
+ export declare const ERGO_CHAIN = "ergo";
9
9
  export declare const SUPPORTED_CHAINS: string[];
10
- //# sourceMappingURL=const.d.ts.map
10
+ //# sourceMappingURL=const.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,UAAU,SAAS,CAAC;AACjC,eAAO,MAAM,gBAAgB,UAK5B,CAAC"}
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,cAAc,aAAa,CAAC;AACzC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,UAAU,SAAS,CAAC;AACjC,eAAO,MAAM,gBAAgB,UAM5B,CAAC"}
@@ -3,7 +3,7 @@ export const ERGO_NATIVE_TOKEN = 'erg';
3
3
  export const BITCOIN_NATIVE_TOKEN = 'btc';
4
4
  export const BITCOIN_CHAIN = 'bitcoin';
5
5
  export const ETHEREUM_CHAIN = 'ethereum';
6
- export const ETHEREUM_NATIVE_TOKEN = 'eth';
6
+ export const BINANCE_CHAIN = 'binance';
7
7
  export const CARDANO_CHAIN = 'cardano';
8
8
  export const ERGO_CHAIN = 'ergo';
9
9
  export const SUPPORTED_CHAINS = [
@@ -11,5 +11,6 @@ export const SUPPORTED_CHAINS = [
11
11
  CARDANO_CHAIN,
12
12
  BITCOIN_CHAIN,
13
13
  ETHEREUM_CHAIN,
14
+ BINANCE_CHAIN,
14
15
  ];
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZ2V0Um9zZW5EYXRhL2NvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLFVBQVU7SUFDVixhQUFhO0lBQ2IsYUFBYTtJQUNiLGNBQWM7Q0FDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IENBUkRBTk9fTkFUSVZFX1RPS0VOID0gJ2FkYSc7XG5leHBvcnQgY29uc3QgRVJHT19OQVRJVkVfVE9LRU4gPSAnZXJnJztcbmV4cG9ydCBjb25zdCBCSVRDT0lOX05BVElWRV9UT0tFTiA9ICdidGMnO1xuZXhwb3J0IGNvbnN0IEJJVENPSU5fQ0hBSU4gPSAnYml0Y29pbic7XG5leHBvcnQgY29uc3QgRVRIRVJFVU1fQ0hBSU4gPSAnZXRoZXJldW0nO1xuZXhwb3J0IGNvbnN0IEVUSEVSRVVNX05BVElWRV9UT0tFTiA9ICdldGgnO1xuZXhwb3J0IGNvbnN0IENBUkRBTk9fQ0hBSU4gPSAnY2FyZGFubyc7XG5leHBvcnQgY29uc3QgRVJHT19DSEFJTiA9ICdlcmdvJztcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQ0hBSU5TID0gW1xuICBFUkdPX0NIQUlOLFxuICBDQVJEQU5PX0NIQUlOLFxuICBCSVRDT0lOX0NIQUlOLFxuICBFVEhFUkVVTV9DSEFJTixcbl07XG4iXX0=
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZ2V0Um9zZW5EYXRhL2NvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQztBQUNqQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixVQUFVO0lBQ1YsYUFBYTtJQUNiLGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQ0FSREFOT19OQVRJVkVfVE9LRU4gPSAnYWRhJztcbmV4cG9ydCBjb25zdCBFUkdPX05BVElWRV9UT0tFTiA9ICdlcmcnO1xuZXhwb3J0IGNvbnN0IEJJVENPSU5fTkFUSVZFX1RPS0VOID0gJ2J0Yyc7XG5leHBvcnQgY29uc3QgQklUQ09JTl9DSEFJTiA9ICdiaXRjb2luJztcbmV4cG9ydCBjb25zdCBFVEhFUkVVTV9DSEFJTiA9ICdldGhlcmV1bSc7XG5leHBvcnQgY29uc3QgQklOQU5DRV9DSEFJTiA9ICdiaW5hbmNlJztcbmV4cG9ydCBjb25zdCBDQVJEQU5PX0NIQUlOID0gJ2NhcmRhbm8nO1xuZXhwb3J0IGNvbnN0IEVSR09fQ0hBSU4gPSAnZXJnbyc7XG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX0NIQUlOUyA9IFtcbiAgRVJHT19DSEFJTixcbiAgQ0FSREFOT19DSEFJTixcbiAgQklUQ09JTl9DSEFJTixcbiAgRVRIRVJFVU1fQ0hBSU4sXG4gIEJJTkFOQ0VfQ0hBSU4sXG5dO1xuIl19
@@ -0,0 +1,22 @@
1
+ import { RosenData, TokenTransformation } from '../abstract/types';
2
+ import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
3
+ import { DogeEsploraTransaction, EsploraTxOutput } from './types';
4
+ import { TokenMap } from '@rosen-bridge/tokens';
5
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
6
+ export declare class DogeEsploraRosenExtractor extends AbstractRosenDataExtractor<DogeEsploraTransaction> {
7
+ readonly chain = "doge";
8
+ protected lockScriptPubKey: string;
9
+ constructor(lockAddress: string, tokens: TokenMap, logger?: AbstractLogger);
10
+ /**
11
+ * extracts RosenData from given lock transaction in Esplora format
12
+ * @param transaction the lock transaction in Esplora format
13
+ */
14
+ extractRawData: (transaction: DogeEsploraTransaction) => RosenData | undefined;
15
+ /**
16
+ * extracts and builds token transformation from UTXO and tokenMap
17
+ * @param box transaction output
18
+ * @param toChain event target chain
19
+ */
20
+ getAssetTransformation: (box: EsploraTxOutput, toChain: string) => TokenTransformation | undefined;
21
+ }
22
+ //# sourceMappingURL=DogeEsploraRosenExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DogeEsploraRosenExtractor.d.ts","sourceRoot":"","sources":["../../../../lib/getRosenData/doge/DogeEsploraRosenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG/D,qBAAa,yBAA0B,SAAQ,0BAA0B,CAAC,sBAAsB,CAAC;IAC/F,QAAQ,CAAC,KAAK,UAAc;IAC5B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc;IAK1E;;;OAGG;IACH,cAAc,gBACC,sBAAsB,KAClC,SAAS,GAAG,SAAS,CA6EtB;IAEF;;;;OAIG;IACH,sBAAsB,QACf,eAAe,WACX,MAAM,KACd,mBAAmB,GAAG,SAAS,CAehC;CACH"}
@@ -0,0 +1,104 @@
1
+ import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
2
+ import { DOGE_CHAIN, DOGE_NATIVE_TOKEN } from '../const';
3
+ import { parseRosenData, addressToOutputScript } from './utils';
4
+ export class DogeEsploraRosenExtractor extends AbstractRosenDataExtractor {
5
+ chain = DOGE_CHAIN;
6
+ lockScriptPubKey;
7
+ constructor(lockAddress, tokens, logger) {
8
+ super(lockAddress, tokens, logger);
9
+ this.lockScriptPubKey = addressToOutputScript(lockAddress);
10
+ }
11
+ /**
12
+ * extracts RosenData from given lock transaction in Esplora format
13
+ * @param transaction the lock transaction in Esplora format
14
+ */
15
+ extractRawData = (transaction) => {
16
+ const baseError = `No rosen data found for tx [${transaction.txid}]`;
17
+ try {
18
+ const outputs = transaction.vout;
19
+ if (outputs.length < 2) {
20
+ this.logger.debug(baseError + `: Insufficient number of boxes`);
21
+ return undefined;
22
+ }
23
+ let validData = false; // an OP_RETURN box with valid data is found
24
+ let validLock = false; // a lock box is found with available asset transformation
25
+ // parse rosen data from OP_RETURN box
26
+ let opReturnData;
27
+ for (let i = 0; i < outputs.length; i++) {
28
+ const output = outputs[i];
29
+ if (output.scriptpubkey.slice(0, 2) !== '6a')
30
+ continue; // not an OP_RETURN utxo
31
+ try {
32
+ opReturnData = parseRosenData(output.scriptpubkey);
33
+ validData = true;
34
+ break;
35
+ }
36
+ catch (e) {
37
+ this.logger.debug(`Failed to extract data from OP_RETURN box [${transaction.txid}.${i}]: ${e}`);
38
+ }
39
+ }
40
+ if (!validData || !opReturnData) {
41
+ this.logger.debug(baseError + `: No OP_RETURN box with valid data is found`);
42
+ return undefined;
43
+ }
44
+ // find target chain token id
45
+ let assetTransformation;
46
+ for (let i = 0; i < outputs.length; i++) {
47
+ const output = outputs[i];
48
+ if (output.scriptpubkey !== this.lockScriptPubKey)
49
+ continue; // utxo address is not lock address
50
+ assetTransformation = this.getAssetTransformation(output, opReturnData.toChain);
51
+ if (assetTransformation) {
52
+ validLock = true;
53
+ break;
54
+ }
55
+ }
56
+ if (!validLock || !assetTransformation) {
57
+ this.logger.debug(baseError + `: Failed to find rosen asset transformation`);
58
+ return undefined;
59
+ }
60
+ const fromAddress = `box:${transaction.vin[0].txid}.${transaction.vin[0].vout}`;
61
+ return {
62
+ toChain: opReturnData.toChain,
63
+ toAddress: opReturnData.toAddress,
64
+ bridgeFee: opReturnData.bridgeFee,
65
+ networkFee: opReturnData.networkFee,
66
+ fromAddress: fromAddress,
67
+ sourceChainTokenId: assetTransformation.from,
68
+ amount: assetTransformation.amount,
69
+ targetChainTokenId: assetTransformation.to,
70
+ sourceTxId: transaction.txid,
71
+ };
72
+ }
73
+ catch (e) {
74
+ this.logger.debug(`An error occurred while getting Doge rosen data from Esplora: ${e}`);
75
+ if (e instanceof Error && e.stack) {
76
+ this.logger.debug(e.stack);
77
+ }
78
+ }
79
+ return undefined;
80
+ };
81
+ /**
82
+ * extracts and builds token transformation from UTXO and tokenMap
83
+ * @param box transaction output
84
+ * @param toChain event target chain
85
+ */
86
+ getAssetTransformation = (box, toChain) => {
87
+ // try to build transformation using locked DOGE
88
+ const wrappedDoge = this.tokens.search(DOGE_CHAIN, {
89
+ tokenId: DOGE_NATIVE_TOKEN,
90
+ });
91
+ if (wrappedDoge.length > 0 && Object.hasOwn(wrappedDoge[0], toChain)) {
92
+ const dogeAmount = box.value;
93
+ return {
94
+ from: DOGE_NATIVE_TOKEN,
95
+ to: this.tokens.getID(wrappedDoge[0], toChain),
96
+ amount: dogeAmount.toString(),
97
+ };
98
+ }
99
+ else {
100
+ return undefined;
101
+ }
102
+ };
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9nZUVzcGxvcmFSb3NlbkV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9nZXRSb3NlbkRhdGEvZG9nZS9Eb2dlRXNwbG9yYVJvc2VuRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sMEJBQTBCLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUl6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhFLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSwwQkFBa0Q7SUFDdEYsS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUNsQixnQkFBZ0IsQ0FBUztJQUVuQyxZQUFZLFdBQW1CLEVBQUUsTUFBZ0IsRUFBRSxNQUF1QjtRQUN4RSxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsR0FBRyxDQUNmLFdBQW1DLEVBQ1osRUFBRTtRQUN6QixNQUFNLFNBQVMsR0FBRywrQkFBK0IsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3JFLElBQUk7WUFDRixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUVELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLDRDQUE0QztZQUNuRSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMs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LE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxzQkFBc0IsR0FBRyxDQUN2QixHQUFvQixFQUNwQixPQUFlLEVBQ2tCLEVBQUU7UUFDbkMsZ0RBQWdEO1FBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNqRCxPQUFPLEVBQUUsaUJBQWlCO1NBQzNCLENBQUMsQ0FBQztRQUNILElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDcEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUM3QixPQUFPO2dCQUNMLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO2dCQUM5QyxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRTthQUM5QixDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3NlbkRhdGEsIFRva2VuVHJhbnNmb3JtYXRpb24gfSBmcm9tICcuLi9hYnN0cmFjdC90eXBlcyc7XG5pbXBvcnQgQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3IgZnJvbSAnLi4vYWJzdHJhY3QvQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3InO1xuaW1wb3J0IHsgRE9HRV9DSEFJTiwgRE9HRV9OQVRJVkVfVE9LRU4gfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBEb2dlRXNwbG9yYVRyYW5zYWN0aW9uLCBFc3Bsb3JhVHhPdXRwdXQsIE9wUmV0dXJuRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVG9rZW5NYXAgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3Rva2Vucyc7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IHBhcnNlUm9zZW5EYXRhLCBhZGRyZXNzVG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIERvZ2VFc3Bsb3JhUm9zZW5FeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3RvcjxEb2dlRXNwbG9yYVRyYW5zYWN0aW9uPiB7XG4gIHJlYWRvbmx5IGNoYWluID0gRE9HRV9DSEFJTjtcbiAgcHJvdGVjdGVkIGxvY2tTY3JpcHRQdWJLZXk6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihsb2NrQWRkcmVzczogc3RyaW5nLCB0b2tlbnM6IFRva2VuTWFwLCBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHN1cGVyKGxvY2tBZGRyZXNzLCB0b2tlbnMsIGxvZ2dlcik7XG4gICAgdGhpcy5sb2NrU2NyaXB0UHViS2V5ID0gYWRkcmVzc1RvT3V0cHV0U2NyaXB0KGxvY2tBZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBSb3NlbkRhdGEgZnJvbSBnaXZlbiBsb2NrIHRyYW5zYWN0aW9uIGluIEVzcGxvcmEgZm9ybWF0XG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiB0aGUgbG9jayB0cmFuc2FjdGlvbiBpbiBFc3Bsb3JhIGZvcm1hdFxuICAgKi9cbiAgZXh0cmFjdFJhd0RhdGEgPSAoXG4gICAgdHJhbnNhY3Rpb246IERvZ2VFc3Bsb3JhVHJhbnNhY3Rpb25cbiAgKTogUm9zZW5EYXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBiYXNlRXJyb3IgPSBgTm8gcm9zZW4gZGF0YSBmb3VuZCBmb3IgdHggWyR7dHJhbnNhY3Rpb24udHhpZH1dYDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLnZvdXQ7XG4gICAgICBpZiAob3V0cHV0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGJhc2VFcnJvciArIGA6IEluc3VmZmljaWVudCBudW1iZXIgb2YgYm94ZXNgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbGlkRGF0YSA9IGZhbHNlOyAvLyBhbiBPUF9SRVRVUk4gYm94IHdpdGggdmFsaWQgZGF0YSBpcyBmb3VuZFxuICAgICAgbGV0IHZhbGlkTG9jayA9IGZhbHNlOyAvLyBhIGxvY2sgYm94IGlzIGZvdW5kIHdpdGggYXZhaWxhYmxlIGFzc2V0IHRyYW5zZm9ybWF0aW9uXG5cbiAgICAgIC8vIHBhcnNlIHJvc2VuIGRhdGEgZnJvbSBPUF9SRVRVUk4gYm94XG4gICAgICBsZXQgb3BSZXR1cm5EYXRhOiBPcFJldHVybkRhdGEgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgaWYgKG91dHB1dC5zY3JpcHRwdWJrZXkuc2xpY2UoMCwgMikgIT09ICc2YScpIGNvbnRpbnVlOyAvLyBub3QgYW4gT1BfUkVUVVJOIHV0eG9cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG9wUmV0dXJuRGF0YSA9IHBhcnNlUm9zZW5EYXRhKG91dHB1dC5zY3JpcHRwdWJrZXkpO1xuICAgICAgICAgIHZhbGlkRGF0YSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBkYXRhIGZyb20gT1BfUkVUVVJOIGJveCBbJHt0cmFuc2FjdGlvbi50eGlkfS4ke2l9XTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkRGF0YSB8fCAhb3BSZXR1cm5EYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGJhc2VFcnJvciArIGA6IE5vIE9QX1JFVFVSTiBib3ggd2l0aCB2YWxpZCBkYXRhIGlzIGZvdW5kYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIHRhcmdldCBjaGFpbiB0b2tlbiBpZFxuICAgICAgbGV0IGFzc2V0VHJhbnNmb3JtYXRpb246IFRva2VuVHJhbnNmb3JtYXRpb24gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgaWYgKG91dHB1dC5zY3JpcHRwdWJrZXkgIT09IHRoaXMubG9ja1NjcmlwdFB1YktleSkgY29udGludWU7IC8vIHV0eG8gYWRkcmVzcyBpcyBub3QgbG9jayBhZGRyZXNzXG4gICAgICAgIGFzc2V0VHJhbnNmb3JtYXRpb24gPSB0aGlzLmdldEFzc2V0VHJhbnNmb3JtYXRpb24oXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIG9wUmV0dXJuRGF0YS50b0NoYWluXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhc3NldFRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgdmFsaWRMb2NrID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZExvY2sgfHwgIWFzc2V0VHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYmFzZUVycm9yICsgYDogRmFpbGVkIHRvIGZpbmQgcm9zZW4gYXNzZXQgdHJhbnNmb3JtYXRpb25gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyb21BZGRyZXNzID0gYGJveDoke3RyYW5zYWN0aW9uLnZpblswXS50eGlkfS4ke3RyYW5zYWN0aW9uLnZpblswXS52b3V0fWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NoYWluOiBvcFJldHVybkRhdGEudG9DaGFpbixcbiAgICAgICAgdG9BZGRyZXNzOiBvcFJldHVybkRhdGEudG9BZGRyZXNzLFxuICAgICAgICBicmlkZ2VGZWU6IG9wUmV0dXJuRGF0YS5icmlkZ2VGZWUsXG4gICAgICAgIG5ldHdvcmtGZWU6IG9wUmV0dXJuRGF0YS5uZXR3b3JrRmVlLFxuICAgICAgICBmcm9tQWRkcmVzczogZnJvbUFkZHJlc3MsXG4gICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5mcm9tLFxuICAgICAgICBhbW91bnQ6IGFzc2V0VHJhbnNmb3JtYXRpb24uYW1vdW50LFxuICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IGFzc2V0VHJhbnNmb3JtYXRpb24udG8sXG4gICAgICAgIHNvdXJjZVR4SWQ6IHRyYW5zYWN0aW9uLnR4aWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyBEb2dlIHJvc2VuIGRhdGEgZnJvbSBFc3Bsb3JhOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICAvKipcbiAgICogZXh0cmFjdHMgYW5kIGJ1aWxkcyB0b2tlbiB0cmFuc2Zvcm1hdGlvbiBmcm9tIFVUWE8gYW5kIHRva2VuTWFwXG4gICAqIEBwYXJhbSBib3ggdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqIEBwYXJhbSB0b0NoYWluIGV2ZW50IHRhcmdldCBjaGFpblxuICAgKi9cbiAgZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbiA9IChcbiAgICBib3g6IEVzcGxvcmFUeE91dHB1dCxcbiAgICB0b0NoYWluOiBzdHJpbmdcbiAgKTogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgLy8gdHJ5IHRvIGJ1aWxkIHRyYW5zZm9ybWF0aW9uIHVzaW5nIGxvY2tlZCBET0dFXG4gICAgY29uc3Qgd3JhcHBlZERvZ2UgPSB0aGlzLnRva2Vucy5zZWFyY2goRE9HRV9DSEFJTiwge1xuICAgICAgdG9rZW5JZDogRE9HRV9OQVRJVkVfVE9LRU4sXG4gICAgfSk7XG4gICAgaWYgKHdyYXBwZWREb2dlLmxlbmd0aCA+IDAgJiYgT2JqZWN0Lmhhc093bih3cmFwcGVkRG9nZVswXSwgdG9DaGFpbikpIHtcbiAgICAgIGNvbnN0IGRvZ2VBbW91bnQgPSBib3gudmFsdWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBET0dFX05BVElWRV9UT0tFTixcbiAgICAgICAgdG86IHRoaXMudG9rZW5zLmdldElEKHdyYXBwZWREb2dlWzBdLCB0b0NoYWluKSxcbiAgICAgICAgYW1vdW50OiBkb2dlQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { RosenData, TokenTransformation } from '../abstract/types';
2
+ import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
3
+ import { DogeTxOutput } from './types';
4
+ import { TokenMap } from '@rosen-bridge/tokens';
5
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
6
+ export declare class DogeRosenExtractor extends AbstractRosenDataExtractor<string> {
7
+ readonly chain = "doge";
8
+ protected lockScriptPubKey: string;
9
+ constructor(lockAddress: string, tokens: TokenMap, logger?: AbstractLogger);
10
+ /**
11
+ * extracts RosenData from given lock transaction in DogeTx format
12
+ * @param serializedTransaction stringified transaction in DogeTx format
13
+ */
14
+ extractRawData: (serializedTransaction: string) => RosenData | undefined;
15
+ /**
16
+ * extracts and builds token transformation from UTXO and tokenMap
17
+ * @param box transaction output
18
+ * @param toChain event target chain
19
+ */
20
+ getAssetTransformation: (box: DogeTxOutput, toChain: string) => TokenTransformation | undefined;
21
+ }
22
+ //# sourceMappingURL=DogeRosenExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DogeRosenExtractor.d.ts","sourceRoot":"","sources":["../../../../lib/getRosenData/doge/DogeRosenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EAAU,YAAY,EAAgB,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,qBAAa,kBAAmB,SAAQ,0BAA0B,CAAC,MAAM,CAAC;IACxE,QAAQ,CAAC,KAAK,UAAc;IAC5B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc;IAK1E;;;OAGG;IACH,cAAc,0BAA2B,MAAM,KAAG,SAAS,GAAG,SAAS,CAqFrE;IAEF;;;;OAIG;IACH,sBAAsB,QACf,YAAY,WACR,MAAM,KACd,mBAAmB,GAAG,SAAS,CAehC;CACH"}
@@ -0,0 +1,112 @@
1
+ import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
2
+ import { DOGE_CHAIN, DOGE_NATIVE_TOKEN } from '../const';
3
+ import { parseRosenData, addressToOutputScript } from './utils';
4
+ import JsonBigInt from '@rosen-bridge/json-bigint';
5
+ export class DogeRosenExtractor extends AbstractRosenDataExtractor {
6
+ chain = DOGE_CHAIN;
7
+ lockScriptPubKey;
8
+ constructor(lockAddress, tokens, logger) {
9
+ super(lockAddress, tokens, logger);
10
+ this.lockScriptPubKey = addressToOutputScript(lockAddress);
11
+ }
12
+ /**
13
+ * extracts RosenData from given lock transaction in DogeTx format
14
+ * @param serializedTransaction stringified transaction in DogeTx format
15
+ */
16
+ extractRawData = (serializedTransaction) => {
17
+ let transaction;
18
+ try {
19
+ transaction = JsonBigInt.parse(serializedTransaction);
20
+ }
21
+ catch (e) {
22
+ throw new Error(`Failed to parse transaction json to DogeTx format while extracting rosen data: ${e}`);
23
+ }
24
+ const baseError = `No rosen data found for tx [${transaction.id}]`;
25
+ try {
26
+ const outputs = transaction.outputs;
27
+ if (outputs.length < 2) {
28
+ this.logger.debug(baseError + `: Insufficient number of boxes`);
29
+ return undefined;
30
+ }
31
+ let validData = false; // an OP_RETURN box with valid data is found
32
+ let validLock = false; // a lock box is found with available asset transformation
33
+ // parse rosen data from OP_RETURN box
34
+ let opReturnData;
35
+ for (let i = 0; i < outputs.length; i++) {
36
+ const output = outputs[i];
37
+ if (output.scriptPubKey.slice(0, 2) !== '6a')
38
+ continue; // not an OP_RETURN utxo
39
+ try {
40
+ opReturnData = parseRosenData(output.scriptPubKey);
41
+ validData = true;
42
+ break;
43
+ }
44
+ catch (e) {
45
+ this.logger.debug(`Failed to extract data from OP_RETURN box [${transaction.id}.${i}]: ${e}`);
46
+ }
47
+ }
48
+ if (!validData || !opReturnData) {
49
+ this.logger.debug(baseError + `: No OP_RETURN box with valid data is found`);
50
+ return undefined;
51
+ }
52
+ // find target chain token id
53
+ let assetTransformation;
54
+ for (let i = 0; i < outputs.length; i++) {
55
+ const output = outputs[i];
56
+ if (output.scriptPubKey !== this.lockScriptPubKey)
57
+ continue; // utxo address is not lock address
58
+ assetTransformation = this.getAssetTransformation(output, opReturnData.toChain);
59
+ if (assetTransformation) {
60
+ validLock = true;
61
+ break;
62
+ }
63
+ }
64
+ if (!validLock || !assetTransformation) {
65
+ this.logger.debug(baseError + `: Failed to find rosen asset transformation`);
66
+ return undefined;
67
+ }
68
+ const fromAddress = `box:${transaction.inputs[0].txId}.${transaction.inputs[0].index}`;
69
+ return {
70
+ toChain: opReturnData.toChain,
71
+ toAddress: opReturnData.toAddress,
72
+ bridgeFee: opReturnData.bridgeFee,
73
+ networkFee: opReturnData.networkFee,
74
+ fromAddress: fromAddress,
75
+ sourceChainTokenId: assetTransformation.from,
76
+ amount: assetTransformation.amount,
77
+ targetChainTokenId: assetTransformation.to,
78
+ sourceTxId: transaction.id,
79
+ };
80
+ }
81
+ catch (e) {
82
+ this.logger.debug(`An error occurred while getting Doge rosen data: ${e}`);
83
+ if (e instanceof Error && e.stack) {
84
+ this.logger.debug(e.stack);
85
+ }
86
+ }
87
+ return undefined;
88
+ };
89
+ /**
90
+ * extracts and builds token transformation from UTXO and tokenMap
91
+ * @param box transaction output
92
+ * @param toChain event target chain
93
+ */
94
+ getAssetTransformation = (box, toChain) => {
95
+ // try to build transformation using locked DOGE
96
+ const wrappedDoge = this.tokens.search(DOGE_CHAIN, {
97
+ tokenId: DOGE_NATIVE_TOKEN,
98
+ });
99
+ if (wrappedDoge.length > 0 && Object.hasOwn(wrappedDoge[0], toChain)) {
100
+ const satoshiAmount = box.value;
101
+ return {
102
+ from: DOGE_NATIVE_TOKEN,
103
+ to: this.tokens.getID(wrappedDoge[0], toChain),
104
+ amount: satoshiAmount.toString(),
105
+ };
106
+ }
107
+ else {
108
+ return undefined;
109
+ }
110
+ };
111
+ }
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9nZVJvc2VuRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2dldFJvc2VuRGF0YS9kb2dlL0RvZ2VSb3NlbkV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLDBCQUEwQixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoRSxPQUFPLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsMEJBQWtDO0lBQy9ELEtBQUssR0FBRyxVQUFVLENBQUM7SUFDbEIsZ0JBQWdCLENBQVM7SUFFbkMsWUFBWSxXQUFtQixFQUFFLE1BQWdCLEVBQUUsTUFBdUI7UUFDeEUsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLEdBQUcsQ0FBQyxxQkFBNkIsRUFBeUIsRUFBRTtRQUN4RSxJQUFJLFdBQW1CLENBQUM7UUFDeEIsSUFBSTtZQUNGLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDdkQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0ZBQWtGLENBQUMsRUFBRSxDQUN0RixDQUFDO1NBQ0g7UUFDRCxNQUFNLFNBQVMsR0FBRywrQkFBK0IsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQ25FLElBQUk7WUFDRixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ3BDLElBQUksT0FBTyxD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QUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLG9EQUFvRCxDQUFDLEVBQUUsQ0FDeEQsQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUI7U0FDRjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxzQkFBc0IsR0FBRyxDQUN2QixHQUFpQixFQUNqQixPQUFlLEVBQ2tCLEVBQUU7UUFDbkMsZ0RBQWdEO1FBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUNqRCxPQUFPLEVBQUUsaUJBQWlCO1NBQzNCLENBQUMsQ0FBQztRQUNILElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDcEUsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNoQyxPQUFPO2dCQUNMLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO2dCQUM5QyxNQUFNLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTthQUNqQyxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3NlbkRhdGEsIFRva2VuVHJhbnNmb3JtYXRpb24gfSBmcm9tICcuLi9hYnN0cmFjdC90eXBlcyc7XG5pbXBvcnQgQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3IgZnJvbSAnLi4vYWJzdHJhY3QvQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3InO1xuaW1wb3J0IHsgRE9HRV9DSEFJTiwgRE9HRV9OQVRJVkVfVE9LRU4gfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBEb2dlVHgsIERvZ2VUeE91dHB1dCwgT3BSZXR1cm5EYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBUb2tlbk1hcCB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvdG9rZW5zJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgcGFyc2VSb3NlbkRhdGEsIGFkZHJlc3NUb091dHB1dFNjcmlwdCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmV4cG9ydCBjbGFzcyBEb2dlUm9zZW5FeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3RvcjxzdHJpbmc+IHtcbiAgcmVhZG9ubHkgY2hhaW4gPSBET0dFX0NIQUlOO1xuICBwcm90ZWN0ZWQgbG9ja1NjcmlwdFB1YktleTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGxvY2tBZGRyZXNzOiBzdHJpbmcsIHRva2VuczogVG9rZW5NYXAsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgc3VwZXIobG9ja0FkZHJlc3MsIHRva2VucywgbG9nZ2VyKTtcbiAgICB0aGlzLmxvY2tTY3JpcHRQdWJLZXkgPSBhZGRyZXNzVG9PdXRwdXRTY3JpcHQobG9ja0FkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIFJvc2VuRGF0YSBmcm9tIGdpdmVuIGxvY2sgdHJhbnNhY3Rpb24gaW4gRG9nZVR4IGZvcm1hdFxuICAgKiBAcGFyYW0gc2VyaWFsaXplZFRyYW5zYWN0aW9uIHN0cmluZ2lmaWVkIHRyYW5zYWN0aW9uIGluIERvZ2VUeCBmb3JtYXRcbiAgICovXG4gIGV4dHJhY3RSYXdEYXRhID0gKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjogc3RyaW5nKTogUm9zZW5EYXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgICBsZXQgdHJhbnNhY3Rpb246IERvZ2VUeDtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSBKc29uQmlnSW50LnBhcnNlKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIHRyYW5zYWN0aW9uIGpzb24gdG8gRG9nZVR4IGZvcm1hdCB3aGlsZSBleHRyYWN0aW5nIHJvc2VuIGRhdGE6ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBiYXNlRXJyb3IgPSBgTm8gcm9zZW4gZGF0YSBmb3VuZCBmb3IgdHggWyR7dHJhbnNhY3Rpb24uaWR9XWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dHMgPSB0cmFuc2FjdGlvbi5vdXRwdXRzO1xuICAgICAgaWYgKG91dHB1dHMubGVuZ3RoIDwgMikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhiYXNlRXJyb3IgKyBgOiBJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGJveGVzYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWxpZERhdGEgPSBmYWxzZTsgLy8gYW4gT1BfUkVUVVJOIGJveCB3aXRoIHZhbGlkIGRhdGEgaXMgZm91bmRcbiAgICAgIGxldCB2YWxpZExvY2sgPSBmYWxzZTsgLy8gYSBsb2NrIGJveCBpcyBmb3VuZCB3aXRoIGF2YWlsYWJsZSBhc3NldCB0cmFuc2Zvcm1hdGlvblxuXG4gICAgICAvLyBwYXJzZSByb3NlbiBkYXRhIGZyb20gT1BfUkVUVVJOIGJveFxuICAgICAgbGV0IG9wUmV0dXJuRGF0YTogT3BSZXR1cm5EYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbaV07XG4gICAgICAgIGlmIChvdXRwdXQuc2NyaXB0UHViS2V5LnNsaWNlKDAsIDIpICE9PSAnNmEnKSBjb250aW51ZTsgLy8gbm90IGFuIE9QX1JFVFVSTiB1dHhvXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcFJldHVybkRhdGEgPSBwYXJzZVJvc2VuRGF0YShvdXRwdXQuc2NyaXB0UHViS2V5KTtcbiAgICAgICAgICB2YWxpZERhdGEgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIE9QX1JFVFVSTiBib3ggWyR7dHJhbnNhY3Rpb24uaWR9LiR7aX1dOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWREYXRhIHx8ICFvcFJldHVybkRhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYmFzZUVycm9yICsgYDogTm8gT1BfUkVUVVJOIGJveCB3aXRoIHZhbGlkIGRhdGEgaXMgZm91bmRgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbmQgdGFyZ2V0IGNoYWluIHRva2VuIGlkXG4gICAgICBsZXQgYXNzZXRUcmFuc2Zvcm1hdGlvbjogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICBpZiAob3V0cHV0LnNjcmlwdFB1YktleSAhPT0gdGhpcy5sb2NrU2NyaXB0UHViS2V5KSBjb250aW51ZTsgLy8gdXR4byBhZGRyZXNzIGlzIG5vdCBsb2NrIGFkZHJlc3NcbiAgICAgICAgYXNzZXRUcmFuc2Zvcm1hdGlvbiA9IHRoaXMuZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbihcbiAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgb3BSZXR1cm5EYXRhLnRvQ2hhaW5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFzc2V0VHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgICB2YWxpZExvY2sgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkTG9jayB8fCAhYXNzZXRUcmFuc2Zvcm1hdGlvbikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBiYXNlRXJyb3IgKyBgOiBGYWlsZWQgdG8gZmluZCByb3NlbiBhc3NldCB0cmFuc2Zvcm1hdGlvbmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSBgYm94OiR7dHJhbnNhY3Rpb24uaW5wdXRzWzBdLnR4SWR9LiR7dHJhbnNhY3Rpb24uaW5wdXRzWzBdLmluZGV4fWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NoYWluOiBvcFJldHVybkRhdGEudG9DaGFpbixcbiAgICAgICAgdG9BZGRyZXNzOiBvcFJldHVybkRhdGEudG9BZGRyZXNzLFxuICAgICAgICBicmlkZ2VGZWU6IG9wUmV0dXJuRGF0YS5icmlkZ2VGZWUsXG4gICAgICAgIG5ldHdvcmtGZWU6IG9wUmV0dXJuRGF0YS5uZXR3b3JrRmVlLFxuICAgICAgICBmcm9tQWRkcmVzczogZnJvbUFkZHJlc3MsXG4gICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5mcm9tLFxuICAgICAgICBhbW91bnQ6IGFzc2V0VHJhbnNmb3JtYXRpb24uYW1vdW50LFxuICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IGFzc2V0VHJhbnNmb3JtYXRpb24udG8sXG4gICAgICAgIHNvdXJjZVR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgRG9nZSByb3NlbiBkYXRhOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICAvKipcbiAgICogZXh0cmFjdHMgYW5kIGJ1aWxkcyB0b2tlbiB0cmFuc2Zvcm1hdGlvbiBmcm9tIFVUWE8gYW5kIHRva2VuTWFwXG4gICAqIEBwYXJhbSBib3ggdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqIEBwYXJhbSB0b0NoYWluIGV2ZW50IHRhcmdldCBjaGFpblxuICAgKi9cbiAgZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbiA9IChcbiAgICBib3g6IERvZ2VUeE91dHB1dCxcbiAgICB0b0NoYWluOiBzdHJpbmdcbiAgKTogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgLy8gdHJ5IHRvIGJ1aWxkIHRyYW5zZm9ybWF0aW9uIHVzaW5nIGxvY2tlZCBET0dFXG4gICAgY29uc3Qgd3JhcHBlZERvZ2UgPSB0aGlzLnRva2Vucy5zZWFyY2goRE9HRV9DSEFJTiwge1xuICAgICAgdG9rZW5JZDogRE9HRV9OQVRJVkVfVE9LRU4sXG4gICAgfSk7XG4gICAgaWYgKHdyYXBwZWREb2dlLmxlbmd0aCA+IDAgJiYgT2JqZWN0Lmhhc093bih3cmFwcGVkRG9nZVswXSwgdG9DaGFpbikpIHtcbiAgICAgIGNvbnN0IHNhdG9zaGlBbW91bnQgPSBib3gudmFsdWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBET0dFX05BVElWRV9UT0tFTixcbiAgICAgICAgdG86IHRoaXMudG9rZW5zLmdldElEKHdyYXBwZWREb2dlWzBdLCB0b0NoYWluKSxcbiAgICAgICAgYW1vdW50OiBzYXRvc2hpQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==