@keetanetwork/anchor 0.0.42 → 0.0.44
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/client/index.d.ts +6 -0
- package/client/index.d.ts.map +1 -1
- package/client/index.js +7 -0
- package/client/index.js.map +1 -1
- package/lib/certificates.js +2 -2
- package/lib/certificates.js.map +1 -1
- package/lib/resolver.d.ts +45 -3
- package/lib/resolver.d.ts.map +1 -1
- package/lib/resolver.js +908 -398
- package/lib/resolver.js.map +1 -1
- package/lib/utils/json.d.ts +4 -5
- package/lib/utils/json.d.ts.map +1 -1
- package/lib/utils/json.js +4 -163
- package/lib/utils/json.js.map +1 -1
- package/npm-shrinkwrap.json +5 -5
- package/package.json +2 -2
- package/services/asset-movement/client.d.ts +2 -5
- package/services/asset-movement/client.d.ts.map +1 -1
- package/services/asset-movement/client.js +1 -2
- package/services/asset-movement/client.js.map +1 -1
- package/services/asset-movement/common.d.ts +56 -82
- package/services/asset-movement/common.d.ts.map +1 -1
- package/services/asset-movement/common.js +18314 -8000
- package/services/asset-movement/common.js.map +1 -1
- package/services/asset-movement/lib/data/addresses/bank-account/card.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/bank-account/card.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/card.js +34 -0
- package/services/asset-movement/lib/data/addresses/bank-account/card.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/clabe.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/bank-account/clabe.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/clabe.js +22 -0
- package/services/asset-movement/lib/data/addresses/bank-account/clabe.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/iban-swift.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/bank-account/iban-swift.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/iban-swift.js +43 -0
- package/services/asset-movement/lib/data/addresses/bank-account/iban-swift.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/index.generated.d.ts +15 -0
- package/services/asset-movement/lib/data/addresses/bank-account/index.generated.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/index.generated.js +16 -0
- package/services/asset-movement/lib/data/addresses/bank-account/index.generated.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/interac.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/bank-account/interac.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/interac.js +39 -0
- package/services/asset-movement/lib/data/addresses/bank-account/interac.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/pix.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/bank-account/pix.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/pix.js +31 -0
- package/services/asset-movement/lib/data/addresses/bank-account/pix.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/us.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/bank-account/us.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/bank-account/us.js +37 -0
- package/services/asset-movement/lib/data/addresses/bank-account/us.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/airtel-money.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/airtel-money.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/airtel-money.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/airtel-money.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/bkash.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/bkash.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/bkash.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/bkash.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/easy-paisa.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/easy-paisa.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/easy-paisa.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/easy-paisa.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/finja-wallet.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/finja-wallet.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/finja-wallet.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/finja-wallet.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/index.generated.d.ts +27 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/index.generated.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/index.generated.js +28 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/index.generated.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/jazz-cash.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/jazz-cash.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/jazz-cash.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/jazz-cash.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/mtn-mobile-money.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/mtn-mobile-money.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/mtn-mobile-money.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/mtn-mobile-money.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/nagad.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/nagad.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/nagad.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/nagad.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/naya-pay.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/naya-pay.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/naya-pay.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/naya-pay.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/paypal.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/paypal.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/paypal.js +19 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/paypal.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/rocket.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/rocket.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/rocket.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/rocket.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/sada-pay.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/sada-pay.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/sada-pay.js +7 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/sada-pay.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/venmo.d.ts +4 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/venmo.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/venmo.js +17 -0
- package/services/asset-movement/lib/data/addresses/mobile-wallet/venmo.js.map +1 -0
- package/services/asset-movement/lib/data/addresses/types.generated.d.ts +1590 -0
- package/services/asset-movement/lib/data/addresses/types.generated.d.ts.map +1 -0
- package/services/asset-movement/lib/data/addresses/types.generated.js +1895 -0
- package/services/asset-movement/lib/data/addresses/types.generated.js.map +1 -0
- package/services/asset-movement/lib/data/json-schema.d.ts +64 -0
- package/services/asset-movement/lib/data/json-schema.d.ts.map +1 -0
- package/services/asset-movement/lib/data/json-schema.js +2 -0
- package/services/asset-movement/lib/data/json-schema.js.map +1 -0
- package/services/asset-movement/lib/data/scripts/generator.d.ts +2 -0
- package/services/asset-movement/lib/data/scripts/generator.d.ts.map +1 -0
- package/services/asset-movement/lib/data/scripts/generator.js +140 -0
- package/services/asset-movement/lib/data/scripts/generator.js.map +1 -0
- package/services/asset-movement/lib/data/types.d.ts +23 -0
- package/services/asset-movement/lib/data/types.d.ts.map +1 -0
- package/services/asset-movement/lib/data/types.js +120 -0
- package/services/asset-movement/lib/data/types.js.map +1 -0
- package/services/asset-movement/lib/location.d.ts +11 -4
- package/services/asset-movement/lib/location.d.ts.map +1 -1
- package/services/asset-movement/lib/location.generated.d.ts +2 -1
- package/services/asset-movement/lib/location.generated.d.ts.map +1 -1
- package/services/asset-movement/lib/location.generated.js +15 -3
- package/services/asset-movement/lib/location.generated.js.map +1 -1
- package/services/asset-movement/lib/location.js +13 -1
- package/services/asset-movement/lib/location.js.map +1 -1
- package/services/fx/client.d.ts +17 -2
- package/services/fx/client.d.ts.map +1 -1
- package/services/fx/client.js +153 -76
- package/services/fx/client.js.map +1 -1
- package/services/fx/common.d.ts +11 -1
- package/services/fx/common.d.ts.map +1 -1
- package/services/fx/common.js +32 -10
- package/services/fx/common.js.map +1 -1
- package/services/fx/server.d.ts +37 -11
- package/services/fx/server.d.ts.map +1 -1
- package/services/fx/server.js +169 -92
- package/services/fx/server.js.map +1 -1
- package/services/notification/client.d.ts +78 -0
- package/services/notification/client.d.ts.map +1 -0
- package/services/notification/client.js +499 -0
- package/services/notification/client.js.map +1 -0
- package/services/notification/common.d.ts +179 -0
- package/services/notification/common.d.ts.map +1 -0
- package/services/notification/common.generated.d.ts +17 -0
- package/services/notification/common.generated.d.ts.map +1 -0
- package/services/notification/common.generated.js +733 -0
- package/services/notification/common.generated.js.map +1 -0
- package/services/notification/common.js +139 -0
- package/services/notification/common.js.map +1 -0
- package/services/notification/server.d.ts +39 -0
- package/services/notification/server.d.ts.map +1 -0
- package/services/notification/server.js +222 -0
- package/services/notification/server.js.map +1 -0
- package/services/storage/client.d.ts +11 -1
- package/services/storage/client.d.ts.map +1 -1
- package/services/storage/client.js +28 -6
- package/services/storage/client.js.map +1 -1
- package/services/storage/clients/contacts.d.ts.map +1 -1
- package/services/storage/clients/contacts.generated.js +1235 -338
- package/services/storage/clients/contacts.generated.js.map +1 -1
- package/services/storage/clients/contacts.js +2 -1
- package/services/storage/clients/contacts.js.map +1 -1
- package/services/storage/clients/icon.d.ts +29 -0
- package/services/storage/clients/icon.d.ts.map +1 -0
- package/services/storage/clients/icon.js +34 -0
- package/services/storage/clients/icon.js.map +1 -0
- package/services/storage/common.d.ts +14 -0
- package/services/storage/common.d.ts.map +1 -1
- package/services/storage/common.js.map +1 -1
- package/services/storage/test-utils.d.ts +15 -1
- package/services/storage/test-utils.d.ts.map +1 -1
- package/services/storage/test-utils.js +60 -0
- package/services/storage/test-utils.js.map +1 -1
- package/services/username/common.generated.js +38 -4
- package/services/username/common.generated.js.map +1 -1
package/services/fx/server.d.ts
CHANGED
|
@@ -84,12 +84,6 @@ export interface KeetaAnchorFXServerConfig extends KeetaAnchorHTTPServer.KeetaAn
|
|
|
84
84
|
* Supported conversions
|
|
85
85
|
*/
|
|
86
86
|
from?: NonNullable<ServiceMetadata['services']['fx']>[string]['from'];
|
|
87
|
-
/**
|
|
88
|
-
* Handle the conversion request of one token to another
|
|
89
|
-
*
|
|
90
|
-
* This is used to handle quotes and estimates
|
|
91
|
-
*/
|
|
92
|
-
getConversionRateAndFee: (request: ConversionInputCanonicalJSON, context: GetConversionRateAndFeeContext) => Promise<KeetaFXInternalPriceQuote>;
|
|
93
87
|
/**
|
|
94
88
|
* Optional callback to validate a quote before completing an exchange
|
|
95
89
|
*
|
|
@@ -100,7 +94,22 @@ export interface KeetaAnchorFXServerConfig extends KeetaAnchorHTTPServer.KeetaAn
|
|
|
100
94
|
* @returns true to accept the quote and proceed with the exchange, false to reject it
|
|
101
95
|
*/
|
|
102
96
|
validateQuote?: (quote: ValidateQuoteArguments) => Promise<boolean> | boolean;
|
|
103
|
-
}
|
|
97
|
+
} & ({
|
|
98
|
+
performExchanges?: true;
|
|
99
|
+
/**
|
|
100
|
+
* Handle the conversion request of one token to another
|
|
101
|
+
*
|
|
102
|
+
* This is used to handle quotes and estimates
|
|
103
|
+
*/
|
|
104
|
+
getConversionRateAndFee: (request: ConversionInputCanonicalJSON, context: GetConversionRateAndFeeContext) => Promise<KeetaFXInternalPriceQuote>;
|
|
105
|
+
} | {
|
|
106
|
+
performExchanges: false;
|
|
107
|
+
/**
|
|
108
|
+
* Get the estimate price of an exchange, this should be provided when getConversionRateAndFee is not provided
|
|
109
|
+
* The server will not handle exchanges if getConversionRateAndFee is not provided, but it will still provide quotes and estimates based on this function
|
|
110
|
+
*/
|
|
111
|
+
estimateRateAndFee: (request: ConversionInputCanonicalJSON) => Promise<KeetaFXInternalPriceEstimate>;
|
|
112
|
+
});
|
|
104
113
|
/**
|
|
105
114
|
* Storage driver to use for stateful operation and managing queues
|
|
106
115
|
*
|
|
@@ -138,6 +147,7 @@ export interface KeetaAnchorFXServerConfig extends KeetaAnchorHTTPServer.KeetaAn
|
|
|
138
147
|
} | KeetaNet.UserClient;
|
|
139
148
|
}
|
|
140
149
|
export type KeetaFXInternalPriceQuote = Omit<KeetaFXAnchorQuote, 'signed' | 'request'> & Pick<KeetaFXAnchorEstimate, 'convertedAmountBound'>;
|
|
150
|
+
export type KeetaFXInternalPriceEstimate = Omit<KeetaFXInternalPriceQuote, 'account'>;
|
|
141
151
|
export type ValidateQuoteArguments = KeetaFXInternalPriceQuote & Partial<Omit<KeetaFXAnchorQuote, keyof KeetaFXInternalPriceQuote>>;
|
|
142
152
|
export declare function toValidateQuoteInput(input: KeetaFXAnchorQuoteJSON | KeetaFXInternalPriceQuote | KeetaFXAnchorQuote): ValidateQuoteArguments;
|
|
143
153
|
type KeetaFXAnchorQueueStage1Request = {
|
|
@@ -225,8 +235,27 @@ declare class KeetaFXAnchorQueuePipeline extends KeetaAnchorQueuePipelineAdvance
|
|
|
225
235
|
maintain(): Promise<void>;
|
|
226
236
|
destroy(): Promise<void>;
|
|
227
237
|
}
|
|
228
|
-
|
|
238
|
+
type SharedHTTPServerConfigType = Pick<KeetaAnchorFXServerConfig, 'fx' | 'homepage' | keyof KeetaAnchorHTTPServer.KeetaAnchorHTTPServerConfig>;
|
|
239
|
+
declare abstract class BaseKeetaNetFXAnchorHTTPServer<ConfigType extends SharedHTTPServerConfigType> extends KeetaAnchorHTTPServer.KeetaNetAnchorHTTPServer<ConfigType> implements Omit<Required<KeetaAnchorFXServerConfig>, 'storage' | 'queueRunnerExtensions' | 'accounts' | 'account' | 'signer' | 'client' | 'quoteSigner' | 'quoteConfiguration'> {
|
|
229
240
|
readonly homepage: NonNullable<KeetaAnchorFXServerConfig['homepage']>;
|
|
241
|
+
readonly fx: KeetaAnchorFXServerConfig['fx'];
|
|
242
|
+
readonly canPerformExchanges: boolean;
|
|
243
|
+
protected abstract quoteConfiguration: Exclude<KeetaAnchorFXServerConfig['quoteConfiguration'], undefined> | null;
|
|
244
|
+
protected accounts: InstanceType<typeof KeetaNet.lib.Account.Set> | null;
|
|
245
|
+
constructor(config: ConfigType);
|
|
246
|
+
protected getUnsignedQuoteData(conversion: ConversionInputCanonicalJSON, purpose: 'estimate'): Promise<KeetaFXInternalPriceEstimate | KeetaFXInternalPriceQuote>;
|
|
247
|
+
protected getUnsignedQuoteData(conversion: ConversionInputCanonicalJSON, purpose: 'quote'): Promise<KeetaFXInternalPriceQuote>;
|
|
248
|
+
protected initRoutes(config: ConfigType): Promise<KeetaAnchorHTTPServer.Routes>;
|
|
249
|
+
/**
|
|
250
|
+
* Return the servers endpoints and possible currency conversions metadata
|
|
251
|
+
*/
|
|
252
|
+
serviceMetadata(): Promise<NonNullable<ServiceMetadata['services']['fx']>[string]>;
|
|
253
|
+
}
|
|
254
|
+
export declare class KeetaNetFXAnchorEstimateHTTPServer extends BaseKeetaNetFXAnchorHTTPServer<SharedHTTPServerConfigType> {
|
|
255
|
+
protected quoteConfiguration: null;
|
|
256
|
+
constructor(config: SharedHTTPServerConfigType);
|
|
257
|
+
}
|
|
258
|
+
export declare class KeetaNetFXAnchorHTTPServer extends BaseKeetaNetFXAnchorHTTPServer<KeetaAnchorFXServerConfig> implements Omit<Required<KeetaAnchorFXServerConfig>, 'storage' | 'queueRunnerExtensions'> {
|
|
230
259
|
readonly client: KeetaAnchorFXServerConfig['client'];
|
|
231
260
|
readonly accounts: NonNullable<KeetaAnchorFXServerConfig['accounts']>;
|
|
232
261
|
readonly account: KeetaAnchorFXServerConfig['account'];
|
|
@@ -239,9 +268,6 @@ export declare class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.Ke
|
|
|
239
268
|
protected autoRunRunning: boolean;
|
|
240
269
|
constructor(config: KeetaAnchorFXServerConfig);
|
|
241
270
|
protected initRoutes(config: KeetaAnchorFXServerConfig): Promise<KeetaAnchorHTTPServer.Routes>;
|
|
242
|
-
/**
|
|
243
|
-
* Return the servers endpoints and possible currency conversions metadata
|
|
244
|
-
*/
|
|
245
271
|
serviceMetadata(): Promise<NonNullable<ServiceMetadata['services']['fx']>[string]>;
|
|
246
272
|
stop(): Promise<void>;
|
|
247
273
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/services/fx/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,qBAAqB,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAUjD,OAAO,KAAK,EACX,4BAA4B,EAC5B,qBAAqB,EAGrB,kBAAkB,EAClB,sBAAsB,EAEtB,eAAe,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAuC,MAAM,0BAA0B,CAAC;AACvG,OAAO,KAAK,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,yCAAyC,EAAE,MAAM,0BAA0B,CAAC;AACpJ,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,yBAAyB,CAAC;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAkB7D,MAAM,MAAM,8BAA8B,GAAG;IAC5C;;;;OAIG;IACH,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC;CAC9B,GAAG;IACH;;;OAGG;IACH,OAAO,EAAE,UAAU,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,+BAA+B,CAAC;CACzC,CAAA;AAED,MAAM,WAAW,yBAA0B,SAAQ,qBAAqB,CAAC,2BAA2B;IACnG;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IAErD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEzD;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAEhE;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,4BAA4B,KAAK,OAAO,CAAC,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAEjM;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAE5C;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACpB,aAAa,EAAE,IAAI,CAAC;KACpB,GAAG;QACH,aAAa,EAAE,KAAK,CAAC;QAErB;;WAEG;QACH,2BAA2B,EAAE,OAAO,CAAC;QAErC;;WAEG;QACH,WAAW,EAAE,OAAO,CAAC;KACrB,CAAC;IAEF;;OAEG;IACH,EAAE,EAAE;QACH;;WAEG;QACH,IAAI,CAAC,EAAE,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/services/fx/server.ts"],"names":[],"mappings":"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"}
|
package/services/fx/server.js
CHANGED
|
@@ -53,6 +53,9 @@ async function requestToAccounts(config, request) {
|
|
|
53
53
|
let account;
|
|
54
54
|
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
55
55
|
if (config.account !== undefined) {
|
|
56
|
+
if (!('getConversionRateAndFee' in config.fx)) {
|
|
57
|
+
throw (new Error('getConversionRateAndFee must be provided in fx configuration when using account property'));
|
|
58
|
+
}
|
|
56
59
|
const rateFee = await config.fx.getConversionRateAndFee(request, { purpose: 'estimate' });
|
|
57
60
|
account = rateFee.account;
|
|
58
61
|
}
|
|
@@ -307,6 +310,14 @@ class KeetaFXAnchorQueuePipelineStage1 extends KeetaAnchorQueueRunner {
|
|
|
307
310
|
* Additionally, other FX anchors are not forced to refund any, so there is no guarantee to client that refunds will occur
|
|
308
311
|
*/
|
|
309
312
|
if (expected === null) {
|
|
313
|
+
if (!('getConversionRateAndFee' in this.serverConfig.fx)) {
|
|
314
|
+
this.serverConfig.logger?.error('KeetaFXAnchorQueuePipelineStage1::processor', 'getConversionRateAndFee must be provided in fx configuration to process exchanges without expected details');
|
|
315
|
+
return ({
|
|
316
|
+
status: 'failed_permanently',
|
|
317
|
+
output: null,
|
|
318
|
+
error: 'Server misconfiguration: getConversionRateAndFee must be provided in fx configuration to process exchanges without expected details'
|
|
319
|
+
});
|
|
320
|
+
}
|
|
310
321
|
const quote = await this.serverConfig.fx.getConversionRateAndFee(request, { purpose: 'exchange', request: entry.request });
|
|
311
322
|
const { refunds } = assertExchangeBlockParametersAndComputeRefund({
|
|
312
323
|
block: block,
|
|
@@ -598,82 +609,48 @@ class KeetaFXAnchorQueuePipeline extends KeetaAnchorQueuePipelineAdvanced {
|
|
|
598
609
|
}
|
|
599
610
|
}
|
|
600
611
|
}
|
|
601
|
-
|
|
612
|
+
class BaseKeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAnchorHTTPServer {
|
|
602
613
|
homepage;
|
|
603
|
-
client;
|
|
604
|
-
accounts;
|
|
605
|
-
account = undefined;
|
|
606
|
-
signer;
|
|
607
|
-
quoteSigner;
|
|
608
614
|
fx;
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
autoRun;
|
|
612
|
-
autoRunRunning = false;
|
|
615
|
+
canPerformExchanges;
|
|
616
|
+
accounts = null;
|
|
613
617
|
constructor(config) {
|
|
614
618
|
super(config);
|
|
615
619
|
this.homepage = config.homepage ?? '';
|
|
616
|
-
this.client = config.client;
|
|
617
620
|
this.fx = config.fx;
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
/*
|
|
626
|
-
* Deprecated: If a single account is provided, use that
|
|
627
|
-
* along with the signer to create the accounts set
|
|
628
|
-
*/
|
|
629
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
630
|
-
this.accounts = new KeetaNet.lib.Account.Set([config.account]);
|
|
631
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
632
|
-
this.signer = config.signer ?? config.account;
|
|
633
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
621
|
+
// This is incorrect as undefined and true are the same (because default is true), but using a negation will not result in the correct type for canPerformExchanges, so we have to disable the lint warning and accept the incorrectness
|
|
622
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare
|
|
623
|
+
this.canPerformExchanges = config.fx.performExchanges === undefined || config.fx.performExchanges === true;
|
|
624
|
+
}
|
|
625
|
+
async getUnsignedQuoteData(conversion, purpose) {
|
|
626
|
+
if (purpose !== 'estimate' && !this.canPerformExchanges) {
|
|
627
|
+
throw (new Error(`FX configuration does not support performing exchanges, so purpose "${purpose}" is invalid`));
|
|
634
628
|
}
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
*/
|
|
639
|
-
if (config.signer === undefined) {
|
|
640
|
-
throw (new Error('If "accounts" is provided, "signer" must also be provided'));
|
|
629
|
+
if ('getConversionRateAndFee' in this.fx) {
|
|
630
|
+
if (!this.accounts) {
|
|
631
|
+
throw (new Error('Accounts must be configured to use "getConversionRateAndFee" in fx configuration'));
|
|
641
632
|
}
|
|
642
|
-
this.
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
633
|
+
const rateAndFee = await this.fx.getConversionRateAndFee(conversion, { purpose });
|
|
634
|
+
if (PARANOID) {
|
|
635
|
+
const quoteAccount = rateAndFee.account;
|
|
636
|
+
if (!this.accounts.has(quoteAccount)) {
|
|
637
|
+
throw (new Error('"getConversionRateAndFee" returned an account not configured for this server'));
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
return (rateAndFee);
|
|
647
641
|
}
|
|
648
|
-
if (this.
|
|
649
|
-
|
|
642
|
+
else if ('estimateRateAndFee' in this.fx) {
|
|
643
|
+
if (purpose !== 'estimate') {
|
|
644
|
+
throw (new Error('FX configuration only supports "estimateRateAndFee", so purpose must be "estimate"'));
|
|
645
|
+
}
|
|
646
|
+
return (await this.fx.estimateRateAndFee(conversion));
|
|
650
647
|
}
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
* that we auto-run
|
|
654
|
-
*/
|
|
655
|
-
this.autoRun = config.storage?.autoRun ?? false;
|
|
656
|
-
if (config.storage === undefined) {
|
|
657
|
-
this.autoRun = true;
|
|
648
|
+
else {
|
|
649
|
+
assertNever(this.fx);
|
|
658
650
|
}
|
|
659
|
-
/*
|
|
660
|
-
* Create the pipeline to process transactions
|
|
661
|
-
*/
|
|
662
|
-
this.pipeline = new KeetaFXAnchorQueuePipeline({
|
|
663
|
-
id: 'keeta-fx-anchor-queue-pipeline',
|
|
664
|
-
baseQueue: config.storage?.queue ?? new KeetaAnchorQueueStorageDriverMemory({
|
|
665
|
-
id: 'keeta-fx-anchor-queue-pipeline-memory-driver',
|
|
666
|
-
logger: this.logger
|
|
667
|
-
}),
|
|
668
|
-
accounts: this.accounts,
|
|
669
|
-
logger: this.logger,
|
|
670
|
-
serverConfig: this,
|
|
671
|
-
extensions: config.queueRunnerExtensions
|
|
672
|
-
});
|
|
673
651
|
}
|
|
674
652
|
async initRoutes(config) {
|
|
675
653
|
const routes = {};
|
|
676
|
-
const logger = this.logger;
|
|
677
654
|
/*
|
|
678
655
|
* To use the instance within the route handlers, we need to
|
|
679
656
|
* make a local reference to it.
|
|
@@ -701,20 +678,10 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
701
678
|
});
|
|
702
679
|
};
|
|
703
680
|
}
|
|
704
|
-
async function getUnsignedQuoteData(conversion, purpose) {
|
|
705
|
-
const rateAndFee = await config.fx.getConversionRateAndFee(conversion, { purpose });
|
|
706
|
-
if (PARANOID) {
|
|
707
|
-
const quoteAccount = rateAndFee.account;
|
|
708
|
-
if (!instance.accounts.has(quoteAccount)) {
|
|
709
|
-
throw (new Error('"getConversionRateAndFee" returned an account not configured for this server'));
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
return (rateAndFee);
|
|
713
|
-
}
|
|
714
681
|
/**
|
|
715
682
|
* Setup the request handler for an estimate request
|
|
716
683
|
*/
|
|
717
|
-
routes['POST /api/getEstimate'] = async
|
|
684
|
+
routes['POST /api/getEstimate'] = async (_ignore_params, postData) => {
|
|
718
685
|
if (!postData || typeof postData !== 'object') {
|
|
719
686
|
throw (new Error('No POST data provided'));
|
|
720
687
|
}
|
|
@@ -722,9 +689,12 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
722
689
|
throw (new Error('POST data missing request'));
|
|
723
690
|
}
|
|
724
691
|
const conversion = assertConversionInputCanonicalJSON(postData.request);
|
|
725
|
-
const rateAndFee = await getUnsignedQuoteData(conversion, 'estimate');
|
|
692
|
+
const rateAndFee = await this.getUnsignedQuoteData(conversion, 'estimate');
|
|
726
693
|
let requiresQuoteBody;
|
|
727
|
-
if (instance.quoteConfiguration.
|
|
694
|
+
if (!instance.quoteConfiguration || !instance.canPerformExchanges) {
|
|
695
|
+
requiresQuoteBody = { canPerformExchange: false };
|
|
696
|
+
}
|
|
697
|
+
else if (instance.quoteConfiguration.requiresQuote) {
|
|
728
698
|
requiresQuoteBody = { requiresQuote: true };
|
|
729
699
|
}
|
|
730
700
|
else {
|
|
@@ -739,6 +709,9 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
739
709
|
throw (new KeetaAnchorError('Affinity is from, but bound is greater than estimated received amount'));
|
|
740
710
|
}
|
|
741
711
|
}
|
|
712
|
+
if (!('account' in rateAndFee) || !rateAndFee.account) {
|
|
713
|
+
throw (new Error('FX configuration indicates quotes are not required, but no account was provided in the rate and fee response'));
|
|
714
|
+
}
|
|
742
715
|
requiresQuoteBody = { requiresQuote: false, account: rateAndFee.account };
|
|
743
716
|
}
|
|
744
717
|
const estimateResponse = {
|
|
@@ -759,7 +732,114 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
759
732
|
output: JSON.stringify(estimateResponse)
|
|
760
733
|
});
|
|
761
734
|
};
|
|
762
|
-
|
|
735
|
+
return (routes);
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Return the servers endpoints and possible currency conversions metadata
|
|
739
|
+
*/
|
|
740
|
+
async serviceMetadata() {
|
|
741
|
+
const operations = {
|
|
742
|
+
getEstimate: (new URL('/api/getEstimate', this.url)).toString()
|
|
743
|
+
};
|
|
744
|
+
return ({
|
|
745
|
+
from: this.fx.from ?? [],
|
|
746
|
+
operations: operations
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
export class KeetaNetFXAnchorEstimateHTTPServer extends BaseKeetaNetFXAnchorHTTPServer {
|
|
751
|
+
quoteConfiguration = null;
|
|
752
|
+
constructor(config) {
|
|
753
|
+
super(config);
|
|
754
|
+
if (this.canPerformExchanges) {
|
|
755
|
+
throw (new Error('FX configuration indicates exchanges can be performed, but KeetaNetFXAnchorEstimateHTTPServer does not support exchange capability'));
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
export class KeetaNetFXAnchorHTTPServer extends BaseKeetaNetFXAnchorHTTPServer {
|
|
760
|
+
client;
|
|
761
|
+
accounts;
|
|
762
|
+
account = undefined;
|
|
763
|
+
signer;
|
|
764
|
+
quoteSigner;
|
|
765
|
+
fx;
|
|
766
|
+
pipeline;
|
|
767
|
+
quoteConfiguration;
|
|
768
|
+
autoRun;
|
|
769
|
+
autoRunRunning = false;
|
|
770
|
+
constructor(config) {
|
|
771
|
+
super(config);
|
|
772
|
+
this.client = config.client;
|
|
773
|
+
this.fx = config.fx;
|
|
774
|
+
this.quoteSigner = config.quoteSigner;
|
|
775
|
+
this.quoteConfiguration = config.quoteConfiguration ?? { requiresQuote: true };
|
|
776
|
+
if (!this.canPerformExchanges) {
|
|
777
|
+
throw (new Error('FX configuration indicates exchanges cannot be performed, but KeetaNetFXAnchorHTTPServer requires exchange capability'));
|
|
778
|
+
}
|
|
779
|
+
/*
|
|
780
|
+
* Setup the accounts
|
|
781
|
+
*/
|
|
782
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
783
|
+
if (config.account !== undefined && config.accounts === undefined) {
|
|
784
|
+
/*
|
|
785
|
+
* Deprecated: If a single account is provided, use that
|
|
786
|
+
* along with the signer to create the accounts set
|
|
787
|
+
*/
|
|
788
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
789
|
+
this.accounts = new KeetaNet.lib.Account.Set([config.account]);
|
|
790
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
791
|
+
this.signer = config.signer ?? config.account;
|
|
792
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
793
|
+
}
|
|
794
|
+
else if (config.accounts !== undefined && config.account === undefined) {
|
|
795
|
+
/*
|
|
796
|
+
* Only allow either "account" or "accounts"+"signer" to be provided
|
|
797
|
+
*/
|
|
798
|
+
if (config.signer === undefined) {
|
|
799
|
+
throw (new Error('If "accounts" is provided, "signer" must also be provided'));
|
|
800
|
+
}
|
|
801
|
+
this.accounts = config.accounts;
|
|
802
|
+
this.signer = config.signer;
|
|
803
|
+
}
|
|
804
|
+
else {
|
|
805
|
+
throw (new Error('Either "account" (and optional "signer") or "accounts" and "signer" must be provided, but not both "account" and "accounts"'));
|
|
806
|
+
}
|
|
807
|
+
if (this.accounts.size === 0) {
|
|
808
|
+
throw (new Error('No FX accounts provided'));
|
|
809
|
+
}
|
|
810
|
+
/*
|
|
811
|
+
* If no storage driver is provided, we default to an in-memory
|
|
812
|
+
* that we auto-run
|
|
813
|
+
*/
|
|
814
|
+
this.autoRun = config.storage?.autoRun ?? false;
|
|
815
|
+
if (config.storage === undefined) {
|
|
816
|
+
this.autoRun = true;
|
|
817
|
+
}
|
|
818
|
+
/*
|
|
819
|
+
* Create the pipeline to process transactions
|
|
820
|
+
*/
|
|
821
|
+
this.pipeline = new KeetaFXAnchorQueuePipeline({
|
|
822
|
+
id: 'keeta-fx-anchor-queue-pipeline',
|
|
823
|
+
baseQueue: config.storage?.queue ?? new KeetaAnchorQueueStorageDriverMemory({
|
|
824
|
+
id: 'keeta-fx-anchor-queue-pipeline-memory-driver',
|
|
825
|
+
logger: this.logger
|
|
826
|
+
}),
|
|
827
|
+
accounts: this.accounts,
|
|
828
|
+
logger: this.logger,
|
|
829
|
+
serverConfig: this,
|
|
830
|
+
extensions: config.queueRunnerExtensions
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
async initRoutes(config) {
|
|
834
|
+
const routes = await super.initRoutes(config);
|
|
835
|
+
const logger = this.logger;
|
|
836
|
+
/*
|
|
837
|
+
* To use the instance within the route handlers, we need to
|
|
838
|
+
* make a local reference to it.
|
|
839
|
+
*/
|
|
840
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
841
|
+
const instance = this;
|
|
842
|
+
routes['POST /api/getQuote'] = async (_ignore_params, postData) => {
|
|
763
843
|
if (!instance.quoteConfiguration.requiresQuote && !instance.quoteConfiguration.issueQuotes) {
|
|
764
844
|
throw (new Errors.QuoteIssuanceDisabled());
|
|
765
845
|
}
|
|
@@ -770,7 +850,7 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
770
850
|
throw (new Error('POST data missing request'));
|
|
771
851
|
}
|
|
772
852
|
const conversion = assertConversionInputCanonicalJSON(postData.request);
|
|
773
|
-
const rateAndFee = await getUnsignedQuoteData(conversion, 'quote');
|
|
853
|
+
const rateAndFee = await this.getUnsignedQuoteData(conversion, 'quote');
|
|
774
854
|
const unsignedQuote = KeetaNet.lib.Utils.Conversion.toJSONSerializable({
|
|
775
855
|
request: conversion,
|
|
776
856
|
...rateAndFee
|
|
@@ -787,7 +867,7 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
787
867
|
output: JSON.stringify(quoteResponse)
|
|
788
868
|
});
|
|
789
869
|
};
|
|
790
|
-
routes['POST /api/createExchange'] = async
|
|
870
|
+
routes['POST /api/createExchange'] = async (_ignore_params, postData) => {
|
|
791
871
|
if (!postData || typeof postData !== 'object') {
|
|
792
872
|
throw (new Error('No POST data provided'));
|
|
793
873
|
}
|
|
@@ -834,7 +914,7 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
834
914
|
throw (new Errors.QuoteRequired());
|
|
835
915
|
}
|
|
836
916
|
conversionInput = request.request;
|
|
837
|
-
quoteInput = await getUnsignedQuoteData(conversionInput, 'estimate');
|
|
917
|
+
quoteInput = await this.getUnsignedQuoteData(conversionInput, 'estimate');
|
|
838
918
|
if (instance.quoteConfiguration.validateQuoteBeforeExchange !== undefined) {
|
|
839
919
|
shouldValidateQuote = instance.quoteConfiguration.validateQuoteBeforeExchange;
|
|
840
920
|
}
|
|
@@ -861,6 +941,9 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
861
941
|
else {
|
|
862
942
|
throw (new Error('Either quote or request must be provided (but not both) in exchange request'));
|
|
863
943
|
}
|
|
944
|
+
if (!('account' in quoteInput) || !quoteInput.account) {
|
|
945
|
+
throw (new Error('Quote is missing account, createExchange should not be supported for quotes without an account'));
|
|
946
|
+
}
|
|
864
947
|
const parsedQuote = toValidateQuoteInput(quoteInput);
|
|
865
948
|
/* Validate the quote using the optional callback */
|
|
866
949
|
if (config.fx.validateQuote !== undefined && shouldValidateQuote) {
|
|
@@ -1018,20 +1101,14 @@ export class KeetaNetFXAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAn
|
|
|
1018
1101
|
};
|
|
1019
1102
|
return (routes);
|
|
1020
1103
|
}
|
|
1021
|
-
/**
|
|
1022
|
-
* Return the servers endpoints and possible currency conversions metadata
|
|
1023
|
-
*/
|
|
1024
1104
|
async serviceMetadata() {
|
|
1025
|
-
const
|
|
1026
|
-
|
|
1027
|
-
getQuote
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
return (
|
|
1032
|
-
from: this.fx.from ?? [],
|
|
1033
|
-
operations: operations
|
|
1034
|
-
});
|
|
1105
|
+
const baseMetadata = await super.serviceMetadata();
|
|
1106
|
+
if (this.quoteConfiguration.requiresQuote || this.quoteConfiguration.issueQuotes) {
|
|
1107
|
+
baseMetadata.operations.getQuote = (new URL('/api/getQuote', this.url)).toString();
|
|
1108
|
+
}
|
|
1109
|
+
baseMetadata.operations.getExchangeStatus = (new URL('/api/getExchangeStatus', this.url)).toString() + '/{id}';
|
|
1110
|
+
baseMetadata.operations.createExchange = (new URL('/api/createExchange', this.url)).toString();
|
|
1111
|
+
return (baseMetadata);
|
|
1035
1112
|
}
|
|
1036
1113
|
async stop() {
|
|
1037
1114
|
await this.pipeline.destroy();
|