From 9f7f72c3cb98bababf6ab47a8523c611cf71baea Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Fri, 5 Nov 2021 15:18:54 +0100 Subject: [PATCH] Encode addresses as base58 --- connector-lib/src/main.rs | 8 ++++-- connector-lib/src/mango.rs | 54 +++++++++++++++++++------------------- scripts/create_schema.sql | 46 ++++++++++++++++---------------- 3 files changed, 56 insertions(+), 52 deletions(-) diff --git a/connector-lib/src/main.rs b/connector-lib/src/main.rs index 56904db..102a9b4 100644 --- a/connector-lib/src/main.rs +++ b/connector-lib/src/main.rs @@ -80,6 +80,10 @@ pub type AccountTables = Vec>; struct RawAccountTable {} +pub fn encode_address(addr: &Pubkey) -> String { + bs58::encode(&addr.to_bytes()).into_string() +} + #[async_trait] impl AccountTable for RawAccountTable { fn table_name(&self) -> &str { @@ -91,8 +95,8 @@ impl AccountTable for RawAccountTable { client: &postgres_query::Caching, account_write: &AccountWrite, ) -> Result<(), anyhow::Error> { - let pubkey: &[u8] = &account_write.pubkey.to_bytes(); - let owner: &[u8] = &account_write.owner.to_bytes(); + let pubkey = encode_address(&account_write.pubkey); + let owner = encode_address(&account_write.owner); // TODO: should update for same write_version to work with websocket input let query = postgres_query::query!( diff --git a/connector-lib/src/mango.rs b/connector-lib/src/mango.rs index c5bc7a3..d79a657 100644 --- a/connector-lib/src/mango.rs +++ b/connector-lib/src/mango.rs @@ -10,7 +10,7 @@ use { std::{cmp, error, mem}, }; -use crate::{AccountTable, AccountWrite}; +use crate::{encode_address, AccountTable, AccountWrite}; #[derive(Debug, Clone)] pub struct SqlNumericI80F48(pub I80F48); @@ -262,11 +262,11 @@ impl AccountTable for MangoAccountTable { // TODO: Also filter on mango_group? - let pubkey: &[u8] = &account_write.pubkey.to_bytes(); + let pubkey = encode_address(&account_write.pubkey); let data = MangoAccount::load_from_bytes(&account_write.data)?; - let owner: &[u8] = &data.owner.to_bytes(); - let mango_group: &[u8] = &data.mango_group.to_bytes(); + let owner = encode_address(&data.owner); + let mango_group = encode_address(&data.mango_group); let version = data.meta_data.version as i16; let extra_info = &data.meta_data.extra_info as &[u8]; let in_margin_basket = &data.in_margin_basket as &[bool]; @@ -284,8 +284,8 @@ impl AccountTable for MangoAccountTable { let spot_open_orders = data .spot_open_orders .iter() - .map(|key| key.to_bytes().to_vec()) - .collect::>>(); + .map(|key| encode_address(&key)) + .collect::>(); let perp_accounts = data .perp_accounts .iter() @@ -323,7 +323,7 @@ impl AccountTable for MangoAccountTable { .collect::>(); let msrm_amount = SqlNumericU64(data.msrm_amount); let info = &data.info as &[u8]; - let advanced_orders_key = &data.advanced_orders_key.to_bytes() as &[u8]; + let advanced_orders_key = encode_address(&data.advanced_orders_key); let padding = &data.padding as &[u8]; let query = postgres_query::query!( @@ -379,14 +379,14 @@ impl AccountTable for MangoAccountTable { #[derive(Debug, ToSql)] struct TokenInfo { - mint: Vec, - root_bank: Vec, + mint: String, + root_bank: String, decimals: i16, padding: Vec, } #[derive(Debug, ToSql)] struct SpotMarketInfo { - spot_market: Vec, + spot_market: String, maint_asset_weight: SqlNumericI80F48, init_asset_weight: SqlNumericI80F48, maint_liab_weight: SqlNumericI80F48, @@ -395,7 +395,7 @@ struct SpotMarketInfo { } #[derive(Debug, ToSql)] struct PerpMarketInfo { - perp_market: Vec, + perp_market: String, maint_asset_weight: SqlNumericI80F48, init_asset_weight: SqlNumericI80F48, maint_liab_weight: SqlNumericI80F48, @@ -428,7 +428,7 @@ impl AccountTable for MangoGroupTable { // TODO: Also filter on mango_group pubkey? - let pubkey: &[u8] = &account_write.pubkey.to_bytes(); + let pubkey = encode_address(&account_write.pubkey); let data = MangoGroup::load_from_bytes(&account_write.data)?; let version = data.meta_data.version as i16; let extra_info = &data.meta_data.extra_info as &[u8]; @@ -437,8 +437,8 @@ impl AccountTable for MangoGroupTable { .tokens .iter() .map(|token| TokenInfo { - mint: token.mint.to_bytes().to_vec(), - root_bank: token.root_bank.to_bytes().to_vec(), + mint: encode_address(&token.mint), + root_bank: encode_address(&token.root_bank), decimals: token.decimals as i16, padding: token.padding.to_vec(), }) @@ -447,7 +447,7 @@ impl AccountTable for MangoGroupTable { .spot_markets .iter() .map(|market| SpotMarketInfo { - spot_market: market.spot_market.to_bytes().to_vec(), + spot_market: encode_address(&market.spot_market), maint_asset_weight: SqlNumericI80F48(market.maint_asset_weight), init_asset_weight: SqlNumericI80F48(market.init_asset_weight), maint_liab_weight: SqlNumericI80F48(market.maint_liab_weight), @@ -459,7 +459,7 @@ impl AccountTable for MangoGroupTable { .perp_markets .iter() .map(|market| PerpMarketInfo { - perp_market: market.perp_market.to_bytes().to_vec(), + perp_market: encode_address(&market.perp_market), maint_asset_weight: SqlNumericI80F48(market.maint_asset_weight), init_asset_weight: SqlNumericI80F48(market.init_asset_weight), maint_liab_weight: SqlNumericI80F48(market.maint_liab_weight), @@ -474,18 +474,18 @@ impl AccountTable for MangoGroupTable { let oracles = data .oracles .iter() - .map(|key| key.to_bytes().to_vec()) - .collect::>>(); + .map(|key| encode_address(&key)) + .collect::>(); let signer_nonce = SqlNumericU64(data.signer_nonce); - let signer_key: &[u8] = &data.signer_key.to_bytes(); - let admin: &[u8] = &data.admin.to_bytes(); - let dex_program_id: &[u8] = &data.dex_program_id.to_bytes(); - let mango_cache: &[u8] = &data.mango_cache.to_bytes(); + let signer_key = encode_address(&data.signer_key); + let admin = encode_address(&data.admin); + let dex_program_id = encode_address(&data.dex_program_id); + let mango_cache = encode_address(&data.mango_cache); let valid_interval = SqlNumericU64(data.valid_interval); - let insurance_vault: &[u8] = &data.insurance_vault.to_bytes(); - let srm_vault: &[u8] = &data.srm_vault.to_bytes(); - let msrm_vault: &[u8] = &data.msrm_vault.to_bytes(); - let fees_vault: &[u8] = &data.fees_vault.to_bytes(); + let insurance_vault = encode_address(&data.insurance_vault); + let srm_vault = encode_address(&data.srm_vault); + let msrm_vault = encode_address(&data.msrm_vault); + let fees_vault = encode_address(&data.fees_vault); let padding = &data.padding as &[u8]; let query = postgres_query::query!( @@ -574,7 +574,7 @@ impl AccountTable for MangoCacheTable { // TODO: This one can't be fitlered to only use the one for our mango_group? - let pubkey: &[u8] = &account_write.pubkey.to_bytes(); + let pubkey = encode_address(&account_write.pubkey); let data = MangoCache::load_from_bytes(&account_write.data)?; let version = data.meta_data.version as i16; let extra_info = &data.meta_data.extra_info as &[u8]; diff --git a/scripts/create_schema.sql b/scripts/create_schema.sql index 5bc84f1..73292aa 100644 --- a/scripts/create_schema.sql +++ b/scripts/create_schema.sql @@ -4,10 +4,10 @@ -- The table storing account writes, keeping only the newest write_version per slot CREATE TABLE account_write ( - pubkey BYTEA NOT NULL, + pubkey VARCHAR(44) NOT NULL, slot BIGINT NOT NULL, write_version BIGINT NOT NULL, - owner BYTEA, + owner VARCHAR(44), lamports BIGINT NOT NULL, executable BOOL NOT NULL, rent_epoch BIGINT NOT NULL, @@ -19,7 +19,7 @@ CREATE TABLE account_write ( CREATE TABLE slot ( slot BIGINT PRIMARY KEY, parent BIGINT, - status varchar(16) NOT NULL, + status VARCHAR(16) NOT NULL, uncle BOOL NOT NULL ); @@ -36,19 +36,19 @@ CREATE TYPE "PerpAccount" AS ( ); CREATE TABLE mango_account_write ( - pubkey BYTEA NOT NULL, + pubkey VARCHAR(44) NOT NULL, slot BIGINT NOT NULL, write_version BIGINT NOT NULL, version INT2, is_initialized BOOL, extra_info BYTEA, - mango_group BYTEA, - owner BYTEA, + mango_group VARCHAR(44), + owner VARCHAR(44), in_margin_basket BOOL[], num_in_margin_basket INT2, deposits NUMERIC[], -- I80F48[] borrows NUMERIC[], -- I80F48[] - spot_open_orders BYTEA[], + spot_open_orders VARCHAR(44)[], perp_accounts "PerpAccount"[], order_market INT2[], order_side INT2[], @@ -58,21 +58,21 @@ CREATE TABLE mango_account_write ( being_liquidated BOOL, is_bankrupt BOOL, info BYTEA, - advanced_orders_key BYTEA, + advanced_orders_key VARCHAR(44), padding BYTEA, PRIMARY KEY (pubkey, slot, write_version) ); CREATE TYPE "TokenInfo" AS ( - mint BYTEA, - root_bank BYTEA, + mint VARCHAR(44), + root_bank VARCHAR(44), decimals INT2, padding BYTEA ); CREATE TYPE "SpotMarketInfo" AS ( - spot_market BYTEA, + spot_market VARCHAR(44), maint_asset_weight NUMERIC, -- all I80F48 init_asset_weight NUMERIC, maint_liab_weight NUMERIC, @@ -81,7 +81,7 @@ CREATE TYPE "SpotMarketInfo" AS ( ); CREATE TYPE "PerpMarketInfo" AS ( - perp_market BYTEA, + perp_market VARCHAR(44), maint_asset_weight NUMERIC, -- all I80F48 init_asset_weight NUMERIC, maint_liab_weight NUMERIC, @@ -94,7 +94,7 @@ CREATE TYPE "PerpMarketInfo" AS ( ); CREATE TABLE mango_group_write ( - pubkey BYTEA NOT NULL, + pubkey VARCHAR(44) NOT NULL, slot BIGINT NOT NULL, write_version BIGINT NOT NULL, version INT2, @@ -104,17 +104,17 @@ CREATE TABLE mango_group_write ( tokens "TokenInfo"[], spot_markets "SpotMarketInfo"[], perp_markets "PerpMarketInfo"[], - oracles BYTEA[], + oracles VARCHAR(44)[], signer_nonce NUMERIC, -- u64 - signer_key BYTEA, - "admin" BYTEA, - dex_program_id BYTEA, - mango_cache BYTEA, + signer_key VARCHAR(44), + "admin" VARCHAR(44), + dex_program_id VARCHAR(44), + mango_cache VARCHAR(44), valid_interval NUMERIC, -- u64 - insurance_vault BYTEA, - srm_vault BYTEA, - msrm_vault BYTEA, - fees_vault BYTEA, + insurance_vault VARCHAR(44), + srm_vault VARCHAR(44), + msrm_vault VARCHAR(44), + fees_vault VARCHAR(44), padding BYTEA, PRIMARY KEY (pubkey, slot, write_version) ); @@ -137,7 +137,7 @@ CREATE TYPE "PerpMarketCache" AS ( ); CREATE TABLE mango_cache_write ( - pubkey BYTEA NOT NULL, + pubkey VARCHAR(44) NOT NULL, slot BIGINT NOT NULL, write_version BIGINT NOT NULL, version INT2,