@bitgo/abstract-utxo 13.2.2 → 13.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACxE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAgBrF"}
1
+ {"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACxE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxD;AA0BD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAgBrF"}
@@ -1,5 +1,28 @@
1
- import { BlockchairApi } from '@bitgo/blockapis';
1
+ import { ApiRequestError, BlockchairApi } from '@bitgo/blockapis';
2
+ import { RecoveryProviderError } from '@bitgo/sdk-core';
2
3
  import { ApiNotImplementedError } from './baseApi';
4
+ /**
5
+ * Re-map `@bitgo/blockapis` provider failures (`ApiRequestError`) to the shared
6
+ * `RecoveryProviderError` so a recovery scanner can distinguish "indexer failed"
7
+ * from "wallet is empty". `ApiRequestError` is the single error type the blockchair
8
+ * http client surfaces for network failures, non-2xx responses, and malformed bodies.
9
+ */
10
+ function wrapProviderErrors(provider) {
11
+ return new Proxy(provider, {
12
+ get(target, prop, receiver) {
13
+ const value = Reflect.get(target, prop, receiver);
14
+ if (typeof value === 'function') {
15
+ return (...args) => Promise.resolve(value.apply(target, args)).catch((e) => {
16
+ if (e instanceof ApiRequestError) {
17
+ throw new RecoveryProviderError(e.message, e);
18
+ }
19
+ throw e;
20
+ });
21
+ }
22
+ return value;
23
+ },
24
+ });
25
+ }
3
26
  export function forCoin(coinName, apiToken) {
4
27
  switch (coinName) {
5
28
  case 'btc':
@@ -12,8 +35,8 @@ export function forCoin(coinName, apiToken) {
12
35
  case 'doge':
13
36
  case 'ltc':
14
37
  case 'zec':
15
- return BlockchairApi.forCoin(coinName, { apiToken });
38
+ return wrapProviderErrors(BlockchairApi.forCoin(coinName, { apiToken }));
16
39
  }
17
40
  throw new ApiNotImplementedError(coinName);
18
41
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQThCLE1BQU0sa0JBQWtCLENBQUM7QUFJN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBb0JuRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCLEVBQUUsUUFBaUI7SUFDekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja2NoYWlyQXBpLCBBZGRyZXNzSW5mbywgVHJhbnNhY3Rpb25JTyB9IGZyb20gJ0BiaXRnby9ibG9ja2FwaXMnO1xuXG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQgfSBmcm9tICcuLi91bnNwZW50JztcblxuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4vYmFzZUFwaSc7XG5cbi8qKlxuICogQW4gYWNjb3VudCB3aXRoIGJlYXIgbWluaW11bSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgcmVjb3Zlcmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeUFjY291bnREYXRhIHtcbiAgdHhDb3VudDogbnVtYmVyO1xuICB0b3RhbEJhbGFuY2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBBZGRyZXNzQXBpICYgVXR4b0FwaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5UHJvdmlkZXI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICBnZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbnNwZW50PFROdW1iZXI+W10+O1xuICBnZXRBZGRyZXNzSW5mbyhhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPEFkZHJlc3NJbmZvPjtcbiAgZ2V0VHJhbnNhY3Rpb25IZXgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICBnZXRUcmFuc2FjdGlvbklPKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JTz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JDb2luKGNvaW5OYW1lOiBzdHJpbmcsIGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlcjxudW1iZXI+IHtcbiAgc3dpdGNoIChjb2luTmFtZSkge1xuICAgIGNhc2UgJ2J0Yyc6XG4gICAgY2FzZSAndGJ0Yyc6XG4gICAgY2FzZSAnYmNoJzpcbiAgICBjYXNlICdiY2hhJzpcbiAgICBjYXNlICdic3YnOlxuICAgIGNhc2UgJ2J0Zyc6XG4gICAgY2FzZSAnZGFzaCc6XG4gICAgY2FzZSAnZG9nZSc6XG4gICAgY2FzZSAnbHRjJzpcbiAgICBjYXNlICd6ZWMnOlxuICAgICAgcmV0dXJuIEJsb2NrY2hhaXJBcGkuZm9yQ29pbihjb2luTmFtZSwgeyBhcGlUb2tlbiB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yKGNvaW5OYW1lKTtcbn1cbiJdfQ==
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUE4QixNQUFNLGtCQUFrQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXhELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQW9CbkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUE2QixRQUFXO0lBQ2pFLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVE7WUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLFlBQVksZUFBZSxFQUFFLENBQUM7d0JBQ2pDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxDQUFDO29CQUNELE1BQU0sQ0FBQyxDQUFDO2dCQUNWLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUNGLENBQU0sQ0FBQztBQUNWLENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCLEVBQUUsUUFBaUI7SUFDekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwaVJlcXVlc3RFcnJvciwgQmxvY2tjaGFpckFwaSwgQWRkcmVzc0luZm8sIFRyYW5zYWN0aW9uSU8gfSBmcm9tICdAYml0Z28vYmxvY2thcGlzJztcbmltcG9ydCB7IFJlY292ZXJ5UHJvdmlkZXJFcnJvciB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgVW5zcGVudCB9IGZyb20gJy4uL3Vuc3BlbnQnO1xuXG5pbXBvcnQgeyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi9iYXNlQXBpJztcblxuLyoqXG4gKiBBbiBhY2NvdW50IHdpdGggYmVhciBtaW5pbXVtIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciByZWNvdmVyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5QWNjb3VudERhdGEge1xuICB0eENvdW50OiBudW1iZXI7XG4gIHRvdGFsQmFsYW5jZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIEFkZHJlc3NBcGkgJiBVdHhvQXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlQcm92aWRlcjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIGdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10pOiBQcm9taXNlPFVuc3BlbnQ8VE51bWJlcj5bXT47XG4gIGdldEFkZHJlc3NJbmZvKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8QWRkcmVzc0luZm8+O1xuICBnZXRUcmFuc2FjdGlvbkhleCh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gIGdldFRyYW5zYWN0aW9uSU8odHhpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbklPPjtcbn1cblxuLyoqXG4gKiBSZS1tYXAgYEBiaXRnby9ibG9ja2FwaXNgIHByb3ZpZGVyIGZhaWx1cmVzIChgQXBpUmVxdWVzdEVycm9yYCkgdG8gdGhlIHNoYXJlZFxuICogYFJlY292ZXJ5UHJvdmlkZXJFcnJvcmAgc28gYSByZWNvdmVyeSBzY2FubmVyIGNhbiBkaXN0aW5ndWlzaCBcImluZGV4ZXIgZmFpbGVkXCJcbiAqIGZyb20gXCJ3YWxsZXQgaXMgZW1wdHlcIi4gYEFwaVJlcXVlc3RFcnJvcmAgaXMgdGhlIHNpbmdsZSBlcnJvciB0eXBlIHRoZSBibG9ja2NoYWlyXG4gKiBodHRwIGNsaWVudCBzdXJmYWNlcyBmb3IgbmV0d29yayBmYWlsdXJlcywgbm9uLTJ4eCByZXNwb25zZXMsIGFuZCBtYWxmb3JtZWQgYm9kaWVzLlxuICovXG5mdW5jdGlvbiB3cmFwUHJvdmlkZXJFcnJvcnM8VCBleHRlbmRzIFJlY292ZXJ5UHJvdmlkZXI+KHByb3ZpZGVyOiBUKTogVCB7XG4gIHJldHVybiBuZXcgUHJveHkocHJvdmlkZXIsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzOiB1bmtub3duW10pID0+XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlLmFwcGx5KHRhcmdldCwgYXJncykpLmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEFwaVJlcXVlc3RFcnJvcikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVjb3ZlcnlQcm92aWRlckVycm9yKGUubWVzc2FnZSwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JDb2luKGNvaW5OYW1lOiBzdHJpbmcsIGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlcjxudW1iZXI+IHtcbiAgc3dpdGNoIChjb2luTmFtZSkge1xuICAgIGNhc2UgJ2J0Yyc6XG4gICAgY2FzZSAndGJ0Yyc6XG4gICAgY2FzZSAnYmNoJzpcbiAgICBjYXNlICdiY2hhJzpcbiAgICBjYXNlICdic3YnOlxuICAgIGNhc2UgJ2J0Zyc6XG4gICAgY2FzZSAnZGFzaCc6XG4gICAgY2FzZSAnZG9nZSc6XG4gICAgY2FzZSAnbHRjJzpcbiAgICBjYXNlICd6ZWMnOlxuICAgICAgcmV0dXJuIHdyYXBQcm92aWRlckVycm9ycyhCbG9ja2NoYWlyQXBpLmZvckNvaW4oY29pbk5hbWUsIHsgYXBpVG9rZW4gfSkpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEFwaU5vdEltcGxlbWVudGVkRXJyb3IoY29pbk5hbWUpO1xufVxuIl19
@@ -4,5 +4,4 @@ export * from './baseApi';
4
4
  export * from './coingeckoApi';
5
5
  export * from './crossChainRecovery';
6
6
  export * from './mempoolApi';
7
- export * from './safeRecovery';
8
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/recovery/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/recovery/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC"}
@@ -4,5 +4,4 @@ export * from './baseApi';
4
4
  export * from './coingeckoApi';
5
5
  export * from './crossChainRecovery';
6
6
  export * from './mempoolApi';
7
- export * from './safeRecovery';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9SZWNvdmVyeVByb3ZpZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vYmFja3VwS2V5UmVjb3ZlcnknO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlQXBpJztcbmV4cG9ydCAqIGZyb20gJy4vY29pbmdlY2tvQXBpJztcbmV4cG9ydCAqIGZyb20gJy4vY3Jvc3NDaGFpblJlY292ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vbWVtcG9vbEFwaSc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVSZWNvdmVyeSc7XG4iXX0=
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vUmVjb3ZlcnlQcm92aWRlcic7XG5leHBvcnQgKiBmcm9tICcuL2JhY2t1cEtleVJlY292ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZUFwaSc7XG5leHBvcnQgKiBmcm9tICcuL2NvaW5nZWNrb0FwaSc7XG5leHBvcnQgKiBmcm9tICcuL2Nyb3NzQ2hhaW5SZWNvdmVyeSc7XG5leHBvcnQgKiBmcm9tICcuL21lbXBvb2xBcGknO1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo/abstract-utxo",
3
- "version": "13.2.2",
3
+ "version": "13.4.0",
4
4
  "description": "BitGo SDK coin library for UTXO base implementation",
5
5
  "main": "./dist/cjs/src/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -61,9 +61,8 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@bitgo/blockapis": "^1.13.11",
64
- "@bitgo/sdk-api": "^3.0.6",
65
- "@bitgo/sdk-core": "^38.22.0",
66
- "@bitgo/sdk-lib-safes": "^1.3.0",
64
+ "@bitgo/sdk-api": "^3.1.0",
65
+ "@bitgo/sdk-core": "^39.0.0",
67
66
  "@bitgo/utxo-core": "^1.41.5",
68
67
  "@bitgo/utxo-descriptors": "^2.1.0",
69
68
  "@bitgo/utxo-ord": "^1.34.5",
@@ -77,10 +76,10 @@
77
76
  "superagent": "^9.0.1"
78
77
  },
79
78
  "devDependencies": {
80
- "@bitgo/sdk-test": "^9.1.83",
81
- "@bitgo/statics": "^59.21.0",
79
+ "@bitgo/sdk-test": "^9.1.85",
80
+ "@bitgo/statics": "^59.23.0",
82
81
  "@bitgo/utxo-lib": "^11.24.4",
83
82
  "mocha": "^10.2.0"
84
83
  },
85
- "gitHead": "1d52fb7a66fad74fb1e1a6aacedc68181a67874b"
84
+ "gitHead": "55f471c58a723830b4da056635d29dc87f5c3426"
86
85
  }
