From fbd4b2a925b17c56578b29f87dea4db7cb4b30e4 Mon Sep 17 00:00:00 2001 From: simke9445 Date: Fri, 22 Mar 2024 01:02:25 +0100 Subject: [PATCH] add logic for hydrating variables before resolving job activity --- src/refs.injective.json | 4 +- src/sdk.ts | 106 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 107 insertions(+), 3 deletions(-) diff --git a/src/refs.injective.json b/src/refs.injective.json index ed4b7c8..f847c5b 100644 --- a/src/refs.injective.json +++ b/src/refs.injective.json @@ -1,11 +1,11 @@ { "testnet": { "warp-controller": { - "codeId": "7967", + "codeId": "7991", "address": "inj1u56l96hs08hqznj0c202arftmh9j3c7m9dylpy" }, "warp-resolver": { - "codeId": "7971", + "codeId": "7990", "address": "inj1pku5zgartl3xdlr509u3wjfs48k2lqylpscydf" }, "warp-templates": { diff --git a/src/sdk.ts b/src/sdk.ts index 3b51536..1510a11 100644 --- a/src/sdk.ts +++ b/src/sdk.ts @@ -17,6 +17,7 @@ import { cosmosMsgToCreateTxMsg } from './utils'; import { warp_templates } from './types/contracts/warp_templates'; import { Job, parseJob } from './types/job'; import { warp_account_tracker } from './types/contracts'; +import { cloneDeep } from 'lodash'; const FEE_ADJUSTMENT_FACTOR = 8; @@ -57,7 +58,9 @@ export class WarpSdk { } public async isJobActive(jobId: string): Promise { - const job = await this.job(jobId); + let job = await this.job(jobId); + + job = await this.replaceVariableReferences(job); for (let execution of job.executions) { const isCondActive = await this.condition.resolveCond(execution.condition, job); @@ -70,6 +73,22 @@ export class WarpSdk { return false; } + public async replaceVariableReferences(job: Job): Promise { + let resolvedVars: warp_resolver.Variable[] = []; + + for (const variable of job.vars) { + const replacedVariable = await this.replaceReferencesInVariable(variable, resolvedVars); + + const resolvedValue: string = await this.condition.resolveVariable(replacedVariable, (v) => String(v), job); + + this.updateResolvedVars(replacedVariable, resolvedValue, resolvedVars); + } + + job.vars = resolvedVars; + + return job; + } + public async jobs(opts: warp_controller.QueryJobsMsg = {}): Promise { const { jobs } = await contractQuery< Extract, @@ -463,4 +482,89 @@ export class WarpSdk { return this.wallet.tx(txPayload); } + + // private + private async replaceReferencesInVariable( + inputVariable: warp_resolver.Variable, + resolvedVars: warp_resolver.Variable[] + ): Promise { + const variable = cloneDeep(inputVariable); + + if ('query' in variable && variable.query.init_fn) { + let q = this.replaceReferencesInCustom(variable.query.init_fn.query, resolvedVars); + + variable.query.init_fn.query = this.replaceReferencesInObject(q, resolvedVars); + } + + return variable; + } + + private replaceReferencesInCustom( + q: warp_resolver.QueryRequestFor_String, + resolvedVars: warp_resolver.Variable[] + ): warp_resolver.QueryRequestFor_String { + if ('custom' in q) { + let parsed = JSON.parse(q.custom); + let replaced = this.replaceReferencesInObject(parsed, resolvedVars); + + return { + custom: JSON.stringify(replaced), + }; + } + + return q; + } + + private replaceReferencesInObject(query: any, resolvedVars: warp_resolver.Variable[]): any { + let jsonString = JSON.stringify(query); + + resolvedVars.forEach((variable) => { + const varName = this.extractVariableName(variable); + const varValue = this.extractVariableValue(variable); + const reference = new RegExp(`\\$warp.variable.${varName}`, 'g'); + + jsonString = jsonString.replace(reference, varValue); + }); + + return JSON.parse(jsonString); + } + + private updateResolvedVars( + variable: warp_resolver.Variable, + resolvedValue: string, + resolvedVars: warp_resolver.Variable[] + ): void { + this.updateVariableValue(variable, resolvedValue); + resolvedVars.push(variable); + } + + private updateVariableValue(variable: warp_resolver.Variable, value: string): void { + if ('static' in variable) { + variable.static.value = value; + } else if ('external' in variable) { + variable.external.value = value; + } else if ('query' in variable) { + variable.query.value = value; + } + } + + private extractVariableName(variable: warp_resolver.Variable): string { + if ('static' in variable) { + return variable.static.name; + } else if ('external' in variable) { + return variable.external.name; + } else if ('query' in variable) { + return variable.query.name; + } + } + + private extractVariableValue(variable: warp_resolver.Variable): string { + if ('static' in variable) { + return variable.static.value; + } else if ('external' in variable) { + return variable.external.value; + } else if ('query' in variable) { + return variable.query.value; + } + } }