@rosen-bridge/rosen-extractor 9.0.0 → 10.1.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.
- package/CHANGELOG.md +300 -0
- package/dist/getRosenData/abstract/{AbstractRosenDataExtractor.d.ts → abstractRosenDataExtractor.d.ts} +1 -1
- package/dist/getRosenData/abstract/{AbstractRosenDataExtractor.d.ts.map → abstractRosenDataExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/abstract/{AbstractRosenDataExtractor.js → abstractRosenDataExtractor.js} +1 -1
- package/dist/getRosenData/abstract/types.d.ts +1 -0
- package/dist/getRosenData/abstract/types.d.ts.map +1 -1
- package/dist/getRosenData/abstract/types.js +1 -1
- package/dist/getRosenData/bitcoin/{BitcoinEsploraRosenExtractor.d.ts → bitcoinEsploraRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/bitcoin/{BitcoinEsploraRosenExtractor.d.ts.map → bitcoinEsploraRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/bitcoin/bitcoinEsploraRosenExtractor.js +108 -0
- package/dist/getRosenData/bitcoin/{BitcoinRosenExtractor.d.ts → bitcoinRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/bitcoin/{BitcoinRosenExtractor.d.ts.map → bitcoinRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/bitcoin/bitcoinRosenExtractor.js +116 -0
- package/dist/getRosenData/bitcoin/{BitcoinRpcRosenExtractor.d.ts → bitcoinRpcRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/bitcoin/{BitcoinRpcRosenExtractor.d.ts.map → bitcoinRpcRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/bitcoin/bitcoinRpcRosenExtractor.js +109 -0
- package/dist/getRosenData/bitcoin/utils.js +1 -1
- package/dist/getRosenData/bitcoin-runes/{BitcoinRunesEsploraRosenExtractor.d.ts → bitcoinRunesEsploraRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/bitcoin-runes/{BitcoinRunesEsploraRosenExtractor.d.ts.map → bitcoinRunesEsploraRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/bitcoin-runes/bitcoinRunesEsploraRosenExtractor.js +117 -0
- package/dist/getRosenData/bitcoin-runes/{BitcoinRunesRosenExtractor.d.ts → bitcoinRunesRosenExtractor.d.ts} +12 -13
- package/dist/getRosenData/bitcoin-runes/bitcoinRunesRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/bitcoin-runes/bitcoinRunesRosenExtractor.js +141 -0
- package/dist/getRosenData/bitcoin-runes/{BitcoinRunesRpcRosenExtractor.d.ts → bitcoinRunesRpcRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/bitcoin-runes/{BitcoinRunesRpcRosenExtractor.d.ts.map → bitcoinRunesRpcRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/bitcoin-runes/bitcoinRunesRpcRosenExtractor.js +117 -0
- package/dist/getRosenData/bitcoin-runes/types.d.ts +25 -0
- package/dist/getRosenData/bitcoin-runes/types.d.ts.map +1 -1
- package/dist/getRosenData/bitcoin-runes/types.js +1 -1
- package/dist/getRosenData/bitcoin-runes/utils.js +1 -1
- package/dist/getRosenData/cardano/{CardanoBlockFrostRosenExtractor.d.ts → cardanoBlockFrostRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/cardano/{CardanoBlockFrostRosenExtractor.d.ts.map → cardanoBlockFrostRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/cardano/cardanoBlockFrostRosenExtractor.js +96 -0
- package/dist/getRosenData/cardano/{CardanoGraphQLRosenExtractor.d.ts → cardanoGraphQLRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/cardano/{CardanoGraphQLRosenExtractor.d.ts.map → cardanoGraphQLRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/cardano/cardanoGraphQLRosenExtractor.js +94 -0
- package/dist/getRosenData/cardano/{CardanoKoiosRosenExtractor.d.ts → cardanoKoiosRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/cardano/{CardanoKoiosRosenExtractor.d.ts.map → cardanoKoiosRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/cardano/cardanoKoiosRosenExtractor.js +97 -0
- package/dist/getRosenData/cardano/{CardanoOgmiosRosenExtractor.d.ts → cardanoOgmiosRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/cardano/{CardanoOgmiosRosenExtractor.d.ts.map → cardanoOgmiosRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/cardano/cardanoOgmiosRosenExtractor.js +99 -0
- package/dist/getRosenData/cardano/{CardanoRosenExtractor.d.ts → cardanoRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/cardano/{CardanoRosenExtractor.d.ts.map → cardanoRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/cardano/cardanoRosenExtractor.js +90 -0
- package/dist/getRosenData/doge/{DogeEsploraRosenExtractor.d.ts → dogeEsploraRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/doge/{DogeEsploraRosenExtractor.d.ts.map → dogeEsploraRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/doge/dogeEsploraRosenExtractor.js +107 -0
- package/dist/getRosenData/doge/{DogeRosenExtractor.d.ts → dogeRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/doge/{DogeRosenExtractor.d.ts.map → dogeRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/doge/dogeRosenExtractor.js +115 -0
- package/dist/getRosenData/doge/{DogeRpcRosenExtractor.d.ts → dogeRpcRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/doge/{DogeRpcRosenExtractor.d.ts.map → dogeRpcRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/doge/dogeRpcRosenExtractor.js +108 -0
- package/dist/getRosenData/doge/utils.js +1 -1
- package/dist/getRosenData/ergo/{ErgoNodeRosenExtractor.d.ts → ergoNodeRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/ergo/{ErgoNodeRosenExtractor.d.ts.map → ergoNodeRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/ergo/ergoNodeRosenExtractor.js +106 -0
- package/dist/getRosenData/ergo/{ErgoRosenExtractor.d.ts → ergoRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/ergo/{ErgoRosenExtractor.d.ts.map → ergoRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/ergo/{ErgoRosenExtractor.js → ergoRosenExtractor.js} +3 -3
- package/dist/getRosenData/evm/{EvmEthersRosenExtractor.d.ts → evmEthersRosenExtractor.d.ts} +3 -3
- package/dist/getRosenData/evm/{EvmEthersRosenExtractor.d.ts.map → evmEthersRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/evm/{EvmEthersRosenExtractor.js → evmEthersRosenExtractor.js} +3 -3
- package/dist/getRosenData/evm/{EvmRosenExtractor.d.ts → evmRosenExtractor.d.ts} +3 -3
- package/dist/getRosenData/evm/{EvmRosenExtractor.d.ts.map → evmRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/evm/{EvmRosenExtractor.js → evmRosenExtractor.js} +3 -3
- package/dist/getRosenData/evm/{EvmRpcRosenExtractor.d.ts → evmRpcRosenExtractor.d.ts} +2 -2
- package/dist/getRosenData/evm/{EvmRpcRosenExtractor.d.ts.map → evmRpcRosenExtractor.d.ts.map} +1 -1
- package/dist/getRosenData/evm/{EvmRpcRosenExtractor.js → evmRpcRosenExtractor.js} +4 -3
- package/dist/index.d.ts +20 -20
- package/dist/index.js +21 -21
- package/dist/utils.js +1 -1
- package/package.json +25 -19
- package/dist/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.js +0 -105
- package/dist/getRosenData/bitcoin/BitcoinRosenExtractor.js +0 -113
- package/dist/getRosenData/bitcoin/BitcoinRpcRosenExtractor.js +0 -106
- package/dist/getRosenData/bitcoin-runes/BitcoinRunesEsploraRosenExtractor.js +0 -114
- package/dist/getRosenData/bitcoin-runes/BitcoinRunesRosenExtractor.d.ts.map +0 -1
- package/dist/getRosenData/bitcoin-runes/BitcoinRunesRosenExtractor.js +0 -121
- package/dist/getRosenData/bitcoin-runes/BitcoinRunesRpcRosenExtractor.js +0 -114
- package/dist/getRosenData/cardano/CardanoBlockFrostRosenExtractor.js +0 -94
- package/dist/getRosenData/cardano/CardanoGraphQLRosenExtractor.js +0 -92
- package/dist/getRosenData/cardano/CardanoKoiosRosenExtractor.js +0 -95
- package/dist/getRosenData/cardano/CardanoOgmiosRosenExtractor.js +0 -97
- package/dist/getRosenData/cardano/CardanoRosenExtractor.js +0 -88
- package/dist/getRosenData/doge/DogeEsploraRosenExtractor.js +0 -104
- package/dist/getRosenData/doge/DogeRosenExtractor.js +0 -112
- package/dist/getRosenData/doge/DogeRpcRosenExtractor.js +0 -105
- package/dist/getRosenData/ergo/ErgoNodeRosenExtractor.js +0 -105
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
2
|
-
import { DOGE_CHAIN, DOGE_NATIVE_TOKEN } from '../const';
|
|
3
|
-
import { parseRosenData, addressToOutputScript } from './utils';
|
|
4
|
-
export class DogeRpcRosenExtractor 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 Rpc format
|
|
13
|
-
* @param transaction the lock transaction in Rpc 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.hex.slice(0, 2) !== '6a')
|
|
30
|
-
continue; // not an OP_RETURN utxo
|
|
31
|
-
try {
|
|
32
|
-
opReturnData = parseRosenData(output.scriptPubKey.hex);
|
|
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.hex !== 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 Rpc: ${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 parts = box.value.toString().split('.');
|
|
93
|
-
const part1 = ((parts[1] ?? '') + '0'.repeat(8)).substring(0, 8);
|
|
94
|
-
return {
|
|
95
|
-
from: DOGE_NATIVE_TOKEN,
|
|
96
|
-
to: this.tokens.getID(wrappedDoge[0], toChain),
|
|
97
|
-
amount: (parts[0] === '0' ? '' : parts[0]) + part1,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9nZVJwY1Jvc2VuRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2dldFJvc2VuRGF0YS9kb2dlL0RvZ2VScGNSb3NlbkV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLDBCQUEwQixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoRSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsMEJBQThDO0lBQzlFLEtBQUssR0FBRyxVQUFVLENBQUM7SUFDbEIsZ0JBQWdCLENBQVM7SUFFbkMsWUFBWSxXQUFtQixFQUFFLE1BQWdCLEVBQUUsTUFBdUI7UUFDeEUsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLEdBQUcsQ0FBQyxXQUErQixFQUF5QixFQUFFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLCtCQUErQixXQUFXLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDckUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsNENBQTRDO1lBQ25FLElBQUksU0FBUyxHQUFHLEtBQUss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QUFHLEtBQUs7YUFDbkQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm9zZW5EYXRhLCBUb2tlblRyYW5zZm9ybWF0aW9uIH0gZnJvbSAnLi4vYWJzdHJhY3QvdHlwZXMnO1xuaW1wb3J0IEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yIGZyb20gJy4uL2Fic3RyYWN0L0Fic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yJztcbmltcG9ydCB7IERPR0VfQ0hBSU4sIERPR0VfTkFUSVZFX1RPS0VOIH0gZnJvbSAnLi4vY29uc3QnO1xuaW1wb3J0IHsgRG9nZVJwY1RyYW5zYWN0aW9uLCBEb2dlUnBjVHhPdXRwdXQsIE9wUmV0dXJuRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVG9rZW5NYXAgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3Rva2Vucyc7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IHBhcnNlUm9zZW5EYXRhLCBhZGRyZXNzVG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIERvZ2VScGNSb3NlbkV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yPERvZ2VScGNUcmFuc2FjdGlvbj4ge1xuICByZWFkb25seSBjaGFpbiA9IERPR0VfQ0hBSU47XG4gIHByb3RlY3RlZCBsb2NrU2NyaXB0UHViS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobG9ja0FkZHJlc3M6IHN0cmluZywgdG9rZW5zOiBUb2tlbk1hcCwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICBzdXBlcihsb2NrQWRkcmVzcywgdG9rZW5zLCBsb2dnZXIpO1xuICAgIHRoaXMubG9ja1NjcmlwdFB1YktleSA9IGFkZHJlc3NUb091dHB1dFNjcmlwdChsb2NrQWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogZXh0cmFjdHMgUm9zZW5EYXRhIGZyb20gZ2l2ZW4gbG9jayB0cmFuc2FjdGlvbiBpbiBScGMgZm9ybWF0XG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiB0aGUgbG9jayB0cmFuc2FjdGlvbiBpbiBScGMgZm9ybWF0XG4gICAqL1xuICBleHRyYWN0UmF3RGF0YSA9ICh0cmFuc2FjdGlvbjogRG9nZVJwY1RyYW5zYWN0aW9uKTogUm9zZW5EYXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBiYXNlRXJyb3IgPSBgTm8gcm9zZW4gZGF0YSBmb3VuZCBmb3IgdHggWyR7dHJhbnNhY3Rpb24udHhpZH1dYDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLnZvdXQ7XG4gICAgICBpZiAob3V0cHV0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGJhc2VFcnJvciArIGA6IEluc3VmZmljaWVudCBudW1iZXIgb2YgYm94ZXNgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbGlkRGF0YSA9IGZhbHNlOyAvLyBhbiBPUF9SRVRVUk4gYm94IHdpdGggdmFsaWQgZGF0YSBpcyBmb3VuZFxuICAgICAgbGV0IHZhbGlkTG9jayA9IGZhbHNlOyAvLyBhIGxvY2sgYm94IGlzIGZvdW5kIHdpdGggYXZhaWxhYmxlIGFzc2V0IHRyYW5zZm9ybWF0aW9uXG5cbiAgICAgIC8vIHBhcnNlIHJvc2VuIGRhdGEgZnJvbSBPUF9SRVRVUk4gYm94XG4gICAgICBsZXQgb3BSZXR1cm5EYXRhOiBPcFJldHVybkRhdGEgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgaWYgKG91dHB1dC5zY3JpcHRQdWJLZXkuaGV4LnNsaWNlKDAsIDIpICE9PSAnNmEnKSBjb250aW51ZTsgLy8gbm90IGFuIE9QX1JFVFVSTiB1dHhvXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcFJldHVybkRhdGEgPSBwYXJzZVJvc2VuRGF0YShvdXRwdXQuc2NyaXB0UHViS2V5LmhleCk7XG4gICAgICAgICAgdmFsaWREYXRhID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IGRhdGEgZnJvbSBPUF9SRVRVUk4gYm94IFske3RyYW5zYWN0aW9uLnR4aWR9LiR7aX1dOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWREYXRhIHx8ICFvcFJldHVybkRhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYmFzZUVycm9yICsgYDogTm8gT1BfUkVUVVJOIGJveCB3aXRoIHZhbGlkIGRhdGEgaXMgZm91bmRgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbmQgdGFyZ2V0IGNoYWluIHRva2VuIGlkXG4gICAgICBsZXQgYXNzZXRUcmFuc2Zvcm1hdGlvbjogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICBpZiAob3V0cHV0LnNjcmlwdFB1YktleS5oZXggIT09IHRoaXMubG9ja1NjcmlwdFB1YktleSkgY29udGludWU7IC8vIHV0eG8gYWRkcmVzcyBpcyBub3QgbG9jayBhZGRyZXNzXG4gICAgICAgIGFzc2V0VHJhbnNmb3JtYXRpb24gPSB0aGlzLmdldEFzc2V0VHJhbnNmb3JtYXRpb24oXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIG9wUmV0dXJuRGF0YS50b0NoYWluXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhc3NldFRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgdmFsaWRMb2NrID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZExvY2sgfHwgIWFzc2V0VHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYmFzZUVycm9yICsgYDogRmFpbGVkIHRvIGZpbmQgcm9zZW4gYXNzZXQgdHJhbnNmb3JtYXRpb25gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyb21BZGRyZXNzID0gYGJveDoke3RyYW5zYWN0aW9uLnZpblswXS50eGlkfS4ke3RyYW5zYWN0aW9uLnZpblswXS52b3V0fWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NoYWluOiBvcFJldHVybkRhdGEudG9DaGFpbixcbiAgICAgICAgdG9BZGRyZXNzOiBvcFJldHVybkRhdGEudG9BZGRyZXNzLFxuICAgICAgICBicmlkZ2VGZWU6IG9wUmV0dXJuRGF0YS5icmlkZ2VGZWUsXG4gICAgICAgIG5ldHdvcmtGZWU6IG9wUmV0dXJuRGF0YS5uZXR3b3JrRmVlLFxuICAgICAgICBmcm9tQWRkcmVzczogZnJvbUFkZHJlc3MsXG4gICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5mcm9tLFxuICAgICAgICBhbW91bnQ6IGFzc2V0VHJhbnNmb3JtYXRpb24uYW1vdW50LFxuICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IGFzc2V0VHJhbnNmb3JtYXRpb24udG8sXG4gICAgICAgIHNvdXJjZVR4SWQ6IHRyYW5zYWN0aW9uLnR4aWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyBEb2dlIHJvc2VuIGRhdGEgZnJvbSBScGM6ICR7ZX1gXG4gICAgICApO1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGUuc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBhbmQgYnVpbGRzIHRva2VuIHRyYW5zZm9ybWF0aW9uIGZyb20gVVRYTyBhbmQgdG9rZW5NYXBcbiAgICogQHBhcmFtIGJveCB0cmFuc2FjdGlvbiBvdXRwdXRcbiAgICogQHBhcmFtIHRvQ2hhaW4gZXZlbnQgdGFyZ2V0IGNoYWluXG4gICAqL1xuICBnZXRBc3NldFRyYW5zZm9ybWF0aW9uID0gKFxuICAgIGJveDogRG9nZVJwY1R4T3V0cHV0LFxuICAgIHRvQ2hhaW46IHN0cmluZ1xuICApOiBUb2tlblRyYW5zZm9ybWF0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgICAvLyB0cnkgdG8gYnVpbGQgdHJhbnNmb3JtYXRpb24gdXNpbmcgbG9ja2VkIERPR0VcbiAgICBjb25zdCB3cmFwcGVkRG9nZSA9IHRoaXMudG9rZW5zLnNlYXJjaChET0dFX0NIQUlOLCB7XG4gICAgICB0b2tlbklkOiBET0dFX05BVElWRV9UT0tFTixcbiAgICB9KTtcbiAgICBpZiAod3JhcHBlZERvZ2UubGVuZ3RoID4gMCAmJiBPYmplY3QuaGFzT3duKHdyYXBwZWREb2dlWzBdLCB0b0NoYWluKSkge1xuICAgICAgY29uc3QgcGFydHMgPSBib3gudmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuICAgICAgY29uc3QgcGFydDEgPSAoKHBhcnRzWzFdID8/ICcnKSArICcwJy5yZXBlYXQoOCkpLnN1YnN0cmluZygwLCA4KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyb206IERPR0VfTkFUSVZFX1RPS0VOLFxuICAgICAgICB0bzogdGhpcy50b2tlbnMuZ2V0SUQod3JhcHBlZERvZ2VbMF0sIHRvQ2hhaW4pLFxuICAgICAgICBhbW91bnQ6IChwYXJ0c1swXSA9PT0gJzAnID8gJycgOiBwYXJ0c1swXSkgKyBwYXJ0MSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuIl19
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
2
|
-
import { ERGO_CHAIN, ERGO_NATIVE_TOKEN } from '../const';
|
|
3
|
-
import { Address, Constant } from 'ergo-lib-wasm-nodejs';
|
|
4
|
-
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
5
|
-
export class ErgoNodeRosenExtractor extends AbstractRosenDataExtractor {
|
|
6
|
-
chain = ERGO_CHAIN;
|
|
7
|
-
lockErgoTree;
|
|
8
|
-
constructor(lockAddress, tokens, logger) {
|
|
9
|
-
super(lockAddress, tokens, logger);
|
|
10
|
-
this.lockErgoTree = Address.from_base58(lockAddress)
|
|
11
|
-
.to_ergo_tree()
|
|
12
|
-
.to_base16_bytes();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* extracts RosenData from given lock transaction in Node format
|
|
16
|
-
* @param transaction the lock transaction in Node format
|
|
17
|
-
*/
|
|
18
|
-
extractRawData = (transaction) => {
|
|
19
|
-
const baseError = `No rosen data found for tx [${transaction.id}]`;
|
|
20
|
-
try {
|
|
21
|
-
for (const box of transaction.outputs) {
|
|
22
|
-
const boxBaseError = `No rosen data found in box [${box.boxId}]`;
|
|
23
|
-
if (box.ergoTree === this.lockErgoTree && box.additionalRegisters?.R4) {
|
|
24
|
-
const R4 = Constant.decode_from_base16(box.additionalRegisters.R4);
|
|
25
|
-
if (R4) {
|
|
26
|
-
const R4Serialized = R4.to_coll_coll_byte();
|
|
27
|
-
if (R4Serialized.length >= 5) {
|
|
28
|
-
const toChain = Buffer.from(R4Serialized[0]).toString();
|
|
29
|
-
const assetTransformation = this.getAssetTransformation(box, toChain);
|
|
30
|
-
if (assetTransformation) {
|
|
31
|
-
return {
|
|
32
|
-
toChain: toChain,
|
|
33
|
-
toAddress: Buffer.from(R4Serialized[1]).toString(),
|
|
34
|
-
bridgeFee: Buffer.from(R4Serialized[3]).toString(),
|
|
35
|
-
networkFee: Buffer.from(R4Serialized[2]).toString(),
|
|
36
|
-
fromAddress: Buffer.from(R4Serialized[4]).toString(),
|
|
37
|
-
sourceChainTokenId: assetTransformation.from,
|
|
38
|
-
amount: assetTransformation.amount,
|
|
39
|
-
targetChainTokenId: assetTransformation.to,
|
|
40
|
-
sourceTxId: transaction.id,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else
|
|
45
|
-
this.logger.debug(boxBaseError +
|
|
46
|
-
`: length of data in R4 is less than expected [${R4Serialized.length} < 5]`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
if (box.ergoTree !== this.lockErgoTree)
|
|
51
|
-
this.logger.debug(boxBaseError +
|
|
52
|
-
`: invalid ergo tree [${box.ergoTree} !== ${this.lockErgoTree}]`);
|
|
53
|
-
else
|
|
54
|
-
this.logger.debug(boxBaseError + `: no R4`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
this.logger.debug(baseError + `: No valid rosen data found in any output box registers`);
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
this.logger.debug(`An error occurred while getting Ergo rosen data: ${e}`);
|
|
61
|
-
if (e instanceof Error && e.stack) {
|
|
62
|
-
this.logger.debug(e.stack);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return undefined;
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* extracts and builds token transformation from NodeOutputBox and tokenMap
|
|
69
|
-
* @param box transaction output
|
|
70
|
-
* @param toChain event target chain
|
|
71
|
-
*/
|
|
72
|
-
getAssetTransformation = (box, toChain) => {
|
|
73
|
-
// try to build transformation using locked tokens
|
|
74
|
-
if (box.assets && box.assets.length > 0) {
|
|
75
|
-
for (const lockedToken of box.assets) {
|
|
76
|
-
const token = this.tokens.search(ERGO_CHAIN, {
|
|
77
|
-
tokenId: lockedToken.tokenId,
|
|
78
|
-
});
|
|
79
|
-
if (token.length > 0 && Object.hasOwn(token[0], toChain)) {
|
|
80
|
-
return {
|
|
81
|
-
from: lockedToken.tokenId,
|
|
82
|
-
to: this.tokens.getID(token[0], toChain),
|
|
83
|
-
amount: lockedToken.amount.toString(),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// try to build transformation using locked Erg
|
|
89
|
-
const erg = this.tokens.search(ERGO_CHAIN, {
|
|
90
|
-
tokenId: ERGO_NATIVE_TOKEN,
|
|
91
|
-
});
|
|
92
|
-
if (erg.length > 0 && Object.hasOwn(erg[0], toChain)) {
|
|
93
|
-
return {
|
|
94
|
-
from: ERGO_NATIVE_TOKEN,
|
|
95
|
-
to: this.tokens.getID(erg[0], toChain),
|
|
96
|
-
amount: box.value.toString(),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
this.logger.debug(`No rosen asset transformation found for box [${box.boxId}]: box assets: ${JsonBigInt.stringify(box.assets)}`);
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJnb05vZGVSb3NlbkV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9nZXRSb3NlbkRhdGEvZXJnby9FcmdvTm9kZVJvc2VuRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sMEJBQTBCLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUd6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBRW5ELE1BQU0sT0FBTyxzQkFBdUIsU0FBUSwwQkFBMkM7SUFDNUUsS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUM1QixZQUFZLENBQVM7SUFFckIsWUFBWSxXQUFtQixFQUFFLE1BQWdCLEVBQUUsTUFBdUI7UUFDeEUsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQzthQUNqRCxZQUFZLEVBQUU7YUFDZCxlQUFlLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxHQUFHLENBQUMsV0FBNEIsRUFBeUIsRUFBRTtRQUN2RSxNQUFNLFNBQVMsR0FBRywrQkFBK0IsV0FBVyxDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQ25FLElBQUksQ0FBQztZQUNILEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QyxNQUFNLFlBQVksR0FBRywrQkFBK0IsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUNqRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsRUFB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QUMsS0FDTixrQkFBa0IsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDckQsQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvc2VuRGF0YSwgVG9rZW5UcmFuc2Zvcm1hdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0L3R5cGVzJztcbmltcG9ydCBBYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3RvciBmcm9tICcuLi9hYnN0cmFjdC9BYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBFUkdPX0NIQUlOLCBFUkdPX05BVElWRV9UT0tFTiB9IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7IE5vZGVPdXRwdXRCb3gsIE5vZGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVG9rZW5NYXAgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3Rva2Vucyc7XG5pbXBvcnQgeyBBZGRyZXNzLCBDb25zdGFudCB9IGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmV4cG9ydCBjbGFzcyBFcmdvTm9kZVJvc2VuRXh0cmFjdG9yIGV4dGVuZHMgQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3I8Tm9kZVRyYW5zYWN0aW9uPiB7XG4gIHJlYWRvbmx5IGNoYWluID0gRVJHT19DSEFJTjtcbiAgbG9ja0VyZ29UcmVlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobG9ja0FkZHJlc3M6IHN0cmluZywgdG9rZW5zOiBUb2tlbk1hcCwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICBzdXBlcihsb2NrQWRkcmVzcywgdG9rZW5zLCBsb2dnZXIpO1xuICAgIHRoaXMubG9ja0VyZ29UcmVlID0gQWRkcmVzcy5mcm9tX2Jhc2U1OChsb2NrQWRkcmVzcylcbiAgICAgIC50b19lcmdvX3RyZWUoKVxuICAgICAgLnRvX2Jhc2UxNl9ieXRlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIFJvc2VuRGF0YSBmcm9tIGdpdmVuIGxvY2sgdHJhbnNhY3Rpb24gaW4gTm9kZSBmb3JtYXRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIHRoZSBsb2NrIHRyYW5zYWN0aW9uIGluIE5vZGUgZm9ybWF0XG4gICAqL1xuICBleHRyYWN0UmF3RGF0YSA9ICh0cmFuc2FjdGlvbjogTm9kZVRyYW5zYWN0aW9uKTogUm9zZW5EYXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBiYXNlRXJyb3IgPSBgTm8gcm9zZW4gZGF0YSBmb3VuZCBmb3IgdHggWyR7dHJhbnNhY3Rpb24uaWR9XWA7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgYm94IG9mIHRyYW5zYWN0aW9uLm91dHB1dHMpIHtcbiAgICAgICAgY29uc3QgYm94QmFzZUVycm9yID0gYE5vIHJvc2VuIGRhdGEgZm91bmQgaW4gYm94IFske2JveC5ib3hJZH1dYDtcbiAgICAgICAgaWYgKGJveC5lcmdvVHJlZSA9PT0gdGhpcy5sb2NrRXJnb1RyZWUgJiYgYm94LmFkZGl0aW9uYWxSZWdpc3RlcnM/LlI0KSB7XG4gICAgICAgICAgY29uc3QgUjQgPSBDb25zdGFudC5kZWNvZGVfZnJvbV9iYXNlMTYoYm94LmFkZGl0aW9uYWxSZWdpc3RlcnMuUjQpO1xuICAgICAgICAgIGlmIChSNCkge1xuICAgICAgICAgICAgY29uc3QgUjRTZXJpYWxpemVkID0gUjQudG9fY29sbF9jb2xsX2J5dGUoKTtcbiAgICAgICAgICAgIGlmIChSNFNlcmlhbGl6ZWQubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9DaGFpbiA9IEJ1ZmZlci5mcm9tKFI0U2VyaWFsaXplZFswXSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICBjb25zdCBhc3NldFRyYW5zZm9ybWF0aW9uID0gdGhpcy5nZXRBc3NldFRyYW5zZm9ybWF0aW9uKFxuICAgICAgICAgICAgICAgIGJveCxcbiAgICAgICAgICAgICAgICB0b0NoYWluXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChhc3NldFRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHRvQ2hhaW46IHRvQ2hhaW4sXG4gICAgICAgICAgICAgICAgICB0b0FkZHJlc3M6IEJ1ZmZlci5mcm9tKFI0U2VyaWFsaXplZFsxXSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIGJyaWRnZUZlZTogQnVmZmVyLmZyb20oUjRTZXJpYWxpemVkWzNdKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgbmV0d29ya0ZlZTogQnVmZmVyLmZyb20oUjRTZXJpYWxpemVkWzJdKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgZnJvbUFkZHJlc3M6IEJ1ZmZlci5mcm9tKFI0U2VyaWFsaXplZFs0XSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5mcm9tLFxuICAgICAgICAgICAgICAgICAgYW1vdW50OiBhc3NldFRyYW5zZm9ybWF0aW9uLmFtb3VudCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldENoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi50byxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBib3hCYXNlRXJyb3IgK1xuICAgICAgICAgICAgICAgICAgYDogbGVuZ3RoIG9mIGRhdGEgaW4gUjQgaXMgbGVzcyB0aGFuIGV4cGVjdGVkIFske1I0U2VyaWFsaXplZC5sZW5ndGh9IDwgNV1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChib3guZXJnb1RyZWUgIT09IHRoaXMubG9ja0VyZ29UcmVlKVxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGJveEJhc2VFcnJvciArXG4gICAgICAgICAgICAgICAgYDogaW52YWxpZCBlcmdvIHRyZWUgWyR7Ym94LmVyZ29UcmVlfSAhPT0gJHt0aGlzLmxvY2tFcmdvVHJlZX1dYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBlbHNlIHRoaXMubG9nZ2VyLmRlYnVnKGJveEJhc2VFcnJvciArIGA6IG5vIFI0YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBiYXNlRXJyb3IgKyBgOiBObyB2YWxpZCByb3NlbiBkYXRhIGZvdW5kIGluIGFueSBvdXRwdXQgYm94IHJlZ2lzdGVyc2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIEVyZ28gcm9zZW4gZGF0YTogJHtlfWBcbiAgICAgICk7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoZS5zdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGFuZCBidWlsZHMgdG9rZW4gdHJhbnNmb3JtYXRpb24gZnJvbSBOb2RlT3V0cHV0Qm94IGFuZCB0b2tlbk1hcFxuICAgKiBAcGFyYW0gYm94IHRyYW5zYWN0aW9uIG91dHB1dFxuICAgKiBAcGFyYW0gdG9DaGFpbiBldmVudCB0YXJnZXQgY2hhaW5cbiAgICovXG4gIGdldEFzc2V0VHJhbnNmb3JtYXRpb24gPSAoXG4gICAgYm94OiBOb2RlT3V0cHV0Qm94LFxuICAgIHRvQ2hhaW46IHN0cmluZ1xuICApOiBUb2tlblRyYW5zZm9ybWF0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgICAvLyB0cnkgdG8gYnVpbGQgdHJhbnNmb3JtYXRpb24gdXNpbmcgbG9ja2VkIHRva2Vuc1xuICAgIGlmIChib3guYXNzZXRzICYmIGJveC5hc3NldHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBsb2NrZWRUb2tlbiBvZiBib3guYXNzZXRzKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbnMuc2VhcmNoKEVSR09fQ0hBSU4sIHtcbiAgICAgICAgICB0b2tlbklkOiBsb2NrZWRUb2tlbi50b2tlbklkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDAgJiYgT2JqZWN0Lmhhc093bih0b2tlblswXSwgdG9DaGFpbikpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnJvbTogbG9ja2VkVG9rZW4udG9rZW5JZCxcbiAgICAgICAgICAgIHRvOiB0aGlzLnRva2Vucy5nZXRJRCh0b2tlblswXSwgdG9DaGFpbiksXG4gICAgICAgICAgICBhbW91bnQ6IGxvY2tlZFRva2VuLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0cnkgdG8gYnVpbGQgdHJhbnNmb3JtYXRpb24gdXNpbmcgbG9ja2VkIEVyZ1xuICAgIGNvbnN0IGVyZyA9IHRoaXMudG9rZW5zLnNlYXJjaChFUkdPX0NIQUlOLCB7XG4gICAgICB0b2tlbklkOiBFUkdPX05BVElWRV9UT0tFTixcbiAgICB9KTtcbiAgICBpZiAoZXJnLmxlbmd0aCA+IDAgJiYgT2JqZWN0Lmhhc093bihlcmdbMF0sIHRvQ2hhaW4pKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBFUkdPX05BVElWRV9UT0tFTixcbiAgICAgICAgdG86IHRoaXMudG9rZW5zLmdldElEKGVyZ1swXSwgdG9DaGFpbiksXG4gICAgICAgIGFtb3VudDogYm94LnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIHJvc2VuIGFzc2V0IHRyYW5zZm9ybWF0aW9uIGZvdW5kIGZvciBib3ggWyR7XG4gICAgICAgICAgYm94LmJveElkXG4gICAgICAgIH1dOiBib3ggYXNzZXRzOiAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGJveC5hc3NldHMpfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
|