Skip to content

Commit

Permalink
chore: add aaveTrailingStopLoss (#110)
Browse files Browse the repository at this point in the history
* chore: add `aaveTrailingStopLoss`

* fix: format

* chore: bump version

* chore: bump trigger types (#111)
  • Loading branch information
halaprix authored Feb 22, 2024
1 parent 678af5d commit 55186b3
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 7 deletions.
2 changes: 1 addition & 1 deletion packages/automation/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@oasisdex/automation",
"packageManager": "[email protected]",
"version": "1.6.0-alpha.9",
"version": "1.6.0-alpha.16",
"description": "The set of utilities for Oasis automation",
"homepage": "https://github.com/OasisDEX/common#readme",
"main": "lib/src/index.js",
Expand Down
53 changes: 53 additions & 0 deletions packages/automation/src/abi-coding.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { utils } from 'ethers';
import {
commandAddressMapping,
commandOffchainDataTypeJsonMapping,
commandTypeJsonMapping,
getDefinitionForCommandAddress,
getDefinitionForCommandType,
getOffchainDataDefinitionForCommandType,
} from './mapping';
import { CommandContractType, TriggerType, triggerTypeToCommandContractTypeMap } from './types';

Expand All @@ -21,6 +23,14 @@ export function decodeTriggerDataByType(type: CommandContractType, data: string)
return utils.defaultAbiCoder.decode(paramTypes, data);
}

export function decodeOffchainTriggerDataByType(
type: CommandContractType,
data: string,
): utils.Result {
const paramTypes = getOffchainDataDefinitionForCommandType(type);
return utils.defaultAbiCoder.decode(paramTypes, data);
}

export function decodeTriggerDataByTriggerType(
triggerType: TriggerType,
data: string,
Expand All @@ -30,6 +40,15 @@ export function decodeTriggerDataByTriggerType(
return utils.defaultAbiCoder.decode(paramTypes, data);
}

export function decodeOffchainTriggerDataByTriggerType(
triggerType: TriggerType,
data: string,
): utils.Result {
const type = triggerTypeToCommandContractTypeMap[triggerType];
const paramTypes = getOffchainDataDefinitionForCommandType(type);
return utils.defaultAbiCoder.decode(paramTypes, data);
}

export function decodeTriggerDataAsJson(
commandAddress: string,
network: number,
Expand Down Expand Up @@ -67,6 +86,23 @@ export function decodeTriggerDataByTriggerTypeAsJson(
return acc;
}, {});
}

export function decodeOffchainTriggerDataByTriggerTypeAsJson(
triggerType: TriggerType,
data: string,
): utils.Result {
const type = triggerTypeToCommandContractTypeMap[triggerType];
const arr: any[] = decodeOffchainTriggerDataByType(type, data) as any[];
const offchainDataType = commandOffchainDataTypeJsonMapping[type];
if (!offchainDataType) {
throw new Error(`No offchain data mapping for type ${type}`);
}
return arr.reduce((acc, curr, idx) => {
acc[offchainDataType[idx]] = curr.toString();
return acc;
}, {});
}

export function encodeTriggerData(
commandAddress: string,
network: number,
Expand All @@ -89,3 +125,20 @@ export function encodeTriggerDataByTriggerType(
const paramTypes = getDefinitionForCommandType(commandType);
return utils.defaultAbiCoder.encode(paramTypes, values);
}

export function encodeOffchainTriggerDataByType(
type: CommandContractType,
values: readonly any[],
): string {
const paramTypes = getOffchainDataDefinitionForCommandType(type);
return utils.defaultAbiCoder.encode(paramTypes, values);
}

export function encodeTriggerOffchainDataByTriggerType(
triggerType: TriggerType,
values: readonly any[],
): string {
const commandType = triggerTypeToCommandContractTypeMap[triggerType];
const paramTypes = getOffchainDataDefinitionForCommandType(commandType);
return utils.defaultAbiCoder.encode(paramTypes, values);
}
95 changes: 93 additions & 2 deletions packages/automation/src/mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,28 @@ export const commandTypeJsonMapping: Record<CommandContractType, string[]> = {
'operationName',
'executionLtv',
],
[CommandContractType.DmaAaveTrailingStopLossCommandV2]: [
'positionAddress',
'triggerType',
'maxCoverage',
'debtToken',
'collateralToken',
'operationName',
'collateralOracle',
'collateralAddedRoundId',
'debtOracle',
'debtAddedRoundId',
'trailingDistance',
'closeToCollateral',
],
};
export const commandOffchainDataTypeJsonMapping: Partial<Record<CommandContractType, string[]>> = {
[CommandContractType.DmaAaveTrailingStopLossCommandV2]: [
'collateralMaxPriceRoundId',
'debtClosestPriceRoundId',
'debtNextPriceRoundId',
],
};

export const commandAddressMapping: Record<
number,
Record<string, CommandContractInfo>
Expand Down Expand Up @@ -227,6 +247,9 @@ export const commandAddressMapping: Record<
'0x4A13b02ef24B2906a33e48e8F0AaF343C5316327': {
type: CommandContractType.DmaAaveBasicSellCommandV2,
},
'0xea0c35bd1c2fae4d540ce30d9738bc55147f2a9c': {
type: CommandContractType.DmaAaveStopLossCommandV2,
},
},
[EthereumNetwork.BASE]: {
'0xb7CB13e4cD2D64e739b5746563978Ab7ee36B064': {
Expand Down Expand Up @@ -266,7 +289,7 @@ export const commandAddressMapping: Record<
]),
);

