Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 51 additions & 9 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,31 @@ type Config struct {
OpenAudioURLs []string
ChainId string
BirdeyeToken string
SolanaIndexerWorkers int
SolanaIndexerRetryInterval time.Duration
CommsMessagePush bool
AudiusdChainID uint
AudiusdEntityManagerAddress string
AudiusAppUrl string
RewardCodeAuthorizedKeys []string
LaunchpadDeterministicSecret string
UnsplashKeys []string
// HTTP(S) JSON-RPC endpoint for the Ethereum mainnet provider (e.g. an
// Alchemy URL). Used by the eth-indexer for backfill `eth_getLogs` and
// targeted `balanceOf` reads. If empty, the indexer is a no-op.
EthRpcUrl string
// WebSocket JSON-RPC endpoint used by the eth-indexer for live
// subscriptions to AUDIO Transfer events. Auto-derived from EthRpcUrl
// (https:// -> wss://) if left unset.
EthWsUrl string
// AUDIO ERC-20 contract address on Ethereum mainnet. Override only when
// pointing at a non-mainnet deployment.
EthAudioContractAddress string
// Audius Staking proxy address — used to read totalStakedFor(holder).
EthStakingContractAddress string
// Audius DelegateManager address — used to read
// getTotalDelegatorStake(holder).
EthDelegateManagerContractAddress string
SolanaIndexerWorkers int
SolanaIndexerRetryInterval time.Duration
CommsMessagePush bool
AudiusdChainID uint
AudiusdEntityManagerAddress string
AudiusAppUrl string
RewardCodeAuthorizedKeys []string
LaunchpadDeterministicSecret string
UnsplashKeys []string
// Nodes that volunteer as STORE_ALL nodes and are always included in mirrors lists
StoreAllNodes []string
// Nodes that are truly dead and should not be included in rendezvous
Expand Down Expand Up @@ -81,6 +97,11 @@ var Cfg = Config{
AudiusdURL: os.Getenv("audiusdUrl"),
OpenAudioURLs: []string{},
BirdeyeToken: os.Getenv("birdeyeToken"),
EthRpcUrl: os.Getenv("ethRpcUrl"),
EthWsUrl: os.Getenv("ethWsUrl"),
EthAudioContractAddress: os.Getenv("ethAudioContractAddress"),
EthStakingContractAddress: os.Getenv("ethStakingContractAddress"),
EthDelegateManagerContractAddress: os.Getenv("ethDelegateManagerContractAddress"),
SolanaIndexerWorkers: 50,
SolanaIndexerRetryInterval: 5 * time.Minute,
CommsMessagePush: true,
Expand All @@ -100,6 +121,27 @@ func init() {

Cfg.SolanaConfig = NewSolanaConfig()

// Default AUDIO ERC-20 + staking + delegate manager to mainnet addresses
// (from packages/sdk/src/sdk/config/production.ts).
if Cfg.EthAudioContractAddress == "" {
Cfg.EthAudioContractAddress = "0x18aAA7115705e8be94bfFEbDE57Af9BFc265B998"
}
if Cfg.EthStakingContractAddress == "" {
Cfg.EthStakingContractAddress = "0xe6D97B2099F142513be7A2a068bE040656Ae4591"
}
if Cfg.EthDelegateManagerContractAddress == "" {
Cfg.EthDelegateManagerContractAddress = "0x4d7968ebfD390D5E7926Cb3587C39eFf2F9FB225"
}
// Derive WS endpoint from the HTTP endpoint if not set explicitly.
if Cfg.EthWsUrl == "" && Cfg.EthRpcUrl != "" {
switch {
case strings.HasPrefix(Cfg.EthRpcUrl, "https://"):
Cfg.EthWsUrl = "wss://" + strings.TrimPrefix(Cfg.EthRpcUrl, "https://")
case strings.HasPrefix(Cfg.EthRpcUrl, "http://"):
Cfg.EthWsUrl = "ws://" + strings.TrimPrefix(Cfg.EthRpcUrl, "http://")
}
}

switch env := os.Getenv("ENV"); env {
case "dev":
fallthrough
Expand Down
22 changes: 22 additions & 0 deletions ddl/migrations/0203_eth_wallet_balances.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
BEGIN;

CREATE TABLE IF NOT EXISTS eth_wallet_balances (
wallet TEXT PRIMARY KEY,
balance NUMERIC NOT NULL DEFAULT 0,
blocknumber BIGINT,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE eth_wallet_balances IS 'AUDIO ERC-20 balances (in wei) for tracked Ethereum wallets — primary users.wallet and chain=eth associated_wallets. Maintained event-driven by the eth-indexer (WebSocket subscription to the AUDIO Transfer topic, targeted balanceOf reads).';

CREATE INDEX IF NOT EXISTS eth_wallet_balances_updated_at_idx ON eth_wallet_balances (updated_at);
COMMENT ON INDEX eth_wallet_balances_updated_at_idx IS 'Supports staleness queries / catch-up sweeps.';

CREATE TABLE IF NOT EXISTS eth_indexer_checkpoints (
name TEXT PRIMARY KEY,
last_block BIGINT NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE eth_indexer_checkpoints IS 'Resumable backfill checkpoints for the eth-indexer (last block whose Transfer events have been processed, keyed by subscription name).';

COMMIT;
Loading
Loading