Skip to content

Commit

Permalink
Merge branch 'main' into 2024-11-13-cleanup-wasm
Browse files Browse the repository at this point in the history
  • Loading branch information
rouzwelt authored Nov 14, 2024
2 parents 7dbb1eb + a0d441c commit 5ac3a22
Show file tree
Hide file tree
Showing 43 changed files with 3,274 additions and 2,217 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/deploy-subgraph.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ on:
- avalanche
- base
- bsc
- ethereum
- mainnet
- flare
- mumbai
- oasis_sapphire
Expand Down Expand Up @@ -45,4 +45,4 @@ jobs:
- run: git diff --exit-code -- . ':(exclude)subgraph/subgraph.yaml'
- run: >
nix develop -c goldsky subgraph deploy "ob4-${{ inputs.network }}/$(date -Idate)-$(openssl rand -hex 2)"
working-directory: subgraph
working-directory: subgraph
40 changes: 34 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion crates/js_api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,8 @@ serde-wasm-bindgen = { version = "0.6.5" }
wasm-bindgen-futures = { version = "0.4.42" }
tsify = { version = "0.4.5", default-features = false, features = ["js", "wasm-bindgen"] }
tokio = { workspace = true, features = ["sync", "macros", "io-util", "rt", "time"] }
alloy = { workspace = true, features = [ "dyn-abi" ] }
alloy = { workspace = true, features = [ "dyn-abi" ] }
flate2 = "1.0.34"
base64 = "0.22.1"
bincode = "1.3.3"
sha2 = "0.10.8"
20 changes: 17 additions & 3 deletions crates/js_api/src/gui/mod.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
use alloy::primitives::Address;
use base64::{engine::general_purpose::URL_SAFE, Engine};
use flate2::{read::GzDecoder, write::GzEncoder, Compression};
use rain_orderbook_app_settings::gui::{
Gui, GuiDeployment, GuiFieldDefinition, ParseGuiConfigSourceError,
};
use rain_orderbook_bindings::impl_all_wasm_traits;
use rain_orderbook_common::dotrain_order::{DotrainOrder, DotrainOrderError};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use serde_wasm_bindgen::{from_value, to_value};
use std::collections::BTreeMap;
use std::io::prelude::*;
use thiserror::Error;
use tsify::Tsify;

mod state_management;

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)]
pub struct TokenDeposit {
token: String,
Expand All @@ -30,7 +36,7 @@ impl_all_wasm_traits!(FieldValuePair);
pub struct DotrainOrderGui {
dotrain_order: DotrainOrder,
deployment: GuiDeployment,
field_values: HashMap<String, String>,
field_values: BTreeMap<String, String>,
deposits: Vec<TokenDeposit>,
}
#[wasm_bindgen]
Expand All @@ -54,7 +60,7 @@ impl DotrainOrderGui {
Ok(Self {
dotrain_order,
deployment: gui_deployment.clone(),
field_values: HashMap::new(),
field_values: BTreeMap::new(),
deposits: vec![],
})
}
Expand Down Expand Up @@ -161,11 +167,19 @@ pub enum GuiError {
FieldBindingNotFound(String),
#[error("Deposit token not found in gui config: {0}")]
DepositTokenNotFound(String),
#[error("Deserialized config mismatch")]
DeserializedConfigMismatch,
#[error(transparent)]
DotrainOrderError(#[from] DotrainOrderError),
#[error(transparent)]
ParseGuiConfigSourceError(#[from] ParseGuiConfigSourceError),
#[error(transparent)]
IoError(#[from] std::io::Error),
#[error(transparent)]
BincodeError(#[from] bincode::Error),
#[error(transparent)]
Base64Error(#[from] base64::DecodeError),
#[error(transparent)]
SerdeWasmBindgenError(#[from] serde_wasm_bindgen::Error),
}
impl From<GuiError> for JsValue {
Expand Down
62 changes: 62 additions & 0 deletions crates/js_api/src/gui/state_management.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use super::*;
use sha2::{Digest, Sha256};

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
struct SerializedGuiState {
config_hash: String,
field_values: BTreeMap<String, String>,
deposits: Vec<TokenDeposit>,
}

#[wasm_bindgen]
impl DotrainOrderGui {
fn compute_config_hash(&self) -> String {
let config = self.get_gui_config();
let bytes = bincode::serialize(&config).expect("Failed to serialize config");
let hash = Sha256::digest(&bytes);
format!("{:x}", hash)
}

#[wasm_bindgen(js_name = "serializeState")]
pub fn serialize(&self) -> Result<String, GuiError> {
let config_hash = self.compute_config_hash();

let state = SerializedGuiState {
config_hash,
field_values: self.field_values.clone(),
deposits: self.deposits.clone(),
};
let bytes = bincode::serialize(&state)?;

let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
encoder.write_all(&bytes)?;
let compressed = encoder.finish()?;

Ok(URL_SAFE.encode(compressed))
}

#[wasm_bindgen(js_name = "deserializeState")]
pub fn deserialize_state(&mut self, serialized: String) -> Result<(), GuiError> {
let compressed = URL_SAFE.decode(serialized)?;

let mut decoder = GzDecoder::new(&compressed[..]);
let mut bytes = Vec::new();
decoder.read_to_end(&mut bytes)?;

let state: SerializedGuiState = bincode::deserialize(&bytes)?;
self.field_values = state.field_values;
self.deposits = state.deposits;

if state.config_hash != self.compute_config_hash() {
return Err(GuiError::DeserializedConfigMismatch);
}

Ok(())
}

#[wasm_bindgen(js_name = "clearState")]
pub fn clear_state(&mut self) {
self.field_values.clear();
self.deposits.clear();
}
}
1 change: 1 addition & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
typeshare crates/subgraph/src/types/common.rs crates/subgraph/src/types/order.rs crates/subgraph/src/types/vault.rs crates/subgraph/src/types/order_trade.rs crates/common/src/types/order_detail_extended.rs crates/subgraph/src/vol.rs --lang=typescript --output-file=tauri-app/src/lib/typeshare/subgraphTypes.ts;
typeshare crates/settings/src/parse.rs --lang=typescript --output-file=tauri-app/src/lib/typeshare/appSettings.ts;
typeshare lib/rain.interpreter/crates/eval/src/trace.rs crates/common/src/fuzz/mod.rs crates/settings/src/config_source.rs crates/settings/src/config.rs crates/settings/src/plot_source.rs crates/settings/src/chart.rs crates/settings/src/deployer.rs crates/settings/src/network.rs crates/settings/src/order.rs crates/settings/src/orderbook.rs crates/settings/src/scenario.rs crates/settings/src/blocks.rs crates/settings/src/token.rs crates/settings/src/deployment.rs crates/settings/src/gui.rs --lang=typescript --output-file=tauri-app/src/lib/typeshare/config.ts;
typeshare crates/common/src/dotrain_order/mod.rs lib/rain.interpreter/lib/rain.metadata/crates/cli/src/meta/types/authoring/v2.rs --lang=typescript --output-file=tauri-app/src/lib/typeshare/authoringMeta.ts;
Expand Down
Loading

0 comments on commit 5ac3a22

Please sign in to comment.