Fix gasLimits config, check l1Fee for optimism
This commit is contained in:
parent
de279a9e18
commit
be969ca8c0
@ -26,11 +26,12 @@ export const tornadoServiceFee = Number(process.env.REGULAR_TORNADO_WITHDRAW_FEE
|
|||||||
export const rewardAccount = process.env.REWARD_ACCOUNT;
|
export const rewardAccount = process.env.REWARD_ACCOUNT;
|
||||||
export const governanceAddress = '0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce';
|
export const governanceAddress = '0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce';
|
||||||
export const tornadoGoerliProxy = '0x454d870a72e29d5E5697f635128D18077BD04C60';
|
export const tornadoGoerliProxy = '0x454d870a72e29d5E5697f635128D18077BD04C60';
|
||||||
|
export const ovmGasPriceOracleContract = '0x420000000000000000000000000000000000000F';
|
||||||
export const gasLimits = {
|
export const gasLimits = {
|
||||||
[RelayerJobType.TORNADO_WITHDRAW]: 390000,
|
[RelayerJobType.TORNADO_WITHDRAW]: 390000,
|
||||||
WITHDRAW_WITH_EXTRA: 700000,
|
[RelayerJobType.WITHDRAW_WITH_EXTRA]: 700000,
|
||||||
[RelayerJobType.MINING_REWARD]: 455000,
|
[RelayerJobType.OP_TORNADO_WITHDRAW]: 440000,
|
||||||
[RelayerJobType.MINING_WITHDRAW]: 400000,
|
[RelayerJobType.ARB_TORNADO_WITHDRAW]: 1900000,
|
||||||
};
|
};
|
||||||
// export const minimumBalance = '1000000000000000000';
|
// export const minimumBalance = '1000000000000000000';
|
||||||
// export const minimumTornBalance = '30000000000000000000';
|
// export const minimumTornBalance = '30000000000000000000';
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
import { TransactionData, TxManager } from 'tx-manager';
|
import { TransactionData, TxManager } from 'tx-manager';
|
||||||
import { GasPriceOracle } from 'gas-price-oracle';
|
import { GasPriceOracle } from 'gas-price-oracle';
|
||||||
import { Provider } from '@ethersproject/providers';
|
import { Provider } from '@ethersproject/providers';
|
||||||
|
import { serialize } from '@ethersproject/transactions';
|
||||||
import { formatEther, parseUnits } from 'ethers/lib/utils';
|
import { formatEther, parseUnits } from 'ethers/lib/utils';
|
||||||
import { BigNumber, BigNumberish, BytesLike } from 'ethers';
|
import { BigNumber, BigNumberish, BytesLike } from 'ethers';
|
||||||
import { ProxyLightABI, TornadoProxyABI } from '../contracts';
|
import { ProxyLightABI, TornadoProxyABI } from '../contracts';
|
||||||
import { BASE_FEE_RESERVE_PERCENTAGE, CONFIRMATIONS, gasLimits, MAX_GAS_PRICE, tornadoServiceFee } from '../config';
|
import { BASE_FEE_RESERVE_PERCENTAGE, CONFIRMATIONS, gasLimits, MAX_GAS_PRICE, netId, tornadoServiceFee } from '../config';
|
||||||
import { JobStatus, RelayerJobType } from '../types';
|
import { ChainIds, JobStatus, RelayerJobType } from '../types';
|
||||||
import { PriceService } from './price.service';
|
import { PriceService } from './price.service';
|
||||||
import { Job } from 'bullmq';
|
import { Job } from 'bullmq';
|
||||||
import { RelayerJobData } from '../queue';
|
import { RelayerJobData } from '../queue';
|
||||||
import { ConfigService } from './config.service';
|
import { ConfigService } from './config.service';
|
||||||
import { container, injectable } from 'tsyringe';
|
import { container, injectable } from 'tsyringe';
|
||||||
import { parseJSON } from '../modules/utils';
|
import { parseJSON } from '../modules/utils';
|
||||||
|
import { getOvmGasPriceOracle } from '../modules/contracts';
|
||||||
|
|
||||||
export type WithdrawalData = {
|
export type WithdrawalData = {
|
||||||
contract: string;
|
contract: string;
|
||||||
@ -34,6 +36,7 @@ export class TxService {
|
|||||||
this._currentJob = value;
|
this._currentJob = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gasLimit: number;
|
||||||
txManager: TxManager;
|
txManager: TxManager;
|
||||||
tornadoProxy: TornadoProxyABI | ProxyLightABI;
|
tornadoProxy: TornadoProxyABI | ProxyLightABI;
|
||||||
oracle: GasPriceOracle;
|
oracle: GasPriceOracle;
|
||||||
@ -44,17 +47,33 @@ export class TxService {
|
|||||||
const { privateKey, rpcUrl, netId } = this.config;
|
const { privateKey, rpcUrl, netId } = this.config;
|
||||||
this.tornadoProxy = this.config.proxyContract;
|
this.tornadoProxy = this.config.proxyContract;
|
||||||
this.provider = this.tornadoProxy.provider;
|
this.provider = this.tornadoProxy.provider;
|
||||||
|
const gasPriceOracleConfig = {
|
||||||
|
defaultRpc: rpcUrl,
|
||||||
|
chainId: netId,
|
||||||
|
fallbackGasPrices: this.config?.fallbackGasPrices,
|
||||||
|
};
|
||||||
this.txManager = new TxManager({
|
this.txManager = new TxManager({
|
||||||
privateKey,
|
privateKey,
|
||||||
rpcUrl,
|
rpcUrl,
|
||||||
config: { THROW_ON_REVERT: true, CONFIRMATIONS, MAX_GAS_PRICE, BASE_FEE_RESERVE_PERCENTAGE },
|
config: { THROW_ON_REVERT: true, CONFIRMATIONS, MAX_GAS_PRICE, BASE_FEE_RESERVE_PERCENTAGE },
|
||||||
|
gasPriceOracleConfig,
|
||||||
provider: this.provider,
|
provider: this.provider,
|
||||||
});
|
});
|
||||||
this.oracle = new GasPriceOracle({
|
this.oracle = new GasPriceOracle(gasPriceOracleConfig);
|
||||||
defaultRpc: rpcUrl,
|
switch (netId) {
|
||||||
chainId: netId,
|
case ChainIds.ethereum:
|
||||||
fallbackGasPrices: this.config?.fallbackGasPrices,
|
case ChainIds.goerli:
|
||||||
});
|
this.gasLimit = gasLimits[RelayerJobType.WITHDRAW_WITH_EXTRA];
|
||||||
|
break;
|
||||||
|
case ChainIds.optimism:
|
||||||
|
this.gasLimit = gasLimits[RelayerJobType.OP_TORNADO_WITHDRAW];
|
||||||
|
break;
|
||||||
|
case ChainIds.arbitrum:
|
||||||
|
this.gasLimit = gasLimits[RelayerJobType.ARB_TORNADO_WITHDRAW];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.gasLimit = gasLimits[RelayerJobType.TORNADO_WITHDRAW];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateJobData(data: Partial<RelayerJobData>) {
|
async updateJobData(data: Partial<RelayerJobData>) {
|
||||||
@ -103,18 +122,42 @@ export class TxService {
|
|||||||
value: args[5],
|
value: args[5],
|
||||||
to: this.tornadoProxy.address,
|
to: this.tornadoProxy.address,
|
||||||
data: calldata,
|
data: calldata,
|
||||||
gasLimit: gasLimits['WITHDRAW_WITH_EXTRA'],
|
gasLimit: this.gasLimit,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async checkTornadoFee({ args, contract }: WithdrawalData) {
|
async getL1Fee(data: WithdrawalData, gasPrice: BigNumber) {
|
||||||
|
const { contract, proof, args } = data;
|
||||||
|
const ovmOracle = getOvmGasPriceOracle();
|
||||||
|
const calldata = this.tornadoProxy.interface.encodeFunctionData('withdraw', [contract, proof, ...args]);
|
||||||
|
const nonce = await this.config.wallet.getTransactionCount();
|
||||||
|
const tx = serialize({
|
||||||
|
nonce,
|
||||||
|
type: 0,
|
||||||
|
data: calldata,
|
||||||
|
chainId: netId,
|
||||||
|
value: data.args[5],
|
||||||
|
to: this.tornadoProxy.address,
|
||||||
|
gasLimit: this.gasLimit,
|
||||||
|
gasPrice: BigNumber.from(gasPrice),
|
||||||
|
});
|
||||||
|
return await ovmOracle.getL1Fee(tx);
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkTornadoFee(data: WithdrawalData) {
|
||||||
|
const { contract, args } = data;
|
||||||
const instance = this.config.getInstance(contract);
|
const instance = this.config.getInstance(contract);
|
||||||
if (!instance) throw new Error('Instance not found');
|
if (!instance) throw new Error('Instance not found');
|
||||||
const { currency, amount, decimals } = instance;
|
const { currency, amount, decimals } = instance;
|
||||||
const [fee, refund] = [args[4], args[5]].map(BigNumber.from);
|
const [fee, refund] = [args[4], args[5]].map(BigNumber.from);
|
||||||
const gasPrice = await this.getGasPrice();
|
const gasPrice = await this.getGasPrice();
|
||||||
// TODO check refund value
|
// TODO check refund value
|
||||||
const operationCost = gasPrice.mul(gasLimits[RelayerJobType.TORNADO_WITHDRAW]);
|
let operationCost = gasPrice.mul(this.gasLimit);
|
||||||
|
|
||||||
|
if (netId === ChainIds.optimism) {
|
||||||
|
const l1Fee = await this.getL1Fee(data, gasPrice);
|
||||||
|
operationCost = operationCost.add(l1Fee);
|
||||||
|
}
|
||||||
|
|
||||||
const serviceFee = parseUnits(amount, decimals)
|
const serviceFee = parseUnits(amount, decimals)
|
||||||
.mul(`${tornadoServiceFee * 1e10}`)
|
.mul(`${tornadoServiceFee * 1e10}`)
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
export enum RelayerJobType {
|
export enum RelayerJobType {
|
||||||
TORNADO_WITHDRAW = 'TORNADO_WITHDRAW',
|
TORNADO_WITHDRAW = 'TORNADO_WITHDRAW',
|
||||||
MINING_REWARD = 'MINING_REWARD',
|
WITHDRAW_WITH_EXTRA = 'WITHDRAW_WITH_EXTRA',
|
||||||
MINING_WITHDRAW = 'MINING_WITHDRAW',
|
OP_TORNADO_WITHDRAW = 'OP_TORNADO_WITHDRAW',
|
||||||
|
ARB_TORNADO_WITHDRAW = 'ARB_TORNADO_WITHDRAW',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum JobStatus {
|
export enum JobStatus {
|
||||||
@ -19,6 +20,7 @@ export type Token = { address: string; decimals: number; symbol?: string };
|
|||||||
export enum ChainIds {
|
export enum ChainIds {
|
||||||
'kardia' = 0,
|
'kardia' = 0,
|
||||||
'ethereum' = 1,
|
'ethereum' = 1,
|
||||||
|
'goerli' = 5,
|
||||||
'ubiq' = 8,
|
'ubiq' = 8,
|
||||||
'optimism' = 10,
|
'optimism' = 10,
|
||||||
'songbird' = 19,
|
'songbird' = 19,
|
||||||
|
Loading…
Reference in New Issue
Block a user