Skip to content

Commit

Permalink
temp: remove check change rate
Browse files Browse the repository at this point in the history
  • Loading branch information
perfogic committed Nov 25, 2024
1 parent b6a07aa commit 34b7e6e
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 49 deletions.
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,25 @@
"@cosmjs/stargate": "0.32.4",
"@cosmjs/tendermint-rpc": "0.32.4",
"@oraichain/oraidex-common": "^1.0.10",
"cors": "^2.8.5",
"helmet": "^8.0.0",
"http": "^0.0.1-security",
"http-status": "^2.0.0",
"joi": "^17.13.3",
"os": "^0.1.2",
"readline-sync": "^1.4.10",
"regtest-client": "^0.2.1",
"winston": "^3.14.2",
"winston-transport-discord": "^1.0.3"
"winston-transport-discord": "^1.0.3",
"xss-clean": "^0.1.4"
},
"devDependencies": {
"@babel/traverse": "7.24.1",
"@cosmjs/encoding": "0.31.3",
"@oraichain/cw-simulate": "^2.8.98",
"@swc/core": "^1.4.11",
"@swc/jest": "^0.2.36",
"@types/cors": "^2.8.17",
"@types/jest": "^29.5.12",
"@types/lodash": "^4.17.0",
"@types/morgan": "^1.9.9",
Expand Down
124 changes: 76 additions & 48 deletions packages/orchestrator/src/services/signer/index.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,59 @@
import { AppBitcoinClient, LightClientBitcoinClient } from '@oraichain/bitcoin-bridge-contracts-sdk';
import { BitcoinNetwork } from '@oraichain/bitcoin-bridge-lib-js';
import { encodeXpub } from '@oraichain/bitcoin-bridge-wasm-sdk';
import BIP32Factory, { BIP32Interface } from 'bip32';
import crypto from 'crypto';
import fs from 'fs';
import os from 'os';
import path from 'path';
import { setTimeout } from 'timers/promises';
import * as ecc from 'tiny-secp256k1';
import { Logger } from 'winston';
import env from '../../configs/env';
import { logger } from '../../configs/logger';
import { ITERATION_DELAY } from '../../constants';
import { getCurrentNetwork } from '../../utils/bitcoin';
import { wrappedExecuteTransaction } from '../../utils/cosmos';
import { RelayerInterface } from '../common/relayer.interface';
import {
AppBitcoinClient,
LightClientBitcoinClient,
} from "@oraichain/bitcoin-bridge-contracts-sdk";
import { BitcoinNetwork } from "@oraichain/bitcoin-bridge-lib-js";
import { encodeXpub } from "@oraichain/bitcoin-bridge-wasm-sdk";
import BIP32Factory, { BIP32Interface } from "bip32";
import crypto from "crypto";
import fs from "fs";
import os from "os";
import path from "path";
import { setTimeout } from "timers/promises";
import * as ecc from "tiny-secp256k1";
import { Logger } from "winston";
import env from "../../configs/env";
import { logger } from "../../configs/logger";
import { ITERATION_DELAY } from "../../constants";
import { getCurrentNetwork } from "../../utils/bitcoin";
import { wrappedExecuteTransaction } from "../../utils/cosmos";
import { RelayerInterface } from "../common/relayer.interface";

class SignerService implements RelayerInterface {
lightClientBitcoinClient: LightClientBitcoinClient;
appBitcoinClient: AppBitcoinClient;
network?: BitcoinNetwork;
logger: Logger;

constructor(lightClientBitcoinClient: LightClientBitcoinClient, appBitcoinClient: AppBitcoinClient, network?: BitcoinNetwork) {
constructor(
lightClientBitcoinClient: LightClientBitcoinClient,
appBitcoinClient: AppBitcoinClient,
network?: BitcoinNetwork
) {
this.lightClientBitcoinClient = lightClientBitcoinClient;
this.appBitcoinClient = appBitcoinClient;
this.network = network;
this.logger = logger('SignerService');
this.logger = logger("SignerService");
}

async relay() {
let { xpriv, xpub } = await this.loadOrGenerateXpriv();

const signatoryKey = await this.appBitcoinClient.signatoryKey({
addr: this.appBitcoinClient.sender
addr: this.appBitcoinClient.sender,
});

if (signatoryKey === null) {
const tx = await this.appBitcoinClient.setSignatoryKey({
xpub: encodeXpub({ key: xpub })
xpub: encodeXpub({ key: xpub }),
});
this.logger.info(`Setting signatory key at: ${tx.transactionHash}`);
}

this.logger.info(`Signer is running...`);
await this.startRelay({
xpriv,
xpub
xpub,
});
}

Expand All @@ -73,16 +80,17 @@ class SignerService implements RelayerInterface {
}

let checkpoint = await this.appBitcoinClient.checkpointByIndex({
index: previousIndex
index: previousIndex,
});

if (checkpoint.status === 'signing') {
await this.checkChangeRate();

let signTxs = await this.appBitcoinClient.signingTxsAtCheckpointIndex({
xpub: encodeXpub({ key: xpub }),
checkpointIndex: previousIndex
});
if (checkpoint.status === "signing") {
// await this.checkChangeRate();
let signTxs = await this.appBitcoinClient.signingTxsAtCheckpointIndex(
{
xpub: encodeXpub({ key: xpub }),
checkpointIndex: previousIndex,
}
);

if (signTxs.length > 0) {
// Fetch latest signed checkpoint height
Expand All @@ -101,9 +109,11 @@ class SignerService implements RelayerInterface {
btcHeight,
checkpointIndex: previousIndex,
sigs,
xpub: encodeXpub({ key: xpub })
xpub: encodeXpub({ key: xpub }),
});
this.logger.info(`Signed checkpoint ${previousIndex} at ${tx.transactionHash}`);
this.logger.info(
`Signed checkpoint ${previousIndex} at ${tx.transactionHash}`
);
}, this.logger);
}
}
Expand All @@ -123,33 +133,43 @@ class SignerService implements RelayerInterface {

if (previousIndex - 1 >= 0) {
let previousCheckpoint = await this.appBitcoinClient.checkpointByIndex({
index: previousIndex - 1
index: previousIndex - 1,
});
signedAtBtcHeight = previousCheckpoint.signed_at_btc_height;
}

// Validate "circuit breaker" mechanism
if (signedAtBtcHeight !== null && signedAtBtcHeight !== undefined) {
let delta = signedAtBtcHeight + env.signer.minBlocksPerCheckpoint - currentHeight;
let delta =
signedAtBtcHeight + env.signer.minBlocksPerCheckpoint - currentHeight;
if (delta > 0) {
throw new Error(`Checkpoint is too recent, ${delta} more Bitcoin block${delta > 1 ? 's' : ''} required`);
throw new Error(
`Checkpoint is too recent, ${delta} more Bitcoin block${
delta > 1 ? "s" : ""
} required`
);
}
}
}

async checkChangeRate() {
const { withdrawal, sigset_change } = await this.appBitcoinClient.changeRates({
interval: env.signer.legitimateCheckpointInterval
});
const { withdrawal, sigset_change } =
await this.appBitcoinClient.changeRates({
interval: env.signer.legitimateCheckpointInterval,
});
let sigsetChangeRate = sigset_change / 10000;
let withdrawalRate = withdrawal / 10000;

if (withdrawalRate > env.signer.maxWithdrawalRate) {
throw new Error(`Withdrawal rate of ${withdrawalRate} is above maximum of ${env.signer.maxWithdrawalRate}`);
throw new Error(
`Withdrawal rate of ${withdrawalRate} is above maximum of ${env.signer.maxWithdrawalRate}`
);
}

if (sigsetChangeRate > env.signer.sigsetChangeRate) {
throw new Error(`Sigset change rate of ${sigsetChangeRate} is above maximum of ${env.signer.sigsetChangeRate}`);
throw new Error(
`Sigset change rate of ${sigsetChangeRate} is above maximum of ${env.signer.sigsetChangeRate}`
);
}
}

Expand All @@ -161,7 +181,7 @@ class SignerService implements RelayerInterface {
while (true) {
try {
let signTxs = await this.appBitcoinClient.signingRecoveryTxs({
xpub: encodeXpub({ key: xpub })
xpub: encodeXpub({ key: xpub }),
});
let sigs = [];

Expand All @@ -177,9 +197,11 @@ class SignerService implements RelayerInterface {
await wrappedExecuteTransaction(async () => {
const tx = await this.appBitcoinClient.submitRecoverySignature({
sigs,
xpub: encodeXpub({ key: xpub })
xpub: encodeXpub({ key: xpub }),
});
this.logger.info(`Signed recovery transaction at ${tx.transactionHash}`);
this.logger.info(
`Signed recovery transaction at ${tx.transactionHash}`
);
}, this.logger);
}
} catch (err) {
Expand All @@ -192,11 +214,14 @@ class SignerService implements RelayerInterface {

async loadOrGenerateXpriv(): Promise<{ xpriv: string; xpub: string }> {
const homeDir = os.homedir();
const signerDirPath = path.join(homeDir, `${env.server.storageDirName}/signer`);
const signerDirPath = path.join(
homeDir,
`${env.server.storageDirName}/signer`
);
if (!fs.existsSync(signerDirPath)) {
fs.mkdirSync(signerDirPath, { recursive: true });
}
const xprivPath = path.join(signerDirPath, 'xpriv');
const xprivPath = path.join(signerDirPath, "xpriv");

let node: BIP32Interface;
const bip32 = BIP32Factory(ecc);
Expand All @@ -206,14 +231,17 @@ class SignerService implements RelayerInterface {
let xpriv = node.toBase58();
fs.writeFileSync(xprivPath, xpriv);
} else {
const fileContent = fs.readFileSync(xprivPath, 'utf-8');
node = bip32.fromBase58(fileContent.trim(), getCurrentNetwork(this.network));
const fileContent = fs.readFileSync(xprivPath, "utf-8");
node = bip32.fromBase58(
fileContent.trim(),
getCurrentNetwork(this.network)
);
}
let xpriv = node.toBase58();
let xpub = node.neutered().toBase58();
return {
xpriv,
xpub
xpub,
};
}
}
Expand Down
35 changes: 35 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8791,6 +8791,13 @@ __metadata:
languageName: node
linkType: hard

"helmet@npm:^8.0.0":
version: 8.0.0
resolution: "helmet@npm:8.0.0"
checksum: 10c0/c3d273df206cbb4e5e830ea68afdbd3d0f8e055b2707f67f651ebb4b679c7fd4d6ac77ce6188a2cee32e853d4e24aa00548f787989bbe6e5f98ebfb703855d09
languageName: node
linkType: hard

"hmac-drbg@npm:^1.0.1":
version: 1.0.1
resolution: "hmac-drbg@npm:1.0.1"
Expand Down Expand Up @@ -8907,6 +8914,20 @@ __metadata:
languageName: node
linkType: hard

"http-status@npm:^2.0.0":
version: 2.0.0
resolution: "http-status@npm:2.0.0"
checksum: 10c0/56455f68ae2d18f7dd4e9debfe561f27862c37f87854bfde0dddb1781bfbc0b97b37aa5677ce4b1e367d7b90eccf3723021120948fa8f8b961135a43f10aa60c
languageName: node
linkType: hard

"http@npm:^0.0.1-security":
version: 0.0.1-security
resolution: "http@npm:0.0.1-security"
checksum: 10c0/c0354c2afb6027a80756a30b1fb06607608c0408d100a5e3610d762dd1a320cb2611b0c3cf5ccb969b80f839e2735237ecc9897841e936d098161c38ee153ee5
languageName: node
linkType: hard

"https-proxy-agent@npm:^5.0.0":
version: 5.0.1
resolution: "https-proxy-agent@npm:5.0.1"
Expand Down Expand Up @@ -12142,6 +12163,13 @@ __metadata:
languageName: node
linkType: hard

"os@npm:^0.1.2":
version: 0.1.2
resolution: "os@npm:0.1.2"
checksum: 10c0/90f0db78a19a43cd26bc7497640eaee566043209e93d7e99570f542370f55d7107487f0bffdff01666b6ba48c88b6da8a6ed3811d745b57de93ab1cf7d3591a4
languageName: node
linkType: hard

"p-finally@npm:^1.0.0":
version: 1.0.0
resolution: "p-finally@npm:1.0.0"
Expand Down Expand Up @@ -13327,25 +13355,31 @@ __metadata:
"@oraichain/oraidex-common": "npm:^1.0.10"
"@swc/core": "npm:^1.4.11"
"@swc/jest": "npm:^0.2.36"
"@types/cors": "npm:^2.8.17"
"@types/jest": "npm:^29.5.12"
"@types/lodash": "npm:^4.17.0"
"@types/morgan": "npm:^1.9.9"
"@types/node": "npm:^20.11.30"
"@types/readline-sync": "npm:^1"
"@typescript-eslint/eslint-plugin": "npm:^7.3.1"
"@typescript-eslint/parser": "npm:^7.3.1"
cors: "npm:^2.8.5"
cosmjs-types: "npm:0.8.0"
cz-conventional-changelog: "npm:^3.3.0"
dotenv: "npm:^16.4.5"
eslint: "npm:^8.57.0"
eslint-import-resolver-typescript: "npm:^3.6.1"
eslint-plugin-import: "npm:^2.29.1"
eslint-plugin-security: "npm:^2.1.1"
helmet: "npm:^8.0.0"
http: "npm:^0.0.1-security"
http-status: "npm:^2.0.0"
husky: "npm:^9.1.4"
jest: "npm:^29.7.0"
joi: "npm:^17.13.3"
lerna: "npm:^8.1.8"
nx: "npm:19.5.7"
os: "npm:^0.1.2"
patch-package: "npm:^8.0.0"
readline-sync: "npm:^1.4.10"
regtest-client: "npm:^0.2.1"
Expand All @@ -13355,6 +13389,7 @@ __metadata:
vitest: "npm:^2.0.5"
winston: "npm:^3.14.2"
winston-transport-discord: "npm:^1.0.3"
xss-clean: "npm:^0.1.4"
languageName: unknown
linkType: soft

Expand Down

0 comments on commit 34b7e6e

Please sign in to comment.