@steerprotocol/strategy-utils 3.0.0 → 3.1.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.
@@ -0,0 +1,2 @@
1
+ {
2
+ }
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## [1.2.0-alpha.3](https://github.com/SteerProtocol/strategy-utils-assemblyscript/compare/v1.2.0-alpha.2...v1.2.0-alpha.3) (2023-08-23)
2
+
3
+
4
+ ### Features
5
+
6
+ * :art: Move Config to all RJFS for EDT ([eb63008](https://github.com/SteerProtocol/strategy-utils-assemblyscript/commit/eb63008fbd9ca9ed3dee9ab81336cce89de5c482))
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * :ambulance: Object validation ([74b7a05](https://github.com/SteerProtocol/strategy-utils-assemblyscript/commit/74b7a059f79ea02202e10339c87ebefc5778ffcf))
12
+ * remove type for trigger ([f8c4987](https://github.com/SteerProtocol/strategy-utils-assemblyscript/commit/f8c49877779b82c5265c30c79962947eaa014886))
13
+
1
14
  ## [1.2.0-alpha.2](https://github.com/SteerProtocol/strategy-utils-assemblyscript/compare/v1.2.0-alpha.1...v1.2.0-alpha.2) (2023-08-17)
2
15
 
3
16
 
@@ -5,3 +5,4 @@ export * from './SlidingWindow';
5
5
  export * from './console';
6
6
  export * from './env';
7
7
  export * from './types';
8
+ export * from './triggers'
@@ -1,4 +1,5 @@
1
1
  import { JSON } from "json-as";
2
+ // import { Position } from "@steerprotocol/strategy-utils/assembly";
2
3
  import { Position } from "./types";
3
4
 
4
5
  // NOTE: Trigger functions return true when action should be taken, if false then the strategy can return 'continue' to skip exeuction
@@ -8,28 +9,39 @@ import { Position } from "./types";
8
9
  // if (!shouldTriggerExecution(trigger, triggerObj, _positions, _currentTick, _timeSinceLastExecution)) return 'continue'
9
10
 
10
11
  // Gets active range from the output of LM.getPositions()
11
- export function parseActiveRange(_positions: string): Position {
12
- // _positions will be '[[#,#,#],[#,#,#],[#,#,#]]' presumably. lower, upper, weight
13
- // clean up our list by removing spaces and brackets
14
- let positions = _positions.replaceAll(' ','');
15
- positions = positions.replaceAll('[','');
16
- let rangeArray = positions.split(']',2);
17
- let startTick = rangeArray[0].split(',')[0];
18
- let endRange = rangeArray[1].split(']',2);
19
- const endTicks = endRange[0].split(',');
20
- let endTick = endTicks[endTicks.length-1]
21
- // if trailing comma
22
- if (endTick == '') endTick = endTicks[endTicks.length-2]
23
- const strArrays = [startTick, endTick];
24
- // check null
25
- if (strArrays[0] == '' || strArrays[0] == null || strArrays[1] == '' || strArrays[1] == null) {
26
- return new Position(0, 0, 0);
27
- }
28
- // else return normal
29
- const lowerTick = i32(parseInt(strArrays[0]));
30
- const upperTick = i32(parseInt(strArrays[1]));
12
+ // export function parseActiveRange(_positions: string): Position {
13
+ // // _positions will be '[[#,#,#],[#,#,#],[#,#,#]]' presumably. lower, upper, weight
14
+ // // clean up our list by removing spaces and brackets
15
+ // let positions = _positions.replaceAll(' ','');
16
+ // positions = positions.replaceAll('[','');
17
+ // let rangeArray = positions.split(']',2);
18
+ // let startTick = rangeArray[0].split(',')[0];
19
+ // let endRange = rangeArray[1].split(']',2);
20
+ // const endTicks = endRange[0].split(',');
21
+ // let endTick = endTicks[endTicks.length-1]
22
+ // // if trailing comma
23
+ // if (endTick == '') endTick = endTicks[endTicks.length-2]
24
+ // const strArrays = [startTick, endTick];
25
+ // // check null
26
+ // if (strArrays[0] == '' || strArrays[0] == null || strArrays[1] == '' || strArrays[1] == null) {
27
+ // return new Position(0, 0, 0);
28
+ // }
29
+ // // else return normal
30
+ // const lowerTick = i32(parseInt(strArrays[0]));
31
+ // const upperTick = i32(parseInt(strArrays[1]));
32
+ // // weights shouldn't matter in this context, we just want the total active range
33
+ // return new Position(lowerTick, upperTick, 100);
34
+ // }
35
+
36
+ export function parseActiveRange(_positions: Array<Position>): Position {
37
+
38
+ if (_positions.length == 0) return new Position(0, 0, 0);
39
+ // get first pos start tick and last pos end
40
+ let startTick = _positions[0].startTick
41
+ let endTick = _positions[_positions.length - 1].endTick
42
+
31
43
  // weights shouldn't matter in this context, we just want the total active range
32
- return new Position(lowerTick, upperTick, 100);
44
+ return new Position(startTick, endTick, 100);
33
45
  }
34
46
 
35
47
  export function emptyCurrentPosition(currentPosition: Position): boolean {
@@ -160,10 +172,12 @@ export class TriggerConfigHelper {
160
172
  }
161
173
  }
162
174
 
163
- export function getTriggerExpectedDataTypes(triggerStyle: TriggerStyle): string[] {
175
+ export function getTriggerExpectedDataTypes(triggerStyle: string): string[] {
176
+ // get tirggerStyle
177
+ const style = getTriggerStyle(triggerStyle)
164
178
  // currently we use only this list
165
179
  const typicalTypes = ["Liquidity Manager Positions", "V3 Pool Current Tick", "Time Since Last Execution"]
166
- switch (triggerStyle) {
180
+ switch (style) {
167
181
  case TriggerStyle.DistanceFromCenterOfPositions:
168
182
  return typicalTypes;
169
183
  case TriggerStyle.PercentageChangeFromPositionRange:
@@ -183,43 +197,14 @@ export function getTriggerExpectedDataTypes(triggerStyle: TriggerStyle): string[
183
197
  }
184
198
  }
185
199
 
186
-
187
- export function getExpectedDataTypes(strategyDataConnectors: string[], triggerStyle: string): string {
188
- const style = getTriggerStyle(triggerStyle)
189
- const triggerDatas = getTriggerExpectedDataTypes(style)
190
- const dataList = strategyDataConnectors.concat(triggerDatas)
191
- let completeList = '['
192
- for (let i: i32 = 0; i < dataList.length; i++) {
193
- completeList += (' \"' + dataList[i] + '\"')
194
- if (i != dataList.length-1) completeList += ','
195
- }
196
- completeList += ']'
197
- return completeList
198
- }
199
-
200
- // no AS func overloading yet :(
201
- // export function shouldTriggerExecution_1(triggerStyle: TriggerStyle, triggerOptions: TriggerConfigHelper, dataConnector1: string) : boolean {
202
- // // parse options
203
- // switch (triggerStyle) {
204
- // case TriggerStyle.SpecificPrice:
205
- // // parse current tick from dc1
206
- // const currentTick = parseInt(dataConnector1)
207
- // if (!currentTick) return true
208
- // // tick and over
209
- // return triggerFromSpecifiedPrice(triggerOptions.tickPriceTrigger, currentTick, triggerOptions.triggerWhenOver)
210
- // default:
211
- // return true
212
- // }
213
- // }
214
-
215
200
  // currently implemented as :: ulm positions [0], current tick [1], time since last execution [2]
216
201
  // as more types are added this logic path with be redone
217
202
  export function shouldTriggerExecution(
218
203
  _triggerStyle: string,
219
204
  triggerOptions: TriggerConfigHelper,
220
- dataConnector1: string,
221
- dataConnector2: string,
222
- dataConnector3: string) : boolean {
205
+ dataConnector1: Array<Position>,
206
+ dataConnector2: i64,
207
+ dataConnector3: i64) : boolean {
223
208
 
224
209
  // possible dc inputs
225
210
  let currentPositionRange: Position;
@@ -234,34 +219,34 @@ export function shouldTriggerExecution(
234
219
  case TriggerStyle.DistanceFromCenterOfPositions:
235
220
  // parse ulm positions [0], current tick [1]
236
221
  // @ts-ignore
237
- timeSinceLastExecution = i64(parseInt(dataConnector3))
222
+ timeSinceLastExecution = i64((dataConnector3))
238
223
  if (timeSinceLastExecution >= i64(triggerOptions.elapsedTendTime)) return true
239
224
  currentPositionRange = parseActiveRange(dataConnector1)
240
- currentTick = i64(parseInt(dataConnector2))
225
+ currentTick = i64((dataConnector2))
241
226
  return triggerFromDistance(currentPositionRange, triggerOptions.tickDistanceFromCenter, currentTick)
242
227
 
243
228
  case TriggerStyle.PercentageChangeFromPositionRange:
244
229
  // parse ulm positions [0], current tick [1]
245
- timeSinceLastExecution = i64(parseInt(dataConnector3))
230
+ timeSinceLastExecution = i64((dataConnector3))
246
231
  if (timeSinceLastExecution >= i64(triggerOptions.elapsedTendTime)) return true
247
232
  currentPositionRange= parseActiveRange(dataConnector1)
248
- currentTick = i64(parseInt(dataConnector2))
233
+ currentTick = i64((dataConnector2))
249
234
  return triggerFromPercentage(currentPositionRange, triggerOptions.percentageOfPositionRangeToTrigger, currentTick)
250
235
 
251
236
  case TriggerStyle.PositionsInactive:
252
237
  // parse ulm positions [0], current tick [1]
253
- timeSinceLastExecution = i64(parseInt(dataConnector3))
238
+ timeSinceLastExecution = i64((dataConnector3))
254
239
  if (timeSinceLastExecution >= i64(triggerOptions.elapsedTendTime)) return true
255
240
  currentPositionRange = parseActiveRange(dataConnector1)
256
- currentTick = i64(parseInt(dataConnector2))
241
+ currentTick = i64((dataConnector2))
257
242
  return triggerPositionsInactive(currentPositionRange, currentTick)
258
243
 
259
244
  case TriggerStyle.PricePastPositions:
260
245
  // parse ulm positions [0], current tick [1]
261
- timeSinceLastExecution = i64(parseInt(dataConnector3))
246
+ timeSinceLastExecution = i64((dataConnector3))
262
247
  if (timeSinceLastExecution >= i64(triggerOptions.elapsedTendTime)) return true
263
248
  currentPositionRange = parseActiveRange(dataConnector1)
264
- currentTick = i64(parseInt(dataConnector2))
249
+ currentTick = i64((dataConnector2))
265
250
  return triggerPricePastPositions(currentPositionRange, currentTick, triggerOptions.triggerWhenOver)
266
251
  default:
267
252
  return true
@@ -296,34 +281,197 @@ function getTriggerName(trigger: TriggerStyle): string {
296
281
  }
297
282
  }
298
283
 
284
+ function expectedDataTypesHelper(strategyDataConnectors: string[], triggerStyle: string): string[] {
285
+ // const style = getTriggerStyle(triggerStyle)
286
+ return strategyDataConnectors.concat(getTriggerExpectedDataTypes(triggerStyle))
287
+ // return `"expectedDataTypes": {
288
+ // "hidden": true,
289
+ // "type": "string",
290
+ // "default": "${(fullDataTypes).toString()}",
291
+ // "const": "${(fullDataTypes).toString()}"
292
+ // }`
293
+ }
299
294
 
300
- export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
301
- const triggerList = [
302
- TriggerStyle.DistanceFromCenterOfPositions,
303
- TriggerStyle.None,
304
- TriggerStyle.PercentageChangeFromPositionRange,
305
- TriggerStyle.PositionsInactive,
306
- TriggerStyle.PricePastPositions,
295
+ // @serializable
296
+ // export class TriggerInfo {
297
+ // name: string = '';
298
+ // expectedDataTypes: string[] = [];
299
+ // constructor (_name: string, _expectedDataTypes: string[]) {
300
+ // this.name = _name
301
+ // this.expectedDataTypes = _expectedDataTypes
302
+ // }
303
+ // }
304
+
305
+ export function triggerPropertyHelper(): string {
306
+ // export function triggerPropertyHelper(strategyDataTypes: string[], omit: TriggerStyle[] = []): string {
307
+ // const triggerList = [
308
+ // TriggerStyle.DistanceFromCenterOfPositions,
309
+ // TriggerStyle.None,
310
+ // TriggerStyle.PercentageChangeFromPositionRange,
311
+ // TriggerStyle.PositionsInactive,
312
+ // TriggerStyle.PricePastPositions,
313
+ // ];
314
+
315
+ const triggersObjects: string[] = [
316
+ 'Current Price set distance from center of positions',
317
+ 'Price leaves active range',
318
+ 'Price moves percentage of active range away',
319
+ 'Price moves one way past positions',
320
+ 'None',
307
321
  ];
308
322
 
309
- const filteredTriggers: string[] = [
323
+ const triggerStrings = [
310
324
  'Current Price set distance from center of positions',
311
325
  'Price leaves active range',
312
326
  'Price moves percentage of active range away',
313
327
  'Price moves one way past positions',
314
328
  'None'
315
- ];
329
+ ]
316
330
 
331
+ // return `"triggerStyle": {
332
+ // "enumNames": ${JSON.stringify(triggerStrings)},
333
+ // "enum": ${JSON.stringify(triggersObjects)},
334
+ // "type": "string",
335
+ // "title": "Logic to trigger new positions",
336
+ // "default": "None"
337
+ // }`;
317
338
 
318
339
  return `"triggerStyle": {
319
- "enum": ${JSON.stringify(filteredTriggers)},
320
- "title": "Logic to trigger new positions",
340
+ "enumNames": [
341
+ "Trigger when price moves set distance away from center of liquidity range",
342
+ "Trigger when price leaves active liquidity range",
343
+ "Trigger when price moves a proportion of active liquidity range away",
344
+ "Trigger when price moves out of active range only in one direction",
345
+ "None"
346
+ ],
347
+ "enum": [
348
+ "Current Price set distance from center of positions",
349
+ "Price leaves active range",
350
+ "Price moves percentage of active range away",
351
+ "Price moves one way past positions",
352
+ "None"
353
+ ],
321
354
  "type": "string",
355
+ "title": "Logic to trigger new positions",
322
356
  "default": "None"
323
- }`;
357
+ }`
358
+ }
359
+
360
+ export function configDefinitions(): string {
361
+ return `
362
+ "elapsedTendTime": {
363
+ "type": "number",
364
+ "title": "Max time between tends",
365
+ "description": "If trigger conditions have not been met for this period of time, the strategy will execute regardless of trigger logic to update vault accounting.",
366
+ "default": 1209600
367
+ },
368
+ "bins": {
369
+ "type": "number",
370
+ "title": "Positions",
371
+ "description": "The max number of positions the strategy will make to achieve the desired curve.",
372
+ "detailedDescription": "The strategy will attempt to make this number of positions, but can be limited by available range and pool spacing"
373
+ },
374
+ "reflect": {
375
+ "title": "Reflect Curve Over Y-Axis",
376
+ "type": "boolean",
377
+ "default": false
378
+ },
379
+ "invert": {
380
+ "title": "Invert Curve Over X-Axis",
381
+ "type": "boolean",
382
+ "default": false
383
+ }`
384
+ }
385
+
386
+ export function triggerDependency(): string {
387
+ return `"triggerStyle": {
388
+ "oneOf": [
389
+ {
390
+ "properties": {
391
+ "triggerStyle": {
392
+ "const": "None"
393
+ }
394
+ },
395
+ "required": []
396
+ },
397
+ {
398
+ "properties": {
399
+ "triggerStyle": {
400
+ "const": "Current Price set distance from center of positions"
401
+ },
402
+ "tickDistanceFromCenter": {
403
+ "type": "integer",
404
+ "title": "Tick Distance",
405
+ "description": "The number of basis points (ticks) away from the central price of existing positions",
406
+ "detailedDescription": "The trigger mechanism for new positions is based on a fixed number of ticks from the midpoint of the active range. For instance, with a position range of 0-100 and a tick distance set at 75, the trigger points are calculated 75 ticks on either side of the central tick of our positions, which is 50. This establishes a trigger range extending from -25 to 125. Any current tick falling within this range will not prompt execution. The center of this trigger range is dynamically adjusted based on the locations of future positions."
407
+ },
408
+ "elapsedTendTime": {
409
+ "$ref": "#/definitions/elapsedTendTime"
410
+ }
411
+ },
412
+ "required": [
413
+ "tickDistanceFromCenter",
414
+ "elapsedTendTime"
415
+ ]
416
+ },
417
+ {
418
+ "properties": {
419
+ "triggerStyle": {
420
+ "const": "Price leaves active range"
421
+ },
422
+ "elapsedTendTime": {
423
+ "$ref": "#/definitions/elapsedTendTime"
424
+ }
425
+ },
426
+ "required": [
427
+ "elapsedTendTime"
428
+ ]
429
+ },
430
+ {
431
+ "properties": {
432
+ "triggerStyle": {
433
+ "const": "Price moves percentage of active range away"
434
+ },
435
+ "percentageOfPositionRangeToTrigger": {
436
+ "type": "number",
437
+ "title": "Percentage of Range",
438
+ "description": "Specify the percentage of the total range at which to initiate new positions, where 100% or a value of 1 corresponds to the edge of the range.",
439
+ "detailedDescription": "For a position with a range spanning from 0 to 100 ticks, setting this value to 1 will activate the trigger at the outermost bounds of the range. If the value is set to 0.5, the trigger range narrows to between 25 and 75 ticks. Conversely, setting the value to 2 expands the trigger range, extending it from -50 to 150 ticks."
440
+ },
441
+ "elapsedTendTime": {
442
+ "$ref": "#/definitions/elapsedTendTime"
443
+ }
444
+ },
445
+ "required": [
446
+ "percentageOfPositionRangeToTrigger",
447
+ "elapsedTendTime"
448
+ ]
449
+ },
450
+ {
451
+ "properties": {
452
+ "triggerStyle": {
453
+ "const": "Price moves one way past positions"
454
+ },
455
+ "triggerWhenOver": {
456
+ "type": "boolean",
457
+ "title": "Price Moves Higher",
458
+ "description": "Set 'True' to initiate new positions when the current price (tick) exceeds the level of existing positions. Conversely, mark it as 'False' if new positions should be established when the price is lower than the current positions.",
459
+ "detailedDescription": "When the existing position spans from 0 to 100 ticks, setting the parameter to 'True' will prompt the strategy to execute only if the current tick exceeds 100. In any scenario where the current tick is less than or equal to 100, the strategy will recommend to continue without executing new execution."
460
+ },
461
+ "elapsedTendTime": {
462
+ "$ref": "#/definitions/elapsedTendTime"
463
+ }
464
+ },
465
+ "required": [
466
+ "triggerWhenOver",
467
+ "elapsedTendTime"
468
+ ]
469
+ }
470
+ ]
471
+ }`
324
472
  }
325
473
 
326
- export function allOfTrigger(strategyDataConnectors: string[]): string {
474
+ export function allOfTrigger(): string {
327
475
  return `{
328
476
  "if": {
329
477
  "properties": {
@@ -333,15 +481,7 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
333
481
  }
334
482
  },
335
483
  "then": {
336
- "properties": {
337
- "expectedDataTypes": {
338
- "const": ${getExpectedDataTypes(strategyDataConnectors, "None")},
339
- "default": ${getExpectedDataTypes(strategyDataConnectors, "None")},
340
- "hidden": true,
341
- "type": "string"
342
- }
343
- },
344
- "required": ["expectedDataTypes"]
484
+ "required": []
345
485
  }
346
486
  },
347
487
  {
@@ -360,12 +500,6 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
360
500
  "description": "The number of ticks (basis points) from center price of positions to trigger setting new positions",
361
501
  "detailedDescription": "The static number of ticks from the center of the active range to trigger: if our position goes from 0-100, and we have a tick distance of 75, we will go out 75 ticks both ways from the center of our positions (50). This means we will skip execution only if the current tick is between -25 and 125. Future positions will determine where the center of the trigger range is located."
362
502
  },
363
- "expectedDataTypes": {
364
- "const": ${getExpectedDataTypes(strategyDataConnectors, "Current Price set distance from center of positions")},
365
- "default": ${getExpectedDataTypes(strategyDataConnectors, "Current Price set distance from center of positions")},
366
- "hidden": true,
367
- "type": "string"
368
- },
369
503
  "elapsedTendTime": {
370
504
  "type": "number",
371
505
  "title": "Max time between tends",
@@ -373,7 +507,7 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
373
507
  "default": 1209600
374
508
  }
375
509
  },
376
- "required": ["tickDistanceFromCenter", "expectedDataTypes", "elapsedTendTime"]
510
+ "required": ["tickDistanceFromCenter", "elapsedTendTime"]
377
511
  }
378
512
  },
379
513
  {
@@ -386,12 +520,6 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
386
520
  },
387
521
  "then": {
388
522
  "properties": {
389
- "expectedDataTypes": {
390
- "const": ${getExpectedDataTypes(strategyDataConnectors, "Price leaves active range")},
391
- "default": ${getExpectedDataTypes(strategyDataConnectors, "Price leaves active range")},
392
- "hidden": true,
393
- "type": "string"
394
- },
395
523
  "elapsedTendTime": {
396
524
  "type": "number",
397
525
  "title": "Max time between tends",
@@ -399,7 +527,7 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
399
527
  "default": 1209600
400
528
  }
401
529
  },
402
- "required": ["expectedDataTypes", "elapsedTendTime"]
530
+ "required": ["elapsedTendTime"]
403
531
  }
404
532
  },
405
533
  {
@@ -418,12 +546,6 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
418
546
  "description": "The percentage of the range away to trigger new positions, 100% or 1 would be at the bounds of the range",
419
547
  "detailedDescription": "If you have a simple position ranging from ticks 0 - 100, and you set this value to 1, the trigger range will be the outer bounds. Using 0.5 would make the trigger range 25-75, 2 would make the range -50 - 150."
420
548
  },
421
- "expectedDataTypes": {
422
- "const": ${getExpectedDataTypes(strategyDataConnectors, "Price moves percentage of active range away")},
423
- "default": ${getExpectedDataTypes(strategyDataConnectors, "Price moves percentage of active range away")},
424
- "hidden": true,
425
- "type": "string"
426
- },
427
549
  "elapsedTendTime": {
428
550
  "type": "number",
429
551
  "title": "Max time between tends",
@@ -431,7 +553,7 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
431
553
  "default": 1209600
432
554
  }
433
555
  },
434
- "required": ["percentageOfPositionRangeToTrigger", "expectedDataTypes", "elapsedTendTime"]
556
+ "required": ["percentageOfPositionRangeToTrigger", "elapsedTendTime"]
435
557
  }
436
558
  },
437
559
  {
@@ -450,12 +572,6 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
450
572
  "description": "True for if the strategy should set new positions when the price (tick) is higher than the current positions, false for lower",
451
573
  "detailedDescription": "If our current position ranges from ticks 0 - 100, true will make our bundle execute only when the current tick is higher. Any other case (current tick less than 100) will result in a continue recommendation."
452
574
  },
453
- "expectedDataTypes": {
454
- "const": ${getExpectedDataTypes(strategyDataConnectors, "Price moves one way past positions")},
455
- "default": ${getExpectedDataTypes(strategyDataConnectors, "Price moves one way past positions")},
456
- "hidden": true,
457
- "type": "string"
458
- },
459
575
  "elapsedTendTime": {
460
576
  "type": "number",
461
577
  "title": "Max time between tends",
@@ -463,7 +579,7 @@ export function triggerPropertyHelper(omit: TriggerStyle[] = []): string {
463
579
  "default": 1209600
464
580
  }
465
581
  },
466
- "required": ["triggerWhenOver", "expectedDataTypes", "elapsedTendTime"]
582
+ "required": ["triggerWhenOver", "elapsedTendTime"]
467
583
  }
468
584
  }`;
469
585
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steerprotocol/strategy-utils",
3
- "version": "3.0.0",
3
+ "version": "3.1.2",
4
4
  "description": "Strategy utilities library for Steer Protocol strategies",
5
5
  "main": "assembly/index.ts",
6
6
  "types": "assembly/index.ts",