From fccc9a02415e529798783743c7ab83ad6fee5f14 Mon Sep 17 00:00:00 2001 From: rabi-siddique Date: Wed, 18 Dec 2024 16:24:12 +0500 Subject: [PATCH] ci: validate liquidating vaults --- .github/scripts/changePrice.mjs | 3 +- .github/scripts/checkLiquidation.mjs | 157 +++++++++++++++++++++++++++ .github/workflows/liquidation.yml | 13 ++- .github/workflows/pr.yaml | 2 +- package.json | 2 +- yarn.lock | 44 +++----- 6 files changed, 186 insertions(+), 35 deletions(-) create mode 100644 .github/scripts/checkLiquidation.mjs diff --git a/.github/scripts/changePrice.mjs b/.github/scripts/changePrice.mjs index 707293b2..913988c7 100644 --- a/.github/scripts/changePrice.mjs +++ b/.github/scripts/changePrice.mjs @@ -24,9 +24,8 @@ const setAtomPrice = async (amount, containerName, agoricNet) => { }; const command = `${agops} oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price ${amount} --keyring-backend=test`; - const { stdout, stderr } = await execa('docker', ['exec', containerName, command], { env, shell: true }); + const { stdout } = await execa('docker', ['exec', containerName, command], { env, shell: true }); - assert.strictEqual(stderr, '', `Expected stderr to be empty, but received: '${stderr}'`); console.log('Standard output:', stdout); } catch (error) { console.error('Error:', error); diff --git a/.github/scripts/checkLiquidation.mjs b/.github/scripts/checkLiquidation.mjs new file mode 100644 index 00000000..7ac30d31 --- /dev/null +++ b/.github/scripts/checkLiquidation.mjs @@ -0,0 +1,157 @@ +// @ts-check +import fetch from 'node-fetch'; +import assert from 'assert'; +const delay = (ms) => { + return new Promise((resolve) => setTimeout(resolve, ms)); +}; + +const states = { + liquidated: 'liquidated', + liquidating: 'liquidating', +}; + +const expectedLiquidating = { + ids: [ + 'published.vaultFactory.managers.manager0.vaults.vault10-liquidating', + 'published.vaultFactory.managers.manager0.vaults.vault11-liquidating', + 'published.vaultFactory.managers.manager0.vaults.vault12-liquidating', + ], + debts: ['100500000', '103515000', '105525000'], + balance: ['15000000', '15000000', '15000000'], + denom: 'ATOM', +}; + +const expectedLiquidated = { + ids: [ + 'published.vaultFactory.managers.manager0.vaults.vault10-liquidated', + 'published.vaultFactory.managers.manager0.vaults.vault11-liquidated', + 'published.vaultFactory.managers.manager0.vaults.vault12-liquidated', + ], + debts: ['0', '0', '0'], + balance: ['3425146', '3077900', '2846403'], + denom: 'ATOM', +}; + +const validate = async ({ + apiUrl, + maxRetries, + retryDuration, + expectedIds, + expectedDebts, + expectedBalance, + expectedDenom, + filterState, +}) => { + console.log(`Checking ${filterState} vaults...`); + let retries = 0; + + while (retries < maxRetries) { + try { + const graphqlQuery = { + query: `query { + vaultLiquidations (filter: {state: {equalTo: "${filterState}"}}) { + nodes { + id + denom + debt + state + balance + } + } + }`, + }; + + const response = await fetch(apiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + body: JSON.stringify(graphqlQuery), + }); + + const jsonResponse = await response.json(); + console.log('Response:', JSON.stringify(jsonResponse)); + + const nodes = jsonResponse?.data?.vaultLiquidations?.nodes || []; + if (nodes.length !== 3) { + console.error(`Attempt ${retries + 1}: No data available`); + retries++; + await delay(retryDuration); + continue; + } + + nodes.sort((a, b) => a.id.localeCompare(b.id)); + console.log('Sorted Nodes:', JSON.stringify(nodes)); + + // Validate Ids + assert.strictEqual(nodes[0].id, expectedIds[0]); + assert.strictEqual(nodes[1].id, expectedIds[1]); + assert.strictEqual(nodes[2].id, expectedIds[2]); + + // Validate Debts + assert.strictEqual(nodes[0].debt, expectedDebts[0]); + assert.strictEqual(nodes[1].debt, expectedDebts[1]); + assert.strictEqual(nodes[2].debt, expectedDebts[2]); + + // Validate Denom + assert.strictEqual(nodes[0].denom, expectedDenom); + assert.strictEqual(nodes[1].denom, expectedDenom); + assert.strictEqual(nodes[2].denom, expectedDenom); + + // Validate Balance + assert.strictEqual(nodes[0].balance, expectedBalance[0]); + assert.strictEqual(nodes[1].balance, expectedBalance[1]); + assert.strictEqual(nodes[2].balance, expectedBalance[2]); + + console.log('All validations passed successfully.'); + return; + } catch (error) { + console.error(`Error on attempt ${retries + 1} fetching active vaults:`, error); + retries++; + await delay(retryDuration); + } + } + + console.error('Maximum retry attempts reached. Exiting...'); + process.exit(1); +}; + +const main = async () => { + console.log('Starting main process...'); + + const apiUrl = process.env.API_URL || 'http://localhost:3000/'; + console.log(`API URL set to: ${apiUrl}`); + + try { + console.log('Validating liquidating vaults...'); + await validate({ + apiUrl, + expectedIds: expectedLiquidating.ids, + expectedBalance: expectedLiquidating.balance, + expectedDenom: expectedLiquidating.denom, + expectedDebts: expectedLiquidating.debts, + maxRetries: 6, + retryDuration: 3 * 60 * 1000, + filterState: states.liquidating, + }); + console.log('Validation successful for liquidating vaults.'); + + console.log('Validating liquidated vaults...'); + await validate({ + apiUrl, + expectedIds: expectedLiquidated.ids, + expectedBalance: expectedLiquidated.balance, + expectedDenom: expectedLiquidated.denom, + expectedDebts: expectedLiquidated.debts, + maxRetries: 3, + retryDuration: 2 * 60 * 1000, + filterState: states.liquidated, + }); + console.log('Validation successful for liquidated vaults.'); + } catch (error) { + console.error('Validation failed:', error); + } +}; + +main(); diff --git a/.github/workflows/liquidation.yml b/.github/workflows/liquidation.yml index cb0f38d8..60e4aa38 100644 --- a/.github/workflows/liquidation.yml +++ b/.github/workflows/liquidation.yml @@ -48,7 +48,7 @@ jobs: run: node .github/scripts/getActiveVaults.mjs env: apiUrl: 'http://localhost:3000/' - expectedVaults: '7' + expectedVaults: 7 - name: Create Vault with 100 Minted and 15 Collateral run: node .github/scripts/createVault.mjs @@ -122,3 +122,14 @@ jobs: amount: 9.99 containerName: agd agoricNet: local + + - name: Check liquidation indexing + run: node .github/scripts/checkLiquidation.mjs + env: + apiUrl: 'http://localhost:3000/' + + - name: Get active vaults + run: node .github/scripts/getActiveVaults.mjs + env: + apiUrl: 'http://localhost:3000/' + expectedVaults: 7 diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 7e5e2084..c19f2b3a 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest services: a3p: - image: ghcr.io/agoric/agoric-3-proposals@sha256:644e09bf041e5588570ff9a49e6129cc468e9c8458417541027e8532cb91083b + image: ghcr.io/agoric/agoric-3-proposals:use-upgrade-17 ports: - 26657:26657 postgres: diff --git a/package.json b/package.json index 4f8f205b..e08a1b1f 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@cosmjs/stargate": "^0.28.9", "@subql/cli": "^5.4.0", - "@subql/node-cosmos": "4.2.1", + "@subql/node-cosmos": "^4.2.1", "@subql/testing": "latest", "execa": "^9.5.2", "prettier": "^3.4.2", diff --git a/yarn.lock b/yarn.lock index c75cf26d..3e88d8c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3228,9 +3228,9 @@ __metadata: languageName: node linkType: hard -"@subql/common-cosmos@npm:5.0.6": - version: 5.0.6 - resolution: "@subql/common-cosmos@npm:5.0.6" +"@subql/common-cosmos@npm:5.1.0": + version: 5.1.0 + resolution: "@subql/common-cosmos@npm:5.1.0" dependencies: "@cosmwasm/ts-codegen": "npm:^1.11.1" "@protobufs/cosmos": "npm:^0.1.0" @@ -3240,7 +3240,7 @@ __metadata: "@protobufs/google": "npm:^0.0.10" "@protobufs/ibc": "npm:^0.1.0" "@protobufs/tendermint": "npm:^0.0.10" - "@subql/common": "npm:^5.2.1" + "@subql/common": "npm:^5.2.2" "@subql/types-cosmos": "npm:4.0.0" "@subql/x-cosmology-telescope": "npm:^1.4.14" fs-extra: "npm:^11.1.1" @@ -3250,11 +3250,11 @@ __metadata: class-transformer: "*" class-validator: "*" ejs: "*" - checksum: 10c0/7c1b2beb1d0497d1aa4bbf987c2bd91ccbe4f13456259dcdd9dc6fae10e791e7efdf6e01061ce35e1e219dd41429fb639595053574b75f301d911061af268ca1 + checksum: 10c0/83f6eabcdf6dcf2d9d8e499201f7751eb2009ec0c501be2c58b0e269ee40d77d34db90090562afbf91ff10bf9adaec9e04aff025766829200c95f035eff58c4b languageName: node linkType: hard -"@subql/common@npm:5.2.2": +"@subql/common@npm:5.2.2, @subql/common@npm:^5.2.2": version: 5.2.2 resolution: "@subql/common@npm:5.2.2" dependencies: @@ -3271,22 +3271,6 @@ __metadata: languageName: node linkType: hard -"@subql/common@npm:^5.2.1": - version: 5.2.1 - resolution: "@subql/common@npm:5.2.1" - dependencies: - "@subql/types-core": "npm:2.0.0" - axios: "npm:^0.28.0" - class-transformer: "npm:^0.5.1" - class-validator: "npm:^0.14.1" - js-yaml: "npm:^4.1.0" - reflect-metadata: "npm:^0.1.14" - semver: "npm:^7.6.3" - update-notifier: "npm:^5.1.0" - checksum: 10c0/02ac5e46489e9eeb73f01c007e868d491f415462d654149bb296f1c4f0d74ff67b4881458a154f237a1e88df7f4a99fdf0ff44739b85ae44b871234642753fc6 - languageName: node - linkType: hard - "@subql/node-core@npm:^16.1.0": version: 16.1.0 resolution: "@subql/node-core@npm:16.1.0" @@ -3319,9 +3303,9 @@ __metadata: languageName: node linkType: hard -"@subql/node-cosmos@npm:4.2.1": - version: 4.2.1 - resolution: "@subql/node-cosmos@npm:4.2.1" +"@subql/node-cosmos@npm:^4.2.1": + version: 4.3.0 + resolution: "@subql/node-cosmos@npm:4.3.0" dependencies: "@cosmjs/cosmwasm-stargate": "npm:^0.32.4" "@cosmjs/proto-signing": "npm:^0.32.4" @@ -3333,9 +3317,9 @@ __metadata: "@nestjs/event-emitter": "npm:^2.0.0" "@nestjs/platform-express": "npm:^9.4.0" "@nestjs/schedule": "npm:^3.0.1" - "@subql/common": "npm:^5.2.1" - "@subql/common-cosmos": "npm:5.0.6" - "@subql/node-core": "npm:^15.0.2" + "@subql/common": "npm:^5.2.2" + "@subql/common-cosmos": "npm:5.1.0" + "@subql/node-core": "npm:^16.1.0" "@subql/types-cosmos": "npm:4.0.0" lodash: "npm:^4.17.21" protobufjs: "npm:^6.11.4" @@ -3346,7 +3330,7 @@ __metadata: "@subql/utils": "*" bin: subql-node-cosmos: ./bin/run - checksum: 10c0/950dc4aae8bbca6b47c8e618c44d2d7c63ea39206d748f3a4d57a105e88509447fa72c0f6d6fd92b0394aec030f1f9cf932715d864e031cf0ebe49adbf4dcd74 + checksum: 10c0/78cc7dbde1cb39465ec3d1f231105a69e33cd7eb98bcb06d8aa45264ee9eb3b64777147ead5d6d6b9ab92bcfed73dff6344fbb8b23233dc7fda0d5f2885d124a languageName: node linkType: hard @@ -4121,7 +4105,7 @@ __metadata: dependencies: "@cosmjs/stargate": "npm:^0.28.9" "@subql/cli": "npm:^5.4.0" - "@subql/node-cosmos": "npm:4.2.1" + "@subql/node-cosmos": "npm:^4.2.1" "@subql/testing": "npm:latest" "@subql/types-cosmos": "npm:^4.0.0" "@subql/utils": "npm:^2.17.0"