Skip to content

Commit

Permalink
fix: base token attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
vasyl-ivanchuk committed Jan 28, 2025
1 parent 0cda7ed commit 0273d84
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 17 deletions.
6 changes: 6 additions & 0 deletions packages/worker/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ ENABLE_TOKEN_OFFCHAIN_DATA_SAVER=false
UPDATE_TOKEN_OFFCHAIN_DATA_INTERVAL=86400000
SELECTED_TOKEN_OFFCHAIN_DATA_PROVIDER=coingecko

BASE_TOKEN_SYMBOL=ETH
BASE_TOKEN_DECIMALS=18
BASE_TOKEN_L1_ADDRESS=0x0000000000000000000000000000000000000000
BASE_TOKEN_ICON_URL=https://assets.coingecko.com/coins/images/279/large/ethereum.png?1698873266
BASE_TOKEN_NAME=Ether

FROM_BLOCK=0
TO_BLOCK=

Expand Down
14 changes: 14 additions & 0 deletions packages/worker/src/config.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ describe("config", () => {
coingecko: {
isProPlan: false,
},
baseToken: {
symbol: "ETH",
decimals: 18,
l1Address: "0x0000000000000000000000000000000000000000",
iconUrl: "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1698873266",
name: "Ether",
},
},
metrics: {
collectDbConnectionPoolMetricsInterval: 10000,
Expand Down Expand Up @@ -118,6 +125,13 @@ describe("config", () => {
coingecko: {
isProPlan: false,
},
baseToken: {
symbol: "ETH",
decimals: 18,
l1Address: "0x0000000000000000000000000000000000000000",
iconUrl: "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1698873266",
name: "Ether",
},
},
metrics: {
collectDbConnectionPoolMetricsInterval: 10000,
Expand Down
12 changes: 12 additions & 0 deletions packages/worker/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ export default () => {
CHECK_MISSING_BLOCKS_METRIC_INTERVAL,
RPC_HEALTH_CHECK_TIMEOUT_MS,
DB_HEALTH_CHECK_TIMEOUT_MS,
BASE_TOKEN_SYMBOL,
BASE_TOKEN_DECIMALS,
BASE_TOKEN_L1_ADDRESS,
BASE_TOKEN_ICON_URL,
BASE_TOKEN_NAME,
} = process.env;

return {
Expand Down Expand Up @@ -90,6 +95,13 @@ export default () => {
isProPlan: COINGECKO_IS_PRO_PLAN === "true",
apiKey: COINGECKO_API_KEY,
},
baseToken: {
symbol: BASE_TOKEN_SYMBOL || "ETH",
decimals: parseInt(BASE_TOKEN_DECIMALS, 10) || 18,
l1Address: BASE_TOKEN_L1_ADDRESS || "0x0000000000000000000000000000000000000000",
iconUrl: BASE_TOKEN_ICON_URL || "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1698873266",
name: BASE_TOKEN_NAME || "Ether",
},
},
metrics: {
collectDbConnectionPoolMetricsInterval: parseInt(COLLECT_DB_CONNECTION_POOL_METRICS_INTERVAL, 10) || 10000,
Expand Down
21 changes: 19 additions & 2 deletions packages/worker/src/token/token.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { AddressRepository } from "../repositories/address.repository";
import { TokenService } from "./token.service";
import { ContractAddress } from "../dataFetcher/types";
import { Token } from "../entities";
import { ConfigService } from "@nestjs/config";

describe("TokenService", () => {
let tokenService: TokenService;
Expand All @@ -16,7 +17,7 @@ describe("TokenService", () => {
let addressRepositoryMock: AddressRepository;
let startGetTokenInfoDurationMetricMock: jest.Mock;
let stopGetTokenInfoDurationMetricMock: jest.Mock;

let configServiceMock: ConfigService;
beforeEach(async () => {
blockchainServiceMock = mock<BlockchainService>({
bridgeAddresses: {
Expand All @@ -29,6 +30,16 @@ describe("TokenService", () => {
stopGetTokenInfoDurationMetricMock = jest.fn();
startGetTokenInfoDurationMetricMock = jest.fn().mockReturnValue(stopGetTokenInfoDurationMetricMock);

configServiceMock = mock<ConfigService>({
get: jest
.fn()
.mockReturnValueOnce("0x0000000000000000000000000000000000000000")
.mockReturnValueOnce("ETH")
.mockReturnValueOnce("Ether")
.mockReturnValueOnce(18)
.mockReturnValueOnce("https://assets.coingecko.com/coins/images/279/large/ethereum.png?1696501427"),
});

const app: TestingModule = await Test.createTestingModule({
providers: [
TokenService,
Expand All @@ -44,6 +55,10 @@ describe("TokenService", () => {
provide: AddressRepository,
useValue: addressRepositoryMock,
},
{
provide: ConfigService,
useValue: configServiceMock,
},
{
provide: "PROM_METRIC_GET_TOKEN_INFO_DURATION_SECONDS",
useValue: {
Expand Down Expand Up @@ -122,7 +137,8 @@ describe("TokenService", () => {
const ethTokenData = {
symbol: "ETH",
decimals: 18,
name: "Ethers",
name: "Ether",
iconURL: "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1696501427",
};
const deployedETHContractAddress = mock<ContractAddress>({
address: utils.L2_BASE_TOKEN_ADDRESS,
Expand All @@ -141,6 +157,7 @@ describe("TokenService", () => {
l2Address: deployedETHContractAddress.address,
l1Address: utils.ETH_ADDRESS,
logIndex: deployedETHContractAddress.logIndex,
iconURL: "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1696501427",
});
});
});
Expand Down
34 changes: 23 additions & 11 deletions packages/worker/src/token/token.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { ContractAddress } from "../dataFetcher/types";
import parseLog from "../utils/parseLog";
import { stringTransformer } from "../transformers/string.transformer";
import { CONTRACT_INTERFACES } from "../constants";
import { ConfigService } from "@nestjs/config";

export interface Token {
l2Address: string;
Expand All @@ -31,6 +32,7 @@ export class TokenService {
private readonly blockchainService: BlockchainService,
private readonly addressRepository: AddressRepository,
private readonly tokenRepository: TokenRepository,
private readonly configService: ConfigService,
@InjectMetric(GET_TOKEN_INFO_DURATION_METRIC_NAME)
private readonly getTokenInfoDurationMetric: Histogram
) {
Expand Down Expand Up @@ -97,17 +99,27 @@ export class TokenService {
tokenAddress: contractAddress.address,
});

await this.tokenRepository.upsert({
...erc20Token,
blockNumber: contractAddress.blockNumber,
transactionHash: contractAddress.transactionHash,
l2Address: contractAddress.address,
logIndex: contractAddress.logIndex,
// add L1 address for ETH token
...(contractAddress.address.toLowerCase() === utils.L2_BASE_TOKEN_ADDRESS && {
l1Address: utils.ETH_ADDRESS,
}),
});
if (contractAddress.address.toLowerCase() === utils.L2_BASE_TOKEN_ADDRESS.toLowerCase()) {
await this.tokenRepository.upsert({
blockNumber: contractAddress.blockNumber,
transactionHash: contractAddress.transactionHash,
logIndex: contractAddress.logIndex,
l2Address: utils.L2_BASE_TOKEN_ADDRESS,
l1Address: this.configService.get<string>("tokens.baseToken.l1Address"),
symbol: this.configService.get<string>("tokens.baseToken.symbol"),
name: this.configService.get<string>("tokens.baseToken.name"),
decimals: this.configService.get<number>("tokens.baseToken.decimals"),
iconURL: this.configService.get<string>("tokens.baseToken.iconUrl"),
});
} else {
await this.tokenRepository.upsert({
...erc20Token,
blockNumber: contractAddress.blockNumber,
transactionHash: contractAddress.transactionHash,
l2Address: contractAddress.address,
logIndex: contractAddress.logIndex,
});
}
}
}

Expand Down
49 changes: 46 additions & 3 deletions packages/worker/src/transaction/transaction.processor.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from "../repositories";
import { TransactionProcessor } from "./transaction.processor";
import { TransactionData } from "../dataFetcher/types";
import { ConfigService } from "@nestjs/config";

describe("TransactionProcessor", () => {
let transactionProcessor: TransactionProcessor;
Expand All @@ -20,6 +21,7 @@ describe("TransactionProcessor", () => {
let addressRepositoryMock: AddressRepository;
let tokenRepositoryMock: TokenRepository;
let logRepositoryMock: LogRepository;
let configServiceMock: ConfigService;

let startTxProcessingDurationMetricMock: jest.Mock;
let stopTxProcessingDurationMetricMock: jest.Mock;
Expand All @@ -35,6 +37,19 @@ describe("TransactionProcessor", () => {
stopTxProcessingDurationMetricMock = jest.fn();
startTxProcessingDurationMetricMock = jest.fn().mockReturnValue(stopTxProcessingDurationMetricMock);

configServiceMock = mock<ConfigService>({
get: jest.fn((key: string) => {
const configValues: Record<string, any> = {
"tokens.baseToken.l1Address": "0x0000000000000000000000000000000000000000",
"tokens.baseToken.symbol": "ETH",
"tokens.baseToken.name": "ETH",
"tokens.baseToken.decimals": 18,
"tokens.baseToken.iconUrl": "https://eth-icon-url",
};
return configValues[key];
}),
});

const app = await Test.createTestingModule({
providers: [
TransactionProcessor,
Expand Down Expand Up @@ -62,6 +77,10 @@ describe("TransactionProcessor", () => {
provide: TokenRepository,
useValue: tokenRepositoryMock,
},
{
provide: ConfigService,
useValue: configServiceMock,
},
{
provide: "PROM_METRIC_TRANSACTION_PROCESSING_DURATION_SECONDS",
useValue: {
Expand Down Expand Up @@ -113,7 +132,20 @@ describe("TransactionProcessor", () => {
logIndex: 2,
},
],
tokens: [{ l2Address: "l2Address1" }, { l2Address: "l2Address2" }],
tokens: [
{ l2Address: "l2Address1" },
{ l2Address: "l2Address2" },
{
l2Address: "0x000000000000000000000000000000000000800a",
blockNumber: 123,
transactionHash: "0xtxhash",
logIndex: 1,
name: "Token Name",
symbol: "Token Symbol",
decimals: 6,
iconURL: "https://token-icon.url",
},
],
} as unknown as TransactionData;

it("starts the transaction duration metric", async () => {
Expand Down Expand Up @@ -180,11 +212,22 @@ describe("TransactionProcessor", () => {
});
});

it("saves tokens to the DB", async () => {
it("saves tokens to the DB and overwrites base token with config values", async () => {
await transactionProcessor.add(blockNumber, transactionData);
expect(tokenRepositoryMock.upsert).toHaveBeenCalledTimes(2);
expect(tokenRepositoryMock.upsert).toHaveBeenCalledTimes(3);
expect(tokenRepositoryMock.upsert).toHaveBeenNthCalledWith(1, transactionData.tokens[0]);
expect(tokenRepositoryMock.upsert).toHaveBeenNthCalledWith(2, transactionData.tokens[1]);
expect(tokenRepositoryMock.upsert).toHaveBeenNthCalledWith(3, {
blockNumber: 123,
transactionHash: "0xtxhash",
logIndex: 1,
l2Address: "0x000000000000000000000000000000000000800a",
l1Address: "0x0000000000000000000000000000000000000000",
symbol: "ETH",
name: "ETH",
decimals: 18,
iconURL: "https://eth-icon-url",
});
});

it("stops the transaction duration metric", async () => {
Expand Down
19 changes: 18 additions & 1 deletion packages/worker/src/transaction/transaction.processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import {
} from "../repositories";
import { TRANSACTION_PROCESSING_DURATION_METRIC_NAME } from "../metrics";
import { TransactionData } from "../dataFetcher/types";
import { ConfigService } from "@nestjs/config";
import { utils } from "zksync-ethers";

@Injectable()
export class TransactionProcessor {
Expand All @@ -23,6 +25,7 @@ export class TransactionProcessor {
private readonly transferRepository: TransferRepository,
private readonly addressRepository: AddressRepository,
private readonly tokenRepository: TokenRepository,
private readonly configService: ConfigService,
@InjectMetric(TRANSACTION_PROCESSING_DURATION_METRIC_NAME)
private readonly transactionProcessingDurationMetric: Histogram
) {
Expand Down Expand Up @@ -103,7 +106,21 @@ export class TransactionProcessor {
});
await Promise.all(
transactionData.tokens.map((token) => {
return this.tokenRepository.upsert(token);
if (token.l2Address.toLowerCase() === utils.L2_BASE_TOKEN_ADDRESS.toLowerCase()) {
return this.tokenRepository.upsert({
blockNumber: token.blockNumber,
transactionHash: token.transactionHash,
logIndex: token.logIndex,
l2Address: utils.L2_BASE_TOKEN_ADDRESS,
l1Address: this.configService.get<string>("tokens.baseToken.l1Address"),
symbol: this.configService.get<string>("tokens.baseToken.symbol"),
name: this.configService.get<string>("tokens.baseToken.name"),
decimals: this.configService.get<number>("tokens.baseToken.decimals"),
iconURL: this.configService.get<string>("tokens.baseToken.iconUrl"),
});
} else {
return this.tokenRepository.upsert(token);
}
})
);

Expand Down

0 comments on commit 0273d84

Please sign in to comment.