@metamask/shield-controller 2.1.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.1.0]
11
+
12
+ ### Added
13
+
14
+ - Added `AuthorizationList` in transaction init and log requests for 7702 transactions. ([#7246](https://github.com/MetaMask/core/pull/7246))
15
+
16
+ ### Changed
17
+
18
+ - Move peer dependencies for controller and service packages to direct dependencies ([#7209](https://github.com/MetaMask/core/pull/7209), [#7220](https://github.com/MetaMask/core/pull/7220), [#7236](https://github.com/MetaMask/core/pull/7236))
19
+ - The dependencies moved are:
20
+ - `@metamask/signature-controller` (^37.0.0)
21
+ - `@metamask/transaction-controller` (^62.3.0)
22
+ - In clients, it is now possible for multiple versions of these packages to exist in the dependency tree.
23
+ - For example, this scenario would be valid: a client relies on `@metamask/controller-a` 1.0.0 and `@metamask/controller-b` 1.0.0, and `@metamask/controller-b` depends on `@metamask/controller-a` 1.1.0.
24
+ - Note, however, that the versions specified in the client's `package.json` always "win", and you are expected to keep them up to date so as not to break controller and service intercommunication.
25
+
26
+ ## [3.0.0]
27
+
28
+ ### Changed
29
+
30
+ - Bump `@metamask/controller-utils` from `^11.15.0` to `^11.16.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
31
+ - **BREAKING:** Bump `@metamask/transaction-controller` from `^61.0.0` to `^62.0.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
32
+ - **BREAKING:** Bump `@metamask/signature-controller` from `^36.0.0` to `^37.0.0` ([#7202](https://github.com/MetaMask/core/pull/7202))
33
+
10
34
  ## [2.1.1]
11
35
 
12
36
  ### Added
@@ -33,8 +57,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
33
57
 
34
58
  ### Changed
35
59
 
36
- - fix: Fix build script not working because of missing `@ts-bridge/cli` dependency ([#7040](https://github.com/MetaMask/core/pull/7040))
37
- - chore(dev-deps): Bump `@ts-bridge/cli` from `^0.6.1` to `^0.6.4` ([#7039](https://github.com/MetaMask/core/pull/7039))
38
60
  - Bump `@metamask/transaction-controller` from `61.0.0` to `61.1.0`. ([#7007](https://github.com/MetaMask/core/pull/7007))
39
61
  - Bump `@metamask/controller-utils` from `^11.14.1` to `^11.15.0`. ([#7003](https://github.com/MetaMask/core/pull/7003))
40
62
 
@@ -140,7 +162,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
140
162
 
141
163
  - Initial release of the shield-controller package ([#6137](https://github.com/MetaMask/core/pull/6137)
142
164
 
143
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@2.1.1...HEAD
165
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@3.1.0...HEAD
166
+ [3.1.0]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@3.0.0...@metamask/shield-controller@3.1.0
167
+ [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@2.1.1...@metamask/shield-controller@3.0.0
144
168
  [2.1.1]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@2.1.0...@metamask/shield-controller@2.1.1
145
169
  [2.1.0]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@2.0.0...@metamask/shield-controller@2.1.0
146
170
  [2.0.0]: https://github.com/MetaMask/core/compare/@metamask/shield-controller@1.2.0...@metamask/shield-controller@2.0.0
package/dist/backend.cjs CHANGED
@@ -12,7 +12,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
12
12
  };
13
13
  var _ShieldRemoteBackend_instances, _ShieldRemoteBackend_getAccessToken, _ShieldRemoteBackend_baseUrl, _ShieldRemoteBackend_fetch, _ShieldRemoteBackend_pollingPolicy, _ShieldRemoteBackend_initCoverageCheck, _ShieldRemoteBackend_getCoverageResult, _ShieldRemoteBackend_createHeaders;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.parseSignatureRequestMethod = exports.ShieldRemoteBackend = void 0;
15
+ exports.parseSignatureRequestMethod = exports.makeInitCoverageCheckBody = exports.ShieldRemoteBackend = void 0;
16
16
  const controller_utils_1 = require("@metamask/controller-utils");
17
17
  const signature_controller_1 = require("@metamask/signature-controller");
18
18
  const constants_1 = require("./constants.cjs");
@@ -170,6 +170,7 @@ function makeInitCoverageCheckBody(txMeta) {
170
170
  return {
171
171
  txParams: [
172
172
  {
173
+ authorizationList: txMeta.txParams.authorizationList,
173
174
  from: txMeta.txParams.from,
174
175
  to: txMeta.txParams.to,
175
176
  value: txMeta.txParams.value,
@@ -181,6 +182,7 @@ function makeInitCoverageCheckBody(txMeta) {
181
182
  origin: txMeta.origin,
182
183
  };
183
184
  }
185
+ exports.makeInitCoverageCheckBody = makeInitCoverageCheckBody;
184
186
  /**
185
187
  * Make the body for the init signature coverage check request.
186
188
  *
@@ -1 +1 @@
1
- {"version":3,"file":"backend.cjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iEAIoC;AACpC,yEAIwC;AAIxC,+CAAmD;AACnD,mEAAmE;AAkDnE,MAAa,mBAAmB;IAS9B,YAAY,EACV,cAAc,EACd,wBAAwB,GAAG,IAAI,EAAE,eAAe;IAChD,6BAA6B,GAAG,IAAI,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GAOf;;QApBQ,sDAAuC;QAEvC,+CAAiB;QAEjB,6CAAgC;QAEhC,qDAA2C;QAelD,uBAAA,IAAI,uCAAmB,cAAc,MAAA,CAAC;QACtC,uBAAA,IAAI,gCAAY,OAAO,MAAA,CAAC;QACxB,uBAAA,IAAI,8BAAU,OAAO,MAAA,CAAC;QAEtB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,mCAAmC,CACjE,wBAAwB,EACxB,6BAA6B,CAC9B,CAAC;QAEF,uBAAA,IAAI,sCAAkB,IAAI,gDAA0B,CAAC;YACnD,OAAO;YACP,UAAU;SACX,CAAC,MAAA,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAyB;QAC3C,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,uBAAA,IAAI,8EAAmB,MAAvB,IAAI,EAC1B,8BAA8B,EAC9B,OAAO,CACR,CAAC,CAAC;QACL,CAAC;QAED,MAAM,mBAAmB,GAAG,GAAG,uBAAA,IAAI,oCAAS,iCAAiC,CAAC;QAC9E,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,8EAAmB,MAAvB,IAAI,EAC/B,GAAG,CAAC,MAAM,CAAC,EAAE,EACb,UAAU,EACV,mBAAmB,CACpB,CAAC;QACF,OAAO;YACL,UAAU;YACV,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,OAAO,EAAE,cAAc,CAAC,OAAO;SAChC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,GAAkC;QAElC,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,kCAAkC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACzE,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,uBAAA,IAAI,8EAAmB,MAAvB,IAAI,EAC1B,4BAA4B,EAC5B,OAAO,CACR,CAAC,CAAC;QACL,CAAC;QAED,MAAM,0BAA0B,GAAG,GAAG,uBAAA,IAAI,oCAAS,+BAA+B,CAAC;QACnF,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,8EAAmB,MAAvB,IAAI,EAC/B,GAAG,CAAC,gBAAgB,CAAC,EAAE,EACvB,UAAU,EACV,0BAA0B,CAC3B,CAAC;QACF,OAAO;YACL,UAAU;YACV,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,OAAO,EAAE,cAAc,CAAC,OAAO;SAChC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAwB;QACzC,MAAM,QAAQ,GAAG,kCAAkC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG;YACX,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,QAAQ;SACZ,CAAC;QAEF,iDAAiD;QACjD,uBAAA,IAAI,0CAAe,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,MAAM,uBAAA,IAAI,kCAAO,MAAX,IAAI,EACpB,GAAG,uBAAA,IAAI,oCAAS,4BAA4B,EAC5C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB;YACpC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CACF,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAA0B;QAC7C,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG;YACX,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,QAAQ;SACZ,CAAC;QAEF,iDAAiD;QACjD,uBAAA,IAAI,0CAAe,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAG,MAAM,uBAAA,IAAI,kCAAO,MAAX,IAAI,EACpB,GAAG,uBAAA,IAAI,oCAAS,8BAA8B,EAC9C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB;YACpC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CACF,CAAC;QACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CA6EF;AAtND,kDAsNC;4RA3EC,KAAK,iDACH,IAAY,EACZ,OAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,uBAAA,IAAI,kCAAO,MAAX,IAAI,EAAQ,GAAG,uBAAA,IAAI,oCAAS,IAAI,IAAI,EAAE,EAAE;QACxD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,MAAM,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB;QACpC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8B,CAAC;AACzD,CAAC,2CAED,KAAK,iDACH,SAAiB,EACjB,UAAkB,EAClB,iBAAyB;IAEzB,MAAM,OAAO,GAA6B;QACxC,UAAU;KACX,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;IAE5C,wEAAwE;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAAmB,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,MAAM,uBAAA,IAAI,kCAAO,MAAX,IAAI,EAAQ,iBAAiB,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,2FAA2F;YAC3F,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+C,CAAC;QAC1E,CAAC;QAED,iDAAiD;QACjD,IAAI,YAAY,GAAG,qCAAqC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACnC,YAAY,GAAG,kCAAkC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,kCAAkC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,4BAAS,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,uBAAA,IAAI,0CAAe,CAAC,KAAK,CAC5C,SAAS,EACT,mBAAmB,CACpB,CAAC;IAEF,sEAAsE;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,GAAG,GAAG,SAAS,CAAC;IAErC,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;KACN,CAAC;AACjC,CAAC,uCAED,KAAK;IACH,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,2CAAgB,MAApB,IAAI,CAAkB,CAAC;IACjD,OAAO;QACL,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,UAAU,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC;AAGH;;;;;GAKG;AACH,SAAS,yBAAyB,CAChC,MAAuB;IAEvB,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBAC1B,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;gBACtB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;gBAC5B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBAC1B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;aAC7B;SACF;QACD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,kCAAkC,CACzC,gBAAkC;IAElC,sEAAsE;IACtE,2FAA2F;IAC3F,iHAAiH;IACjH,MAAM,MAAM,GAAG,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;IAE7D,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,IAAI,EAAE,gBAAgB,CAAC,aAAa,CAAC,IAAI;QACzC,IAAI,EAAE,gBAAgB,CAAC,aAAa,CAAC,IAAI;QACzC,MAAM;QACN,MAAM,EAAE,gBAAgB,CAAC,aAAa,CAAC,MAAM;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CACzC,gBAAkC;IAElC,IAAI,gBAAgB,CAAC,IAAI,KAAK,2CAAoB,CAAC,SAAS,EAAE,CAAC;QAC7D,QAAQ,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACjC,KAAK,gCAAoB,CAAC,EAAE;gBAC1B,OAAO,gCAAS,CAAC,eAAe,CAAC;YACnC,KAAK,gCAAoB,CAAC,EAAE;gBAC1B,OAAO,gCAAS,CAAC,eAAe,CAAC;YACnC,KAAK,gCAAoB,CAAC,EAAE,CAAC;YAC7B;gBACE,OAAO,2CAAoB,CAAC,SAAS,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC,IAAI,CAAC;AAC/B,CAAC;AAhBD,kEAgBC;AAED;;;;;;GAMG;AACH,SAAS,mCAAmC,CAC1C,OAAe,EACf,YAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,kCAAe,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAElE,MAAM,UAAU,GACd,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACxD,CAAC,CAAC,sCAAmB;QACrB,CAAC,CAAC,kBAAkB,CAAC;IAEzB,OAAO;QACL,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC","sourcesContent":["import {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport {\n EthMethod,\n SignatureRequestType,\n type SignatureRequest,\n} from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\n\nimport { SignTypedDataVersion } from './constants';\nimport { PollingWithCockatielPolicy } from './polling-with-policy';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n }\n\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#createHeaders();\n\n // Start measuring total end-to-end latency including retries and delays\n const startTime = Date.now();\n\n const getCoverageResultFn = async (signal: AbortSignal) => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n // Return the result without latency here - we'll add total latency after polling completes\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n // parse the error message from the response body\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = await res.json();\n errorMessage = `Failed to get coverage result: ${errorJson.message || errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n // Calculate total end-to-end latency including all retries and delays\n const now = Date.now();\n const totalLatency = now - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nfunction makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n // TODO: confirm that do we still need to validate the signature data?\n // signature controller already validates the signature data before adding it to the state.\n // @link https://github.com/MetaMask/core/blob/main/packages/signature-controller/src/SignatureController.ts#L408\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n) {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n"]}
1
+ {"version":3,"file":"backend.cjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport {\n EthMethod,\n SignatureRequestType,\n type SignatureRequest,\n} from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { AuthorizationList } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\n\nimport { SignTypedDataVersion } from './constants';\nimport { PollingWithCockatielPolicy } from './polling-with-policy';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n authorizationList?: AuthorizationList;\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n }\n\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#createHeaders();\n\n // Start measuring total end-to-end latency including retries and delays\n const startTime = Date.now();\n\n const getCoverageResultFn = async (signal: AbortSignal) => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n // Return the result without latency here - we'll add total latency after polling completes\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n // parse the error message from the response body\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = await res.json();\n errorMessage = `Failed to get coverage result: ${errorJson.message || errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n // Calculate total end-to-end latency including all retries and delays\n const now = Date.now();\n const totalLatency = now - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nexport function makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n authorizationList: txMeta.txParams.authorizationList,\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n // TODO: confirm that do we still need to validate the signature data?\n // signature controller already validates the signature data before adding it to the state.\n // @link https://github.com/MetaMask/core/blob/main/packages/signature-controller/src/SignatureController.ts#L408\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n) {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n"]}
@@ -1,9 +1,12 @@
1
1
  import { type SignatureRequest } from "@metamask/signature-controller";
2
+ import type { TransactionMeta } from "@metamask/transaction-controller";
3
+ import type { AuthorizationList } from "@metamask/transaction-controller";
2
4
  import type { Json } from "@metamask/utils";
3
5
  import type { CheckCoverageRequest, CheckSignatureCoverageRequest, CoverageResult, CoverageStatus, LogSignatureRequest, LogTransactionRequest, ShieldBackend } from "./types.cjs";
4
6
  export type InitCoverageCheckRequest = {
5
7
  txParams: [
6
8
  {
9
+ authorizationList?: AuthorizationList;
7
10
  from: string;
8
11
  to?: string;
9
12
  value?: string;
@@ -51,6 +54,13 @@ export declare class ShieldRemoteBackend implements ShieldBackend {
51
54
  logSignature(req: LogSignatureRequest): Promise<void>;
52
55
  logTransaction(req: LogTransactionRequest): Promise<void>;
53
56
  }
57
+ /**
58
+ * Make the body for the init coverage check request.
59
+ *
60
+ * @param txMeta - The transaction metadata.
61
+ * @returns The body for the init coverage check request.
62
+ */
63
+ export declare function makeInitCoverageCheckBody(txMeta: TransactionMeta): InitCoverageCheckRequest;
54
64
  /**
55
65
  * Parse the JSON-RPC method from the signature request.
56
66
  *
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.cts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,gBAAgB,EACtB,uCAAuC;AAExC,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB;AAI5C,OAAO,KAAK,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,oBAAgB;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB;KACF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,qBAAa,mBAAoB,YAAW,aAAa;;gBAS3C,EACV,cAAc,EACd,wBAA+B,EAAE,eAAe;IAChD,6BAAoC,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GACf,EAAE;QACD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;KAChC;IAgBK,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBjE,sBAAsB,CAC1B,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,cAAc,CAAC;IAyBpB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrD,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqGhE;AAiDD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,CAcR"}
1
+ {"version":3,"file":"backend.d.cts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,gBAAgB,EACtB,uCAAuC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB;AAI5C,OAAO,KAAK,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,oBAAgB;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR;YACE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;YACtC,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB;KACF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,qBAAa,mBAAoB,YAAW,aAAa;;gBAS3C,EACV,cAAc,EACd,wBAA+B,EAAE,eAAe;IAChD,6BAAoC,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GACf,EAAE;QACD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;KAChC;IAgBK,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBjE,sBAAsB,CAC1B,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,cAAc,CAAC;IAyBpB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrD,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqGhE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,wBAAwB,CAe1B;AAyBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,CAcR"}
@@ -1,9 +1,12 @@
1
1
  import { type SignatureRequest } from "@metamask/signature-controller";
2
+ import type { TransactionMeta } from "@metamask/transaction-controller";
3
+ import type { AuthorizationList } from "@metamask/transaction-controller";
2
4
  import type { Json } from "@metamask/utils";
3
5
  import type { CheckCoverageRequest, CheckSignatureCoverageRequest, CoverageResult, CoverageStatus, LogSignatureRequest, LogTransactionRequest, ShieldBackend } from "./types.mjs";
4
6
  export type InitCoverageCheckRequest = {
5
7
  txParams: [
6
8
  {
9
+ authorizationList?: AuthorizationList;
7
10
  from: string;
8
11
  to?: string;
9
12
  value?: string;
@@ -51,6 +54,13 @@ export declare class ShieldRemoteBackend implements ShieldBackend {
51
54
  logSignature(req: LogSignatureRequest): Promise<void>;
52
55
  logTransaction(req: LogTransactionRequest): Promise<void>;
53
56
  }
57
+ /**
58
+ * Make the body for the init coverage check request.
59
+ *
60
+ * @param txMeta - The transaction metadata.
61
+ * @returns The body for the init coverage check request.
62
+ */
63
+ export declare function makeInitCoverageCheckBody(txMeta: TransactionMeta): InitCoverageCheckRequest;
54
64
  /**
55
65
  * Parse the JSON-RPC method from the signature request.
56
66
  *
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.mts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,gBAAgB,EACtB,uCAAuC;AAExC,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB;AAI5C,OAAO,KAAK,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,oBAAgB;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB;KACF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,qBAAa,mBAAoB,YAAW,aAAa;;gBAS3C,EACV,cAAc,EACd,wBAA+B,EAAE,eAAe;IAChD,6BAAoC,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GACf,EAAE;QACD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;KAChC;IAgBK,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBjE,sBAAsB,CAC1B,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,cAAc,CAAC;IAyBpB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrD,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqGhE;AAiDD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,CAcR"}
1
+ {"version":3,"file":"backend.d.mts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,gBAAgB,EACtB,uCAAuC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,yCAAyC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB;AAI5C,OAAO,KAAK,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,oBAAgB;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR;YACE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;YACtC,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB;KACF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,qBAAa,mBAAoB,YAAW,aAAa;;gBAS3C,EACV,cAAc,EACd,wBAA+B,EAAE,eAAe;IAChD,6BAAoC,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GACf,EAAE;QACD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;KAChC;IAgBK,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyBjE,sBAAsB,CAC1B,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,cAAc,CAAC;IAyBpB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrD,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqGhE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,wBAAwB,CAe1B;AAyBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,gBAAgB,GACjC,MAAM,CAcR"}
package/dist/backend.mjs CHANGED
@@ -162,10 +162,11 @@ _ShieldRemoteBackend_getAccessToken = new WeakMap(), _ShieldRemoteBackend_baseUr
162
162
  * @param txMeta - The transaction metadata.
163
163
  * @returns The body for the init coverage check request.
164
164
  */
165
- function makeInitCoverageCheckBody(txMeta) {
165
+ export function makeInitCoverageCheckBody(txMeta) {
166
166
  return {
167
167
  txParams: [
168
168
  {
169
+ authorizationList: txMeta.txParams.authorizationList,
169
170
  from: txMeta.txParams.from,
170
171
  to: txMeta.txParams.to,
171
172
  value: txMeta.txParams.value,
@@ -1 +1 @@
1
- {"version":3,"file":"backend.mjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport {\n EthMethod,\n SignatureRequestType,\n type SignatureRequest,\n} from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\n\nimport { SignTypedDataVersion } from './constants';\nimport { PollingWithCockatielPolicy } from './polling-with-policy';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n }\n\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#createHeaders();\n\n // Start measuring total end-to-end latency including retries and delays\n const startTime = Date.now();\n\n const getCoverageResultFn = async (signal: AbortSignal) => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n // Return the result without latency here - we'll add total latency after polling completes\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n // parse the error message from the response body\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = await res.json();\n errorMessage = `Failed to get coverage result: ${errorJson.message || errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n // Calculate total end-to-end latency including all retries and delays\n const now = Date.now();\n const totalLatency = now - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nfunction makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n // TODO: confirm that do we still need to validate the signature data?\n // signature controller already validates the signature data before adding it to the state.\n // @link https://github.com/MetaMask/core/blob/main/packages/signature-controller/src/SignatureController.ts#L408\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n) {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n"]}
1
+ {"version":3,"file":"backend.mjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport {\n EthMethod,\n SignatureRequestType,\n type SignatureRequest,\n} from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { AuthorizationList } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\n\nimport { SignTypedDataVersion } from './constants';\nimport { PollingWithCockatielPolicy } from './polling-with-policy';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n authorizationList?: AuthorizationList;\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n }\n\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n // cancel the pending get coverage result request\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#createHeaders();\n\n // Start measuring total end-to-end latency including retries and delays\n const startTime = Date.now();\n\n const getCoverageResultFn = async (signal: AbortSignal) => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n // Return the result without latency here - we'll add total latency after polling completes\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n // parse the error message from the response body\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = await res.json();\n errorMessage = `Failed to get coverage result: ${errorJson.message || errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n // Calculate total end-to-end latency including all retries and delays\n const now = Date.now();\n const totalLatency = now - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nexport function makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n authorizationList: txMeta.txParams.authorizationList,\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n // TODO: confirm that do we still need to validate the signature data?\n // signature controller already validates the signature data before adding it to the state.\n // @link https://github.com/MetaMask/core/blob/main/packages/signature-controller/src/SignatureController.ts#L408\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n) {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/shield-controller",
3
- "version": "2.1.1",
3
+ "version": "3.1.0",
4
4
  "description": "Controller handling shield transaction coverage logic",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -49,8 +49,10 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "@metamask/base-controller": "^9.0.0",
52
- "@metamask/controller-utils": "^11.15.0",
52
+ "@metamask/controller-utils": "^11.16.0",
53
53
  "@metamask/messenger": "^0.3.0",
54
+ "@metamask/signature-controller": "^37.0.0",
55
+ "@metamask/transaction-controller": "^62.3.0",
54
56
  "@metamask/utils": "^11.8.1",
55
57
  "cockatiel": "^3.1.2"
56
58
  },
@@ -59,8 +61,6 @@
59
61
  "@lavamoat/allow-scripts": "^3.0.4",
60
62
  "@lavamoat/preinstall-always-fail": "^2.1.0",
61
63
  "@metamask/auto-changelog": "^3.4.4",
62
- "@metamask/signature-controller": "^36.0.0",
63
- "@metamask/transaction-controller": "^61.3.0",
64
64
  "@ts-bridge/cli": "^0.6.4",
65
65
  "@types/jest": "^27.4.1",
66
66
  "deepmerge": "^4.2.2",
@@ -72,10 +72,6 @@
72
72
  "typescript": "~5.3.3",
73
73
  "uuid": "^8.3.2"
74
74
  },
75
- "peerDependencies": {
76
- "@metamask/signature-controller": "^36.0.0",
77
- "@metamask/transaction-controller": "^61.0.0"
78
- },
79
75
  "engines": {
80
76
  "node": "^18.18 || >=20"
81
77
  },