diff --git a/packages/automation/package.json b/packages/automation/package.json index ac9d689..2f17d63 100644 --- a/packages/automation/package.json +++ b/packages/automation/package.json @@ -1,7 +1,7 @@ { "name": "@oasisdex/automation", "packageManager": "yarn@1.22.21", - "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", diff --git a/packages/automation/src/abi-coding.ts b/packages/automation/src/abi-coding.ts index 4bf6d8d..38aa7be 100644 --- a/packages/automation/src/abi-coding.ts +++ b/packages/automation/src/abi-coding.ts @@ -1,9 +1,11 @@ import { utils } from 'ethers'; import { commandAddressMapping, + commandOffchainDataTypeJsonMapping, commandTypeJsonMapping, getDefinitionForCommandAddress, getDefinitionForCommandType, + getOffchainDataDefinitionForCommandType, } from './mapping'; import { CommandContractType, TriggerType, triggerTypeToCommandContractTypeMap } from './types'; @@ -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, @@ -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, @@ -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, @@ -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); +} diff --git a/packages/automation/src/mapping.ts b/packages/automation/src/mapping.ts index 224efc6..2e8d910 100644 --- a/packages/automation/src/mapping.ts +++ b/packages/automation/src/mapping.ts @@ -142,8 +142,28 @@ export const commandTypeJsonMapping: Record = { 'operationName', 'executionLtv', ], + [CommandContractType.DmaAaveTrailingStopLossCommandV2]: [ + 'positionAddress', + 'triggerType', + 'maxCoverage', + 'debtToken', + 'collateralToken', + 'operationName', + 'collateralOracle', + 'collateralAddedRoundId', + 'debtOracle', + 'debtAddedRoundId', + 'trailingDistance', + 'closeToCollateral', + ], +}; +export const commandOffchainDataTypeJsonMapping: Partial> = { + [CommandContractType.DmaAaveTrailingStopLossCommandV2]: [ + 'collateralMaxPriceRoundId', + 'debtClosestPriceRoundId', + 'debtNextPriceRoundId', + ], }; - export const commandAddressMapping: Record< number, Record @@ -227,6 +247,9 @@ export const commandAddressMapping: Record< '0x4A13b02ef24B2906a33e48e8F0AaF343C5316327': { type: CommandContractType.DmaAaveBasicSellCommandV2, }, + '0xea0c35bd1c2fae4d540ce30d9738bc55147f2a9c': { + type: CommandContractType.DmaAaveStopLossCommandV2, + }, }, [EthereumNetwork.BASE]: { '0xb7CB13e4cD2D64e739b5746563978Ab7ee36B064': { @@ -266,7 +289,7 @@ export const commandAddressMapping: Record< ]), ); -export const defaultCommandTypeMapping = { +export const defaultCommandTypeMapping: Record = { [CommandContractType.CloseCommand]: ['uint256', 'uint16', 'uint256'], [CommandContractType.SimpleAAVESellCommand]: [ 'address', @@ -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> = { + [CommandContractType.DmaAaveTrailingStopLossCommandV2]: [ + 'uint80', // collateralMaxPriceRoundId + 'uint80', // debtClosestPriceRoundId + 'uint80', // debtNextPriceRoundId + ], } as const; export function getCommandAddresses(network: number): Record { @@ -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, +): 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, +): 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. diff --git a/packages/automation/src/types.ts b/packages/automation/src/types.ts index e192b6c..5233d5a 100644 --- a/packages/automation/src/types.ts +++ b/packages/automation/src/types.ts @@ -25,6 +25,7 @@ export enum CommandContractType { DmaAaveBasicSellCommandV2 = 'DmaAaveV3BasicSellCommandV2', DmaSparkStopLossCommandV2 = 'DmaSparkStopLossCommandV2', DmaAaveStopLossCommandV2 = 'DmaAaveV3StopLossCommandV2', + DmaAaveTrailingStopLossCommandV2 = 'DmaAaveV3TrailingStopLossCommandV2', } export enum TriggerType { @@ -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 = { @@ -81,6 +83,7 @@ export const triggerTypeToCommandContractTypeMap: Record