@reyaxyz/sdk 0.142.0 → 0.142.2

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/README.md CHANGED
@@ -6,5 +6,5 @@
6
6
 
7
7
  | Statements | Branches | Functions | Lines |
8
8
  | --------------------------- | ----------------------- | ------------------------- | ----------------- |
9
- | ![Statements](https://img.shields.io/badge/statements-8.86%25-red.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-5.97%25-red.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-3.79%25-red.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-8.52%25-red.svg?style=flat) |
9
+ | ![Statements](https://img.shields.io/badge/statements-8.83%25-red.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-5.88%25-red.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-3.79%25-red.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-8.49%25-red.svg?style=flat) |
10
10
 
@@ -50,20 +50,23 @@ var encodeSpotLimitOrderInputs = function (isBuy, limitPx, qty) {
50
50
  return ethers_1.AbiCoder.defaultAbiCoder().encode(['int256', 'uint256'], [baseDelta, price]);
51
51
  };
52
52
  var createSpotOrder = function (params) { return __awaiter(void 0, void 0, void 0, function () {
53
- var reyaChainId, config, inputs, creationTimestampMs, _a, serializedSignature, nonce, signerAddress, apiConfig, orderEntryApi, response;
54
- return __generator(this, function (_b) {
55
- switch (_b.label) {
53
+ var reyaChainId, config, inputs, creationTimestampMs, deadline, spotNonce, _a, serializedSignature, nonce, signerAddress, apiConfig, orderEntryApi, response;
54
+ var _b;
55
+ return __generator(this, function (_c) {
56
+ switch (_c.label) {
56
57
  case 0:
57
58
  reyaChainId = (0, network_1.getReyaNetwork)();
58
59
  config = (0, config_1.getSdkConfig)();
59
60
  inputs = encodeSpotLimitOrderInputs(params.isBuy, params.limitPx, params.qty);
60
61
  creationTimestampMs = Date.now();
61
- return [4 /*yield*/, (0, common_1.signOrdersGatewayOrder)(params.signer, reyaChainId, params.accountId, params.marketId, params.exchangeId, [], common_1.OrdersGatewayOrderType.LIMIT_ORDER_SPOT, inputs, common_1.CONDITIONAL_ORDER_SIG_DEADLINE, creationTimestampMs)];
62
+ deadline = (_b = params.expiresAfter) !== null && _b !== void 0 ? _b : creationTimestampMs + 10000;
63
+ spotNonce = BigInt(creationTimestampMs);
64
+ return [4 /*yield*/, (0, common_1.signOrdersGatewayOrder)(params.signer, reyaChainId, params.accountId, params.marketId, params.exchangeId, [], common_1.OrdersGatewayOrderType.LIMIT_ORDER_SPOT, inputs, deadline, creationTimestampMs, spotNonce)];
62
65
  case 1:
63
- _a = _b.sent(), serializedSignature = _a.serializedSignature, nonce = _a.nonce;
66
+ _a = _c.sent(), serializedSignature = _a.serializedSignature, nonce = _a.nonce;
64
67
  return [4 /*yield*/, params.signer.getAddress()];
65
68
  case 2:
66
- signerAddress = _b.sent();
69
+ signerAddress = _c.sent();
67
70
  apiConfig = new api_v2_sdk_1.Configuration({
68
71
  basePath: "".concat(config.apiEndpoint, "/v2"),
69
72
  });
@@ -81,11 +84,11 @@ var createSpotOrder = function (params) { return __awaiter(void 0, void 0, void
81
84
  signature: serializedSignature,
82
85
  nonce: nonce.toString(),
83
86
  signerWallet: signerAddress,
84
- expiresAfter: params.expiresAfter,
87
+ expiresAfter: deadline,
85
88
  },
86
89
  })];
87
90
  case 3:
88
- response = _b.sent();
91
+ response = _c.sent();
89
92
  return [2 /*return*/, response];
90
93
  }
91
94
  });
@@ -1 +1 @@
1
- {"version":3,"file":"orderV2.js","sourceRoot":"/","sources":["services/orders/orderV2.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAyD;AACzD,kDAM6B;AAC7B,0CAKyB;AACzB,+CAAqD;AACrD,uCAA4C;AAc5C,IAAM,0BAA0B,GAAG,UACjC,KAAc,EACd,OAAe,EACf,GAAW;IAEX,IAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,IAAM,KAAK,GAAG,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,OAAO,iBAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CACtC,CAAC,QAAQ,EAAE,SAAS,CAAC,EACrB,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;AACJ,CAAC,CAAC;AAEK,IAAM,eAAe,GAAG,UAC7B,MAA6B;;;;;gBAEvB,WAAW,GAAG,IAAA,wBAAc,GAAE,CAAC;gBAC/B,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;gBAExB,MAAM,GAAG,0BAA0B,CACvC,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,GAAG,CACX,CAAC;gBAEI,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACA,qBAAM,IAAA,+BAAsB,EACjE,MAAM,CAAC,MAAM,EACb,WAAW,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,UAAU,EACjB,EAAE,EACF,+BAAsB,CAAC,gBAAgB,EACvC,MAAM,EACN,uCAA8B,EAC9B,mBAAmB,CACpB,EAAA;;gBAXK,KAAiC,SAWtC,EAXO,mBAAmB,yBAAA,EAAE,KAAK,WAAA;gBAaZ,qBAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAA;;gBAAhD,aAAa,GAAG,SAAgC;gBAEhD,SAAS,GAAG,IAAI,0BAAa,CAAC;oBAClC,QAAQ,EAAE,UAAG,MAAM,CAAC,WAAW,QAAK;iBACrC,CAAC,CAAC;gBAEG,aAAa,GAAG,IAAI,0BAAa,CAAC,SAAS,CAAC,CAAC;gBAElC,qBAAM,aAAa,CAAC,WAAW,CAAC;wBAC/C,kBAAkB,EAAE;4BAClB,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,SAAS,EAAE,MAAM,CAAC,SAAS;4BAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,SAAS,EAAE,sBAAS,CAAC,KAAK;4BAC1B,WAAW,EAAE,wBAAW,CAAC,GAAG;4BAC5B,SAAS,EAAE,mBAAmB;4BAC9B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;4BACvB,YAAY,EAAE,aAAa;4BAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;yBAClC;qBACF,CAAC,EAAA;;gBAfI,QAAQ,GAAG,SAef;gBAEF,sBAAO,QAAQ,EAAC;;;KACjB,CAAC;AApDW,QAAA,eAAe,mBAoD1B","sourcesContent":["import { Signer, JsonRpcSigner, AbiCoder } from 'ethers';\nimport {\n OrderEntryApi,\n Configuration,\n CreateOrderResponse,\n OrderType,\n TimeInForce,\n} from '@reyaxyz/api-v2-sdk';\nimport {\n signOrdersGatewayOrder,\n OrdersGatewayOrderType,\n scale,\n CONDITIONAL_ORDER_SIG_DEADLINE,\n} from '@reyaxyz/common';\nimport { getReyaNetwork } from '../../utils/network';\nimport { getSdkConfig } from '../../config';\n\nexport type CreateSpotOrderParams = {\n signer: Signer | JsonRpcSigner;\n accountId: number;\n exchangeId: number;\n marketId: number;\n isBuy: boolean;\n limitPx: string;\n qty: string;\n symbol: string;\n expiresAfter?: number;\n};\n\nconst encodeSpotLimitOrderInputs = (\n isBuy: boolean,\n limitPx: string,\n qty: string,\n): string => {\n const baseDelta = isBuy\n ? scale(18)(parseFloat(qty))\n : -scale(18)(parseFloat(qty));\n const price = scale(18)(parseFloat(limitPx));\n return AbiCoder.defaultAbiCoder().encode(\n ['int256', 'uint256'],\n [baseDelta, price],\n );\n};\n\nexport const createSpotOrder = async (\n params: CreateSpotOrderParams,\n): Promise<CreateOrderResponse> => {\n const reyaChainId = getReyaNetwork();\n const config = getSdkConfig();\n\n const inputs = encodeSpotLimitOrderInputs(\n params.isBuy,\n params.limitPx,\n params.qty,\n );\n\n const creationTimestampMs = Date.now();\n const { serializedSignature, nonce } = await signOrdersGatewayOrder(\n params.signer,\n reyaChainId,\n params.accountId,\n params.marketId,\n params.exchangeId,\n [],\n OrdersGatewayOrderType.LIMIT_ORDER_SPOT,\n inputs,\n CONDITIONAL_ORDER_SIG_DEADLINE,\n creationTimestampMs,\n );\n\n const signerAddress = await params.signer.getAddress();\n\n const apiConfig = new Configuration({\n basePath: `${config.apiEndpoint}/v2`,\n });\n\n const orderEntryApi = new OrderEntryApi(apiConfig);\n\n const response = await orderEntryApi.createOrder({\n createOrderRequest: {\n exchangeId: params.exchangeId,\n symbol: params.symbol,\n accountId: params.accountId,\n isBuy: params.isBuy,\n limitPx: params.limitPx,\n qty: params.qty,\n orderType: OrderType.LIMIT,\n timeInForce: TimeInForce.IOC,\n signature: serializedSignature,\n nonce: nonce.toString(),\n signerWallet: signerAddress,\n expiresAfter: params.expiresAfter,\n },\n });\n\n return response;\n};\n"]}
1
+ {"version":3,"file":"orderV2.js","sourceRoot":"/","sources":["services/orders/orderV2.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAyD;AACzD,kDAM6B;AAC7B,0CAIyB;AACzB,+CAAqD;AACrD,uCAA4C;AAc5C,IAAM,0BAA0B,GAAG,UACjC,KAAc,EACd,OAAe,EACf,GAAW;IAEX,IAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,IAAM,KAAK,GAAG,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,OAAO,iBAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CACtC,CAAC,QAAQ,EAAE,SAAS,CAAC,EACrB,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;AACJ,CAAC,CAAC;AAEK,IAAM,eAAe,GAAG,UAC7B,MAA6B;;;;;;gBAEvB,WAAW,GAAG,IAAA,wBAAc,GAAE,CAAC;gBAC/B,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;gBAExB,MAAM,GAAG,0BAA0B,CACvC,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,GAAG,CACX,CAAC;gBAEI,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACjC,QAAQ,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,mBAAmB,GAAG,KAAK,CAAC;gBAG9D,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAEP,qBAAM,IAAA,+BAAsB,EACjE,MAAM,CAAC,MAAM,EACb,WAAW,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,UAAU,EACjB,EAAE,EACF,+BAAsB,CAAC,gBAAgB,EACvC,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,SAAS,CACV,EAAA;;gBAZK,KAAiC,SAYtC,EAZO,mBAAmB,yBAAA,EAAE,KAAK,WAAA;gBAcZ,qBAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAA;;gBAAhD,aAAa,GAAG,SAAgC;gBAEhD,SAAS,GAAG,IAAI,0BAAa,CAAC;oBAClC,QAAQ,EAAE,UAAG,MAAM,CAAC,WAAW,QAAK;iBACrC,CAAC,CAAC;gBAEG,aAAa,GAAG,IAAI,0BAAa,CAAC,SAAS,CAAC,CAAC;gBAElC,qBAAM,aAAa,CAAC,WAAW,CAAC;wBAC/C,kBAAkB,EAAE;4BAClB,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,SAAS,EAAE,MAAM,CAAC,SAAS;4BAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,GAAG,EAAE,MAAM,CAAC,GAAG;4BACf,SAAS,EAAE,sBAAS,CAAC,KAAK;4BAC1B,WAAW,EAAE,wBAAW,CAAC,GAAG;4BAC5B,SAAS,EAAE,mBAAmB;4BAC9B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;4BACvB,YAAY,EAAE,aAAa;4BAC3B,YAAY,EAAE,QAAQ;yBACvB;qBACF,CAAC,EAAA;;gBAfI,QAAQ,GAAG,SAef;gBAEF,sBAAO,QAAQ,EAAC;;;KACjB,CAAC;AA1DW,QAAA,eAAe,mBA0D1B","sourcesContent":["import { Signer, JsonRpcSigner, AbiCoder } from 'ethers';\nimport {\n OrderEntryApi,\n Configuration,\n CreateOrderResponse,\n OrderType,\n TimeInForce,\n} from '@reyaxyz/api-v2-sdk';\nimport {\n signOrdersGatewayOrder,\n OrdersGatewayOrderType,\n scale,\n} from '@reyaxyz/common';\nimport { getReyaNetwork } from '../../utils/network';\nimport { getSdkConfig } from '../../config';\n\nexport type CreateSpotOrderParams = {\n signer: Signer | JsonRpcSigner;\n accountId: number;\n exchangeId: number;\n marketId: number;\n isBuy: boolean;\n limitPx: string;\n qty: string;\n symbol: string;\n expiresAfter?: number;\n};\n\nconst encodeSpotLimitOrderInputs = (\n isBuy: boolean,\n limitPx: string,\n qty: string,\n): string => {\n const baseDelta = isBuy\n ? scale(18)(parseFloat(qty))\n : -scale(18)(parseFloat(qty));\n const price = scale(18)(parseFloat(limitPx));\n return AbiCoder.defaultAbiCoder().encode(\n ['int256', 'uint256'],\n [baseDelta, price],\n );\n};\n\nexport const createSpotOrder = async (\n params: CreateSpotOrderParams,\n): Promise<CreateOrderResponse> => {\n const reyaChainId = getReyaNetwork();\n const config = getSdkConfig();\n\n const inputs = encodeSpotLimitOrderInputs(\n params.isBuy,\n params.limitPx,\n params.qty,\n );\n\n const creationTimestampMs = Date.now();\n const deadline = params.expiresAfter ?? creationTimestampMs + 10000; // 10 seconds in ms\n\n // For spot orders, nonce is just the timestamp (uint64)\n const spotNonce = BigInt(creationTimestampMs);\n\n const { serializedSignature, nonce } = await signOrdersGatewayOrder(\n params.signer,\n reyaChainId,\n params.accountId,\n params.marketId,\n params.exchangeId,\n [],\n OrdersGatewayOrderType.LIMIT_ORDER_SPOT,\n inputs,\n deadline,\n creationTimestampMs,\n spotNonce, // custom nonce for spot orders\n );\n\n const signerAddress = await params.signer.getAddress();\n\n const apiConfig = new Configuration({\n basePath: `${config.apiEndpoint}/v2`,\n });\n\n const orderEntryApi = new OrderEntryApi(apiConfig);\n\n const response = await orderEntryApi.createOrder({\n createOrderRequest: {\n exchangeId: params.exchangeId,\n symbol: params.symbol,\n accountId: params.accountId,\n isBuy: params.isBuy,\n limitPx: params.limitPx,\n qty: params.qty,\n orderType: OrderType.LIMIT,\n timeInForce: TimeInForce.IOC,\n signature: serializedSignature,\n nonce: nonce.toString(),\n signerWallet: signerAddress,\n expiresAfter: deadline,\n },\n });\n\n return response;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"orderV2.d.ts","sourceRoot":"/","sources":["services/orders/orderV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAY,MAAM,QAAQ,CAAC;AACzD,OAAO,EAGL,mBAAmB,EAGpB,MAAM,qBAAqB,CAAC;AAU7B,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,eAAe,WAClB,qBAAqB,KAC5B,QAAQ,mBAAmB,CAkD7B,CAAC"}
1
+ {"version":3,"file":"orderV2.d.ts","sourceRoot":"/","sources":["services/orders/orderV2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAY,MAAM,QAAQ,CAAC;AACzD,OAAO,EAGL,mBAAmB,EAGpB,MAAM,qBAAqB,CAAC;AAS7B,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,eAAe,WAClB,qBAAqB,KAC5B,QAAQ,mBAAmB,CAwD7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reyaxyz/sdk",
3
- "version": "0.142.0",
3
+ "version": "0.142.2",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -26,15 +26,16 @@
26
26
  "prettier:fix": "npx prettier --log-level silent --write './{src,demo,tests}/**/*.{ts,tsx}'",
27
27
  "test": "npx jest --silent",
28
28
  "test:coverage": "jest test --coverage",
29
- "generate:coverage-badges": "npx istanbul-badges-readme --silent"
29
+ "generate:coverage-badges": "npx istanbul-badges-readme --silent",
30
+ "test:spot-order": "npx ts-node scripts/test-spot-order.ts"
30
31
  },
31
32
  "dependencies": {
32
33
  "@reyaxyz/api-v2-sdk": "0.301.5",
33
- "@reyaxyz/common": "0.327.0",
34
+ "@reyaxyz/common": "0.327.2",
34
35
  "axios": "1.6.2",
35
36
  "bignumber.js": "9.1.2",
36
37
  "ethers": "6.9.0"
37
38
  },
38
39
  "packageManager": "pnpm@8.3.1",
39
- "gitHead": "7a37da52b9b99615ae31b1ec1338171f8c7280fc"
40
+ "gitHead": "a976a91d06fb802141215ad1e28dd68e9c6919cf"
40
41
  }
@@ -10,7 +10,6 @@ import {
10
10
  signOrdersGatewayOrder,
11
11
  OrdersGatewayOrderType,
12
12
  scale,
13
- CONDITIONAL_ORDER_SIG_DEADLINE,
14
13
  } from '@reyaxyz/common';
15
14
  import { getReyaNetwork } from '../../utils/network';
16
15
  import { getSdkConfig } from '../../config';
@@ -55,6 +54,11 @@ export const createSpotOrder = async (
55
54
  );
56
55
 
57
56
  const creationTimestampMs = Date.now();
57
+ const deadline = params.expiresAfter ?? creationTimestampMs + 10000; // 10 seconds in ms
58
+
59
+ // For spot orders, nonce is just the timestamp (uint64)
60
+ const spotNonce = BigInt(creationTimestampMs);
61
+
58
62
  const { serializedSignature, nonce } = await signOrdersGatewayOrder(
59
63
  params.signer,
60
64
  reyaChainId,
@@ -64,8 +68,9 @@ export const createSpotOrder = async (
64
68
  [],
65
69
  OrdersGatewayOrderType.LIMIT_ORDER_SPOT,
66
70
  inputs,
67
- CONDITIONAL_ORDER_SIG_DEADLINE,
71
+ deadline,
68
72
  creationTimestampMs,
73
+ spotNonce, // custom nonce for spot orders
69
74
  );
70
75
 
71
76
  const signerAddress = await params.signer.getAddress();
@@ -89,7 +94,7 @@ export const createSpotOrder = async (
89
94
  signature: serializedSignature,
90
95
  nonce: nonce.toString(),
91
96
  signerWallet: signerAddress,
92
- expiresAfter: params.expiresAfter,
97
+ expiresAfter: deadline,
93
98
  },
94
99
  });
95
100