@@ -1,19 +0,0 @@
1
- /**
2
- * @prettier
3
- *
4
- * Safe (slot-1) UTXO recovery adapter: maps a Safe child triplet onto the existing
5
- * `backupKeyRecovery` engine for funding checks and recovery.
6
- */
7
- import { SafeChildTriplet, SafeChildTripletPubs } from '@bitgo/sdk-lib-safes';
8
- import { AbstractUtxoCoin } from '../abstractUtxoCoin';
9
- import { backupKeyRecovery, RecoverParams } from './backupKeyRecovery';
10
- export type SafeWalletFundingStatus = 'funded' | 'empty' | 'unknown';
11
- export type SafeWalletRecoveryMode = 'signed' | 'unsigned';
12
- export type SafeRecoveryOptionsBase = Pick<RecoverParams, 'scan' | 'apiKey' | 'recoveryProvider'>;
13
- export type RecoverSafeWalletOptions = {
14
- mode: SafeWalletRecoveryMode;
15
- recoveryDestination: string;
16
- } & SafeRecoveryOptionsBase & Pick<RecoverParams, 'feeRate'>;
17
- export declare function determineSafeWalletFunding(coin: AbstractUtxoCoin, triplet: SafeChildTripletPubs, options?: SafeRecoveryOptionsBase): Promise<SafeWalletFundingStatus>;
18
- export declare function recoverSafeWallet(coin: AbstractUtxoCoin, triplet: SafeChildTriplet, options: RecoverSafeWalletOptions): ReturnType<typeof backupKeyRecovery>;
19
- //# sourceMappingURL=safeRecovery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safeRecovery.d.ts","sourceRoot":"","sources":["../../../../src/recovery/safeRecovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAyC,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9G,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE3D,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,kBAAkB,CAAC,CAAC;AAElG,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,uBAAuB,GACzB,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAgCjC,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAqBlC;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,wBAAwB,GAChC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CActC"}
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.determineSafeWalletFunding = determineSafeWalletFunding;
4
- exports.recoverSafeWallet = recoverSafeWallet;
5
- /**
6
- * @prettier
7
- *
8
- * Safe (slot-1) UTXO recovery adapter: maps a Safe child triplet onto the existing
9
- * `backupKeyRecovery` engine for funding checks and recovery.
10
- */
11
- const sdk_lib_safes_1 = require("@bitgo/sdk-lib-safes");
12
- const sdk_core_1 = require("@bitgo/sdk-core");
13
- const wasm_utxo_1 = require("@bitgo/wasm-utxo");
14
- const address_1 = require("../address");
15
- const backupKeyRecovery_1 = require("./backupKeyRecovery");
16
- function withSafeRecoveryGuard(coin, options, fn) {
17
- (0, sdk_lib_safes_1.assertSafeRecoverySupported)((0, sdk_lib_safes_1.onchainSlotForCoin)(coin.getChain()), 'utxo', coin.getChain());
18
- if (options.scan !== undefined && options.scan <= 0) {
19
- throw new Error('scan must be a positive integer');
20
- }
21
- return fn();
22
- }
23
- /**
24
- * Derive the wallet's own first external address to satisfy `backupKeyRecovery`'s
25
- * destination validation. Never broadcast, never returned to the caller.
26
- */
27
- function synthesizeDestination(coin, triplet) {
28
- const walletKeys = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from({
29
- triple: [triplet.user.pub, triplet.backup.pub, triplet.bitgo.pub].map((pub) => wasm_utxo_1.BIP32.from(pub)),
30
- derivationPrefixes: ['m/0/0', 'm/0/0', 'm/0/0'],
31
- });
32
- return (0, address_1.generateAddressWithChainAndIndex)(coin.wasmName, walletKeys, wasm_utxo_1.fixedScriptWallet.ChainCode.value('p2sh', 'external'), 0, undefined);
33
- }
34
- async function determineSafeWalletFunding(coin, triplet, options = {}) {
35
- return withSafeRecoveryGuard(coin, options, async () => {
36
- const recoveryParams = {
37
- ...options,
38
- recoveryDestination: synthesizeDestination(coin, triplet),
39
- userKey: triplet.user.pub,
40
- backupKey: triplet.backup.pub,
41
- bitgoKey: triplet.bitgo.pub,
42
- ignoreAddressTypes: [],
43
- feeRate: backupKeyRecovery_1.DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V2,
44
- };
45
- try {
46
- const result = await coin.recover(recoveryParams);
47
- return result && 'txHex' in result && typeof result.txHex === 'string' && result.txHex.length > 0
48
- ? 'funded'
49
- : 'unknown';
50
- }
51
- catch (err) {
52
- return err instanceof sdk_core_1.ErrorNoInputToRecover ? 'empty' : 'unknown';
53
- }
54
- });
55
- }
56
- async function recoverSafeWallet(coin, triplet, options) {
57
- return withSafeRecoveryGuard(coin, options, async () => {
58
- const { mode, recoveryDestination, ...rest } = options;
59
- const recoveryParams = {
60
- ...rest,
61
- recoveryDestination,
62
- userKey: mode === 'signed' ? triplet.user.prv : triplet.user.pub,
63
- backupKey: mode === 'signed' ? triplet.backup.prv : triplet.backup.pub,
64
- bitgoKey: triplet.bitgo.pub,
65
- ignoreAddressTypes: [],
66
- };
67
- return coin.recover(recoveryParams);
68
- });
69
- }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZVJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JlY292ZXJ5L3NhZmVSZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZEQSxnRUF5QkM7QUFFRCw4Q0FrQkM7QUExR0Q7Ozs7O0dBS0c7QUFDSCx3REFLOEI7QUFDOUIsOENBQWdFO0FBQ2hFLGdEQUE0RDtBQUc1RCx3Q0FBOEQ7QUFFOUQsMkRBQThHO0FBYTlHLFNBQVMscUJBQXFCLENBQzVCLElBQXNCLEVBQ3RCLE9BQWdDLEVBQ2hDLEVBQW9CO0lBRXBCLElBQUEsMkNBQTJCLEVBQUMsSUFBQSxrQ0FBa0IsRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUYsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsT0FBTyxFQUFFLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLElBQXNCLEVBQUUsT0FBNkI7SUFDbEYsTUFBTSxVQUFVLEdBQUcsNkJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztRQUN2RCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQWtCO1FBQ2hILGtCQUFrQixFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7S0FDaEQsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFBLDBDQUFnQyxFQUNyQyxJQUFJLENBQUMsUUFBUSxFQUNiLFVBQVUsRUFDViw2QkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFDckQsQ0FBQyxFQUNELFNBQVMsQ0FDVixDQUFDO0FBQ0osQ0FBQztBQUVNLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsSUFBc0IsRUFDdEIsT0FBNkIsRUFDN0IsVUFBbUMsRUFBRTtJQUVyQyxPQUFPLHFCQUFxQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxjQUFjLEdBQWtCO1lBQ3BDLEdBQUcsT0FBTztZQUNWLG1CQUFtQixFQUFFLHFCQUFxQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7WUFDekQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRztZQUN6QixTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDM0Isa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixPQUFPLEVBQUUseURBQXFDO1NBQy9DLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEQsT0FBTyxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQy9GLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsWUFBWSxnQ0FBcUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVNLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsSUFBc0IsRUFDdEIsT0FBeUIsRUFDekIsT0FBaUM7SUFFakMsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JELE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDdkQsTUFBTSxjQUFjLEdBQWtCO1lBQ3BDLEdBQUcsSUFBSTtZQUNQLG1CQUFtQjtZQUNuQixPQUFPLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNoRSxTQUFTLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRztZQUN0RSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQzNCLGtCQUFrQixFQUFFLEVBQUU7U0FDdkIsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIFNhZmUgKHNsb3QtMSkgVVRYTyByZWNvdmVyeSBhZGFwdGVyOiBtYXBzIGEgU2FmZSBjaGlsZCB0cmlwbGV0IG9udG8gdGhlIGV4aXN0aW5nXG4gKiBgYmFja3VwS2V5UmVjb3ZlcnlgIGVuZ2luZSBmb3IgZnVuZGluZyBjaGVja3MgYW5kIHJlY292ZXJ5LlxuICovXG5pbXBvcnQge1xuICBTYWZlQ2hpbGRUcmlwbGV0LFxuICBTYWZlQ2hpbGRUcmlwbGV0UHVicyxcbiAgYXNzZXJ0U2FmZVJlY292ZXJ5U3VwcG9ydGVkLFxuICBvbmNoYWluU2xvdEZvckNvaW4sXG59IGZyb20gJ0BiaXRnby9zZGstbGliLXNhZmVzJztcbmltcG9ydCB7IEVycm9yTm9JbnB1dFRvUmVjb3ZlciwgVHJpcGxlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJJUDMyLCBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luIH0gZnJvbSAnLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBnZW5lcmF0ZUFkZHJlc3NXaXRoQ2hhaW5BbmRJbmRleCB9IGZyb20gJy4uL2FkZHJlc3MnO1xuXG5pbXBvcnQgeyBiYWNrdXBLZXlSZWNvdmVyeSwgREVGQVVMVF9SRUNPVkVSWV9GRUVSQVRFX1NBVF9WQllURV9WMiwgUmVjb3ZlclBhcmFtcyB9IGZyb20gJy4vYmFja3VwS2V5UmVjb3ZlcnknO1xuXG5leHBvcnQgdHlwZSBTYWZlV2FsbGV0RnVuZGluZ1N0YXR1cyA9ICdmdW5kZWQnIHwgJ2VtcHR5JyB8ICd1bmtub3duJztcbmV4cG9ydCB0eXBlIFNhZmVXYWxsZXRSZWNvdmVyeU1vZGUgPSAnc2lnbmVkJyB8ICd1bnNpZ25lZCc7XG5cbmV4cG9ydCB0eXBlIFNhZmVSZWNvdmVyeU9wdGlvbnNCYXNlID0gUGljazxSZWNvdmVyUGFyYW1zLCAnc2NhbicgfCAnYXBpS2V5JyB8ICdyZWNvdmVyeVByb3ZpZGVyJz47XG5cbmV4cG9ydCB0eXBlIFJlY292ZXJTYWZlV2FsbGV0T3B0aW9ucyA9IHtcbiAgbW9kZTogU2FmZVdhbGxldFJlY292ZXJ5TW9kZTtcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xufSAmIFNhZmVSZWNvdmVyeU9wdGlvbnNCYXNlICZcbiAgUGljazxSZWNvdmVyUGFyYW1zLCAnZmVlUmF0ZSc+O1xuXG5mdW5jdGlvbiB3aXRoU2FmZVJlY292ZXJ5R3VhcmQ8VD4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIG9wdGlvbnM6IFNhZmVSZWNvdmVyeU9wdGlvbnNCYXNlLFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGFzc2VydFNhZmVSZWNvdmVyeVN1cHBvcnRlZChvbmNoYWluU2xvdEZvckNvaW4oY29pbi5nZXRDaGFpbigpKSwgJ3V0eG8nLCBjb2luLmdldENoYWluKCkpO1xuICBpZiAob3B0aW9ucy5zY2FuICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zY2FuIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjYW4gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuICByZXR1cm4gZm4oKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgdGhlIHdhbGxldCdzIG93biBmaXJzdCBleHRlcm5hbCBhZGRyZXNzIHRvIHNhdGlzZnkgYGJhY2t1cEtleVJlY292ZXJ5YCdzXG4gKiBkZXN0aW5hdGlvbiB2YWxpZGF0aW9uLiBOZXZlciBicm9hZGNhc3QsIG5ldmVyIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuXG4gKi9cbmZ1bmN0aW9uIHN5bnRoZXNpemVEZXN0aW5hdGlvbihjb2luOiBBYnN0cmFjdFV0eG9Db2luLCB0cmlwbGV0OiBTYWZlQ2hpbGRUcmlwbGV0UHVicyk6IHN0cmluZyB7XG4gIGNvbnN0IHdhbGxldEtleXMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKHtcbiAgICB0cmlwbGU6IFt0cmlwbGV0LnVzZXIucHViLCB0cmlwbGV0LmJhY2t1cC5wdWIsIHRyaXBsZXQuYml0Z28ucHViXS5tYXAoKHB1YikgPT4gQklQMzIuZnJvbShwdWIpKSBhcyBUcmlwbGU8QklQMzI+LFxuICAgIGRlcml2YXRpb25QcmVmaXhlczogWydtLzAvMCcsICdtLzAvMCcsICdtLzAvMCddLFxuICB9KTtcbiAgcmV0dXJuIGdlbmVyYXRlQWRkcmVzc1dpdGhDaGFpbkFuZEluZGV4KFxuICAgIGNvaW4ud2FzbU5hbWUsXG4gICAgd2FsbGV0S2V5cyxcbiAgICBmaXhlZFNjcmlwdFdhbGxldC5DaGFpbkNvZGUudmFsdWUoJ3Ayc2gnLCAnZXh0ZXJuYWwnKSxcbiAgICAwLFxuICAgIHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0ZXJtaW5lU2FmZVdhbGxldEZ1bmRpbmcoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHRyaXBsZXQ6IFNhZmVDaGlsZFRyaXBsZXRQdWJzLFxuICBvcHRpb25zOiBTYWZlUmVjb3ZlcnlPcHRpb25zQmFzZSA9IHt9XG4pOiBQcm9taXNlPFNhZmVXYWxsZXRGdW5kaW5nU3RhdHVzPiB7XG4gIHJldHVybiB3aXRoU2FmZVJlY292ZXJ5R3VhcmQoY29pbiwgb3B0aW9ucywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlY292ZXJ5UGFyYW1zOiBSZWNvdmVyUGFyYW1zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHN5bnRoZXNpemVEZXN0aW5hdGlvbihjb2luLCB0cmlwbGV0KSxcbiAgICAgIHVzZXJLZXk6IHRyaXBsZXQudXNlci5wdWIsXG4gICAgICBiYWNrdXBLZXk6IHRyaXBsZXQuYmFja3VwLnB1YixcbiAgICAgIGJpdGdvS2V5OiB0cmlwbGV0LmJpdGdvLnB1YixcbiAgICAgIGlnbm9yZUFkZHJlc3NUeXBlczogW10sXG4gICAgICBmZWVSYXRlOiBERUZBVUxUX1JFQ09WRVJZX0ZFRVJBVEVfU0FUX1ZCWVRFX1YyLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi5yZWNvdmVyKHJlY292ZXJ5UGFyYW1zKTtcbiAgICAgIHJldHVybiByZXN1bHQgJiYgJ3R4SGV4JyBpbiByZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50eEhleCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LnR4SGV4Lmxlbmd0aCA+IDBcbiAgICAgICAgPyAnZnVuZGVkJ1xuICAgICAgICA6ICd1bmtub3duJztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvck5vSW5wdXRUb1JlY292ZXIgPyAnZW1wdHknIDogJ3Vua25vd24nO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyU2FmZVdhbGxldChcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdHJpcGxldDogU2FmZUNoaWxkVHJpcGxldCxcbiAgb3B0aW9uczogUmVjb3ZlclNhZmVXYWxsZXRPcHRpb25zXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBiYWNrdXBLZXlSZWNvdmVyeT4ge1xuICByZXR1cm4gd2l0aFNhZmVSZWNvdmVyeUd1YXJkKGNvaW4sIG9wdGlvbnMsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IG1vZGUsIHJlY292ZXJ5RGVzdGluYXRpb24sIC4uLnJlc3QgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcmVjb3ZlcnlQYXJhbXM6IFJlY292ZXJQYXJhbXMgPSB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIHVzZXJLZXk6IG1vZGUgPT09ICdzaWduZWQnID8gdHJpcGxldC51c2VyLnBydiA6IHRyaXBsZXQudXNlci5wdWIsXG4gICAgICBiYWNrdXBLZXk6IG1vZGUgPT09ICdzaWduZWQnID8gdHJpcGxldC5iYWNrdXAucHJ2IDogdHJpcGxldC5iYWNrdXAucHViLFxuICAgICAgYml0Z29LZXk6IHRyaXBsZXQuYml0Z28ucHViLFxuICAgICAgaWdub3JlQWRkcmVzc1R5cGVzOiBbXSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvaW4ucmVjb3ZlcihyZWNvdmVyeVBhcmFtcyk7XG4gIH0pO1xufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=safeRecovery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safeRecovery.d.ts","sourceRoot":"","sources":["../../../../../test/unit/recovery/safeRecovery.ts"],"names":[],"mappings":""}
@@ -1,187 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const assert_1 = __importDefault(require("assert"));
40
- const sinon = __importStar(require("sinon"));
41
- const nock = require("nock");
42
- const src_1 = require("../../../src");
43
- const util_1 = require("../util");
44
- const mock_1 = require("./mock");
45
- nock.disableNetConnect();
46
- const { walletKeys: wasmWalletKeys } = (0, util_1.getDefaultWasmWalletKeys)();
47
- function tripletPubs() {
48
- return {
49
- user: { pub: util_1.keychainsBase58[0].pub },
50
- backup: { pub: util_1.keychainsBase58[1].pub },
51
- bitgo: { pub: util_1.keychainsBase58[2].pub },
52
- };
53
- }
54
- const throwingProvider = {
55
- getUnspentsForAddresses: async () => {
56
- throw new Error('provider down');
57
- },
58
- getAddressInfo: async () => {
59
- throw new Error('provider down');
60
- },
61
- getTransactionHex: async () => {
62
- throw new Error('provider down');
63
- },
64
- getTransactionIO: async () => {
65
- throw new Error('provider down');
66
- },
67
- };
68
- describe('determineSafeWalletFunding', function () {
69
- it('returns funded when the wallet has unspents', async function () {
70
- const coin = (0, util_1.getUtxoCoin)('btc');
71
- const unspents = [(0, util_1.toUnspentWithPrevTx)({ scriptType: 'p2sh', value: BigInt(1e8) }, 0, coin.name, wasmWalletKeys)];
72
- const status = await (0, src_1.determineSafeWalletFunding)(coin, tripletPubs(), {
73
- recoveryProvider: new mock_1.MockRecoveryProvider(unspents),
74
- });
75
- assert_1.default.strictEqual(status, 'funded');
76
- });
77
- (0, util_1.getMinUtxoCoins)().forEach((coin) => {
78
- it(`returns empty when the wallet has no unspents [${coin.getChain()}]`, async function () {
79
- const status = await (0, src_1.determineSafeWalletFunding)(coin, tripletPubs(), {
80
- recoveryProvider: new mock_1.MockRecoveryProvider([]),
81
- });
82
- assert_1.default.strictEqual(status, 'empty');
83
- });
84
- it(`returns unknown when the provider fails [${coin.getChain()}]`, async function () {
85
- const status = await (0, src_1.determineSafeWalletFunding)(coin, tripletPubs(), {
86
- recoveryProvider: throwingProvider,
87
- });
88
- assert_1.default.strictEqual(status, 'unknown');
89
- });
90
- });
91
- it('returns unknown when the engine resolves without a valid txHex', async function () {
92
- const coin = (0, util_1.getUtxoCoin)('btc');
93
- const malformedResult = {
94
- txHex: '',
95
- txInfo: {},
96
- feeInfo: {},
97
- coin: coin.getChain(),
98
- };
99
- const stub = sinon.stub(coin, 'recover').resolves(malformedResult);
100
- try {
101
- const status = await (0, src_1.determineSafeWalletFunding)(coin, tripletPubs());
102
- assert_1.default.strictEqual(status, 'unknown');
103
- }
104
- finally {
105
- stub.restore();
106
- }
107
- });
108
- it('rejects scan: 0', async function () {
109
- const coin = (0, util_1.getUtxoCoin)('btc');
110
- await assert_1.default.rejects(() => (0, src_1.determineSafeWalletFunding)(coin, tripletPubs(), { scan: 0 }), /scan must be a positive integer/);
111
- });
112
- });
113
- describe('recoverSafeWallet', function () {
114
- const coin = (0, util_1.getUtxoCoin)('btc');
115
- const { walletKeys: externalWallet } = (0, util_1.createWasmWalletKeys)('external');
116
- const recoveryDestination = (0, util_1.getWalletAddress)(coin.name, externalWallet);
117
- const unspents = [(0, util_1.toUnspentWithPrevTx)({ scriptType: 'p2sh', value: BigInt(1e8) }, 0, coin.name, wasmWalletKeys)];
118
- function fullTriplet() {
119
- return {
120
- index: 0,
121
- user: { prv: util_1.keychainsBase58[0].prv, pub: util_1.keychainsBase58[0].pub },
122
- backup: { prv: util_1.keychainsBase58[1].prv, pub: util_1.keychainsBase58[1].pub },
123
- bitgo: { pub: util_1.keychainsBase58[2].pub },
124
- };
125
- }
126
- it('returns an unsigned transaction when mode is unsigned', async function () {
127
- const result = await (0, src_1.recoverSafeWallet)(coin, fullTriplet(), {
128
- mode: 'unsigned',
129
- recoveryDestination,
130
- feeRate: 100,
131
- recoveryProvider: new mock_1.MockRecoveryProvider(unspents),
132
- });
133
- assert_1.default.ok('txHex' in result && typeof result.txHex === 'string' && result.txHex.length > 0);
134
- assert_1.default.ok('txInfo' in result && typeof result.txInfo === 'object');
135
- assert_1.default.ok('feeInfo' in result && typeof result.feeInfo === 'object');
136
- assert_1.default.strictEqual(result.coin, coin.getChain());
137
- });
138
- it('returns a signed transaction when mode is signed', async function () {
139
- const result = await (0, src_1.recoverSafeWallet)(coin, fullTriplet(), {
140
- mode: 'signed',
141
- recoveryDestination,
142
- feeRate: 100,
143
- recoveryProvider: new mock_1.MockRecoveryProvider(unspents),
144
- });
145
- assert_1.default.ok('transactionHex' in result && typeof result.transactionHex === 'string' && result.transactionHex.length > 0);
146
- assert_1.default.ok('inputs' in result && Array.isArray(result.inputs) && result.inputs.length > 0);
147
- });
148
- it('recovers signed transaction on tbtc with mainnet xprv/xpub child keys', async function () {
149
- const tbtcCoin = (0, util_1.getUtxoCoin)('tbtc');
150
- const tbtcDestination = (0, util_1.getWalletAddress)(tbtcCoin.name, externalWallet);
151
- const tbtcUnspents = [
152
- (0, util_1.toUnspentWithPrevTx)({ scriptType: 'p2sh', value: BigInt(1e8) }, 0, tbtcCoin.name, wasmWalletKeys),
153
- ];
154
- const result = await (0, src_1.recoverSafeWallet)(tbtcCoin, fullTriplet(), {
155
- mode: 'signed',
156
- recoveryDestination: tbtcDestination,
157
- feeRate: 100,
158
- recoveryProvider: new mock_1.MockRecoveryProvider(tbtcUnspents),
159
- });
160
- assert_1.default.ok('transactionHex' in result && typeof result.transactionHex === 'string' && result.transactionHex.length > 0);
161
- assert_1.default.ok('inputs' in result && Array.isArray(result.inputs) && result.inputs.length > 0);
162
- });
163
- it('produces a byte-identical result to backupKeyRecovery (signed)', async function () {
164
- const triplet = fullTriplet();
165
- const provider = new mock_1.MockRecoveryProvider(unspents);
166
- const viaSafe = await (0, src_1.recoverSafeWallet)(coin, triplet, {
167
- mode: 'signed',
168
- recoveryDestination,
169
- feeRate: 100,
170
- recoveryProvider: provider,
171
- });
172
- const viaDirect = await (0, src_1.backupKeyRecovery)(coin, util_1.defaultBitGo, {
173
- userKey: triplet.user.prv,
174
- backupKey: triplet.backup.prv,
175
- bitgoKey: triplet.bitgo.pub,
176
- recoveryDestination,
177
- ignoreAddressTypes: [],
178
- feeRate: 100,
179
- recoveryProvider: provider,
180
- });
181
- assert_1.default.deepStrictEqual(viaSafe, viaDirect);
182
- });
183
- it('rejects scan: 0', async function () {
184
- await assert_1.default.rejects(() => (0, src_1.recoverSafeWallet)(coin, fullTriplet(), { mode: 'unsigned', recoveryDestination, scan: 0 }), /scan must be a positive integer/);
185
- });
186
- });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZVJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L3NhZmVSZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBRzlCLHNDQUFrSDtBQUNsSCxrQ0FTaUI7QUFFakIsaUNBQThDO0FBRTlDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBRXpCLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBQSwrQkFBd0IsR0FBRSxDQUFDO0FBRWxFLFNBQVMsV0FBVztJQUNsQixPQUFPO1FBQ0wsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLHNCQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO1FBQ3JDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxzQkFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtRQUN2QyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsc0JBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7S0FDdkMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLGdCQUFnQixHQUFxQjtJQUN6Qyx1QkFBdUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxjQUFjLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsaUJBQWlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsZ0JBQWdCLEVBQUUsS0FBSyxJQUFJ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LENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgU2FmZUNoaWxkVHJpcGxldCwgU2FmZUNoaWxkVHJpcGxldFB1YnMgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1zYWZlcyc7XG5cbmltcG9ydCB7IGJhY2t1cEtleVJlY292ZXJ5LCBkZXRlcm1pbmVTYWZlV2FsbGV0RnVuZGluZywgcmVjb3ZlclNhZmVXYWxsZXQsIFJlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzbVdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbiAgZ2V0RGVmYXVsdFdhc21XYWxsZXRLZXlzLFxuICBnZXRNaW5VdHhvQ29pbnMsXG4gIGdldFV0eG9Db2luLFxuICBnZXRXYWxsZXRBZGRyZXNzLFxuICBrZXljaGFpbnNCYXNlNTgsXG4gIHRvVW5zcGVudFdpdGhQcmV2VHgsXG59IGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgeyBNb2NrUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vbW9jayc7XG5cbm5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcblxuY29uc3QgeyB3YWxsZXRLZXlzOiB3YXNtV2FsbGV0S2V5cyB9ID0gZ2V0RGVmYXVsdFdhc21XYWxsZXRLZXlzKCk7XG5cbmZ1bmN0aW9uIHRyaXBsZXRQdWJzKCk6IFNhZmVDaGlsZFRyaXBsZXRQdWJzIHtcbiAgcmV0dXJuIHtcbiAgICB1c2VyOiB7IHB1Yjoga2V5Y2hhaW5zQmFzZTU4WzBdLnB1YiB9LFxuICAgIGJhY2t1cDogeyBwdWI6IGtleWNoYWluc0Jhc2U1OFsxXS5wdWIgfSxcbiAgICBiaXRnbzogeyBwdWI6IGtleWNoYWluc0Jhc2U1OFsyXS5wdWIgfSxcbiAgfTtcbn1cblxuY29uc3QgdGhyb3dpbmdQcm92aWRlcjogUmVjb3ZlcnlQcm92aWRlciA9IHtcbiAgZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXM6IGFzeW5jICgpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVyIGRvd24nKTtcbiAgfSxcbiAgZ2V0QWRkcmVzc0luZm86IGFzeW5jICgpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVyIGRvd24nKTtcbiAgfSxcbiAgZ2V0VHJhbnNhY3Rpb25IZXg6IGFzeW5jICgpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVyIGRvd24nKTtcbiAgfSxcbiAgZ2V0VHJhbnNhY3Rpb25JTzogYXN5bmMgKCkgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvdmlkZXIgZG93bicpO1xuICB9LFxufTtcblxuZGVzY3JpYmUoJ2RldGVybWluZVNhZmVXYWxsZXRGdW5kaW5nJywgZnVuY3Rpb24gKCkge1xuICBpdCgncmV0dXJucyBmdW5kZWQgd2hlbiB0aGUgd2FsbGV0IGhhcyB1bnNwZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2luID0gZ2V0VXR4b0NvaW4oJ2J0YycpO1xuICAgIGNvbnN0IHVuc3BlbnRzID0gW3RvVW5zcGVudFdpdGhQcmV2VHgoeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiBCaWdJbnQoMWU4KSB9LCAwLCBjb2luLm5hbWUsIHdhc21XYWxsZXRLZXlzKV07XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgZGV0ZXJtaW5lU2FmZVdhbGxldEZ1bmRpbmcoY29pbiwgdHJpcGxldFB1YnMoKSwge1xuICAgICAgcmVjb3ZlcnlQcm92aWRlcjogbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKHVuc3BlbnRzKSxcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc3RhdHVzLCAnZnVuZGVkJyk7XG4gIH0pO1xuXG4gIGdldE1pblV0eG9Db2lucygpLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICBpdChgcmV0dXJucyBlbXB0eSB3aGVuIHRoZSB3YWxsZXQgaGFzIG5vIHVuc3BlbnRzIFske2NvaW4uZ2V0Q2hhaW4oKX1dYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgZGV0ZXJtaW5lU2FmZVdhbGxldEZ1bmRpbmcoY29pbiwgdHJpcGxldFB1YnMoKSwge1xuICAgICAgICByZWNvdmVyeVByb3ZpZGVyOiBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIoW10pLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc3RhdHVzLCAnZW1wdHknKTtcbiAgICB9KTtcblxuICAgIGl0KGByZXR1cm5zIHVua25vd24gd2hlbiB0aGUgcHJvdmlkZXIgZmFpbHMgWyR7Y29pbi5nZXRDaGFpbigpfV1gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBkZXRlcm1pbmVTYWZlV2FsbGV0RnVuZGluZyhjb2luLCB0cmlwbGV0UHVicygpLCB7XG4gICAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IHRocm93aW5nUHJvdmlkZXIsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzdGF0dXMsICd1bmtub3duJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIHVua25vd24gd2hlbiB0aGUgZW5naW5lIHJlc29sdmVzIHdpdGhvdXQgYSB2YWxpZCB0eEhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2luID0gZ2V0VXR4b0NvaW4oJ2J0YycpO1xuICAgIHR5cGUgUmVjb3ZlclJldHVybiA9IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgY29pbi5yZWNvdmVyPj47XG4gICAgY29uc3QgbWFsZm9ybWVkUmVzdWx0ID0ge1xuICAgICAgdHhIZXg6ICcnLFxuICAgICAgdHhJbmZvOiB7fSxcbiAgICAgIGZlZUluZm86IHt9LFxuICAgICAgY29pbjogY29pbi5nZXRDaGFpbigpLFxuICAgIH0gYXMgUmVjb3ZlclJldHVybjtcblxuICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKGNvaW4sICdyZWNvdmVyJykucmVzb2x2ZXMobWFsZm9ybWVkUmVzdWx0KTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgZGV0ZXJtaW5lU2FmZVdhbGxldEZ1bmRpbmcoY29pbiwgdHJpcGxldFB1YnMoKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc3RhdHVzLCAndW5rbm93bicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzdHViLnJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHNjYW46IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCdidGMnKTtcbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICgpID0+IGRldGVybWluZVNhZmVXYWxsZXRGdW5kaW5nKGNvaW4sIHRyaXBsZXRQdWJzKCksIHsgc2NhbjogMCB9KSxcbiAgICAgIC9zY2FuIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyL1xuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdyZWNvdmVyU2FmZVdhbGxldCcsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCdidGMnKTtcbiAgY29uc3QgeyB3YWxsZXRLZXlzOiBleHRlcm5hbFdhbGxldCB9ID0gY3JlYXRlV2FzbVdhbGxldEtleXMoJ2V4dGVybmFsJyk7XG4gIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSBnZXRXYWxsZXRBZGRyZXNzKGNvaW4ubmFtZSwgZXh0ZXJuYWxXYWxsZXQpO1xuICBjb25zdCB1bnNwZW50cyA9IFt0b1Vuc3BlbnRXaXRoUHJldlR4KHsgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDFlOCkgfSwgMCwgY29pbi5uYW1lLCB3YXNtV2FsbGV0S2V5cyldO1xuXG4gIGZ1bmN0aW9uIGZ1bGxUcmlwbGV0KCk6IFNhZmVDaGlsZFRyaXBsZXQge1xuICAgIHJldHVybiB7XG4gICAgICBpbmRleDogMCxcbiAgICAgIHVzZXI6IHsgcHJ2OiBrZXljaGFpbnNCYXNlNThbMF0ucHJ2LCBwdWI6IGtleWNoYWluc0Jhc2U1OFswXS5wdWIgfSxcbiAgICAgIGJhY2t1cDogeyBwcnY6IGtleWNoYWluc0Jhc2U1OFsxXS5wcnYsIHB1Yjoga2V5Y2hhaW5zQmFzZTU4WzFdLnB1YiB9LFxuICAgICAgYml0Z286IHsgcHViOiBrZXljaGFpbnNCYXNlNThbMl0ucHViIH0sXG4gICAgfTtcbiAgfVxuXG4gIGl0KCdyZXR1cm5zIGFuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHdoZW4gbW9kZSBpcyB1bnNpZ25lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWNvdmVyU2FmZVdhbGxldChjb2luLCBmdWxsVHJpcGxldCgpLCB7XG4gICAgICBtb2RlOiAndW5zaWduZWQnLFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGZlZVJhdGU6IDEwMCxcbiAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcih1bnNwZW50cyksXG4gICAgfSk7XG4gICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudHhIZXggPT09ICdzdHJpbmcnICYmIHJlc3VsdC50eEhleC5sZW5ndGggPiAwKTtcbiAgICBhc3NlcnQub2soJ3R4SW5mbycgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudHhJbmZvID09PSAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0Lm9rKCdmZWVJbmZvJyBpbiByZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC5mZWVJbmZvID09PSAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5jb2luLCBjb2luLmdldENoYWluKCkpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBhIHNpZ25lZCB0cmFuc2FjdGlvbiB3aGVuIG1vZGUgaXMgc2lnbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlY292ZXJTYWZlV2FsbGV0KGNvaW4sIGZ1bGxUcmlwbGV0KCksIHtcbiAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgIGZlZVJhdGU6IDEwMCxcbiAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcih1bnNwZW50cyksXG4gICAgfSk7XG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgJ3RyYW5zYWN0aW9uSGV4JyBpbiByZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50cmFuc2FjdGlvbkhleCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LnRyYW5zYWN0aW9uSGV4Lmxlbmd0aCA+IDBcbiAgICApO1xuICAgIGFzc2VydC5vaygnaW5wdXRzJyBpbiByZXN1bHQgJiYgQXJyYXkuaXNBcnJheShyZXN1bHQuaW5wdXRzKSAmJiByZXN1bHQuaW5wdXRzLmxlbmd0aCA+IDApO1xuICB9KTtcblxuICBpdCgncmVjb3ZlcnMgc2lnbmVkIHRyYW5zYWN0aW9uIG9uIHRidGMgd2l0aCBtYWlubmV0IHhwcnYveHB1YiBjaGlsZCBrZXlzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRidGNDb2luID0gZ2V0VXR4b0NvaW4oJ3RidGMnKTtcbiAgICBjb25zdCB0YnRjRGVzdGluYXRpb24gPSBnZXRXYWxsZXRBZGRyZXNzKHRidGNDb2luLm5hbWUsIGV4dGVybmFsV2FsbGV0KTtcbiAgICBjb25zdCB0YnRjVW5zcGVudHMgPSBbXG4gICAgICB0b1Vuc3BlbnRXaXRoUHJldlR4KHsgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDFlOCkgfSwgMCwgdGJ0Y0NvaW4ubmFtZSwgd2FzbVdhbGxldEtleXMpLFxuICAgIF07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWNvdmVyU2FmZVdhbGxldCh0YnRjQ29pbiwgZnVsbFRyaXBsZXQoKSwge1xuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0YnRjRGVzdGluYXRpb24sXG4gICAgICBmZWVSYXRlOiAxMDAsXG4gICAgICByZWNvdmVyeVByb3ZpZGVyOiBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIodGJ0Y1Vuc3BlbnRzKSxcbiAgICB9KTtcbiAgICBhc3NlcnQub2soXG4gICAgICAndHJhbnNhY3Rpb25IZXgnIGluIHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRyYW5zYWN0aW9uSGV4ID09PSAnc3RyaW5nJyAmJiByZXN1bHQudHJhbnNhY3Rpb25IZXgubGVuZ3RoID4gMFxuICAgICk7XG4gICAgYXNzZXJ0Lm9rKCdpbnB1dHMnIGluIHJlc3VsdCAmJiBBcnJheS5pc0FycmF5KHJlc3VsdC5pbnB1dHMpICYmIHJlc3VsdC5pbnB1dHMubGVuZ3RoID4gMCk7XG4gIH0pO1xuXG4gIGl0KCdwcm9kdWNlcyBhIGJ5dGUtaWRlbnRpY2FsIHJlc3VsdCB0byBiYWNrdXBLZXlSZWNvdmVyeSAoc2lnbmVkKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0cmlwbGV0ID0gZnVsbFRyaXBsZXQoKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcih1bnNwZW50cyk7XG5cbiAgICBjb25zdCB2aWFTYWZlID0gYXdhaXQgcmVjb3ZlclNhZmVXYWxsZXQoY29pbiwgdHJpcGxldCwge1xuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgZmVlUmF0ZTogMTAwLFxuICAgICAgcmVjb3ZlcnlQcm92aWRlcjogcHJvdmlkZXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCB2aWFEaXJlY3QgPSBhd2FpdCBiYWNrdXBLZXlSZWNvdmVyeShjb2luLCBkZWZhdWx0Qml0R28sIHtcbiAgICAgIHVzZXJLZXk6IHRyaXBsZXQudXNlci5wcnYsXG4gICAgICBiYWNrdXBLZXk6IHRyaXBsZXQuYmFja3VwLnBydixcbiAgICAgIGJpdGdvS2V5OiB0cmlwbGV0LmJpdGdvLnB1YixcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgZmVlUmF0ZTogMTAwLFxuICAgICAgcmVjb3ZlcnlQcm92aWRlcjogcHJvdmlkZXIsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHZpYVNhZmUsIHZpYURpcmVjdCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHNjYW46IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PiByZWNvdmVyU2FmZVdhbGxldChjb2luLCBmdWxsVHJpcGxldCgpLCB7IG1vZGU6ICd1bnNpZ25lZCcsIHJlY292ZXJ5RGVzdGluYXRpb24sIHNjYW46IDAgfSksXG4gICAgICAvc2NhbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci9cbiAgICApO1xuICB9KTtcbn0pO1xuIl19
@@ -1,19 +0,0 @@
1
- /**
2
- * @prettier
3
- *
4
- * Safe (slot-1) UTXO recovery adapter: maps a Safe child triplet onto the existing
5
- * `backupKeyRecovery` engine for funding checks and recovery.
6
- */
7
- import { SafeChildTriplet, SafeChildTripletPubs } from '@bitgo/sdk-lib-safes';
8
- import { AbstractUtxoCoin } from '../abstractUtxoCoin';
9
- import { backupKeyRecovery, RecoverParams } from './backupKeyRecovery';
10
- export type SafeWalletFundingStatus = 'funded' | 'empty' | 'unknown';
11
- export type SafeWalletRecoveryMode = 'signed' | 'unsigned';
12
- export type SafeRecoveryOptionsBase = Pick<RecoverParams, 'scan' | 'apiKey' | 'recoveryProvider'>;
13
- export type RecoverSafeWalletOptions = {
14
- mode: SafeWalletRecoveryMode;
15
- recoveryDestination: string;
16
- } & SafeRecoveryOptionsBase & Pick<RecoverParams, 'feeRate'>;
17
- export declare function determineSafeWalletFunding(coin: AbstractUtxoCoin, triplet: SafeChildTripletPubs, options?: SafeRecoveryOptionsBase): Promise<SafeWalletFundingStatus>;
18
- export declare function recoverSafeWallet(coin: AbstractUtxoCoin, triplet: SafeChildTriplet, options: RecoverSafeWalletOptions): ReturnType<typeof backupKeyRecovery>;
19
- //# sourceMappingURL=safeRecovery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safeRecovery.d.ts","sourceRoot":"","sources":["../../../src/recovery/safeRecovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAyC,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9G,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE3D,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,kBAAkB,CAAC,CAAC;AAElG,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,uBAAuB,GACzB,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAgCjC,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAqBlC;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,wBAAwB,GAChC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CActC"}
@@ -1,66 +0,0 @@
1
- /**
2
- * @prettier
3
- *
4
- * Safe (slot-1) UTXO recovery adapter: maps a Safe child triplet onto the existing
5
- * `backupKeyRecovery` engine for funding checks and recovery.
6
- */
7
- import { assertSafeRecoverySupported, onchainSlotForCoin, } from '@bitgo/sdk-lib-safes';
8
- import { ErrorNoInputToRecover } from '@bitgo/sdk-core';
9
- import { BIP32, fixedScriptWallet } from '@bitgo/wasm-utxo';
10
- import { generateAddressWithChainAndIndex } from '../address';
11
- import { DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V2 } from './backupKeyRecovery';
12
- function withSafeRecoveryGuard(coin, options, fn) {
13
- assertSafeRecoverySupported(onchainSlotForCoin(coin.getChain()), 'utxo', coin.getChain());
14
- if (options.scan !== undefined && options.scan <= 0) {
15
- throw new Error('scan must be a positive integer');
16
- }
17
- return fn();
18
- }
19
- /**
20
- * Derive the wallet's own first external address to satisfy `backupKeyRecovery`'s
21
- * destination validation. Never broadcast, never returned to the caller.
22
- */
23
- function synthesizeDestination(coin, triplet) {
24
- const walletKeys = fixedScriptWallet.RootWalletKeys.from({
25
- triple: [triplet.user.pub, triplet.backup.pub, triplet.bitgo.pub].map((pub) => BIP32.from(pub)),
26
- derivationPrefixes: ['m/0/0', 'm/0/0', 'm/0/0'],
27
- });
28
- return generateAddressWithChainAndIndex(coin.wasmName, walletKeys, fixedScriptWallet.ChainCode.value('p2sh', 'external'), 0, undefined);
29
- }
30
- export async function determineSafeWalletFunding(coin, triplet, options = {}) {
31
- return withSafeRecoveryGuard(coin, options, async () => {
32
- const recoveryParams = {
33
- ...options,
34
- recoveryDestination: synthesizeDestination(coin, triplet),
35
- userKey: triplet.user.pub,
36
- backupKey: triplet.backup.pub,
37
- bitgoKey: triplet.bitgo.pub,
38
- ignoreAddressTypes: [],
39
- feeRate: DEFAULT_RECOVERY_FEERATE_SAT_VBYTE_V2,
40
- };
41
- try {
42
- const result = await coin.recover(recoveryParams);
43
- return result && 'txHex' in result && typeof result.txHex === 'string' && result.txHex.length > 0
44
- ? 'funded'
45
- : 'unknown';
46
- }
47
- catch (err) {
48
- return err instanceof ErrorNoInputToRecover ? 'empty' : 'unknown';
49
- }
50
- });
51
- }
52
- export async function recoverSafeWallet(coin, triplet, options) {
53
- return withSafeRecoveryGuard(coin, options, async () => {
54
- const { mode, recoveryDestination, ...rest } = options;
55
- const recoveryParams = {
56
- ...rest,
57
- recoveryDestination,
58
- userKey: mode === 'signed' ? triplet.user.prv : triplet.user.pub,
59
- backupKey: mode === 'signed' ? triplet.backup.prv : triplet.backup.pub,
60
- bitgoKey: triplet.bitgo.pub,
61
- ignoreAddressTypes: [],
62
- };
63
- return coin.recover(recoveryParams);
64
- });
65
- }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZVJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlY292ZXJ5L3NhZmVSZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUNILE9BQU8sRUFHTCwyQkFBMkIsRUFDM0Isa0JBQWtCLEdBQ25CLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHFCQUFxQixFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzVELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU5RCxPQUFPLEVBQXFCLHFDQUFxQyxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBYTlHLFNBQVMscUJBQXFCLENBQzVCLElBQXNCLEVBQ3RCLE9BQWdDLEVBQ2hDLEVBQW9CO0lBRXBCLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxRixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxPQUFPLEVBQUUsRUFBRSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBc0IsRUFBRSxPQUE2QjtJQUNsRixNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQ3ZELE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFrQjtRQUNoSCxrQkFBa0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO0tBQ2hELENBQUMsQ0FBQztJQUNILE9BQU8sZ0NBQWdDLENBQ3JDLElBQUksQ0FBQyxRQUFRLEVBQ2IsVUFBVSxFQUNWLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUNyRCxDQUFDLEVBQ0QsU0FBUyxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsSUFBc0IsRUFDdEIsT0FBNkIsRUFDN0IsVUFBbUMsRUFBRTtJQUVyQyxPQUFPLHFCQUFxQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxjQUFjLEdBQWtCO1lBQ3BDLEdBQUcsT0FBTztZQUNWLG1CQUFtQixFQUFFLHFCQUFxQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7WUFDekQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRztZQUN6QixTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDM0Isa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixPQUFPLEVBQUUscUNBQXFDO1NBQy9DLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEQsT0FBTyxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQy9GLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsWUFBWSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLElBQXNCLEVBQ3RCLE9BQXlCLEVBQ3pCLE9BQWlDO0lBRWpDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRCxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ3ZELE1BQU0sY0FBYyxHQUFrQjtZQUNwQyxHQUFHLElBQUk7WUFDUCxtQkFBbUI7WUFDbkIsT0FBTyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDaEUsU0FBUyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUc7WUFDdEUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRztZQUMzQixrQkFBa0IsRUFBRSxFQUFFO1NBQ3ZCLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBTYWZlIChzbG90LTEpIFVUWE8gcmVjb3ZlcnkgYWRhcHRlcjogbWFwcyBhIFNhZmUgY2hpbGQgdHJpcGxldCBvbnRvIHRoZSBleGlzdGluZ1xuICogYGJhY2t1cEtleVJlY292ZXJ5YCBlbmdpbmUgZm9yIGZ1bmRpbmcgY2hlY2tzIGFuZCByZWNvdmVyeS5cbiAqL1xuaW1wb3J0IHtcbiAgU2FmZUNoaWxkVHJpcGxldCxcbiAgU2FmZUNoaWxkVHJpcGxldFB1YnMsXG4gIGFzc2VydFNhZmVSZWNvdmVyeVN1cHBvcnRlZCxcbiAgb25jaGFpblNsb3RGb3JDb2luLFxufSBmcm9tICdAYml0Z28vc2RrLWxpYi1zYWZlcyc7XG5pbXBvcnQgeyBFcnJvck5vSW5wdXRUb1JlY292ZXIsIFRyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCSVAzMiwgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiB9IGZyb20gJy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZGRyZXNzV2l0aENoYWluQW5kSW5kZXggfSBmcm9tICcuLi9hZGRyZXNzJztcblxuaW1wb3J0IHsgYmFja3VwS2V5UmVjb3ZlcnksIERFRkFVTFRfUkVDT1ZFUllfRkVFUkFURV9TQVRfVkJZVEVfVjIsIFJlY292ZXJQYXJhbXMgfSBmcm9tICcuL2JhY2t1cEtleVJlY292ZXJ5JztcblxuZXhwb3J0IHR5cGUgU2FmZVdhbGxldEZ1bmRpbmdTdGF0dXMgPSAnZnVuZGVkJyB8ICdlbXB0eScgfCAndW5rbm93bic7XG5leHBvcnQgdHlwZSBTYWZlV2FsbGV0UmVjb3ZlcnlNb2RlID0gJ3NpZ25lZCcgfCAndW5zaWduZWQnO1xuXG5leHBvcnQgdHlwZSBTYWZlUmVjb3ZlcnlPcHRpb25zQmFzZSA9IFBpY2s8UmVjb3ZlclBhcmFtcywgJ3NjYW4nIHwgJ2FwaUtleScgfCAncmVjb3ZlcnlQcm92aWRlcic+O1xuXG5leHBvcnQgdHlwZSBSZWNvdmVyU2FmZVdhbGxldE9wdGlvbnMgPSB7XG4gIG1vZGU6IFNhZmVXYWxsZXRSZWNvdmVyeU1vZGU7XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbn0gJiBTYWZlUmVjb3ZlcnlPcHRpb25zQmFzZSAmXG4gIFBpY2s8UmVjb3ZlclBhcmFtcywgJ2ZlZVJhdGUnPjtcblxuZnVuY3Rpb24gd2l0aFNhZmVSZWNvdmVyeUd1YXJkPFQ+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBvcHRpb25zOiBTYWZlUmVjb3ZlcnlPcHRpb25zQmFzZSxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBhc3NlcnRTYWZlUmVjb3ZlcnlTdXBwb3J0ZWQob25jaGFpblNsb3RGb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSksICd1dHhvJywgY29pbi5nZXRDaGFpbigpKTtcbiAgaWYgKG9wdGlvbnMuc2NhbiAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc2NhbiA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2FuIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cbiAgcmV0dXJuIGZuKCk7XG59XG5cbi8qKlxuICogRGVyaXZlIHRoZSB3YWxsZXQncyBvd24gZmlyc3QgZXh0ZXJuYWwgYWRkcmVzcyB0byBzYXRpc2Z5IGBiYWNrdXBLZXlSZWNvdmVyeWAnc1xuICogZGVzdGluYXRpb24gdmFsaWRhdGlvbi4gTmV2ZXIgYnJvYWRjYXN0LCBuZXZlciByZXR1cm5lZCB0byB0aGUgY2FsbGVyLlxuICovXG5mdW5jdGlvbiBzeW50aGVzaXplRGVzdGluYXRpb24oY29pbjogQWJzdHJhY3RVdHhvQ29pbiwgdHJpcGxldDogU2FmZUNoaWxkVHJpcGxldFB1YnMpOiBzdHJpbmcge1xuICBjb25zdCB3YWxsZXRLZXlzID0gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbSh7XG4gICAgdHJpcGxlOiBbdHJpcGxldC51c2VyLnB1YiwgdHJpcGxldC5iYWNrdXAucHViLCB0cmlwbGV0LmJpdGdvLnB1Yl0ubWFwKChwdWIpID0+IEJJUDMyLmZyb20ocHViKSkgYXMgVHJpcGxlPEJJUDMyPixcbiAgICBkZXJpdmF0aW9uUHJlZml4ZXM6IFsnbS8wLzAnLCAnbS8wLzAnLCAnbS8wLzAnXSxcbiAgfSk7XG4gIHJldHVybiBnZW5lcmF0ZUFkZHJlc3NXaXRoQ2hhaW5BbmRJbmRleChcbiAgICBjb2luLndhc21OYW1lLFxuICAgIHdhbGxldEtleXMsXG4gICAgZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLnZhbHVlKCdwMnNoJywgJ2V4dGVybmFsJyksXG4gICAgMCxcbiAgICB1bmRlZmluZWRcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldGVybWluZVNhZmVXYWxsZXRGdW5kaW5nKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB0cmlwbGV0OiBTYWZlQ2hpbGRUcmlwbGV0UHVicyxcbiAgb3B0aW9uczogU2FmZVJlY292ZXJ5T3B0aW9uc0Jhc2UgPSB7fVxuKTogUHJvbWlzZTxTYWZlV2FsbGV0RnVuZGluZ1N0YXR1cz4ge1xuICByZXR1cm4gd2l0aFNhZmVSZWNvdmVyeUd1YXJkKGNvaW4sIG9wdGlvbnMsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZWNvdmVyeVBhcmFtczogUmVjb3ZlclBhcmFtcyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBzeW50aGVzaXplRGVzdGluYXRpb24oY29pbiwgdHJpcGxldCksXG4gICAgICB1c2VyS2V5OiB0cmlwbGV0LnVzZXIucHViLFxuICAgICAgYmFja3VwS2V5OiB0cmlwbGV0LmJhY2t1cC5wdWIsXG4gICAgICBiaXRnb0tleTogdHJpcGxldC5iaXRnby5wdWIsXG4gICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgZmVlUmF0ZTogREVGQVVMVF9SRUNPVkVSWV9GRUVSQVRFX1NBVF9WQllURV9WMixcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4ucmVjb3ZlcihyZWNvdmVyeVBhcmFtcyk7XG4gICAgICByZXR1cm4gcmVzdWx0ICYmICd0eEhleCcgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudHhIZXggPT09ICdzdHJpbmcnICYmIHJlc3VsdC50eEhleC5sZW5ndGggPiAwXG4gICAgICAgID8gJ2Z1bmRlZCdcbiAgICAgICAgOiAndW5rbm93bic7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3JOb0lucHV0VG9SZWNvdmVyID8gJ2VtcHR5JyA6ICd1bmtub3duJztcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlclNhZmVXYWxsZXQoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHRyaXBsZXQ6IFNhZmVDaGlsZFRyaXBsZXQsXG4gIG9wdGlvbnM6IFJlY292ZXJTYWZlV2FsbGV0T3B0aW9uc1xuKTogUmV0dXJuVHlwZTx0eXBlb2YgYmFja3VwS2V5UmVjb3Zlcnk+IHtcbiAgcmV0dXJuIHdpdGhTYWZlUmVjb3ZlcnlHdWFyZChjb2luLCBvcHRpb25zLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBtb2RlLCByZWNvdmVyeURlc3RpbmF0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlY292ZXJ5UGFyYW1zOiBSZWNvdmVyUGFyYW1zID0ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICB1c2VyS2V5OiBtb2RlID09PSAnc2lnbmVkJyA/IHRyaXBsZXQudXNlci5wcnYgOiB0cmlwbGV0LnVzZXIucHViLFxuICAgICAgYmFja3VwS2V5OiBtb2RlID09PSAnc2lnbmVkJyA/IHRyaXBsZXQuYmFja3VwLnBydiA6IHRyaXBsZXQuYmFja3VwLnB1YixcbiAgICAgIGJpdGdvS2V5OiB0cmlwbGV0LmJpdGdvLnB1YixcbiAgICAgIGlnbm9yZUFkZHJlc3NUeXBlczogW10sXG4gICAgfTtcblxuICAgIHJldHVybiBjb2luLnJlY292ZXIocmVjb3ZlcnlQYXJhbXMpO1xuICB9KTtcbn1cbiJdfQ==