-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaegis-export.ts
More file actions
123 lines (104 loc) · 3.86 KB
/
aegis-export.ts
File metadata and controls
123 lines (104 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import type { Address } from "viem";
import RelayerAddressesJson from "../infra/relayer_addresses.json";
import { config } from "../src/config";
import getSecret from "../src/get-secret";
import { deriveRelayerAccount, toRateFeedId } from "../src/utils";
const RelayerAddresses = RelayerAddressesJson as {
[env in "celo" | "celo-sepolia"]: Record<string, Address>;
};
type Environment = keyof typeof RelayerAddresses;
type RateFeed<T extends Environment> = keyof (typeof RelayerAddresses)[T];
interface Relayer {
env: Environment;
rateFeedId: Address;
rateFeed: string;
relayerAddress: Address;
signerAddress: Address;
}
async function aegisExport() {
try {
const mnemonic = await getSecret(config.RELAYER_MNEMONIC_SECRET_ID);
const allRelayers = (
Object.entries(RelayerAddresses) as [
Environment,
(typeof RelayerAddresses)[Environment],
][]
).flatMap(([env, rateFeeds]) =>
Object.keys(rateFeeds).map((rateFeed) =>
createRelayer(env, rateFeed, mnemonic),
),
);
const uniqueRelayers = Array.from(
new Map(
allRelayers.map((relayer) => [relayer.rateFeedId, relayer]),
).values(),
);
const configYaml = generateConfigYaml(uniqueRelayers);
console.log("\x1b[1m" + configYaml + "\x1b[0m");
} catch (error) {
console.error("Error occurred during aegis export:", error);
process.exit(1);
}
}
const createRelayer = <T extends Environment>(
env: T,
rateFeed: RateFeed<T>,
mnemonic: string,
): Relayer => {
// Type assertion (as string) is safe here because we know that the keys of our RelayerAddresses object are always strings
const formattedRateFeed = (rateFeed as string).replace("_", "").toUpperCase();
// We use the format {base}/{quote} when deriving the relayer signer address from the rate feed
const rateFeedWithSlash = (rateFeed as string)
.replace("_", "/")
.toUpperCase();
return {
env,
rateFeed: formattedRateFeed,
rateFeedId: toRateFeedId(formattedRateFeed),
signerAddress: deriveRelayerAccount(mnemonic, rateFeedWithSlash).address,
relayerAddress: RelayerAddresses[env][rateFeed] as Address,
};
};
function generateConfigYaml(relayers: Relayer[]): string {
return `
###############################################################
# Exemplary aegis config.yaml with all relevant values to add #
###############################################################
global:
vars:
# Rate Feed IDs
${relayers.map(({ rateFeed, rateFeedId }) => ` '${rateFeed}': '${rateFeedId}'`).join("\n")}
# Relayer Signer Wallets
${relayers.map(({ rateFeed, signerAddress }) => ` RelayerSigner${rateFeed}: '${signerAddress}'`).join("\n")}
metrics:
# Checks rate feed trading modes
- source: BreakerBox.getRateFeedTradingMode(address rateFeed)(uint8)
schedule: 0/10 * * * * *
type: gauge
chains: all
# NOTE: We filtered out derived CELO rate feeds like 'CELOPHP' here because we typically don't add breakers for them
variants:
${relayers
.map(({ rateFeed }) => ` - [${rateFeed}]`)
.filter((rateFeed) => !rateFeed.includes("CELO"))
.join("\n")}
# Checks for rate feed freshness
- source: SortedOracles.isOldestReportExpired(address rateFeed)(bool,address)
schedule: 0/10 * * * * *
type: gauge
chains: all
variants:
${relayers.map(({ rateFeed }) => ` - [${rateFeed}]`).join("\n")}
# Checks if the signer wallets have enough CELO to pay for the relay() transactions
- source: CELOToken.balanceOf(address owner)(uint256)
schedule: 0/10 * * * * *
type: gauge
chains: all
variants:
${relayers.map(({ rateFeed }) => ` - [RelayerSigner${rateFeed}]`).join("\n")}
################################################################
# Copy/paste the relevant values above into aegis' config.yaml #
################################################################
`;
}
void aegisExport();