Skip to content

Commit

Permalink
Merge pull request #4 from planetarium/feature/removeSentry
Browse files Browse the repository at this point in the history
Feature/remove sentry
  • Loading branch information
carolk-dev authored Dec 31, 2024
2 parents 14e0091 + a449a05 commit aacf497
Show file tree
Hide file tree
Showing 14 changed files with 371 additions and 82 deletions.
2 changes: 0 additions & 2 deletions bridge/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,6 @@
"@safe-global/safe-core-sdk-types": "^1.9.0",
"@safe-global/safe-ethers-lib": "^1.9.2",
"@safe-global/safe-service-client": "^2.0.0",
"@sentry/node": "^6.4.1",
"@sentry/tracing": "^6.4.1",
"@slack/web-api": "^6.2.3",
"@truffle/hdwallet-provider": "^1.3.0",
"@types/asn1js": "^2.0.2",
Expand Down
97 changes: 59 additions & 38 deletions bridge/src/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,53 +38,74 @@ export class Configuration {
throw new Error(`Please set '${name}' at .env`);
}

if (type === "string") {
return environmentVariable;
}
return this.handleType(environmentVariable, name, type);
}

private static handleType(
variable: string | undefined,
name: string,
type: ConversionType
): string | number | boolean | undefined {
switch (type) {
case "string":
return variable;

if (type === "integer") {
if (environmentVariable === undefined) {
return environmentVariable;
}
case "integer":
return this.parseInteger(variable, name);

const asInt = parseInt(environmentVariable);
if (isNaN(asInt)) {
throw new Error(
`Please set '${name}' with valid integer format at .env`
);
}
case "float":
return this.parseFloat(variable, name);

return asInt;
case "boolean":
return this.parseBoolean(variable, name);

default:
throw new Error(`Unsupported type: ${type}`);
}
}

if (type === "float") {
if (environmentVariable === undefined) {
return environmentVariable;
}
private static parseInteger(
variable: string | undefined,
name: string
): number | undefined {
if (variable === undefined) return undefined;

const asFloat = parseFloat(environmentVariable);
if (isNaN(asFloat) || asFloat.toString() !== environmentVariable) {
throw new Error(`Please set '${name}' with valid float format at .env`);
}
const asInt = parseInt(variable);
if (isNaN(asInt)) {
throw new Error(`Please set '${name}' with valid integer format at .env`);
}

return asFloat;
return asInt;
}

private static parseFloat(
variable: string | undefined,
name: string
): number | undefined {
if (variable === undefined) return undefined;

const asFloat = parseFloat(variable);
if (isNaN(asFloat) || asFloat.toString() !== variable) {
throw new Error(`Please set '${name}' with valid float format at .env`);
}

if (type === "boolean") {
if (
environmentVariable === undefined ||
environmentVariable === "FALSE"
) {
return false;
}

if (environmentVariable === "TRUE") {
return true;
}

throw new Error(
`Please set '${name}' as 'TRUE' or 'FALSE', or remove '${name}' at .env.`
);
return asFloat;
}

private static parseBoolean(
variable: string | undefined,
name: string
): boolean {
if (variable === undefined || variable === "FALSE") {
return false;
}

if (variable === "TRUE") {
return true;
}

throw new Error(
`Please set '${name}' as 'TRUE' or 'FALSE', or remove '${name}' at .env.`
);
}
}
8 changes: 0 additions & 8 deletions bridge/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import Web3 from "web3";
import { init } from "@sentry/node";
import { KmsProvider } from "@planetarium/aws-kms-provider";

import { BscBurnEventMonitor } from "./monitors/bsc-burn-event-monitor";
Expand Down Expand Up @@ -115,12 +114,6 @@ process.on("uncaughtException", console.error);
"boolean"
);
const BSCSCAN_ROOT_URL: string = Configuration.get("BSCSCAN_ROOT_URL");
const SENTRY_DSN: string | undefined = Configuration.get("SENTRY_DSN", false);
if (SENTRY_DSN !== undefined) {
init({
dsn: SENTRY_DSN,
});
}

// Environment Variables for using Google Spread Sheet API
const SLACK_URL: string = Configuration.get("SLACK_URL");
Expand Down Expand Up @@ -344,7 +337,6 @@ process.on("uncaughtException", console.error);
slackMessageSender
);

