wormhole/relayer/spy_relayer/src/configureEnv.ts

573 lines
15 KiB
TypeScript
Raw Normal View History

Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
import {
ChainId,
CHAIN_ID_SOLANA,
2022-08-11 14:47:50 -07:00
isTerraChain,
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
nativeToHexString,
} from "@certusone/wormhole-sdk";
import { getLogger } from "./helpers/logHelper";
export type SupportedToken = {
chainId: ChainId;
address: string;
};
export type CommonEnvironment = {
logLevel: string;
promPort: number;
readinessPort?: number;
logDir?: string;
redisHost: string;
redisPort: number;
};
let loggingEnv: CommonEnvironment | undefined = undefined;
export const getCommonEnvironment: () => CommonEnvironment = () => {
if (loggingEnv) {
return loggingEnv;
} else {
const env = createCommonEnvironment();
loggingEnv = env;
return loggingEnv;
}
};
function createCommonEnvironment(): CommonEnvironment {
let logLevel;
let promPort;
let readinessPort;
let logDir;
let redisHost;
let redisPort;
if (!process.env.LOG_LEVEL) {
throw new Error("Missing required environment variable: LOG_LEVEL");
} else {
logLevel = process.env.LOG_LEVEL;
}
if (!process.env.LOG_DIR) {
//Not mandatory
} else {
logDir = process.env.LOG_DIR;
}
if (!process.env.PROM_PORT) {
throw new Error("Missing required environment variable: PROM_PORT");
} else {
promPort = parseInt(process.env.PROM_PORT);
}
if (!process.env.READINESS_PORT) {
//do nothing
} else {
readinessPort = parseInt(process.env.READINESS_PORT);
}
if (!process.env.REDIS_HOST) {
throw new Error("Missing required environment variable: REDIS_HOST");
} else {
redisHost = process.env.REDIS_HOST;
}
if (!process.env.REDIS_PORT) {
throw new Error("Missing required environment variable: REDIS_PORT");
} else {
redisPort = parseInt(process.env.REDIS_PORT);
}
return { logLevel, promPort, readinessPort, logDir, redisHost, redisPort };
}
export type RelayerEnvironment = {
supportedChains: ChainConfigInfo[];
redisHost: string;
redisPort: number;
clearRedisOnInit: boolean;
demoteWorkingOnInit: boolean;
supportedTokens: { chainId: ChainId; address: string }[];
};
export type ChainConfigInfo = {
chainId: ChainId;
chainName: string;
nativeCurrencySymbol: string;
nodeUrl: string;
tokenBridgeAddress: string;
walletPrivateKey?: string[];
solanaPrivateKey?: Uint8Array[];
bridgeAddress?: string;
terraName?: string;
terraChainId?: string;
terraCoin?: string;
terraGasPriceUrl?: string;
wrappedAsset?: string | null;
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
isTerraClassic?: boolean;
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
};
export type ListenerEnvironment = {
spyServiceHost: string;
spyServiceFilters: { chainId: ChainId; emitterAddress: string }[];
restPort: number;
numSpyWorkers: number;
supportedTokens: { chainId: ChainId; address: string }[];
};
let listenerEnv: ListenerEnvironment | undefined = undefined;
export const getListenerEnvironment: () => ListenerEnvironment = () => {
if (listenerEnv) {
return listenerEnv;
} else {
const env = createListenerEnvironment();
listenerEnv = env;
return listenerEnv;
}
};
const createListenerEnvironment: () => ListenerEnvironment = () => {
let spyServiceHost: string;
let spyServiceFilters: { chainId: ChainId; emitterAddress: string }[] = [];
let restPort: number;
let numSpyWorkers: number;
let supportedTokens: { chainId: ChainId; address: string }[] = [];
const logger = getLogger();
if (!process.env.SPY_SERVICE_HOST) {
throw new Error("Missing required environment variable: SPY_SERVICE_HOST");
} else {
spyServiceHost = process.env.SPY_SERVICE_HOST;
}
logger.info("Getting SPY_SERVICE_FILTERS...");
if (!process.env.SPY_SERVICE_FILTERS) {
throw new Error(
"Missing required environment variable: SPY_SERVICE_FILTERS"
);
} else {
const array = JSON.parse(process.env.SPY_SERVICE_FILTERS);
// if (!array.foreach) {
if (!array || !Array.isArray(array)) {
throw new Error("Spy service filters is not an array.");
} else {
array.forEach((filter: any) => {
if (filter.chainId && filter.emitterAddress) {
logger.info(
"nativeToHexString: " +
nativeToHexString(filter.emitterAddress, filter.chainId)
);
spyServiceFilters.push({
chainId: filter.chainId as ChainId,
emitterAddress: filter.emitterAddress,
});
} else {
throw new Error("Invalid filter record. " + filter.toString());
}
});
}
}
logger.info("Getting REST_PORT...");
if (!process.env.REST_PORT) {
throw new Error("Missing required environment variable: REST_PORT");
} else {
restPort = parseInt(process.env.REST_PORT);
}
logger.info("Getting SPY_NUM_WORKERS...");
if (!process.env.SPY_NUM_WORKERS) {
throw new Error("Missing required environment variable: SPY_NUM_WORKERS");
} else {
numSpyWorkers = parseInt(process.env.SPY_NUM_WORKERS);
}
logger.info("Getting SUPPORTED_TOKENS...");
if (!process.env.SUPPORTED_TOKENS) {
throw new Error("Missing required environment variable: SUPPORTED_TOKENS");
} else {
// const array = JSON.parse(process.env.SUPPORTED_TOKENS);
const array = eval(process.env.SUPPORTED_TOKENS);
if (!array || !Array.isArray(array)) {
throw new Error("SUPPORTED_TOKENS is not an array.");
} else {
array.forEach((token: any) => {
if (token.chainId && token.address) {
supportedTokens.push({
chainId: token.chainId,
address: token.address,
});
} else {
throw new Error("Invalid token record. " + token.toString());
}
});
}
}
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
logger.info("Setting the listener backend...");
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
return {
spyServiceHost,
spyServiceFilters,
restPort,
numSpyWorkers,
supportedTokens,
};
};
let relayerEnv: RelayerEnvironment | undefined = undefined;
export const getRelayerEnvironment: () => RelayerEnvironment = () => {
if (relayerEnv) {
return relayerEnv;
} else {
const env = createRelayerEnvironment();
relayerEnv = env;
return relayerEnv;
}
};
const createRelayerEnvironment: () => RelayerEnvironment = () => {
let supportedChains: ChainConfigInfo[] = [];
let redisHost: string;
let redisPort: number;
let clearRedisOnInit: boolean;
let demoteWorkingOnInit: boolean;
let supportedTokens: { chainId: ChainId; address: string }[] = [];
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
const logger = getLogger();
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
if (!process.env.REDIS_HOST) {
throw new Error("Missing required environment variable: REDIS_HOST");
} else {
redisHost = process.env.REDIS_HOST;
}
if (!process.env.REDIS_PORT) {
throw new Error("Missing required environment variable: REDIS_PORT");
} else {
redisPort = parseInt(process.env.REDIS_PORT);
}
if (process.env.CLEAR_REDIS_ON_INIT === undefined) {
throw new Error(
"Missing required environment variable: CLEAR_REDIS_ON_INIT"
);
} else {
if (process.env.CLEAR_REDIS_ON_INIT.toLowerCase() === "true") {
clearRedisOnInit = true;
} else {
clearRedisOnInit = false;
}
}
if (process.env.DEMOTE_WORKING_ON_INIT === undefined) {
throw new Error(
"Missing required environment variable: DEMOTE_WORKING_ON_INIT"
);
} else {
if (process.env.DEMOTE_WORKING_ON_INIT.toLowerCase() === "true") {
demoteWorkingOnInit = true;
} else {
demoteWorkingOnInit = false;
}
}
supportedChains = loadChainConfig();
if (!process.env.SUPPORTED_TOKENS) {
throw new Error("Missing required environment variable: SUPPORTED_TOKENS");
} else {
// const array = JSON.parse(process.env.SUPPORTED_TOKENS);
const array = eval(process.env.SUPPORTED_TOKENS);
if (!array || !Array.isArray(array)) {
throw new Error("SUPPORTED_TOKENS is not an array.");
} else {
array.forEach((token: any) => {
if (token.chainId && token.address) {
supportedTokens.push({
chainId: token.chainId,
address: token.address,
});
} else {
throw new Error("Invalid token record. " + token.toString());
}
});
}
}
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
logger.info("Setting the relayer backend...");
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
return {
supportedChains,
redisHost,
redisPort,
clearRedisOnInit,
demoteWorkingOnInit,
supportedTokens,
};
};
//Polygon is not supported on local Tilt network atm.
export function loadChainConfig(): ChainConfigInfo[] {
if (!process.env.SUPPORTED_CHAINS) {
throw new Error("Missing required environment variable: SUPPORTED_CHAINS");
}
if (!process.env.PRIVATE_KEYS) {
throw new Error("Missing required environment variable: PRIVATE_KEYS");
}
const unformattedChains = JSON.parse(process.env.SUPPORTED_CHAINS);
const unformattedPrivateKeys = JSON.parse(process.env.PRIVATE_KEYS);
const supportedChains: ChainConfigInfo[] = [];
if (!unformattedChains.forEach) {
throw new Error("SUPPORTED_CHAINS arg was not an array.");
}
if (!unformattedPrivateKeys.forEach) {
throw new Error("PRIVATE_KEYS arg was not an array.");
}
unformattedChains.forEach((element: any) => {
if (!element.chainId) {
throw new Error("Invalid chain config: " + element);
}
const privateKeyObj = unformattedPrivateKeys.find(
(x: any) => x.chainId === element.chainId
);
if (!privateKeyObj) {
throw new Error(
"Failed to find private key object for configured chain ID: " +
element.chainId
);
}
if (element.chainId === CHAIN_ID_SOLANA) {
supportedChains.push(
createSolanaChainConfig(element, privateKeyObj.privateKeys)
);
2022-08-11 14:47:50 -07:00
} else if (isTerraChain(element.chainId)) {
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
supportedChains.push(
createTerraChainConfig(element, privateKeyObj.privateKeys)
);
} else {
supportedChains.push(
createEvmChainConfig(element, privateKeyObj.privateKeys)
);
}
});
return supportedChains;
}
function createSolanaChainConfig(
config: any,
privateKeys: any[]
): ChainConfigInfo {
let chainId: ChainId;
let chainName: string;
let nativeCurrencySymbol: string;
let nodeUrl: string;
let tokenBridgeAddress: string;
let solanaPrivateKey: Uint8Array[] = [];
let bridgeAddress: string;
let wrappedAsset: string | null;
if (!config.chainId) {
throw new Error("Missing required field in chain config: chainId");
}
if (!config.chainName) {
throw new Error("Missing required field in chain config: chainName");
}
if (!config.nativeCurrencySymbol) {
throw new Error(
"Missing required field in chain config: nativeCurrencySymbol"
);
}
if (!config.nodeUrl) {
throw new Error("Missing required field in chain config: nodeUrl");
}
if (!config.tokenBridgeAddress) {
throw new Error(
"Missing required field in chain config: tokenBridgeAddress"
);
}
if (!(privateKeys && privateKeys.length && privateKeys.forEach)) {
throw new Error(
"Ill formatted object received as private keys for Solana."
);
}
if (!config.bridgeAddress) {
throw new Error("Missing required field in chain config: bridgeAddress");
}
if (!config.wrappedAsset) {
throw new Error("Missing required field in chain config: wrappedAsset");
}
chainId = config.chainId;
chainName = config.chainName;
nativeCurrencySymbol = config.nativeCurrencySymbol;
nodeUrl = config.nodeUrl;
tokenBridgeAddress = config.tokenBridgeAddress;
bridgeAddress = config.bridgeAddress;
wrappedAsset = config.wrappedAsset;
privateKeys.forEach((item: any) => {
try {
const uint = Uint8Array.from(item);
solanaPrivateKey.push(uint);
} catch (e) {
throw new Error(
"Failed to coerce Solana private keys into a uint array. ENV JSON is possibly incorrect."
);
}
});
return {
chainId,
chainName,
nativeCurrencySymbol,
nodeUrl,
tokenBridgeAddress,
bridgeAddress,
solanaPrivateKey,
wrappedAsset,
};
}
function createTerraChainConfig(
config: any,
privateKeys: any[]
): ChainConfigInfo {
let chainId: ChainId;
let chainName: string;
let nativeCurrencySymbol: string;
let nodeUrl: string;
let tokenBridgeAddress: string;
let walletPrivateKey: string[];
let terraName: string;
let terraChainId: string;
let terraCoin: string;
let terraGasPriceUrl: string;
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
let isTerraClassic = false;
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
if (!config.chainId) {
throw new Error("Missing required field in chain config: chainId");
}
if (!config.chainName) {
throw new Error("Missing required field in chain config: chainName");
}
if (!config.nativeCurrencySymbol) {
throw new Error(
"Missing required field in chain config: nativeCurrencySymbol"
);
}
if (!config.nodeUrl) {
throw new Error("Missing required field in chain config: nodeUrl");
}
if (!config.tokenBridgeAddress) {
throw new Error(
"Missing required field in chain config: tokenBridgeAddress"
);
}
if (!(privateKeys && privateKeys.length && privateKeys.forEach)) {
throw new Error("Private keys for Terra are length zero or not an array.");
}
if (!config.terraName) {
throw new Error("Missing required field in chain config: terraName");
}
if (!config.terraChainId) {
throw new Error("Missing required field in chain config: terraChainId");
}
if (!config.terraCoin) {
throw new Error("Missing required field in chain config: terraCoin");
}
if (!config.terraGasPriceUrl) {
throw new Error("Missing required field in chain config: terraGasPriceUrl");
}
chainId = config.chainId;
chainName = config.chainName;
nativeCurrencySymbol = config.nativeCurrencySymbol;
nodeUrl = config.nodeUrl;
tokenBridgeAddress = config.tokenBridgeAddress;
walletPrivateKey = privateKeys;
terraName = config.terraName;
terraChainId = config.terraChainId;
terraCoin = config.terraCoin;
terraGasPriceUrl = config.terraGasPriceUrl;
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
isTerraClassic = config.isTerraClassic || false;
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
return {
chainId,
chainName,
nativeCurrencySymbol,
nodeUrl,
tokenBridgeAddress,
walletPrivateKey,
terraName,
terraChainId,
terraCoin,
terraGasPriceUrl,
Modular relayer support (#1266) * Add the default backend for the relayer Start to slowly split things out. * Configure the backends when configuring the env * First stab at the pluggable listener backend * Update relayer example (and test) config * relayer: JIT backend * relayer: walletMonitor remove useless function * relayer: update worker init() funcs It is silly to accept a boolean in thing.init() vs just not running init if you don't want to run thing. * relayer: remove env property from Listener It is verified in init() in spy_listener.ts and rest_listen.ts, so it can be deferred to not require the import. * relayer: clean up the main bits Only try to init() something when it is actually supposed to run per the cli flags. * spy_relayer: more descriptive var name in main * spy_relayer: Update relay worker with more docs * spy_relayer: add targetChainName to WorkerInfo This makes it easier to pretty print the chain name in the logs without having to look the name up. * spy_relayer: update logs and use the backend * Use the Relayer interface's process() method in place of processVaa() * Update the logs to include the chain name in the worker and auditor threads * spy_relayer: remove processRequest() It has been moved to the process() method of the default Relayer backend. * spy_relayer: start fleshing out the Relayer default * spy_relayer: fix a logic bug in checkQueue() Co-authored-by: @swimricky * spy_relayer: update TokenBridgeRelayer.process() * Remove some extra logic * Actually use the ChainId type since the id of 0 is in the sdk now * spy_signature: add Relayer.runAuditor() The auditor code is payload specific and needs to be with the backend. * spy_relayer: move Relayer.runAuditor() Make it part of the backend since the backend has all of the payload specific logic into it. * spy_relayer: move relay() --> Relayer.relay() The actual relaying is part of the backend, so make it so. * spy_relayer: add Relayer.runAuditor() * spy_relayer: no more deprecated hexToNativeString * spy_relayer: implement Relayer.targetChainId() This is used for finding workable items in the incoming queue to toss into the working queue. * spy_relayer: remove relay.ts The relay() function was moved to Relayer.relay() * spy_relayer: more uses of deprecated hexToNativeString() * spy_relayer: remove unused import * spy_relayer: review feedback from @bruce-riley * Fix some spelling tyops * Simplify some logging * Simplify a conditional for the payload version check * spy_relayer: misc fixes and code clean up * Fixed integration tests * Added launch.json file for debugging in VS Code * Updated to latest wormhole SDK * Backup queue uses same key as redis * Added Terra Classic flag * Throttle potential infinite loop in audit thread * Fixed spy service connection leak Co-authored-by: Evan Gray <battledingo@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com>
2022-08-05 07:20:36 -07:00
isTerraClassic,
Spy relayer cleanup (#1015) * initial spy-relayer * Update spy_relayer Dockerfile * added example mainnet config files * split out private keys into its own ENV variable * Update spy relayer supportedChains.json To remove the `walletPrivateKey` entries. All of the private keys have been split out into their own json file. * fixed evm private key env parse * missing solana accounts report 0 balance, rather than error * wallet address is logged in debug * spy_relayer: enabled prometheus default metrics Also set a prefix of `relayer_` * spy_relayer: updates to the prometheus bits * Use a single metric registry * Use a simpler metric name and add labels for individual wallets * spy_relayer: human readable app mode in the metrics [ listener | relayer | both ] * spy_relayer: unify metrics * remove the collection of default metrics * hardcode the `spy_relayer_` prefix on all custom metrics * fixed dep arrays, nullable terra token/balance info * attempt stack debug * debug pullTerraBalance * provider http or ws * update sdk * logging for tokenAddress is 0 * fix foreign address calc * fix calcLocalAddressesTerra * relayer/spy_relayer: update prometheus helpers Add / url handler for the ingress-gce stupid load balancer that doesn't support custom url healthchecks unless you make a BackendConfig custom resource definition. * logging refinement * use chain name in prometheus * adjust retry timeout calculation * spy_relayer: update prometheus bits * improved error handling * relayer ui improvements * prep sdk release * use latest sdk, manual redeem button * relaying ux improvements * gas price fix * shortened terra success log * use gh base relayer list * fix prometheus urls * Update prometheus metric name * only show TPS warning on mainnet * show relayer fee in source preview * fix unwrap check * add native bool to balance metric * logging improvements * add feeRecipientAddress to redeemOnSolana * gather solana fees * remove relayer ws support * add nativeCurrencySymbol to ChainConfigInfo * fix solana native symbol * demoteWorking option, logger contexts * scoped logging * bridge_ui: unwrap native * add evm wallet monitor test * solana vaa parsing fix * add monitorRedis * make Jeff's brain happy * log demoting keys * register redisQueue metric * human readable redisQueue metric * fix timestamp inconsistency * use scopedLogger for the first level of workers * pull wallet balances in parallel * more scoped logging * pick a solana fee * moving keys log improvement * update eth gas calculations based on recent txs * use postVaaSolanaWithRetry * split success and failures by chain * fix using terraCoin * check prom every 10s * batch getting evm token balances * batch calcLocalAddressesEVM * debug worker logging * log retry number * support Polygon? * reset status on demotion * enhance! * update avax fee Co-authored-by: Chase Moran <chasemoran45@gmail.com> Co-authored-by: Kevin Peters <kpeters@jumptrading.com> Co-authored-by: Evan Gray <battledingo@gmail.com>
2022-03-28 20:39:08 -07:00
};
}
function createEvmChainConfig(
config: any,
privateKeys: any[]
): ChainConfigInfo {
let chainId: ChainId;
let chainName: string;
let nativeCurrencySymbol: string;
let nodeUrl: string;
let tokenBridgeAddress: string;
let walletPrivateKey: string[];
let wrappedAsset: string;
if (!config.chainId) {
throw new Error("Missing required field in chain config: chainId");
}
if (!config.chainName) {
throw new Error("Missing required field in chain config: chainName");
}
if (!config.nativeCurrencySymbol) {
throw new Error(
"Missing required field in chain config: nativeCurrencySymbol"
);
}
if (!config.nodeUrl) {
throw new Error("Missing required field in chain config: nodeUrl");
}
if (!config.tokenBridgeAddress) {
throw new Error(
"Missing required field in chain config: tokenBridgeAddress"
);
}
if (!(privateKeys && privateKeys.length && privateKeys.forEach)) {
throw new Error(
`Private keys for chain id ${config.chainId} are length zero or not an array.`
);
}
if (!config.wrappedAsset) {
throw new Error("Missing required field in chain config: wrappedAsset");
}
chainId = config.chainId;
chainName = config.chainName;
nativeCurrencySymbol = config.nativeCurrencySymbol;
nodeUrl = config.nodeUrl;
tokenBridgeAddress = config.tokenBridgeAddress;
walletPrivateKey = privateKeys;
wrappedAsset = config.wrappedAsset;
return {
chainId,
chainName,
nativeCurrencySymbol,
nodeUrl,
tokenBridgeAddress,
walletPrivateKey,
wrappedAsset,
};
}