@pushchain/core 6.0.24 → 6.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/package.json +1 -1
  3. package/src/lib/constants/abi/index.d.ts +1 -0
  4. package/src/lib/constants/abi/index.js +4 -1
  5. package/src/lib/constants/abi/prc20.evm.d.ts +32 -0
  6. package/src/lib/constants/abi/prc20.evm.js +20 -0
  7. package/src/lib/constants/abi/uea-factory.d.ts +31 -0
  8. package/src/lib/constants/abi/uea-factory.js +19 -0
  9. package/src/lib/constants/abi/universalCallback.evm.d.ts +561 -0
  10. package/src/lib/constants/abi/universalCallback.evm.js +247 -0
  11. package/src/lib/constants/abi/universalGatewayV0.json +1 -1
  12. package/src/lib/constants/abi/universalReadRegistry.evm.d.ts +247 -0
  13. package/src/lib/constants/abi/universalReadRegistry.evm.js +38 -0
  14. package/src/lib/constants/chain.d.ts +12 -0
  15. package/src/lib/constants/chain.js +24 -2
  16. package/src/lib/constants/enums.d.ts +7 -0
  17. package/src/lib/constants/enums.js +11 -0
  18. package/src/lib/constants/index.d.ts +54 -0
  19. package/src/lib/constants/index.js +38 -8
  20. package/src/lib/constants/read-state.d.ts +57 -0
  21. package/src/lib/constants/read-state.js +63 -0
  22. package/src/lib/generated/ucallback/v1/index.d.ts +2 -0
  23. package/src/lib/generated/ucallback/v1/index.js +6 -0
  24. package/src/lib/generated/ucallback/v1/query.d.ts +47 -0
  25. package/src/lib/generated/ucallback/v1/query.js +131 -0
  26. package/src/lib/generated/ucallback/v1/types.d.ts +99 -0
  27. package/src/lib/generated/ucallback/v1/types.js +366 -0
  28. package/src/lib/generated/uexecutor/v1/query.d.ts +29 -0
  29. package/src/lib/generated/uexecutor/v1/query.js +98 -1
  30. package/src/lib/index.d.ts +9 -0
  31. package/src/lib/index.js +38 -1
  32. package/src/lib/orchestrator/internals/cascade.js +5 -2
  33. package/src/lib/orchestrator/internals/errors.d.ts +6 -0
  34. package/src/lib/orchestrator/internals/errors.js +13 -1
  35. package/src/lib/orchestrator/internals/index.d.ts +1 -0
  36. package/src/lib/orchestrator/internals/index.js +6 -1
  37. package/src/lib/orchestrator/internals/push-chain-tx.js +81 -61
  38. package/src/lib/orchestrator/internals/read-state.d.ts +24 -0
  39. package/src/lib/orchestrator/internals/read-state.js +47 -0
  40. package/src/lib/orchestrator/internals/route-handlers.js +6 -1
  41. package/src/lib/orchestrator/internals/svm-helpers.js +24 -0
  42. package/src/lib/orchestrator/orchestrator.d.ts +26 -0
  43. package/src/lib/orchestrator/orchestrator.js +22 -0
  44. package/src/lib/orchestrator/orchestrator.types.d.ts +2 -0
  45. package/src/lib/orchestrator/route-detector.js +4 -0
  46. package/src/lib/progress-hook/progress-hook.js +292 -0
  47. package/src/lib/progress-hook/progress-hook.types.d.ts +35 -0
  48. package/src/lib/progress-hook/progress-hook.types.js +37 -0
  49. package/src/lib/push-chain/push-chain.d.ts +71 -0
  50. package/src/lib/push-chain/push-chain.js +28 -0
  51. package/src/lib/push-client/push-client.d.ts +42 -2
  52. package/src/lib/push-client/push-client.js +152 -13
  53. package/src/lib/read-state/budget.d.ts +16 -0
  54. package/src/lib/read-state/budget.js +32 -0
  55. package/src/lib/read-state/destination.d.ts +12 -0
  56. package/src/lib/read-state/destination.js +51 -0
  57. package/src/lib/read-state/envelopes/evm.d.ts +24 -0
  58. package/src/lib/read-state/envelopes/evm.js +147 -0
  59. package/src/lib/read-state/envelopes/index.d.ts +12 -0
  60. package/src/lib/read-state/envelopes/index.js +45 -0
  61. package/src/lib/read-state/envelopes/svm.d.ts +32 -0
  62. package/src/lib/read-state/envelopes/svm.js +117 -0
  63. package/src/lib/read-state/envelopes/web2.d.ts +29 -0
  64. package/src/lib/read-state/envelopes/web2.js +149 -0
  65. package/src/lib/read-state/errors.d.ts +70 -0
  66. package/src/lib/read-state/errors.js +116 -0
  67. package/src/lib/read-state/index.d.ts +13 -0
  68. package/src/lib/read-state/index.js +38 -0
  69. package/src/lib/read-state/preflight.d.ts +21 -0
  70. package/src/lib/read-state/preflight.js +70 -0
  71. package/src/lib/read-state/read-events.d.ts +27 -0
  72. package/src/lib/read-state/read-events.js +135 -0
  73. package/src/lib/read-state/read-executor.d.ts +18 -0
  74. package/src/lib/read-state/read-executor.js +216 -0
  75. package/src/lib/read-state/read-params.d.ts +250 -0
  76. package/src/lib/read-state/read-params.js +164 -0
  77. package/src/lib/read-state/read-state.types.d.ts +458 -0
  78. package/src/lib/read-state/read-state.types.js +72 -0
  79. package/src/lib/read-state/read-tracker.d.ts +55 -0
  80. package/src/lib/read-state/read-tracker.js +481 -0
  81. package/src/lib/read-state/registry.d.ts +21 -0
  82. package/src/lib/read-state/registry.js +53 -0
  83. package/src/lib/read-state/result-decoder.d.ts +16 -0
  84. package/src/lib/read-state/result-decoder.js +79 -0
  85. package/src/lib/read-state/spec-builder.d.ts +47 -0
  86. package/src/lib/read-state/spec-builder.js +251 -0
  87. package/src/lib/read-state/svm-account.d.ts +20 -0
  88. package/src/lib/read-state/svm-account.js +114 -0
  89. package/src/lib/read-state/svm-pda.d.ts +13 -0
  90. package/src/lib/read-state/svm-pda.js +147 -0
  91. package/src/lib/read-state/validate.d.ts +22 -0
  92. package/src/lib/read-state/validate.js +80 -0
  93. package/src/lib/universal-tx-detector/child-inbounds.d.ts +3 -1
  94. package/src/lib/universal-tx-detector/child-inbounds.js +4 -5
  95. package/src/lib/universal-tx-detector/detector-svm.js +29 -20
  96. package/src/lib/universal-tx-detector/svm-events.d.ts +17 -5
  97. package/src/lib/universal-tx-detector/svm-events.js +81 -6
  98. package/src/lib/vm-client/evm-client.js +27 -10
