@keetanetwork/anchor 0.0.6 → 0.0.7
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/lib/resolver.d.ts +26 -6
- package/lib/resolver.d.ts.map +1 -1
- package/lib/resolver.js +88 -4
- package/lib/resolver.js.map +1 -1
- package/npm-shrinkwrap.json +5 -5
- package/package.json +2 -2
package/lib/resolver.d.ts
CHANGED
|
@@ -238,25 +238,27 @@ type ValuizableObject = {
|
|
|
238
238
|
[key: string]: ValuizableMethod | undefined;
|
|
239
239
|
};
|
|
240
240
|
type ValuizableKind = 'any' | 'object' | 'array' | 'primitive' | 'string' | 'number' | 'boolean';
|
|
241
|
-
interface
|
|
241
|
+
interface ValuizableMethodBase {
|
|
242
|
+
(expect?: ValuizableKind): Promise<ValuizeInput>;
|
|
243
|
+
(expect: 'any'): Promise<ValuizeInput>;
|
|
244
|
+
}
|
|
245
|
+
interface ValuizableMethod extends ValuizableMethodBase {
|
|
242
246
|
(expect: 'object'): Promise<ValuizableObject>;
|
|
243
247
|
(expect: 'array'): Promise<ValuizableArray>;
|
|
244
248
|
(expect: 'primitive'): Promise<JSONSerializablePrimitive>;
|
|
245
249
|
(expect: 'string'): Promise<string>;
|
|
246
250
|
(expect: 'number'): Promise<number>;
|
|
247
251
|
(expect: 'boolean'): Promise<boolean>;
|
|
248
|
-
(expect: 'any'): Promise<ValuizeInput>;
|
|
249
|
-
(expect?: ValuizableKind): Promise<ValuizeInput>;
|
|
250
252
|
}
|
|
251
|
-
interface ToValuizableExpectString {
|
|
253
|
+
interface ToValuizableExpectString extends ValuizableMethodBase {
|
|
252
254
|
(expect: 'string'): Promise<string>;
|
|
253
255
|
(expect: 'primitive'): Promise<JSONSerializablePrimitive>;
|
|
254
256
|
}
|
|
255
|
-
interface ToValuizableExpectNumber {
|
|
257
|
+
interface ToValuizableExpectNumber extends ValuizableMethodBase {
|
|
256
258
|
(expect: 'number'): Promise<number>;
|
|
257
259
|
(expect: 'primitive'): Promise<JSONSerializablePrimitive>;
|
|
258
260
|
}
|
|
259
|
-
interface ToValuizableExpectBoolean {
|
|
261
|
+
interface ToValuizableExpectBoolean extends ValuizableMethodBase {
|
|
260
262
|
(expect: 'boolean'): Promise<boolean>;
|
|
261
263
|
(expect: 'primitive'): Promise<JSONSerializablePrimitive>;
|
|
262
264
|
}
|
|
@@ -272,6 +274,7 @@ type ToJSONValuizableObject<T extends object> = {
|
|
|
272
274
|
type ToJSONValuizable<T> = ToJSONValuizableObject<{
|
|
273
275
|
tmp: T;
|
|
274
276
|
}>['tmp'];
|
|
277
|
+
type ValuizeResolvable = JSONSerializablePrimitive | ValuizableObject | ValuizableArray | ValuizableMethod;
|
|
275
278
|
/**
|
|
276
279
|
* A cache object
|
|
277
280
|
*/
|
|
@@ -344,7 +347,23 @@ declare class Metadata implements ValuizableInstance {
|
|
|
344
347
|
* Assert that the supplied value is a valid Metadata Root Object
|
|
345
348
|
*/
|
|
346
349
|
static assertMetadata(value: unknown): asserts value is ToJSONValuizable<ServiceMetadata>;
|
|
350
|
+
/**
|
|
351
|
+
* Check if the supplied value is a Valuizable method which can
|
|
352
|
+
* be called to resolve a Valuizable value.
|
|
353
|
+
*/
|
|
347
354
|
static isValuizable(value: unknown): value is ValuizableMethod;
|
|
355
|
+
/**
|
|
356
|
+
* Recursively resolve a Valuizable value into a fully
|
|
357
|
+
* realized JSONSerializable value. This will walk the
|
|
358
|
+
* entire structure, calling each Valuizable method
|
|
359
|
+
* and replacing it with the returned value.
|
|
360
|
+
*
|
|
361
|
+
* This should only be used in cases where the entire
|
|
362
|
+
* structure needs to be fully realized, as it
|
|
363
|
+
* can be quite expensive.
|
|
364
|
+
*/
|
|
365
|
+
static fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;
|
|
366
|
+
static fullyResolveValuizable(value: any, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;
|
|
348
367
|
constructor(url: string | URL, config: MetadataConfig);
|
|
349
368
|
/**
|
|
350
369
|
* @param metadata Metadata to parse -- base64 encoded string or ArrayBuffer
|
|
@@ -391,6 +410,7 @@ declare class Resolver {
|
|
|
391
410
|
private lookupBankingServices;
|
|
392
411
|
private lookupKYCServices;
|
|
393
412
|
private lookupFXServices;
|
|
413
|
+
getRootMetadata(): Promise<ToValuizable<ServiceMetadata>>;
|
|
394
414
|
listTokens(): Promise<{
|
|
395
415
|
token: KeetaNetAccountTokenPublicKeyString;
|
|
396
416
|
currency: CurrencySearchCanonical;
|
package/lib/resolver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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"}
|
package/lib/resolver.js
CHANGED
|
@@ -3833,10 +3833,17 @@ class Metadata {
|
|
|
3833
3833
|
static assertMetadata(value) {
|
|
3834
3834
|
assertServiceMetadata(value);
|
|
3835
3835
|
}
|
|
3836
|
+
/**
|
|
3837
|
+
* Check if the supplied value is a Valuizable method which can
|
|
3838
|
+
* be called to resolve a Valuizable value.
|
|
3839
|
+
*/
|
|
3836
3840
|
static isValuizable(value) {
|
|
3837
3841
|
if (typeof value === 'object' && value !== null) {
|
|
3838
3842
|
return (false);
|
|
3839
3843
|
}
|
|
3844
|
+
if (typeof value !== 'function') {
|
|
3845
|
+
return (false);
|
|
3846
|
+
}
|
|
3840
3847
|
// @ts-ignore
|
|
3841
3848
|
if (!('instanceTypeID' in value)) {
|
|
3842
3849
|
return (false);
|
|
@@ -3849,6 +3856,74 @@ class Metadata {
|
|
|
3849
3856
|
}
|
|
3850
3857
|
return (false);
|
|
3851
3858
|
}
|
|
3859
|
+
static async fullyResolveValuizable(value, invalidReplacement = null) {
|
|
3860
|
+
if (typeof value === 'object' && value !== null) {
|
|
3861
|
+
if (Array.isArray(value)) {
|
|
3862
|
+
const newArray = [];
|
|
3863
|
+
for (let i = 0; i < value.length; i++) {
|
|
3864
|
+
const entry = value[i];
|
|
3865
|
+
if (Metadata.isValuizable(entry)) {
|
|
3866
|
+
const newEntry = await Metadata.fullyResolveValuizable(entry);
|
|
3867
|
+
newArray.push(newEntry);
|
|
3868
|
+
}
|
|
3869
|
+
else if (entry === undefined) {
|
|
3870
|
+
throw (new Error(`Array entry ${i} is undefined, which is not valid in JSON`));
|
|
3871
|
+
}
|
|
3872
|
+
else {
|
|
3873
|
+
assertNever(entry);
|
|
3874
|
+
}
|
|
3875
|
+
}
|
|
3876
|
+
return (newArray);
|
|
3877
|
+
}
|
|
3878
|
+
else {
|
|
3879
|
+
const newObject = {};
|
|
3880
|
+
for (const key in value) {
|
|
3881
|
+
/*
|
|
3882
|
+
* Since `key` is the index of the array or
|
|
3883
|
+
* object, it is safe to use it to index
|
|
3884
|
+
* into the array or object.
|
|
3885
|
+
*/
|
|
3886
|
+
// @ts-ignore
|
|
3887
|
+
const entry = value[key];
|
|
3888
|
+
if (Metadata.isValuizable(entry)) {
|
|
3889
|
+
const newEntry = await Metadata.fullyResolveValuizable(entry);
|
|
3890
|
+
newObject[key] = newEntry;
|
|
3891
|
+
}
|
|
3892
|
+
else if (entry === undefined) {
|
|
3893
|
+
throw (new Error(`Object key "${key}" is undefined, which is not valid in JSON`));
|
|
3894
|
+
}
|
|
3895
|
+
else {
|
|
3896
|
+
assertNever(entry);
|
|
3897
|
+
}
|
|
3898
|
+
}
|
|
3899
|
+
return (newObject);
|
|
3900
|
+
}
|
|
3901
|
+
}
|
|
3902
|
+
if (Metadata.isValuizable(value)) {
|
|
3903
|
+
try {
|
|
3904
|
+
const retval = await value('any');
|
|
3905
|
+
return (await Metadata.fullyResolveValuizable(retval));
|
|
3906
|
+
}
|
|
3907
|
+
catch {
|
|
3908
|
+
return (invalidReplacement);
|
|
3909
|
+
}
|
|
3910
|
+
}
|
|
3911
|
+
switch (typeof value) {
|
|
3912
|
+
case 'string':
|
|
3913
|
+
case 'number':
|
|
3914
|
+
case 'boolean':
|
|
3915
|
+
return (value);
|
|
3916
|
+
case 'object':
|
|
3917
|
+
if (value === null) {
|
|
3918
|
+
return (value);
|
|
3919
|
+
}
|
|
3920
|
+
assertNever(value);
|
|
3921
|
+
break;
|
|
3922
|
+
default:
|
|
3923
|
+
assertNever(value);
|
|
3924
|
+
}
|
|
3925
|
+
throw (new Error('invalid input'));
|
|
3926
|
+
}
|
|
3852
3927
|
constructor(url, config) {
|
|
3853
3928
|
/*
|
|
3854
3929
|
* Define an "instanceTypeID" as an unenumerable property to
|
|
@@ -3964,7 +4039,7 @@ class Metadata {
|
|
|
3964
4039
|
* URL twice, then we have a circular reference.
|
|
3965
4040
|
*/
|
|
3966
4041
|
if (this.seenURLs.has(cacheKey)) {
|
|
3967
|
-
return (
|
|
4042
|
+
return (null);
|
|
3968
4043
|
}
|
|
3969
4044
|
this.seenURLs.add(cacheKey);
|
|
3970
4045
|
/*
|
|
@@ -4089,6 +4164,9 @@ class Metadata {
|
|
|
4089
4164
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
4090
4165
|
const keyValue = value[key];
|
|
4091
4166
|
if (isExternalURL(keyValue)) {
|
|
4167
|
+
if (Array.isArray(newValue)) {
|
|
4168
|
+
throw (new Error('internal error: newValue is an array, but it should be an object since it is an external field, which can only be an object'));
|
|
4169
|
+
}
|
|
4092
4170
|
const newMetadataObject = new Metadata(keyValue.url, {
|
|
4093
4171
|
trustedCAs: this.#trustedCAs,
|
|
4094
4172
|
client: this.#client,
|
|
@@ -4098,9 +4176,10 @@ class Metadata {
|
|
|
4098
4176
|
parent: this
|
|
4099
4177
|
});
|
|
4100
4178
|
const newValuizableObject = newMetadataObject.value.bind(newMetadataObject);
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4179
|
+
Object.defineProperty(newValuizableObject, 'instanceTypeID', {
|
|
4180
|
+
value: 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd',
|
|
4181
|
+
enumerable: false
|
|
4182
|
+
});
|
|
4104
4183
|
newValue[key] = newValuizableObject;
|
|
4105
4184
|
}
|
|
4106
4185
|
else {
|
|
@@ -4419,6 +4498,11 @@ class Resolver {
|
|
|
4419
4498
|
}
|
|
4420
4499
|
return (rootMetadata);
|
|
4421
4500
|
}
|
|
4501
|
+
async getRootMetadata() {
|
|
4502
|
+
const rootMetadata = await this.#getRootMetadata();
|
|
4503
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
4504
|
+
return rootMetadata;
|
|
4505
|
+
}
|
|
4422
4506
|
async listTokens() {
|
|
4423
4507
|
const rootMetadata = await this.#getRootMetadata();
|
|
4424
4508
|
/*
|
package/lib/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","sourcesContent":["import * as KeetaNetClient from '@keetanetwork/keetanet-client';\nimport * as CurrencyInfo from '@keetanetwork/currency-info';\nimport type { Logger } from './log/index.ts';\nimport type { JSONSerializable } from './utils/json.ts';\nimport { assertNever } from './utils/never.js';\nimport { Buffer } from './utils/buffer.js';\nimport crypto from './utils/crypto.js';\n\nimport { createIs, createAssert } from 'typia';\n\ntype ExternalURL = { external: '2b828e33-2692-46e9-817e-9b93d63f28fd'; url: string; };\n\ntype KeetaNetAccount = InstanceType<typeof KeetaNetClient.lib.Account>;\nconst KeetaNetAccount: typeof KeetaNetClient.lib.Account = KeetaNetClient.lib.Account;\ntype KeetaNetAccountTokenPublicKeyString = ReturnType<InstanceType<typeof KeetaNetClient.lib.Account<typeof KeetaNetAccount.AccountKeyAlgorithm.TOKEN>>['publicKeyString']['get']>;\n\n/**\n * Canonical form of a currency code for use in the ServiceMetadata\n * Which is either the ISO currency code (e.g. \"USD\", \"EUR\", \"JPY\")\n * or a cryptocurrency code prefixed with a dollar sign (e.g. \"$BTC\", \"$ETH\")\n */\ntype ServiceMetadataCurrencyCodeCanonical = CurrencyInfo.ISOCurrencyCode | `$${string}`;\n/**\n * Input types which can be used to search for which token represents\n * a given currency or cryptocurrency.\n */\ntype CurrencySearchInput = ServiceMetadataCurrencyCodeCanonical | CurrencyInfo.ISOCurrencyNumber | CurrencyInfo.Currency;\ntype CurrencySearchCanonical = ServiceMetadataCurrencyCodeCanonical;\ntype CountrySearchInput = CurrencyInfo.ISOCountryCode | CurrencyInfo.ISOCountryNumber | CurrencyInfo.Country;\ntype CountrySearchCanonical = CurrencyInfo.ISOCountryCode; /* XXX:TODO */\n\nconst isCurrencySearchCanonical = createIs<CurrencySearchCanonical>();\n\n// #region Global Service Metadata\n/**\n * Service Metadata General Structure\n */\ntype ServiceMetadata = {\n\tversion: number;\n\t/**\n\t * Map of the currency code to the token public key which\n\t * represents that currency.\n\t */\n\tcurrencyMap: {\n\t\t[currencyCode in ServiceMetadataCurrencyCodeCanonical]?: KeetaNetAccountTokenPublicKeyString;\n\t};\n\tservices: {\n\t\tbanking?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\tcreateAccount?: string;\n\t\t\t\t};\n\t\t\t\tcurrencyCodes: string[];\n\t\t\t\tcountryCodes: string[];\n\t\t\t\tkycProviders?: string[];\n\t\t\t};\n\t\t};\n\t\tkyc?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Check if the KYC provider can\n\t\t\t\t\t * service a more specific locality\n\t\t\t\t\t * (optional)\n\t\t\t\t\t */\n\t\t\t\t\tcheckLocality?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Request an estimate for a KYC\n\t\t\t\t\t * verification (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Begin the KYC verification process\n\t\t\t\t\t * with this KYC provider\n\t\t\t\t\t */\n\t\t\t\t\tcreateVerification?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the certificate for the\n\t\t\t\t\t * KYC verification\n\t\t\t\t\t */\n\t\t\t\t\tgetCertificates?: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Country codes which this KYC provider can\n\t\t\t\t * validate accounts in. If this is not\n\t\t\t\t * specified, then the KYC provider can\n\t\t\t\t * validate accounts in any country.\n\t\t\t\t */\n\t\t\t\tcountryCodes?: string[];\n\t\t\t\t/**\n\t\t\t\t * The Certificate Authority (CA) Certificate\n\t\t\t\t * that this KYC provider uses to sign KYC\n\t\t\t\t * certificates. This is used to identify the\n\t\t\t\t * KYC provider.\n\t\t\t\t */\n\t\t\t\tca: string;\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t * Foreign Exchange (FX) services\n\t\t *\n\t\t * This is used to identify service providers which\n\t\t * can convert currency from one currency to another.\n\t\t */\n\t\tfx?: {\n\t\t\t/**\n\t\t\t * Provider ID which identifies the FX provider\n\t\t\t */\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Get an estimate for a currency\n\t\t\t\t\t * conversion (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get a quote for a currency\n\t\t\t\t\t * conversion\n\t\t\t\t\t */\n\t\t\t\t\tgetQuote: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Create an exchange to convert\n\t\t\t\t\t * currency\n\t\t\t\t\t */\n\t\t\t\t\tcreateExchange: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the status of an exchange\n\t\t\t\t\t * which was previously created\n\t\t\t\t\t */\n\t\t\t\t\tgetExchangeStatus: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Path for which can be used to identify which\n\t\t\t\t * currencies this FX provider can convert\n\t\t\t\t * between.\n\t\t\t\t */\n\t\t\t\tfrom: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency code which this FX provider can\n\t\t\t\t\t * convert from\n\t\t\t\t\t */\n\t\t\t\t\tcurrencyCodes: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency codes which this FX provider can\n\t\t\t\t\t * convert to from the `from.currencyCode`\n\t\t\t\t\t */\n\t\t\t\t\tto: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * KYC providers which this FX provider\n\t\t\t\t\t * supports (DN) -- if not specified,\n\t\t\t\t\t * then it does not require KYC.\n\t\t\t\t\t */\n\t\t\t\t\tkycProviders?: string[];\n\t\t\t\t}[];\n\t\t\t}\n\t\t};\n\t\tinbound?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t\toutbound?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t\tcards?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype ServiceMetadataExternalizable = ToJSONValuizable<ServiceMetadata>;\n\n/**\n * Types of services which can be resolved\n */\ntype Services = keyof ServiceMetadata['services'];\n\n/**\n * Search criteria for each service type\n */\ntype ServiceSearchCriteria<T extends Services> = {\n\t'banking': {\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ALL of the following currencies.\n\t\t */\n\t\tcurrencyCodes?: CurrencySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ANY of the following countries.\n\t\t */\n\t\tcountryCodes?: CountrySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts verified by ANY of the following KYC providers\n\t\t * (DN).\n\t\t */\n\t\tkycProviders?: string[]; /* XXX:TODO */\n\t};\n\t'fx': {\n\t\t/**\n\t\t * Search for a provider which can convert from the following\n\t\t * input currency\n\t\t */\n\t\tinputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which can convert to the following\n\t\t * output currency\n\t\t */\n\t\toutputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which supports ANY of the following\n\t\t * KYC providers\n\t\t */\n\t\tkycProviders?: string[];\n\t};\n\t'kyc': {\n\t\t/**\n\t\t * Search for a KYC provider which can verify accounts in ALL\n\t\t * of the following countries.\n\t\t */\n\t\tcountryCodes: CountrySearchInput[];\n\t};\n\t'inbound': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n\t'outbound': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n\t'cards': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n}[T];\n\ntype ResolverLookupServiceResults<Service extends Services> = { [id: string]: ToValuizableObject<NonNullable<ServiceMetadata['services'][Service]>[string]> };\n\ntype ServicesMetadataLookupMap = {\n\t[Service in Services]: {\n\t\tcriteria: ServiceSearchCriteria<Service>;\n\t\tresults: ResolverLookupServiceResults<Service>;\n\t};\n};\n\nfunction assertValidCountryCodes(input: unknown): asserts input is { countryCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\tthrow(new Error('Expected \"countryCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.countryCodes !== 'function' && !Array.isArray(input.countryCodes)) {\n\t\tthrow(new Error(`Expected \"countryCodes\" to be an array | function, got ${typeof input.countryCodes}`));\n\t}\n\n\tif (Array.isArray(input.countryCodes)) {\n\t\tfor (const countryCode of input.countryCodes) {\n\t\t\tif (typeof countryCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"countryCodes\" to be an array of strings, got ${typeof countryCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOptionalCountryCodes(input: unknown): asserts input is { countryCodes?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\treturn;\n\t}\n\n\tassertValidCountryCodes(input);\n}\n\nfunction assertValidCurrencyCodes(input: unknown): asserts input is { currencyCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['currencyCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('currencyCodes' in input)) {\n\t\tthrow(new Error('Expected \"currencyCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.currencyCodes !== 'function' && !Array.isArray(input.currencyCodes)) {\n\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array | function, got ${typeof input.currencyCodes}`));\n\t}\n\n\tif (Array.isArray(input.currencyCodes)) {\n\t\tfor (const currencyCode of input.currencyCodes) {\n\t\t\tif (typeof currencyCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array of strings, got ${typeof currencyCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsBanking(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['operations'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('operations' in input)) {\n\t\tthrow(new Error('Expected \"operations\" key in KYC service, but it was not found'));\n\t}\n\n\tif ((typeof input.operations !== 'object' || input.operations === null) && typeof input.operations !== 'function') {\n\t\tthrow(new Error(`Expected \"operations\" to be an object | function, got ${typeof input.operations}`));\n\t}\n\n\tif (typeof input.operations !== 'function') {\n\t\tfor (const [operation, operationValue] of Object.entries(input.operations)) {\n\t\t\tif (typeof operation !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations\" to be an object with string keys, got ${typeof operation}`));\n\t\t\t}\n\n\t\t\tif (typeof operationValue !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations.${operation}\" to be a string, got ${typeof operationValue}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsKYC(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOperationsFX(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['fx']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOptionalKYCProviders(input: unknown): asserts input is { kycProviders?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['kycProviders'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif ('kycProviders' in input) {\n\t\tif (typeof input.kycProviders !== 'function' && !Array.isArray(input.kycProviders)) {\n\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array | function, got ${typeof input.kycProviders}`));\n\t\t}\n\n\t\tif (Array.isArray(input.kycProviders)) {\n\t\t\tfor (const kycProvider of input.kycProviders) {\n\t\t\t\tif (typeof kycProvider !== 'string') {\n\t\t\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array of strings, got ${typeof kycProvider}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidCA(input: unknown): asserts input is { ca: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['ca'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('ca' in input)) {\n\t\tthrow(new Error('Expected \"ca\" key in KYC service, but it was not found'));\n\t}\n\n\tif (typeof input.ca !== 'string' && typeof input.ca !== 'function') {\n\t\tthrow(new Error(`Expected \"ca\" to be a string | function, got ${typeof input.ca}`));\n\t}\n}\n\nconst assertResolverLookupBankingResult = function(input: unknown): ResolverLookupServiceResults<'banking'>[string] {\n\tassertValidOperationsBanking(input);\n\tassertValidCountryCodes(input);\n\tassertValidCurrencyCodes(input);\n\tassertValidOptionalKYCProviders(input);\n\n\treturn(input);\n\n};\nconst assertResolverLookupKYCResult = function(input: unknown): ResolverLookupServiceResults<'kyc'>[string] {\n\tassertValidOperationsKYC(input);\n\tassertValidOptionalCountryCodes(input);\n\tassertValidCA(input);\n\n\treturn(input);\n};\n\nconst assertResolverLookupFXResult = async function(input: unknown): Promise<ResolverLookupServiceResults<'fx'>[string]> {\n\tassertValidOperationsFX(input);\n\n\tif (!('from' in input)) {\n\t\tthrow(new Error('Expected \"from\" key in FX service, but it was not found'));\n\t}\n\n\tconst fromUnrealized = input.from;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(fromUnrealized)) {\n\t\tthrow(new Error(`Expected \"from\" to be an Valuizable, got ${typeof fromUnrealized}`));\n\t}\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\tawait fromUnrealized('array');\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\t// @ts-ignore\n\treturn(input);\n};\n\n// #endregion\n\n// #region Validation\n\nasync function isValidOperations(input: unknown): Promise<{ operations: ValuizableMethod } | false> {\n\tif (typeof input !== 'object' || input === null) {\n\t\treturn(false);\n\t}\n\n\tif (!('operations' in input)) {\n\t\treturn(false);\n\t}\n\n\tconst operations = input.operations;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(operations)) {\n\t\treturn(false);\n\t}\n\n\treturn({\n\t\t...input,\n\t\toperations\n\t});\n}\n\nfunction convertToCurrencySearchCanonical(input: CurrencySearchInput): CurrencySearchCanonical {\n\tif (CurrencyInfo.Currency.isCurrencyCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Currency.isISOCurrencyNumber(input)) {\n\t\tinput = new CurrencyInfo.Currency(input);\n\t\treturn(input.code);\n\t} else if (typeof input === 'string') {\n\t\treturn(input);\n\t} else if (input === null) {\n\t\tthrow(new Error('Invalid currency input: null'));\n\t} else if ('code' in input) {\n\t\treturn(input.code);\n\t} else {\n\t\tthrow(new Error(`Invalid currency input: ${input}`));\n\t}\n}\n\nasync function hasAllCurrencyCodes(input: unknown, criteria: { currencyCodes: CurrencySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCurrencyCodes(input);\n\n\tconst currencyCodes = await input.currencyCodes?.('array') ?? [];\n\tconst inputCurrencyCodes = await Promise.all(currencyCodes.map(async function(item) {\n\t\treturn(await item?.('primitive'));\n\t}));\n\n\tfor (const checkCurrencyCode of criteria.currencyCodes) {\n\t\tconst checkCurrencyCodeCanonical = convertToCurrencySearchCanonical(checkCurrencyCode);\n\t\tif (!inputCurrencyCodes.includes(checkCurrencyCodeCanonical)) {\n\t\t\treturn(false);\n\t\t}\n\t}\n\n\treturn(true);\n}\n\nasync function hasAnyCountryCodes(input: unknown, criteria: { countryCodes: CountrySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCountryCodes(input);\n\n\tconst countryCodes = await input.countryCodes?.('array') ?? [];\n\n\tfor (const countryCode of countryCodes) {\n\t\tconst countryCodeValue = await countryCode?.('primitive');\n\t\tif (countryCodeValue === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\tif (criteria.countryCodes.includes(countryCodeValue as any)) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\n\treturn(false);\n}\n\n// #endregion\n\nfunction convertToCountrySearchCanonical(input: CountrySearchInput): CountrySearchCanonical {\n\tif (CurrencyInfo.Country.isCountryCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Country.isISOCountryNumber(input)) {\n\t\tinput = new CurrencyInfo.Country(input);\n\t}\n\n\treturn(input.code);\n}\n\n/**\n * Check if a value is an ExternalURL\n */\nconst isExternalURL = createIs<ExternalURL>();\n\ntype JSONSerializablePrimitive = Exclude<JSONSerializable, object>;\ntype ValuizeInput = JSONSerializablePrimitive | ValuizableObject | ValuizableArray;\ntype ValuizableArray = (ValuizableMethod | undefined)[];\ntype ValuizableObject = { [key: string]: ValuizableMethod | undefined };\n\ntype ValuizableKind = 'any' | 'object' | 'array' | 'primitive' | 'string' | 'number' | 'boolean';\ninterface ValuizableMethod {\n\t(expect: 'object'): Promise<ValuizableObject>;\n\t(expect: 'array'): Promise<ValuizableArray>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n\t(expect: 'string'): Promise<string>;\n\t(expect: 'number'): Promise<number>;\n\t(expect: 'boolean'): Promise<boolean>;\n\t(expect: 'any'): Promise<ValuizeInput>;\n\t(expect?: ValuizableKind): Promise<ValuizeInput>;\n};\n\ninterface ToValuizableExpectString {\n\t(expect: 'string'): Promise<string>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n};\ninterface ToValuizableExpectNumber {\n\t(expect: 'number'): Promise<number>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n};\ninterface ToValuizableExpectBoolean {\n\t(expect: 'boolean'): Promise<boolean>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n};\n/* eslint-disable @stylistic/indent */\ntype ToValuizableObject<T extends object> = {\n\t[K in keyof T]:\n\t\tT[K] extends string ? ToValuizableExpectString :\n\t\tT[K] extends number ? ToValuizableExpectNumber :\n\t\tT[K] extends boolean ? ToValuizableExpectBoolean :\n\t\tT[K] extends JSONSerializablePrimitive ?\n\t\t\t(expect: 'primitive') => Promise<JSONSerializablePrimitive> :\n\t\tT[K] extends unknown[] ?\n\t\t\t(expect: 'array') => Promise<ToValuizableObject<T[K]>> :\n\t\tT[K] extends object ?\n\t\t\t(expect: 'object') => Promise<ToValuizableObject<T[K]>> :\n\t\tT[K] extends (infer U | undefined) ?\n\t\t\tToValuizable<U> | undefined :\n\t\tnever;\n};\ntype ToValuizable<T> = ToValuizableObject<{ tmp: T }>['tmp'];\n\ntype ToJSONValuizableObject<T extends object> = {\n\t[K in keyof T]: (\n\t\tT[K] extends object ?\n\t\t\tToJSONValuizableObject<T[K]> :\n\t\tT[K] extends (object | undefined) ?\n\t\t\tToJSONValuizableObject<NonNullable<T[K]>> | undefined :\n\t\tT[K]\n\t) | ExternalURL;\n};\ntype ToJSONValuizable<T> = ToJSONValuizableObject<{ tmp: T }>['tmp'];\n\n/*\n * Access token to share with the Metadata object to allow it to\n * access the mutable stats object.\n */\nconst statsAccessToken = Symbol('statsAccessToken');\n\n/**\n * A cache object\n */\ntype URLCacheObject = Map<string, {\n\tpass: true;\n\tvalue: JSONSerializable;\n\texpires: Date;\n} | {\n\tpass: false;\n\terror: unknown;\n\texpires: Date;\n}>;\n\n\ntype ResolverConfig = {\n\t/**\n\t * The \"root\" account to use as the basis for all lookups. It should\n\t * contain the authoritative information for resolving in its\n\t * Metadata.\n\t */\n\troot: KeetaNetAccount;\n\t/**\n\t * A KeetaNet Client to access the network using.\n\t */\n\tclient: KeetaNetClient.Client | KeetaNetClient.UserClient;\n\t/**\n\t * A list of trusted Certificate Authorities to use when connecting to\n\t * external HTTPS services.\n\t */\n\ttrustedCAs: string[]; /* XXX:TODO */\n\t/**\n\t * Logger to use for debugging\n\t */\n\tlogger?: Logger;\n\t/**\n\t * ID for this instance of the resolver\n\t */\n\tid?: string;\n\t/**\n\t * Caching Parameters\n\t */\n\tcache?: Omit<NonNullable<MetadataConfig['cache']>, 'instance'>;\n}\n\n\ntype MetadataConfig = {\n\ttrustedCAs: ResolverConfig['trustedCAs'];\n\tclient: KeetaNetClient.Client;\n\tlogger?: ResolverConfig['logger'];\n\tresolver: Resolver;\n\tcache?: {\n\t\tinstance: URLCacheObject;\n\t\tpositiveTTL?: number;\n\t\tnegativeTTL?: number;\n\t};\n\tparent?: Metadata;\n};\n\ntype ValuizableInstance = { value: ValuizableMethod };\n\nconst assertServiceMetadata = createAssert<ToJSONValuizable<ServiceMetadata>>();\n\nclass Metadata implements ValuizableInstance {\n\treadonly #cache: Required<NonNullable<MetadataConfig['cache']>>;\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #url: URL;\n\treadonly #resolver: Resolver;\n\treadonly #stats: ResolverStats;\n\tprivate readonly seenURLs: Set<string>;\n\n\tprivate static readonly instanceTypeID = 'Metadata:c85b3d67-9548-4042-9862-f6e6677690ac';\n\n\tstatic isInstance(value: unknown): value is Metadata {\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn(false);\n\t\t}\n\t\tif (!('instanceID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(value.instanceID === Metadata.instanceTypeID);\n\t}\n\n\t/**\n\t * Format the supplied Metadata as appropriate to be included\n\t * within the Metadata field of a KeetaNet acccount to serve\n\t * as the Metadata for the Resolver.\n\t */\n\tstatic formatMetadata(metadata: ToJSONValuizable<ServiceMetadata>): string;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures\n\tstatic formatMetadata(metadata: JSONSerializable): string;\n\tstatic formatMetadata(metadata: JSONSerializable | ToJSONValuizable<ServiceMetadata>): string {\n\t\tconst metadataBytes = Buffer.from(JSON.stringify(metadata), 'utf-8');\n\t\tconst metadataCompressed = KeetaNetClient.lib.Utils.Buffer.ZlibDeflate(KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(metadataBytes));\n\t\tconst metadataEncoded = Buffer.from(metadataCompressed).toString('base64');\n\n\t\treturn(metadataEncoded);\n\t}\n\n\t/**\n\t * Assert that the supplied value is a valid Metadata Root Object\n\t */\n\tstatic assertMetadata(value: unknown): asserts value is ToJSONValuizable<ServiceMetadata> {\n\t\tassertServiceMetadata(value);\n\t}\n\n\tstatic isValuizable(value: unknown): value is ValuizableMethod {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// @ts-ignore\n\t\tif (!('instanceTypeID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (value.instanceTypeID === Metadata.instanceTypeID) {\n\t\t\treturn(true);\n\t\t}\n\n\t\tif (value.instanceTypeID === 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd') {\n\t\t\treturn(true);\n\t\t}\n\n\t\treturn(false);\n\t}\n\n\tconstructor(url: string | URL, config: MetadataConfig) {\n\t\t/*\n\t\t * Define an \"instanceTypeID\" as an unenumerable property to\n\t\t * ensure that we can identify this object as an instance of\n\t\t * Metadata, but we do not need to serialize it.\n\t\t */\n\t\tObject.defineProperty(this, 'instanceTypeID', {\n\t\t\tvalue: Metadata.instanceTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t\tthis.#url = new URL(url);\n\t\tthis.#cache = {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tinstance: config.cache?.instance ?? new Map() satisfies URLCacheObject as URLCacheObject,\n\t\t\tpositiveTTL: config.cache?.positiveTTL ?? 60 * 1000,\n\t\t\tnegativeTTL: config.cache?.negativeTTL ?? 5 * 1000\n\t\t};\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#client = config.client;\n\t\tthis.#logger = config.logger;\n\t\tthis.#resolver = config.resolver;\n\t\tthis.#stats = this.#resolver._mutableStats(statsAccessToken);\n\t\tif (config.parent !== undefined) {\n\t\t\tthis.seenURLs = config.parent.seenURLs;\n\t\t} else {\n\t\t\tthis.seenURLs = new Set();\n\t\t}\n\t}\n\n\t/**\n\t * @param metadata Metadata to parse -- base64 encoded string or ArrayBuffer\n\t */\n\tprivate async parseMetadata(metadata: string | ArrayBuffer): Promise<JSONSerializable> {\n\t\tif (typeof metadata === 'string') {\n\t\t\tmetadata = KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(Buffer.from(metadata, 'base64'));\n\t\t}\n\n\t\t/*\n\t\t * Attempt to decompress the metadata. If it fails, then\n\t\t * assume it is not compressed.\n\t\t */\n\t\tlet metadataUncompressed: ArrayBuffer;\n\t\ttry {\n\t\t\tmetadataUncompressed = KeetaNetClient.lib.Utils.Buffer.ZlibInflate(metadata);\n\t\t} catch {\n\t\t\tmetadataUncompressed = metadata;\n\t\t}\n\n\t\tconst metadataBytes = Buffer.from(metadataUncompressed);\n\t\tconst metadataDecoded = metadataBytes.toString('utf-8');\n\n\t\t/*\n\t\t * JSON.parse() will always return a JSONSerializable,\n\t\t * and not `unknown`, so we can safely cast it.\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst retval = await this.resolveValue(JSON.parse(metadataDecoded) as JSONSerializable);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readKeetaNetURL(url: URL): Promise<JSONSerializable> {\n\t\tconst accountString = url.hostname;\n\t\tconst path = url.pathname;\n\n\t\tthis.#stats.keetanet.reads++;\n\n\t\tif (path !== '/metadata') {\n\t\t\tthrow(new Error(`Unsupported path: ${path}`));\n\t\t}\n\n\t\tlet account: KeetaNetAccount | string;\n\t\ttry {\n\t\t\taccount = KeetaNetClient.lib.Account.fromPublicKeyString(accountString);\n\t\t} catch {\n\t\t\treturn('');\n\t\t}\n\n\t\tconst accountInfo = await this.#client.getAccountInfo(account);\n\t\tconst metadata = accountInfo.info.metadata;\n\t\tif (metadata === '') {\n\t\t\treturn('');\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Account info for', accountString, '=', accountInfo.info);\n\t\tconst retval = await this.parseMetadata(metadata);\n\t\treturn(retval);\n\t}\n\n\tprivate async readHTTPSURL(url: URL): Promise<JSONSerializable> {\n\t\tthis.#stats.https.reads++;\n\n\t\tconst results = await fetch(url.toString(), {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Accept': 'application/json'\n\t\t\t}\n\t\t});\n\n\t\tif (!results.ok) {\n\t\t\tthrow(new Error(`Error HTTP status ${results.status} ${results.statusText} for ${url.toString()}`));\n\t\t}\n\n\t\tif (results.status === 204) {\n\t\t\t/*\n\t\t\t * 204 No Content is a valid response, so we return an empty\n\t\t\t * object.\n\t\t\t */\n\t\t\treturn({});\n\t\t}\n\n\t\tif (results.status !== 200) {\n\t\t\tthrow(new Error(`Unexpected HTTP status ${results.status} for ${url.toString()}`));\n\t\t}\n\n\t\tconst metadata = await (await results.blob()).arrayBuffer();\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', metadata);\n\n\t\tconst retval = await this.parseMetadata(metadata);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readURL(url: URL) {\n\t\tthis.#stats.reads++;\n\n\t\tconst cacheKey = url.toString();\n\t\t/*\n\t\t * To ensure any circular references are handled correctly, we\n\t\t * keep track of a chain of accessed URLs. If we see the same\n\t\t * URL twice, then we have a circular reference.\n\t\t */\n\t\tif (this.seenURLs.has(cacheKey)) {\n\t\t\treturn('');\n\t\t}\n\t\tthis.seenURLs.add(cacheKey);\n\n\t\t/*\n\t\t * Verify that the cache entry is still valid. If it is not,\n\t\t * then remove it from the cache.\n\t\t */\n\t\tlet cacheVal = this.#cache.instance.get(cacheKey);\n\n\t\tif (this.#cache.instance.has(cacheKey) && cacheVal !== undefined) {\n\t\t\tif (cacheVal.expires < new Date()) {\n\t\t\t\tthis.#cache.instance.delete(cacheKey);\n\t\t\t\tcacheVal = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif (cacheVal !== undefined) {\n\t\t\tthis.#stats.cache.hit++;\n\n\t\t\tif (cacheVal.pass) {\n\t\t\t\treturn(cacheVal.value);\n\t\t\t} else {\n\t\t\t\tthrow(cacheVal.error);\n\t\t\t}\n\t\t}\n\n\t\tthis.#stats.cache.miss++;\n\n\t\tlet retval: JSONSerializable;\n\t\ttry {\n\t\t\tconst protocol = url.protocol;\n\t\t\tif (protocol === 'keetanet:') {\n\t\t\t\tretval = await this.readKeetaNetURL(url);\n\t\t\t} else if (protocol === 'https:') {\n\t\t\t\tretval = await this.readHTTPSURL(url);\n\t\t\t} else {\n\t\t\t\tthis.#stats.unsupported.reads++;\n\t\t\t\tthrow(new Error(`Unsupported protocol: ${protocol}`));\n\t\t\t}\n\t\t} catch (readError) {\n\t\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\t\tpass: false,\n\t\t\t\terror: readError,\n\t\t\t\texpires: new Date(Date.now() + this.#cache.negativeTTL)\n\t\t\t});\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), 'failed:', readError);\n\t\t\tthrow(readError);\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', retval);\n\n\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\tpass: true,\n\t\t\tvalue: retval,\n\t\t\texpires: new Date(Date.now() + this.#cache.positiveTTL)\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tprivate async resolveValue<T extends ExternalURL | undefined>(value: T): Promise<JSONSerializable>;\n\tprivate async resolveValue<T extends JSONSerializable | undefined>(value: T): Promise<T>;\n\tprivate async resolveValue<T extends JSONSerializable | ExternalURL | undefined>(value: T): Promise<T | JSONSerializable> {\n\t\tif (value === undefined) {\n\t\t\treturn(value);\n\t\t}\n\n\t\t/*\n\t\t * If the value passed in is a reference to an external URL, then\n\t\t * we need to read that URL (and continue to resolve it).\n\t\t */\n\t\tif (isExternalURL(value)) {\n\t\t\tconst url = new URL(value.url);\n\t\t\tconst retval = await this.readURL(url);\n\n\t\t\treturn(await this.resolveValue(retval));\n\t\t}\n\n\t\treturn(value);\n\t}\n\n\tprivate assertValuizableKind(input: ValuizeInput, expect: ValuizableKind) {\n\t\tswitch (expect) {\n\t\t\tcase 'any':\n\t\t\t\treturn(input);\n\t\t\tcase 'object':\n\t\t\t\tif (typeof input !== 'object') {\n\t\t\t\t\tthrow(new Error(`expected an object, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\tif (input === null) {\n\t\t\t\t\tthrow(new Error('expected an object, got null'));\n\t\t\t\t}\n\n\t\t\t\tif (Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error('expected an object, got an array'));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'array':\n\t\t\t\tif (!Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error(`expected an array, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'primitive':\n\t\t\t\tif ((typeof input === 'object' && input !== null) || input === undefined) {\n\t\t\t\t\tthrow(new Error(`expected a primitive, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\tif (typeof input !== expect) {\n\t\t\t\t\tthrow(new Error(`expected a ${expect}, got ${typeof input}`));\n\t\t\t\t}\n\t\t\t\treturn(input);\n\t\t\tdefault:\n\t\t\t\tassertNever(expect);\n\t\t}\n\t}\n\n\tprivate async valuize(value: JSONSerializable): Promise<ValuizeInput> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tlet newValue: ValuizableObject | ValuizableArray;\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tnewValue = [];\n\t\t\t} else {\n\t\t\t\tnewValue = {};\n\t\t\t}\n\t\t\tfor (const key in value) {\n\t\t\t\t/*\n\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t * into the array or object.\n\t\t\t\t */\n\t\t\t\t// @ts-ignore\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tconst keyValue: JSONSerializable = value[key];\n\n\t\t\t\tif (isExternalURL(keyValue)) {\n\t\t\t\t\tconst newMetadataObject = new Metadata(keyValue.url, {\n\t\t\t\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\t\t\t\tclient: this.#client,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tresolver: this.#resolver,\n\t\t\t\t\t\tcache: this.#cache,\n\t\t\t\t\t\tparent: this\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newValuizableObject: ValuizableMethod = newMetadataObject.value.bind(newMetadataObject);\n\n\t\t\t\t\tif (Array.isArray(newValue)) {\n\t\t\t\t\t\tthrow(new Error('internal error: newValue is an array, but it should be an object since it is an external field, which can only be an object'));\n\t\t\t\t\t}\n\t\t\t\t\tnewValue[key] = newValuizableObject;\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t * This is safe because `assertValuizableKind` will\n\t\t\t\t\t * ensure the correct output type\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst newValueEntry: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\t\t\t\tconst retval = this.assertValuizableKind(await this.valuize(keyValue), expect);\n\t\t\t\t\t\treturn(retval);\n\t\t\t\t\t};\n\n\t\t\t\t\tObject.defineProperty(newValueEntry, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd',\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TypeScript doesn't track that `key`\n\t\t\t\t\t * is a valid index regardless of the\n\t\t\t\t\t * type of `newValue` is an array or an\n\t\t\t\t\t * object, so we need to use `@ts-ignore`\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tnewValue[key] = newValueEntry;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(newValue);\n\t\t} else {\n\t\t\treturn(value);\n\t\t}\n\t}\n\n\tasync value(expect: 'object'): Promise<ValuizableObject>;\n\tasync value(expect: 'array'): Promise<ValuizableArray>;\n\tasync value(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n\tasync value(expect: 'string'): Promise<string>;\n\tasync value(expect: 'number'): Promise<number>;\n\tasync value(expect: 'boolean'): Promise<boolean>;\n\tasync value(expect: 'any'): Promise<ValuizeInput>;\n\tasync value(expect?: ValuizableKind): Promise<ValuizeInput>;\n\tasync value(expect: ValuizableKind = 'any'): Promise<ValuizeInput> {\n\t\tconst value = await this.readURL(this.#url);\n\n\t\tconst retval = this.assertValuizableKind(await this.valuize(value), expect);\n\n\t\treturn(retval);\n\t}\n}\n\n\ntype ResolverStats = {\n\tkeetanet: {\n\t\treads: number;\n\t};\n\thttps: {\n\t\treads: number;\n\t};\n\tunsupported: {\n\t\treads: number;\n\t};\n\treads: number;\n\tcache: {\n\t\thit: number;\n\t\tmiss: number;\n\t}\n};\n\nclass Resolver {\n\treadonly #root: ResolverConfig['root'];\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #stats: ResolverStats;\n\treadonly #metadataCache: NonNullable<MetadataConfig['cache']>;\n\n\treadonly id: string;\n\n\tstatic readonly Metadata: typeof Metadata = Metadata;\n\n\tprivate readonly lookupMap: {\n\t\t[Service in Services]: {\n\t\t\tsearch: (input: ValuizableObject | undefined, criteria: ServiceSearchCriteria<Service>) => Promise<ResolverLookupServiceResults<Service> | undefined>;\n\t\t};\n\t} = {\n\t\t'banking': {\n\t\t\tsearch: this.lookupBankingServices.bind(this)\n\t\t},\n\t\t'kyc': {\n\t\t\tsearch: this.lookupKYCServices.bind(this)\n\t\t},\n\t\t'fx': {\n\t\t\tsearch: this.lookupFXServices.bind(this)\n\t\t},\n\t\t'inbound': {\n\t\t\tsearch: async (_ignored_input: ValuizableObject | undefined, _ignored_criteria: ServiceSearchCriteria<'inbound'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t},\n\t\t'outbound': {\n\t\t\tsearch: async (_ignored_input: ValuizableObject | undefined, _ignored_criteria: ServiceSearchCriteria<'outbound'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t},\n\t\t'cards': {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tsearch: async (_input: ValuizableObject | undefined, _criteria: ServiceSearchCriteria<'cards'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t}\n\t};\n\n\n\tconstructor(config: ResolverConfig) {\n\t\tthis.#root = config.root;\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#logger = config.logger;\n\t\tthis.#metadataCache = {\n\t\t\t...config.cache,\n\t\t\tinstance: new Map()\n\t\t};\n\n\t\tthis.id = config.id ?? crypto.randomUUID();\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Creating resolver with root account', this.#root.publicKeyString.get());\n\n\t\tif (KeetaNetClient.Client.isInstance(config.client)) {\n\t\t\tthis.#client = config.client;\n\t\t} else {\n\t\t\tthis.#client = config.client.client;\n\t\t}\n\n\t\tthis.#stats = {\n\t\t\tkeetanet: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\thttps: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\tunsupported: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\treads: 0,\n\t\t\tcache: {\n\t\t\t\thit: 0,\n\t\t\t\tmiss: 0\n\t\t\t}\n\t\t};\n\t}\n\n\t/** @internal */\n\t_mutableStats(accessToken: symbol) {\n\t\tif (accessToken !== statsAccessToken) {\n\t\t\tthrow(new Error('Invalid access token'));\n\t\t}\n\n\t\treturn(this.#stats);\n\t}\n\n\tget stats(): ResolverStats {\n\t\treturn(structuredClone(this.#stats));\n\t}\n\n\tprivate async lookupBankingServices(bankingServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'banking'>) {\n\t\tif (bankingServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tlet canonicalCurrencyCriteria;\n\t\tif ('currencyCodes' in criteria) {\n\t\t\tcanonicalCurrencyCriteria = {\n\t\t\t\tcurrencyCodes: criteria.currencyCodes.map(convertToCurrencySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tlet canonicalCountryCriteria;\n\t\tif ('countryCodes' in criteria) {\n\t\t\tcanonicalCountryCriteria = {\n\t\t\t\tcountryCodes: criteria.countryCodes.map(convertToCountrySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'banking'> = {};\n\t\tfor (const checkBankingServiceID in bankingServices) {\n\t\t\ttry {\n\t\t\t\tconst checkBankingService = await isValidOperations(await bankingServices[checkBankingServiceID]?.('object'));\n\t\t\t\tif (!checkBankingService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCurrencyCriteria !== undefined && 'currencyCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAllCurrencyCodes(checkBankingService, canonicalCurrencyCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCountryCriteria !== undefined && 'countryCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAnyCountryCodes(checkBankingService, canonicalCountryCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkBankingServiceID] = assertResolverLookupBankingResult(checkBankingService);\n\t\t\t} catch (checkBankingServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking banking service', checkBankingServiceID, ':', checkBankingServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupKYCServices(kycServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'kyc'>) {\n\t\tif (kycServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'kyc'> = {};\n\t\tfor (const checkKYCServiceID in kycServices) {\n\t\t\ttry {\n\t\t\t\tconst checkKYCService = await kycServices[checkKYCServiceID]?.('object');\n\t\t\t\tif (checkKYCService === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!('operations' in checkKYCService)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (criteria.countryCodes !== undefined) {\n\t\t\t\t\tlet acceptable = true;\n\t\t\t\t\t/*\n\t\t\t\t\t * If the KYC service does not have a countryCodes\n\t\t\t\t\t * property, then it can validate accounts in any\n\t\t\t\t\t * country, so we skip this check.\n\t\t\t\t\t */\n\t\t\t\t\tif ('countryCodes' in checkKYCService) {\n\t\t\t\t\t\tconst countryCodes = await checkKYCService.countryCodes?.('array') ?? [];\n\t\t\t\t\t\tconst checkKYCServiceCountryCodes = await Promise.all(countryCodes.map(async function(item) {\n\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t}));\n\t\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Checking country codes:', criteria.countryCodes, 'against', checkKYCServiceCountryCodes, 'for', checkKYCServiceID);\n\n\t\t\t\t\t\tfor (const checkCountryCode of criteria.countryCodes) {\n\t\t\t\t\t\t\tconst checkCountryCodeCanonical = convertToCountrySearchCanonical(checkCountryCode);\n\t\t\t\t\t\t\tif (!checkKYCServiceCountryCodes.includes(checkCountryCodeCanonical)) {\n\t\t\t\t\t\t\t\tacceptable = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!acceptable) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkKYCServiceID] = assertResolverLookupKYCResult(checkKYCService);\n\t\t\t} catch (checkKYCServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking KYC service', checkKYCServiceID, ':', checkKYCServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupFXServices(fxServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'fx'>): Promise<ResolverLookupServiceResults<'fx'> | undefined> {\n\t\tif (fxServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst isCurrencySearchInput = createIs<CurrencySearchInput>();\n\t\t// if currency code is provided then convert to canonical format otherwise token public key string was provided\n\t\tconst canonicalInputCurrencyCriteria = isCurrencySearchInput(criteria.inputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.inputCurrencyCode) : criteria.inputCurrencyCode;\n\t\tconst canonicalOutputCurrencyCriteria = isCurrencySearchInput(criteria.outputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.outputCurrencyCode) : criteria.outputCurrencyCode;\n\t\t// if search criteria is not provided then set token to undefined\n\t\tconst inputToken = canonicalInputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalInputCurrencyCriteria) : undefined;\n\t\tconst outputToken = canonicalOutputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalOutputCurrencyCriteria) : undefined;\n\t\tif (criteria.inputCurrencyCode !== undefined && inputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Input currency code', canonicalInputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tif (criteria.outputCurrencyCode !== undefined && outputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Output currency code', canonicalOutputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'fx'> = {};\n\t\tfor (const checkFXServiceID in fxServices) {\n\t\t\ttry {\n\t\t\t\tconst checkFXService = await assertResolverLookupFXResult(await fxServices[checkFXServiceID]?.('object'));\n\t\t\t\tif (!checkFXService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst fromUnrealized: ToValuizable<NonNullable<ServiceMetadata['services']['fx']>[string]['from']> = checkFXService.from;\n\t\t\t\tconst from = await fromUnrealized?.('array');\n\t\t\t\tif (from === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet acceptable = false;\n\t\t\t\tfor (const fromEntryUnrealized of from) {\n\t\t\t\t\tconst fromEntry = await fromEntryUnrealized?.('object');\n\n\t\t\t\t\tif (inputToken) {\n\t\t\t\t\t\tconst fromCurrencyCodes = await fromEntry.currencyCodes?.('array') ?? [];\n\t\t\t\t\t\tconst fromCurrencyCodesValues = await Promise.all(fromCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If inputToken was provided, check if it matches providers supported input currencies\n\t\t\t\t\t\tif (!fromCurrencyCodesValues.includes(inputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (outputToken) {\n\t\t\t\t\t\tconst toCurrencyCodes = await fromEntry.to?.('array') ?? [];\n\t\t\t\t\t\tconst toCurrencyCodesValues = await Promise.all(toCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If outputToken was provided, check if it matches providers supported output currencies\n\t\t\t\t\t\tif (!toCurrencyCodesValues.includes(outputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* XXX:TODO: Check kycProviders */\n\t\t\t\t\tacceptable = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (!acceptable) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tretval[checkFXServiceID] = await assertResolverLookupFXResult(checkFXService);\n\t\t\t} catch (checkFXServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking FX service', checkFXServiceID, ':', checkFXServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync #getRootMetadata() {\n\t\tconst rootURL = new URL(`keetanet://${this.#root.publicKeyString.get()}/metadata`);\n\t\tconst metadata = new Metadata(rootURL, {\n\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\tclient: this.#client,\n\t\t\tlogger: this.#logger,\n\t\t\tresolver: this,\n\t\t\tcache: this.#metadataCache\n\t\t});\n\t\tconst rootMetadata = await metadata.value('object');\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Root Metadata:', rootMetadata);\n\n\t\tif (!('version' in rootMetadata)) {\n\t\t\tthrow(new Error('Root metadata is missing \"version\" property'));\n\t\t}\n\n\t\tconst rootMetadataVersion = await rootMetadata.version?.('primitive');\n\t\tif (rootMetadataVersion !== 1) {\n\t\t\tthrow(new Error(`Unsupported metadata version: ${rootMetadataVersion}`));\n\t\t}\n\n\t\treturn(rootMetadata);\n\t}\n\n\tasync listTokens(): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tconst retval: { token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[] = [];\n\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\tretval.push({\n\t\t\t\t\ttoken: checkTokenObject.publicKeyString.get(),\n\t\t\t\t\tcurrency: checkCurrencyCode\n\t\t\t\t});\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', checkCurrencyCode, 'is invalid:', validationError);\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync lookupToken(currencyCode: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; } | null> {\n\t\tlet tokenPublicKey: KeetaNetAccountTokenPublicKeyString | undefined;\n\t\tif (typeof currencyCode === 'string') {\n\t\t\ttry {\n\t\t\t\tconst token = KeetaNetAccount.fromPublicKeyString(currencyCode);\n\t\t\t\tif (token.isToken()) {\n\t\t\t\t\ttokenPublicKey = token.publicKeyString.get();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* Ignored */\n\t\t\t}\n\t\t}\n\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tlet currencyCodeFound: CurrencySearchCanonical | undefined;\n\t\tif (tokenPublicKey === undefined) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing forward lookup for currency code', currencyCode);\n\n\t\t\t/*\n\t\t\t * Perform a forward lookup from the currency code\n\t\t\t * to the token public key\n\t\t\t */\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\t\tconst currencyCodeCanonical = convertToCurrencySearchCanonical(currencyCode as unknown as any);\n\t\t\tif (currencyCodeCanonical === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst checkToken = await definedCurrenciesMap[currencyCodeCanonical]?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Validating token public key for currency code', currencyCodeCanonical, ':', checkToken, typeof checkToken);\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\ttokenPublicKey = checkTokenObject.publicKeyString.get();\n\t\t\t\tcurrencyCodeFound = currencyCodeCanonical;\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', currencyCodeCanonical, 'is invalid:', validationError);\n\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing reverse lookup for token public key', tokenPublicKey);\n\n\t\t\t/*\n\t\t\t * Perform a reverse lookup from the token public key\n\t\t\t * to the currency code\n\t\t\t */\n\t\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\t\tif (checkToken === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (checkToken === tokenPublicKey) {\n\t\t\t\t\tif (isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\t\t\tcurrencyCodeFound = checkCurrencyCode;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currencyCodeFound === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t}\n\n\t\treturn({\n\t\t\ttoken: tokenPublicKey,\n\t\t\tcurrency: currencyCodeFound\n\t\t});\n\t}\n\n\tasync lookup<T extends keyof ServicesMetadataLookupMap>(service: T, criteria: ServicesMetadataLookupMap[T]['criteria']): Promise<ServicesMetadataLookupMap[T]['results'] | undefined> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedServicesProperty = rootMetadata.services;\n\t\tif (definedServicesProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst definedServices = await definedServicesProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Looking up', service, 'with criteria:', criteria, 'in', definedServices);\n\n\t\tconst serviceLookup = this.lookupMap[service].search;\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\treturn(await serviceLookup(await definedServices[service]?.('object'), criteria as any));\n\t}\n\n\tclearCache(): void {\n\t\tthis.#metadataCache.instance.clear();\n\t\tthis.#stats.cache.hit = 0;\n\t\tthis.#stats.cache.miss = 0;\n\t\tthis.#stats.https.reads = 0;\n\t\tthis.#stats.keetanet.reads = 0;\n\t\tthis.#stats.unsupported.reads = 0;\n\t\tthis.#stats.reads = 0;\n\t}\n}\n\nexport default Resolver;\nexport type {\n\tServiceMetadata,\n\tServiceMetadataExternalizable,\n\tServiceSearchCriteria,\n\tServices\n};\n"]}
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","sourcesContent":["import * as KeetaNetClient from '@keetanetwork/keetanet-client';\nimport * as CurrencyInfo from '@keetanetwork/currency-info';\nimport type { Logger } from './log/index.ts';\nimport type { JSONSerializable } from './utils/json.ts';\nimport { assertNever } from './utils/never.js';\nimport { Buffer } from './utils/buffer.js';\nimport crypto from './utils/crypto.js';\n\nimport { createIs, createAssert } from 'typia';\n\ntype ExternalURL = { external: '2b828e33-2692-46e9-817e-9b93d63f28fd'; url: string; };\n\ntype KeetaNetAccount = InstanceType<typeof KeetaNetClient.lib.Account>;\nconst KeetaNetAccount: typeof KeetaNetClient.lib.Account = KeetaNetClient.lib.Account;\ntype KeetaNetAccountTokenPublicKeyString = ReturnType<InstanceType<typeof KeetaNetClient.lib.Account<typeof KeetaNetAccount.AccountKeyAlgorithm.TOKEN>>['publicKeyString']['get']>;\n\n/**\n * Canonical form of a currency code for use in the ServiceMetadata\n * Which is either the ISO currency code (e.g. \"USD\", \"EUR\", \"JPY\")\n * or a cryptocurrency code prefixed with a dollar sign (e.g. \"$BTC\", \"$ETH\")\n */\ntype ServiceMetadataCurrencyCodeCanonical = CurrencyInfo.ISOCurrencyCode | `$${string}`;\n/**\n * Input types which can be used to search for which token represents\n * a given currency or cryptocurrency.\n */\ntype CurrencySearchInput = ServiceMetadataCurrencyCodeCanonical | CurrencyInfo.ISOCurrencyNumber | CurrencyInfo.Currency;\ntype CurrencySearchCanonical = ServiceMetadataCurrencyCodeCanonical;\ntype CountrySearchInput = CurrencyInfo.ISOCountryCode | CurrencyInfo.ISOCountryNumber | CurrencyInfo.Country;\ntype CountrySearchCanonical = CurrencyInfo.ISOCountryCode; /* XXX:TODO */\n\nconst isCurrencySearchCanonical = createIs<CurrencySearchCanonical>();\n\n// #region Global Service Metadata\n/**\n * Service Metadata General Structure\n */\ntype ServiceMetadata = {\n\tversion: number;\n\t/**\n\t * Map of the currency code to the token public key which\n\t * represents that currency.\n\t */\n\tcurrencyMap: {\n\t\t[currencyCode in ServiceMetadataCurrencyCodeCanonical]?: KeetaNetAccountTokenPublicKeyString;\n\t};\n\tservices: {\n\t\tbanking?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\tcreateAccount?: string;\n\t\t\t\t};\n\t\t\t\tcurrencyCodes: string[];\n\t\t\t\tcountryCodes: string[];\n\t\t\t\tkycProviders?: string[];\n\t\t\t};\n\t\t};\n\t\tkyc?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Check if the KYC provider can\n\t\t\t\t\t * service a more specific locality\n\t\t\t\t\t * (optional)\n\t\t\t\t\t */\n\t\t\t\t\tcheckLocality?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Request an estimate for a KYC\n\t\t\t\t\t * verification (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Begin the KYC verification process\n\t\t\t\t\t * with this KYC provider\n\t\t\t\t\t */\n\t\t\t\t\tcreateVerification?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the certificate for the\n\t\t\t\t\t * KYC verification\n\t\t\t\t\t */\n\t\t\t\t\tgetCertificates?: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Country codes which this KYC provider can\n\t\t\t\t * validate accounts in. If this is not\n\t\t\t\t * specified, then the KYC provider can\n\t\t\t\t * validate accounts in any country.\n\t\t\t\t */\n\t\t\t\tcountryCodes?: string[];\n\t\t\t\t/**\n\t\t\t\t * The Certificate Authority (CA) Certificate\n\t\t\t\t * that this KYC provider uses to sign KYC\n\t\t\t\t * certificates. This is used to identify the\n\t\t\t\t * KYC provider.\n\t\t\t\t */\n\t\t\t\tca: string;\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t * Foreign Exchange (FX) services\n\t\t *\n\t\t * This is used to identify service providers which\n\t\t * can convert currency from one currency to another.\n\t\t */\n\t\tfx?: {\n\t\t\t/**\n\t\t\t * Provider ID which identifies the FX provider\n\t\t\t */\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Get an estimate for a currency\n\t\t\t\t\t * conversion (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get a quote for a currency\n\t\t\t\t\t * conversion\n\t\t\t\t\t */\n\t\t\t\t\tgetQuote: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Create an exchange to convert\n\t\t\t\t\t * currency\n\t\t\t\t\t */\n\t\t\t\t\tcreateExchange: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the status of an exchange\n\t\t\t\t\t * which was previously created\n\t\t\t\t\t */\n\t\t\t\t\tgetExchangeStatus: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Path for which can be used to identify which\n\t\t\t\t * currencies this FX provider can convert\n\t\t\t\t * between.\n\t\t\t\t */\n\t\t\t\tfrom: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency code which this FX provider can\n\t\t\t\t\t * convert from\n\t\t\t\t\t */\n\t\t\t\t\tcurrencyCodes: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency codes which this FX provider can\n\t\t\t\t\t * convert to from the `from.currencyCode`\n\t\t\t\t\t */\n\t\t\t\t\tto: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * KYC providers which this FX provider\n\t\t\t\t\t * supports (DN) -- if not specified,\n\t\t\t\t\t * then it does not require KYC.\n\t\t\t\t\t */\n\t\t\t\t\tkycProviders?: string[];\n\t\t\t\t}[];\n\t\t\t}\n\t\t};\n\t\tinbound?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t\toutbound?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t\tcards?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype ServiceMetadataExternalizable = ToJSONValuizable<ServiceMetadata>;\n\n/**\n * Types of services which can be resolved\n */\ntype Services = keyof ServiceMetadata['services'];\n\n/**\n * Search criteria for each service type\n */\ntype ServiceSearchCriteria<T extends Services> = {\n\t'banking': {\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ALL of the following currencies.\n\t\t */\n\t\tcurrencyCodes?: CurrencySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ANY of the following countries.\n\t\t */\n\t\tcountryCodes?: CountrySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts verified by ANY of the following KYC providers\n\t\t * (DN).\n\t\t */\n\t\tkycProviders?: string[]; /* XXX:TODO */\n\t};\n\t'fx': {\n\t\t/**\n\t\t * Search for a provider which can convert from the following\n\t\t * input currency\n\t\t */\n\t\tinputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which can convert to the following\n\t\t * output currency\n\t\t */\n\t\toutputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which supports ANY of the following\n\t\t * KYC providers\n\t\t */\n\t\tkycProviders?: string[];\n\t};\n\t'kyc': {\n\t\t/**\n\t\t * Search for a KYC provider which can verify accounts in ALL\n\t\t * of the following countries.\n\t\t */\n\t\tcountryCodes: CountrySearchInput[];\n\t};\n\t'inbound': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n\t'outbound': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n\t'cards': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n}[T];\n\ntype ResolverLookupServiceResults<Service extends Services> = { [id: string]: ToValuizableObject<NonNullable<ServiceMetadata['services'][Service]>[string]> };\n\ntype ServicesMetadataLookupMap = {\n\t[Service in Services]: {\n\t\tcriteria: ServiceSearchCriteria<Service>;\n\t\tresults: ResolverLookupServiceResults<Service>;\n\t};\n};\n\nfunction assertValidCountryCodes(input: unknown): asserts input is { countryCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\tthrow(new Error('Expected \"countryCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.countryCodes !== 'function' && !Array.isArray(input.countryCodes)) {\n\t\tthrow(new Error(`Expected \"countryCodes\" to be an array | function, got ${typeof input.countryCodes}`));\n\t}\n\n\tif (Array.isArray(input.countryCodes)) {\n\t\tfor (const countryCode of input.countryCodes) {\n\t\t\tif (typeof countryCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"countryCodes\" to be an array of strings, got ${typeof countryCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOptionalCountryCodes(input: unknown): asserts input is { countryCodes?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\treturn;\n\t}\n\n\tassertValidCountryCodes(input);\n}\n\nfunction assertValidCurrencyCodes(input: unknown): asserts input is { currencyCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['currencyCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('currencyCodes' in input)) {\n\t\tthrow(new Error('Expected \"currencyCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.currencyCodes !== 'function' && !Array.isArray(input.currencyCodes)) {\n\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array | function, got ${typeof input.currencyCodes}`));\n\t}\n\n\tif (Array.isArray(input.currencyCodes)) {\n\t\tfor (const currencyCode of input.currencyCodes) {\n\t\t\tif (typeof currencyCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array of strings, got ${typeof currencyCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsBanking(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['operations'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('operations' in input)) {\n\t\tthrow(new Error('Expected \"operations\" key in KYC service, but it was not found'));\n\t}\n\n\tif ((typeof input.operations !== 'object' || input.operations === null) && typeof input.operations !== 'function') {\n\t\tthrow(new Error(`Expected \"operations\" to be an object | function, got ${typeof input.operations}`));\n\t}\n\n\tif (typeof input.operations !== 'function') {\n\t\tfor (const [operation, operationValue] of Object.entries(input.operations)) {\n\t\t\tif (typeof operation !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations\" to be an object with string keys, got ${typeof operation}`));\n\t\t\t}\n\n\t\t\tif (typeof operationValue !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations.${operation}\" to be a string, got ${typeof operationValue}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsKYC(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOperationsFX(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['fx']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOptionalKYCProviders(input: unknown): asserts input is { kycProviders?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['kycProviders'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif ('kycProviders' in input) {\n\t\tif (typeof input.kycProviders !== 'function' && !Array.isArray(input.kycProviders)) {\n\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array | function, got ${typeof input.kycProviders}`));\n\t\t}\n\n\t\tif (Array.isArray(input.kycProviders)) {\n\t\t\tfor (const kycProvider of input.kycProviders) {\n\t\t\t\tif (typeof kycProvider !== 'string') {\n\t\t\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array of strings, got ${typeof kycProvider}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidCA(input: unknown): asserts input is { ca: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['ca'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('ca' in input)) {\n\t\tthrow(new Error('Expected \"ca\" key in KYC service, but it was not found'));\n\t}\n\n\tif (typeof input.ca !== 'string' && typeof input.ca !== 'function') {\n\t\tthrow(new Error(`Expected \"ca\" to be a string | function, got ${typeof input.ca}`));\n\t}\n}\n\nconst assertResolverLookupBankingResult = function(input: unknown): ResolverLookupServiceResults<'banking'>[string] {\n\tassertValidOperationsBanking(input);\n\tassertValidCountryCodes(input);\n\tassertValidCurrencyCodes(input);\n\tassertValidOptionalKYCProviders(input);\n\n\treturn(input);\n\n};\nconst assertResolverLookupKYCResult = function(input: unknown): ResolverLookupServiceResults<'kyc'>[string] {\n\tassertValidOperationsKYC(input);\n\tassertValidOptionalCountryCodes(input);\n\tassertValidCA(input);\n\n\treturn(input);\n};\n\nconst assertResolverLookupFXResult = async function(input: unknown): Promise<ResolverLookupServiceResults<'fx'>[string]> {\n\tassertValidOperationsFX(input);\n\n\tif (!('from' in input)) {\n\t\tthrow(new Error('Expected \"from\" key in FX service, but it was not found'));\n\t}\n\n\tconst fromUnrealized = input.from;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(fromUnrealized)) {\n\t\tthrow(new Error(`Expected \"from\" to be an Valuizable, got ${typeof fromUnrealized}`));\n\t}\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\tawait fromUnrealized('array');\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\t// @ts-ignore\n\treturn(input);\n};\n\n// #endregion\n\n// #region Validation\n\nasync function isValidOperations(input: unknown): Promise<{ operations: ValuizableMethod } | false> {\n\tif (typeof input !== 'object' || input === null) {\n\t\treturn(false);\n\t}\n\n\tif (!('operations' in input)) {\n\t\treturn(false);\n\t}\n\n\tconst operations = input.operations;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(operations)) {\n\t\treturn(false);\n\t}\n\n\treturn({\n\t\t...input,\n\t\toperations\n\t});\n}\n\nfunction convertToCurrencySearchCanonical(input: CurrencySearchInput): CurrencySearchCanonical {\n\tif (CurrencyInfo.Currency.isCurrencyCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Currency.isISOCurrencyNumber(input)) {\n\t\tinput = new CurrencyInfo.Currency(input);\n\t\treturn(input.code);\n\t} else if (typeof input === 'string') {\n\t\treturn(input);\n\t} else if (input === null) {\n\t\tthrow(new Error('Invalid currency input: null'));\n\t} else if ('code' in input) {\n\t\treturn(input.code);\n\t} else {\n\t\tthrow(new Error(`Invalid currency input: ${input}`));\n\t}\n}\n\nasync function hasAllCurrencyCodes(input: unknown, criteria: { currencyCodes: CurrencySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCurrencyCodes(input);\n\n\tconst currencyCodes = await input.currencyCodes?.('array') ?? [];\n\tconst inputCurrencyCodes = await Promise.all(currencyCodes.map(async function(item) {\n\t\treturn(await item?.('primitive'));\n\t}));\n\n\tfor (const checkCurrencyCode of criteria.currencyCodes) {\n\t\tconst checkCurrencyCodeCanonical = convertToCurrencySearchCanonical(checkCurrencyCode);\n\t\tif (!inputCurrencyCodes.includes(checkCurrencyCodeCanonical)) {\n\t\t\treturn(false);\n\t\t}\n\t}\n\n\treturn(true);\n}\n\nasync function hasAnyCountryCodes(input: unknown, criteria: { countryCodes: CountrySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCountryCodes(input);\n\n\tconst countryCodes = await input.countryCodes?.('array') ?? [];\n\n\tfor (const countryCode of countryCodes) {\n\t\tconst countryCodeValue = await countryCode?.('primitive');\n\t\tif (countryCodeValue === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\tif (criteria.countryCodes.includes(countryCodeValue as any)) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\n\treturn(false);\n}\n\n// #endregion\n\nfunction convertToCountrySearchCanonical(input: CountrySearchInput): CountrySearchCanonical {\n\tif (CurrencyInfo.Country.isCountryCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Country.isISOCountryNumber(input)) {\n\t\tinput = new CurrencyInfo.Country(input);\n\t}\n\n\treturn(input.code);\n}\n\n/**\n * Check if a value is an ExternalURL\n */\nconst isExternalURL = createIs<ExternalURL>();\n\ntype JSONSerializablePrimitive = Exclude<JSONSerializable, object>;\ntype ValuizeInput = JSONSerializablePrimitive | ValuizableObject | ValuizableArray;\ntype ValuizableArray = (ValuizableMethod | undefined)[];\ntype ValuizableObject = { [key: string]: ValuizableMethod | undefined };\n\ntype ValuizableKind = 'any' | 'object' | 'array' | 'primitive' | 'string' | 'number' | 'boolean';\n\ninterface ValuizableMethodBase {\n\t(expect?: ValuizableKind): Promise<ValuizeInput>;\n\t(expect: 'any'): Promise<ValuizeInput>;\n}\n\ninterface ValuizableMethod extends ValuizableMethodBase {\n\t(expect: 'object'): Promise<ValuizableObject>;\n\t(expect: 'array'): Promise<ValuizableArray>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n\t(expect: 'string'): Promise<string>;\n\t(expect: 'number'): Promise<number>;\n\t(expect: 'boolean'): Promise<boolean>;\n};\n\ninterface ToValuizableExpectString extends ValuizableMethodBase {\n\t(expect: 'string'): Promise<string>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n};\n\ninterface ToValuizableExpectNumber extends ValuizableMethodBase {\n\t(expect: 'number'): Promise<number>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n};\n\ninterface ToValuizableExpectBoolean extends ValuizableMethodBase {\n\t(expect: 'boolean'): Promise<boolean>;\n\t(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n};\n/* eslint-disable @stylistic/indent */\ntype ToValuizableObject<T extends object> = {\n\t[K in keyof T]:\n\t\tT[K] extends string ? ToValuizableExpectString :\n\t\tT[K] extends number ? ToValuizableExpectNumber :\n\t\tT[K] extends boolean ? ToValuizableExpectBoolean :\n\t\tT[K] extends JSONSerializablePrimitive ?\n\t\t\t(expect: 'primitive') => Promise<JSONSerializablePrimitive> :\n\t\tT[K] extends unknown[] ?\n\t\t\t(expect: 'array') => Promise<ToValuizableObject<T[K]>> :\n\t\tT[K] extends object ?\n\t\t\t(expect: 'object') => Promise<ToValuizableObject<T[K]>> :\n\t\tT[K] extends (infer U | undefined) ?\n\t\t\tToValuizable<U> | undefined :\n\t\tnever;\n};\ntype ToValuizable<T> = ToValuizableObject<{ tmp: T }>['tmp'];\n\ntype ToJSONValuizableObject<T extends object> = {\n\t[K in keyof T]: (\n\t\tT[K] extends object ?\n\t\t\tToJSONValuizableObject<T[K]> :\n\t\tT[K] extends (object | undefined) ?\n\t\t\tToJSONValuizableObject<NonNullable<T[K]>> | undefined :\n\t\tT[K]\n\t) | ExternalURL;\n};\ntype ToJSONValuizable<T> = ToJSONValuizableObject<{ tmp: T }>['tmp'];\n\ntype ValuizeResolvable = JSONSerializablePrimitive | ValuizableObject | ValuizableArray | ValuizableMethod;\n\n/*\n * Access token to share with the Metadata object to allow it to\n * access the mutable stats object.\n */\nconst statsAccessToken = Symbol('statsAccessToken');\n\n/**\n * A cache object\n */\ntype URLCacheObject = Map<string, {\n\tpass: true;\n\tvalue: JSONSerializable;\n\texpires: Date;\n} | {\n\tpass: false;\n\terror: unknown;\n\texpires: Date;\n}>;\n\n\ntype ResolverConfig = {\n\t/**\n\t * The \"root\" account to use as the basis for all lookups. It should\n\t * contain the authoritative information for resolving in its\n\t * Metadata.\n\t */\n\troot: KeetaNetAccount;\n\t/**\n\t * A KeetaNet Client to access the network using.\n\t */\n\tclient: KeetaNetClient.Client | KeetaNetClient.UserClient;\n\t/**\n\t * A list of trusted Certificate Authorities to use when connecting to\n\t * external HTTPS services.\n\t */\n\ttrustedCAs: string[]; /* XXX:TODO */\n\t/**\n\t * Logger to use for debugging\n\t */\n\tlogger?: Logger;\n\t/**\n\t * ID for this instance of the resolver\n\t */\n\tid?: string;\n\t/**\n\t * Caching Parameters\n\t */\n\tcache?: Omit<NonNullable<MetadataConfig['cache']>, 'instance'>;\n}\n\n\ntype MetadataConfig = {\n\ttrustedCAs: ResolverConfig['trustedCAs'];\n\tclient: KeetaNetClient.Client;\n\tlogger?: ResolverConfig['logger'];\n\tresolver: Resolver;\n\tcache?: {\n\t\tinstance: URLCacheObject;\n\t\tpositiveTTL?: number;\n\t\tnegativeTTL?: number;\n\t};\n\tparent?: Metadata;\n};\n\ntype ValuizableInstance = { value: ValuizableMethod };\n\nconst assertServiceMetadata = createAssert<ToJSONValuizable<ServiceMetadata>>();\n\nclass Metadata implements ValuizableInstance {\n\treadonly #cache: Required<NonNullable<MetadataConfig['cache']>>;\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #url: URL;\n\treadonly #resolver: Resolver;\n\treadonly #stats: ResolverStats;\n\tprivate readonly seenURLs: Set<string>;\n\n\tprivate static readonly instanceTypeID = 'Metadata:c85b3d67-9548-4042-9862-f6e6677690ac';\n\n\tstatic isInstance(value: unknown): value is Metadata {\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn(false);\n\t\t}\n\t\tif (!('instanceID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(value.instanceID === Metadata.instanceTypeID);\n\t}\n\n\t/**\n\t * Format the supplied Metadata as appropriate to be included\n\t * within the Metadata field of a KeetaNet acccount to serve\n\t * as the Metadata for the Resolver.\n\t */\n\tstatic formatMetadata(metadata: ToJSONValuizable<ServiceMetadata>): string;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures\n\tstatic formatMetadata(metadata: JSONSerializable): string;\n\tstatic formatMetadata(metadata: JSONSerializable | ToJSONValuizable<ServiceMetadata>): string {\n\t\tconst metadataBytes = Buffer.from(JSON.stringify(metadata), 'utf-8');\n\t\tconst metadataCompressed = KeetaNetClient.lib.Utils.Buffer.ZlibDeflate(KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(metadataBytes));\n\t\tconst metadataEncoded = Buffer.from(metadataCompressed).toString('base64');\n\n\t\treturn(metadataEncoded);\n\t}\n\n\t/**\n\t * Assert that the supplied value is a valid Metadata Root Object\n\t */\n\tstatic assertMetadata(value: unknown): asserts value is ToJSONValuizable<ServiceMetadata> {\n\t\tassertServiceMetadata(value);\n\t}\n\n\t/**\n\t * Check if the supplied value is a Valuizable method which can\n\t * be called to resolve a Valuizable value.\n\t */\n\tstatic isValuizable(value: unknown): value is ValuizableMethod {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (typeof value !== 'function') {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// @ts-ignore\n\t\tif (!('instanceTypeID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (value.instanceTypeID === Metadata.instanceTypeID) {\n\t\t\treturn(true);\n\t\t}\n\n\t\tif (value.instanceTypeID === 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd') {\n\t\t\treturn(true);\n\t\t}\n\n\t\treturn(false);\n\t}\n\n\t/**\n\t * Recursively resolve a Valuizable value into a fully\n\t * realized JSONSerializable value. This will walk the\n\t * entire structure, calling each Valuizable method\n\t * and replacing it with the returned value.\n\t *\n\t * This should only be used in cases where the entire\n\t * structure needs to be fully realized, as it\n\t * can be quite expensive.\n\t */\n\tstatic async fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures,@typescript-eslint/no-explicit-any\n\tstatic async fullyResolveValuizable(value: any, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;\n\tstatic async fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement: JSONSerializable = null): Promise<JSONSerializable> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tconst newArray: JSONSerializable[] = [];\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tconst entry = value[i];\n\t\t\t\t\tif (Metadata.isValuizable(entry)) {\n\t\t\t\t\t\tconst newEntry = await Metadata.fullyResolveValuizable(entry);\n\t\t\t\t\t\tnewArray.push(newEntry);\n\t\t\t\t\t} else if (entry === undefined) {\n\t\t\t\t\t\tthrow(new Error(`Array entry ${i} is undefined, which is not valid in JSON`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(newArray);\n\t\t\t} else {\n\t\t\t\tconst newObject: { [key: string]: JSONSerializable; } = {};\n\t\t\t\tfor (const key in value) {\n\t\t\t\t\t/*\n\t\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t\t * into the array or object.\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst entry = value[key];\n\t\t\t\t\tif (Metadata.isValuizable(entry)) {\n\t\t\t\t\t\tconst newEntry = await Metadata.fullyResolveValuizable(entry);\n\t\t\t\t\t\tnewObject[key] = newEntry;\n\t\t\t\t\t} else if (entry === undefined) {\n\t\t\t\t\t\tthrow(new Error(`Object key \"${key}\" is undefined, which is not valid in JSON`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(newObject);\n\t\t\t}\n\t\t}\n\n\t\tif (Metadata.isValuizable(value)) {\n\t\t\ttry {\n\t\t\t\tconst retval = await value('any');\n\t\t\t\treturn(await Metadata.fullyResolveValuizable(retval));\n\t\t\t} catch {\n\t\t\t\treturn(invalidReplacement);\n\t\t\t}\n\t\t}\n\n\t\tswitch (typeof value) {\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\treturn(value);\n\t\t\tcase 'object':\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn(value);\n\t\t\t\t}\n\t\t\t\tassertNever(value);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassertNever(value);\n\t\t}\n\n\t\tthrow(new Error('invalid input'));\n\t}\n\n\tconstructor(url: string | URL, config: MetadataConfig) {\n\t\t/*\n\t\t * Define an \"instanceTypeID\" as an unenumerable property to\n\t\t * ensure that we can identify this object as an instance of\n\t\t * Metadata, but we do not need to serialize it.\n\t\t */\n\t\tObject.defineProperty(this, 'instanceTypeID', {\n\t\t\tvalue: Metadata.instanceTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t\tthis.#url = new URL(url);\n\t\tthis.#cache = {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tinstance: config.cache?.instance ?? new Map() satisfies URLCacheObject as URLCacheObject,\n\t\t\tpositiveTTL: config.cache?.positiveTTL ?? 60 * 1000,\n\t\t\tnegativeTTL: config.cache?.negativeTTL ?? 5 * 1000\n\t\t};\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#client = config.client;\n\t\tthis.#logger = config.logger;\n\t\tthis.#resolver = config.resolver;\n\t\tthis.#stats = this.#resolver._mutableStats(statsAccessToken);\n\t\tif (config.parent !== undefined) {\n\t\t\tthis.seenURLs = config.parent.seenURLs;\n\t\t} else {\n\t\t\tthis.seenURLs = new Set();\n\t\t}\n\t}\n\n\t/**\n\t * @param metadata Metadata to parse -- base64 encoded string or ArrayBuffer\n\t */\n\tprivate async parseMetadata(metadata: string | ArrayBuffer): Promise<JSONSerializable> {\n\t\tif (typeof metadata === 'string') {\n\t\t\tmetadata = KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(Buffer.from(metadata, 'base64'));\n\t\t}\n\n\t\t/*\n\t\t * Attempt to decompress the metadata. If it fails, then\n\t\t * assume it is not compressed.\n\t\t */\n\t\tlet metadataUncompressed: ArrayBuffer;\n\t\ttry {\n\t\t\tmetadataUncompressed = KeetaNetClient.lib.Utils.Buffer.ZlibInflate(metadata);\n\t\t} catch {\n\t\t\tmetadataUncompressed = metadata;\n\t\t}\n\n\t\tconst metadataBytes = Buffer.from(metadataUncompressed);\n\t\tconst metadataDecoded = metadataBytes.toString('utf-8');\n\n\t\t/*\n\t\t * JSON.parse() will always return a JSONSerializable,\n\t\t * and not `unknown`, so we can safely cast it.\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst retval = await this.resolveValue(JSON.parse(metadataDecoded) as JSONSerializable);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readKeetaNetURL(url: URL): Promise<JSONSerializable> {\n\t\tconst accountString = url.hostname;\n\t\tconst path = url.pathname;\n\n\t\tthis.#stats.keetanet.reads++;\n\n\t\tif (path !== '/metadata') {\n\t\t\tthrow(new Error(`Unsupported path: ${path}`));\n\t\t}\n\n\t\tlet account: KeetaNetAccount | string;\n\t\ttry {\n\t\t\taccount = KeetaNetClient.lib.Account.fromPublicKeyString(accountString);\n\t\t} catch {\n\t\t\treturn('');\n\t\t}\n\n\t\tconst accountInfo = await this.#client.getAccountInfo(account);\n\t\tconst metadata = accountInfo.info.metadata;\n\t\tif (metadata === '') {\n\t\t\treturn('');\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Account info for', accountString, '=', accountInfo.info);\n\t\tconst retval = await this.parseMetadata(metadata);\n\t\treturn(retval);\n\t}\n\n\tprivate async readHTTPSURL(url: URL): Promise<JSONSerializable> {\n\t\tthis.#stats.https.reads++;\n\n\t\tconst results = await fetch(url.toString(), {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Accept': 'application/json'\n\t\t\t}\n\t\t});\n\n\t\tif (!results.ok) {\n\t\t\tthrow(new Error(`Error HTTP status ${results.status} ${results.statusText} for ${url.toString()}`));\n\t\t}\n\n\t\tif (results.status === 204) {\n\t\t\t/*\n\t\t\t * 204 No Content is a valid response, so we return an empty\n\t\t\t * object.\n\t\t\t */\n\t\t\treturn({});\n\t\t}\n\n\t\tif (results.status !== 200) {\n\t\t\tthrow(new Error(`Unexpected HTTP status ${results.status} for ${url.toString()}`));\n\t\t}\n\n\t\tconst metadata = await (await results.blob()).arrayBuffer();\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', metadata);\n\n\t\tconst retval = await this.parseMetadata(metadata);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readURL(url: URL) {\n\t\tthis.#stats.reads++;\n\n\t\tconst cacheKey = url.toString();\n\t\t/*\n\t\t * To ensure any circular references are handled correctly, we\n\t\t * keep track of a chain of accessed URLs. If we see the same\n\t\t * URL twice, then we have a circular reference.\n\t\t */\n\t\tif (this.seenURLs.has(cacheKey)) {\n\t\t\treturn(null);\n\t\t}\n\t\tthis.seenURLs.add(cacheKey);\n\n\t\t/*\n\t\t * Verify that the cache entry is still valid. If it is not,\n\t\t * then remove it from the cache.\n\t\t */\n\t\tlet cacheVal = this.#cache.instance.get(cacheKey);\n\n\t\tif (this.#cache.instance.has(cacheKey) && cacheVal !== undefined) {\n\t\t\tif (cacheVal.expires < new Date()) {\n\t\t\t\tthis.#cache.instance.delete(cacheKey);\n\t\t\t\tcacheVal = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif (cacheVal !== undefined) {\n\t\t\tthis.#stats.cache.hit++;\n\n\t\t\tif (cacheVal.pass) {\n\t\t\t\treturn(cacheVal.value);\n\t\t\t} else {\n\t\t\t\tthrow(cacheVal.error);\n\t\t\t}\n\t\t}\n\n\t\tthis.#stats.cache.miss++;\n\n\t\tlet retval: JSONSerializable;\n\t\ttry {\n\t\t\tconst protocol = url.protocol;\n\t\t\tif (protocol === 'keetanet:') {\n\t\t\t\tretval = await this.readKeetaNetURL(url);\n\t\t\t} else if (protocol === 'https:') {\n\t\t\t\tretval = await this.readHTTPSURL(url);\n\t\t\t} else {\n\t\t\t\tthis.#stats.unsupported.reads++;\n\t\t\t\tthrow(new Error(`Unsupported protocol: ${protocol}`));\n\t\t\t}\n\t\t} catch (readError) {\n\t\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\t\tpass: false,\n\t\t\t\terror: readError,\n\t\t\t\texpires: new Date(Date.now() + this.#cache.negativeTTL)\n\t\t\t});\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), 'failed:', readError);\n\t\t\tthrow(readError);\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', retval);\n\n\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\tpass: true,\n\t\t\tvalue: retval,\n\t\t\texpires: new Date(Date.now() + this.#cache.positiveTTL)\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tprivate async resolveValue<T extends ExternalURL | undefined>(value: T): Promise<JSONSerializable>;\n\tprivate async resolveValue<T extends JSONSerializable | undefined>(value: T): Promise<T>;\n\tprivate async resolveValue<T extends JSONSerializable | ExternalURL | undefined>(value: T): Promise<T | JSONSerializable> {\n\t\tif (value === undefined) {\n\t\t\treturn(value);\n\t\t}\n\n\t\t/*\n\t\t * If the value passed in is a reference to an external URL, then\n\t\t * we need to read that URL (and continue to resolve it).\n\t\t */\n\t\tif (isExternalURL(value)) {\n\t\t\tconst url = new URL(value.url);\n\t\t\tconst retval = await this.readURL(url);\n\n\t\t\treturn(await this.resolveValue(retval));\n\t\t}\n\n\t\treturn(value);\n\t}\n\n\tprivate assertValuizableKind(input: ValuizeInput, expect: ValuizableKind) {\n\t\tswitch (expect) {\n\t\t\tcase 'any':\n\t\t\t\treturn(input);\n\t\t\tcase 'object':\n\t\t\t\tif (typeof input !== 'object') {\n\t\t\t\t\tthrow(new Error(`expected an object, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\tif (input === null) {\n\t\t\t\t\tthrow(new Error('expected an object, got null'));\n\t\t\t\t}\n\n\t\t\t\tif (Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error('expected an object, got an array'));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'array':\n\t\t\t\tif (!Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error(`expected an array, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'primitive':\n\t\t\t\tif ((typeof input === 'object' && input !== null) || input === undefined) {\n\t\t\t\t\tthrow(new Error(`expected a primitive, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\tif (typeof input !== expect) {\n\t\t\t\t\tthrow(new Error(`expected a ${expect}, got ${typeof input}`));\n\t\t\t\t}\n\t\t\t\treturn(input);\n\t\t\tdefault:\n\t\t\t\tassertNever(expect);\n\t\t}\n\t}\n\n\tprivate async valuize(value: JSONSerializable): Promise<ValuizeInput> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tlet newValue: ValuizableObject | ValuizableArray;\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tnewValue = [];\n\t\t\t} else {\n\t\t\t\tnewValue = {};\n\t\t\t}\n\t\t\tfor (const key in value) {\n\t\t\t\t/*\n\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t * into the array or object.\n\t\t\t\t */\n\t\t\t\t// @ts-ignore\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tconst keyValue: JSONSerializable = value[key];\n\n\t\t\t\tif (isExternalURL(keyValue)) {\n\t\t\t\t\tif (Array.isArray(newValue)) {\n\t\t\t\t\t\tthrow(new Error('internal error: newValue is an array, but it should be an object since it is an external field, which can only be an object'));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newMetadataObject = new Metadata(keyValue.url, {\n\t\t\t\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\t\t\t\tclient: this.#client,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tresolver: this.#resolver,\n\t\t\t\t\t\tcache: this.#cache,\n\t\t\t\t\t\tparent: this\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newValuizableObject: ValuizableMethod = newMetadataObject.value.bind(newMetadataObject);\n\n\t\t\t\t\tObject.defineProperty(newValuizableObject, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd',\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\tnewValue[key] = newValuizableObject;\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t * This is safe because `assertValuizableKind` will\n\t\t\t\t\t * ensure the correct output type\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst newValueEntry: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\t\t\t\tconst retval = this.assertValuizableKind(await this.valuize(keyValue), expect);\n\t\t\t\t\t\treturn(retval);\n\t\t\t\t\t};\n\n\t\t\t\t\tObject.defineProperty(newValueEntry, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd',\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TypeScript doesn't track that `key`\n\t\t\t\t\t * is a valid index regardless of the\n\t\t\t\t\t * type of `newValue` is an array or an\n\t\t\t\t\t * object, so we need to use `@ts-ignore`\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tnewValue[key] = newValueEntry;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(newValue);\n\t\t} else {\n\t\t\treturn(value);\n\t\t}\n\t}\n\n\tasync value(expect: 'object'): Promise<ValuizableObject>;\n\tasync value(expect: 'array'): Promise<ValuizableArray>;\n\tasync value(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n\tasync value(expect: 'string'): Promise<string>;\n\tasync value(expect: 'number'): Promise<number>;\n\tasync value(expect: 'boolean'): Promise<boolean>;\n\tasync value(expect: 'any'): Promise<ValuizeInput>;\n\tasync value(expect?: ValuizableKind): Promise<ValuizeInput>;\n\tasync value(expect: ValuizableKind = 'any'): Promise<ValuizeInput> {\n\t\tconst value = await this.readURL(this.#url);\n\n\t\tconst retval = this.assertValuizableKind(await this.valuize(value), expect);\n\n\t\treturn(retval);\n\t}\n}\n\n\ntype ResolverStats = {\n\tkeetanet: {\n\t\treads: number;\n\t};\n\thttps: {\n\t\treads: number;\n\t};\n\tunsupported: {\n\t\treads: number;\n\t};\n\treads: number;\n\tcache: {\n\t\thit: number;\n\t\tmiss: number;\n\t}\n};\n\nclass Resolver {\n\treadonly #root: ResolverConfig['root'];\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #stats: ResolverStats;\n\treadonly #metadataCache: NonNullable<MetadataConfig['cache']>;\n\n\treadonly id: string;\n\n\tstatic readonly Metadata: typeof Metadata = Metadata;\n\n\tprivate readonly lookupMap: {\n\t\t[Service in Services]: {\n\t\t\tsearch: (input: ValuizableObject | undefined, criteria: ServiceSearchCriteria<Service>) => Promise<ResolverLookupServiceResults<Service> | undefined>;\n\t\t};\n\t} = {\n\t\t'banking': {\n\t\t\tsearch: this.lookupBankingServices.bind(this)\n\t\t},\n\t\t'kyc': {\n\t\t\tsearch: this.lookupKYCServices.bind(this)\n\t\t},\n\t\t'fx': {\n\t\t\tsearch: this.lookupFXServices.bind(this)\n\t\t},\n\t\t'inbound': {\n\t\t\tsearch: async (_ignored_input: ValuizableObject | undefined, _ignored_criteria: ServiceSearchCriteria<'inbound'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t},\n\t\t'outbound': {\n\t\t\tsearch: async (_ignored_input: ValuizableObject | undefined, _ignored_criteria: ServiceSearchCriteria<'outbound'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t},\n\t\t'cards': {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tsearch: async (_input: ValuizableObject | undefined, _criteria: ServiceSearchCriteria<'cards'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t}\n\t};\n\n\n\tconstructor(config: ResolverConfig) {\n\t\tthis.#root = config.root;\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#logger = config.logger;\n\t\tthis.#metadataCache = {\n\t\t\t...config.cache,\n\t\t\tinstance: new Map()\n\t\t};\n\n\t\tthis.id = config.id ?? crypto.randomUUID();\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Creating resolver with root account', this.#root.publicKeyString.get());\n\n\t\tif (KeetaNetClient.Client.isInstance(config.client)) {\n\t\t\tthis.#client = config.client;\n\t\t} else {\n\t\t\tthis.#client = config.client.client;\n\t\t}\n\n\t\tthis.#stats = {\n\t\t\tkeetanet: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\thttps: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\tunsupported: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\treads: 0,\n\t\t\tcache: {\n\t\t\t\thit: 0,\n\t\t\t\tmiss: 0\n\t\t\t}\n\t\t};\n\t}\n\n\t/** @internal */\n\t_mutableStats(accessToken: symbol) {\n\t\tif (accessToken !== statsAccessToken) {\n\t\t\tthrow(new Error('Invalid access token'));\n\t\t}\n\n\t\treturn(this.#stats);\n\t}\n\n\tget stats(): ResolverStats {\n\t\treturn(structuredClone(this.#stats));\n\t}\n\n\tprivate async lookupBankingServices(bankingServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'banking'>) {\n\t\tif (bankingServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tlet canonicalCurrencyCriteria;\n\t\tif ('currencyCodes' in criteria) {\n\t\t\tcanonicalCurrencyCriteria = {\n\t\t\t\tcurrencyCodes: criteria.currencyCodes.map(convertToCurrencySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tlet canonicalCountryCriteria;\n\t\tif ('countryCodes' in criteria) {\n\t\t\tcanonicalCountryCriteria = {\n\t\t\t\tcountryCodes: criteria.countryCodes.map(convertToCountrySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'banking'> = {};\n\t\tfor (const checkBankingServiceID in bankingServices) {\n\t\t\ttry {\n\t\t\t\tconst checkBankingService = await isValidOperations(await bankingServices[checkBankingServiceID]?.('object'));\n\t\t\t\tif (!checkBankingService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCurrencyCriteria !== undefined && 'currencyCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAllCurrencyCodes(checkBankingService, canonicalCurrencyCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCountryCriteria !== undefined && 'countryCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAnyCountryCodes(checkBankingService, canonicalCountryCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkBankingServiceID] = assertResolverLookupBankingResult(checkBankingService);\n\t\t\t} catch (checkBankingServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking banking service', checkBankingServiceID, ':', checkBankingServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupKYCServices(kycServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'kyc'>) {\n\t\tif (kycServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'kyc'> = {};\n\t\tfor (const checkKYCServiceID in kycServices) {\n\t\t\ttry {\n\t\t\t\tconst checkKYCService = await kycServices[checkKYCServiceID]?.('object');\n\t\t\t\tif (checkKYCService === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!('operations' in checkKYCService)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (criteria.countryCodes !== undefined) {\n\t\t\t\t\tlet acceptable = true;\n\t\t\t\t\t/*\n\t\t\t\t\t * If the KYC service does not have a countryCodes\n\t\t\t\t\t * property, then it can validate accounts in any\n\t\t\t\t\t * country, so we skip this check.\n\t\t\t\t\t */\n\t\t\t\t\tif ('countryCodes' in checkKYCService) {\n\t\t\t\t\t\tconst countryCodes = await checkKYCService.countryCodes?.('array') ?? [];\n\t\t\t\t\t\tconst checkKYCServiceCountryCodes = await Promise.all(countryCodes.map(async function(item) {\n\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t}));\n\t\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Checking country codes:', criteria.countryCodes, 'against', checkKYCServiceCountryCodes, 'for', checkKYCServiceID);\n\n\t\t\t\t\t\tfor (const checkCountryCode of criteria.countryCodes) {\n\t\t\t\t\t\t\tconst checkCountryCodeCanonical = convertToCountrySearchCanonical(checkCountryCode);\n\t\t\t\t\t\t\tif (!checkKYCServiceCountryCodes.includes(checkCountryCodeCanonical)) {\n\t\t\t\t\t\t\t\tacceptable = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!acceptable) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkKYCServiceID] = assertResolverLookupKYCResult(checkKYCService);\n\t\t\t} catch (checkKYCServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking KYC service', checkKYCServiceID, ':', checkKYCServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupFXServices(fxServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'fx'>): Promise<ResolverLookupServiceResults<'fx'> | undefined> {\n\t\tif (fxServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst isCurrencySearchInput = createIs<CurrencySearchInput>();\n\t\t// if currency code is provided then convert to canonical format otherwise token public key string was provided\n\t\tconst canonicalInputCurrencyCriteria = isCurrencySearchInput(criteria.inputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.inputCurrencyCode) : criteria.inputCurrencyCode;\n\t\tconst canonicalOutputCurrencyCriteria = isCurrencySearchInput(criteria.outputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.outputCurrencyCode) : criteria.outputCurrencyCode;\n\t\t// if search criteria is not provided then set token to undefined\n\t\tconst inputToken = canonicalInputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalInputCurrencyCriteria) : undefined;\n\t\tconst outputToken = canonicalOutputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalOutputCurrencyCriteria) : undefined;\n\t\tif (criteria.inputCurrencyCode !== undefined && inputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Input currency code', canonicalInputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tif (criteria.outputCurrencyCode !== undefined && outputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Output currency code', canonicalOutputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'fx'> = {};\n\t\tfor (const checkFXServiceID in fxServices) {\n\t\t\ttry {\n\t\t\t\tconst checkFXService = await assertResolverLookupFXResult(await fxServices[checkFXServiceID]?.('object'));\n\t\t\t\tif (!checkFXService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst fromUnrealized: ToValuizable<NonNullable<ServiceMetadata['services']['fx']>[string]['from']> = checkFXService.from;\n\t\t\t\tconst from = await fromUnrealized?.('array');\n\t\t\t\tif (from === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet acceptable = false;\n\t\t\t\tfor (const fromEntryUnrealized of from) {\n\t\t\t\t\tconst fromEntry = await fromEntryUnrealized?.('object');\n\n\t\t\t\t\tif (inputToken) {\n\t\t\t\t\t\tconst fromCurrencyCodes = await fromEntry.currencyCodes?.('array') ?? [];\n\t\t\t\t\t\tconst fromCurrencyCodesValues = await Promise.all(fromCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If inputToken was provided, check if it matches providers supported input currencies\n\t\t\t\t\t\tif (!fromCurrencyCodesValues.includes(inputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (outputToken) {\n\t\t\t\t\t\tconst toCurrencyCodes = await fromEntry.to?.('array') ?? [];\n\t\t\t\t\t\tconst toCurrencyCodesValues = await Promise.all(toCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If outputToken was provided, check if it matches providers supported output currencies\n\t\t\t\t\t\tif (!toCurrencyCodesValues.includes(outputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* XXX:TODO: Check kycProviders */\n\t\t\t\t\tacceptable = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (!acceptable) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tretval[checkFXServiceID] = await assertResolverLookupFXResult(checkFXService);\n\t\t\t} catch (checkFXServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking FX service', checkFXServiceID, ':', checkFXServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync #getRootMetadata() {\n\t\tconst rootURL = new URL(`keetanet://${this.#root.publicKeyString.get()}/metadata`);\n\t\tconst metadata = new Metadata(rootURL, {\n\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\tclient: this.#client,\n\t\t\tlogger: this.#logger,\n\t\t\tresolver: this,\n\t\t\tcache: this.#metadataCache\n\t\t});\n\t\tconst rootMetadata = await metadata.value('object');\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Root Metadata:', rootMetadata);\n\n\t\tif (!('version' in rootMetadata)) {\n\t\t\tthrow(new Error('Root metadata is missing \"version\" property'));\n\t\t}\n\n\t\tconst rootMetadataVersion = await rootMetadata.version?.('primitive');\n\t\tif (rootMetadataVersion !== 1) {\n\t\t\tthrow(new Error(`Unsupported metadata version: ${rootMetadataVersion}`));\n\t\t}\n\n\t\treturn(rootMetadata);\n\t}\n\n\tasync getRootMetadata(): Promise<ToValuizable<ServiceMetadata>> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn(rootMetadata as unknown as ToValuizable<ServiceMetadata>);\n\t}\n\n\tasync listTokens(): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tconst retval: { token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[] = [];\n\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\tretval.push({\n\t\t\t\t\ttoken: checkTokenObject.publicKeyString.get(),\n\t\t\t\t\tcurrency: checkCurrencyCode\n\t\t\t\t});\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', checkCurrencyCode, 'is invalid:', validationError);\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync lookupToken(currencyCode: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; } | null> {\n\t\tlet tokenPublicKey: KeetaNetAccountTokenPublicKeyString | undefined;\n\t\tif (typeof currencyCode === 'string') {\n\t\t\ttry {\n\t\t\t\tconst token = KeetaNetAccount.fromPublicKeyString(currencyCode);\n\t\t\t\tif (token.isToken()) {\n\t\t\t\t\ttokenPublicKey = token.publicKeyString.get();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* Ignored */\n\t\t\t}\n\t\t}\n\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tlet currencyCodeFound: CurrencySearchCanonical | undefined;\n\t\tif (tokenPublicKey === undefined) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing forward lookup for currency code', currencyCode);\n\n\t\t\t/*\n\t\t\t * Perform a forward lookup from the currency code\n\t\t\t * to the token public key\n\t\t\t */\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\t\tconst currencyCodeCanonical = convertToCurrencySearchCanonical(currencyCode as unknown as any);\n\t\t\tif (currencyCodeCanonical === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst checkToken = await definedCurrenciesMap[currencyCodeCanonical]?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Validating token public key for currency code', currencyCodeCanonical, ':', checkToken, typeof checkToken);\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\ttokenPublicKey = checkTokenObject.publicKeyString.get();\n\t\t\t\tcurrencyCodeFound = currencyCodeCanonical;\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', currencyCodeCanonical, 'is invalid:', validationError);\n\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing reverse lookup for token public key', tokenPublicKey);\n\n\t\t\t/*\n\t\t\t * Perform a reverse lookup from the token public key\n\t\t\t * to the currency code\n\t\t\t */\n\t\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\t\tif (checkToken === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (checkToken === tokenPublicKey) {\n\t\t\t\t\tif (isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\t\t\tcurrencyCodeFound = checkCurrencyCode;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currencyCodeFound === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t}\n\n\t\treturn({\n\t\t\ttoken: tokenPublicKey,\n\t\t\tcurrency: currencyCodeFound\n\t\t});\n\t}\n\n\tasync lookup<T extends keyof ServicesMetadataLookupMap>(service: T, criteria: ServicesMetadataLookupMap[T]['criteria']): Promise<ServicesMetadataLookupMap[T]['results'] | undefined> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedServicesProperty = rootMetadata.services;\n\t\tif (definedServicesProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst definedServices = await definedServicesProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Looking up', service, 'with criteria:', criteria, 'in', definedServices);\n\n\t\tconst serviceLookup = this.lookupMap[service].search;\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\treturn(await serviceLookup(await definedServices[service]?.('object'), criteria as any));\n\t}\n\n\tclearCache(): void {\n\t\tthis.#metadataCache.instance.clear();\n\t\tthis.#stats.cache.hit = 0;\n\t\tthis.#stats.cache.miss = 0;\n\t\tthis.#stats.https.reads = 0;\n\t\tthis.#stats.keetanet.reads = 0;\n\t\tthis.#stats.unsupported.reads = 0;\n\t\tthis.#stats.reads = 0;\n\t}\n}\n\nexport default Resolver;\nexport type {\n\tServiceMetadata,\n\tServiceMetadataExternalizable,\n\tServiceSearchCriteria,\n\tServices\n};\n"]}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keetanetwork/anchor",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@keetanetwork/anchor",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.7",
|
|
10
10
|
"license": "SEE LICENSE IN LICENSE",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@keetanetwork/currency-info": "1.2.5",
|
|
13
|
-
"@keetanetwork/keetanet-client": "0.14.
|
|
13
|
+
"@keetanetwork/keetanet-client": "0.14.5",
|
|
14
14
|
"decimal.js": "10.6.0",
|
|
15
15
|
"typia": "9.5.0"
|
|
16
16
|
},
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"license": "ISC"
|
|
34
34
|
},
|
|
35
35
|
"node_modules/@keetanetwork/keetanet-client": {
|
|
36
|
-
"version": "0.14.
|
|
37
|
-
"integrity": "sha512
|
|
36
|
+
"version": "0.14.5",
|
|
37
|
+
"integrity": "sha512-//6jEpbjSOEuL6Rt5cl0cPfBYsQ9k0oftwyD+GftucUx5HiXFN9dfnIOi//hu/PBZAShww8YguXPi9z6ysoiIw==",
|
|
38
38
|
"license": "see LICENSE",
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"secp256k1": "5.0.1"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keetanetwork/anchor",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "KeetaNetwork Network Anchor",
|
|
5
5
|
"main": "client/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"sideEffects": false,
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@keetanetwork/currency-info": "1.2.5",
|
|
26
|
-
"@keetanetwork/keetanet-client": "0.14.
|
|
26
|
+
"@keetanetwork/keetanet-client": "0.14.5",
|
|
27
27
|
"decimal.js": "10.6.0",
|
|
28
28
|
"typia": "9.5.0"
|
|
29
29
|
},
|