// 서버 시작 시 pending 트랜잭션 slack 메시지 전송
await pendingTransactionRetryHandler.messagePendingTransactions();

const ethereumBurnEventObserver = new BscBurnEventObserver(
Expand Down
2 changes: 1 addition & 1 deletion bridge/src/messages/pending-transaction-message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class PendingTransactionMessage implements Message {
}

render(): ForceOmit<Partial<ChatPostMessageArguments>, "channel"> {
if (this.transactions) {
if (this.transactions.length !== 0) {
console.log("Pending Transactions : ", this.transactions);
return {
text: `${this.transactions.length} Pending Transactions Found`,
Expand Down
2 changes: 0 additions & 2 deletions bridge/src/monitors/triggerable-monitor.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Monitor } from ".";
import { captureException } from "@sentry/node";
import { TransactionLocation } from "../types/transaction-location";
import { BlockHash } from "../types/block-hash";

Expand Down Expand Up @@ -88,7 +87,6 @@ export abstract class TriggerableMonitor<TEventData> extends Monitor<
"Ignore and continue loop without breaking though unexpected error occurred:",
error
);
captureException(error);
}
}
}
Expand Down
27 changes: 2 additions & 25 deletions bridge/src/sqlite3-exchange-history-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ export class Sqlite3ExchangeHistoryStore implements IExchangeHistoryStore {
static async open(path: string): Promise<Sqlite3ExchangeHistoryStore> {
const database = new Database(path);
await this.initialize(database);
await this.ensureStatusColumn(database);
return new Sqlite3ExchangeHistoryStore(database);
}

Expand All @@ -83,39 +82,17 @@ export class Sqlite3ExchangeHistoryStore implements IExchangeHistoryStore {
PRIMARY KEY(network, tx_id)
);
CREATE INDEX IF NOT EXISTS exchange_history_idx ON exchange_histories(sender);`;
return new Promise((resolve, error) => {
return new Promise((resolve, reject) => {
database.run(CREATE_TABLE_QUERY, (e) => {
if (e) {
error();
reject(e);
} else {
resolve();
}
});
});
}
/** 운영테이블에 status 컬럼 추가후 삭제될 코드 START */
private static async ensureStatusColumn(database: Database): Promise<void> {
interface ColumnInfo {
name: string;
}

const columns = (await promisify(database.all.bind(database))(
"PRAGMA table_info(exchange_histories)"
)) as ColumnInfo[];

const hasStatusColumn = columns.some((col) => col.name === "status");

if (!hasStatusColumn) {
await promisify(database.run.bind(database))(
`ALTER TABLE exchange_histories ADD COLUMN status TEXT DEFAULT '${TransactionStatus.PENDING}'`
);

await promisify(database.run.bind(database))(
`UPDATE exchange_histories SET status = '${TransactionStatus.COMPLETED}' WHERE status IS NULL`
);
}
}
/** 운영테이블에 status 컬럼 추가후 삭제될 코드 END */
close(): void {
this.checkClosed();

Expand Down
4 changes: 2 additions & 2 deletions bridge/src/sqlite3-monitor-state-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ export class Sqlite3MonitorStateStore implements IMonitorStateStore {
block_hash TEXT NOT NULL,
tx_id TEXT
)`;
return new Promise((resolve, error) => {
return new Promise((resolve, reject) => {
database.run(CREATE_TABLE_QUERY, (e) => {
if (e) {
error();
reject(e);
} else {
resolve();
}
Expand Down
16 changes: 16 additions & 0 deletions bridge/test/configuration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,22 @@ describe("Configuration", () => {
expect(Configuration.get(ENV_NAME, false, "boolean")).toEqual(false);
expect(Configuration.get("UNDEFINED", false, "boolean")).toEqual(false);
});

it("should throw an error", () => {
expect(() => {
Configuration.get("UNDEFINED", true, "string");
}).toThrowError("Please set 'UNDEFINED' at .env");
});

it("should throw an error for unsupported type", () => {
expect(() => {
Configuration.get(
"NON_EXISTENT_VARIABLE",
false,
"unsupportedType" as any
);
}).toThrowError("Unsupported type: unsupportedType");
});
});

for (const testcase of [".1", "FALSE", "", "*"]) {
Expand Down
70 changes: 70 additions & 0 deletions bridge/test/messages/pending-transaction-message.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { PendingTransactionMessage } from "../../src/messages/pending-transaction-message";
import { ExchangeHistory } from "../../src/interfaces/exchange-history-store";
import { MultiPlanetary } from "../../src/multi-planetary";
import { TransactionStatus } from "../../src/types/transaction-status";

describe("PendingTransactionMessage", () => {
const mockMultiPlanetary = {
getRequestPlanetName: jest.fn().mockReturnValue("Odin"),
} as unknown as MultiPlanetary;

it("should render pending transactions correctly for BSCereum", () => {
const transactions: ExchangeHistory[] = [
{
network: "BSCereum",
tx_id: "TX-123",
sender: "0xSenderAddress",
recipient: "0xRecipientAddress",
timestamp: new Date().toISOString(),
amount: 100,
status: TransactionStatus.PENDING,
},
];

const message = new PendingTransactionMessage(
transactions,
mockMultiPlanetary
);
const result = message.render() as {
text: string;
attachments: {
author_name: string;
fields: { title: string; value: string }[];
}[];
};

expect(result.text).toBe("1 Pending Transactions Found");
expect(result.attachments).toHaveLength(1);
expect(result.attachments[0].author_name).toBe(
"[BSC] wNCG → NCG pending event"
);
expect(result.attachments[0].fields[0].title).toBe("BSC transaction");
expect(result.attachments[0].fields[1].title).toBe("Planet Name");
expect(result.attachments[0].fields[1].value).toBe("Odin");
expect(result.attachments[0].fields[2].title).toBe("Sender(BSC)");
expect(result.attachments[0].fields[2].value).toBe("0xSenderAddress");
expect(result.attachments[0].fields[3].title).toBe("Recipient(9c)");
expect(result.attachments[0].fields[3].value).toBe("0xRecipientAddress");
expect(result.attachments[0].fields[4].title).toBe("Amount");
expect(result.attachments[0].fields[4].value).toBe("100");
expect(result.attachments[0].fields[5].title).toBe("Timestamp");
expect(result.attachments[0].fields[5].value).toBe(
transactions[0].timestamp
);
});

it("should render no pending transactions message", () => {
const message = new PendingTransactionMessage([], mockMultiPlanetary);
const result = message.render() as {
text: string;
attachments: {
author_name: string;
fields: { title: string; value: string }[];
}[];
};

expect(result.text).toBe("No pending transactions");
expect(result.attachments).toHaveLength(1);
expect(result.attachments[0].author_name).toBe("BSC Bridge Restarted");
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,69 @@ Array [
]
`;

exports[`BscBurnEventObserver notify should handle existing transaction in exchange history 1`] = `
Array [
Array [
Object {
"attachments": Array [
Object {
"author_name": "Bridge Warning",
"color": "#ffcc00",
"fallback": "wNCG → NCG event already seems executed so it skipped.",
"fields": Array [
Object {
"title": "Binance Smart Chain network transaction id",
"value": "TX-EXISTING",
},
],
},
],
"text": "wNCG → NCG event already seems executed so it skipped.",
},
],
]
`;

exports[`BscBurnEventObserver notify should handle existing transaction in exchange history 2`] = `
Array [
Array [
"error",
Object {
"amount": "1.00",
"cause": "Exchange history exist",
"content": "wNCG -> NCG request failure",
"ethereumTxId": "TX-EXISTING",
"network": "BSC",
"recipient": "0x6d29f9923C86294363e59BAaA46FcBc37Ee5aE2e",
"sender": "0x2734048eC2892d111b4fbAB224400847544FC872",
},
],
]
`;

exports[`BscBurnEventObserver notify should handle existing transaction in exchange history 3`] = `
Array [
Array [
Object {
"attachments": Array [
Object {
"author_name": "Bridge Warning",
"color": "#ffcc00",
"fallback": "wNCG → NCG event already seems executed so it skipped.",
"fields": Array [
Object {
"title": "Binance Smart Chain network transaction id",
"value": "TX-EXISTING",
},
],
},
],
"text": "wNCG → NCG event already seems executed so it skipped.",
},
],
]
`;

exports[`BscBurnEventObserver notify slack/opensearch 9c transfer error message - snapshot 1`] = `
Array [
Array [
Expand Down
Loading

0 comments on commit aacf497

Please sign in to comment.