package/CHANGELOG.md CHANGED
@@ -1,3 +1,153 @@
1
+ @pushchain/core@6.0.26 (2026-09-23)
2
+
3
+ - docs: changelog for read-state docs parity
4
+ - feat: align read-state API with the Universal Read docs
5
+ - fix: race prune and archive for Push receipts and block results
6
+ - feat: add Solana account reads and update read registry
7
+
8
+ ---
9
+
10
+ @pushchain/core (unreleased)
11
+
12
+ Changes on `feature/readstate-docs-parity` since 6.0.25, aligning Universal Read with the
13
+ push-chain-website docs (PR #1244).
14
+
15
+ ### Breaking
16
+
17
+ - Solana token reads detect SPL Token vs Token-2022 from the mint's owner. The
18
+ `tokenProgram` option is removed and now throws.
19
+ - The Donut Universal Read Registry default is
20
+ `0x00000000000000000000000000000000000000b2`. Results stored on the previous
21
+ registry stay there; tracking by request ID still works.
22
+ - `READ-TX-199-01` (level SUCCESS) now fires only when `outcome` is `SUCCESS`. A
23
+ FULFILLED read that did not work (source error, callback failure, undecodable
24
+ result, unconfirmed delivery) ends on `READ-TX-199-02`, whose `status` is the
25
+ outcome name.
26
+
27
+ ### Added
28
+
29
+ - Solana account reads with `idl`, the counterpart of `abi`. The account layout is
30
+ picked by its 8-byte discriminator; the optional `functionName` names the layout
31
+ (snake, camel or Pascal case) and types `value`. With the program id as the
32
+ subject, `functionName` plus positional `args` derive the PDA from the seeds the
33
+ IDL declares. `accountName` is not supported and throws with a hint.
34
+ - EVM contract-call reads accept any ABI function, including `nonpayable` and
35
+ `payable`. Validators run the call as an `eth_call` simulation at the pinned
36
+ block, so it returns data and never executes.
37
+ - `response.outcome` (`PushChain.CONSTANTS.READ.OUTCOME`): one answer to "did it
38
+ work" — `SUCCESS`, `SOURCE_ERROR`, `CALLBACK_FAILED`, `DECODE_FAILED`,
39
+ `EXPIRED`, `FAILED`, `ABORTED`, `PENDING`, or `UNKNOWN` (delivery unconfirmed).
40
+ - `response.requestIdUint`: the request ID as the `uint256` contracts key results by.
41
+ - Progress events: `READ-TX-104-03` Looking Up Request, `104-04` Request Found,
42
+ `104-05` Request Not Found (lookup timeout), `105-04` Approaching Expiry (once per
43
+ `wait()`, at 30 or fewer Push blocks left) and `102-04` Preflight Stale (a read
44
+ prepared more than 60 s before `executeReads`).
45
+
46
+ ### Improved
47
+
48
+ - `trackRead` on a settled read returns in about 1 s instead of about 19 s on
49
+ Donut. Fulfil and settle receipts are fetched in parallel, and Push receipts
50
+ are requested from the prune RPC and the archive at the same time.
51
+ - `callback.gasLimit` is optional for custom targets and defaults to `500_000n`,
52
+ like the registry. Unused callback budget is refunded.
53
+ - Refund events `READ-TX-106-05/06` also fire for expired reads.
54
+ - `value` is typed `unknown` for ABIs not declared `as const`; a single-output
55
+ function decodes to the bare value, not an array.
56
+
57
+ ### Fixed
58
+
59
+ - `explorerUrl` and Donut's viem `blockExplorers` pointed at
60
+ `explorer.donut.push.org`, which does not resolve. They now use
61
+ `https://donut.push.network`.
62
+ - Refunds of expired reads older than the prune window came back `undefined`.
63
+ Cosmos block results now fall back to the archive RPC.
64
+
65
+ ---
66
+
67
+ @pushchain/core@6.0.25 (2026-09-16)
68
+
69
+ - docs: document read-state and transaction fixes
70
+ - feat: align read-state API with v3 review
71
+ - test: consolidate read-state e2e harnesses
72
+ - feat: integrate universal read registry
73
+ - fix: harden gasless and cross-chain transaction handling
74
+ - feat: align read-state API with v2 spec
75
+ - fix: validate prepared reads and infer typed results
76
+ - fix: preserve read-state recovery and expand test coverage
77
+ - feat: read-state PR7 — custom-receiver read() / executeReads(), review fixes
78
+ - feat: read-state PR6 — live e2e tree, CI `read` group, wait() option fix
79
+ - feat: read-state PR5 — public universal surface, CONSTANTS.READ, exports
80
+ - feat: read-state PR4 — trackRead, wait/refresh, READ-TX progress band
81
+ - feat: prepareRead — validated ReadSpec builder, refundTo default, simulate
82
+ - feat: read-state chain client — ucallback queries, preflight, budget sizing
83
+ - feat: read-state foundation — envelopes, decoders, ucallback codecs, ABIs, constants
84
+
85
+ ---
86
+
87
+ @pushchain/core (unreleased)
88
+
89
+ Changes merged on 2026-09-16: [#265](https://github.com/pushchain/push-chain-sdk/pull/265), [#266](https://github.com/pushchain/push-chain-sdk/pull/266).
90
+
91
+ ### Added
92
+
93
+ - Added Universal Read through `client.universal.read()`, `prepareRead()`,
94
+ `executeReads()`, and `trackRead()`. Supports EVM native/token balances, typed
95
+ contract calls and storage slots; Solana native/token balances, including
96
+ Token-2022; and HTTPS JSON extraction through `CHAIN.WEB2`.
97
+ - Integrated the canonical UniversalReadRegistry on Donut. Reads use it by default
98
+ with 500,000 callback gas, configurable up to 1,000,000. Custom application
99
+ receivers use `callback: { target, gasLimit, abi, functionName, args? }`.
100
+ Other networks require an explicitly configured application receiver.
101
+ - Added typed read results, resumable tracking by transaction hash or request ID,
102
+ ordered batch results, and `READ-TX-*` progress events. Read responses report
103
+ callback delivery/failure separately from consensus status, plus protocol fees,
104
+ callback budget, gas burned and observed refunds.
105
+ - Added live read-state E2E coverage for EVM, Solana, Web2, registry storage,
106
+ UEA/CEA execution, batching, callback reverts, expiry and recovery, plus an
107
+ offline compatibility-check command: `node scripts/check-read-state-drift.mjs`.
108
+
109
+ ### Improved
110
+
111
+ - Validate read query options and ABI argument/result types, including overloaded
112
+ functions. Revalidate prepared reads against current chain state before sending
113
+ without changing their query, block pin, expiry or payment.
114
+ - Calculate default read polling timeouts from remaining Push blocks plus a
115
+ 10-second observation margin, capped at 180 seconds and recalculated on resume.
116
+ Explicit timeouts take precedence; a client timeout does not cancel the request.
117
+ - Preserve mined transaction hashes and any pending transaction hash when a
118
+ sequential batch fails, so callers can recover completed calls and check an
119
+ uncertain broadcast before resubmitting. Read-batch mismatches also retain all
120
+ transaction hashes.
121
+
122
+ ### Fixed
123
+
124
+ - Confirm expired-read refunds from Cosmos EndBlock events across execution-attempt
125
+ heights. Missing blocks or unrelated malformed logs no longer hide valid refund
126
+ evidence; unknown refund amounts are not assumed to have been paid.
127
+ - Respect the on-chain gasless transaction gas limit for `MsgExecutePayload`,
128
+ bounded by the SDK's 100-million-gas ceiling, with a cached query and fallback
129
+ when chain parameters are unavailable.
130
+ - Estimate gas for empty-calldata native transfers to contracts and EIP-7702
131
+ delegated accounts instead of assuming 21,000 gas. Explicit gas overrides remain
132
+ supported.
133
+ - Surface reverted Push transaction receipts as execution failures.
134
+ - Decode Solana gateway events from Anchor `emit_cpi!` inner instructions while
135
+ retaining support for older log events. Use the gateway event index consistently
136
+ for transaction detection, PC20 tracking and child inbounds, and update the
137
+ bundled gateway IDL.
138
+ - Resolve the destination SPL mint before calculating Solana account rent for
139
+ outbound transfers and cascades.
140
+
141
+ ### Read State notes
142
+
143
+ - `FULFILLED` alone does not prove a usable result: check `raw.status` and
144
+ `callbackDelivered`. Terminal read failures resolve as statuses; validation,
145
+ transaction, RPC and timeout errors can still reject.
146
+ - Registry query-key and storage-lookup helpers are internal. Prepared reads retain
147
+ `queryKey`; direct storage lookups use the exported registry ABI.
148
+
149
+ ---
150
+
1
151
  @pushchain/core@6.0.23 (2026-09-01)
2
152
 
3
153
  - docs: changelog entry for the EVM PC20 burn routing fix
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushchain/core",
3
- "version": "6.0.24",
3
+ "version": "6.0.26",
4
4
  "homepage": "https://push.org",
5
5
  "keywords": [
6
6
  "pushchain",
@@ -15,3 +15,4 @@ export { UEA_FACTORY_ABI } from './uea-factory';
15
15
  export { PC20_FACTORY_EVM, PC20_WRAPPER_EVM, EXTERNAL_GATEWAY_PC20_EVM, VAULT_PC20_FACTORY_EVM, } from './pc20.evm';
16
16
  export { WPC_EVM } from './wpc.evm';
17
17
  export { UNIV3_SWAP_ROUTER_EVM } from './uniswap-v3-router.evm';
18
+ export { UNIVERSAL_CALLBACK_EVM } from './universalCallback.evm';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UNIV3_SWAP_ROUTER_EVM = exports.WPC_EVM = exports.VAULT_PC20_FACTORY_EVM = exports.EXTERNAL_GATEWAY_PC20_EVM = exports.PC20_WRAPPER_EVM = exports.PC20_FACTORY_EVM = exports.UEA_FACTORY_ABI = exports.UNIVERSAL_CORE_EVM = exports.UNIVERSAL_GATEWAY_PC = exports.CEA_FACTORY_EVM = exports.CEA_EVM = exports.SVM_GATEWAY_IDL = exports.ERC20_EVM = exports.UNIVERSAL_GATEWAY_V1_SEND = exports.UNIVERSAL_GATEWAY_V0 = exports.UEA_SVM = exports.UEA_EVM = exports.FACTORY_V1 = exports.FEE_LOCKER_SVM = exports.FEE_LOCKER_EVM = void 0;
3
+ exports.UNIVERSAL_CALLBACK_EVM = exports.UNIV3_SWAP_ROUTER_EVM = exports.WPC_EVM = exports.VAULT_PC20_FACTORY_EVM = exports.EXTERNAL_GATEWAY_PC20_EVM = exports.PC20_WRAPPER_EVM = exports.PC20_FACTORY_EVM = exports.UEA_FACTORY_ABI = exports.UNIVERSAL_CORE_EVM = exports.UNIVERSAL_GATEWAY_PC = exports.CEA_FACTORY_EVM = exports.CEA_EVM = exports.SVM_GATEWAY_IDL = exports.ERC20_EVM = exports.UNIVERSAL_GATEWAY_V1_SEND = exports.UNIVERSAL_GATEWAY_V0 = exports.UEA_SVM = exports.UEA_EVM = exports.FACTORY_V1 = exports.FEE_LOCKER_SVM = exports.FEE_LOCKER_EVM = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  var feeLocker_evm_1 = require("./feeLocker.evm");
6
6
  Object.defineProperty(exports, "FEE_LOCKER_EVM", { enumerable: true, get: function () { return feeLocker_evm_1.FEE_LOCKER_EVM; } });
@@ -42,4 +42,7 @@ var wpc_evm_1 = require("./wpc.evm");
42
42
  Object.defineProperty(exports, "WPC_EVM", { enumerable: true, get: function () { return wpc_evm_1.WPC_EVM; } });
43
43
  var uniswap_v3_router_evm_1 = require("./uniswap-v3-router.evm");
44
44
  Object.defineProperty(exports, "UNIV3_SWAP_ROUTER_EVM", { enumerable: true, get: function () { return uniswap_v3_router_evm_1.UNIV3_SWAP_ROUTER_EVM; } });
45
+ // Read state (cross-chain reads)
46
+ var universalCallback_evm_1 = require("./universalCallback.evm");
47
+ Object.defineProperty(exports, "UNIVERSAL_CALLBACK_EVM", { enumerable: true, get: function () { return universalCallback_evm_1.UNIVERSAL_CALLBACK_EVM; } });
45
48
  //# sourceMappingURL=index.js.map
@@ -430,4 +430,36 @@ export declare const UNIVERSAL_CORE_EVM: readonly [{
430
430
  readonly type: "error";
431
431
  readonly name: "NonDigitCharacter";
432
432
  readonly inputs: readonly [];
433
+ }, {
434
+ readonly type: "function";
435
+ readonly name: "chainHeightByChainNamespace";
436
+ readonly inputs: readonly [{
437
+ readonly name: "chainNamespace";
438
+ readonly type: "string";
439
+ readonly internalType: "string";
440
+ }];
441
+ readonly outputs: readonly [{
442
+ readonly name: "";
443
+ readonly type: "uint256";
444
+ readonly internalType: "uint256";
445
+ }];
446
+ readonly stateMutability: "view";
447
+ }, {
448
+ readonly type: "function";
449
+ readonly name: "readBaseFeeByChainNamespace";
450
+ readonly inputs: readonly [{
451
+ readonly name: "chainNamespace";
452
+ readonly type: "string";
453
+ readonly internalType: "string";
454
+ }, {
455
+ readonly name: "chainId";
456
+ readonly type: "string";
457
+ readonly internalType: "string";
458
+ }];
459
+ readonly outputs: readonly [{
460
+ readonly name: "";
461
+ readonly type: "uint256";
462
+ readonly internalType: "uint256";
463
+ }];
464
+ readonly stateMutability: "view";
433
465
  }];
@@ -217,5 +217,25 @@ exports.UNIVERSAL_CORE_EVM = [
217
217
  { type: 'error', name: 'TransferFailed', inputs: [] },
218
218
  { type: 'error', name: 'EmptyString', inputs: [] },
219
219
  { type: 'error', name: 'NonDigitCharacter', inputs: [] },
220
+ // ---- read state (verified against UniversalCore @ 0x…C0 on Donut, 2026-09-09) ----
221
+ {
222
+ type: 'function',
223
+ name: 'chainHeightByChainNamespace',
224
+ // NOTE: despite the parameter name, the oracle keys this by the FULL CAIP-2 id
225
+ // ("eip155:11155111"), not the bare namespace. The SDK always passes CAIP-2.
226
+ inputs: [{ name: 'chainNamespace', type: 'string', internalType: 'string' }],
227
+ outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
228
+ stateMutability: 'view',
229
+ },
230
+ {
231
+ type: 'function',
232
+ name: 'readBaseFeeByChainNamespace',
233
+ inputs: [
234
+ { name: 'chainNamespace', type: 'string', internalType: 'string' },
235
+ { name: 'chainId', type: 'string', internalType: 'string' },
236
+ ],
237
+ outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
238
+ stateMutability: 'view',
239
+ },
220
240
  ];
221
241
  //# sourceMappingURL=prc20.evm.js.map
@@ -27,4 +27,35 @@ export declare const UEA_FACTORY_ABI: readonly [{
27
27
  readonly internalType: "address";
28
28
  }];
29
29
  readonly stateMutability: "view";
30
+ }, {
31
+ readonly type: "function";
32
+ readonly name: "getOriginForUEA";
33
+ readonly inputs: readonly [{
34
+ readonly name: "addr";
35
+ readonly type: "address";
36
+ readonly internalType: "address";
37
+ }];
38
+ readonly outputs: readonly [{
39
+ readonly name: "account";
40
+ readonly type: "tuple";
41
+ readonly internalType: "struct UniversalAccountId";
42
+ readonly components: readonly [{
43
+ readonly name: "chainNamespace";
44
+ readonly type: "string";
45
+ readonly internalType: "string";
46
+ }, {
47
+ readonly name: "chainId";
48
+ readonly type: "string";
49
+ readonly internalType: "string";
50
+ }, {
51
+ readonly name: "owner";
52
+ readonly type: "bytes";
53
+ readonly internalType: "bytes";
54
+ }];
55
+ }, {
56
+ readonly name: "isUEA";
57
+ readonly type: "bool";
58
+ readonly internalType: "bool";
59
+ }];
60
+ readonly stateMutability: "view";
30
61
  }];
@@ -21,5 +21,24 @@ exports.UEA_FACTORY_ABI = [
21
21
  outputs: [{ name: '', type: 'address', internalType: 'address' }],
22
22
  stateMutability: 'view',
23
23
  },
24
+ {
25
+ type: 'function',
26
+ name: 'getOriginForUEA',
27
+ inputs: [{ name: 'addr', type: 'address', internalType: 'address' }],
28
+ outputs: [
29
+ {
30
+ name: 'account',
31
+ type: 'tuple',
32
+ internalType: 'struct UniversalAccountId',
33
+ components: [
34
+ { name: 'chainNamespace', type: 'string', internalType: 'string' },
35
+ { name: 'chainId', type: 'string', internalType: 'string' },
36
+ { name: 'owner', type: 'bytes', internalType: 'bytes' },
37
+ ],
38
+ },
39
+ { name: 'isUEA', type: 'bool', internalType: 'bool' },
40
+ ],
41
+ stateMutability: 'view',
42
+ },
24
43
  ];
25
44
  //# sourceMappingURL=uea-factory.js.map