@rosen-bridge/rosen-extractor 8.0.0 → 8.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/dist/getRosenData/abstract/AbstractRosenDataExtractor.d.ts +19 -0
- package/dist/getRosenData/abstract/AbstractRosenDataExtractor.d.ts.map +1 -0
- package/dist/getRosenData/abstract/AbstractRosenDataExtractor.js +32 -0
- package/dist/getRosenData/abstract/types.d.ts +18 -0
- package/dist/getRosenData/abstract/types.d.ts.map +1 -0
- package/dist/getRosenData/abstract/types.js +2 -0
- package/dist/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.js +105 -0
- package/dist/getRosenData/bitcoin/BitcoinRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/bitcoin/BitcoinRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/bitcoin/BitcoinRosenExtractor.js +113 -0
- package/dist/getRosenData/bitcoin/BitcoinRpcRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/bitcoin/BitcoinRpcRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/bitcoin/BitcoinRpcRosenExtractor.js +106 -0
- package/dist/getRosenData/bitcoin/types.d.ts +89 -0
- package/dist/getRosenData/bitcoin/types.d.ts.map +1 -0
- package/dist/getRosenData/bitcoin/types.js +2 -0
- package/dist/getRosenData/bitcoin/utils.d.ts +7 -0
- package/dist/getRosenData/bitcoin/utils.d.ts.map +1 -0
- package/dist/getRosenData/bitcoin/utils.js +17 -0
- package/dist/getRosenData/cardano/CardanoBlockFrostRosenExtractor.d.ts +18 -0
- package/dist/getRosenData/cardano/CardanoBlockFrostRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/cardano/CardanoBlockFrostRosenExtractor.js +94 -0
- package/dist/getRosenData/cardano/CardanoGraphQLRosenExtractor.d.ts +18 -0
- package/dist/getRosenData/cardano/CardanoGraphQLRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/cardano/CardanoGraphQLRosenExtractor.js +92 -0
- package/dist/getRosenData/cardano/CardanoKoiosRosenExtractor.d.ts +19 -0
- package/dist/getRosenData/cardano/CardanoKoiosRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/cardano/CardanoKoiosRosenExtractor.js +95 -0
- package/dist/getRosenData/cardano/CardanoOgmiosRosenExtractor.d.ts +18 -0
- package/dist/getRosenData/cardano/CardanoOgmiosRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/cardano/CardanoOgmiosRosenExtractor.js +97 -0
- package/dist/getRosenData/cardano/CardanoRosenExtractor.d.ts +18 -0
- package/dist/getRosenData/cardano/CardanoRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/cardano/CardanoRosenExtractor.js +88 -0
- package/dist/getRosenData/cardano/types.d.ts +102 -0
- package/dist/getRosenData/cardano/types.d.ts.map +1 -0
- package/dist/getRosenData/cardano/types.js +2 -0
- package/dist/getRosenData/cardano/utils.d.ts +19 -0
- package/dist/getRosenData/cardano/utils.d.ts.map +1 -0
- package/dist/getRosenData/cardano/utils.js +32 -0
- package/dist/getRosenData/const.d.ts +13 -0
- package/dist/getRosenData/const.d.ts.map +1 -0
- package/dist/getRosenData/const.js +21 -0
- package/dist/getRosenData/doge/DogeEsploraRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/doge/DogeEsploraRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/doge/DogeEsploraRosenExtractor.js +104 -0
- package/dist/getRosenData/doge/DogeRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/doge/DogeRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/doge/DogeRosenExtractor.js +112 -0
- package/dist/getRosenData/doge/DogeRpcRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/doge/DogeRpcRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/doge/DogeRpcRosenExtractor.js +105 -0
- package/dist/getRosenData/doge/types.d.ts +87 -0
- package/dist/getRosenData/doge/types.d.ts.map +1 -0
- package/dist/getRosenData/doge/types.js +2 -0
- package/dist/getRosenData/doge/utils.d.ts +13 -0
- package/dist/getRosenData/doge/utils.d.ts.map +1 -0
- package/dist/getRosenData/doge/utils.js +58 -0
- package/dist/getRosenData/ergo/ErgoNodeRosenExtractor.d.ts +22 -0
- package/dist/getRosenData/ergo/ErgoNodeRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/ergo/ErgoNodeRosenExtractor.js +105 -0
- package/dist/getRosenData/ergo/ErgoRosenExtractor.d.ts +15 -0
- package/dist/getRosenData/ergo/ErgoRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/ergo/ErgoRosenExtractor.js +33 -0
- package/dist/getRosenData/ergo/types.d.ts +37 -0
- package/dist/getRosenData/ergo/types.d.ts.map +1 -0
- package/dist/getRosenData/ergo/types.js +2 -0
- package/dist/getRosenData/evm/EvmEthersRosenExtractor.d.ts +23 -0
- package/dist/getRosenData/evm/EvmEthersRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/evm/EvmEthersRosenExtractor.js +54 -0
- package/dist/getRosenData/evm/EvmRosenExtractor.d.ts +16 -0
- package/dist/getRosenData/evm/EvmRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/evm/EvmRosenExtractor.js +31 -0
- package/dist/getRosenData/evm/EvmRpcRosenExtractor.d.ts +26 -0
- package/dist/getRosenData/evm/EvmRpcRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/evm/EvmRpcRosenExtractor.js +123 -0
- package/dist/getRosenData/evm/utils.d.ts +7 -0
- package/dist/getRosenData/evm/utils.d.ts.map +1 -0
- package/dist/getRosenData/evm/utils.js +9 -0
- package/dist/getRosenData/runes/RunesEsploraRosenExtractor.d.ts +36 -0
- package/dist/getRosenData/runes/RunesEsploraRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/runes/RunesEsploraRosenExtractor.js +113 -0
- package/dist/getRosenData/runes/RunesRosenExtractor.d.ts +36 -0
- package/dist/getRosenData/runes/RunesRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/runes/RunesRosenExtractor.js +120 -0
- package/dist/getRosenData/runes/RunesRpcRosenExtractor.d.ts +36 -0
- package/dist/getRosenData/runes/RunesRpcRosenExtractor.d.ts.map +1 -0
- package/dist/getRosenData/runes/RunesRpcRosenExtractor.js +113 -0
- package/dist/getRosenData/runes/constants.d.ts +2 -0
- package/dist/getRosenData/runes/constants.d.ts.map +1 -0
- package/dist/getRosenData/runes/constants.js +2 -0
- package/dist/getRosenData/runes/types.d.ts +5 -0
- package/dist/getRosenData/runes/types.d.ts.map +1 -0
- package/dist/getRosenData/runes/types.js +2 -0
- package/dist/getRosenData/runes/utils.d.ts +7 -0
- package/dist/getRosenData/runes/utils.d.ts.map +1 -0
- package/dist/getRosenData/runes/utils.js +9 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/lib/getRosenData/abstract/AbstractRosenDataExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/abstract/AbstractRosenDataExtractor.js +1 -1
- package/dist/lib/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/bitcoin/BitcoinRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/bitcoin/BitcoinRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/bitcoin/BitcoinRpcRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/bitcoin/BitcoinRpcRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/bitcoin/utils.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/CardanoBlockFrostRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/CardanoBlockFrostRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/cardano/CardanoGraphQLRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/CardanoGraphQLRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/cardano/CardanoKoiosRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/CardanoKoiosRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/cardano/CardanoOgmiosRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/CardanoOgmiosRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/cardano/CardanoRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/CardanoRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/cardano/utils.d.ts.map +1 -1
- package/dist/lib/getRosenData/cardano/utils.js +1 -1
- package/dist/lib/getRosenData/doge/DogeEsploraRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/doge/DogeEsploraRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/doge/DogeRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/doge/DogeRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/doge/DogeRpcRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/doge/DogeRpcRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/doge/utils.d.ts.map +1 -1
- package/dist/lib/getRosenData/ergo/ErgoNodeRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/ergo/ErgoNodeRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/ergo/ErgoRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/ergo/ErgoRosenExtractor.js +2 -2
- package/dist/lib/getRosenData/evm/EvmEthersRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/evm/EvmEthersRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/evm/EvmRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/evm/EvmRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/evm/EvmRpcRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/evm/EvmRpcRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/evm/utils.d.ts.map +1 -1
- package/dist/lib/getRosenData/runes/RunesEsploraRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/runes/RunesEsploraRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/runes/RunesRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/runes/RunesRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/runes/RunesRpcRosenExtractor.d.ts.map +1 -1
- package/dist/lib/getRosenData/runes/RunesRpcRosenExtractor.js +1 -1
- package/dist/lib/getRosenData/runes/utils.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +31 -0
- package/package.json +12 -17
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TokenMap } from '@rosen-bridge/tokens';
|
|
2
|
+
import { RosenData } from './types';
|
|
3
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
4
|
+
export default abstract class AbstractRosenDataExtractor<TransactionType> {
|
|
5
|
+
abstract readonly chain: string;
|
|
6
|
+
protected readonly logger: AbstractLogger;
|
|
7
|
+
protected readonly tokens: TokenMap;
|
|
8
|
+
protected readonly lockAddress: string;
|
|
9
|
+
constructor(lockAddress: string, tokens: TokenMap, logger?: AbstractLogger);
|
|
10
|
+
/**
|
|
11
|
+
* extracts RosenData from given lock transaction and wrap the amount
|
|
12
|
+
*/
|
|
13
|
+
get: (transaction: TransactionType) => RosenData | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* extracts RosenData from given lock transaction
|
|
16
|
+
*/
|
|
17
|
+
abstract extractRawData: (transaction: TransactionType) => RosenData | undefined;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=AbstractRosenDataExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractRosenDataExtractor.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/abstract/AbstractRosenDataExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAG5E,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,0BAA0B,CAAC,eAAe;IACtE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAE3B,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc;IAM1E;;OAEG;IACH,GAAG,GAAI,aAAa,eAAe,KAAG,SAAS,GAAG,SAAS,CAoBzD;IAEF;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,CACvB,WAAW,EAAE,eAAe,KACzB,SAAS,GAAG,SAAS,CAAC;CAC5B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { validateAddress } from '@rosen-bridge/address-codec';
|
|
3
|
+
export default class AbstractRosenDataExtractor {
|
|
4
|
+
logger;
|
|
5
|
+
tokens;
|
|
6
|
+
lockAddress;
|
|
7
|
+
constructor(lockAddress, tokens, logger) {
|
|
8
|
+
this.lockAddress = lockAddress;
|
|
9
|
+
this.tokens = tokens;
|
|
10
|
+
this.logger = logger ? logger : new DummyLogger();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* extracts RosenData from given lock transaction and wrap the amount
|
|
14
|
+
*/
|
|
15
|
+
get = (transaction) => {
|
|
16
|
+
const rawData = this.extractRawData(transaction);
|
|
17
|
+
if (rawData) {
|
|
18
|
+
try {
|
|
19
|
+
validateAddress(rawData.toChain, rawData.toAddress);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
this.logger.debug(`Receiver address validation failed (address [${rawData.toAddress}] on chain [${rawData.toChain}]) with error: ${e}`);
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
rawData.amount = this.tokens
|
|
26
|
+
.wrapAmount(rawData.sourceChainTokenId, BigInt(rawData.amount), this.chain)
|
|
27
|
+
.amount.toString();
|
|
28
|
+
}
|
|
29
|
+
return rawData;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZ2V0Um9zZW5EYXRhL2Fic3RyYWN0L0Fic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlELE1BQU0sQ0FBQyxPQUFPLE9BQWdCLDBCQUEwQjtJQUVuQyxNQUFNLENBQWlCO0lBQ3ZCLE1BQU0sQ0FBVztJQUNqQixXQUFXLENBQVM7SUFFdkMsWUFBWSxXQUFtQixFQUFFLE1BQWdCLEVBQUUsTUFBdUI7UUFDeEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLEdBQUcsQ0FBQyxXQUE0QixFQUF5QixFQUFFO1FBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQztnQkFDSCxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsZ0RBQWdELE9BQU8sQ0FBQyxTQUFTLGVBQWUsT0FBTyxDQUFDLE9BQU8sa0JBQWtCLENBQUMsRUFBRSxDQUNySCxDQUFDO2dCQUNGLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO2lCQUN6QixVQUFVLENBQ1QsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUN0QixJQUFJLENBQUMsS0FBSyxDQUNYO2lCQUNBLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0NBUUgiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlbk1hcCB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvdG9rZW5zJztcbmltcG9ydCB7IFJvc2VuRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgdmFsaWRhdGVBZGRyZXNzIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hZGRyZXNzLWNvZGVjJztcblxuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3I8VHJhbnNhY3Rpb25UeXBlPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGNoYWluOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5zOiBUb2tlbk1hcDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvY2tBZGRyZXNzOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobG9ja0FkZHJlc3M6IHN0cmluZywgdG9rZW5zOiBUb2tlbk1hcCwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICB0aGlzLmxvY2tBZGRyZXNzID0gbG9ja0FkZHJlc3M7XG4gICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPyBsb2dnZXIgOiBuZXcgRHVtbXlMb2dnZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBSb3NlbkRhdGEgZnJvbSBnaXZlbiBsb2NrIHRyYW5zYWN0aW9uIGFuZCB3cmFwIHRoZSBhbW91bnRcbiAgICovXG4gIGdldCA9ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25UeXBlKTogUm9zZW5EYXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCByYXdEYXRhID0gdGhpcy5leHRyYWN0UmF3RGF0YSh0cmFuc2FjdGlvbik7XG4gICAgaWYgKHJhd0RhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQWRkcmVzcyhyYXdEYXRhLnRvQ2hhaW4sIHJhd0RhdGEudG9BZGRyZXNzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFJlY2VpdmVyIGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsZWQgKGFkZHJlc3MgWyR7cmF3RGF0YS50b0FkZHJlc3N9XSBvbiBjaGFpbiBbJHtyYXdEYXRhLnRvQ2hhaW59XSkgd2l0aCBlcnJvcjogJHtlfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJhd0RhdGEuYW1vdW50ID0gdGhpcy50b2tlbnNcbiAgICAgICAgLndyYXBBbW91bnQoXG4gICAgICAgICAgcmF3RGF0YS5zb3VyY2VDaGFpblRva2VuSWQsXG4gICAgICAgICAgQmlnSW50KHJhd0RhdGEuYW1vdW50KSxcbiAgICAgICAgICB0aGlzLmNoYWluXG4gICAgICAgIClcbiAgICAgICAgLmFtb3VudC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gcmF3RGF0YTtcbiAgfTtcblxuICAvKipcbiAgICogZXh0cmFjdHMgUm9zZW5EYXRhIGZyb20gZ2l2ZW4gbG9jayB0cmFuc2FjdGlvblxuICAgKi9cbiAgYWJzdHJhY3QgZXh0cmFjdFJhd0RhdGE6IChcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25UeXBlXG4gICkgPT4gUm9zZW5EYXRhIHwgdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface RosenData {
|
|
2
|
+
toChain: string;
|
|
3
|
+
toAddress: string;
|
|
4
|
+
bridgeFee: string;
|
|
5
|
+
networkFee: string;
|
|
6
|
+
fromAddress: string;
|
|
7
|
+
sourceChainTokenId: string;
|
|
8
|
+
amount: string;
|
|
9
|
+
targetChainTokenId: string;
|
|
10
|
+
sourceTxId: string;
|
|
11
|
+
}
|
|
12
|
+
interface TokenTransformation {
|
|
13
|
+
from: string;
|
|
14
|
+
to: string;
|
|
15
|
+
amount: string;
|
|
16
|
+
}
|
|
17
|
+
export { RosenData, TokenTransformation };
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/abstract/types.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZ2V0Um9zZW5EYXRhL2Fic3RyYWN0L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgUm9zZW5EYXRhIHtcbiAgdG9DaGFpbjogc3RyaW5nO1xuICB0b0FkZHJlc3M6IHN0cmluZztcbiAgYnJpZGdlRmVlOiBzdHJpbmc7XG4gIG5ldHdvcmtGZWU6IHN0cmluZztcbiAgZnJvbUFkZHJlc3M6IHN0cmluZztcbiAgc291cmNlQ2hhaW5Ub2tlbklkOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICB0YXJnZXRDaGFpblRva2VuSWQ6IHN0cmluZztcbiAgc291cmNlVHhJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVG9rZW5UcmFuc2Zvcm1hdGlvbiB7XG4gIGZyb206IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB7IFJvc2VuRGF0YSwgVG9rZW5UcmFuc2Zvcm1hdGlvbiB9O1xuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RosenData, TokenTransformation } from '../abstract/types';
|
|
2
|
+
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
3
|
+
import { BitcoinEsploraTransaction, EsploraTxOutput } from './types';
|
|
4
|
+
import { TokenMap } from '@rosen-bridge/tokens';
|
|
5
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
6
|
+
export declare class BitcoinEsploraRosenExtractor extends AbstractRosenDataExtractor<BitcoinEsploraTransaction> {
|
|
7
|
+
readonly chain = "bitcoin";
|
|
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: BitcoinEsploraTransaction) => 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=BitcoinEsploraRosenExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinEsploraRosenExtractor.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/bitcoin/BitcoinEsploraRosenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EACL,yBAAyB,EACzB,eAAe,EAEhB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,qBAAa,4BAA6B,SAAQ,0BAA0B,CAAC,yBAAyB,CAAC;IACrG,QAAQ,CAAC,KAAK,aAAiB;IAC/B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc;IAK1E;;;OAGG;IACH,cAAc,GACZ,aAAa,yBAAyB,KACrC,SAAS,GAAG,SAAS,CA6EtB;IAEF;;;;OAIG;IACH,sBAAsB,GACpB,KAAK,eAAe,EACpB,SAAS,MAAM,KACd,mBAAmB,GAAG,SAAS,CAehC;CACH"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
2
|
+
import { BITCOIN_CHAIN, BITCOIN_NATIVE_TOKEN } from '../const';
|
|
3
|
+
import { address } from 'bitcoinjs-lib';
|
|
4
|
+
import { parseOpReturn } from './utils';
|
|
5
|
+
export class BitcoinEsploraRosenExtractor extends AbstractRosenDataExtractor {
|
|
6
|
+
chain = BITCOIN_CHAIN;
|
|
7
|
+
lockScriptPubKey;
|
|
8
|
+
constructor(lockAddress, tokens, logger) {
|
|
9
|
+
super(lockAddress, tokens, logger);
|
|
10
|
+
this.lockScriptPubKey = address.toOutputScript(lockAddress).toString('hex');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* extracts RosenData from given lock transaction in Esplora format
|
|
14
|
+
* @param transaction the lock transaction in Esplora format
|
|
15
|
+
*/
|
|
16
|
+
extractRawData = (transaction) => {
|
|
17
|
+
const baseError = `No rosen data found for tx [${transaction.txid}]`;
|
|
18
|
+
try {
|
|
19
|
+
const outputs = transaction.vout;
|
|
20
|
+
if (outputs.length < 2) {
|
|
21
|
+
this.logger.debug(baseError + `: Insufficient number of boxes`);
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
let validData = false; // an OP_RETURN box with valid data is found
|
|
25
|
+
let validLock = false; // a lock box is found with available asset transformation
|
|
26
|
+
// parse rosen data from OP_RETURN box
|
|
27
|
+
let opReturnData;
|
|
28
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
29
|
+
const output = outputs[i];
|
|
30
|
+
if (output.scriptpubkey.slice(0, 2) !== '6a')
|
|
31
|
+
continue; // not an OP_RETURN utxo
|
|
32
|
+
try {
|
|
33
|
+
opReturnData = parseOpReturn(output.scriptpubkey);
|
|
34
|
+
validData = true;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
this.logger.debug(`Failed to extract data from OP_RETURN box [${transaction.txid}.${i}]: ${e}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!validData || !opReturnData) {
|
|
42
|
+
this.logger.debug(baseError + `: No OP_RETURN box with valid data is found`);
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
// find target chain token id
|
|
46
|
+
let assetTransformation;
|
|
47
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
48
|
+
const output = outputs[i];
|
|
49
|
+
if (output.scriptpubkey !== this.lockScriptPubKey)
|
|
50
|
+
continue; // utxo address is not lock address
|
|
51
|
+
assetTransformation = this.getAssetTransformation(output, opReturnData.toChain);
|
|
52
|
+
if (assetTransformation) {
|
|
53
|
+
validLock = true;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (!validLock || !assetTransformation) {
|
|
58
|
+
this.logger.debug(baseError + `: Failed to find rosen asset transformation`);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const fromAddress = `box:${transaction.vin[0].txid}.${transaction.vin[0].vout}`;
|
|
62
|
+
return {
|
|
63
|
+
toChain: opReturnData.toChain,
|
|
64
|
+
toAddress: opReturnData.toAddress,
|
|
65
|
+
bridgeFee: opReturnData.bridgeFee,
|
|
66
|
+
networkFee: opReturnData.networkFee,
|
|
67
|
+
fromAddress: fromAddress,
|
|
68
|
+
sourceChainTokenId: assetTransformation.from,
|
|
69
|
+
amount: assetTransformation.amount,
|
|
70
|
+
targetChainTokenId: assetTransformation.to,
|
|
71
|
+
sourceTxId: transaction.txid,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
this.logger.debug(`An error occurred while getting Bitcoin rosen data from Esplora: ${e}`);
|
|
76
|
+
if (e instanceof Error && e.stack) {
|
|
77
|
+
this.logger.debug(e.stack);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* extracts and builds token transformation from UTXO and tokenMap
|
|
84
|
+
* @param box transaction output
|
|
85
|
+
* @param toChain event target chain
|
|
86
|
+
*/
|
|
87
|
+
getAssetTransformation = (box, toChain) => {
|
|
88
|
+
// try to build transformation using locked BTC
|
|
89
|
+
const wrappedBtc = this.tokens.search(BITCOIN_CHAIN, {
|
|
90
|
+
tokenId: BITCOIN_NATIVE_TOKEN,
|
|
91
|
+
});
|
|
92
|
+
if (wrappedBtc.length > 0 && Object.hasOwn(wrappedBtc[0], toChain)) {
|
|
93
|
+
const satoshiAmount = box.value;
|
|
94
|
+
return {
|
|
95
|
+
from: BITCOIN_NATIVE_TOKEN,
|
|
96
|
+
to: this.tokens.getID(wrappedBtc[0], toChain),
|
|
97
|
+
amount: satoshiAmount.toString(),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0Y29pbkVzcGxvcmFSb3NlbkV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9nZXRSb3NlbkRhdGEvYml0Y29pbi9CaXRjb2luRXNwbG9yYVJvc2VuRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sMEJBQTBCLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVEvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEMsTUFBTSxPQUFPLDRCQUE2QixTQUFRLDBCQUFxRDtJQUM1RixLQUFLLEdBQUcsYUFBYSxDQUFDO0lBQ3JCLGdCQUFnQixDQUFTO0lBRW5DLFlBQVksV0FBbUIsRUFBRSxNQUFnQixFQUFFLE1BQXVCO1FBQ3hFLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxHQUFHLENBQ2YsV0FBc0MsRUFDZixFQUFFO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLCtCQUErQixXQUFXLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDckUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUNoRSxPQUFPLFNBQVMsQ0FBQztZ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QUssQ0FDZixvRUFBb0UsQ0FBQyxFQUFFLENBQ3hFLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ0gsc0JBQXNCLEdBQUcsQ0FDdkIsR0FBb0IsRUFDcEIsT0FBZSxFQUNrQixFQUFFO1FBQ25DLCtDQUErQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDbkQsT0FBTyxFQUFFLG9CQUFvQjtTQUM5QixDQUFDLENBQUM7UUFDSCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkUsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNoQyxPQUFPO2dCQUNMLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO2dCQUM3QyxNQUFNLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTthQUNqQyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3NlbkRhdGEsIFRva2VuVHJhbnNmb3JtYXRpb24gfSBmcm9tICcuLi9hYnN0cmFjdC90eXBlcyc7XG5pbXBvcnQgQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3IgZnJvbSAnLi4vYWJzdHJhY3QvQWJzdHJhY3RSb3NlbkRhdGFFeHRyYWN0b3InO1xuaW1wb3J0IHsgQklUQ09JTl9DSEFJTiwgQklUQ09JTl9OQVRJVkVfVE9LRU4gfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQge1xuICBCaXRjb2luRXNwbG9yYVRyYW5zYWN0aW9uLFxuICBFc3Bsb3JhVHhPdXRwdXQsXG4gIE9wUmV0dXJuRGF0YSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBUb2tlbk1hcCB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvdG9rZW5zJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgYWRkcmVzcyB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgcGFyc2VPcFJldHVybiB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQml0Y29pbkVzcGxvcmFSb3NlbkV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yPEJpdGNvaW5Fc3Bsb3JhVHJhbnNhY3Rpb24+IHtcbiAgcmVhZG9ubHkgY2hhaW4gPSBCSVRDT0lOX0NIQUlOO1xuICBwcm90ZWN0ZWQgbG9ja1NjcmlwdFB1YktleTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGxvY2tBZGRyZXNzOiBzdHJpbmcsIHRva2VuczogVG9rZW5NYXAsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgc3VwZXIobG9ja0FkZHJlc3MsIHRva2VucywgbG9nZ2VyKTtcbiAgICB0aGlzLmxvY2tTY3JpcHRQdWJLZXkgPSBhZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGxvY2tBZGRyZXNzKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogZXh0cmFjdHMgUm9zZW5EYXRhIGZyb20gZ2l2ZW4gbG9jayB0cmFuc2FjdGlvbiBpbiBFc3Bsb3JhIGZvcm1hdFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gdGhlIGxvY2sgdHJhbnNhY3Rpb24gaW4gRXNwbG9yYSBmb3JtYXRcbiAgICovXG4gIGV4dHJhY3RSYXdEYXRhID0gKFxuICAgIHRyYW5zYWN0aW9uOiBCaXRjb2luRXNwbG9yYVRyYW5zYWN0aW9uXG4gICk6IFJvc2VuRGF0YSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgYmFzZUVycm9yID0gYE5vIHJvc2VuIGRhdGEgZm91bmQgZm9yIHR4IFske3RyYW5zYWN0aW9uLnR4aWR9XWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dHMgPSB0cmFuc2FjdGlvbi52b3V0O1xuICAgICAgaWYgKG91dHB1dHMubGVuZ3RoIDwgMikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhiYXNlRXJyb3IgKyBgOiBJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGJveGVzYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWxpZERhdGEgPSBmYWxzZTsgLy8gYW4gT1BfUkVUVVJOIGJveCB3aXRoIHZhbGlkIGRhdGEgaXMgZm91bmRcbiAgICAgIGxldCB2YWxpZExvY2sgPSBmYWxzZTsgLy8gYSBsb2NrIGJveCBpcyBmb3VuZCB3aXRoIGF2YWlsYWJsZSBhc3NldCB0cmFuc2Zvcm1hdGlvblxuXG4gICAgICAvLyBwYXJzZSByb3NlbiBkYXRhIGZyb20gT1BfUkVUVVJOIGJveFxuICAgICAgbGV0IG9wUmV0dXJuRGF0YTogT3BSZXR1cm5EYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbaV07XG4gICAgICAgIGlmIChvdXRwdXQuc2NyaXB0cHVia2V5LnNsaWNlKDAsIDIpICE9PSAnNmEnKSBjb250aW51ZTsgLy8gbm90IGFuIE9QX1JFVFVSTiB1dHhvXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcFJldHVybkRhdGEgPSBwYXJzZU9wUmV0dXJuKG91dHB1dC5zY3JpcHRwdWJrZXkpO1xuICAgICAgICAgIHZhbGlkRGF0YSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBkYXRhIGZyb20gT1BfUkVUVVJOIGJveCBbJHt0cmFuc2FjdGlvbi50eGlkfS4ke2l9XTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkRGF0YSB8fCAhb3BSZXR1cm5EYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGJhc2VFcnJvciArIGA6IE5vIE9QX1JFVFVSTiBib3ggd2l0aCB2YWxpZCBkYXRhIGlzIGZvdW5kYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIHRhcmdldCBjaGFpbiB0b2tlbiBpZFxuICAgICAgbGV0IGFzc2V0VHJhbnNmb3JtYXRpb246IFRva2VuVHJhbnNmb3JtYXRpb24gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgaWYgKG91dHB1dC5zY3JpcHRwdWJrZXkgIT09IHRoaXMubG9ja1NjcmlwdFB1YktleSkgY29udGludWU7IC8vIHV0eG8gYWRkcmVzcyBpcyBub3QgbG9jayBhZGRyZXNzXG4gICAgICAgIGFzc2V0VHJhbnNmb3JtYXRpb24gPSB0aGlzLmdldEFzc2V0VHJhbnNmb3JtYXRpb24oXG4gICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgIG9wUmV0dXJuRGF0YS50b0NoYWluXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhc3NldFRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAgICAgdmFsaWRMb2NrID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZExvY2sgfHwgIWFzc2V0VHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYmFzZUVycm9yICsgYDogRmFpbGVkIHRvIGZpbmQgcm9zZW4gYXNzZXQgdHJhbnNmb3JtYXRpb25gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyb21BZGRyZXNzID0gYGJveDoke3RyYW5zYWN0aW9uLnZpblswXS50eGlkfS4ke3RyYW5zYWN0aW9uLnZpblswXS52b3V0fWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NoYWluOiBvcFJldHVybkRhdGEudG9DaGFpbixcbiAgICAgICAgdG9BZGRyZXNzOiBvcFJldHVybkRhdGEudG9BZGRyZXNzLFxuICAgICAgICBicmlkZ2VGZWU6IG9wUmV0dXJuRGF0YS5icmlkZ2VGZWUsXG4gICAgICAgIG5ldHdvcmtGZWU6IG9wUmV0dXJuRGF0YS5uZXR3b3JrRmVlLFxuICAgICAgICBmcm9tQWRkcmVzczogZnJvbUFkZHJlc3MsXG4gICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5mcm9tLFxuICAgICAgICBhbW91bnQ6IGFzc2V0VHJhbnNmb3JtYXRpb24uYW1vdW50LFxuICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IGFzc2V0VHJhbnNmb3JtYXRpb24udG8sXG4gICAgICAgIHNvdXJjZVR4SWQ6IHRyYW5zYWN0aW9uLnR4aWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyBCaXRjb2luIHJvc2VuIGRhdGEgZnJvbSBFc3Bsb3JhOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICAvKipcbiAgICogZXh0cmFjdHMgYW5kIGJ1aWxkcyB0b2tlbiB0cmFuc2Zvcm1hdGlvbiBmcm9tIFVUWE8gYW5kIHRva2VuTWFwXG4gICAqIEBwYXJhbSBib3ggdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqIEBwYXJhbSB0b0NoYWluIGV2ZW50IHRhcmdldCBjaGFpblxuICAgKi9cbiAgZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbiA9IChcbiAgICBib3g6IEVzcGxvcmFUeE91dHB1dCxcbiAgICB0b0NoYWluOiBzdHJpbmdcbiAgKTogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgLy8gdHJ5IHRvIGJ1aWxkIHRyYW5zZm9ybWF0aW9uIHVzaW5nIGxvY2tlZCBCVENcbiAgICBjb25zdCB3cmFwcGVkQnRjID0gdGhpcy50b2tlbnMuc2VhcmNoKEJJVENPSU5fQ0hBSU4sIHtcbiAgICAgIHRva2VuSWQ6IEJJVENPSU5fTkFUSVZFX1RPS0VOLFxuICAgIH0pO1xuICAgIGlmICh3cmFwcGVkQnRjLmxlbmd0aCA+IDAgJiYgT2JqZWN0Lmhhc093bih3cmFwcGVkQnRjWzBdLCB0b0NoYWluKSkge1xuICAgICAgY29uc3Qgc2F0b3NoaUFtb3VudCA9IGJveC52YWx1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyb206IEJJVENPSU5fTkFUSVZFX1RPS0VOLFxuICAgICAgICB0bzogdGhpcy50b2tlbnMuZ2V0SUQod3JhcHBlZEJ0Y1swXSwgdG9DaGFpbiksXG4gICAgICAgIGFtb3VudDogc2F0b3NoaUFtb3VudC50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RosenData, TokenTransformation } from '../abstract/types';
|
|
2
|
+
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
3
|
+
import { BitcoinTxOutput } from './types';
|
|
4
|
+
import { TokenMap } from '@rosen-bridge/tokens';
|
|
5
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
6
|
+
export declare class BitcoinRosenExtractor extends AbstractRosenDataExtractor<string> {
|
|
7
|
+
readonly chain = "bitcoin";
|
|
8
|
+
protected lockScriptPubKey: string;
|
|
9
|
+
constructor(lockAddress: string, tokens: TokenMap, logger?: AbstractLogger);
|
|
10
|
+
/**
|
|
11
|
+
* extracts RosenData from given lock transaction in BitcoinTx format
|
|
12
|
+
* @param serializedTransaction stringified transaction in BitcoinTx 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: BitcoinTxOutput, toChain: string) => TokenTransformation | undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=BitcoinRosenExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinRosenExtractor.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/bitcoin/BitcoinRosenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EAAa,eAAe,EAAgB,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAK/D,qBAAa,qBAAsB,SAAQ,0BAA0B,CAAC,MAAM,CAAC;IAC3E,QAAQ,CAAC,KAAK,aAAiB;IAC/B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc;IAK1E;;;OAGG;IACH,cAAc,GAAI,uBAAuB,MAAM,KAAG,SAAS,GAAG,SAAS,CAqFrE;IAEF;;;;OAIG;IACH,sBAAsB,GACpB,KAAK,eAAe,EACpB,SAAS,MAAM,KACd,mBAAmB,GAAG,SAAS,CAehC;CACH"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
2
|
+
import { BITCOIN_CHAIN, BITCOIN_NATIVE_TOKEN } from '../const';
|
|
3
|
+
import { address } from 'bitcoinjs-lib';
|
|
4
|
+
import { parseOpReturn } from './utils';
|
|
5
|
+
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
6
|
+
export class BitcoinRosenExtractor extends AbstractRosenDataExtractor {
|
|
7
|
+
chain = BITCOIN_CHAIN;
|
|
8
|
+
lockScriptPubKey;
|
|
9
|
+
constructor(lockAddress, tokens, logger) {
|
|
10
|
+
super(lockAddress, tokens, logger);
|
|
11
|
+
this.lockScriptPubKey = address.toOutputScript(lockAddress).toString('hex');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* extracts RosenData from given lock transaction in BitcoinTx format
|
|
15
|
+
* @param serializedTransaction stringified transaction in BitcoinTx format
|
|
16
|
+
*/
|
|
17
|
+
extractRawData = (serializedTransaction) => {
|
|
18
|
+
let transaction;
|
|
19
|
+
try {
|
|
20
|
+
transaction = JsonBigInt.parse(serializedTransaction);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
throw new Error(`Failed to parse transaction json to BitcoinTx format while extracting rosen data: ${e}`);
|
|
24
|
+
}
|
|
25
|
+
const baseError = `No rosen data found for tx [${transaction.id}]`;
|
|
26
|
+
try {
|
|
27
|
+
const outputs = transaction.outputs;
|
|
28
|
+
if (outputs.length < 2) {
|
|
29
|
+
this.logger.debug(baseError + `: Insufficient number of boxes`);
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
let validData = false; // an OP_RETURN box with valid data is found
|
|
33
|
+
let validLock = false; // a lock box is found with available asset transformation
|
|
34
|
+
// parse rosen data from OP_RETURN box
|
|
35
|
+
let opReturnData;
|
|
36
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
37
|
+
const output = outputs[i];
|
|
38
|
+
if (output.scriptPubKey.slice(0, 2) !== '6a')
|
|
39
|
+
continue; // not an OP_RETURN utxo
|
|
40
|
+
try {
|
|
41
|
+
opReturnData = parseOpReturn(output.scriptPubKey);
|
|
42
|
+
validData = true;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
this.logger.debug(`Failed to extract data from OP_RETURN box [${transaction.id}.${i}]: ${e}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!validData || !opReturnData) {
|
|
50
|
+
this.logger.debug(baseError + `: No OP_RETURN box with valid data is found`);
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
// find target chain token id
|
|
54
|
+
let assetTransformation;
|
|
55
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
56
|
+
const output = outputs[i];
|
|
57
|
+
if (output.scriptPubKey !== this.lockScriptPubKey)
|
|
58
|
+
continue; // utxo address is not lock address
|
|
59
|
+
assetTransformation = this.getAssetTransformation(output, opReturnData.toChain);
|
|
60
|
+
if (assetTransformation) {
|
|
61
|
+
validLock = true;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!validLock || !assetTransformation) {
|
|
66
|
+
this.logger.debug(baseError + `: Failed to find rosen asset transformation`);
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const fromAddress = `box:${transaction.inputs[0].txId}.${transaction.inputs[0].index}`;
|
|
70
|
+
return {
|
|
71
|
+
toChain: opReturnData.toChain,
|
|
72
|
+
toAddress: opReturnData.toAddress,
|
|
73
|
+
bridgeFee: opReturnData.bridgeFee,
|
|
74
|
+
networkFee: opReturnData.networkFee,
|
|
75
|
+
fromAddress: fromAddress,
|
|
76
|
+
sourceChainTokenId: assetTransformation.from,
|
|
77
|
+
amount: assetTransformation.amount,
|
|
78
|
+
targetChainTokenId: assetTransformation.to,
|
|
79
|
+
sourceTxId: transaction.id,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
this.logger.debug(`An error occurred while getting Bitcoin rosen data: ${e}`);
|
|
84
|
+
if (e instanceof Error && e.stack) {
|
|
85
|
+
this.logger.debug(e.stack);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* extracts and builds token transformation from UTXO and tokenMap
|
|
92
|
+
* @param box transaction output
|
|
93
|
+
* @param toChain event target chain
|
|
94
|
+
*/
|
|
95
|
+
getAssetTransformation = (box, toChain) => {
|
|
96
|
+
// try to build transformation using locked BTC
|
|
97
|
+
const wrappedBtc = this.tokens.search(BITCOIN_CHAIN, {
|
|
98
|
+
tokenId: BITCOIN_NATIVE_TOKEN,
|
|
99
|
+
});
|
|
100
|
+
if (wrappedBtc.length > 0 && Object.hasOwn(wrappedBtc[0], toChain)) {
|
|
101
|
+
const satoshiAmount = box.value;
|
|
102
|
+
return {
|
|
103
|
+
from: BITCOIN_NATIVE_TOKEN,
|
|
104
|
+
to: this.tokens.getID(wrappedBtc[0], toChain),
|
|
105
|
+
amount: satoshiAmount.toString(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0Y29pblJvc2VuRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2dldFJvc2VuRGF0YS9iaXRjb2luL0JpdGNvaW5Sb3NlbkV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLDBCQUEwQixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBRW5ELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSwwQkFBa0M7SUFDbEUsS0FBSyxHQUFHLGFBQWEsQ0FBQztJQUNyQixnQkFBZ0IsQ0FBUztJQUVuQyxZQUFZLFdBQW1CLEVBQUUsTUFBZ0IsRUFBRSxNQUF1QjtRQUN4RSxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsR0FBRyxDQUFDLHFCQUE2QixFQUF5QixFQUFFO1FBQ3hFLElBQUksV0FBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FDYixxRkFBcUYsQ0FBQyxFQUFFLENBQ3pGLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsK0JBQStCLFdBQVcs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LENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvc2VuRGF0YSwgVG9rZW5UcmFuc2Zvcm1hdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0L3R5cGVzJztcbmltcG9ydCBBYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3RvciBmcm9tICcuLi9hYnN0cmFjdC9BYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBCSVRDT0lOX0NIQUlOLCBCSVRDT0lOX05BVElWRV9UT0tFTiB9IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7IEJpdGNvaW5UeCwgQml0Y29pblR4T3V0cHV0LCBPcFJldHVybkRhdGEgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFRva2VuTWFwIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS90b2tlbnMnO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgeyBhZGRyZXNzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBwYXJzZU9wUmV0dXJuIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgSnNvbkJpZ0ludCBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcblxuZXhwb3J0IGNsYXNzIEJpdGNvaW5Sb3NlbkV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yPHN0cmluZz4ge1xuICByZWFkb25seSBjaGFpbiA9IEJJVENPSU5fQ0hBSU47XG4gIHByb3RlY3RlZCBsb2NrU2NyaXB0UHViS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobG9ja0FkZHJlc3M6IHN0cmluZywgdG9rZW5zOiBUb2tlbk1hcCwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICBzdXBlcihsb2NrQWRkcmVzcywgdG9rZW5zLCBsb2dnZXIpO1xuICAgIHRoaXMubG9ja1NjcmlwdFB1YktleSA9IGFkZHJlc3MudG9PdXRwdXRTY3JpcHQobG9ja0FkZHJlc3MpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBSb3NlbkRhdGEgZnJvbSBnaXZlbiBsb2NrIHRyYW5zYWN0aW9uIGluIEJpdGNvaW5UeCBmb3JtYXRcbiAgICogQHBhcmFtIHNlcmlhbGl6ZWRUcmFuc2FjdGlvbiBzdHJpbmdpZmllZCB0cmFuc2FjdGlvbiBpbiBCaXRjb2luVHggZm9ybWF0XG4gICAqL1xuICBleHRyYWN0UmF3RGF0YSA9IChzZXJpYWxpemVkVHJhbnNhY3Rpb246IHN0cmluZyk6IFJvc2VuRGF0YSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgbGV0IHRyYW5zYWN0aW9uOiBCaXRjb2luVHg7XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uID0gSnNvbkJpZ0ludC5wYXJzZShzZXJpYWxpemVkVHJhbnNhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSB0cmFuc2FjdGlvbiBqc29uIHRvIEJpdGNvaW5UeCBmb3JtYXQgd2hpbGUgZXh0cmFjdGluZyByb3NlbiBkYXRhOiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZUVycm9yID0gYE5vIHJvc2VuIGRhdGEgZm91bmQgZm9yIHR4IFske3RyYW5zYWN0aW9uLmlkfV1gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXRzID0gdHJhbnNhY3Rpb24ub3V0cHV0cztcbiAgICAgIGlmIChvdXRwdXRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYmFzZUVycm9yICsgYDogSW5zdWZmaWNpZW50IG51bWJlciBvZiBib3hlc2ApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsZXQgdmFsaWREYXRhID0gZmFsc2U7IC8vIGFuIE9QX1JFVFVSTiBib3ggd2l0aCB2YWxpZCBkYXRhIGlzIGZvdW5kXG4gICAgICBsZXQgdmFsaWRMb2NrID0gZmFsc2U7IC8vIGEgbG9jayBib3ggaXMgZm91bmQgd2l0aCBhdmFpbGFibGUgYXNzZXQgdHJhbnNmb3JtYXRpb25cblxuICAgICAgLy8gcGFyc2Ugcm9zZW4gZGF0YSBmcm9tIE9QX1JFVFVSTiBib3hcbiAgICAgIGxldCBvcFJldHVybkRhdGE6IE9wUmV0dXJuRGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICBpZiAob3V0cHV0LnNjcmlwdFB1YktleS5zbGljZSgwLCAyKSAhPT0gJzZhJykgY29udGludWU7IC8vIG5vdCBhbiBPUF9SRVRVUk4gdXR4b1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3BSZXR1cm5EYXRhID0gcGFyc2VPcFJldHVybihvdXRwdXQuc2NyaXB0UHViS2V5KTtcbiAgICAgICAgICB2YWxpZERhdGEgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIE9QX1JFVFVSTiBib3ggWyR7dHJhbnNhY3Rpb24uaWR9LiR7aX1dOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWREYXRhIHx8ICFvcFJldHVybkRhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYmFzZUVycm9yICsgYDogTm8gT1BfUkVUVVJOIGJveCB3aXRoIHZhbGlkIGRhdGEgaXMgZm91bmRgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbmQgdGFyZ2V0IGNoYWluIHRva2VuIGlkXG4gICAgICBsZXQgYXNzZXRUcmFuc2Zvcm1hdGlvbjogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICBpZiAob3V0cHV0LnNjcmlwdFB1YktleSAhPT0gdGhpcy5sb2NrU2NyaXB0UHViS2V5KSBjb250aW51ZTsgLy8gdXR4byBhZGRyZXNzIGlzIG5vdCBsb2NrIGFkZHJlc3NcbiAgICAgICAgYXNzZXRUcmFuc2Zvcm1hdGlvbiA9IHRoaXMuZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbihcbiAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgb3BSZXR1cm5EYXRhLnRvQ2hhaW5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFzc2V0VHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgICB2YWxpZExvY2sgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkTG9jayB8fCAhYXNzZXRUcmFuc2Zvcm1hdGlvbikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBiYXNlRXJyb3IgKyBgOiBGYWlsZWQgdG8gZmluZCByb3NlbiBhc3NldCB0cmFuc2Zvcm1hdGlvbmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSBgYm94OiR7dHJhbnNhY3Rpb24uaW5wdXRzWzBdLnR4SWR9LiR7dHJhbnNhY3Rpb24uaW5wdXRzWzBdLmluZGV4fWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b0NoYWluOiBvcFJldHVybkRhdGEudG9DaGFpbixcbiAgICAgICAgdG9BZGRyZXNzOiBvcFJldHVybkRhdGEudG9BZGRyZXNzLFxuICAgICAgICBicmlkZ2VGZWU6IG9wUmV0dXJuRGF0YS5icmlkZ2VGZWUsXG4gICAgICAgIG5ldHdvcmtGZWU6IG9wUmV0dXJuRGF0YS5uZXR3b3JrRmVlLFxuICAgICAgICBmcm9tQWRkcmVzczogZnJvbUFkZHJlc3MsXG4gICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5mcm9tLFxuICAgICAgICBhbW91bnQ6IGFzc2V0VHJhbnNmb3JtYXRpb24uYW1vdW50LFxuICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IGFzc2V0VHJhbnNmb3JtYXRpb24udG8sXG4gICAgICAgIHNvdXJjZVR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgQml0Y29pbiByb3NlbiBkYXRhOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICAvKipcbiAgICogZXh0cmFjdHMgYW5kIGJ1aWxkcyB0b2tlbiB0cmFuc2Zvcm1hdGlvbiBmcm9tIFVUWE8gYW5kIHRva2VuTWFwXG4gICAqIEBwYXJhbSBib3ggdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqIEBwYXJhbSB0b0NoYWluIGV2ZW50IHRhcmdldCBjaGFpblxuICAgKi9cbiAgZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbiA9IChcbiAgICBib3g6IEJpdGNvaW5UeE91dHB1dCxcbiAgICB0b0NoYWluOiBzdHJpbmdcbiAgKTogVG9rZW5UcmFuc2Zvcm1hdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgLy8gdHJ5IHRvIGJ1aWxkIHRyYW5zZm9ybWF0aW9uIHVzaW5nIGxvY2tlZCBCVENcbiAgICBjb25zdCB3cmFwcGVkQnRjID0gdGhpcy50b2tlbnMuc2VhcmNoKEJJVENPSU5fQ0hBSU4sIHtcbiAgICAgIHRva2VuSWQ6IEJJVENPSU5fTkFUSVZFX1RPS0VOLFxuICAgIH0pO1xuICAgIGlmICh3cmFwcGVkQnRjLmxlbmd0aCA+IDAgJiYgT2JqZWN0Lmhhc093bih3cmFwcGVkQnRjWzBdLCB0b0NoYWluKSkge1xuICAgICAgY29uc3Qgc2F0b3NoaUFtb3VudCA9IGJveC52YWx1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZyb206IEJJVENPSU5fTkFUSVZFX1RPS0VOLFxuICAgICAgICB0bzogdGhpcy50b2tlbnMuZ2V0SUQod3JhcHBlZEJ0Y1swXSwgdG9DaGFpbiksXG4gICAgICAgIGFtb3VudDogc2F0b3NoaUFtb3VudC50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { RosenData, TokenTransformation } from '../abstract/types';
|
|
2
|
+
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
3
|
+
import { BitcoinRpcTransaction, BitcoinRpcTxOutput } from './types';
|
|
4
|
+
import { TokenMap } from '@rosen-bridge/tokens';
|
|
5
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
6
|
+
export declare class BitcoinRpcRosenExtractor extends AbstractRosenDataExtractor<BitcoinRpcTransaction> {
|
|
7
|
+
readonly chain = "bitcoin";
|
|
8
|
+
protected lockScriptPubKey: string;
|
|
9
|
+
constructor(lockAddress: string, tokens: TokenMap, logger?: AbstractLogger);
|
|
10
|
+
/**
|
|
11
|
+
* extracts RosenData from given lock transaction in Rpc format
|
|
12
|
+
* @param transaction the lock transaction in Rpc format
|
|
13
|
+
*/
|
|
14
|
+
extractRawData: (transaction: BitcoinRpcTransaction) => 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: BitcoinRpcTxOutput, toChain: string) => TokenTransformation | undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=BitcoinRpcRosenExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinRpcRosenExtractor.d.ts","sourceRoot":"","sources":["../../../lib/getRosenData/bitcoin/BitcoinRpcRosenExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,0BAA0B,MAAM,wCAAwC,CAAC;AAEhF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,qBAAa,wBAAyB,SAAQ,0BAA0B,CAAC,qBAAqB,CAAC;IAC7F,QAAQ,CAAC,KAAK,aAAiB;IAC/B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAEvB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc;IAK1E;;;OAGG;IACH,cAAc,GACZ,aAAa,qBAAqB,KACjC,SAAS,GAAG,SAAS,CA6EtB;IAEF;;;;OAIG;IACH,sBAAsB,GACpB,KAAK,kBAAkB,EACvB,SAAS,MAAM,KACd,mBAAmB,GAAG,SAAS,CAgBhC;CACH"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import AbstractRosenDataExtractor from '../abstract/AbstractRosenDataExtractor';
|
|
2
|
+
import { BITCOIN_CHAIN, BITCOIN_NATIVE_TOKEN } from '../const';
|
|
3
|
+
import { address } from 'bitcoinjs-lib';
|
|
4
|
+
import { parseOpReturn } from './utils';
|
|
5
|
+
export class BitcoinRpcRosenExtractor extends AbstractRosenDataExtractor {
|
|
6
|
+
chain = BITCOIN_CHAIN;
|
|
7
|
+
lockScriptPubKey;
|
|
8
|
+
constructor(lockAddress, tokens, logger) {
|
|
9
|
+
super(lockAddress, tokens, logger);
|
|
10
|
+
this.lockScriptPubKey = address.toOutputScript(lockAddress).toString('hex');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* extracts RosenData from given lock transaction in Rpc format
|
|
14
|
+
* @param transaction the lock transaction in Rpc format
|
|
15
|
+
*/
|
|
16
|
+
extractRawData = (transaction) => {
|
|
17
|
+
const baseError = `No rosen data found for tx [${transaction.txid}]`;
|
|
18
|
+
try {
|
|
19
|
+
const outputs = transaction.vout;
|
|
20
|
+
if (outputs.length < 2) {
|
|
21
|
+
this.logger.debug(baseError + `: Insufficient number of boxes`);
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
let validData = false; // an OP_RETURN box with valid data is found
|
|
25
|
+
let validLock = false; // a lock box is found with available asset transformation
|
|
26
|
+
// parse rosen data from OP_RETURN box
|
|
27
|
+
let opReturnData;
|
|
28
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
29
|
+
const output = outputs[i];
|
|
30
|
+
if (output.scriptPubKey.hex.slice(0, 2) !== '6a')
|
|
31
|
+
continue; // not an OP_RETURN utxo
|
|
32
|
+
try {
|
|
33
|
+
opReturnData = parseOpReturn(output.scriptPubKey.hex);
|
|
34
|
+
validData = true;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
this.logger.debug(`Failed to extract data from OP_RETURN box [${transaction.txid}.${i}]: ${e}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!validData || !opReturnData) {
|
|
42
|
+
this.logger.debug(baseError + `: No OP_RETURN box with valid data is found`);
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
// find target chain token id
|
|
46
|
+
let assetTransformation;
|
|
47
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
48
|
+
const output = outputs[i];
|
|
49
|
+
if (output.scriptPubKey.hex !== this.lockScriptPubKey)
|
|
50
|
+
continue; // utxo address is not lock address
|
|
51
|
+
assetTransformation = this.getAssetTransformation(output, opReturnData.toChain);
|
|
52
|
+
if (assetTransformation) {
|
|
53
|
+
validLock = true;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (!validLock || !assetTransformation) {
|
|
58
|
+
this.logger.debug(baseError + `: Failed to find rosen asset transformation`);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const fromAddress = `box:${transaction.vin[0].txid}.${transaction.vin[0].vout}`;
|
|
62
|
+
return {
|
|
63
|
+
toChain: opReturnData.toChain,
|
|
64
|
+
toAddress: opReturnData.toAddress,
|
|
65
|
+
bridgeFee: opReturnData.bridgeFee,
|
|
66
|
+
networkFee: opReturnData.networkFee,
|
|
67
|
+
fromAddress: fromAddress,
|
|
68
|
+
sourceChainTokenId: assetTransformation.from,
|
|
69
|
+
amount: assetTransformation.amount,
|
|
70
|
+
targetChainTokenId: assetTransformation.to,
|
|
71
|
+
sourceTxId: transaction.txid,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
this.logger.debug(`An error occurred while getting Bitcoin rosen data from Rpc: ${e}`);
|
|
76
|
+
if (e instanceof Error && e.stack) {
|
|
77
|
+
this.logger.debug(e.stack);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* extracts and builds token transformation from UTXO and tokenMap
|
|
84
|
+
* @param box transaction output
|
|
85
|
+
* @param toChain event target chain
|
|
86
|
+
*/
|
|
87
|
+
getAssetTransformation = (box, toChain) => {
|
|
88
|
+
// try to build transformation using locked BTC
|
|
89
|
+
const wrappedBtc = this.tokens.search(BITCOIN_CHAIN, {
|
|
90
|
+
tokenId: BITCOIN_NATIVE_TOKEN,
|
|
91
|
+
});
|
|
92
|
+
if (wrappedBtc.length > 0 && Object.hasOwn(wrappedBtc[0], toChain)) {
|
|
93
|
+
const parts = box.value.toString().split('.');
|
|
94
|
+
const part1 = ((parts[1] ?? '') + '0'.repeat(8)).substring(0, 8);
|
|
95
|
+
return {
|
|
96
|
+
from: BITCOIN_NATIVE_TOKEN,
|
|
97
|
+
to: this.tokens.getID(wrappedBtc[0], toChain),
|
|
98
|
+
amount: (parts[0] === '0' ? '' : parts[0]) + part1,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQml0Y29pblJwY1Jvc2VuRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2dldFJvc2VuRGF0YS9iaXRjb2luL0JpdGNvaW5ScGNSb3NlbkV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLDBCQUEwQixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFRL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXhDLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSwwQkFBaUQ7SUFDcEYsS0FBSyxHQUFHLGFBQWEsQ0FBQztJQUNyQixnQkFBZ0IsQ0FBUztJQUVuQyxZQUFZLFdBQW1CLEVBQUUsTUFBZ0IsRUFBRSxNQUF1QjtRQUN4RSxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsR0FBRyxDQUNmLFdBQWtDLEVBQ1gsRUFBRTtRQUN6QixNQUFNLFNBQVMsR0FBRywrQkFBK0IsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3JFLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQztnQkFDaEUsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FB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QUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLO2FBQ25ELENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvc2VuRGF0YSwgVG9rZW5UcmFuc2Zvcm1hdGlvbiB9IGZyb20gJy4uL2Fic3RyYWN0L3R5cGVzJztcbmltcG9ydCBBYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3RvciBmcm9tICcuLi9hYnN0cmFjdC9BYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBCSVRDT0lOX0NIQUlOLCBCSVRDT0lOX05BVElWRV9UT0tFTiB9IGZyb20gJy4uL2NvbnN0JztcbmltcG9ydCB7XG4gIEJpdGNvaW5ScGNUcmFuc2FjdGlvbixcbiAgQml0Y29pblJwY1R4T3V0cHV0LFxuICBPcFJldHVybkRhdGEsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVG9rZW5NYXAgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3Rva2Vucyc7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IGFkZHJlc3MgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IHBhcnNlT3BSZXR1cm4gfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEJpdGNvaW5ScGNSb3NlbkV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yPEJpdGNvaW5ScGNUcmFuc2FjdGlvbj4ge1xuICByZWFkb25seSBjaGFpbiA9IEJJVENPSU5fQ0hBSU47XG4gIHByb3RlY3RlZCBsb2NrU2NyaXB0UHViS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobG9ja0FkZHJlc3M6IHN0cmluZywgdG9rZW5zOiBUb2tlbk1hcCwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICBzdXBlcihsb2NrQWRkcmVzcywgdG9rZW5zLCBsb2dnZXIpO1xuICAgIHRoaXMubG9ja1NjcmlwdFB1YktleSA9IGFkZHJlc3MudG9PdXRwdXRTY3JpcHQobG9ja0FkZHJlc3MpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBSb3NlbkRhdGEgZnJvbSBnaXZlbiBsb2NrIHRyYW5zYWN0aW9uIGluIFJwYyBmb3JtYXRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIHRoZSBsb2NrIHRyYW5zYWN0aW9uIGluIFJwYyBmb3JtYXRcbiAgICovXG4gIGV4dHJhY3RSYXdEYXRhID0gKFxuICAgIHRyYW5zYWN0aW9uOiBCaXRjb2luUnBjVHJhbnNhY3Rpb25cbiAgKTogUm9zZW5EYXRhIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBiYXNlRXJyb3IgPSBgTm8gcm9zZW4gZGF0YSBmb3VuZCBmb3IgdHggWyR7dHJhbnNhY3Rpb24udHhpZH1dYDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLnZvdXQ7XG4gICAgICBpZiAob3V0cHV0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGJhc2VFcnJvciArIGA6IEluc3VmZmljaWVudCBudW1iZXIgb2YgYm94ZXNgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbGlkRGF0YSA9IGZhbHNlOyAvLyBhbiBPUF9SRVRVUk4gYm94IHdpdGggdmFsaWQgZGF0YSBpcyBmb3VuZFxuICAgICAgbGV0IHZhbGlkTG9jayA9IGZhbHNlOyAvLyBhIGxvY2sgYm94IGlzIGZvdW5kIHdpdGggYXZhaWxhYmxlIGFzc2V0IHRyYW5zZm9ybWF0aW9uXG5cbiAgICAgIC8vIHBhcnNlIHJvc2VuIGRhdGEgZnJvbSBPUF9SRVRVUk4gYm94XG4gICAgICBsZXQgb3BSZXR1cm5EYXRhOiBPcFJldHVybkRhdGEgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tpXTtcbiAgICAgICAgaWYgKG91dHB1dC5zY3JpcHRQdWJLZXkuaGV4LnNsaWNlKDAsIDIpICE9PSAnNmEnKSBjb250aW51ZTsgLy8gbm90IGFuIE9QX1JFVFVSTiB1dHhvXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcFJldHVybkRhdGEgPSBwYXJzZU9wUmV0dXJuKG91dHB1dC5zY3JpcHRQdWJLZXkuaGV4KTtcbiAgICAgICAgICB2YWxpZERhdGEgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIE9QX1JFVFVSTiBib3ggWyR7dHJhbnNhY3Rpb24udHhpZH0uJHtpfV06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF2YWxpZERhdGEgfHwgIW9wUmV0dXJuRGF0YSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBiYXNlRXJyb3IgKyBgOiBObyBPUF9SRVRVUk4gYm94IHdpdGggdmFsaWQgZGF0YSBpcyBmb3VuZGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gZmluZCB0YXJnZXQgY2hhaW4gdG9rZW4gaWRcbiAgICAgIGxldCBhc3NldFRyYW5zZm9ybWF0aW9uOiBUb2tlblRyYW5zZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbaV07XG4gICAgICAgIGlmIChvdXRwdXQuc2NyaXB0UHViS2V5LmhleCAhPT0gdGhpcy5sb2NrU2NyaXB0UHViS2V5KSBjb250aW51ZTsgLy8gdXR4byBhZGRyZXNzIGlzIG5vdCBsb2NrIGFkZHJlc3NcbiAgICAgICAgYXNzZXRUcmFuc2Zvcm1hdGlvbiA9IHRoaXMuZ2V0QXNzZXRUcmFuc2Zvcm1hdGlvbihcbiAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgb3BSZXR1cm5EYXRhLnRvQ2hhaW5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGFzc2V0VHJhbnNmb3JtYXRpb24pIHtcbiAgICAgICAgICB2YWxpZExvY2sgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkTG9jayB8fCAhYXNzZXRUcmFuc2Zvcm1hdGlvbikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBiYXNlRXJyb3IgKyBgOiBGYWlsZWQgdG8gZmluZCByb3NlbiBhc3NldCB0cmFuc2Zvcm1hdGlvbmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSBgYm94OiR7dHJhbnNhY3Rpb24udmluWzBdLnR4aWR9LiR7dHJhbnNhY3Rpb24udmluWzBdLnZvdXR9YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvQ2hhaW46IG9wUmV0dXJuRGF0YS50b0NoYWluLFxuICAgICAgICB0b0FkZHJlc3M6IG9wUmV0dXJuRGF0YS50b0FkZHJlc3MsXG4gICAgICAgIGJyaWRnZUZlZTogb3BSZXR1cm5EYXRhLmJyaWRnZUZlZSxcbiAgICAgICAgbmV0d29ya0ZlZTogb3BSZXR1cm5EYXRhLm5ldHdvcmtGZWUsXG4gICAgICAgIGZyb21BZGRyZXNzOiBmcm9tQWRkcmVzcyxcbiAgICAgICAgc291cmNlQ2hhaW5Ub2tlbklkOiBhc3NldFRyYW5zZm9ybWF0aW9uLmZyb20sXG4gICAgICAgIGFtb3VudDogYXNzZXRUcmFuc2Zvcm1hdGlvbi5hbW91bnQsXG4gICAgICAgIHRhcmdldENoYWluVG9rZW5JZDogYXNzZXRUcmFuc2Zvcm1hdGlvbi50byxcbiAgICAgICAgc291cmNlVHhJZDogdHJhbnNhY3Rpb24udHhpZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIEJpdGNvaW4gcm9zZW4gZGF0YSBmcm9tIFJwYzogJHtlfWBcbiAgICAgICk7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoZS5zdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGFuZCBidWlsZHMgdG9rZW4gdHJhbnNmb3JtYXRpb24gZnJvbSBVVFhPIGFuZCB0b2tlbk1hcFxuICAgKiBAcGFyYW0gYm94IHRyYW5zYWN0aW9uIG91dHB1dFxuICAgKiBAcGFyYW0gdG9DaGFpbiBldmVudCB0YXJnZXQgY2hhaW5cbiAgICovXG4gIGdldEFzc2V0VHJhbnNmb3JtYXRpb24gPSAoXG4gICAgYm94OiBCaXRjb2luUnBjVHhPdXRwdXQsXG4gICAgdG9DaGFpbjogc3RyaW5nXG4gICk6IFRva2VuVHJhbnNmb3JtYXRpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgIC8vIHRyeSB0byBidWlsZCB0cmFuc2Zvcm1hdGlvbiB1c2luZyBsb2NrZWQgQlRDXG4gICAgY29uc3Qgd3JhcHBlZEJ0YyA9IHRoaXMudG9rZW5zLnNlYXJjaChCSVRDT0lOX0NIQUlOLCB7XG4gICAgICB0b2tlbklkOiBCSVRDT0lOX05BVElWRV9UT0tFTixcbiAgICB9KTtcbiAgICBpZiAod3JhcHBlZEJ0Yy5sZW5ndGggPiAwICYmIE9iamVjdC5oYXNPd24od3JhcHBlZEJ0Y1swXSwgdG9DaGFpbikpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gYm94LnZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IHBhcnQxID0gKChwYXJ0c1sxXSA/PyAnJykgKyAnMCcucmVwZWF0KDgpKS5zdWJzdHJpbmcoMCwgOCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBCSVRDT0lOX05BVElWRV9UT0tFTixcbiAgICAgICAgdG86IHRoaXMudG9rZW5zLmdldElEKHdyYXBwZWRCdGNbMF0sIHRvQ2hhaW4pLFxuICAgICAgICBhbW91bnQ6IChwYXJ0c1swXSA9PT0gJzAnID8gJycgOiBwYXJ0c1swXSkgKyBwYXJ0MSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuIl19
|