export const defaultCommandTypeMapping = {
export const defaultCommandTypeMapping: Record<CommandContractType, ParamDefinition> = {
[CommandContractType.CloseCommand]: ['uint256', 'uint16', 'uint256'],
[CommandContractType.SimpleAAVESellCommand]: [
'address',
Expand Down Expand Up @@ -379,6 +402,31 @@ export const defaultCommandTypeMapping = {
'bytes32', // operationName
'uint256', // executionLTV
],
[CommandContractType.DmaAaveTrailingStopLossCommandV2]: [
'address', //positionAddress
'uint16', // triggerType
'uint256', // maxCoverage
'address', // debtToken
'address', // collateralToken
'bytes32', // operationName
'address', // collateralOracle
'uint80', // collateralAddedRoundId
'address', // debtOracle
'uint80', // debtAddedRoundId
'uint256', // trailingDistance
'bool', // closeToCollateral
],
} as const;

export const defaultCommandOffchainDataTypeMapping: Partial<Record<
CommandContractType,
ParamDefinition
>> = {
[CommandContractType.DmaAaveTrailingStopLossCommandV2]: [
'uint80', // collateralMaxPriceRoundId
'uint80', // debtClosestPriceRoundId
'uint80', // debtNextPriceRoundId
],
} as const;

export function getCommandAddresses(network: number): Record<CommandContractType, string[]> {
Expand Down Expand Up @@ -415,6 +463,49 @@ export function getDefinitionForCommandType(type: CommandContractType): ParamDef
return defaultCommandTypeMapping[type];
}

/**
* Retrieves the offchain data definition for a given command type.
* @param type - The command type.
* @returns The offchain data definition for the command type.
* @throws Error if the command type is unknown.
*/
export function getOffchainDataDefinitionForCommandType(
type: Partial<CommandContractType>,
): ParamDefinition {
const offchainDataType = defaultCommandOffchainDataTypeMapping[type];
if (!offchainDataType) {
throw new Error(
`Unknown command type ${type}. Supported types: ${Object.keys(
defaultCommandOffchainDataTypeMapping,
).join(', ')}.`,
);
}

return offchainDataType;
}

/**
* Retrieves the offchain data definition for a given trigger type.
* @param triggerType - The trigger type for which to retrieve the offchain data definition.
* @returns The offchain data definition for the specified trigger type.
* @throws An error if the command type is unknown or not supported.
*/
export function getOffchainDataDefinitionForTriggerType(
triggerType: Partial<TriggerType>,
): ParamDefinition {
const type = triggerTypeToCommandContractTypeMap[triggerType];
const offchainDataType = defaultCommandOffchainDataTypeMapping[type];
if (!offchainDataType) {
throw new Error(
`Unknown command type ${type}. Supported types: ${Object.keys(
defaultCommandOffchainDataTypeMapping,
).join(', ')}.`,
);
}

return offchainDataType;
}

/**
* Retrieves the parameter definition for a given trigger type.
* @param triggerType The type of trigger.
Expand Down
11 changes: 7 additions & 4 deletions packages/automation/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export enum CommandContractType {
DmaAaveBasicSellCommandV2 = 'DmaAaveV3BasicSellCommandV2',
DmaSparkStopLossCommandV2 = 'DmaSparkStopLossCommandV2',
DmaAaveStopLossCommandV2 = 'DmaAaveV3StopLossCommandV2',
DmaAaveTrailingStopLossCommandV2 = 'DmaAaveV3TrailingStopLossCommandV2',
}

export enum TriggerType {
Expand All @@ -49,10 +50,11 @@ export enum TriggerType {
SparkStopLossToDebtV2 = 118,
DmaAaveBasicBuyV2 = 121,
DmaAaveBasicSellV2 = 122,
DmaAaveStopLossToCollateralV2 = 123,
DmaAaveStopLossToDebtV2 = 124,
DmaSparkStopLossToCollateralV2 = 125,
DmaSparkStopLossToDebtV2 = 126,
DmaAaveStopLossToCollateralV2 = 127,
DmaAaveStopLossToDebtV2 = 128,
DmaSparkStopLossToCollateralV2 = 129,
DmaSparkStopLossToDebtV2 = 130,
DmaAaveTrailingStopLossV2 = 10006,
}

export const triggerTypeToCommandContractTypeMap: Record<TriggerType, CommandContractType> = {
Expand Down Expand Up @@ -81,6 +83,7 @@ export const triggerTypeToCommandContractTypeMap: Record<TriggerType, CommandCon
[TriggerType.DmaAaveStopLossToDebtV2]: CommandContractType.DmaAaveStopLossCommandV2,
[TriggerType.DmaSparkStopLossToCollateralV2]: CommandContractType.DmaSparkStopLossCommandV2,
[TriggerType.DmaSparkStopLossToDebtV2]: CommandContractType.DmaSparkStopLossCommandV2,
[TriggerType.DmaAaveTrailingStopLossV2]: CommandContractType.DmaAaveTrailingStopLossCommandV2,
};

export enum TriggerGroupType {
Expand Down

0 comments on commit 55186b3

Please sign in to comment.