From 3d19e049d49140b326dc2d99afac53d06d6b1103 Mon Sep 17 00:00:00 2001 From: Geoff Lee Date: Mon, 28 Mar 2022 16:17:38 +0900 Subject: [PATCH] update pseudo-feeder to use timeout_commit in config.toml (#70) * update pseudo-feeder to use timeout_commit in config.toml * feat: update core and fcd image refactor: pseudo-feeder Co-authored-by: Paul Kim --- docker-compose.yml | 10 +++-- pseudo-feeder/index.ts | 78 +++++++++++++++++++++------------ pseudo-feeder/package-lock.json | 63 ++++++++++++++++++++------ pseudo-feeder/package.json | 6 ++- 4 files changed, 108 insertions(+), 49 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ddf5750..8816729 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: terrad: - image: terramoney/localterra-core:0.5.14 + image: terramoney/localterra-core:0.5.17 pull_policy: always volumes: - ./config:/root/.terra/config @@ -15,10 +15,12 @@ services: - "9091:9091" command: terrad start oracle: - image: terramoney/pseudo-feeder:0.5.5 + image: terramoney/pseudo-feeder:0.5.6 pull_policy: always depends_on: - terrad + volumes: + - ./config/config.toml:/app/config.toml networks: - terra environment: @@ -40,7 +42,7 @@ services: # ports: # - "6379:6379" fcd-collector: - image: terramoney/fcd:1.0.11 + image: terramoney/fcd:1.0.14 depends_on: - terrad - postgres @@ -52,7 +54,7 @@ services: command: collector restart: unless-stopped fcd-api: - image: terramoney/fcd:1.0.11 + image: terramoney/fcd:1.0.14 depends_on: - terrad - postgres diff --git a/pseudo-feeder/index.ts b/pseudo-feeder/index.ts index 00d551b..c093ce2 100644 --- a/pseudo-feeder/index.ts +++ b/pseudo-feeder/index.ts @@ -4,8 +4,10 @@ import { LCDClient, MnemonicKey, MsgAggregateExchangeRateVote, - Fee } from "@terra-money/terra.js"; +import { parse } from "toml"; +import * as fs from "fs"; +import * as ms from "ms" const { MAINNET_LCD_URL = "https://lcd.terra.dev", @@ -15,6 +17,18 @@ const { MNEMONIC = "satisfy adjust timber high purchase tuition stool faith fine install that you unaware feed domain license impose boss human eager hat rent enjoy dawn", } = process.env; +const config = parse(fs.readFileSync("./config.toml").toString()); + +/* unused +const timeout_propose = toMs(config.consensus.timeout_propose); // 3s by default +const timeout_propose_delta = toMs(config.consensus.timeout_propose_delta); // 500ms by default +const timeout_prevote = toMs(config.consensus.timeout_prevote); // 1s by default +const timeout_prevote_delta = toMs(config.consensus.timeout_prevote_delta); // 500ms by default +const timeout_prevcommit = toMs(config.consensus.timeout_precommit); // 1s by default +const timeout_precommit_delta = toMs(config.consensus.timeout_precommit_delta); // 500ms by default +*/ +const timeoutCommit = ms(config.consensus.timeout_commit); // 5s by default + function delay(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); } @@ -52,10 +66,10 @@ async function waitForFirstBlock(client: LCDClient) { console.info("waiting for first block"); while (!shouldTerminate) { + await delay(timeoutCommit); shouldTerminate = await client.tendermint .blockInfo() .then(async (blockInfo) => { - await delay(5000); if (blockInfo?.block) { return +blockInfo.block?.header.height > 0; @@ -65,7 +79,7 @@ async function waitForFirstBlock(client: LCDClient) { }) .catch(async (err) => { console.error(err); - await delay(1000); + await delay(timeoutCommit); return false; }); @@ -97,23 +111,33 @@ async function loop() { let lastSuccessVotePeriod: number; let lastSuccessVoteMsg: MsgAggregateExchangeRateVote; + // to get initial rates and params + let [rates, oracleParams] = await Promise.all([ + mainnetClient.oracle.exchangeRates(), + testnetClient.oracle.parameters(), + ]); + + setInterval(async () => { + try { + [rates, oracleParams] = await Promise.all([ + mainnetClient.oracle.exchangeRates(), + testnetClient.oracle.parameters(), + ]); + } catch (e) { } + }, 10000); // 5s -> 10s: to avoid rate limit + while (true) { - const [rates, oracleParams, latestBlock] = await Promise.all([ - mainnetClient.oracle.exchangeRates(), - testnetClient.oracle.parameters(), - testnetClient.tendermint.blockInfo(), - ]) + const latestBlock = await testnetClient.tendermint.blockInfo(); const oracleVotePeriod = oracleParams.vote_period; const currentBlockHeight = parseInt(latestBlock.block.header.height, 10); const currentVotePeriod = Math.floor(currentBlockHeight / oracleVotePeriod); const indexInVotePeriod = currentBlockHeight % oracleVotePeriod; - if ( - (lastSuccessVotePeriod && lastSuccessVotePeriod === currentVotePeriod) || - indexInVotePeriod >= oracleVotePeriod - 1 + (lastSuccessVotePeriod && (lastSuccessVotePeriod === currentVotePeriod)) || + (indexInVotePeriod >= oracleVotePeriod - 1) ) { - await delay(1000); + await delay(timeoutCommit); continue; } @@ -134,22 +158,18 @@ async function loop() { ); const msgs = [lastSuccessVoteMsg, voteMsg.getPrevote()].filter(Boolean); - const tx = await wallet.createAndSignTx({ msgs, fee: new Fee(200000, '30000uusd') }); - - await testnetClient.tx - .broadcast(tx) - .then((result) => { - console.log( - `vote_period: ${currentVotePeriod}, txhash: ${result.txhash}` - ); - lastSuccessVotePeriod = currentVotePeriod; - lastSuccessVoteMsg = voteMsg; - }) - .catch((err) => { - console.error(err.message); - }); - - await delay(5000); + try { + const tx = await wallet.createAndSignTx({ msgs }); + const result = await testnetClient.tx.broadcast(tx); + console.log(`vote_period: ${currentVotePeriod}, txhash: ${result.txhash}`); + lastSuccessVotePeriod = currentVotePeriod; + lastSuccessVoteMsg = voteMsg; + } + catch (err) { + console.log(err.message); + delay(timeoutCommit); + }; + await delay(timeoutCommit * (oracleVotePeriod - 1)); // (period-1) because of broadcast } } @@ -158,6 +178,6 @@ async function loop() { while (true) { await loop().catch(console.error); - await delay(5000); + await delay(timeoutCommit * 5); } })(); diff --git a/pseudo-feeder/package-lock.json b/pseudo-feeder/package-lock.json index b6cfbaa..1a02a8b 100644 --- a/pseudo-feeder/package-lock.json +++ b/pseudo-feeder/package-lock.json @@ -9,11 +9,13 @@ "version": "0.5.5", "license": "MIT", "dependencies": { - "@terra-money/terra.js": "^3.0.3", + "@terra-money/terra.js": "^3.0.8", "@types/node": "^17.0.8", "bluebird": "^3.7.2", + "ms": "^2.1.3", "node-fetch": "^3.1.1", - "ts-node": "^10.0.0", + "toml": "^3.0.0", + "ts-node": "^10.7.0", "typescript": "^4.1.3" } }, @@ -91,9 +93,9 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "node_modules/@terra-money/terra.js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.4.tgz", - "integrity": "sha512-PEYaPs0p521njZyD6a7aH6KrXRKdj4+j7kboM4qGc8FS/lKPFQUgacsVSlbAK0sYX/tOhINvN7eudwRBwuJVhw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.8.tgz", + "integrity": "sha512-TSosUWw1OeZmgliHwgydDBgEEl+dGnAoFeaYmYYv+dzcYFnyUwY4NXpvg2cU0rjPBLGQHQdV/zRRfSyNQlGDBQ==", "dependencies": { "@terra-money/terra.proto": "^0.1.7", "axios": "^0.24.0", @@ -562,6 +564,11 @@ "node": "*" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", @@ -779,10 +786,15 @@ "node": ">=8.17.0" } }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", "dependencies": { "@cspotcode/source-map-support": "0.7.0", "@tsconfig/node10": "^1.0.7", @@ -795,11 +807,13 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" @@ -853,6 +867,11 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==" + }, "node_modules/web-streams-polyfill": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", @@ -972,9 +991,9 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@terra-money/terra.js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.4.tgz", - "integrity": "sha512-PEYaPs0p521njZyD6a7aH6KrXRKdj4+j7kboM4qGc8FS/lKPFQUgacsVSlbAK0sYX/tOhINvN7eudwRBwuJVhw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.8.tgz", + "integrity": "sha512-TSosUWw1OeZmgliHwgydDBgEEl+dGnAoFeaYmYYv+dzcYFnyUwY4NXpvg2cU0rjPBLGQHQdV/zRRfSyNQlGDBQ==", "requires": { "@terra-money/terra.proto": "^0.1.7", "axios": "^0.24.0", @@ -1377,6 +1396,11 @@ "brace-expansion": "^1.1.7" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", @@ -1534,10 +1558,15 @@ "rimraf": "^3.0.0" } }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", "requires": { "@cspotcode/source-map-support": "0.7.0", "@tsconfig/node10": "^1.0.7", @@ -1550,6 +1579,7 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", "yn": "3.1.1" } }, @@ -1576,6 +1606,11 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==" + }, "web-streams-polyfill": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", diff --git a/pseudo-feeder/package.json b/pseudo-feeder/package.json index 1a1bba6..fd79edb 100644 --- a/pseudo-feeder/package.json +++ b/pseudo-feeder/package.json @@ -9,11 +9,13 @@ "author": "", "license": "MIT", "dependencies": { - "@terra-money/terra.js": "^3.0.3", + "@terra-money/terra.js": "^3.0.8", "@types/node": "^17.0.8", "bluebird": "^3.7.2", + "ms": "^2.1.3", "node-fetch": "^3.1.1", - "ts-node": "^10.0.0", + "toml": "^3.0.0", + "ts-node": "^10.7.0", "typescript": "^4.1.3" } }