Skip to content

Commit

Permalink
Merge branch 'tech/erpc-upgrade' into staging
Browse files Browse the repository at this point in the history
  • Loading branch information
KONFeature committed Feb 7, 2025
2 parents 5bd076b + 9ffd5f7 commit 27a6091
Show file tree
Hide file tree
Showing 16 changed files with 1,907 additions and 144 deletions.
1,716 changes: 1,716 additions & 0 deletions bun.lock

Large diffs are not rendered by default.

Binary file removed bun.lockb
Binary file not shown.
11 changes: 8 additions & 3 deletions infra/erpc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const erpcServiceTargets = new ServiceTargets("ErpcServiceDomain", {
ports: [
{ listen: "80/http", forward: "8080/http" },
{ listen: "443/https", forward: "8080/http" },
{ listen: "6060/http", forward: "6060/http" },
],
health: {
path: "/healthcheck",
Expand All @@ -34,10 +35,10 @@ const erpcServiceTargets = new ServiceTargets("ErpcServiceDomain", {
/**
* Add the erpc service to our master cluster
*/
sstCluster.addService("Erpc", {
export const erpcService = sstCluster.addService("Erpc", {
// hardware config
cpu: "0.25 vCPU",
memory: "0.5 GB",
cpu: "1 vCPU",
memory: "1 GB",
storage: "20 GB",
architecture: "arm64",
// Image to be used
Expand Down Expand Up @@ -82,6 +83,8 @@ sstCluster.addService("Erpc", {
"arn:aws:ssm:eu-west-1:262732185023:parameter/sst/frak-indexer/.fallback/Secret/PIMLICO_API_KEY/value",
DRPC_API_KEY:
"arn:aws:ssm:eu-west-1:262732185023:parameter/sst/frak-indexer/.fallback/Secret/DRPC_API_KEY/value",
DWELIR_API_KEY:
"arn:aws:ssm:eu-west-1:262732185023:parameter/sst/frak-indexer/.fallback/Secret/DWELIR_API_KEY/value",
// Endpoints secrets,
PONDER_RPC_SECRET:
"arn:aws:ssm:eu-west-1:262732185023:parameter/sst/frak-indexer/.fallback/Secret/PONDER_RPC_SECRET/value",
Expand All @@ -105,6 +108,8 @@ sstCluster.addService("Erpc", {
),
}))
),
// Ensure erpc reach a steady state before continuing the deployment process
waitForSteadyState: true,
},
},
});
133 changes: 74 additions & 59 deletions infra/ponder.prod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as aws from "@pulumi/aws";
import { all } from "@pulumi/pulumi";
import { database, sstCluster, vpc } from "./common.ts";
import { ServiceTargets } from "./components/ServiceTargets.ts";
import { erpcService } from "./erpc.ts";
import { getPonderEntrypoint, ponderEnv } from "./utils.ts";

// Get the image we will deploy
Expand All @@ -13,36 +14,43 @@ const image = await aws.ecr.getImage({
/**
* Build the ponder indexing service
*/
sstCluster.addService("PonderProdIndexer", {
// Disable scaling on prod reader
scaling: {
cpuUtilization: false,
memoryUtilization: false,
},
// hardware config
cpu: "0.25 vCPU",
memory: "0.5 GB",
storage: "20 GB",
architecture: "arm64",
// Image to be used
image: image.imageUri,
entrypoint: getPonderEntrypoint("indexer"),
// Link it to the database
link: [database],
// Env
...ponderEnv,
// Logging options
logging: {
retention: "3 days",
},
transform: {
service: {
// Disable rollup update for the indexer
deploymentMinimumHealthyPercent: 0,
deploymentMaximumPercent: 100,
const indexerService = sstCluster.addService(
"PonderProdIndexer",
{
// Disable scaling on prod reader
scaling: {
cpuUtilization: false,
memoryUtilization: false,
},
// hardware config
cpu: "0.25 vCPU",
memory: "0.5 GB",
storage: "20 GB",
architecture: "arm64",
// Image to be used
image: image.imageUri,
entrypoint: getPonderEntrypoint("indexer"),
// Link it to the database
link: [database],
// Env
...ponderEnv,
// Logging options
logging: {
retention: "3 days",
},
transform: {
service: {
// Disable rollup update for the indexer
deploymentMinimumHealthyPercent: 0,
deploymentMaximumPercent: 100,
},
},
},
});
{
// Make sure the indexer depends on the database + erpc
dependsOn: [erpcService],
}
);

// Create the service targets
const ponderServiceTargets = new ServiceTargets("PonderProdServiceDomain", {
Expand All @@ -65,36 +73,43 @@ const ponderServiceTargets = new ServiceTargets("PonderProdServiceDomain", {
/**
* Build the ponder indexing service
*/
sstCluster.addService("PonderProdReader", {
// hardware config
cpu: "0.25 vCPU",
memory: "0.5 GB",
storage: "20 GB",
architecture: "arm64",
// Image to be used
image: image.imageUri,
entrypoint: getPonderEntrypoint("reader"),
// Link it to the database
link: [database],
// Env
...ponderEnv,
// Logging options
logging: {
retention: "3 days",
},
// Link the service to the target groups we previously build
transform: {
service: {
loadBalancers: all(ponderServiceTargets.targetGroups).apply(
(target) =>
Object.values(target).map((target) => ({
targetGroupArn: target.arn,
containerName: "PonderProdReader",
containerPort: target.port.apply(
(port) => port as number
),
}))
),
sstCluster.addService(
"PonderProdReader",
{
// hardware config
cpu: "0.25 vCPU",
memory: "0.5 GB",
storage: "20 GB",
architecture: "arm64",
// Image to be used
image: image.imageUri,
entrypoint: getPonderEntrypoint("reader"),
// Link it to the database
link: [database],
// Env
...ponderEnv,
// Logging options
logging: {
retention: "3 days",
},
// Link the service to the target groups we previously build
transform: {
service: {
loadBalancers: all(ponderServiceTargets.targetGroups).apply(
(target) =>
Object.values(target).map((target) => ({
targetGroupArn: target.arn,
containerName: "PonderProdReader",
containerPort: target.port.apply(
(port) => port as number
),
}))
),
},
},
},
});
{
// Make sure the reader depends on the indexer
dependsOn: [indexerService],
}
);
14 changes: 10 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,20 @@
"npm-check-updates": "^17.1.14",
"@biomejs/biome": "1.9.4",
"@pulumi/aws": "^6.67.0",
"@pulumi/pulumi": "^3.147.0",
"@pulumi/pulumi": "^3.148.0",
"@types/aws-lambda": "8.10.147",
"@types/node": "^22.10.10",
"sst": "3.6.16",
"@types/node": "^22.13.1",
"sst": "3.7.15",
"typescript": "^5.7.3"
},
"engines": {
"node": ">=18.14"
},
"workspaces": ["packages/*", "tools/"]
"workspaces": ["packages/*", "tools/"],
"trustedDependencies": [
"@biomejs/biome",
"@erpc-cloud/cli",
"esbuild",
"protobufjs"
]
}
2 changes: 1 addition & 1 deletion packages/erpc/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ RUN cd /tmp/dev && bun build --outfile ./erpc.js --minify --target node --extern

# Final image
#FROM erpc-dev AS final
FROM ghcr.io/erpc/erpc@sha256:4438b0da324ad352009b15a723b7e09359f4da5a9e07ae60eb6812ff6160d0da AS final
FROM ghcr.io/erpc/erpc@sha256:0a03a85e2186463094904d4ee00baed0cad8a490f0640d6f78fb771d3ab83612 AS final

# Install curl, will be used for healthcheck
RUN apt-get update && apt-get install -y curl
Expand Down
9 changes: 5 additions & 4 deletions packages/erpc/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,18 @@
"build:check": "erpc-config validate",
"lint": "biome lint .",
"typecheck": "tsc",
"dev": "@erpc-cloud/cli dev",
"docker:dev": "docker build --tag frak-erpc . && docker run --env-file ./.env.local -P frak-erpc"
},
"devDependencies": {
"@biomejs/biome": "1.9.4",
"viem": "^2.22.13",
"sst": "3.6.16",
"viem": "^2.22.22",
"sst": "3.7.15",
"typescript": "^5.7.3"
},
"dependencies": {
"@konfeature/erpc-config-generator": "0.1.0",
"@erpc-cloud/config": "^0.0.11"
"@erpc-cloud/config": "^0.0.39",
"@konfeature/erpc-config-generator": "0.1.2"
},
"engines": {
"node": ">=18.14"
Expand Down
34 changes: 30 additions & 4 deletions packages/erpc/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ import {
alchemyRateRules,
blockPiRateRules,
drpcRateRules,
dwelirRateRules,
envioRateRules,
pimlicoRateRules,
} from "./rateLimits";
import { cacheConfig } from "./storage";
import {
alchemyUpstream,
drpcUpstream,
dwelirArbSepoliaUpstream,
dwelirArbUpstream,
envioUpstream,
pimlicoUpstream,
} from "./upstreams";
Expand All @@ -20,7 +23,7 @@ import {
* Build our top level erpc config
*/
export default initErpcConfig({
logLevel: (process.env.ERPC_LOG_LEVEL ?? "info") as LogLevel,
logLevel: (process.env.ERPC_LOG_LEVEL ?? "debug") as LogLevel,
database: {
evmJsonRpcCache: cacheConfig,
},
Expand All @@ -29,14 +32,21 @@ export default initErpcConfig({
maxTimeout: "60s",
listenV6: false,
},
metrics: { enabled: false },
metrics: {
enabled: true,
listenV4: true,
hostV4: "0.0.0.0",
port: 6060,
listenV6: false,
},
})
.addRateLimiters({
alchemy: alchemyRateRules,
envio: envioRateRules,
pimlico: pimlicoRateRules,
blockPi: blockPiRateRules,
drpc: drpcRateRules,
dwelir: dwelirRateRules,
})
// Add networks to the config
.decorate("networks", {
Expand All @@ -49,12 +59,21 @@ export default initErpcConfig({
alchemy: alchemyUpstream,
pimlico: pimlicoUpstream,
drpc: drpcUpstream,
dwelirArb: dwelirArbUpstream,
dwelirArbSepolia: dwelirArbSepoliaUpstream,
})
// Add our ponder prod project
.addProject(({ store: { upstreams, networks } }) => ({
id: "ponder-rpc",
networks: [networks.arbitrum, networks.arbitrumSepolia],
upstreams: [upstreams.alchemy, upstreams.envio, upstreams.drpc],
upstreams: [
upstreams.alchemy,
upstreams.envio,
upstreams.drpc,
upstreams.dwelirArb,
upstreams.dwelirArbSepolia,
],
providers: [],
auth: {
strategies: [
{
Expand All @@ -70,7 +89,14 @@ export default initErpcConfig({
.addProject(({ store: { upstreams, networks } }) => ({
id: "nexus-rpc",
networks: [networks.arbitrum, networks.arbitrumSepolia],
upstreams: [upstreams.alchemy, upstreams.drpc, upstreams.pimlico],
upstreams: [
upstreams.alchemy,
upstreams.drpc,
upstreams.pimlico,
upstreams.dwelirArb,
upstreams.dwelirArbSepolia,
],
providers: [],
auth: {
strategies: [
{
Expand Down
21 changes: 20 additions & 1 deletion packages/erpc/src/networks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@ const defaultFailsafe: FailsafeConfig = {
backoffFactor: 0.5,
jitter: "200ms",
},
// @ts-ignore: Should expose a type union for the hedge policy
hedge: {
delay: "3s",
// delay: "3s",
maxCount: 2,
minDelay: "100ms",
maxDelay: "2s",
quantile: 0.95,
},
};

Expand All @@ -24,6 +28,9 @@ export const arbNetwork = {
},
evm: {
chainId: 42161,
integrity: {
enforceGetLogsBlockRange: true,
},
},
} as const satisfies NetworkConfig;

Expand All @@ -37,5 +44,17 @@ export const arbSepoliaNetwork = {
},
evm: {
chainId: 421614,
integrity: {
enforceGetLogsBlockRange: true,
},
},
// selectionPolicy: {
// // Evaluate upstream every 5min
// // @ts-ignore: Should export a TsDuration type
// evalInterval: 300_000_000_000,
// // Resample every 10min
// // @ts-ignore: Should export a TsDuration type
// resampleInterval: 600_000_000_000,
// resampleCount: 10
// }
} as const satisfies NetworkConfig;
4 changes: 3 additions & 1 deletion packages/erpc/src/rateLimits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const envioRateRules: RuleExport = [
];

export const alchemyRateRules: RuleExport = [
genericRateLimitsRules(200),
genericRateLimitsRules(100),
{
method: "eth_getLogs",
maxCount: 20,
Expand All @@ -52,3 +52,5 @@ export const pimlicoRateRules: RuleExport = [genericRateLimitsRules(400)];
export const blockPiRateRules: RuleExport = [genericRateLimitsRules(100)];

export const drpcRateRules: RuleExport = [genericRateLimitsRules(100)];

export const dwelirRateRules: RuleExport = [genericRateLimitsRules(30)];
Loading

0 comments on commit 27a6091

Please sign in to comment.