Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| de6924114d | |||
| 75613df547 | |||
| 5ca8dfbc21 |
@@ -4,7 +4,7 @@ on:
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: arc-ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
@@ -17,13 +17,10 @@ jobs:
|
||||
- name: Setup yarn
|
||||
run: npm install -g yarn
|
||||
|
||||
- name: Install rust toolchain
|
||||
- name: Install Rust stable
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
override: true
|
||||
components: rustfmt, clippy
|
||||
|
||||
- name: Install wasm-pack
|
||||
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
||||
@@ -32,9 +29,9 @@ jobs:
|
||||
run: cargo install wasm-opt
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v6
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: "1.24.6"
|
||||
go-version: "1.23.7"
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
|
||||
Generated
+7
-8
@@ -2262,7 +2262,7 @@ dependencies = [
|
||||
"libc",
|
||||
"option-ext",
|
||||
"redox_users",
|
||||
"windows-sys 0.60.2",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2579,7 +2579,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "extension-storage"
|
||||
version = "1.4.1"
|
||||
version = "1.4.0-rc.0"
|
||||
dependencies = [
|
||||
"bip39",
|
||||
"console_error_panic_hook",
|
||||
@@ -4478,7 +4478,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "mix-fetch-wasm"
|
||||
version = "1.4.1-rc2"
|
||||
version = "1.4.0-rc.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"futures",
|
||||
@@ -4488,7 +4488,6 @@ dependencies = [
|
||||
"nym-ordered-buffer",
|
||||
"nym-service-providers-common",
|
||||
"nym-socks5-requests",
|
||||
"nym-validator-client",
|
||||
"rand 0.8.5",
|
||||
"serde",
|
||||
"serde-wasm-bindgen 0.6.5",
|
||||
@@ -5284,7 +5283,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nym-client-wasm"
|
||||
version = "1.4.1-rc2"
|
||||
version = "1.4.0-rc.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures",
|
||||
@@ -6643,7 +6642,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "nym-node-tester-wasm"
|
||||
version = "1.3.1-rc0"
|
||||
version = "1.3.0-rc.0"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"js-sys",
|
||||
@@ -7824,9 +7823,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.9.110"
|
||||
version = "0.9.109"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2"
|
||||
checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ members = [
|
||||
"tools/internal/contract-state-importer/importer-cli",
|
||||
"tools/internal/contract-state-importer/importer-contract",
|
||||
"tools/internal/mixnet-connectivity-check",
|
||||
# "tools/internal/sdk-version-bump",
|
||||
# "tools/internal/sdk-version-bump",
|
||||
"tools/internal/ssl-inject",
|
||||
"tools/internal/testnet-manager",
|
||||
"tools/internal/testnet-manager/dkg-bypass-contract",
|
||||
|
||||
@@ -107,16 +107,16 @@ sdk-wasm-build:
|
||||
$(MAKE) -C nym-browser-extension/storage wasm-pack
|
||||
$(MAKE) -C wasm/client
|
||||
$(MAKE) -C wasm/node-tester
|
||||
$(MAKE) -C wasm/mix-fetch
|
||||
# $(MAKE) -C wasm/mix-fetch
|
||||
$(MAKE) -C wasm/zknym-lib
|
||||
# $(MAKE) -C wasm/full-nym-wasm
|
||||
|
||||
# run this from npm/yarn to ensure tools are in the path, e.g. yarn build:sdk from root of repo
|
||||
sdk-typescript-build:
|
||||
npx lerna run --scope @nymproject/sdk build --stream
|
||||
npx lerna run --scope @nymproject/mix-fetch build --stream
|
||||
npx lerna run --scope @nymproject/node-tester build --stream
|
||||
yarn --cwd sdk/typescript/codegen/contract-clients build
|
||||
# npx lerna run --scope @nymproject/mix-fetch build --stream
|
||||
# npx lerna run --scope @nymproject/node-tester build --stream
|
||||
# yarn --cwd sdk/typescript/codegen/contract-clients build
|
||||
|
||||
# NOTE: These targets are part of the main workspace (but not as wasm32-unknown-unknown)
|
||||
WASM_CRATES = extension-storage nym-client-wasm nym-node-tester-wasm zknym-lib
|
||||
|
||||
@@ -36,7 +36,7 @@ nym-bandwidth-controller = { path = "../bandwidth-controller" }
|
||||
nym-crypto = { path = "../crypto" }
|
||||
nym-gateway-client = { path = "../client-libs/gateway-client" }
|
||||
nym-gateway-requests = { path = "../gateway-requests" }
|
||||
nym-http-api-client = { path = "../http-api-client", features = ["network-defaults"] }
|
||||
nym-http-api-client = { path = "../http-api-client" }
|
||||
nym-nonexhaustive-delayqueue = { path = "../nonexhaustive-delayqueue" }
|
||||
nym-sphinx = { path = "../nymsphinx" }
|
||||
nym-statistics-common = { path = "../statistics" }
|
||||
|
||||
@@ -114,12 +114,13 @@ where
|
||||
})?;
|
||||
hardcoded_topology.entry_capable_nodes().cloned().collect()
|
||||
} else {
|
||||
let mut rng = rand::thread_rng();
|
||||
crate::init::helpers::gateways_for_init(
|
||||
&mut rng,
|
||||
&core.client.nym_api_urls,
|
||||
user_agent,
|
||||
core.debug.topology.minimum_gateway_performance,
|
||||
core.debug.topology.ignore_ingress_epoch_role,
|
||||
None,
|
||||
)
|
||||
.await?
|
||||
};
|
||||
|
||||
@@ -173,12 +173,13 @@ where
|
||||
})?;
|
||||
hardcoded_topology.entry_capable_nodes().cloned().collect()
|
||||
} else {
|
||||
let mut rng = rand::thread_rng();
|
||||
crate::init::helpers::gateways_for_init(
|
||||
&mut rng,
|
||||
&core.client.nym_api_urls,
|
||||
user_agent,
|
||||
core.debug.topology.minimum_gateway_performance,
|
||||
core.debug.topology.ignore_ingress_epoch_role,
|
||||
None,
|
||||
)
|
||||
.await?
|
||||
};
|
||||
|
||||
@@ -73,10 +73,6 @@ use url::Url;
|
||||
#[cfg(debug_assertions)]
|
||||
use wasm_utils::console_log;
|
||||
|
||||
/// Default number of retries for Nym API requests when using network details with domain fronting.
|
||||
/// This allows the client to try alternative URLs if the primary endpoint is unavailable.
|
||||
const DEFAULT_NYM_API_RETRIES: usize = 3;
|
||||
|
||||
#[cfg(all(
|
||||
not(target_arch = "wasm32"),
|
||||
feature = "fs-surb-storage",
|
||||
@@ -216,9 +212,6 @@ pub struct BaseClientBuilder<C, S: MixnetClientStorage> {
|
||||
client_store: S,
|
||||
dkg_query_client: Option<C>,
|
||||
|
||||
// Optional API URLs for domain fronting support
|
||||
nym_api_urls: Option<Vec<nym_network_defaults::ApiUrl>>,
|
||||
|
||||
wait_for_gateway: bool,
|
||||
custom_topology_provider: Option<Box<dyn TopologyProvider + Send + Sync>>,
|
||||
custom_gateway_transceiver: Option<Box<dyn GatewayTransceiver + Send>>,
|
||||
@@ -248,7 +241,6 @@ where
|
||||
config: base_config,
|
||||
client_store,
|
||||
dkg_query_client,
|
||||
nym_api_urls: None,
|
||||
wait_for_gateway: false,
|
||||
custom_topology_provider: None,
|
||||
custom_gateway_transceiver: None,
|
||||
@@ -271,16 +263,6 @@ where
|
||||
self
|
||||
}
|
||||
|
||||
/// Set Nym API URLs for domain fronting support.
|
||||
///
|
||||
/// When provided, the client will use these API URLs (which include front_hosts)
|
||||
/// to construct HTTP clients with domain fronting enabled.
|
||||
#[must_use]
|
||||
pub fn with_nym_api_urls(mut self, nym_api_urls: Vec<nym_network_defaults::ApiUrl>) -> Self {
|
||||
self.nym_api_urls = Some(nym_api_urls);
|
||||
self
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn with_forget_me(mut self, forget_me: &ForgetMe) -> Self {
|
||||
self.config.debug.forget_me = *forget_me;
|
||||
@@ -881,67 +863,21 @@ where
|
||||
}
|
||||
|
||||
fn construct_nym_api_client(
|
||||
nym_api_urls: Option<&Vec<nym_network_defaults::ApiUrl>>,
|
||||
config: &Config,
|
||||
user_agent: Option<UserAgent>,
|
||||
) -> Result<nym_http_api_client::Client, ClientCoreError> {
|
||||
tracing::debug!(
|
||||
"construct_nym_api_client called with nym_api_urls: {}",
|
||||
nym_api_urls.is_some()
|
||||
);
|
||||
|
||||
// If API URLs are provided, use new_with_fronted_urls() which handles domain fronting
|
||||
if let Some(nym_api_urls) = nym_api_urls {
|
||||
if nym_api_urls.is_empty() {
|
||||
tracing::warn!("Provided nym_api_urls is empty, falling back to config endpoints");
|
||||
} else {
|
||||
tracing::info!(
|
||||
"Building nym-api client from provided URLs (with domain fronting support): {} URLs",
|
||||
nym_api_urls.len()
|
||||
);
|
||||
|
||||
let mut builder =
|
||||
nym_http_api_client::ClientBuilder::new_with_fronted_urls(nym_api_urls.clone())
|
||||
.map_err(ClientCoreError::from)?
|
||||
.with_retries(DEFAULT_NYM_API_RETRIES);
|
||||
|
||||
if let Some(user_agent) = user_agent {
|
||||
builder = builder.with_user_agent(user_agent);
|
||||
}
|
||||
|
||||
return builder.build().map_err(ClientCoreError::from);
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback to basic client for backwards compatibility
|
||||
tracing::debug!("Building basic nym-api HTTP client from config endpoints");
|
||||
|
||||
let mut nym_api_urls = config.get_nym_api_endpoints();
|
||||
if nym_api_urls.is_empty() {
|
||||
tracing::warn!("No API endpoints configured in config, this may cause issues");
|
||||
}
|
||||
nym_api_urls.shuffle(&mut thread_rng());
|
||||
|
||||
// Convert config URLs to ApiUrl format for consistency
|
||||
let api_urls: Vec<nym_network_defaults::ApiUrl> = nym_api_urls
|
||||
.into_iter()
|
||||
.map(|url| nym_network_defaults::ApiUrl {
|
||||
url: url.to_string(),
|
||||
front_hosts: None,
|
||||
})
|
||||
.collect();
|
||||
|
||||
tracing::debug!("Using {} config API endpoints", api_urls.len());
|
||||
|
||||
let mut builder = nym_http_api_client::ClientBuilder::new_with_fronted_urls(api_urls)
|
||||
.map_err(ClientCoreError::from)?
|
||||
.with_retries(DEFAULT_NYM_API_RETRIES)
|
||||
.with_bincode();
|
||||
let mut builder = nym_http_api_client::Client::builder(nym_api_urls[0].clone())
|
||||
.map_err(ClientCoreError::from)?;
|
||||
|
||||
if let Some(user_agent) = user_agent {
|
||||
builder = builder.with_user_agent(user_agent);
|
||||
}
|
||||
|
||||
builder = builder.with_bincode();
|
||||
|
||||
builder.build().map_err(ClientCoreError::from)
|
||||
}
|
||||
|
||||
@@ -1025,11 +961,7 @@ where
|
||||
.dkg_query_client
|
||||
.map(|client| BandwidthController::new(credential_store, client));
|
||||
|
||||
let nym_api_client = Self::construct_nym_api_client(
|
||||
self.nym_api_urls.as_ref(),
|
||||
&self.config,
|
||||
self.user_agent.clone(),
|
||||
)?;
|
||||
let nym_api_client = Self::construct_nym_api_client(&self.config, self.user_agent.clone())?;
|
||||
let key_rotation_config = Self::determine_key_rotation_state(&nym_api_client).await?;
|
||||
|
||||
let topology_provider = Self::setup_topology_provider(
|
||||
@@ -1204,53 +1136,3 @@ pub struct BaseClient {
|
||||
pub forget_me: ForgetMe,
|
||||
pub remember_me: RememberMe,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use nym_network_defaults::{ApiUrl, NymNetworkDetails};
|
||||
|
||||
#[test]
|
||||
fn test_network_details_with_multiple_urls() {
|
||||
// Verify that network details can be configured with multiple API URLs
|
||||
let mut network_details = NymNetworkDetails::new_empty();
|
||||
network_details.nym_api_urls = Some(vec![
|
||||
ApiUrl {
|
||||
url: "https://validator.nymtech.net/api/".to_string(),
|
||||
front_hosts: None,
|
||||
},
|
||||
ApiUrl {
|
||||
url: "https://nym-frontdoor.vercel.app/api/".to_string(),
|
||||
front_hosts: Some(vec!["vercel.app".to_string(), "vercel.com".to_string()]),
|
||||
},
|
||||
]);
|
||||
|
||||
assert_eq!(network_details.nym_api_urls.as_ref().unwrap().len(), 2);
|
||||
assert!(network_details.nym_api_urls.as_ref().unwrap()[1]
|
||||
.front_hosts
|
||||
.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_network_details_with_front_hosts() {
|
||||
// Verify that ApiUrl can store domain fronting configuration
|
||||
let api_url = ApiUrl {
|
||||
url: "https://nym-frontdoor.vercel.app/api/".to_string(),
|
||||
front_hosts: Some(vec!["vercel.app".to_string(), "vercel.com".to_string()]),
|
||||
};
|
||||
|
||||
assert_eq!(api_url.url, "https://nym-frontdoor.vercel.app/api/");
|
||||
assert_eq!(api_url.front_hosts.as_ref().unwrap().len(), 2);
|
||||
assert!(api_url
|
||||
.front_hosts
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.contains(&"vercel.app".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_default_nym_api_retries_constant() {
|
||||
// Verify the retry constant is set correctly
|
||||
assert_eq!(DEFAULT_NYM_API_RETRIES, 3);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,6 @@ type WsConn = JSWebsocket;
|
||||
|
||||
const CONCURRENT_GATEWAYS_MEASURED: usize = 20;
|
||||
const MEASUREMENTS: usize = 3;
|
||||
const DEFAULT_NYM_API_RETRIES: usize = 3;
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
const CONN_TIMEOUT: Duration = Duration::from_millis(1500);
|
||||
@@ -133,27 +132,25 @@ impl<'a, G: ConnectableGateway> GatewayWithLatency<'a, G> {
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn gateways_for_init(
|
||||
pub async fn gateways_for_init<R: Rng>(
|
||||
rng: &mut R,
|
||||
nym_apis: &[Url],
|
||||
user_agent: Option<UserAgent>,
|
||||
minimum_performance: u8,
|
||||
ignore_epoch_roles: bool,
|
||||
retry_count: Option<usize>,
|
||||
) -> Result<Vec<RoutingNode>, ClientCoreError> {
|
||||
// Build client with ALL URLs for fallback support
|
||||
let nym_api_urls: Vec<nym_http_api_client::Url> = nym_apis
|
||||
.iter()
|
||||
.map(|url| nym_http_api_client::Url::from(url.clone()))
|
||||
.collect();
|
||||
let nym_api = nym_apis
|
||||
.choose(rng)
|
||||
.ok_or(ClientCoreError::ListOfNymApisIsEmpty)?;
|
||||
|
||||
if nym_api_urls.is_empty() {
|
||||
return Err(ClientCoreError::ListOfNymApisIsEmpty);
|
||||
}
|
||||
|
||||
let retry_count = retry_count.unwrap_or(DEFAULT_NYM_API_RETRIES);
|
||||
let mut builder = nym_http_api_client::ClientBuilder::new_with_urls(nym_api_urls.clone())?
|
||||
.with_retries(retry_count)
|
||||
.with_bincode();
|
||||
// Use the unified HTTP client directly with optional user agent
|
||||
let mut builder = nym_http_api_client::Client::builder(nym_api.clone())
|
||||
.map_err(|e| {
|
||||
ClientCoreError::ValidatorClientError(nym_validator_client::ValidatorClientError::from(
|
||||
e,
|
||||
))
|
||||
})?
|
||||
.with_bincode(); // Use bincode for better performance
|
||||
|
||||
if let Some(user_agent) = user_agent {
|
||||
builder = builder.with_user_agent(user_agent);
|
||||
@@ -163,7 +160,7 @@ pub async fn gateways_for_init(
|
||||
ClientCoreError::ValidatorClientError(nym_validator_client::ValidatorClientError::from(e))
|
||||
})?;
|
||||
|
||||
tracing::debug!("Fetching list of gateways from: {:?}", nym_api_urls);
|
||||
tracing::debug!("Fetching list of gateways from: {nym_api}");
|
||||
|
||||
// Use our helper to handle pagination
|
||||
let gateways = get_all_basic_entry_nodes_with_metadata(&client, true)
|
||||
@@ -175,15 +172,17 @@ pub async fn gateways_for_init(
|
||||
|
||||
// filter out gateways below minimum performance and ones that could operate as a mixnode
|
||||
// (we don't want instability)
|
||||
let valid_gateways: Vec<RoutingNode> = gateways
|
||||
let valid_gateways = gateways
|
||||
.iter()
|
||||
.filter(|g| ignore_epoch_roles || !g.supported_roles.mixnode)
|
||||
.filter(|g| g.performance.round_to_integer() >= minimum_performance)
|
||||
.filter_map(|gateway| gateway.try_into().ok())
|
||||
.collect();
|
||||
.collect::<Vec<_>>();
|
||||
tracing::debug!("After checking validity: {}", valid_gateways.len());
|
||||
tracing::trace!("Valid gateways: {valid_gateways:#?}");
|
||||
|
||||
tracing::info!(
|
||||
"Found {} valid gateways after filtering",
|
||||
"and {} after validity and performance filtering",
|
||||
valid_gateways.len()
|
||||
);
|
||||
|
||||
@@ -346,20 +345,13 @@ pub(super) fn get_specified_gateway(
|
||||
must_use_tls: bool,
|
||||
) -> Result<RoutingNode, ClientCoreError> {
|
||||
tracing::debug!("Requesting specified gateway: {gateway_identity}");
|
||||
|
||||
let user_gateway = ed25519::PublicKey::from_base58_string(gateway_identity)
|
||||
.map_err(ClientCoreError::UnableToCreatePublicKeyFromGatewayId)?;
|
||||
|
||||
let gateway = gateways
|
||||
.iter()
|
||||
.find(|gateway| gateway.identity_key == user_gateway)
|
||||
.ok_or_else(|| {
|
||||
tracing::debug!(
|
||||
"Gateway {gateway_identity} not found in {} available gateways",
|
||||
gateways.len()
|
||||
);
|
||||
ClientCoreError::NoGatewayWithId(gateway_identity.to_string())
|
||||
})?;
|
||||
.ok_or_else(|| ClientCoreError::NoGatewayWithId(gateway_identity.to_string()))?;
|
||||
|
||||
let Some(entry_details) = gateway.entry.as_ref() else {
|
||||
return Err(ClientCoreError::UnsupportedEntry {
|
||||
@@ -422,52 +414,3 @@ pub(super) async fn register_with_gateway(
|
||||
authenticated_ephemeral_client: gateway_client,
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use url::Url;
|
||||
|
||||
#[test]
|
||||
fn test_single_url_builds_without_retries() {
|
||||
let urls = [Url::parse("https://api.nym.com").unwrap()];
|
||||
|
||||
let nym_api_urls: Vec<nym_http_api_client::Url> = urls
|
||||
.iter()
|
||||
.map(|url| nym_http_api_client::Url::from(url.clone()))
|
||||
.collect();
|
||||
|
||||
assert_eq!(nym_api_urls.len(), 1, "Should have exactly one URL");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_multiple_urls_prepared_for_retries() {
|
||||
let urls = vec![
|
||||
Url::parse("https://api1.nym.com").unwrap(),
|
||||
Url::parse("https://api2.nym.com").unwrap(),
|
||||
Url::parse("https://api3.nym.com").unwrap(),
|
||||
];
|
||||
|
||||
let nym_api_urls: Vec<nym_http_api_client::Url> = urls
|
||||
.iter()
|
||||
.map(|url| nym_http_api_client::Url::from(url.clone()))
|
||||
.collect();
|
||||
|
||||
assert_eq!(nym_api_urls.len(), 3, "Should have all three URLs");
|
||||
assert!(
|
||||
nym_api_urls.len() > 1,
|
||||
"Multiple URLs trigger retry behavior"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_url_list_is_detected() {
|
||||
let urls: Vec<Url> = vec![];
|
||||
|
||||
let nym_api_urls: Vec<nym_http_api_client::Url> = urls
|
||||
.iter()
|
||||
.map(|url| nym_http_api_client::Url::from(url.clone()))
|
||||
.collect();
|
||||
|
||||
assert!(nym_api_urls.is_empty(), "Empty list should remain empty");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,9 +296,6 @@ impl std::error::Error for ReqwestErrorWrapper {}
|
||||
#[derive(Debug, Error)]
|
||||
#[allow(missing_docs)]
|
||||
pub enum HttpClientError {
|
||||
#[error("did not provide any valid client URLs")]
|
||||
NoUrlsProvided,
|
||||
|
||||
#[error("failed to construct inner reqwest client: {source}")]
|
||||
ReqwestBuildError {
|
||||
#[source]
|
||||
@@ -585,29 +582,24 @@ impl ClientBuilder {
|
||||
Self::new(alt)
|
||||
} else {
|
||||
let url = url.to_url()?;
|
||||
Self::new_with_urls(vec![url])
|
||||
Ok(Self::new_with_urls(vec![url]))
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a client builder from network details with sensible defaults
|
||||
#[cfg(feature = "network-defaults")]
|
||||
// deprecating function since it's not clear from its signature whether the client
|
||||
// would be constructed using `nym_api_urls` or `nym_vpn_api_urls`
|
||||
#[deprecated(note = "use explicit Self::new_with_fronted_urls instead")]
|
||||
pub fn from_network(
|
||||
network: &nym_network_defaults::NymNetworkDetails,
|
||||
) -> Result<Self, HttpClientError> {
|
||||
let urls = network.nym_api_urls.as_ref().cloned().unwrap_or_default();
|
||||
Self::new_with_fronted_urls(urls.clone())
|
||||
}
|
||||
|
||||
/// Create a client builder using the provided set of domain-fronted URLs
|
||||
#[cfg(feature = "network-defaults")]
|
||||
pub fn new_with_fronted_urls(
|
||||
urls: Vec<nym_network_defaults::ApiUrl>,
|
||||
) -> Result<Self, HttpClientError> {
|
||||
let urls = urls
|
||||
.into_iter()
|
||||
let urls = network
|
||||
.nym_api_urls
|
||||
.as_ref()
|
||||
.ok_or_else(|| {
|
||||
HttpClientError::GenericRequestFailure(
|
||||
"No API URLs configured in network details".to_string(),
|
||||
)
|
||||
})?
|
||||
.iter()
|
||||
.map(|api_url| {
|
||||
// Convert ApiUrl to our Url type with fronting support
|
||||
let mut url = Url::parse(&api_url.url)?;
|
||||
@@ -619,19 +611,15 @@ impl ClientBuilder {
|
||||
.iter()
|
||||
.map(|host| format!("https://{}", host))
|
||||
.collect();
|
||||
url = Url::new(api_url.url.clone(), Some(fronts)).map_err(|source| {
|
||||
HttpClientError::MalformedUrl {
|
||||
raw: api_url.url.clone(),
|
||||
source,
|
||||
}
|
||||
})?;
|
||||
url = Url::new(api_url.url.clone(), Some(fronts))
|
||||
.map_err(|e| HttpClientError::GenericRequestFailure(e.to_string()))?;
|
||||
}
|
||||
|
||||
Ok(url)
|
||||
})
|
||||
.collect::<Result<Vec<_>, HttpClientError>>()?;
|
||||
|
||||
let mut builder = Self::new_with_urls(urls)?;
|
||||
let mut builder = Self::new_with_urls(urls);
|
||||
|
||||
// Enable domain fronting by default (on retry)
|
||||
#[cfg(feature = "tunneling")]
|
||||
@@ -643,11 +631,7 @@ impl ClientBuilder {
|
||||
}
|
||||
|
||||
/// Constructs a new http `ClientBuilder` from a valid url.
|
||||
pub fn new_with_urls(urls: Vec<Url>) -> Result<Self, HttpClientError> {
|
||||
if urls.is_empty() {
|
||||
return Err(HttpClientError::NoUrlsProvided);
|
||||
}
|
||||
|
||||
pub fn new_with_urls(urls: Vec<Url>) -> Self {
|
||||
let urls = Self::check_urls(urls);
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
@@ -656,7 +640,7 @@ impl ClientBuilder {
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
let reqwest_client_builder = default_builder();
|
||||
|
||||
Ok(ClientBuilder {
|
||||
ClientBuilder {
|
||||
urls,
|
||||
timeout: None,
|
||||
custom_user_agent: false,
|
||||
@@ -667,7 +651,7 @@ impl ClientBuilder {
|
||||
|
||||
retry_limit: 0,
|
||||
serialization: SerializationFormat::Json,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Add an additional URL to the set usable by this constructed `Client`
|
||||
@@ -964,13 +948,13 @@ impl Client {
|
||||
|
||||
return (url.as_str(), url.front_str());
|
||||
} else {
|
||||
tracing::debug!(
|
||||
"Domain fronting is enabled, but no host_url is defined for current URL"
|
||||
warn!(
|
||||
"Domain fronting is enabled, but no host_url is defined! Domain fronting WILL NOT WORK"
|
||||
)
|
||||
}
|
||||
} else {
|
||||
tracing::debug!(
|
||||
"Domain fronting is enabled, but current URL has no front_hosts configured"
|
||||
warn!(
|
||||
"Domain fronting is enabled, but no front_url is defined! Domain fronting WILL NOT WORK"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,10 +21,6 @@ inventory::collect!(ConfigRecord);
|
||||
/// Returns the default builder with all registered configurations applied.
|
||||
pub fn default_builder() -> ReqwestClientBuilder {
|
||||
let mut b = ReqwestClientBuilder::new();
|
||||
|
||||
#[cfg(feature = "debug-inventory")]
|
||||
let mut test_client = ReqwestClientBuilder::new();
|
||||
|
||||
let mut records: Vec<&'static ConfigRecord> =
|
||||
inventory::iter::<ConfigRecord>.into_iter().collect();
|
||||
records.sort_by_key(|r| r.priority); // lower runs first
|
||||
@@ -39,10 +35,6 @@ pub fn default_builder() -> ReqwestClientBuilder {
|
||||
|
||||
for r in records {
|
||||
b = (r.apply)(b);
|
||||
#[cfg(feature = "debug-inventory")]
|
||||
{
|
||||
test_client = (r.apply)(test_client);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "debug-inventory")]
|
||||
@@ -55,7 +47,7 @@ pub fn default_builder() -> ReqwestClientBuilder {
|
||||
eprintln!("[HTTP-INVENTORY] Building test client to verify configuration...");
|
||||
|
||||
// Try to build a client to see if it works
|
||||
match test_client.build() {
|
||||
match b.try_clone().unwrap().build() {
|
||||
Ok(client) => {
|
||||
eprintln!("[HTTP-INVENTORY] ✓ Client built successfully");
|
||||
eprintln!("[HTTP-INVENTORY] Client debug info: {:#?}", client);
|
||||
|
||||
@@ -2,77 +2,77 @@ use super::*;
|
||||
|
||||
#[test]
|
||||
fn sanitizing_urls() {
|
||||
let base_url: Url = "http://api.test".parse().unwrap();
|
||||
let base_url: Url = "http://foomp.com".parse().unwrap();
|
||||
|
||||
// works with a full string
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, "/foo//bar/", NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// (and leading slash doesn't matter)
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, "foo//bar/", NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// works with 1 segment
|
||||
assert_eq!(
|
||||
"http://api.test/foo",
|
||||
"http://foomp.com/foo",
|
||||
sanitize_url(&base_url, &["foo"], NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// works with 2 segments
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, &["foo", "bar"], NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// works with leading slash
|
||||
assert_eq!(
|
||||
"http://api.test/foo",
|
||||
"http://foomp.com/foo",
|
||||
sanitize_url(&base_url, &["/foo"], NO_PARAMS).as_str()
|
||||
);
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, &["/foo", "bar"], NO_PARAMS).as_str()
|
||||
);
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, &["foo", "/bar"], NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// works with trailing slash
|
||||
assert_eq!(
|
||||
"http://api.test/foo",
|
||||
"http://foomp.com/foo",
|
||||
sanitize_url(&base_url, &["foo/"], NO_PARAMS).as_str()
|
||||
);
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, &["foo/", "bar"], NO_PARAMS).as_str()
|
||||
);
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, &["foo", "bar/"], NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// works with both leading and trailing slash
|
||||
assert_eq!(
|
||||
"http://api.test/foo",
|
||||
"http://foomp.com/foo",
|
||||
sanitize_url(&base_url, &["/foo/"], NO_PARAMS).as_str()
|
||||
);
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar",
|
||||
"http://foomp.com/foo/bar",
|
||||
sanitize_url(&base_url, &["/foo/", "/bar/"], NO_PARAMS).as_str()
|
||||
);
|
||||
|
||||
// adds params
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar?foomp=baz",
|
||||
"http://foomp.com/foo/bar?foomp=baz",
|
||||
sanitize_url(&base_url, &["foo", "bar"], &[("foomp", "baz")]).as_str()
|
||||
);
|
||||
assert_eq!(
|
||||
"http://api.test/foo/bar?arg1=val1&arg2=val2",
|
||||
"http://foomp.com/foo/bar?arg1=val1&arg2=val2",
|
||||
sanitize_url(
|
||||
&base_url,
|
||||
&["/foo/", "/bar/"],
|
||||
@@ -91,87 +91,83 @@ fn sanitizing_urls() {
|
||||
#[tokio::test]
|
||||
async fn api_client_retry() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let client = ClientBuilder::new_with_urls(vec![
|
||||
"http://broken.nym.test".parse()?, // This will fail
|
||||
"https://httpbin.org/status/200".parse()?, // This will succeed
|
||||
])?
|
||||
"http://broken.nym.badurl".parse()?,
|
||||
"http://example.com/".parse()?,
|
||||
])
|
||||
.with_retries(3)
|
||||
.build()?;
|
||||
|
||||
let req = client.create_get_request(&[], NO_PARAMS).unwrap();
|
||||
let req = client.create_get_request(&["/"], NO_PARAMS).unwrap();
|
||||
let resp = client.send(req).await?;
|
||||
|
||||
// The main test is that we successfully retried and switched to the working URL
|
||||
// We accept any response from the working endpoint since external services can be unreliable
|
||||
assert_eq!(
|
||||
client.current_url().as_str(),
|
||||
"https://httpbin.org/status/200"
|
||||
);
|
||||
assert_eq!(resp.status(), 200);
|
||||
|
||||
println!("Response status: {}", resp.status());
|
||||
// check that the url was updated
|
||||
assert_eq!(client.current_url().as_str(), "http://example.com/");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn host_updating() {
|
||||
let url = Url::new("http://nym-api1.test", None).unwrap();
|
||||
let url = Url::new("http://example.com", None).unwrap();
|
||||
let mut client = ClientBuilder::new(url).unwrap().build().unwrap();
|
||||
|
||||
// check that the url is set correctly
|
||||
let current_url = client.current_url();
|
||||
assert_eq!(current_url.as_str(), "http://nym-api1.test/");
|
||||
assert_eq!(current_url.as_str(), "http://example.com/");
|
||||
assert_eq!(current_url.front_str(), None);
|
||||
|
||||
// update the url
|
||||
client.update_host();
|
||||
|
||||
// check that the url is still the same since there is one URL
|
||||
assert_eq!(client.current_url().as_str(), "http://nym-api1.test/");
|
||||
assert_eq!(client.current_url().as_str(), "http://example.com/");
|
||||
|
||||
// =======================================
|
||||
// we rotate through urls when available
|
||||
|
||||
let new_urls = vec![
|
||||
Url::new("http://nym-api1.test", None).unwrap(),
|
||||
Url::new("http://nym-api2.test", None).unwrap(),
|
||||
Url::new("http://example.com", None).unwrap(),
|
||||
Url::new("http://example.org", None).unwrap(),
|
||||
];
|
||||
client.change_base_urls(new_urls);
|
||||
assert_eq!(client.current_url().as_str(), "http://nym-api1.test/");
|
||||
assert_eq!(client.current_url().as_str(), "http://example.com/");
|
||||
|
||||
client.update_host();
|
||||
|
||||
// check that the url got updated now that there are multiple URLs
|
||||
assert_eq!(client.current_url().as_str(), "http://nym-api2.test/");
|
||||
assert_eq!(client.current_url().as_str(), "http://example.org/");
|
||||
assert_eq!(client.current_url().front_str(), None);
|
||||
|
||||
client.update_host();
|
||||
assert_eq!(client.current_url().as_str(), "http://nym-api1.test/");
|
||||
assert_eq!(client.current_url().as_str(), "http://example.com/");
|
||||
|
||||
// =======================================
|
||||
// we rotate through urls when available if fronting is disabled
|
||||
|
||||
let new_urls = vec![
|
||||
Url::new(
|
||||
"http://nym-api1.test",
|
||||
Some(vec!["http://cdn1.test", "http://cdn2.test"]),
|
||||
"http://example.com",
|
||||
Some(vec!["http://front1.com", "http://front2.com"]),
|
||||
)
|
||||
.unwrap(),
|
||||
Url::new("http://nym-api2.test", None).unwrap(),
|
||||
Url::new("http://example.org", None).unwrap(),
|
||||
];
|
||||
client.change_base_urls(new_urls);
|
||||
|
||||
assert_eq!(client.current_url().as_str(), "http://nym-api1.test/");
|
||||
assert_eq!(client.current_url().as_str(), "http://example.com/");
|
||||
|
||||
client.update_host();
|
||||
|
||||
// check that the url got updated now that there are multiple URLs
|
||||
assert_eq!(client.current_url().as_str(), "http://nym-api2.test/");
|
||||
assert_eq!(client.current_url().as_str(), "http://example.org/");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "tunneling")]
|
||||
fn fronted_host_updating() {
|
||||
let url = Url::new("http://nym-api.test", Some(vec!["http://cdn1.test"])).unwrap();
|
||||
let url = Url::new("http://example.com", Some(vec!["http://front1.com"])).unwrap();
|
||||
let mut client = ClientBuilder::new(url)
|
||||
.unwrap()
|
||||
.with_fronting(crate::fronted::FrontPolicy::Always)
|
||||
@@ -180,103 +176,46 @@ fn fronted_host_updating() {
|
||||
|
||||
// check that the url is set correctly
|
||||
let current_url = client.current_url();
|
||||
assert_eq!(current_url.as_str(), "http://nym-api.test/");
|
||||
assert_eq!(current_url.front_str(), Some("cdn1.test"));
|
||||
assert_eq!(current_url.as_str(), "http://example.com/");
|
||||
assert_eq!(current_url.front_str(), Some("front1.com"));
|
||||
|
||||
// update the url
|
||||
client.update_host();
|
||||
|
||||
// check that the url is still the same since there is one URL and one front
|
||||
let current_url = client.current_url();
|
||||
assert_eq!(current_url.as_str(), "http://nym-api.test/");
|
||||
assert_eq!(current_url.front_str(), Some("cdn1.test"));
|
||||
assert_eq!(current_url.as_str(), "http://example.com/");
|
||||
assert_eq!(current_url.front_str(), Some("front1.com"));
|
||||
|
||||
// =======================================
|
||||
// we rotate through front urls when available if fronting is enabled
|
||||
|
||||
let new_urls = vec![
|
||||
Url::new(
|
||||
"http://nym-api.test",
|
||||
Some(vec!["http://cdn1.test", "http://cdn2.test"]),
|
||||
"http://example.com",
|
||||
Some(vec!["http://front1.com", "http://front2.com"]),
|
||||
)
|
||||
.unwrap(),
|
||||
Url::new("http://nym-api2.test", None).unwrap(),
|
||||
Url::new("http://example.org", None).unwrap(),
|
||||
];
|
||||
client.change_base_urls(new_urls);
|
||||
|
||||
let current_url = client.current_url();
|
||||
assert_eq!(current_url.as_str(), "http://nym-api.test/");
|
||||
assert_eq!(current_url.front_str(), Some("cdn1.test"));
|
||||
assert_eq!(current_url.as_str(), "http://example.com/");
|
||||
assert_eq!(current_url.front_str(), Some("front1.com"));
|
||||
|
||||
// update the url - this should keep the same host but change the front
|
||||
client.update_host();
|
||||
|
||||
let current_url = client.current_url();
|
||||
// check that the url is still the same since there is one URL
|
||||
assert_eq!(current_url.as_str(), "http://nym-api.test/");
|
||||
assert_eq!(current_url.front_str(), Some("cdn2.test"));
|
||||
assert_eq!(current_url.as_str(), "http://example.com/");
|
||||
assert_eq!(current_url.front_str(), Some("front2.com"));
|
||||
|
||||
// update the url - this should wrap around to the first front as the second url is not fronted
|
||||
client.update_host();
|
||||
|
||||
let current_url = client.current_url();
|
||||
assert_eq!(current_url.as_str(), "http://nym-api.test/");
|
||||
assert_eq!(current_url.front_str(), Some("cdn1.test"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "network-defaults")]
|
||||
fn from_network_configures_multiple_urls_and_retries() {
|
||||
use nym_network_defaults::{ApiUrl, NymNetworkDetails};
|
||||
|
||||
// Create network details with multiple URLs and fronting
|
||||
let mut network_details = NymNetworkDetails::new_empty();
|
||||
network_details.nym_api_urls = Some(vec![
|
||||
ApiUrl {
|
||||
url: "https://validator.nymtech.net/api/".to_string(),
|
||||
front_hosts: None,
|
||||
},
|
||||
ApiUrl {
|
||||
url: "https://nym-frontdoor.vercel.app/api/".to_string(),
|
||||
front_hosts: Some(vec!["vercel.app".to_string(), "vercel.com".to_string()]),
|
||||
},
|
||||
ApiUrl {
|
||||
url: "https://nym-frontdoor.global.ssl.fastly.net/api/".to_string(),
|
||||
front_hosts: Some(vec!["yelp.global.ssl.fastly.net".to_string()]),
|
||||
},
|
||||
]);
|
||||
|
||||
// Build client from network details
|
||||
let client = ClientBuilder::new_with_fronted_urls(
|
||||
network_details.nym_api_urls.clone().unwrap_or_default(),
|
||||
)
|
||||
.expect("Failed to create client from network")
|
||||
.build()
|
||||
.expect("Failed to build client");
|
||||
|
||||
// Verify all URLs were configured
|
||||
assert_eq!(
|
||||
client.base_urls().len(),
|
||||
3,
|
||||
"Expected 3 URLs to be configured from network details"
|
||||
);
|
||||
|
||||
// Verify the URLs have fronting configured where appropriate
|
||||
assert_eq!(
|
||||
client.base_urls()[0].as_str(),
|
||||
"https://validator.nymtech.net/api/"
|
||||
);
|
||||
assert!(client.base_urls()[0].front_str().is_none());
|
||||
|
||||
assert_eq!(
|
||||
client.base_urls()[1].as_str(),
|
||||
"https://nym-frontdoor.vercel.app/api/"
|
||||
);
|
||||
assert!(client.base_urls()[1].front_str().is_some());
|
||||
|
||||
assert_eq!(
|
||||
client.base_urls()[2].as_str(),
|
||||
"https://nym-frontdoor.global.ssl.fastly.net/api/"
|
||||
);
|
||||
assert!(client.base_urls()[2].front_str().is_some());
|
||||
assert_eq!(current_url.as_str(), "http://example.com/");
|
||||
assert_eq!(current_url.front_str(), Some("front1.com"));
|
||||
}
|
||||
|
||||
@@ -183,11 +183,6 @@ impl Url {
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns the underlying URL
|
||||
pub fn inner_url(&self) -> &url::Url {
|
||||
&self.url
|
||||
}
|
||||
|
||||
/// Returns true if the URL has a front domain set
|
||||
pub fn has_front(&self) -> bool {
|
||||
if let Some(fronts) = &self.fronts {
|
||||
@@ -206,11 +201,6 @@ impl Url {
|
||||
.and_then(|url| url.host_str())
|
||||
}
|
||||
|
||||
/// Returns the fronts
|
||||
pub fn fronts(&self) -> Option<&[url::Url]> {
|
||||
self.fronts.as_deref()
|
||||
}
|
||||
|
||||
/// Return the string representation of the host (domain or IP address) for this URL, if any.
|
||||
pub fn host_str(&self) -> Option<&str> {
|
||||
self.url.host_str()
|
||||
|
||||
@@ -124,8 +124,6 @@ impl NymNetworkDetails {
|
||||
}
|
||||
}
|
||||
|
||||
let nym_api = var(var_names::NYM_API).expect("nym api not set");
|
||||
|
||||
NymNetworkDetails::new_empty()
|
||||
.with_network_name(var(var_names::NETWORK_NAME).expect("network name not set"))
|
||||
.with_bech32_account_prefix(
|
||||
@@ -151,7 +149,7 @@ impl NymNetworkDetails {
|
||||
})
|
||||
.with_additional_validator_endpoint(ValidatorDetails::new(
|
||||
var(var_names::NYXD).expect("nyxd validator not set"),
|
||||
Some(nym_api.clone()),
|
||||
Some(var(var_names::NYM_API).expect("nym api not set")),
|
||||
get_optional_env(var_names::NYXD_WEBSOCKET),
|
||||
))
|
||||
.with_mixnet_contract(get_optional_env(var_names::MIXNET_CONTRACT_ADDRESS))
|
||||
@@ -161,10 +159,6 @@ impl NymNetworkDetails {
|
||||
.with_multisig_contract(get_optional_env(var_names::MULTISIG_CONTRACT_ADDRESS))
|
||||
.with_coconut_dkg_contract(get_optional_env(var_names::COCONUT_DKG_CONTRACT_ADDRESS))
|
||||
.with_nym_vpn_api_url(get_optional_env(var_names::NYM_VPN_API))
|
||||
.with_nym_api_urls(Some(vec![ApiUrl {
|
||||
url: nym_api,
|
||||
front_hosts: None,
|
||||
}]))
|
||||
}
|
||||
|
||||
pub fn new_mainnet() -> Self {
|
||||
@@ -354,12 +348,6 @@ impl NymNetworkDetails {
|
||||
self
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn with_nym_api_urls(mut self, urls: Option<Vec<ApiUrl>>) -> Self {
|
||||
self.nym_api_urls = urls;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn nym_vpn_api_url(&self) -> Option<Url> {
|
||||
self.nym_vpn_api_url.as_ref().map(|url| {
|
||||
url.parse()
|
||||
|
||||
@@ -160,12 +160,13 @@ pub async fn setup_gateway_from_api(
|
||||
minimum_performance: u8,
|
||||
ignore_epoch_roles: bool,
|
||||
) -> Result<InitialisationResult, WasmCoreError> {
|
||||
let mut rng = thread_rng();
|
||||
let gateways = gateways_for_init(
|
||||
&mut rng,
|
||||
nym_apis,
|
||||
None,
|
||||
minimum_performance,
|
||||
ignore_epoch_roles,
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
setup_gateway_wasm(client_store, force_tls, chosen_gateway, gateways).await
|
||||
@@ -177,12 +178,13 @@ pub async fn current_gateways_wasm(
|
||||
minimum_performance: u8,
|
||||
ignore_epoch_roles: bool,
|
||||
) -> Result<Vec<RoutingNode>, ClientCoreError> {
|
||||
let mut rng = thread_rng();
|
||||
gateways_for_init(
|
||||
&mut rng,
|
||||
nym_apis,
|
||||
user_agent,
|
||||
minimum_performance,
|
||||
ignore_epoch_roles,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
@@ -259,7 +259,7 @@ pub fn migrate(deps: DepsMut<'_>, env: Env, _msg: MigrateMsg) -> Result<Response
|
||||
set_build_information!(deps.storage)?;
|
||||
cw2::ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
|
||||
|
||||
crate::queued_migrations::introduce_historical_epochs(deps, env)?;
|
||||
// crate::queued_migrations::introduce_historical_epochs(deps, env)?;
|
||||
|
||||
Ok(Response::new())
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ pub fn try_transfer_ownership(
|
||||
DEALERS_INDICES.save(deps.storage, &transfer_to, ¤t_index)?;
|
||||
DEALERS_INDICES.remove(deps.storage, &info.sender);
|
||||
|
||||
// update registration detail and share information for every epoch the current dealer has participated in the protocol
|
||||
// update registration detail for every epoch the current dealer has participated in the protocol
|
||||
// ideally, we'd have only updated the current epoch, but the way the contract is constructed
|
||||
// forbids that otherwise we'd have introduced inconsistency
|
||||
for epoch_id in 0..=epoch.epoch_id {
|
||||
@@ -118,11 +118,6 @@ pub fn try_transfer_ownership(
|
||||
EPOCH_DEALERS_MAP.remove(deps.storage, (epoch_id, &info.sender));
|
||||
EPOCH_DEALERS_MAP.save(deps.storage, (epoch_id, &transfer_to), &details)?;
|
||||
}
|
||||
if let Some(mut vk_share) = vk_shares().may_load(deps.storage, (&info.sender, epoch_id))? {
|
||||
vk_shares().remove(deps.storage, (&info.sender, epoch_id))?;
|
||||
vk_share.owner = transfer_to.clone();
|
||||
vk_shares().save(deps.storage, (&transfer_to, epoch_id), &vk_share)?;
|
||||
}
|
||||
}
|
||||
|
||||
let Some(transaction_info) = env.transaction else {
|
||||
@@ -267,7 +262,6 @@ mod tests_with_mock {
|
||||
contract.run_initial_dummy_dkg();
|
||||
let old_index = DEALERS_INDICES.load(&contract, &group_member)?;
|
||||
let old_details = EPOCH_DEALERS_MAP.load(&contract, (0, &group_member))?;
|
||||
let old_share = vk_shares().load(&contract, (&group_member, 0))?;
|
||||
|
||||
let not_group_member = contract.addr_make("not_group_member");
|
||||
let (deps, env) = contract.deps_mut_env();
|
||||
@@ -297,20 +291,13 @@ mod tests_with_mock {
|
||||
assert!(EPOCH_DEALERS_MAP
|
||||
.may_load(&contract, (0, &group_member))?
|
||||
.is_none());
|
||||
assert!(vk_shares()
|
||||
.may_load(&contract, (&group_member, 0))?
|
||||
.is_none());
|
||||
|
||||
let new_index = DEALERS_INDICES.load(&contract, &new_group_member)?;
|
||||
let new_details = EPOCH_DEALERS_MAP.load(&contract, (0, &new_group_member))?;
|
||||
let new_share = vk_shares().load(&contract, (&new_group_member, 0))?;
|
||||
|
||||
// the underlying info hasn't changed
|
||||
assert_eq!(old_index, new_index);
|
||||
assert_eq!(old_details, new_details);
|
||||
assert_ne!(old_share, new_share);
|
||||
assert_eq!(old_share.owner, group_member);
|
||||
assert_eq!(new_share.owner, new_group_member);
|
||||
|
||||
assert_eq!(
|
||||
OWNERSHIP_TRANSFER_LOG.load(
|
||||
|
||||
+16
-16
@@ -2,23 +2,23 @@
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
reactStrictMode: true,
|
||||
|
||||
basePath: "/explorer",
|
||||
assetPrefix: "/explorer",
|
||||
trailingSlash: false,
|
||||
basePath: "/explorer",
|
||||
assetPrefix: "/explorer",
|
||||
trailingSlash: false,
|
||||
|
||||
async redirects() {
|
||||
return [
|
||||
// Change the basePath to /explorer
|
||||
{
|
||||
source: "/",
|
||||
destination: "/explorer",
|
||||
basePath: false,
|
||||
permanent: true,
|
||||
},
|
||||
];
|
||||
},
|
||||
async redirects() {
|
||||
return [
|
||||
// Change the basePath to /explorer
|
||||
{
|
||||
source: "/",
|
||||
destination: "/explorer",
|
||||
basePath: false,
|
||||
permanent: true,
|
||||
},
|
||||
];
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = nextConfig;
|
||||
module.exports = nextConfig
|
||||
@@ -1,6 +1,5 @@
|
||||
"use client";
|
||||
import type { IObservatoryNode } from "@/app/api/types";
|
||||
import { NYM_ACCOUNT_ADDRESS } from "@/app/api/urls";
|
||||
import { Search } from "@mui/icons-material";
|
||||
import {
|
||||
Autocomplete,
|
||||
@@ -14,6 +13,7 @@ import { useQuery } from "@tanstack/react-query";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { useState } from "react";
|
||||
import { fetchObservatoryNodes } from "../../app/api";
|
||||
import { NYM_ACCOUNT_ADDRESS } from "@/app/api/urls";
|
||||
|
||||
const NodeAndAddressSearch = () => {
|
||||
const router = useRouter();
|
||||
@@ -50,7 +50,7 @@ const NodeAndAddressSearch = () => {
|
||||
}
|
||||
} catch {
|
||||
setErrorText(
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again.",
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again."
|
||||
);
|
||||
setIsLoading(false); // Stop loading
|
||||
|
||||
@@ -58,7 +58,7 @@ const NodeAndAddressSearch = () => {
|
||||
}
|
||||
} else {
|
||||
setErrorText(
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again.",
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again."
|
||||
);
|
||||
setIsLoading(false); // Stop loading
|
||||
|
||||
@@ -68,7 +68,7 @@ const NodeAndAddressSearch = () => {
|
||||
// Check if it's a node identity key
|
||||
if (nymNodes) {
|
||||
const matchingNode = nymNodes.find(
|
||||
(node) => node.identity_key === inputValue,
|
||||
(node) => node.identity_key === inputValue
|
||||
);
|
||||
|
||||
if (matchingNode) {
|
||||
@@ -77,13 +77,13 @@ const NodeAndAddressSearch = () => {
|
||||
}
|
||||
}
|
||||
setErrorText(
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again.",
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again."
|
||||
);
|
||||
setIsLoading(false);
|
||||
}
|
||||
} catch (error) {
|
||||
setErrorText(
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again.",
|
||||
"No node found with the provided Name, Node ID or Identity Key. Please check your input and try again."
|
||||
);
|
||||
console.error(error);
|
||||
setIsLoading(false); // Stop loading
|
||||
@@ -92,7 +92,7 @@ const NodeAndAddressSearch = () => {
|
||||
|
||||
// Handle search input change
|
||||
const handleSearchInputChange = (
|
||||
event: React.ChangeEvent<HTMLInputElement>,
|
||||
event: React.ChangeEvent<HTMLInputElement>
|
||||
) => {
|
||||
const value = event.target.value;
|
||||
setInputValue(value);
|
||||
@@ -107,7 +107,7 @@ const NodeAndAddressSearch = () => {
|
||||
const filteredNodes = nymNodes.filter((node) =>
|
||||
node.self_description?.moniker
|
||||
?.toLowerCase()
|
||||
.includes(value.toLowerCase()),
|
||||
.includes(value.toLowerCase())
|
||||
);
|
||||
setSearchOptions(filteredNodes);
|
||||
} else {
|
||||
@@ -118,7 +118,7 @@ const NodeAndAddressSearch = () => {
|
||||
// Handle node selection from dropdown
|
||||
const handleNodeSelect = (
|
||||
event: React.SyntheticEvent,
|
||||
value: string | IObservatoryNode | null,
|
||||
value: string | IObservatoryNode | null
|
||||
) => {
|
||||
if (value && typeof value !== "string") {
|
||||
setIsLoading(true); // Show loading spinner
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "extension-storage"
|
||||
version = "1.4.1"
|
||||
version = "1.4.0-rc.0"
|
||||
edition = "2024"
|
||||
license = "Apache-2.0"
|
||||
repository = "https://github.com/nymtech/nym"
|
||||
|
||||
@@ -57,7 +57,7 @@ async fn run(
|
||||
.clone()
|
||||
.expect("rust sdk mainnet default missing api_url");
|
||||
|
||||
let nym_api = nym_http_api_client::ClientBuilder::new_with_urls(vec![default_api_url.into()])?
|
||||
let nym_api = nym_http_api_client::ClientBuilder::new_with_urls(vec![default_api_url.into()])
|
||||
.no_hickory_dns()
|
||||
.with_timeout(nym_api_client_timeout)
|
||||
.build()?;
|
||||
|
||||
@@ -98,7 +98,7 @@ impl Monitor {
|
||||
.expect("rust sdk mainnet default missing api_url");
|
||||
|
||||
let nym_api =
|
||||
nym_http_api_client::ClientBuilder::new_with_urls(vec![default_api_url.into()])?
|
||||
nym_http_api_client::ClientBuilder::new_with_urls(vec![default_api_url.into()])
|
||||
.no_hickory_dns()
|
||||
.with_timeout(self.nym_api_client_timeout)
|
||||
.build()?;
|
||||
|
||||
@@ -56,53 +56,6 @@ pub struct MixnetClientConfig {
|
||||
}
|
||||
|
||||
impl BuilderConfig {
|
||||
/// Creates a new BuilderConfig with all required parameters.
|
||||
///
|
||||
/// However, consider using `BuilderConfig::builder()` instead.
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn new(
|
||||
entry_node: NymNodeWithKeys,
|
||||
exit_node: NymNodeWithKeys,
|
||||
data_path: Option<PathBuf>,
|
||||
mixnet_client_config: MixnetClientConfig,
|
||||
two_hops: bool,
|
||||
user_agent: UserAgent,
|
||||
custom_topology_provider: Box<dyn TopologyProvider + Send + Sync>,
|
||||
network_env: NymNetworkDetails,
|
||||
cancel_token: CancellationToken,
|
||||
#[cfg(unix)] connection_fd_callback: Arc<dyn Fn(RawFd) + Send + Sync>,
|
||||
) -> Self {
|
||||
Self {
|
||||
entry_node,
|
||||
exit_node,
|
||||
data_path,
|
||||
mixnet_client_config,
|
||||
two_hops,
|
||||
user_agent,
|
||||
custom_topology_provider,
|
||||
network_env,
|
||||
cancel_token,
|
||||
#[cfg(unix)]
|
||||
connection_fd_callback,
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a builder for BuilderConfig
|
||||
///
|
||||
/// This is the preferred way to construct a BuilderConfig.
|
||||
///
|
||||
/// # Example
|
||||
/// ```ignore
|
||||
/// let config = BuilderConfig::builder()
|
||||
/// .entry_node(entry)
|
||||
/// .exit_node(exit)
|
||||
/// .user_agent(agent)
|
||||
/// .build()?;
|
||||
/// ```
|
||||
pub fn builder() -> BuilderConfigBuilder {
|
||||
BuilderConfigBuilder::default()
|
||||
}
|
||||
|
||||
pub fn mixnet_client_debug_config(&self) -> DebugConfig {
|
||||
if self.two_hops {
|
||||
two_hop_debug_config(&self.mixnet_client_config)
|
||||
@@ -163,7 +116,6 @@ impl BuilderConfig {
|
||||
.credentials_mode(true)
|
||||
.with_remember_me(remember_me)
|
||||
.custom_topology_provider(self.custom_topology_provider);
|
||||
|
||||
#[cfg(unix)]
|
||||
let builder = builder.with_connection_fd_callback(self.connection_fd_callback);
|
||||
|
||||
@@ -253,205 +205,3 @@ fn log_mixnet_client_config(debug_config: &DebugConfig) {
|
||||
fn true_to_disabled(val: bool) -> &'static str {
|
||||
if val { "disabled" } else { "enabled" }
|
||||
}
|
||||
|
||||
/// Error type for BuilderConfig validation
|
||||
#[derive(Debug, Clone, thiserror::Error)]
|
||||
#[allow(clippy::enum_variant_names)]
|
||||
pub enum BuilderConfigError {
|
||||
#[error("entry_node is required")]
|
||||
MissingEntryNode,
|
||||
#[error("exit_node is required")]
|
||||
MissingExitNode,
|
||||
#[error("mixnet_client_config is required")]
|
||||
MissingMixnetClientConfig,
|
||||
#[error("user_agent is required")]
|
||||
MissingUserAgent,
|
||||
#[error("custom_topology_provider is required")]
|
||||
MissingTopologyProvider,
|
||||
#[error("network_env is required")]
|
||||
MissingNetworkEnv,
|
||||
#[error("cancel_token is required")]
|
||||
MissingCancelToken,
|
||||
#[cfg(unix)]
|
||||
#[error("connection_fd_callback is required")]
|
||||
MissingConnectionFdCallback,
|
||||
}
|
||||
|
||||
/// Builder for `BuilderConfig`
|
||||
///
|
||||
/// This provides a more convenient way to construct a `BuilderConfig` compared to the
|
||||
/// `new()` constructor with many arguments.
|
||||
#[derive(Default)]
|
||||
pub struct BuilderConfigBuilder {
|
||||
entry_node: Option<NymNodeWithKeys>,
|
||||
exit_node: Option<NymNodeWithKeys>,
|
||||
data_path: Option<PathBuf>,
|
||||
mixnet_client_config: Option<MixnetClientConfig>,
|
||||
two_hops: bool,
|
||||
user_agent: Option<UserAgent>,
|
||||
custom_topology_provider: Option<Box<dyn TopologyProvider + Send + Sync>>,
|
||||
network_env: Option<NymNetworkDetails>,
|
||||
cancel_token: Option<CancellationToken>,
|
||||
#[cfg(unix)]
|
||||
connection_fd_callback: Option<Arc<dyn Fn(RawFd) + Send + Sync>>,
|
||||
}
|
||||
|
||||
impl BuilderConfigBuilder {
|
||||
pub fn new() -> Self {
|
||||
Self::default()
|
||||
}
|
||||
|
||||
pub fn entry_node(mut self, entry_node: NymNodeWithKeys) -> Self {
|
||||
self.entry_node = Some(entry_node);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn exit_node(mut self, exit_node: NymNodeWithKeys) -> Self {
|
||||
self.exit_node = Some(exit_node);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn data_path(mut self, data_path: Option<PathBuf>) -> Self {
|
||||
self.data_path = data_path;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn mixnet_client_config(mut self, mixnet_client_config: MixnetClientConfig) -> Self {
|
||||
self.mixnet_client_config = Some(mixnet_client_config);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn two_hops(mut self, two_hops: bool) -> Self {
|
||||
self.two_hops = two_hops;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn user_agent(mut self, user_agent: UserAgent) -> Self {
|
||||
self.user_agent = Some(user_agent);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn custom_topology_provider(
|
||||
mut self,
|
||||
custom_topology_provider: Box<dyn TopologyProvider + Send + Sync>,
|
||||
) -> Self {
|
||||
self.custom_topology_provider = Some(custom_topology_provider);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn network_env(mut self, network_env: NymNetworkDetails) -> Self {
|
||||
self.network_env = Some(network_env);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn cancel_token(mut self, cancel_token: CancellationToken) -> Self {
|
||||
self.cancel_token = Some(cancel_token);
|
||||
self
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
pub fn connection_fd_callback(
|
||||
mut self,
|
||||
connection_fd_callback: Arc<dyn Fn(RawFd) + Send + Sync>,
|
||||
) -> Self {
|
||||
self.connection_fd_callback = Some(connection_fd_callback);
|
||||
self
|
||||
}
|
||||
|
||||
/// Builds the `BuilderConfig`.
|
||||
///
|
||||
/// Returns an error if any required field is missing.
|
||||
pub fn build(self) -> Result<BuilderConfig, BuilderConfigError> {
|
||||
Ok(BuilderConfig {
|
||||
entry_node: self
|
||||
.entry_node
|
||||
.ok_or(BuilderConfigError::MissingEntryNode)?,
|
||||
exit_node: self.exit_node.ok_or(BuilderConfigError::MissingExitNode)?,
|
||||
data_path: self.data_path,
|
||||
mixnet_client_config: self
|
||||
.mixnet_client_config
|
||||
.ok_or(BuilderConfigError::MissingMixnetClientConfig)?,
|
||||
two_hops: self.two_hops,
|
||||
user_agent: self
|
||||
.user_agent
|
||||
.ok_or(BuilderConfigError::MissingUserAgent)?,
|
||||
custom_topology_provider: self
|
||||
.custom_topology_provider
|
||||
.ok_or(BuilderConfigError::MissingTopologyProvider)?,
|
||||
network_env: self
|
||||
.network_env
|
||||
.ok_or(BuilderConfigError::MissingNetworkEnv)?,
|
||||
cancel_token: self
|
||||
.cancel_token
|
||||
.ok_or(BuilderConfigError::MissingCancelToken)?,
|
||||
#[cfg(unix)]
|
||||
connection_fd_callback: self
|
||||
.connection_fd_callback
|
||||
.ok_or(BuilderConfigError::MissingConnectionFdCallback)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_mixnet_client_config_default_values() {
|
||||
let config = MixnetClientConfig::default();
|
||||
assert!(!config.disable_poisson_rate);
|
||||
assert!(!config.disable_background_cover_traffic);
|
||||
assert_eq!(config.min_mixnode_performance, None);
|
||||
assert_eq!(config.min_gateway_performance, None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_builder_config_builder_fails_without_required_fields() {
|
||||
// Building without any fields should fail with specific error
|
||||
let result = BuilderConfig::builder().build();
|
||||
assert!(result.is_err());
|
||||
match result {
|
||||
Err(BuilderConfigError::MissingEntryNode) => (), // Expected
|
||||
Err(e) => panic!("Expected MissingEntryNode, got: {}", e),
|
||||
Ok(_) => panic!("Expected error, got Ok"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_builder_config_builder_validates_all_required_fields() {
|
||||
// Test that each required field is validated
|
||||
let result = BuilderConfig::builder().build();
|
||||
assert!(result.is_err());
|
||||
|
||||
// Short-circuits at first missing field, so we just verify it's one of the expected errors
|
||||
#[allow(unreachable_patterns)] // All variants are covered, but keeping catch-all for safety
|
||||
match result {
|
||||
Err(BuilderConfigError::MissingEntryNode)
|
||||
| Err(BuilderConfigError::MissingExitNode)
|
||||
| Err(BuilderConfigError::MissingMixnetClientConfig)
|
||||
| Err(BuilderConfigError::MissingUserAgent)
|
||||
| Err(BuilderConfigError::MissingTopologyProvider)
|
||||
| Err(BuilderConfigError::MissingNetworkEnv)
|
||||
| Err(BuilderConfigError::MissingCancelToken) => (),
|
||||
#[cfg(unix)]
|
||||
Err(BuilderConfigError::MissingConnectionFdCallback) => (),
|
||||
Err(e) => panic!("Unexpected error: {}", e),
|
||||
Ok(_) => panic!("Expected validation error, got Ok"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_builder_config_builder_method_chaining() {
|
||||
// Test that builder methods chain properly and return Self
|
||||
let builder = BuilderConfig::builder();
|
||||
|
||||
// Verify the builder returns itself for chaining
|
||||
let builder = builder.two_hops(true);
|
||||
let builder = builder.two_hops(false);
|
||||
let builder = builder.data_path(None);
|
||||
|
||||
// Builder should still fail because required fields are missing
|
||||
let result = builder.build();
|
||||
assert!(result.is_err());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,6 @@
|
||||
"@types/big.js": "^6.1.6",
|
||||
"@types/bs58": "^4.0.1",
|
||||
"@types/jest": "^27.0.1",
|
||||
"@types/minimatch": "5.1.2",
|
||||
"@types/node": "^16.7.13",
|
||||
"@types/qrcode.react": "^1.0.2",
|
||||
"@types/react": "^18.0.26",
|
||||
@@ -132,8 +131,5 @@
|
||||
"webpack-favicons": "^1.3.8",
|
||||
"webpack-merge": "^5.8.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"@types/minimatch": "5.1.2"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
@@ -1,32 +1,32 @@
|
||||
import React from 'react';
|
||||
import { Box, Typography, Grid, Link, Card, CardContent, Stack } from '@mui/material';
|
||||
import { NymCard } from '..';
|
||||
import BitfinexIcon from 'src/svg-icons/bitfinex.svg';
|
||||
import KrakenIcon from 'src/svg-icons/kraken.svg';
|
||||
import BybitIcon from 'src/svg-icons/bybit.svg';
|
||||
import GateIcon from 'src/svg-icons/gate22.svg';
|
||||
import HTXIcon from 'src/svg-icons/htx.svg';
|
||||
import { NymCard } from '..';
|
||||
|
||||
const ExchangeCard = ({
|
||||
name,
|
||||
tokenType,
|
||||
url,
|
||||
IconComponent,
|
||||
const ExchangeCard = ({
|
||||
name,
|
||||
tokenType,
|
||||
url,
|
||||
IconComponent
|
||||
}: {
|
||||
name: string;
|
||||
tokenType: string;
|
||||
url: string;
|
||||
IconComponent: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
|
||||
}) => (
|
||||
<Card
|
||||
variant="outlined"
|
||||
sx={{
|
||||
<Card
|
||||
variant="outlined"
|
||||
sx={{
|
||||
height: '100%',
|
||||
transition: 'all 0.2s ease-in-out',
|
||||
'&:hover': {
|
||||
transform: 'translateY(-2px)',
|
||||
boxShadow: 2,
|
||||
},
|
||||
}
|
||||
}}
|
||||
>
|
||||
<CardContent sx={{ p: 3 }}>
|
||||
@@ -51,17 +51,17 @@ const ExchangeCard = ({
|
||||
<Typography variant="body2" sx={{ color: 'text.secondary' }}>
|
||||
{tokenType}
|
||||
</Typography>
|
||||
<Link
|
||||
href={url}
|
||||
target="_blank"
|
||||
<Link
|
||||
href={url}
|
||||
target="_blank"
|
||||
variant="body2"
|
||||
data-testid="link-get-nym"
|
||||
sx={{
|
||||
sx={{
|
||||
textDecoration: 'underline',
|
||||
fontWeight: 500,
|
||||
'&:hover': {
|
||||
textDecoration: 'none',
|
||||
},
|
||||
}
|
||||
}}
|
||||
>
|
||||
GET NYM
|
||||
@@ -78,40 +78,44 @@ export const Tutorial = () => {
|
||||
name: 'Bitfinex',
|
||||
tokenType: 'Native NYM, ERC-20',
|
||||
url: 'https://www.bitfinex.com/',
|
||||
IconComponent: BitfinexIcon,
|
||||
IconComponent: BitfinexIcon
|
||||
},
|
||||
{
|
||||
name: 'Kraken',
|
||||
tokenType: 'Native NYM',
|
||||
url: 'https://www.kraken.com/',
|
||||
IconComponent: KrakenIcon,
|
||||
IconComponent: KrakenIcon
|
||||
},
|
||||
{
|
||||
name: 'Bybit',
|
||||
tokenType: 'ERC-20',
|
||||
url: 'https://www.bybit.com/en/',
|
||||
IconComponent: BybitIcon,
|
||||
IconComponent: BybitIcon
|
||||
},
|
||||
{
|
||||
name: 'Gate.io',
|
||||
tokenType: 'ERC-20',
|
||||
url: 'https://www.gate.io/',
|
||||
IconComponent: GateIcon,
|
||||
IconComponent: GateIcon
|
||||
},
|
||||
{
|
||||
name: 'HTX',
|
||||
tokenType: 'ERC-20',
|
||||
url: 'https://www.htx.com/',
|
||||
IconComponent: HTXIcon,
|
||||
IconComponent: HTXIcon
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<NymCard borderless title="Where you can get NYM tokens" sx={{ mt: 4 }}>
|
||||
<NymCard
|
||||
borderless
|
||||
title="Where you can get NYM tokens"
|
||||
sx={{ mt: 4 }}
|
||||
>
|
||||
<Typography mb={3} fontSize={14} sx={{ color: 'text.secondary' }}>
|
||||
You can get NYM tokens from these exchanges
|
||||
</Typography>
|
||||
|
||||
|
||||
<Grid container spacing={3}>
|
||||
{exchanges.map((exchange) => (
|
||||
<Grid item xs={12} md={6} lg={4} key={exchange.name}>
|
||||
|
||||
+40
-41
@@ -1,41 +1,49 @@
|
||||
{
|
||||
"name": "@nymproject/nymsphere",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"license": "Apache 2.0",
|
||||
"workspaces": [
|
||||
"sdk/typescript/packages/**",
|
||||
"sdk/typescript/examples/**",
|
||||
"ts-packages/*",
|
||||
"nym-wallet",
|
||||
"explorer-nextjs",
|
||||
"explorer-v2",
|
||||
"types",
|
||||
"clients/validator",
|
||||
"sdk/typescript/packages/**",
|
||||
"sdk/typescript/examples/**",
|
||||
"sdk/typescript/codegen/**"
|
||||
],
|
||||
"scripts": {
|
||||
"audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run",
|
||||
"nuke": "npx rimraf **/node_modules node_modules",
|
||||
"scrub": "npx rimraf **/dist dist",
|
||||
"clean": "lerna run clean",
|
||||
"build": "run-s build:types build:packages",
|
||||
"build:ci": "run-s build:types build:packages build:wasm build:ci:sdk",
|
||||
"build:ci:sdk": "lerna run --scope '{@nymproject/sdk,@nymproject/node-tester,@nymproject/sdk-react,@nymproject/mix-fetch,@nymproject/nodejs-client,@nymproject/mix-fetch-node}' build --stream",
|
||||
"build:wasm": "make sdk-wasm-build",
|
||||
"build:types": "lerna run --scope @nymproject/types build --stream",
|
||||
"build:packages": "run-s build:packages:theme build:packages:react",
|
||||
"build:packages:theme": "lerna run --scope @nymproject/mui-theme build",
|
||||
"build:packages:react": "lerna run --scope @nymproject/react build",
|
||||
"build:playground": "lerna run --scope @nymproject/react storybook:build --stream",
|
||||
"build:ci:storybook": "yarn build && yarn dev:on && run-p build:playground && yarn build:ci:storybook:collect-artifacts ",
|
||||
"build:ci:storybook:collect-artifacts": "mkdir -p ts-packages/dist && mv sdk/typescript/packages/react-components/storybook-static ts-packages/dist/storybook ",
|
||||
"build:packages": "run-s build:packages:theme build:packages:react",
|
||||
"build:packages:react": "lerna run --scope @nymproject/react build",
|
||||
"build:packages:theme": "lerna run --scope @nymproject/mui-theme build",
|
||||
"build:playground": "lerna run --scope @nymproject/react storybook:build --stream",
|
||||
"build:types": "lerna run --scope @nymproject/types build --stream",
|
||||
"build:wasm": "make sdk-wasm-build",
|
||||
"clean": "lerna run clean",
|
||||
"dev:off": "node sdk/typescript/scripts/dev-mode-remove.mjs",
|
||||
"dev:on": "node sdk/typescript/scripts/dev-mode-add.mjs",
|
||||
"prebuild:ci": "yarn dev:on && yarn",
|
||||
"build:ci": "run-s build:types build:packages build:wasm build:ci:sdk",
|
||||
"postbuild:ci": "yarn dev:off",
|
||||
"build:ci:sdk": "lerna run --scope '{@nymproject/sdk,@nymproject/node-tester,@nymproject/sdk-react,@nymproject/mix-fetch,@nymproject/nodejs-client,@nymproject/mix-fetch-node}' build --stream",
|
||||
"docs:prod:build": "run-s docs:prod:build:ws",
|
||||
"docs:prod:build:ws": "lerna run docs:prod:build --stream",
|
||||
"lint": "lerna run lint --stream",
|
||||
"lint:fix": "lerna run lint:fix --stream",
|
||||
"nuke": "npx rimraf **/node_modules node_modules",
|
||||
"postbuild:ci": "yarn dev:off",
|
||||
"prebuild:ci": "yarn dev:on && yarn",
|
||||
"scrub": "npx rimraf **/dist dist",
|
||||
"sdk:build": "./sdk/typescript/scripts/build-prod-sdk.sh",
|
||||
"sdk:publish": "./sdk/typescript/scripts/publish.sh",
|
||||
"sdk:versions:add-rc": "cargo run -p sdk-version-bump --pre-release",
|
||||
"sdk:versions:bump": "cargo run -p sdk-version-bump bump-version",
|
||||
"sdk:versions:remove-rc": "cargo run -p sdk-version-bump remove-suffix",
|
||||
"lint": "lerna run lint --stream",
|
||||
"lint:fix": "lerna run lint:fix --stream",
|
||||
"tsc": "lerna run tsc --stream",
|
||||
"types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app"
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-react": "^0.453.0"
|
||||
"types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app",
|
||||
"audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run",
|
||||
"dev:on": "node sdk/typescript/scripts/dev-mode-add.mjs",
|
||||
"dev:off": "node sdk/typescript/scripts/dev-mode-remove.mjs"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@npmcli/node-gyp": "^3.0.0",
|
||||
@@ -45,23 +53,14 @@
|
||||
"npm-run-all": "^4.1.5",
|
||||
"tslog": "3.3.3"
|
||||
},
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"lucide-react": "^0.453.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"@cosmjs/amino": "^0.32.4",
|
||||
"@cosmjs/cosmwasm-stargate": "^0.32.4",
|
||||
"@cosmjs/proto-signing": "^0.32.4",
|
||||
"@cosmjs/stargate": "^0.32.4",
|
||||
"@cosmjs/cosmwasm-stargate": "^0.32.4",
|
||||
"cosmjs-types": "^0.9.0"
|
||||
},
|
||||
"workspaces": [
|
||||
"ts-packages/*",
|
||||
"nym-wallet",
|
||||
"explorer-nextjs",
|
||||
"explorer-v2",
|
||||
"types",
|
||||
"clients/validator",
|
||||
"sdk/typescript/packages/mix-fetch/internal-dev",
|
||||
"sdk/typescript/packages/react-components",
|
||||
"sdk/typescript/packages/mui-theme"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ check_ip_routing() {
|
||||
|
||||
perform_pings() {
|
||||
echo "Performing IPv4 ping to google.com..."
|
||||
ping -4 -c 4 google.com
|
||||
ping -c 4 google.com
|
||||
echo "---------------------------------------"
|
||||
echo "Performing IPv6 ping to google.com..."
|
||||
ping6 -c 4 google.com
|
||||
@@ -189,7 +189,7 @@ test_bridge_connectivity() {
|
||||
echo -e "Testing IPv4 connectivity..."
|
||||
echo
|
||||
|
||||
if ping -4 -c 1 -I "$ipv4_address" google.com >/dev/null 2>&1; then
|
||||
if ping -c 1 -I "$ipv4_address" google.com >/dev/null 2>&1; then
|
||||
echo -e "${green}IPv4 connectivity is working. Fetching test data...${reset}"
|
||||
joke=$(curl -s -H "Accept: application/json" --interface "$ipv4_address" https://icanhazdadjoke.com/ | jq -r .joke)
|
||||
[[ -n "$joke" && "$joke" != "null" ]] && echo -e "${green}IPv4 test joke: $joke${reset}" || echo -e "${red}Failed to fetch test data via IPv4.${reset}"
|
||||
@@ -277,7 +277,7 @@ check_bridge_installation() {
|
||||
# Check keys directory
|
||||
if [[ -d "$BRIDGE_KEYS_DIR" ]]; then
|
||||
echo -e "${green}✓ Keys directory exists: $BRIDGE_KEYS_DIR${reset}"
|
||||
key_count=$(sudo bash -c "ls -1 \"$BRIDGE_KEYS_DIR\"/*.pem" 2>/dev/null | wc -l)
|
||||
key_count=$(ls -1 "$BRIDGE_KEYS_DIR"/*.pem 2>/dev/null | wc -l)
|
||||
echo " Keys found: $key_count"
|
||||
else
|
||||
echo -e "${red}✗ Keys directory not found: $BRIDGE_KEYS_DIR${reset}"
|
||||
@@ -494,7 +494,7 @@ generate_bridge_keys() {
|
||||
# Generate ED25519 private key
|
||||
local key_file="$BRIDGE_KEYS_DIR/ed25519_bridge_identity.pem"
|
||||
|
||||
if sudo test -f "$key_file"; then
|
||||
if [[ -f "$key_file" ]]; then
|
||||
echo -e "${yellow}Warning: Key file already exists at $key_file${reset}"
|
||||
read -p "Overwrite existing key? (yes/no): " confirm
|
||||
if [[ "$confirm" != "yes" ]]; then
|
||||
@@ -532,14 +532,14 @@ create_client_params() {
|
||||
|
||||
# Check if key exists
|
||||
local key_file="$BRIDGE_KEYS_DIR/ed25519_bridge_identity.pem"
|
||||
if ! sudo test -f "$key_file"; then
|
||||
if [[ ! -f "$key_file" ]]; then
|
||||
echo -e "${red}Error: Bridge key not found at $key_file${reset}"
|
||||
echo "Run 'nym-bridge-helper generate_bridge_keys' first"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Get forward address
|
||||
read -p "Enter forward address (e.g., <IPv4>:51822, can be found by running 'curl -4 https://ifconfig.co/ip'): " forward_addr
|
||||
read -p "Enter forward address (e.g., <IPv4>:51822, can be found by running 'curl -6 https://ifconfig.co/ip'): " forward_addr
|
||||
if [[ -z "$forward_addr" ]]; then
|
||||
echo -e "${red}Error: Forward address is required${reset}"
|
||||
return 1
|
||||
@@ -722,28 +722,24 @@ install_bridge_binary() {
|
||||
local red="\033[0;31m"
|
||||
local yellow="\033[0;33m"
|
||||
|
||||
local deb_arch="amd64"
|
||||
local sys_arch=$(dpkg --print-architecture)
|
||||
|
||||
if [[ "$deb_arch" != "$sys_arch" ]]; then
|
||||
echo -e "${red}Error: aborting .deb package installation as this system's arch is not amd64.${reset}"
|
||||
echo " Refer to https://github.com/nymtech/nym-bridges for build instructions."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${yellow}=== Installing nym-bridge Binary ===${reset}"
|
||||
echo ""
|
||||
|
||||
echo "Retrieving URL to latest release..."
|
||||
local binary_url=$(
|
||||
curl -s "https://api.github.com/repos/nymtech/nym-bridges/releases/latest" |
|
||||
grep "browser_download_url.*amd64.deb" |
|
||||
grep -o 'https://[^"]*'
|
||||
)
|
||||
read -p "Enter bridge binary URL for your system from here https://builds.ci.nymte.ch/QUIC/: " binary_url
|
||||
if [[ -z "$binary_url" ]]; then
|
||||
echo -e "${red}Error: Binary URL is required${reset}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "Downloading $binary_url ..."
|
||||
if curl -L -o "/tmp/$(basename "$binary_url")" "$binary_url"; then
|
||||
sudo dpkg -i "/tmp/$(basename "$binary_url")"
|
||||
echo "Downloading nym-bridge binary..."
|
||||
if sudo curl -L "$binary_url" -o "$BRIDGE_BINARY"; then
|
||||
sudo chmod 755 "$BRIDGE_BINARY"
|
||||
echo -e "${green}✓ Bridge binary installed at $BRIDGE_BINARY${reset}"
|
||||
|
||||
# Show version
|
||||
echo ""
|
||||
echo "Binary version:"
|
||||
$BRIDGE_BINARY --version || echo "Unable to determine version"
|
||||
else
|
||||
echo -e "${red}✗ Failed to download bridge binary${reset}"
|
||||
return 1
|
||||
|
||||
@@ -555,22 +555,21 @@ where
|
||||
async fn available_gateways(&mut self) -> Result<Vec<RoutingNode>, ClientCoreError> {
|
||||
if let Some(ref mut custom_provider) = self.custom_topology_provider {
|
||||
if let Some(topology) = custom_provider.get_new_topology().await {
|
||||
// Use entry_capable_nodes() instead of entry_gateways() to include
|
||||
// all entry-capable nodes, not just actively assigned ones
|
||||
return Ok(topology.entry_capable_nodes().cloned().collect());
|
||||
return Ok(topology.entry_gateways().cloned().collect());
|
||||
}
|
||||
}
|
||||
|
||||
let nym_api_endpoints = self.get_api_endpoints();
|
||||
let topology_cfg = &self.config.debug_config.topology;
|
||||
let user_agent = self.user_agent.clone();
|
||||
let mut rng = OsRng;
|
||||
|
||||
gateways_for_init(
|
||||
&mut rng,
|
||||
&nym_api_endpoints,
|
||||
user_agent,
|
||||
topology_cfg.minimum_gateway_performance,
|
||||
topology_cfg.ignore_ingress_epoch_role,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
}
|
||||
@@ -706,16 +705,6 @@ where
|
||||
.config
|
||||
.as_base_client_config(nyxd_endpoints, nym_api_endpoints.clone());
|
||||
|
||||
tracing::debug!(
|
||||
"SDK: Passing nym_api_urls to BaseClientBuilder (has {} nym_api_urls)",
|
||||
self.config
|
||||
.network_details
|
||||
.nym_api_urls
|
||||
.as_ref()
|
||||
.map(|urls| urls.len())
|
||||
.unwrap_or(0)
|
||||
);
|
||||
|
||||
let mut base_builder: BaseClientBuilder<_, _> =
|
||||
BaseClientBuilder::new(base_config, self.storage, self.dkg_query_client)
|
||||
.with_wait_for_gateway(self.wait_for_gateway)
|
||||
@@ -723,11 +712,6 @@ where
|
||||
.with_remember_me(&self.remember_me)
|
||||
.with_derivation_material(self.derivation_material);
|
||||
|
||||
// Add nym_api_urls if available in network_details
|
||||
if let Some(nym_api_urls) = self.config.network_details.nym_api_urls.clone() {
|
||||
base_builder = base_builder.with_nym_api_urls(nym_api_urls);
|
||||
}
|
||||
|
||||
if let Some(user_agent) = self.user_agent {
|
||||
base_builder = base_builder.with_user_agent(user_agent);
|
||||
}
|
||||
@@ -896,17 +880,3 @@ impl IncludedSurbs {
|
||||
Self::ExposeSelfAddress
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_mixnet_builder_default_no_custom_client() {
|
||||
let builder = MixnetClientBuilder::new_ephemeral();
|
||||
assert!(
|
||||
builder.build().is_ok(),
|
||||
"Builder should succeed without custom client"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,13 @@ import codegen from '@cosmwasm/ts-codegen';
|
||||
codegen
|
||||
.default({
|
||||
contracts: [
|
||||
{ name: 'ecash', dir: '../../../../contracts/ecash' },
|
||||
{ name: 'coconut-bandwidth', dir: '../../../../contracts/coconut-bandwidth' },
|
||||
{ name: 'coconut-dkg', dir: '../../../../contracts/coconut-dkg' },
|
||||
{ name: 'mixnet', dir: '../../../../contracts/mixnet' },
|
||||
{ name: 'cw3-flex-multisig', dir: '../../../../contracts/multisig/cw3-flex-multisig' },
|
||||
{ name: 'cw4-group', dir: '../../../../contracts/multisig/cw4-group' },
|
||||
{ name: 'name-service', dir: '../../../../contracts/name-service' },
|
||||
{ name: 'service-provider-directory', dir: '../../../../contracts/service-provider-directory' },
|
||||
{ name: 'vesting', dir: '../../../../contracts/vesting' },
|
||||
],
|
||||
outPath: './src',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/contract-clients",
|
||||
"version": "1.3.1-rc0",
|
||||
"version": "1.3.0-rc.0",
|
||||
"description": "A client for all Nym smart contracts",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
@@ -18,7 +18,7 @@
|
||||
"docs:watch": "nodemon --ext ts --watch './src/**/*' --watch './typedoc.json' --exec \"yarn docs:generate\""
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cosmwasm/ts-codegen": "^1.13.3",
|
||||
"@cosmwasm/ts-codegen": "^0.35.3",
|
||||
"nodemon": "3.0.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"reload": "^3.2.1",
|
||||
@@ -27,4 +27,4 @@
|
||||
},
|
||||
"private": false,
|
||||
"types": "./dist/index.d.ts"
|
||||
}
|
||||
}
|
||||
@@ -1,58 +1,23 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
import { ICosmWasmClient, ISigningCosmWasmClient } from "./baseClient";
|
||||
import { Coin, StdFee } from "@interchainjs/types";
|
||||
import { InstantiateMsg, TimeConfiguration, ExecuteMsg, ContractSafeBytes, DealingChunkInfo, PartialContractDealing, QueryMsg, MigrateMsg, EpochState, Timestamp, Uint64, StateAdvanceResponse, StateProgress, ContractVersion, Addr, PagedDealerResponse, DealerDetails, Epoch, DealerDealingsStatusResponse, DealerType, DealerDetailsResponse, PagedDealerIndexResponse, DealingChunkResponse, DealingChunkStatusResponse, ChunkSubmissionStatus, DealingStatusResponse, DealingStatus, DealingMetadataResponse, DealingMetadata, PagedDealerAddressesResponse, NullableEpoch, RegisteredDealerDetails, DealerRegistrationDetails, Cw4Contract, State, VkShareResponse, ContractVKShare, PagedVKSharesResponse } from "./CoconutDkg.types";
|
||||
import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate";
|
||||
import { Coin, StdFee } from "@cosmjs/amino";
|
||||
import { InstantiateMsg, TimeConfiguration, ExecuteMsg, ContractSafeBytes, Addr, QueryMsg, MigrateMsg, PagedDealerResponse, DealerDetails, Timestamp, Uint64, EpochState, Epoch, DealerType, DealerDetailsResponse, PagedDealingsResponse, ContractDealing, NullableInitialReplacementData, InitialReplacementData, PagedVKSharesResponse, ContractVKShare } from "./CoconutDkg.types";
|
||||
|
||||
export interface CoconutDkgReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
getState: () => Promise<State>;
|
||||
getCurrentEpochState: () => Promise<Epoch>;
|
||||
getEpochStateAtHeight: ({
|
||||
height
|
||||
}: {
|
||||
height: number;
|
||||
}) => Promise<NullableEpoch>;
|
||||
getCurrentEpochThreshold: () => Promise<Uint64>;
|
||||
getEpochThreshold: ({
|
||||
epochId
|
||||
}: {
|
||||
epochId: number;
|
||||
}) => Promise<Uint64>;
|
||||
canAdvanceState: () => Promise<StateAdvanceResponse>;
|
||||
getRegisteredDealer: ({
|
||||
dealerAddress,
|
||||
epochId
|
||||
}: {
|
||||
dealerAddress: string;
|
||||
epochId?: number;
|
||||
}) => Promise<RegisteredDealerDetails>;
|
||||
getInitialDealers: () => Promise<NullableInitialReplacementData>;
|
||||
getDealerDetails: ({
|
||||
dealerAddress
|
||||
}: {
|
||||
dealerAddress: string;
|
||||
}) => Promise<DealerDetailsResponse>;
|
||||
getEpochDealersAddresses: ({
|
||||
epochId,
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
epochId: number;
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedDealerAddressesResponse>;
|
||||
getEpochDealers: ({
|
||||
epochId,
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
epochId: number;
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedDealerResponse>;
|
||||
getCurrentDealers: ({
|
||||
limit,
|
||||
startAfter
|
||||
@@ -60,67 +25,22 @@ export interface CoconutDkgReadOnlyInterface {
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedDealerResponse>;
|
||||
getDealerIndices: ({
|
||||
getPastDealers: ({
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedDealerIndexResponse>;
|
||||
getDealingsMetadata: ({
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}) => Promise<PagedDealerResponse>;
|
||||
getDealing: ({
|
||||
idx,
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}) => Promise<DealingMetadataResponse>;
|
||||
getDealerDealingsStatus: ({
|
||||
dealer,
|
||||
epochId
|
||||
}: {
|
||||
dealer: string;
|
||||
epochId: number;
|
||||
}) => Promise<DealerDealingsStatusResponse>;
|
||||
getDealingStatus: ({
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}: {
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}) => Promise<DealingStatusResponse>;
|
||||
getDealingChunkStatus: ({
|
||||
chunkIndex,
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}: {
|
||||
chunkIndex: number;
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}) => Promise<DealingChunkStatusResponse>;
|
||||
getDealingChunk: ({
|
||||
chunkIndex,
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}: {
|
||||
chunkIndex: number;
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}) => Promise<DealingChunkResponse>;
|
||||
getVerificationKey: ({
|
||||
epochId,
|
||||
owner
|
||||
}: {
|
||||
epochId: number;
|
||||
owner: string;
|
||||
}) => Promise<VkShareResponse>;
|
||||
idx: number;
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedDealingsResponse>;
|
||||
getVerificationKeys: ({
|
||||
epochId,
|
||||
limit,
|
||||
@@ -130,89 +50,37 @@ export interface CoconutDkgReadOnlyInterface {
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedVKSharesResponse>;
|
||||
getCw2ContractVersion: () => Promise<GetCw2ContractVersionResponse>;
|
||||
}
|
||||
export class CoconutDkgQueryClient implements CoconutDkgReadOnlyInterface {
|
||||
client: ICosmWasmClient;
|
||||
client: CosmWasmClient;
|
||||
contractAddress: string;
|
||||
constructor(client: ICosmWasmClient, contractAddress: string) {
|
||||
|
||||
constructor(client: CosmWasmClient, contractAddress: string) {
|
||||
this.client = client;
|
||||
this.contractAddress = contractAddress;
|
||||
this.getState = this.getState.bind(this);
|
||||
this.getCurrentEpochState = this.getCurrentEpochState.bind(this);
|
||||
this.getEpochStateAtHeight = this.getEpochStateAtHeight.bind(this);
|
||||
this.getCurrentEpochThreshold = this.getCurrentEpochThreshold.bind(this);
|
||||
this.getEpochThreshold = this.getEpochThreshold.bind(this);
|
||||
this.canAdvanceState = this.canAdvanceState.bind(this);
|
||||
this.getRegisteredDealer = this.getRegisteredDealer.bind(this);
|
||||
this.getInitialDealers = this.getInitialDealers.bind(this);
|
||||
this.getDealerDetails = this.getDealerDetails.bind(this);
|
||||
this.getEpochDealersAddresses = this.getEpochDealersAddresses.bind(this);
|
||||
this.getEpochDealers = this.getEpochDealers.bind(this);
|
||||
this.getCurrentDealers = this.getCurrentDealers.bind(this);
|
||||
this.getDealerIndices = this.getDealerIndices.bind(this);
|
||||
this.getDealingsMetadata = this.getDealingsMetadata.bind(this);
|
||||
this.getDealerDealingsStatus = this.getDealerDealingsStatus.bind(this);
|
||||
this.getDealingStatus = this.getDealingStatus.bind(this);
|
||||
this.getDealingChunkStatus = this.getDealingChunkStatus.bind(this);
|
||||
this.getDealingChunk = this.getDealingChunk.bind(this);
|
||||
this.getVerificationKey = this.getVerificationKey.bind(this);
|
||||
this.getPastDealers = this.getPastDealers.bind(this);
|
||||
this.getDealing = this.getDealing.bind(this);
|
||||
this.getVerificationKeys = this.getVerificationKeys.bind(this);
|
||||
this.getCw2ContractVersion = this.getCw2ContractVersion.bind(this);
|
||||
}
|
||||
getState = async (): Promise<State> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_state: {}
|
||||
});
|
||||
};
|
||||
|
||||
getCurrentEpochState = async (): Promise<Epoch> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_current_epoch_state: {}
|
||||
});
|
||||
};
|
||||
getEpochStateAtHeight = async ({
|
||||
height
|
||||
}: {
|
||||
height: number;
|
||||
}): Promise<NullableEpoch> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_epoch_state_at_height: {
|
||||
height
|
||||
}
|
||||
});
|
||||
};
|
||||
getCurrentEpochThreshold = async (): Promise<Uint64> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_current_epoch_threshold: {}
|
||||
});
|
||||
};
|
||||
getEpochThreshold = async ({
|
||||
epochId
|
||||
}: {
|
||||
epochId: number;
|
||||
}): Promise<Uint64> => {
|
||||
getInitialDealers = async (): Promise<NullableInitialReplacementData> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_epoch_threshold: {
|
||||
epoch_id: epochId
|
||||
}
|
||||
});
|
||||
};
|
||||
canAdvanceState = async (): Promise<StateAdvanceResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
can_advance_state: {}
|
||||
});
|
||||
};
|
||||
getRegisteredDealer = async ({
|
||||
dealerAddress,
|
||||
epochId
|
||||
}: {
|
||||
dealerAddress: string;
|
||||
epochId?: number;
|
||||
}): Promise<RegisteredDealerDetails> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_registered_dealer: {
|
||||
dealer_address: dealerAddress,
|
||||
epoch_id: epochId
|
||||
}
|
||||
get_initial_dealers: {}
|
||||
});
|
||||
};
|
||||
getDealerDetails = async ({
|
||||
@@ -226,40 +94,6 @@ export class CoconutDkgQueryClient implements CoconutDkgReadOnlyInterface {
|
||||
}
|
||||
});
|
||||
};
|
||||
getEpochDealersAddresses = async ({
|
||||
epochId,
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
epochId: number;
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}): Promise<PagedDealerAddressesResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_epoch_dealers_addresses: {
|
||||
epoch_id: epochId,
|
||||
limit,
|
||||
start_after: startAfter
|
||||
}
|
||||
});
|
||||
};
|
||||
getEpochDealers = async ({
|
||||
epochId,
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
epochId: number;
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}): Promise<PagedDealerResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_epoch_dealers: {
|
||||
epoch_id: epochId,
|
||||
limit,
|
||||
start_after: startAfter
|
||||
}
|
||||
});
|
||||
};
|
||||
getCurrentDealers = async ({
|
||||
limit,
|
||||
startAfter
|
||||
@@ -274,119 +108,34 @@ export class CoconutDkgQueryClient implements CoconutDkgReadOnlyInterface {
|
||||
}
|
||||
});
|
||||
};
|
||||
getDealerIndices = async ({
|
||||
getPastDealers = async ({
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}): Promise<PagedDealerIndexResponse> => {
|
||||
}): Promise<PagedDealerResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_dealer_indices: {
|
||||
get_past_dealers: {
|
||||
limit,
|
||||
start_after: startAfter
|
||||
}
|
||||
});
|
||||
};
|
||||
getDealingsMetadata = async ({
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
getDealing = async ({
|
||||
idx,
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}): Promise<DealingMetadataResponse> => {
|
||||
idx: number;
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}): Promise<PagedDealingsResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_dealings_metadata: {
|
||||
dealer,
|
||||
dealing_index: dealingIndex,
|
||||
epoch_id: epochId
|
||||
}
|
||||
});
|
||||
};
|
||||
getDealerDealingsStatus = async ({
|
||||
dealer,
|
||||
epochId
|
||||
}: {
|
||||
dealer: string;
|
||||
epochId: number;
|
||||
}): Promise<DealerDealingsStatusResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_dealer_dealings_status: {
|
||||
dealer,
|
||||
epoch_id: epochId
|
||||
}
|
||||
});
|
||||
};
|
||||
getDealingStatus = async ({
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}: {
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}): Promise<DealingStatusResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_dealing_status: {
|
||||
dealer,
|
||||
dealing_index: dealingIndex,
|
||||
epoch_id: epochId
|
||||
}
|
||||
});
|
||||
};
|
||||
getDealingChunkStatus = async ({
|
||||
chunkIndex,
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}: {
|
||||
chunkIndex: number;
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}): Promise<DealingChunkStatusResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_dealing_chunk_status: {
|
||||
chunk_index: chunkIndex,
|
||||
dealer,
|
||||
dealing_index: dealingIndex,
|
||||
epoch_id: epochId
|
||||
}
|
||||
});
|
||||
};
|
||||
getDealingChunk = async ({
|
||||
chunkIndex,
|
||||
dealer,
|
||||
dealingIndex,
|
||||
epochId
|
||||
}: {
|
||||
chunkIndex: number;
|
||||
dealer: string;
|
||||
dealingIndex: number;
|
||||
epochId: number;
|
||||
}): Promise<DealingChunkResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_dealing_chunk: {
|
||||
chunk_index: chunkIndex,
|
||||
dealer,
|
||||
dealing_index: dealingIndex,
|
||||
epoch_id: epochId
|
||||
}
|
||||
});
|
||||
};
|
||||
getVerificationKey = async ({
|
||||
epochId,
|
||||
owner
|
||||
}: {
|
||||
epochId: number;
|
||||
owner: string;
|
||||
}): Promise<VkShareResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_verification_key: {
|
||||
epoch_id: epochId,
|
||||
owner
|
||||
get_dealing: {
|
||||
idx,
|
||||
limit,
|
||||
start_after: startAfter
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -407,142 +156,91 @@ export class CoconutDkgQueryClient implements CoconutDkgReadOnlyInterface {
|
||||
}
|
||||
});
|
||||
};
|
||||
getCw2ContractVersion = async (): Promise<GetCw2ContractVersionResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_cw2_contract_version: {}
|
||||
});
|
||||
};
|
||||
}
|
||||
export interface CoconutDkgInterface extends CoconutDkgReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
sender: string;
|
||||
initiateDkg: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
registerDealer: ({
|
||||
announceAddress,
|
||||
bteKeyWithProof,
|
||||
identityKey,
|
||||
resharing
|
||||
}: {
|
||||
announceAddress: string;
|
||||
bteKeyWithProof: string;
|
||||
identityKey: string;
|
||||
resharing: boolean;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
commitDealingsMetadata: ({
|
||||
chunks,
|
||||
dealingIndex,
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
commitDealing: ({
|
||||
dealingBytes,
|
||||
resharing
|
||||
}: {
|
||||
chunks: DealingChunkInfo[];
|
||||
dealingIndex: number;
|
||||
dealingBytes: ContractSafeBytes;
|
||||
resharing: boolean;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
commitDealingsChunk: ({
|
||||
chunk
|
||||
}: {
|
||||
chunk: PartialContractDealing;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
commitVerificationKeyShare: ({
|
||||
resharing,
|
||||
share
|
||||
}: {
|
||||
resharing: boolean;
|
||||
share: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
verifyVerificationKeyShare: ({
|
||||
owner,
|
||||
resharing
|
||||
}: {
|
||||
owner: string;
|
||||
owner: Addr;
|
||||
resharing: boolean;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
advanceEpochState: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
triggerReset: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
triggerResharing: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
transferOwnership: ({
|
||||
transferTo
|
||||
}: {
|
||||
transferTo: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
updateAnnounceAddress: ({
|
||||
newAddress
|
||||
}: {
|
||||
newAddress: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
surpassedThreshold: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
advanceEpochState: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
}
|
||||
export class CoconutDkgClient extends CoconutDkgQueryClient implements CoconutDkgInterface {
|
||||
client: ISigningCosmWasmClient;
|
||||
client: SigningCosmWasmClient;
|
||||
sender: string;
|
||||
contractAddress: string;
|
||||
constructor(client: ISigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
|
||||
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
super(client, contractAddress);
|
||||
this.client = client;
|
||||
this.sender = sender;
|
||||
this.contractAddress = contractAddress;
|
||||
this.initiateDkg = this.initiateDkg.bind(this);
|
||||
this.registerDealer = this.registerDealer.bind(this);
|
||||
this.commitDealingsMetadata = this.commitDealingsMetadata.bind(this);
|
||||
this.commitDealingsChunk = this.commitDealingsChunk.bind(this);
|
||||
this.commitDealing = this.commitDealing.bind(this);
|
||||
this.commitVerificationKeyShare = this.commitVerificationKeyShare.bind(this);
|
||||
this.verifyVerificationKeyShare = this.verifyVerificationKeyShare.bind(this);
|
||||
this.surpassedThreshold = this.surpassedThreshold.bind(this);
|
||||
this.advanceEpochState = this.advanceEpochState.bind(this);
|
||||
this.triggerReset = this.triggerReset.bind(this);
|
||||
this.triggerResharing = this.triggerResharing.bind(this);
|
||||
this.transferOwnership = this.transferOwnership.bind(this);
|
||||
this.updateAnnounceAddress = this.updateAnnounceAddress.bind(this);
|
||||
}
|
||||
initiateDkg = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
initiate_dkg: {}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
|
||||
registerDealer = async ({
|
||||
announceAddress,
|
||||
bteKeyWithProof,
|
||||
identityKey,
|
||||
resharing
|
||||
}: {
|
||||
announceAddress: string;
|
||||
bteKeyWithProof: string;
|
||||
identityKey: string;
|
||||
resharing: boolean;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
register_dealer: {
|
||||
announce_address: announceAddress,
|
||||
bte_key_with_proof: bteKeyWithProof,
|
||||
identity_key: identityKey,
|
||||
resharing
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
commitDealingsMetadata = async ({
|
||||
chunks,
|
||||
dealingIndex,
|
||||
commitDealing = async ({
|
||||
dealingBytes,
|
||||
resharing
|
||||
}: {
|
||||
chunks: DealingChunkInfo[];
|
||||
dealingIndex: number;
|
||||
dealingBytes: ContractSafeBytes;
|
||||
resharing: boolean;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
commit_dealings_metadata: {
|
||||
chunks,
|
||||
dealing_index: dealingIndex,
|
||||
commit_dealing: {
|
||||
dealing_bytes: dealingBytes,
|
||||
resharing
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
commitDealingsChunk = async ({
|
||||
chunk
|
||||
}: {
|
||||
chunk: PartialContractDealing;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
commit_dealings_chunk: {
|
||||
chunk
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
commitVerificationKeyShare = async ({
|
||||
resharing,
|
||||
@@ -550,63 +248,36 @@ export class CoconutDkgClient extends CoconutDkgQueryClient implements CoconutDk
|
||||
}: {
|
||||
resharing: boolean;
|
||||
share: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
commit_verification_key_share: {
|
||||
resharing,
|
||||
share
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
verifyVerificationKeyShare = async ({
|
||||
owner,
|
||||
resharing
|
||||
}: {
|
||||
owner: string;
|
||||
owner: Addr;
|
||||
resharing: boolean;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
verify_verification_key_share: {
|
||||
owner,
|
||||
resharing
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
advanceEpochState = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
surpassedThreshold = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
surpassed_threshold: {}
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
advanceEpochState = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
advance_epoch_state: {}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
triggerReset = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
trigger_reset: {}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
triggerResharing = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
trigger_resharing: {}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
transferOwnership = async ({
|
||||
transferTo
|
||||
}: {
|
||||
transferTo: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
transfer_ownership: {
|
||||
transfer_to: transferTo
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
updateAnnounceAddress = async ({
|
||||
newAddress
|
||||
}: {
|
||||
newAddress: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_announce_address: {
|
||||
new_address: newAddress
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
export interface InstantiateMsg {
|
||||
group_addr: string;
|
||||
key_size: number;
|
||||
mix_denom: string;
|
||||
multisig_addr: string;
|
||||
time_configuration?: TimeConfiguration | null;
|
||||
@@ -20,24 +19,16 @@ export interface TimeConfiguration {
|
||||
verification_key_validation_time_secs: number;
|
||||
}
|
||||
export type ExecuteMsg = {
|
||||
initiate_dkg: {};
|
||||
} | {
|
||||
register_dealer: {
|
||||
announce_address: string;
|
||||
bte_key_with_proof: string;
|
||||
identity_key: string;
|
||||
resharing: boolean;
|
||||
};
|
||||
} | {
|
||||
commit_dealings_metadata: {
|
||||
chunks: DealingChunkInfo[];
|
||||
dealing_index: number;
|
||||
commit_dealing: {
|
||||
dealing_bytes: ContractSafeBytes;
|
||||
resharing: boolean;
|
||||
};
|
||||
} | {
|
||||
commit_dealings_chunk: {
|
||||
chunk: PartialContractDealing;
|
||||
};
|
||||
} | {
|
||||
commit_verification_key_share: {
|
||||
resharing: boolean;
|
||||
@@ -45,115 +36,41 @@ export type ExecuteMsg = {
|
||||
};
|
||||
} | {
|
||||
verify_verification_key_share: {
|
||||
owner: string;
|
||||
owner: Addr;
|
||||
resharing: boolean;
|
||||
};
|
||||
} | {
|
||||
surpassed_threshold: {};
|
||||
} | {
|
||||
advance_epoch_state: {};
|
||||
} | {
|
||||
trigger_reset: {};
|
||||
} | {
|
||||
trigger_resharing: {};
|
||||
} | {
|
||||
transfer_ownership: {
|
||||
transfer_to: string;
|
||||
};
|
||||
} | {
|
||||
update_announce_address: {
|
||||
new_address: string;
|
||||
};
|
||||
};
|
||||
export type ContractSafeBytes = number[];
|
||||
export interface DealingChunkInfo {
|
||||
size: number;
|
||||
}
|
||||
export interface PartialContractDealing {
|
||||
chunk_index: number;
|
||||
data: ContractSafeBytes;
|
||||
dealing_index: number;
|
||||
}
|
||||
export type Addr = string;
|
||||
export type QueryMsg = {
|
||||
get_state: {};
|
||||
} | {
|
||||
get_current_epoch_state: {};
|
||||
} | {
|
||||
get_epoch_state_at_height: {
|
||||
height: number;
|
||||
};
|
||||
} | {
|
||||
get_current_epoch_threshold: {};
|
||||
} | {
|
||||
get_epoch_threshold: {
|
||||
epoch_id: number;
|
||||
};
|
||||
} | {
|
||||
can_advance_state: {};
|
||||
} | {
|
||||
get_registered_dealer: {
|
||||
dealer_address: string;
|
||||
epoch_id?: number | null;
|
||||
};
|
||||
get_initial_dealers: {};
|
||||
} | {
|
||||
get_dealer_details: {
|
||||
dealer_address: string;
|
||||
};
|
||||
} | {
|
||||
get_epoch_dealers_addresses: {
|
||||
epoch_id: number;
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_epoch_dealers: {
|
||||
epoch_id: number;
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_current_dealers: {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_dealer_indices: {
|
||||
get_past_dealers: {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_dealings_metadata: {
|
||||
dealer: string;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
};
|
||||
} | {
|
||||
get_dealer_dealings_status: {
|
||||
dealer: string;
|
||||
epoch_id: number;
|
||||
};
|
||||
} | {
|
||||
get_dealing_status: {
|
||||
dealer: string;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
};
|
||||
} | {
|
||||
get_dealing_chunk_status: {
|
||||
chunk_index: number;
|
||||
dealer: string;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
};
|
||||
} | {
|
||||
get_dealing_chunk: {
|
||||
chunk_index: number;
|
||||
dealer: string;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
};
|
||||
} | {
|
||||
get_verification_key: {
|
||||
epoch_id: number;
|
||||
owner: string;
|
||||
get_dealing: {
|
||||
idx: number;
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_verification_keys: {
|
||||
@@ -161,11 +78,22 @@ export type QueryMsg = {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_cw2_contract_version: {};
|
||||
};
|
||||
export interface MigrateMsg {}
|
||||
export type EpochState = ("waiting_initialisation" | "in_progress") | {
|
||||
export interface PagedDealerResponse {
|
||||
dealers: DealerDetails[];
|
||||
per_page: number;
|
||||
start_next_after?: Addr | null;
|
||||
}
|
||||
export interface DealerDetails {
|
||||
address: Addr;
|
||||
announce_address: string;
|
||||
assigned_index: number;
|
||||
bte_public_key_with_proof: string;
|
||||
}
|
||||
export type Timestamp = Uint64;
|
||||
export type Uint64 = number;
|
||||
export type EpochState = "in_progress" | {
|
||||
public_key_submission: {
|
||||
resharing: boolean;
|
||||
};
|
||||
@@ -186,132 +114,36 @@ export type EpochState = ("waiting_initialisation" | "in_progress") | {
|
||||
resharing: boolean;
|
||||
};
|
||||
};
|
||||
export type Timestamp = Uint64;
|
||||
export type Uint64 = number;
|
||||
export interface StateAdvanceResponse {
|
||||
current_state: EpochState;
|
||||
deadline?: Timestamp | null;
|
||||
is_complete: boolean;
|
||||
progress: StateProgress;
|
||||
reached_deadline: boolean;
|
||||
}
|
||||
export interface StateProgress {
|
||||
registered_dealers: number;
|
||||
registered_resharing_dealers: number;
|
||||
submitted_dealings: number;
|
||||
submitted_key_shares: number;
|
||||
verified_keys: number;
|
||||
}
|
||||
export interface ContractVersion {
|
||||
contract: string;
|
||||
version: string;
|
||||
}
|
||||
export type Addr = string;
|
||||
export interface PagedDealerResponse {
|
||||
dealers: DealerDetails[];
|
||||
per_page: number;
|
||||
start_next_after?: Addr | null;
|
||||
}
|
||||
export interface DealerDetails {
|
||||
address: Addr;
|
||||
announce_address: string;
|
||||
assigned_index: number;
|
||||
bte_public_key_with_proof: string;
|
||||
ed25519_identity: string;
|
||||
}
|
||||
export interface Epoch {
|
||||
deadline?: Timestamp | null;
|
||||
epoch_id: number;
|
||||
finish_timestamp: Timestamp;
|
||||
state: EpochState;
|
||||
state_progress: StateProgress;
|
||||
time_configuration: TimeConfiguration;
|
||||
}
|
||||
export interface DealerDealingsStatusResponse {
|
||||
all_dealings_fully_submitted: boolean;
|
||||
dealer: Addr;
|
||||
dealing_submission_status: {};
|
||||
epoch_id: number;
|
||||
}
|
||||
export type DealerType = "unknown" | {
|
||||
current: {
|
||||
assigned_index: number;
|
||||
};
|
||||
} | {
|
||||
past: {
|
||||
assigned_index: number;
|
||||
};
|
||||
};
|
||||
export type DealerType = "current" | "past" | "unknown";
|
||||
export interface DealerDetailsResponse {
|
||||
dealer_type: DealerType;
|
||||
details?: DealerDetails | null;
|
||||
}
|
||||
export interface PagedDealerIndexResponse {
|
||||
indices: [Addr, number][];
|
||||
export interface PagedDealingsResponse {
|
||||
dealings: ContractDealing[];
|
||||
per_page: number;
|
||||
start_next_after?: Addr | null;
|
||||
}
|
||||
export interface DealingChunkResponse {
|
||||
chunk?: ContractSafeBytes | null;
|
||||
chunk_index: number;
|
||||
export interface ContractDealing {
|
||||
dealer: Addr;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
dealing: ContractSafeBytes;
|
||||
}
|
||||
export interface DealingChunkStatusResponse {
|
||||
chunk_index: number;
|
||||
dealer: Addr;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
status: ChunkSubmissionStatus;
|
||||
export type NullableInitialReplacementData = InitialReplacementData | null;
|
||||
export interface InitialReplacementData {
|
||||
initial_dealers: Addr[];
|
||||
initial_height: number;
|
||||
}
|
||||
export interface ChunkSubmissionStatus {
|
||||
submission_height?: number | null;
|
||||
}
|
||||
export interface DealingStatusResponse {
|
||||
dealer: Addr;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
status: DealingStatus;
|
||||
}
|
||||
export interface DealingStatus {
|
||||
chunk_submission_status: {};
|
||||
fully_submitted: boolean;
|
||||
has_metadata: boolean;
|
||||
}
|
||||
export interface DealingMetadataResponse {
|
||||
dealer: Addr;
|
||||
dealing_index: number;
|
||||
epoch_id: number;
|
||||
metadata?: DealingMetadata | null;
|
||||
}
|
||||
export interface DealingMetadata {
|
||||
dealing_index: number;
|
||||
submitted_chunks: {};
|
||||
}
|
||||
export interface PagedDealerAddressesResponse {
|
||||
dealers: Addr[];
|
||||
export interface PagedVKSharesResponse {
|
||||
per_page: number;
|
||||
shares: ContractVKShare[];
|
||||
start_next_after?: Addr | null;
|
||||
}
|
||||
export type NullableEpoch = Epoch | null;
|
||||
export interface RegisteredDealerDetails {
|
||||
details?: DealerRegistrationDetails | null;
|
||||
}
|
||||
export interface DealerRegistrationDetails {
|
||||
announce_address: string;
|
||||
bte_public_key_with_proof: string;
|
||||
ed25519_identity: string;
|
||||
}
|
||||
export type Cw4Contract = Addr;
|
||||
export interface State {
|
||||
group_addr: Cw4Contract;
|
||||
key_size: number;
|
||||
mix_denom: string;
|
||||
multisig_addr: Addr;
|
||||
}
|
||||
export interface VkShareResponse {
|
||||
epoch_id: number;
|
||||
owner: Addr;
|
||||
share?: ContractVKShare | null;
|
||||
}
|
||||
export interface ContractVKShare {
|
||||
announce_address: string;
|
||||
epoch_id: number;
|
||||
@@ -319,9 +151,4 @@ export interface ContractVKShare {
|
||||
owner: Addr;
|
||||
share: string;
|
||||
verified: boolean;
|
||||
}
|
||||
export interface PagedVKSharesResponse {
|
||||
per_page: number;
|
||||
shares: ContractVKShare[];
|
||||
start_next_after?: Addr | null;
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
import { ICosmWasmClient, ISigningCosmWasmClient } from "./baseClient";
|
||||
import { StdFee } from "@interchainjs/types";
|
||||
import { Executor, Addr, Duration, Uint128, UncheckedDenom, Threshold, Decimal, InstantiateMsg, UncheckedDepositInfo, ExecuteMsg, Expiration, Timestamp, Uint64, CosmosMsgForEmpty, BankMsg, WasmMsg, Binary, Vote, Coin, Empty, MemberChangedHookMsg, MemberDiff, QueryMsg, MigrateMsg, Cw4Contract, Denom, Config, DepositInfo, Status, ThresholdResponse, ProposalListResponseForEmpty, ProposalResponseForEmpty, VoterListResponse, VoterDetail, VoteListResponse, VoteInfo, VoteResponse, VoterResponse } from "./Cw3FlexMultisig.types";
|
||||
import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate";
|
||||
import { StdFee } from "@cosmjs/amino";
|
||||
import { Executor, Addr, Duration, Uint128, UncheckedDenom, Threshold, Decimal, InstantiateMsg, UncheckedDepositInfo, ExecuteMsg, Expiration, Timestamp, Uint64, CosmosMsgForEmpty, BankMsg, StakingMsg, DistributionMsg, Binary, IbcMsg, WasmMsg, GovMsg, VoteOption, Vote, Coin, Empty, IbcTimeout, IbcTimeoutBlock, MemberChangedHookMsg, MemberDiff, QueryMsg, MigrateMsg, Cw4Contract, Denom, Config, DepositInfo, Status, ThresholdResponse, ProposalListResponseForEmpty, ProposalResponseForEmpty, VoterListResponse, VoterDetail, VoteListResponse, VoteInfo, VoteResponse, VoterResponse } from "./Cw3FlexMultisig.types";
|
||||
|
||||
export interface Cw3FlexMultisigReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
threshold: () => Promise<ThresholdResponse>;
|
||||
@@ -60,9 +61,10 @@ export interface Cw3FlexMultisigReadOnlyInterface {
|
||||
config: () => Promise<Config>;
|
||||
}
|
||||
export class Cw3FlexMultisigQueryClient implements Cw3FlexMultisigReadOnlyInterface {
|
||||
client: ICosmWasmClient;
|
||||
client: CosmWasmClient;
|
||||
contractAddress: string;
|
||||
constructor(client: ICosmWasmClient, contractAddress: string) {
|
||||
|
||||
constructor(client: CosmWasmClient, contractAddress: string) {
|
||||
this.client = client;
|
||||
this.contractAddress = contractAddress;
|
||||
this.threshold = this.threshold.bind(this);
|
||||
@@ -75,6 +77,7 @@ export class Cw3FlexMultisigQueryClient implements Cw3FlexMultisigReadOnlyInterf
|
||||
this.listVoters = this.listVoters.bind(this);
|
||||
this.config = this.config.bind(this);
|
||||
}
|
||||
|
||||
threshold = async (): Promise<ThresholdResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
threshold: {}
|
||||
@@ -194,35 +197,36 @@ export interface Cw3FlexMultisigInterface extends Cw3FlexMultisigReadOnlyInterfa
|
||||
latest?: Expiration;
|
||||
msgs: CosmosMsgForEmpty[];
|
||||
title: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
vote: ({
|
||||
proposalId,
|
||||
vote
|
||||
}: {
|
||||
proposalId: number;
|
||||
vote: Vote;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
// vote: ({
|
||||
// proposalId,
|
||||
// vote
|
||||
// }: {
|
||||
// proposalId: number;
|
||||
// vote: Vote;
|
||||
// }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
execute: ({
|
||||
proposalId
|
||||
}: {
|
||||
proposalId: number;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
close: ({
|
||||
proposalId
|
||||
}: {
|
||||
proposalId: number;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
memberChangedHook: ({
|
||||
diffs
|
||||
}: {
|
||||
diffs: MemberDiff[];
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
}
|
||||
export class Cw3FlexMultisigClient extends Cw3FlexMultisigQueryClient implements Cw3FlexMultisigInterface {
|
||||
client: ISigningCosmWasmClient;
|
||||
client: SigningCosmWasmClient;
|
||||
sender: string;
|
||||
contractAddress: string;
|
||||
constructor(client: ISigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
|
||||
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
super(client, contractAddress);
|
||||
this.client = client;
|
||||
this.sender = sender;
|
||||
@@ -233,6 +237,7 @@ export class Cw3FlexMultisigClient extends Cw3FlexMultisigQueryClient implements
|
||||
this.close = this.close.bind(this);
|
||||
this.memberChangedHook = this.memberChangedHook.bind(this);
|
||||
}
|
||||
|
||||
propose = async ({
|
||||
description,
|
||||
latest,
|
||||
@@ -243,7 +248,7 @@ export class Cw3FlexMultisigClient extends Cw3FlexMultisigQueryClient implements
|
||||
latest?: Expiration;
|
||||
msgs: CosmosMsgForEmpty[];
|
||||
title: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
propose: {
|
||||
description,
|
||||
@@ -251,53 +256,53 @@ export class Cw3FlexMultisigClient extends Cw3FlexMultisigQueryClient implements
|
||||
msgs,
|
||||
title
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
vote = async ({
|
||||
proposalId,
|
||||
vote
|
||||
}: {
|
||||
proposalId: number;
|
||||
vote: Vote;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
vote: {
|
||||
proposal_id: proposalId,
|
||||
vote
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
// vote = async ({
|
||||
// proposalId,
|
||||
// vote
|
||||
// }: {
|
||||
// proposalId: number;
|
||||
// vote: Vote;
|
||||
// }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
// return await this.client.execute(this.sender, this.contractAddress, {
|
||||
// vote: {
|
||||
// proposal_id: proposalId,
|
||||
// vote
|
||||
// }
|
||||
// }, fee, memo, _funds);
|
||||
// };
|
||||
execute = async ({
|
||||
proposalId
|
||||
}: {
|
||||
proposalId: number;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
execute: {
|
||||
proposal_id: proposalId
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
close = async ({
|
||||
proposalId
|
||||
}: {
|
||||
proposalId: number;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
close: {
|
||||
proposal_id: proposalId
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
memberChangedHook = async ({
|
||||
diffs
|
||||
}: {
|
||||
diffs: MemberDiff[];
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
member_changed_hook: {
|
||||
diffs
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
@@ -84,17 +84,86 @@ export type CosmosMsgForEmpty = {
|
||||
bank: BankMsg;
|
||||
} | {
|
||||
custom: Empty;
|
||||
} | {
|
||||
staking: StakingMsg;
|
||||
} | {
|
||||
distribution: DistributionMsg;
|
||||
} | {
|
||||
stargate: {
|
||||
type_url: string;
|
||||
value: Binary;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
ibc: IbcMsg;
|
||||
} | {
|
||||
wasm: WasmMsg;
|
||||
} | {
|
||||
gov: GovMsg;
|
||||
};
|
||||
export type BankMsg = {
|
||||
send: {
|
||||
amount: Coin[];
|
||||
to_address: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
burn: {
|
||||
amount: Coin[];
|
||||
[k: string]: unknown;
|
||||
};
|
||||
};
|
||||
export type StakingMsg = {
|
||||
delegate: {
|
||||
amount: Coin;
|
||||
validator: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
undelegate: {
|
||||
amount: Coin;
|
||||
validator: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
redelegate: {
|
||||
amount: Coin;
|
||||
dst_validator: string;
|
||||
src_validator: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
};
|
||||
export type DistributionMsg = {
|
||||
set_withdraw_address: {
|
||||
address: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
withdraw_delegator_reward: {
|
||||
validator: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
};
|
||||
export type Binary = string;
|
||||
export type IbcMsg = {
|
||||
transfer: {
|
||||
amount: Coin;
|
||||
channel_id: string;
|
||||
timeout: IbcTimeout;
|
||||
to_address: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
send_packet: {
|
||||
channel_id: string;
|
||||
data: Binary;
|
||||
timeout: IbcTimeout;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
close_channel: {
|
||||
channel_id: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
};
|
||||
export type WasmMsg = {
|
||||
@@ -102,6 +171,7 @@ export type WasmMsg = {
|
||||
contract_addr: string;
|
||||
funds: Coin[];
|
||||
msg: Binary;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
instantiate: {
|
||||
@@ -110,30 +180,54 @@ export type WasmMsg = {
|
||||
funds: Coin[];
|
||||
label: string;
|
||||
msg: Binary;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
migrate: {
|
||||
contract_addr: string;
|
||||
msg: Binary;
|
||||
new_code_id: number;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
update_admin: {
|
||||
admin: string;
|
||||
contract_addr: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
} | {
|
||||
clear_admin: {
|
||||
contract_addr: string;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
};
|
||||
export type Binary = string;
|
||||
export type GovMsg = {
|
||||
vote: {
|
||||
proposal_id: number;
|
||||
vote: VoteOption;
|
||||
[k: string]: unknown;
|
||||
};
|
||||
};
|
||||
export type VoteOption = "yes" | "no" | "abstain" | "no_with_veto";
|
||||
export type Vote = "yes" | "no" | "abstain" | "veto";
|
||||
export interface Coin {
|
||||
amount: Uint128;
|
||||
denom: string;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface Empty {
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface IbcTimeout {
|
||||
block?: IbcTimeoutBlock | null;
|
||||
timestamp?: Timestamp | null;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface IbcTimeoutBlock {
|
||||
height: number;
|
||||
revision: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface Empty {}
|
||||
export interface MemberChangedHookMsg {
|
||||
diffs: MemberDiff[];
|
||||
}
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
import { ICosmWasmClient, ISigningCosmWasmClient } from "./baseClient";
|
||||
import { Coin, StdFee } from "@interchainjs/types";
|
||||
import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate";
|
||||
import { Coin, StdFee } from "@cosmjs/amino";
|
||||
import { InstantiateMsg, Member, ExecuteMsg, QueryMsg, MigrateMsg, AdminResponse, HooksResponse, MemberListResponse, MemberResponse, TotalWeightResponse } from "./Cw4Group.types";
|
||||
|
||||
export interface Cw4GroupReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
admin: () => Promise<AdminResponse>;
|
||||
@@ -32,9 +33,10 @@ export interface Cw4GroupReadOnlyInterface {
|
||||
hooks: () => Promise<HooksResponse>;
|
||||
}
|
||||
export class Cw4GroupQueryClient implements Cw4GroupReadOnlyInterface {
|
||||
client: ICosmWasmClient;
|
||||
client: CosmWasmClient;
|
||||
contractAddress: string;
|
||||
constructor(client: ICosmWasmClient, contractAddress: string) {
|
||||
|
||||
constructor(client: CosmWasmClient, contractAddress: string) {
|
||||
this.client = client;
|
||||
this.contractAddress = contractAddress;
|
||||
this.admin = this.admin.bind(this);
|
||||
@@ -43,6 +45,7 @@ export class Cw4GroupQueryClient implements Cw4GroupReadOnlyInterface {
|
||||
this.member = this.member.bind(this);
|
||||
this.hooks = this.hooks.bind(this);
|
||||
}
|
||||
|
||||
admin = async (): Promise<AdminResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
admin: {}
|
||||
@@ -100,30 +103,31 @@ export interface Cw4GroupInterface extends Cw4GroupReadOnlyInterface {
|
||||
admin
|
||||
}: {
|
||||
admin?: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateMembers: ({
|
||||
add,
|
||||
remove
|
||||
}: {
|
||||
add: Member[];
|
||||
remove: string[];
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
addHook: ({
|
||||
addr
|
||||
}: {
|
||||
addr: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
removeHook: ({
|
||||
addr
|
||||
}: {
|
||||
addr: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
}
|
||||
export class Cw4GroupClient extends Cw4GroupQueryClient implements Cw4GroupInterface {
|
||||
client: ISigningCosmWasmClient;
|
||||
client: SigningCosmWasmClient;
|
||||
sender: string;
|
||||
contractAddress: string;
|
||||
constructor(client: ISigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
|
||||
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
super(client, contractAddress);
|
||||
this.client = client;
|
||||
this.sender = sender;
|
||||
@@ -133,16 +137,17 @@ export class Cw4GroupClient extends Cw4GroupQueryClient implements Cw4GroupInter
|
||||
this.addHook = this.addHook.bind(this);
|
||||
this.removeHook = this.removeHook.bind(this);
|
||||
}
|
||||
|
||||
updateAdmin = async ({
|
||||
admin
|
||||
}: {
|
||||
admin?: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_admin: {
|
||||
admin
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateMembers = async ({
|
||||
add,
|
||||
@@ -150,34 +155,34 @@ export class Cw4GroupClient extends Cw4GroupQueryClient implements Cw4GroupInter
|
||||
}: {
|
||||
add: Member[];
|
||||
remove: string[];
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_members: {
|
||||
add,
|
||||
remove
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
addHook = async ({
|
||||
addr
|
||||
}: {
|
||||
addr: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
add_hook: {
|
||||
addr
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
removeHook = async ({
|
||||
addr
|
||||
}: {
|
||||
addr: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
remove_hook: {
|
||||
addr
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
@@ -1,256 +0,0 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
import { ICosmWasmClient, ISigningCosmWasmClient } from "./baseClient";
|
||||
import { StdFee } from "@interchainjs/types";
|
||||
import { Uint128, InstantiateMsg, Coin, ExecuteMsg, QueryMsg, MigrateMsg, PagedBlacklistedAccountResponse, BlacklistedAccount, Blacklisting, BlacklistedAccountResponse, DepositResponse, Deposit, PagedDepositsResponse, DepositData, LatestDepositResponse } from "./Ecash.types";
|
||||
export interface EcashReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
getBlacklistedAccount: ({
|
||||
publicKey
|
||||
}: {
|
||||
publicKey: string;
|
||||
}) => Promise<BlacklistedAccountResponse>;
|
||||
getBlacklistPaged: ({
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}) => Promise<PagedBlacklistedAccountResponse>;
|
||||
getRequiredDepositAmount: () => Promise<Coin>;
|
||||
getDeposit: ({
|
||||
depositId
|
||||
}: {
|
||||
depositId: number;
|
||||
}) => Promise<DepositResponse>;
|
||||
getLatestDeposit: () => Promise<LatestDepositResponse>;
|
||||
getDepositsPaged: ({
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
limit?: number;
|
||||
startAfter?: number;
|
||||
}) => Promise<PagedDepositsResponse>;
|
||||
}
|
||||
export class EcashQueryClient implements EcashReadOnlyInterface {
|
||||
client: ICosmWasmClient;
|
||||
contractAddress: string;
|
||||
constructor(client: ICosmWasmClient, contractAddress: string) {
|
||||
this.client = client;
|
||||
this.contractAddress = contractAddress;
|
||||
this.getBlacklistedAccount = this.getBlacklistedAccount.bind(this);
|
||||
this.getBlacklistPaged = this.getBlacklistPaged.bind(this);
|
||||
this.getRequiredDepositAmount = this.getRequiredDepositAmount.bind(this);
|
||||
this.getDeposit = this.getDeposit.bind(this);
|
||||
this.getLatestDeposit = this.getLatestDeposit.bind(this);
|
||||
this.getDepositsPaged = this.getDepositsPaged.bind(this);
|
||||
}
|
||||
getBlacklistedAccount = async ({
|
||||
publicKey
|
||||
}: {
|
||||
publicKey: string;
|
||||
}): Promise<BlacklistedAccountResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_blacklisted_account: {
|
||||
public_key: publicKey
|
||||
}
|
||||
});
|
||||
};
|
||||
getBlacklistPaged = async ({
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
limit?: number;
|
||||
startAfter?: string;
|
||||
}): Promise<PagedBlacklistedAccountResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_blacklist_paged: {
|
||||
limit,
|
||||
start_after: startAfter
|
||||
}
|
||||
});
|
||||
};
|
||||
getRequiredDepositAmount = async (): Promise<Coin> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_required_deposit_amount: {}
|
||||
});
|
||||
};
|
||||
getDeposit = async ({
|
||||
depositId
|
||||
}: {
|
||||
depositId: number;
|
||||
}): Promise<DepositResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_deposit: {
|
||||
deposit_id: depositId
|
||||
}
|
||||
});
|
||||
};
|
||||
getLatestDeposit = async (): Promise<LatestDepositResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_latest_deposit: {}
|
||||
});
|
||||
};
|
||||
getDepositsPaged = async ({
|
||||
limit,
|
||||
startAfter
|
||||
}: {
|
||||
limit?: number;
|
||||
startAfter?: number;
|
||||
}): Promise<PagedDepositsResponse> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_deposits_paged: {
|
||||
limit,
|
||||
start_after: startAfter
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
export interface EcashInterface extends EcashReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
sender: string;
|
||||
depositTicketBookFunds: ({
|
||||
identityKey
|
||||
}: {
|
||||
identityKey: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
requestRedemption: ({
|
||||
commitmentBs58,
|
||||
numberOfTickets
|
||||
}: {
|
||||
commitmentBs58: string;
|
||||
numberOfTickets: number;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
redeemTickets: ({
|
||||
gw,
|
||||
n
|
||||
}: {
|
||||
gw: string;
|
||||
n: number;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
updateAdmin: ({
|
||||
admin
|
||||
}: {
|
||||
admin: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
updateDepositValue: ({
|
||||
newDeposit
|
||||
}: {
|
||||
newDeposit: Coin;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
proposeToBlacklist: ({
|
||||
publicKey
|
||||
}: {
|
||||
publicKey: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
addToBlacklist: ({
|
||||
publicKey
|
||||
}: {
|
||||
publicKey: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}
|
||||
export class EcashClient extends EcashQueryClient implements EcashInterface {
|
||||
client: ISigningCosmWasmClient;
|
||||
sender: string;
|
||||
contractAddress: string;
|
||||
constructor(client: ISigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
super(client, contractAddress);
|
||||
this.client = client;
|
||||
this.sender = sender;
|
||||
this.contractAddress = contractAddress;
|
||||
this.depositTicketBookFunds = this.depositTicketBookFunds.bind(this);
|
||||
this.requestRedemption = this.requestRedemption.bind(this);
|
||||
this.redeemTickets = this.redeemTickets.bind(this);
|
||||
this.updateAdmin = this.updateAdmin.bind(this);
|
||||
this.updateDepositValue = this.updateDepositValue.bind(this);
|
||||
this.proposeToBlacklist = this.proposeToBlacklist.bind(this);
|
||||
this.addToBlacklist = this.addToBlacklist.bind(this);
|
||||
}
|
||||
depositTicketBookFunds = async ({
|
||||
identityKey
|
||||
}: {
|
||||
identityKey: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
deposit_ticket_book_funds: {
|
||||
identity_key: identityKey
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
requestRedemption = async ({
|
||||
commitmentBs58,
|
||||
numberOfTickets
|
||||
}: {
|
||||
commitmentBs58: string;
|
||||
numberOfTickets: number;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
request_redemption: {
|
||||
commitment_bs58: commitmentBs58,
|
||||
number_of_tickets: numberOfTickets
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
redeemTickets = async ({
|
||||
gw,
|
||||
n
|
||||
}: {
|
||||
gw: string;
|
||||
n: number;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
redeem_tickets: {
|
||||
gw,
|
||||
n
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
updateAdmin = async ({
|
||||
admin
|
||||
}: {
|
||||
admin: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_admin: {
|
||||
admin
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
updateDepositValue = async ({
|
||||
newDeposit
|
||||
}: {
|
||||
newDeposit: Coin;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_deposit_value: {
|
||||
new_deposit: newDeposit
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
proposeToBlacklist = async ({
|
||||
publicKey
|
||||
}: {
|
||||
publicKey: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
propose_to_blacklist: {
|
||||
public_key: publicKey
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
addToBlacklist = async ({
|
||||
publicKey
|
||||
}: {
|
||||
publicKey: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
add_to_blacklist: {
|
||||
public_key: publicKey
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
export type Uint128 = string;
|
||||
export interface InstantiateMsg {
|
||||
deposit_amount: Coin;
|
||||
group_addr: string;
|
||||
holding_account: string;
|
||||
multisig_addr: string;
|
||||
}
|
||||
export interface Coin {
|
||||
amount: Uint128;
|
||||
denom: string;
|
||||
}
|
||||
export type ExecuteMsg = {
|
||||
deposit_ticket_book_funds: {
|
||||
identity_key: string;
|
||||
};
|
||||
} | {
|
||||
request_redemption: {
|
||||
commitment_bs58: string;
|
||||
number_of_tickets: number;
|
||||
};
|
||||
} | {
|
||||
redeem_tickets: {
|
||||
gw: string;
|
||||
n: number;
|
||||
};
|
||||
} | {
|
||||
update_admin: {
|
||||
admin: string;
|
||||
};
|
||||
} | {
|
||||
update_deposit_value: {
|
||||
new_deposit: Coin;
|
||||
};
|
||||
} | {
|
||||
propose_to_blacklist: {
|
||||
public_key: string;
|
||||
};
|
||||
} | {
|
||||
add_to_blacklist: {
|
||||
public_key: string;
|
||||
};
|
||||
};
|
||||
export type QueryMsg = {
|
||||
get_blacklisted_account: {
|
||||
public_key: string;
|
||||
};
|
||||
} | {
|
||||
get_blacklist_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_required_deposit_amount: {};
|
||||
} | {
|
||||
get_deposit: {
|
||||
deposit_id: number;
|
||||
};
|
||||
} | {
|
||||
get_latest_deposit: {};
|
||||
} | {
|
||||
get_deposits_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
};
|
||||
export interface MigrateMsg {}
|
||||
export interface PagedBlacklistedAccountResponse {
|
||||
accounts: BlacklistedAccount[];
|
||||
per_page: number;
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface BlacklistedAccount {
|
||||
info: Blacklisting;
|
||||
public_key: string;
|
||||
}
|
||||
export interface Blacklisting {
|
||||
finalized_at_height?: number | null;
|
||||
proposal_id: number;
|
||||
}
|
||||
export interface BlacklistedAccountResponse {
|
||||
account?: Blacklisting | null;
|
||||
}
|
||||
export interface DepositResponse {
|
||||
deposit?: Deposit | null;
|
||||
id: number;
|
||||
}
|
||||
export interface Deposit {
|
||||
bs58_encoded_ed25519_pubkey: string;
|
||||
}
|
||||
export interface PagedDepositsResponse {
|
||||
deposits: DepositData[];
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface DepositData {
|
||||
deposit: Deposit;
|
||||
id: number;
|
||||
}
|
||||
export interface LatestDepositResponse {
|
||||
deposit?: DepositData | null;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,66 +1,80 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
export type Decimal = string;
|
||||
export type Percent = Decimal;
|
||||
export type Uint128 = string;
|
||||
|
||||
/**
|
||||
* This instantiates the contract.
|
||||
*/
|
||||
export interface InstantiateMsg {
|
||||
current_nym_node_version: string;
|
||||
epoch_duration: Duration;
|
||||
epochs_in_interval: number;
|
||||
initial_rewarding_params: InitialRewardingParams;
|
||||
interval_operating_cost?: RangedValueForUint128;
|
||||
key_validity_in_epochs?: number | null;
|
||||
profit_margin?: RangedValueForPercent;
|
||||
rewarding_denom: string;
|
||||
rewarding_validator_address: string;
|
||||
version_score_params?: VersionScoreFormulaParams;
|
||||
version_score_weights?: OutdatedVersionWeights;
|
||||
vesting_contract_address: string;
|
||||
}
|
||||
export interface Duration {
|
||||
nanos: number;
|
||||
secs: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface InitialRewardingParams {
|
||||
active_set_size: number;
|
||||
active_set_work_factor: Decimal;
|
||||
initial_reward_pool: Decimal;
|
||||
initial_staking_supply: Decimal;
|
||||
interval_pool_emission: Percent;
|
||||
rewarded_set_params: RewardedSetParams;
|
||||
rewarded_set_size: number;
|
||||
staking_supply_scale_factor: Percent;
|
||||
sybil_resistance: Percent;
|
||||
}
|
||||
export interface RewardedSetParams {
|
||||
entry_gateways: number;
|
||||
exit_gateways: number;
|
||||
mixnodes: number;
|
||||
standby: number;
|
||||
}
|
||||
export interface RangedValueForUint128 {
|
||||
maximum: Uint128;
|
||||
minimum: Uint128;
|
||||
}
|
||||
export interface RangedValueForPercent {
|
||||
maximum: Percent;
|
||||
minimum: Percent;
|
||||
}
|
||||
export interface VersionScoreFormulaParams {
|
||||
penalty: Decimal;
|
||||
penalty_scaling: Decimal;
|
||||
}
|
||||
export interface OutdatedVersionWeights {
|
||||
major: number;
|
||||
minor: number;
|
||||
patch: number;
|
||||
prerelease: number;
|
||||
}
|
||||
export type ExecuteMsg = {
|
||||
update_admin: {
|
||||
admin: string;
|
||||
assign_node_layer: {
|
||||
layer: Layer;
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
create_family: {
|
||||
label: string;
|
||||
};
|
||||
} | {
|
||||
join_family: {
|
||||
family_head: FamilyHead;
|
||||
join_permit: MessageSignature;
|
||||
};
|
||||
} | {
|
||||
leave_family: {
|
||||
family_head: FamilyHead;
|
||||
};
|
||||
} | {
|
||||
kick_family_member: {
|
||||
member: string;
|
||||
};
|
||||
} | {
|
||||
create_family_on_behalf: {
|
||||
label: string;
|
||||
owner_address: string;
|
||||
};
|
||||
} | {
|
||||
join_family_on_behalf: {
|
||||
family_head: FamilyHead;
|
||||
join_permit: MessageSignature;
|
||||
member_address: string;
|
||||
};
|
||||
} | {
|
||||
leave_family_on_behalf: {
|
||||
family_head: FamilyHead;
|
||||
member_address: string;
|
||||
};
|
||||
} | {
|
||||
kick_family_member_on_behalf: {
|
||||
head_address: string;
|
||||
member: string;
|
||||
};
|
||||
} | {
|
||||
update_rewarding_validator_address: {
|
||||
@@ -68,16 +82,12 @@ export type ExecuteMsg = {
|
||||
};
|
||||
} | {
|
||||
update_contract_state_params: {
|
||||
update: ContractStateParamsUpdate;
|
||||
updated_parameters: ContractStateParams;
|
||||
};
|
||||
} | {
|
||||
update_current_nym_node_semver: {
|
||||
current_version: string;
|
||||
};
|
||||
} | {
|
||||
update_active_set_distribution: {
|
||||
update_active_set_size: {
|
||||
active_set_size: number;
|
||||
force_immediately: boolean;
|
||||
update: ActiveSetUpdate;
|
||||
};
|
||||
} | {
|
||||
update_rewarding_params: {
|
||||
@@ -92,23 +102,24 @@ export type ExecuteMsg = {
|
||||
};
|
||||
} | {
|
||||
begin_epoch_transition: {};
|
||||
} | {
|
||||
advance_current_epoch: {
|
||||
expected_active_set_size: number;
|
||||
new_rewarded_set: LayerAssignment[];
|
||||
};
|
||||
} | {
|
||||
reconcile_epoch_events: {
|
||||
limit?: number | null;
|
||||
};
|
||||
} | {
|
||||
assign_roles: {
|
||||
assignment: RoleAssignment;
|
||||
};
|
||||
} | {
|
||||
bond_mixnode: {
|
||||
cost_params: NodeCostParams;
|
||||
cost_params: MixNodeCostParams;
|
||||
mix_node: MixNode;
|
||||
owner_signature: MessageSignature;
|
||||
};
|
||||
} | {
|
||||
bond_mixnode_on_behalf: {
|
||||
cost_params: NodeCostParams;
|
||||
cost_params: MixNodeCostParams;
|
||||
mix_node: MixNode;
|
||||
owner: string;
|
||||
owner_signature: MessageSignature;
|
||||
@@ -135,12 +146,12 @@ export type ExecuteMsg = {
|
||||
owner: string;
|
||||
};
|
||||
} | {
|
||||
update_cost_params: {
|
||||
new_costs: NodeCostParams;
|
||||
update_mixnode_cost_params: {
|
||||
new_costs: MixNodeCostParams;
|
||||
};
|
||||
} | {
|
||||
update_mixnode_cost_params_on_behalf: {
|
||||
new_costs: NodeCostParams;
|
||||
new_costs: MixNodeCostParams;
|
||||
owner: string;
|
||||
};
|
||||
} | {
|
||||
@@ -152,8 +163,6 @@ export type ExecuteMsg = {
|
||||
new_config: MixNodeConfigUpdate;
|
||||
owner: string;
|
||||
};
|
||||
} | {
|
||||
migrate_mixnode: {};
|
||||
} | {
|
||||
bond_gateway: {
|
||||
gateway: Gateway;
|
||||
@@ -181,24 +190,8 @@ export type ExecuteMsg = {
|
||||
owner: string;
|
||||
};
|
||||
} | {
|
||||
migrate_gateway: {
|
||||
cost_params?: NodeCostParams | null;
|
||||
};
|
||||
} | {
|
||||
bond_nym_node: {
|
||||
cost_params: NodeCostParams;
|
||||
node: NymNode;
|
||||
owner_signature: MessageSignature;
|
||||
};
|
||||
} | {
|
||||
unbond_nym_node: {};
|
||||
} | {
|
||||
update_node_config: {
|
||||
update: NodeConfigUpdate;
|
||||
};
|
||||
} | {
|
||||
delegate: {
|
||||
node_id: number;
|
||||
delegate_to_mixnode: {
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
delegate_to_mixnode_on_behalf: {
|
||||
@@ -206,8 +199,8 @@ export type ExecuteMsg = {
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
undelegate: {
|
||||
node_id: number;
|
||||
undelegate_from_mixnode: {
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
undelegate_from_mixnode_on_behalf: {
|
||||
@@ -215,9 +208,9 @@ export type ExecuteMsg = {
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
reward_node: {
|
||||
node_id: number;
|
||||
params: NodeRewardingParameters;
|
||||
reward_mixnode: {
|
||||
mix_id: number;
|
||||
performance: Percent;
|
||||
};
|
||||
} | {
|
||||
withdraw_operator_reward: {};
|
||||
@@ -227,62 +220,42 @@ export type ExecuteMsg = {
|
||||
};
|
||||
} | {
|
||||
withdraw_delegator_reward: {
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
withdraw_delegator_reward_on_behalf: {
|
||||
mix_id: number;
|
||||
owner: string;
|
||||
};
|
||||
} | {
|
||||
migrate_vested_mix_node: {};
|
||||
} | {
|
||||
migrate_vested_delegation: {
|
||||
mix_id: number;
|
||||
};
|
||||
};
|
||||
export type Role = "eg" | "l1" | "l2" | "l3" | "xg" | "stb";
|
||||
export type Layer = "One" | "Two" | "Three";
|
||||
export type FamilyHead = string;
|
||||
export type MessageSignature = number[];
|
||||
export interface ContractStateParamsUpdate {
|
||||
config_score_params?: ConfigScoreParamsUpdate | null;
|
||||
delegations_params?: DelegationsParams | null;
|
||||
operators_params?: OperatorsParamsUpdate | null;
|
||||
}
|
||||
export interface ConfigScoreParamsUpdate {
|
||||
version_score_formula_params?: VersionScoreFormulaParams | null;
|
||||
version_weights?: OutdatedVersionWeights | null;
|
||||
}
|
||||
export interface DelegationsParams {
|
||||
minimum_delegation?: Coin | null;
|
||||
export type Uint128 = string;
|
||||
export interface ContractStateParams {
|
||||
minimum_gateway_pledge: Coin;
|
||||
minimum_mixnode_delegation?: Coin | null;
|
||||
minimum_mixnode_pledge: Coin;
|
||||
}
|
||||
export interface Coin {
|
||||
amount: Uint128;
|
||||
denom: string;
|
||||
}
|
||||
export interface OperatorsParamsUpdate {
|
||||
interval_operating_cost?: RangedValueForUint128 | null;
|
||||
minimum_pledge?: Coin | null;
|
||||
profit_margin?: RangedValueForPercent | null;
|
||||
}
|
||||
export interface ActiveSetUpdate {
|
||||
entry_gateways: number;
|
||||
exit_gateways: number;
|
||||
mixnodes: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface IntervalRewardingParamsUpdate {
|
||||
active_set_work_factor?: Decimal | null;
|
||||
interval_pool_emission?: Percent | null;
|
||||
reward_pool?: Decimal | null;
|
||||
rewarded_set_params?: RewardedSetParams | null;
|
||||
rewarded_set_size?: number | null;
|
||||
staking_supply?: Decimal | null;
|
||||
staking_supply_scale_factor?: Percent | null;
|
||||
sybil_resistance_percent?: Percent | null;
|
||||
}
|
||||
export interface RoleAssignment {
|
||||
nodes: number[];
|
||||
role: Role;
|
||||
export interface LayerAssignment {
|
||||
layer: Layer;
|
||||
mix_id: number;
|
||||
}
|
||||
export interface NodeCostParams {
|
||||
export interface MixNodeCostParams {
|
||||
interval_operating_cost: Coin;
|
||||
profit_margin_percent: Percent;
|
||||
}
|
||||
@@ -318,22 +291,32 @@ export interface GatewayConfigUpdate {
|
||||
mix_port: number;
|
||||
version: string;
|
||||
}
|
||||
export interface NymNode {
|
||||
custom_http_port?: number | null;
|
||||
host: string;
|
||||
identity_key: string;
|
||||
}
|
||||
export interface NodeConfigUpdate {
|
||||
custom_http_port?: number | null;
|
||||
host?: string | null;
|
||||
restore_default_http_port?: boolean;
|
||||
}
|
||||
export interface NodeRewardingParameters {
|
||||
performance: Percent;
|
||||
work_factor: Decimal;
|
||||
}
|
||||
export type QueryMsg = {
|
||||
admin: {};
|
||||
get_all_families_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_all_members_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_family_by_head: {
|
||||
head: string;
|
||||
};
|
||||
} | {
|
||||
get_family_by_label: {
|
||||
label: string;
|
||||
};
|
||||
} | {
|
||||
get_family_members_by_head: {
|
||||
head: string;
|
||||
};
|
||||
} | {
|
||||
get_family_members_by_label: {
|
||||
label: string;
|
||||
};
|
||||
} | {
|
||||
get_contract_version: {};
|
||||
} | {
|
||||
@@ -344,19 +327,17 @@ export type QueryMsg = {
|
||||
get_state_params: {};
|
||||
} | {
|
||||
get_state: {};
|
||||
} | {
|
||||
get_current_nym_node_version: {};
|
||||
} | {
|
||||
get_nym_node_version_history: {
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_rewarding_params: {};
|
||||
} | {
|
||||
get_epoch_status: {};
|
||||
} | {
|
||||
get_current_interval_details: {};
|
||||
} | {
|
||||
get_rewarded_set: {
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_mix_node_bonds: {
|
||||
limit?: number | null;
|
||||
@@ -408,6 +389,8 @@ export type QueryMsg = {
|
||||
get_bonded_mixnode_details_by_identity: {
|
||||
mix_identity: string;
|
||||
};
|
||||
} | {
|
||||
get_layer_distribution: {};
|
||||
} | {
|
||||
get_gateways: {
|
||||
limit?: number | null;
|
||||
@@ -422,71 +405,9 @@ export type QueryMsg = {
|
||||
address: string;
|
||||
};
|
||||
} | {
|
||||
get_preassigned_gateway_ids: {
|
||||
get_mixnode_delegations: {
|
||||
limit?: number | null;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_nym_node_bonds_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_nym_nodes_detailed_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_unbonded_nym_node: {
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
get_unbonded_nym_nodes_paged: {
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_unbonded_nym_nodes_by_owner_paged: {
|
||||
limit?: number | null;
|
||||
owner: string;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_unbonded_nym_nodes_by_identity_key_paged: {
|
||||
identity_key: string;
|
||||
limit?: number | null;
|
||||
start_after?: number | null;
|
||||
};
|
||||
} | {
|
||||
get_owned_nym_node: {
|
||||
address: string;
|
||||
};
|
||||
} | {
|
||||
get_nym_node_details: {
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
get_nym_node_details_by_identity_key: {
|
||||
node_identity: string;
|
||||
};
|
||||
} | {
|
||||
get_node_rewarding_details: {
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
get_node_stake_saturation: {
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
get_role_assignment: {
|
||||
role: Role;
|
||||
};
|
||||
} | {
|
||||
get_rewarded_set_metadata: {};
|
||||
} | {
|
||||
get_node_delegations: {
|
||||
limit?: number | null;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
start_after?: string | null;
|
||||
};
|
||||
} | {
|
||||
@@ -498,7 +419,7 @@ export type QueryMsg = {
|
||||
} | {
|
||||
get_delegation_details: {
|
||||
delegator: string;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
proxy?: string | null;
|
||||
};
|
||||
} | {
|
||||
@@ -511,27 +432,26 @@ export type QueryMsg = {
|
||||
address: string;
|
||||
};
|
||||
} | {
|
||||
get_pending_node_operator_reward: {
|
||||
node_id: number;
|
||||
get_pending_mix_node_operator_reward: {
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
get_pending_delegator_reward: {
|
||||
address: string;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
proxy?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_estimated_current_epoch_operator_reward: {
|
||||
estimated_performance: Percent;
|
||||
estimated_work?: Decimal | null;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
get_estimated_current_epoch_delegator_reward: {
|
||||
address: string;
|
||||
estimated_performance: Percent;
|
||||
estimated_work?: Decimal | null;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
proxy?: string | null;
|
||||
};
|
||||
} | {
|
||||
get_pending_epoch_events: {
|
||||
@@ -557,18 +477,10 @@ export type QueryMsg = {
|
||||
get_signing_nonce: {
|
||||
address: string;
|
||||
};
|
||||
} | {
|
||||
get_key_rotation_state: {};
|
||||
} | {
|
||||
get_key_rotation_id: {};
|
||||
};
|
||||
export interface MigrateMsg {
|
||||
unsafe_skip_state_updates?: boolean | null;
|
||||
vesting_contract_address?: string | null;
|
||||
}
|
||||
export interface AdminResponse {
|
||||
admin?: string | null;
|
||||
}
|
||||
export type Addr = string;
|
||||
export interface PagedAllDelegationsResponse {
|
||||
delegations: Delegation[];
|
||||
@@ -578,10 +490,23 @@ export interface Delegation {
|
||||
amount: Coin;
|
||||
cumulative_reward_ratio: Decimal;
|
||||
height: number;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
owner: Addr;
|
||||
proxy?: Addr | null;
|
||||
}
|
||||
export interface PagedFamiliesResponse {
|
||||
families: Family[];
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface Family {
|
||||
head: FamilyHead;
|
||||
label: string;
|
||||
proxy?: string | null;
|
||||
}
|
||||
export interface PagedMembersResponse {
|
||||
members: [string, FamilyHead][];
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface MixnodeDetailsByIdentityResponse {
|
||||
identity_key: string;
|
||||
mixnode_details?: MixNodeDetails | null;
|
||||
@@ -589,11 +514,12 @@ export interface MixnodeDetailsByIdentityResponse {
|
||||
export interface MixNodeDetails {
|
||||
bond_information: MixNodeBond;
|
||||
pending_changes?: PendingMixNodeChanges;
|
||||
rewarding_details: NodeRewarding;
|
||||
rewarding_details: MixNodeRewarding;
|
||||
}
|
||||
export interface MixNodeBond {
|
||||
bonding_height: number;
|
||||
is_unbonding: boolean;
|
||||
layer: Layer;
|
||||
mix_id: number;
|
||||
mix_node: MixNode;
|
||||
original_pledge: Coin;
|
||||
@@ -601,11 +527,10 @@ export interface MixNodeBond {
|
||||
proxy?: Addr | null;
|
||||
}
|
||||
export interface PendingMixNodeChanges {
|
||||
cost_params_change?: number | null;
|
||||
pledge_change?: number | null;
|
||||
}
|
||||
export interface NodeRewarding {
|
||||
cost_params: NodeCostParams;
|
||||
export interface MixNodeRewarding {
|
||||
cost_params: MixNodeCostParams;
|
||||
delegates: Decimal;
|
||||
last_rewarded_epoch: number;
|
||||
operator: Decimal;
|
||||
@@ -620,12 +545,9 @@ export interface ContractVersion {
|
||||
export interface ContractBuildInformation {
|
||||
build_timestamp: string;
|
||||
build_version: string;
|
||||
cargo_debug?: string;
|
||||
cargo_opt_level?: string;
|
||||
commit_branch: string;
|
||||
commit_sha: string;
|
||||
commit_timestamp: string;
|
||||
contract_name?: string;
|
||||
rustc_version: string;
|
||||
}
|
||||
export interface CurrentIntervalResponse {
|
||||
@@ -641,29 +563,11 @@ export interface Interval {
|
||||
epochs_in_interval: number;
|
||||
id: number;
|
||||
total_elapsed_epochs: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface CurrentNymNodeVersionResponse {
|
||||
version?: HistoricalNymNodeVersionEntry | null;
|
||||
}
|
||||
export interface HistoricalNymNodeVersionEntry {
|
||||
id: number;
|
||||
version_information: HistoricalNymNodeVersion;
|
||||
}
|
||||
export interface HistoricalNymNodeVersion {
|
||||
difference_since_genesis: TotalVersionDifference;
|
||||
introduced_at_height: number;
|
||||
semver: string;
|
||||
}
|
||||
export interface TotalVersionDifference {
|
||||
major: number;
|
||||
minor: number;
|
||||
patch: number;
|
||||
prerelease: number;
|
||||
}
|
||||
export interface NodeDelegationResponse {
|
||||
export interface MixNodeDelegationResponse {
|
||||
delegation?: Delegation | null;
|
||||
mixnode_still_bonded: boolean;
|
||||
node_still_bonded: boolean;
|
||||
}
|
||||
export interface PagedDelegatorDelegationsResponse {
|
||||
delegations: Delegation[];
|
||||
@@ -674,11 +578,7 @@ export type EpochState = "in_progress" | {
|
||||
final_node_id: number;
|
||||
last_rewarded: number;
|
||||
};
|
||||
} | "reconciling_events" | {
|
||||
role_assignment: {
|
||||
next: Role;
|
||||
};
|
||||
};
|
||||
} | "reconciling_events" | "advancing_epoch";
|
||||
export interface EpochStatus {
|
||||
being_advanced_by: Addr;
|
||||
state: EpochState;
|
||||
@@ -690,6 +590,22 @@ export interface EstimatedCurrentEpochRewardResponse {
|
||||
estimation?: Coin | null;
|
||||
original_stake?: Coin | null;
|
||||
}
|
||||
export interface FamilyByHeadResponse {
|
||||
family?: Family | null;
|
||||
head: FamilyHead;
|
||||
}
|
||||
export interface FamilyByLabelResponse {
|
||||
family?: Family | null;
|
||||
label: string;
|
||||
}
|
||||
export interface FamilyMembersByHeadResponse {
|
||||
head: FamilyHead;
|
||||
members: string[];
|
||||
}
|
||||
export interface FamilyMembersByLabelResponse {
|
||||
label: string;
|
||||
members: string[];
|
||||
}
|
||||
export interface GatewayBondResponse {
|
||||
gateway?: GatewayBond | null;
|
||||
identity: string;
|
||||
@@ -706,12 +622,10 @@ export interface PagedGatewayResponse {
|
||||
per_page: number;
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface KeyRotationIdResponse {
|
||||
rotation_id: number;
|
||||
}
|
||||
export interface KeyRotationState {
|
||||
initial_epoch_id: number;
|
||||
validity_epochs: number;
|
||||
export interface LayerDistribution {
|
||||
layer1: number;
|
||||
layer2: number;
|
||||
layer3: number;
|
||||
}
|
||||
export interface PagedMixnodeBondsResponse {
|
||||
nodes: MixNodeBond[];
|
||||
@@ -723,68 +637,22 @@ export interface PagedMixnodesDetailsResponse {
|
||||
per_page: number;
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface PagedMixNodeDelegationsResponse {
|
||||
delegations: Delegation[];
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface MixnodeDetailsResponse {
|
||||
mix_id: number;
|
||||
mixnode_details?: MixNodeDetails | null;
|
||||
}
|
||||
export interface MixnodeRewardingDetailsResponse {
|
||||
mix_id: number;
|
||||
rewarding_details?: NodeRewarding | null;
|
||||
}
|
||||
export interface PagedNodeDelegationsResponse {
|
||||
delegations: Delegation[];
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface NodeRewardingDetailsResponse {
|
||||
node_id: number;
|
||||
rewarding_details?: NodeRewarding | null;
|
||||
}
|
||||
export interface StakeSaturationResponse {
|
||||
current_saturation?: Decimal | null;
|
||||
node_id: number;
|
||||
uncapped_saturation?: Decimal | null;
|
||||
rewarding_details?: MixNodeRewarding | null;
|
||||
}
|
||||
export interface NumberOfPendingEventsResponse {
|
||||
epoch_events: number;
|
||||
interval_events: number;
|
||||
}
|
||||
export interface PagedNymNodeBondsResponse {
|
||||
nodes: NymNodeBond[];
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface NymNodeBond {
|
||||
bonding_height: number;
|
||||
is_unbonding: boolean;
|
||||
node: NymNode;
|
||||
node_id: number;
|
||||
original_pledge: Coin;
|
||||
owner: Addr;
|
||||
}
|
||||
export interface NodeDetailsResponse {
|
||||
details?: NymNodeDetails | null;
|
||||
node_id: number;
|
||||
}
|
||||
export interface NymNodeDetails {
|
||||
bond_information: NymNodeBond;
|
||||
pending_changes: PendingNodeChanges;
|
||||
rewarding_details: NodeRewarding;
|
||||
}
|
||||
export interface PendingNodeChanges {
|
||||
cost_params_change?: number | null;
|
||||
pledge_change?: number | null;
|
||||
}
|
||||
export interface NodeDetailsByIdentityResponse {
|
||||
details?: NymNodeDetails | null;
|
||||
identity_key: string;
|
||||
}
|
||||
export interface NymNodeVersionHistoryResponse {
|
||||
history: HistoricalNymNodeVersionEntry[];
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface PagedNymNodeDetailsResponse {
|
||||
nodes: NymNodeDetails[];
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface GatewayOwnershipResponse {
|
||||
address: Addr;
|
||||
gateway?: GatewayBond | null;
|
||||
@@ -793,47 +661,32 @@ export interface MixOwnershipResponse {
|
||||
address: Addr;
|
||||
mixnode_details?: MixNodeDetails | null;
|
||||
}
|
||||
export interface NodeOwnershipResponse {
|
||||
address: Addr;
|
||||
details?: NymNodeDetails | null;
|
||||
}
|
||||
export interface PendingRewardResponse {
|
||||
amount_earned?: Coin | null;
|
||||
amount_earned_detailed?: Decimal | null;
|
||||
amount_staked?: Coin | null;
|
||||
mixnode_still_fully_bonded: boolean;
|
||||
node_still_fully_bonded: boolean;
|
||||
}
|
||||
export type PendingEpochEventKind = {
|
||||
delegate: {
|
||||
amount: Coin;
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
owner: Addr;
|
||||
proxy?: Addr | null;
|
||||
};
|
||||
} | {
|
||||
undelegate: {
|
||||
node_id: number;
|
||||
mix_id: number;
|
||||
owner: Addr;
|
||||
proxy?: Addr | null;
|
||||
};
|
||||
} | {
|
||||
nym_node_pledge_more: {
|
||||
amount: Coin;
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
mixnode_pledge_more: {
|
||||
pledge_more: {
|
||||
amount: Coin;
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
nym_node_decrease_pledge: {
|
||||
decrease_by: Coin;
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
mixnode_decrease_pledge: {
|
||||
decrease_pledge: {
|
||||
decrease_by: Coin;
|
||||
mix_id: number;
|
||||
};
|
||||
@@ -842,12 +695,8 @@ export type PendingEpochEventKind = {
|
||||
mix_id: number;
|
||||
};
|
||||
} | {
|
||||
unbond_nym_node: {
|
||||
node_id: number;
|
||||
};
|
||||
} | {
|
||||
update_active_set: {
|
||||
update: ActiveSetUpdate;
|
||||
update_active_set_size: {
|
||||
new_size: number;
|
||||
};
|
||||
};
|
||||
export interface PendingEpochEventResponse {
|
||||
@@ -870,12 +719,7 @@ export interface PendingEpochEvent {
|
||||
export type PendingIntervalEventKind = {
|
||||
change_mix_cost_params: {
|
||||
mix_id: number;
|
||||
new_costs: NodeCostParams;
|
||||
};
|
||||
} | {
|
||||
change_nym_node_cost_params: {
|
||||
new_costs: NodeCostParams;
|
||||
node_id: number;
|
||||
new_costs: MixNodeCostParams;
|
||||
};
|
||||
} | {
|
||||
update_rewarding_params: {
|
||||
@@ -904,34 +748,15 @@ export interface PendingIntervalEvent {
|
||||
event: PendingIntervalEventData;
|
||||
id: number;
|
||||
}
|
||||
export interface PreassignedGatewayIdsResponse {
|
||||
ids: PreassignedId[];
|
||||
start_next_after?: string | null;
|
||||
}
|
||||
export interface PreassignedId {
|
||||
identity: string;
|
||||
node_id: number;
|
||||
}
|
||||
export interface RolesMetadataResponse {
|
||||
metadata: RewardedSetMetadata;
|
||||
}
|
||||
export interface RewardedSetMetadata {
|
||||
entry_gateway_metadata: RoleMetadata;
|
||||
epoch_id: number;
|
||||
exit_gateway_metadata: RoleMetadata;
|
||||
fully_assigned: boolean;
|
||||
layer1_metadata: RoleMetadata;
|
||||
layer2_metadata: RoleMetadata;
|
||||
layer3_metadata: RoleMetadata;
|
||||
standby_metadata: RoleMetadata;
|
||||
}
|
||||
export interface RoleMetadata {
|
||||
highest_id: number;
|
||||
num_nodes: number;
|
||||
export type RewardedSetNodeStatus = "active" | "standby";
|
||||
export interface PagedRewardedSetResponse {
|
||||
nodes: [number, RewardedSetNodeStatus][];
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface RewardingParams {
|
||||
active_set_size: number;
|
||||
interval: IntervalRewardParams;
|
||||
rewarded_set: RewardedSetParams;
|
||||
rewarded_set_size: number;
|
||||
}
|
||||
export interface IntervalRewardParams {
|
||||
active_set_work_factor: Decimal;
|
||||
@@ -944,37 +769,19 @@ export interface IntervalRewardParams {
|
||||
sybil_resistance: Percent;
|
||||
}
|
||||
export type String = string;
|
||||
export interface EpochAssignmentResponse {
|
||||
epoch_id: number;
|
||||
nodes: number[];
|
||||
}
|
||||
export type Uint32 = number;
|
||||
export interface MixStakeSaturationResponse {
|
||||
export interface StakeSaturationResponse {
|
||||
current_saturation?: Decimal | null;
|
||||
mix_id: number;
|
||||
uncapped_saturation?: Decimal | null;
|
||||
}
|
||||
export interface ContractState {
|
||||
owner?: Addr | null;
|
||||
owner: Addr;
|
||||
params: ContractStateParams;
|
||||
rewarding_denom: string;
|
||||
rewarding_validator_address: Addr;
|
||||
vesting_contract_address: Addr;
|
||||
}
|
||||
export interface ContractStateParams {
|
||||
config_score_params: ConfigScoreParams;
|
||||
delegations_params: DelegationsParams;
|
||||
operators_params: OperatorsParams;
|
||||
}
|
||||
export interface ConfigScoreParams {
|
||||
version_score_formula_params: VersionScoreFormulaParams;
|
||||
version_weights: OutdatedVersionWeights;
|
||||
}
|
||||
export interface OperatorsParams {
|
||||
interval_operating_cost: RangedValueForUint128;
|
||||
minimum_pledge: Coin;
|
||||
profit_margin: RangedValueForPercent;
|
||||
}
|
||||
export interface UnbondedMixnodeResponse {
|
||||
mix_id: number;
|
||||
unbonded_info?: UnbondedMixnode | null;
|
||||
@@ -990,17 +797,3 @@ export interface PagedUnbondedMixnodesResponse {
|
||||
per_page: number;
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
export interface UnbondedNodeResponse {
|
||||
details?: UnbondedNymNode | null;
|
||||
node_id: number;
|
||||
}
|
||||
export interface UnbondedNymNode {
|
||||
identity_key: string;
|
||||
node_id: number;
|
||||
owner: Addr;
|
||||
unbonding_height: number;
|
||||
}
|
||||
export interface PagedUnbondedNymNodesResponse {
|
||||
nodes: UnbondedNymNode[];
|
||||
start_next_after?: number | null;
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
import { ICosmWasmClient, ISigningCosmWasmClient } from "./baseClient";
|
||||
import { StdFee } from "@interchainjs/types";
|
||||
import { InstantiateMsg, ExecuteMsg, Uint128, Percent, Decimal, PledgeCap, MessageSignature, Coin, NodeCostParams, MixNodeConfigUpdate, VestingSpecification, MixNode, Gateway, GatewayConfigUpdate, QueryMsg, Timestamp, Uint64, MigrateMsg, Addr, Account, VestingPeriod, AccountsResponse, BaseVestingAccountInfo, VestingCoinsResponse, AccountVestingCoins, AllDelegationsResponse, VestingDelegation, ContractVersion, ContractBuildInformation, Period, DelegationTimesResponse, NullablePledgeData, PledgeData, OriginalVestingResponse } from "./Vesting.types";
|
||||
import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate";
|
||||
import { StdFee } from "@cosmjs/amino";
|
||||
import { InstantiateMsg, ExecuteMsg, FamilyHead, MessageSignature, Uint128, Percent, Decimal, PledgeCap, Coin, MixNodeCostParams, MixNodeConfigUpdate, VestingSpecification, MixNode, Gateway, GatewayConfigUpdate, QueryMsg, Timestamp, Uint64, MigrateMsg, Addr, Account, VestingPeriod, AccountsResponse, BaseVestingAccountInfo, VestingCoinsResponse, AccountVestingCoins, AllDelegationsResponse, VestingDelegation, ContractVersion, ContractBuildInformation, Period, DelegationTimesResponse, NullablePledgeData, PledgeData, OriginalVestingResponse } from "./Vesting.types";
|
||||
import { GetCw2ContractVersionResponse } from './types';
|
||||
export interface VestingReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
getContractVersion: () => Promise<ContractBuildInformation>;
|
||||
@@ -155,9 +156,10 @@ export interface VestingReadOnlyInterface {
|
||||
}) => Promise<AllDelegationsResponse>;
|
||||
}
|
||||
export class VestingQueryClient implements VestingReadOnlyInterface {
|
||||
client: ICosmWasmClient;
|
||||
client: CosmWasmClient;
|
||||
contractAddress: string;
|
||||
constructor(client: ICosmWasmClient, contractAddress: string) {
|
||||
|
||||
constructor(client: CosmWasmClient, contractAddress: string) {
|
||||
this.client = client;
|
||||
this.contractAddress = contractAddress;
|
||||
this.getContractVersion = this.getContractVersion.bind(this);
|
||||
@@ -187,6 +189,7 @@ export class VestingQueryClient implements VestingReadOnlyInterface {
|
||||
this.getDelegationTimes = this.getDelegationTimes.bind(this);
|
||||
this.getAllDelegations = this.getAllDelegations.bind(this);
|
||||
}
|
||||
|
||||
getContractVersion = async (): Promise<ContractBuildInformation> => {
|
||||
return this.client.queryContractSmart(this.contractAddress, {
|
||||
get_contract_version: {}
|
||||
@@ -498,34 +501,56 @@ export class VestingQueryClient implements VestingReadOnlyInterface {
|
||||
export interface VestingInterface extends VestingReadOnlyInterface {
|
||||
contractAddress: string;
|
||||
sender: string;
|
||||
createFamily: ({
|
||||
label
|
||||
}: {
|
||||
label: string;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
joinFamily: ({
|
||||
familyHead,
|
||||
joinPermit
|
||||
}: {
|
||||
familyHead: FamilyHead;
|
||||
joinPermit: MessageSignature;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
leaveFamily: ({
|
||||
familyHead
|
||||
}: {
|
||||
familyHead: FamilyHead;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
kickFamilyMember: ({
|
||||
member
|
||||
}: {
|
||||
member: string;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
trackReward: ({
|
||||
address,
|
||||
amount
|
||||
}: {
|
||||
address: string;
|
||||
amount: Coin;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
claimOperatorReward: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
claimOperatorReward: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
claimDelegatorReward: ({
|
||||
mixId
|
||||
}: {
|
||||
mixId: number;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateMixnodeCostParams: ({
|
||||
newCosts
|
||||
}: {
|
||||
newCosts: NodeCostParams;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
newCosts: MixNodeCostParams;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateMixnodeConfig: ({
|
||||
newConfig
|
||||
}: {
|
||||
newConfig: MixNodeConfigUpdate;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateMixnetAddress: ({
|
||||
address
|
||||
}: {
|
||||
address: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
delegateToMixnode: ({
|
||||
amount,
|
||||
mixId,
|
||||
@@ -534,14 +559,14 @@ export interface VestingInterface extends VestingReadOnlyInterface {
|
||||
amount: Coin;
|
||||
mixId: number;
|
||||
onBehalfOf?: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
undelegateFromMixnode: ({
|
||||
mixId,
|
||||
onBehalfOf
|
||||
}: {
|
||||
mixId: number;
|
||||
onBehalfOf?: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
createAccount: ({
|
||||
cap,
|
||||
ownerAddress,
|
||||
@@ -552,12 +577,12 @@ export interface VestingInterface extends VestingReadOnlyInterface {
|
||||
ownerAddress: string;
|
||||
stakingAddress?: string;
|
||||
vestingSpec?: VestingSpecification;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
withdrawVestedCoins: ({
|
||||
amount
|
||||
}: {
|
||||
amount: Coin;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
trackUndelegation: ({
|
||||
amount,
|
||||
mixId,
|
||||
@@ -566,7 +591,7 @@ export interface VestingInterface extends VestingReadOnlyInterface {
|
||||
amount: Coin;
|
||||
mixId: number;
|
||||
owner: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
bondMixnode: ({
|
||||
amount,
|
||||
costParams,
|
||||
@@ -574,35 +599,35 @@ export interface VestingInterface extends VestingReadOnlyInterface {
|
||||
ownerSignature
|
||||
}: {
|
||||
amount: Coin;
|
||||
costParams: NodeCostParams;
|
||||
costParams: MixNodeCostParams;
|
||||
mixNode: MixNode;
|
||||
ownerSignature: MessageSignature;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
pledgeMore: ({
|
||||
amount
|
||||
}: {
|
||||
amount: Coin;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
decreasePledge: ({
|
||||
amount
|
||||
}: {
|
||||
amount: Coin;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
unbondMixnode: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
unbondMixnode: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
trackUnbondMixnode: ({
|
||||
amount,
|
||||
owner
|
||||
}: {
|
||||
amount: Coin;
|
||||
owner: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
trackDecreasePledge: ({
|
||||
amount,
|
||||
owner
|
||||
}: {
|
||||
amount: Coin;
|
||||
owner: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
bondGateway: ({
|
||||
amount,
|
||||
gateway,
|
||||
@@ -611,59 +636,52 @@ export interface VestingInterface extends VestingReadOnlyInterface {
|
||||
amount: Coin;
|
||||
gateway: Gateway;
|
||||
ownerSignature: MessageSignature;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
unbondGateway: (fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
unbondGateway: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
trackUnbondGateway: ({
|
||||
amount,
|
||||
owner
|
||||
}: {
|
||||
amount: Coin;
|
||||
owner: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateGatewayConfig: ({
|
||||
newConfig
|
||||
}: {
|
||||
newConfig: GatewayConfigUpdate;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
transferOwnership: ({
|
||||
toAddress
|
||||
}: {
|
||||
toAddress: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateStakingAddress: ({
|
||||
toAddress
|
||||
}: {
|
||||
toAddress?: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
updateLockedPledgeCap: ({
|
||||
address,
|
||||
cap
|
||||
}: {
|
||||
address: string;
|
||||
cap: PledgeCap;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
trackMigratedMixnode: ({
|
||||
owner
|
||||
}: {
|
||||
owner: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
trackMigratedDelegation: ({
|
||||
mixId,
|
||||
owner
|
||||
}: {
|
||||
mixId: number;
|
||||
owner: string;
|
||||
}, fee_?: number | StdFee | "auto", memo_?: string, funds_?: Coin[]) => Promise<any>;
|
||||
}, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise<ExecuteResult>;
|
||||
}
|
||||
export class VestingClient extends VestingQueryClient implements VestingInterface {
|
||||
client: ISigningCosmWasmClient;
|
||||
client: SigningCosmWasmClient;
|
||||
sender: string;
|
||||
contractAddress: string;
|
||||
constructor(client: ISigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
|
||||
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
||||
super(client, contractAddress);
|
||||
this.client = client;
|
||||
this.sender = sender;
|
||||
this.contractAddress = contractAddress;
|
||||
this.createFamily = this.createFamily.bind(this);
|
||||
this.joinFamily = this.joinFamily.bind(this);
|
||||
this.leaveFamily = this.leaveFamily.bind(this);
|
||||
this.kickFamilyMember = this.kickFamilyMember.bind(this);
|
||||
this.trackReward = this.trackReward.bind(this);
|
||||
this.claimOperatorReward = this.claimOperatorReward.bind(this);
|
||||
this.claimDelegatorReward = this.claimDelegatorReward.bind(this);
|
||||
@@ -688,71 +706,117 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
this.transferOwnership = this.transferOwnership.bind(this);
|
||||
this.updateStakingAddress = this.updateStakingAddress.bind(this);
|
||||
this.updateLockedPledgeCap = this.updateLockedPledgeCap.bind(this);
|
||||
this.trackMigratedMixnode = this.trackMigratedMixnode.bind(this);
|
||||
this.trackMigratedDelegation = this.trackMigratedDelegation.bind(this);
|
||||
}
|
||||
|
||||
createFamily = async ({
|
||||
label
|
||||
}: {
|
||||
label: string;
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
create_family: {
|
||||
label
|
||||
}
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
joinFamily = async ({
|
||||
familyHead,
|
||||
joinPermit
|
||||
}: {
|
||||
familyHead: FamilyHead;
|
||||
joinPermit: MessageSignature;
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
join_family: {
|
||||
family_head: familyHead,
|
||||
join_permit: joinPermit
|
||||
}
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
leaveFamily = async ({
|
||||
familyHead
|
||||
}: {
|
||||
familyHead: FamilyHead;
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
leave_family: {
|
||||
family_head: familyHead
|
||||
}
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
kickFamilyMember = async ({
|
||||
member
|
||||
}: {
|
||||
member: string;
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
kick_family_member: {
|
||||
member
|
||||
}
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
trackReward = async ({
|
||||
address,
|
||||
amount
|
||||
}: {
|
||||
address: string;
|
||||
amount: Coin;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_reward: {
|
||||
address,
|
||||
amount
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
claimOperatorReward = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
claimOperatorReward = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
claim_operator_reward: {}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
claimDelegatorReward = async ({
|
||||
mixId
|
||||
}: {
|
||||
mixId: number;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
claim_delegator_reward: {
|
||||
mix_id: mixId
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateMixnodeCostParams = async ({
|
||||
newCosts
|
||||
}: {
|
||||
newCosts: NodeCostParams;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
newCosts: MixNodeCostParams;
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_mixnode_cost_params: {
|
||||
new_costs: newCosts
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateMixnodeConfig = async ({
|
||||
newConfig
|
||||
}: {
|
||||
newConfig: MixNodeConfigUpdate;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_mixnode_config: {
|
||||
new_config: newConfig
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateMixnetAddress = async ({
|
||||
address
|
||||
}: {
|
||||
address: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_mixnet_address: {
|
||||
address
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
delegateToMixnode = async ({
|
||||
amount,
|
||||
@@ -762,14 +826,14 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
amount: Coin;
|
||||
mixId: number;
|
||||
onBehalfOf?: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
delegate_to_mixnode: {
|
||||
amount,
|
||||
mix_id: mixId,
|
||||
on_behalf_of: onBehalfOf
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
undelegateFromMixnode = async ({
|
||||
mixId,
|
||||
@@ -777,13 +841,13 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
}: {
|
||||
mixId: number;
|
||||
onBehalfOf?: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
undelegate_from_mixnode: {
|
||||
mix_id: mixId,
|
||||
on_behalf_of: onBehalfOf
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
createAccount = async ({
|
||||
cap,
|
||||
@@ -795,7 +859,7 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
ownerAddress: string;
|
||||
stakingAddress?: string;
|
||||
vestingSpec?: VestingSpecification;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
create_account: {
|
||||
cap,
|
||||
@@ -803,18 +867,18 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
staking_address: stakingAddress,
|
||||
vesting_spec: vestingSpec
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
withdrawVestedCoins = async ({
|
||||
amount
|
||||
}: {
|
||||
amount: Coin;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
withdraw_vested_coins: {
|
||||
amount
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
trackUndelegation = async ({
|
||||
amount,
|
||||
@@ -824,14 +888,14 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
amount: Coin;
|
||||
mixId: number;
|
||||
owner: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_undelegation: {
|
||||
amount,
|
||||
mix_id: mixId,
|
||||
owner
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
bondMixnode = async ({
|
||||
amount,
|
||||
@@ -840,10 +904,10 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
ownerSignature
|
||||
}: {
|
||||
amount: Coin;
|
||||
costParams: NodeCostParams;
|
||||
costParams: MixNodeCostParams;
|
||||
mixNode: MixNode;
|
||||
ownerSignature: MessageSignature;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
bond_mixnode: {
|
||||
amount,
|
||||
@@ -851,34 +915,34 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
mix_node: mixNode,
|
||||
owner_signature: ownerSignature
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
pledgeMore = async ({
|
||||
amount
|
||||
}: {
|
||||
amount: Coin;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
pledge_more: {
|
||||
amount
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
decreasePledge = async ({
|
||||
amount
|
||||
}: {
|
||||
amount: Coin;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
decrease_pledge: {
|
||||
amount
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
unbondMixnode = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
unbondMixnode = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
unbond_mixnode: {}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
trackUnbondMixnode = async ({
|
||||
amount,
|
||||
@@ -886,13 +950,13 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
}: {
|
||||
amount: Coin;
|
||||
owner: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_unbond_mixnode: {
|
||||
amount,
|
||||
owner
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
trackDecreasePledge = async ({
|
||||
amount,
|
||||
@@ -900,13 +964,13 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
}: {
|
||||
amount: Coin;
|
||||
owner: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_decrease_pledge: {
|
||||
amount,
|
||||
owner
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
bondGateway = async ({
|
||||
amount,
|
||||
@@ -916,19 +980,19 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
amount: Coin;
|
||||
gateway: Gateway;
|
||||
ownerSignature: MessageSignature;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
bond_gateway: {
|
||||
amount,
|
||||
gateway,
|
||||
owner_signature: ownerSignature
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
unbondGateway = async (fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
unbondGateway = async (fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
unbond_gateway: {}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
trackUnbondGateway = async ({
|
||||
amount,
|
||||
@@ -936,46 +1000,46 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
}: {
|
||||
amount: Coin;
|
||||
owner: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_unbond_gateway: {
|
||||
amount,
|
||||
owner
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateGatewayConfig = async ({
|
||||
newConfig
|
||||
}: {
|
||||
newConfig: GatewayConfigUpdate;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_gateway_config: {
|
||||
new_config: newConfig
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
transferOwnership = async ({
|
||||
toAddress
|
||||
}: {
|
||||
toAddress: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
transfer_ownership: {
|
||||
to_address: toAddress
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateStakingAddress = async ({
|
||||
toAddress
|
||||
}: {
|
||||
toAddress?: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_staking_address: {
|
||||
to_address: toAddress
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
updateLockedPledgeCap = async ({
|
||||
address,
|
||||
@@ -983,37 +1047,12 @@ export class VestingClient extends VestingQueryClient implements VestingInterfac
|
||||
}: {
|
||||
address: string;
|
||||
cap: PledgeCap;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
}, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise<ExecuteResult> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
update_locked_pledge_cap: {
|
||||
address,
|
||||
cap
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
}, fee, memo, _funds);
|
||||
};
|
||||
trackMigratedMixnode = async ({
|
||||
owner
|
||||
}: {
|
||||
owner: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_migrated_mixnode: {
|
||||
owner
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
trackMigratedDelegation = async ({
|
||||
mixId,
|
||||
owner
|
||||
}: {
|
||||
mixId: number;
|
||||
owner: string;
|
||||
}, fee_: number | StdFee | "auto" = "auto", memo_?: string, funds_?: Coin[]): Promise<any> => {
|
||||
return await this.client.execute(this.sender, this.contractAddress, {
|
||||
track_migrated_delegation: {
|
||||
mix_id: mixId,
|
||||
owner
|
||||
}
|
||||
}, fee_, memo_, funds_);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
@@ -9,6 +9,23 @@ export interface InstantiateMsg {
|
||||
mixnet_contract_address: string;
|
||||
}
|
||||
export type ExecuteMsg = {
|
||||
create_family: {
|
||||
label: string;
|
||||
};
|
||||
} | {
|
||||
join_family: {
|
||||
family_head: FamilyHead;
|
||||
join_permit: MessageSignature;
|
||||
};
|
||||
} | {
|
||||
leave_family: {
|
||||
family_head: FamilyHead;
|
||||
};
|
||||
} | {
|
||||
kick_family_member: {
|
||||
member: string;
|
||||
};
|
||||
} | {
|
||||
track_reward: {
|
||||
address: string;
|
||||
amount: Coin;
|
||||
@@ -21,7 +38,7 @@ export type ExecuteMsg = {
|
||||
};
|
||||
} | {
|
||||
update_mixnode_cost_params: {
|
||||
new_costs: NodeCostParams;
|
||||
new_costs: MixNodeCostParams;
|
||||
};
|
||||
} | {
|
||||
update_mixnode_config: {
|
||||
@@ -62,7 +79,7 @@ export type ExecuteMsg = {
|
||||
} | {
|
||||
bond_mixnode: {
|
||||
amount: Coin;
|
||||
cost_params: NodeCostParams;
|
||||
cost_params: MixNodeCostParams;
|
||||
mix_node: MixNode;
|
||||
owner_signature: MessageSignature;
|
||||
};
|
||||
@@ -116,16 +133,9 @@ export type ExecuteMsg = {
|
||||
address: string;
|
||||
cap: PledgeCap;
|
||||
};
|
||||
} | {
|
||||
track_migrated_mixnode: {
|
||||
owner: string;
|
||||
};
|
||||
} | {
|
||||
track_migrated_delegation: {
|
||||
mix_id: number;
|
||||
owner: string;
|
||||
};
|
||||
};
|
||||
export type FamilyHead = string;
|
||||
export type MessageSignature = number[];
|
||||
export type Uint128 = string;
|
||||
export type Percent = Decimal;
|
||||
export type Decimal = string;
|
||||
@@ -134,12 +144,12 @@ export type PledgeCap = {
|
||||
} | {
|
||||
absolute: Uint128;
|
||||
};
|
||||
export type MessageSignature = number[];
|
||||
export interface Coin {
|
||||
amount: Uint128;
|
||||
denom: string;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface NodeCostParams {
|
||||
export interface MixNodeCostParams {
|
||||
interval_operating_cost: Coin;
|
||||
profit_margin_percent: Percent;
|
||||
}
|
||||
@@ -343,12 +353,9 @@ export interface ContractVersion {
|
||||
export interface ContractBuildInformation {
|
||||
build_timestamp: string;
|
||||
build_version: string;
|
||||
cargo_debug?: string;
|
||||
cargo_opt_level?: string;
|
||||
commit_branch: string;
|
||||
commit_sha: string;
|
||||
commit_timestamp: string;
|
||||
contract_name?: string;
|
||||
rustc_version: string;
|
||||
}
|
||||
export type Period = "before" | {
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
|
||||
import { StdFee, Coin } from '@interchainjs/types';
|
||||
import { DirectSigner } from '@interchainjs/cosmos';
|
||||
import { getSmartContractState } from 'interchainjs/cosmwasm/wasm/v1/query.rpc.func';
|
||||
import { executeContract } from 'interchainjs/cosmwasm/wasm/v1/tx.rpc.func';
|
||||
import { QuerySmartContractStateRequest, QuerySmartContractStateResponse } from 'interchainjs/cosmwasm/wasm/v1/query';
|
||||
import { MsgExecuteContract } from 'interchainjs/cosmwasm/wasm/v1/tx';
|
||||
import { Chain } from '@chain-registry/v2-types';
|
||||
|
||||
// Encoding utility functions
|
||||
const fromUint8Array = <T>(uint8Array: Uint8Array): T => {
|
||||
const text = new TextDecoder().decode(uint8Array);
|
||||
return JSON.parse(text);
|
||||
};
|
||||
|
||||
const toUint8Array = (obj: any): Uint8Array => {
|
||||
const text = JSON.stringify(obj);
|
||||
return new TextEncoder().encode(text);
|
||||
};
|
||||
|
||||
// Chain registry configuration
|
||||
// The amount under gasPrice represents gas price per unit
|
||||
export interface ChainConfig {
|
||||
chain?: Chain;
|
||||
gasPrice?: {
|
||||
denom: string;
|
||||
amount: string;
|
||||
};
|
||||
}
|
||||
|
||||
// Gas fee calculation utilities
|
||||
export const calculateGasFromChain = (chain: Chain, gasAmount: string): StdFee => {
|
||||
try {
|
||||
const feeTokens = chain.fees?.feeTokens;
|
||||
|
||||
if (feeTokens && feeTokens.length > 0) {
|
||||
const primaryToken = feeTokens[0];
|
||||
// v2 chain-registry uses camelCase: averageGasPrice, lowGasPrice, fixedMinGasPrice
|
||||
const gasPrice = primaryToken.averageGasPrice || primaryToken.lowGasPrice || primaryToken.fixedMinGasPrice || 0.025;
|
||||
const gasAmountNum = parseInt(gasAmount);
|
||||
const feeAmount = Math.ceil(gasAmountNum * gasPrice).toString();
|
||||
|
||||
return {
|
||||
amount: [{
|
||||
denom: primaryToken.denom,
|
||||
amount: feeAmount
|
||||
}],
|
||||
gas: gasAmount
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to calculate gas from chain registry:', error);
|
||||
}
|
||||
|
||||
// Fallback to default
|
||||
return { amount: [], gas: gasAmount };
|
||||
};
|
||||
|
||||
// Default gas amount - users can easily change this
|
||||
export let DEFAULT_GAS_AMOUNT = '200000';
|
||||
|
||||
// Allow users to set their preferred default gas amount
|
||||
export const setDefaultGasAmount = (gasAmount: string): void => {
|
||||
DEFAULT_GAS_AMOUNT = gasAmount;
|
||||
};
|
||||
|
||||
// Get current default gas amount
|
||||
export const getDefaultGasAmount = (): string => DEFAULT_GAS_AMOUNT;
|
||||
|
||||
export const getAutoGasFee = (chainConfig?: ChainConfig): StdFee => {
|
||||
const gasAmount = DEFAULT_GAS_AMOUNT;
|
||||
|
||||
if (chainConfig?.chain) {
|
||||
return calculateGasFromChain(chainConfig.chain, gasAmount);
|
||||
}
|
||||
|
||||
if (chainConfig?.gasPrice) {
|
||||
const gasAmountNum = parseInt(gasAmount);
|
||||
const gasPriceNum = parseFloat(chainConfig.gasPrice.amount);
|
||||
const feeAmount = Math.ceil(gasAmountNum * gasPriceNum).toString();
|
||||
|
||||
return {
|
||||
amount: [{
|
||||
denom: chainConfig.gasPrice.denom,
|
||||
amount: feeAmount
|
||||
}],
|
||||
gas: gasAmount
|
||||
};
|
||||
}
|
||||
|
||||
// Fallback: no fee tokens, just gas amount
|
||||
return { amount: [], gas: gasAmount };
|
||||
};
|
||||
|
||||
// InterchainJS interfaces for CosmWasm clients
|
||||
export interface ICosmWasmClient {
|
||||
queryContractSmart(contractAddr: string, query: any): Promise<any>;
|
||||
}
|
||||
|
||||
export interface ISigningCosmWasmClient extends ICosmWasmClient {
|
||||
execute(
|
||||
sender: string,
|
||||
contractAddress: string,
|
||||
msg: any,
|
||||
fee?: number | StdFee | "auto",
|
||||
memo?: string,
|
||||
funds?: Coin[],
|
||||
chainConfig?: ChainConfig
|
||||
): Promise<any>;
|
||||
}
|
||||
|
||||
export interface ISigningClient {
|
||||
signAndBroadcast(
|
||||
signerAddress: string,
|
||||
messages: any[],
|
||||
fee: number | StdFee | "auto",
|
||||
memo?: string
|
||||
): Promise<any>;
|
||||
}
|
||||
|
||||
// Helper functions to create InterchainJS clients
|
||||
export function getCosmWasmClient(rpcEndpoint: string): ICosmWasmClient {
|
||||
return {
|
||||
queryContractSmart: async (contractAddr: string, query: any) => {
|
||||
// Create the request object
|
||||
const request: QuerySmartContractStateRequest = {
|
||||
address: contractAddr,
|
||||
queryData: toUint8Array(query)
|
||||
};
|
||||
|
||||
// Execute the query using InterchainJS
|
||||
const response: QuerySmartContractStateResponse = await getSmartContractState(rpcEndpoint, request);
|
||||
|
||||
// Parse and return the result
|
||||
return fromUint8Array(response.data);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function getSigningCosmWasmClient(signingClient: DirectSigner, rpcEndpoint?: string): ISigningCosmWasmClient {
|
||||
return {
|
||||
queryContractSmart: async (contractAddr: string, query: any) => {
|
||||
if (!rpcEndpoint) {
|
||||
throw new Error('rpcEndpoint is required for queryContractSmart in signing client');
|
||||
}
|
||||
const request: QuerySmartContractStateRequest = {
|
||||
address: contractAddr,
|
||||
queryData: toUint8Array(query)
|
||||
};
|
||||
const response: QuerySmartContractStateResponse = await getSmartContractState(rpcEndpoint, request);
|
||||
return fromUint8Array(response.data);
|
||||
},
|
||||
execute: async (
|
||||
sender: string,
|
||||
contractAddress: string,
|
||||
msg: any,
|
||||
fee?: number | StdFee | "auto",
|
||||
memo?: string,
|
||||
funds?: Coin[],
|
||||
chainConfig?: ChainConfig
|
||||
) => {
|
||||
// Handle fee conversion
|
||||
let finalFee: StdFee;
|
||||
if (typeof fee === 'number') {
|
||||
finalFee = { amount: [], gas: fee.toString() };
|
||||
} else if (fee === 'auto') {
|
||||
finalFee = getAutoGasFee(chainConfig);
|
||||
} else if (fee) {
|
||||
finalFee = fee;
|
||||
} else {
|
||||
finalFee = getAutoGasFee(chainConfig);
|
||||
}
|
||||
|
||||
// Create the message object
|
||||
const message: MsgExecuteContract = {
|
||||
sender,
|
||||
contract: contractAddress,
|
||||
msg: toUint8Array(msg),
|
||||
funds: funds || []
|
||||
};
|
||||
|
||||
// Execute the transaction using InterchainJS
|
||||
const result = await executeContract(
|
||||
signingClient as any,
|
||||
sender,
|
||||
message,
|
||||
finalFee,
|
||||
memo || ''
|
||||
);
|
||||
|
||||
return result;
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,48 +1,35 @@
|
||||
/**
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@1.13.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
* This file was automatically generated by @cosmwasm/ts-codegen@0.35.3.
|
||||
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||
* and run the @cosmwasm/ts-codegen generate command to regenerate this file.
|
||||
*/
|
||||
|
||||
import * as _0 from "./Ecash.types";
|
||||
import * as _1 from "./Ecash.client";
|
||||
import * as _2 from "./CoconutDkg.types";
|
||||
import * as _3 from "./CoconutDkg.client";
|
||||
import * as _4 from "./Mixnet.types";
|
||||
import * as _5 from "./Mixnet.client";
|
||||
import * as _6 from "./Cw3FlexMultisig.types";
|
||||
import * as _7 from "./Cw3FlexMultisig.client";
|
||||
import * as _8 from "./Cw4Group.types";
|
||||
import * as _9 from "./Cw4Group.client";
|
||||
import * as _10 from "./Vesting.types";
|
||||
import * as _11 from "./Vesting.client";
|
||||
import * as _12 from "./baseClient";
|
||||
import * as _0 from './CoconutBandwidth.types';
|
||||
import * as _1 from './CoconutBandwidth.client';
|
||||
import * as _2 from './CoconutDkg.types';
|
||||
import * as _3 from './CoconutDkg.client';
|
||||
import * as _4 from './Mixnet.types';
|
||||
import * as _5 from './Mixnet.client';
|
||||
import * as _6 from './Cw3FlexMultisig.types';
|
||||
import * as _7 from './Cw3FlexMultisig.client';
|
||||
import * as _8 from './Cw4Group.types';
|
||||
import * as _9 from './Cw4Group.client';
|
||||
import * as _10 from './NameService.types';
|
||||
import * as _11 from './NameService.client';
|
||||
import * as _12 from './ServiceProviderDirectory.types';
|
||||
import * as _13 from './ServiceProviderDirectory.client';
|
||||
import * as _14 from './Vesting.types';
|
||||
import * as _15 from './Vesting.client';
|
||||
export * from './types';
|
||||
|
||||
/** @namespace */
|
||||
export namespace contracts {
|
||||
export const Ecash = {
|
||||
..._0,
|
||||
..._1
|
||||
};
|
||||
export const CoconutDkg = {
|
||||
..._2,
|
||||
..._3
|
||||
};
|
||||
export const Mixnet = {
|
||||
..._4,
|
||||
..._5
|
||||
};
|
||||
export const Cw3FlexMultisig = {
|
||||
..._6,
|
||||
..._7
|
||||
};
|
||||
export const Cw4Group = {
|
||||
..._8,
|
||||
..._9
|
||||
};
|
||||
export const Vesting = {
|
||||
..._10,
|
||||
..._11
|
||||
};
|
||||
export const baseClient = {
|
||||
..._12
|
||||
};
|
||||
}
|
||||
export const CoconutBandwidth = { ..._0, ..._1 };
|
||||
export const CoconutDkg = { ..._2, ..._3 };
|
||||
export const Mixnet = { ..._4, ..._5 };
|
||||
export const Cw3FlexMultisig = { ..._6, ..._7 };
|
||||
export const Cw4Group = { ..._8, ..._9 };
|
||||
export const NameService = { ..._10, ..._11 };
|
||||
export const ServiceProviderDirectory = { ..._12, ..._13 };
|
||||
export const Vesting = { ..._14, ..._15 };
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-plain-html-parcel",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "An example project that uses WASM and plain HTML bundled with Parcel v2",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
@@ -15,7 +15,7 @@
|
||||
"tsc:watch": "tsc --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.0.1",
|
||||
@@ -41,4 +41,4 @@
|
||||
"private": false,
|
||||
"browserslist": "> 0.5%, last 2 versions, not dead",
|
||||
"source": "src/index.html"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-plain-html",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "An example project that uses WASM and plain HTML",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
@@ -16,7 +16,7 @@
|
||||
"tsc:watch": "tsc --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.15.0",
|
||||
@@ -62,4 +62,4 @@
|
||||
"webpack-merge": "^5.8.0"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-react-webpack-wasm",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "An example project that uses WASM, React, Webpack, Typescript and the Nym theme + components library",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
@@ -20,7 +20,7 @@
|
||||
"@mui/lab": "^5.0.0-alpha.72",
|
||||
"@mui/material": "^5.0.1",
|
||||
"@mui/styles": "^5.0.1",
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1",
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-dropzone": "^14.2.3",
|
||||
@@ -90,4 +90,4 @@
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-chrome-extension",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "This is an example of how Nym can be used within the context of a Chrome extension.",
|
||||
"license": "ISC",
|
||||
"author": "",
|
||||
@@ -9,7 +9,7 @@
|
||||
"build": "webpack"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"clean-webpack-plugin": "^4.0.0",
|
||||
@@ -18,4 +18,4 @@
|
||||
"webpack-cli": "^5.1.4"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-firefox-extension",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "This is an example of how Nym can be used within the context of a Firefox extension.",
|
||||
"license": "ISC",
|
||||
"author": "",
|
||||
@@ -9,7 +9,7 @@
|
||||
"build": "yarn webpack"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"copy-webpack-plugin": "^11.0.0",
|
||||
@@ -18,4 +18,4 @@
|
||||
"worker-loader": "^3.0.8"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/mix-fetch-example-parcel",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
"build": "parcel build --no-cache --no-content-hash",
|
||||
@@ -8,9 +8,9 @@
|
||||
"start": "parcel --no-cache"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/mix-fetch": ">=1.4.1-rc1 || ^1",
|
||||
"@nymproject/mix-fetch": ">=1.2.2-rc.0 || ^1",
|
||||
"parcel": "^2.9.3"
|
||||
},
|
||||
"private": false,
|
||||
"source": "src/index.html"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-node-tester-plain-html-parcel",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "An example project that uses WASM and plain HTML bundled with Parcel v2",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
@@ -15,7 +15,7 @@
|
||||
"tsc:watch": "tsc --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.0.1",
|
||||
@@ -41,4 +41,4 @@
|
||||
"private": false,
|
||||
"browserslist": "> 0.5%, last 2 versions, not dead",
|
||||
"source": "src/index.html"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-node-tester-plain-html",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "An example project that uses WASM node tester and plain HTML",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
@@ -16,7 +16,7 @@
|
||||
"tsc:watch": "tsc --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.15.0",
|
||||
@@ -62,4 +62,4 @@
|
||||
"webpack-merge": "^5.8.0"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-example-node-tester-react",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"description": "An example project that uses WASM node tester and React",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
@@ -11,10 +11,10 @@
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@mui/icons-material": "^5.14.0",
|
||||
"@mui/material": "^5.14.0",
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1",
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1",
|
||||
"parcel": "^2.9.3",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/mix-fetch-node",
|
||||
"version": "1.4.1-rc0",
|
||||
"version": "1.4.0-rc.0",
|
||||
"description": "This package is a drop-in replacement for `fetch` in NodeJS to send HTTP requests over the Nym Mixnet.",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
@@ -28,7 +28,7 @@
|
||||
"tsc": "tsc --noEmit true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/mix-fetch-wasm-node": ">=1.2.5-rc.0 || ^1",
|
||||
"@nymproject/mix-fetch-wasm-node": ">=1.2.4-rc.2 || ^1",
|
||||
"comlink": "^4.3.1",
|
||||
"fake-indexeddb": "^5.0.0",
|
||||
"node-fetch": "^3.3.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/mix-fetch-tester-webpack",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
"build": "webpack build --progress --config webpack.prod.js",
|
||||
@@ -8,7 +8,7 @@
|
||||
"start": "webpack serve --progress --port 3000"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/mix-fetch": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/mix-fetch": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -55,4 +55,4 @@
|
||||
"webpack-merge": "^5.9.0"
|
||||
},
|
||||
"private": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/mix-fetch-tester-parcel",
|
||||
"version": "1.0.5",
|
||||
"version": "1.0.4-rc.2",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
"build": "npx parcel build --no-cache --no-content-hash",
|
||||
@@ -8,8 +8,8 @@
|
||||
"start": "npx parcel --no-cache"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/mix-fetch": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/mix-fetch": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"private": false,
|
||||
"source": "../src/index.html"
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,6 @@ async function main() {
|
||||
|
||||
// const addr =
|
||||
// 'EVdJ66jqpoVzmktVecy5UJxsTCEWo5gMn5zDZR7Hm8jy.GXNpoX7RcYcxKvBkV3dSHqC78WaPuWieweRPWzYqNhh5@GAjhJcrd6f1edaqUkfWCff6zdHoqo756qYrc2TfPuCXJ';
|
||||
// const addr = '7Y9eyF1p1JmzHnd7TVZufnQHkh93ASc9sRBCFY57ZGr8.F8KPyVMVqFQ5yJC3LqeP2ZC7fukzj9a1T426rjo432yT@q2A2cbooyC16YJzvdYaSMH9X3cSiieZNtfBr8cE8Fi1';
|
||||
const addr = undefined;
|
||||
|
||||
appendOutput('About to set up mixFetch...');
|
||||
@@ -55,12 +54,12 @@ async function main() {
|
||||
appendOutput(JSON.stringify(resp, null, 2));
|
||||
appendOutput(JSON.stringify({ text }, null, 2));
|
||||
|
||||
// console.log('disconnecting');
|
||||
// await disconnectMixFetch();
|
||||
// console.log('disconnected! all further usages should fail');
|
||||
console.log('disconnecting');
|
||||
await disconnectMixFetch();
|
||||
console.log('disconnected! all further usages should fail');
|
||||
|
||||
// get an image
|
||||
url = 'https://matrix.org/assets/frontpage/github-mark.svg';
|
||||
url = 'https://nymtech.net/favicon.svg';
|
||||
resp = await mixFetch(url, args);
|
||||
console.log({ resp });
|
||||
const buffer = await resp.arrayBuffer();
|
||||
|
||||
@@ -35,8 +35,7 @@ module.exports = mergeWithRules({
|
||||
{
|
||||
// copy the WASM files, because webpack doesn't do this automatically even though there are
|
||||
// `new URL(..., import.meta.url)` statements in the web worker
|
||||
// from: path.resolve(path.dirname(require.resolve('@nymproject/mix-fetch/package.json')), 'dist/esm/*.wasm'),
|
||||
from: path.resolve(path.dirname(require.resolve('@nymproject/mix-fetch/package.json')), '*.wasm'),
|
||||
from: path.resolve(path.dirname(require.resolve('@nymproject/mix-fetch/package.json')), 'dist/esm/*.wasm'),
|
||||
to: '[name][ext]',
|
||||
},
|
||||
],
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
const { mergeWithRules } = require('webpack-merge');
|
||||
const webpack = require('webpack');
|
||||
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
|
||||
const ReactRefreshTypeScript = require('react-refresh-typescript');
|
||||
const commonConfig = require('./webpack.common');
|
||||
|
||||
module.exports = mergeWithRules({
|
||||
@@ -20,7 +22,7 @@ module.exports = mergeWithRules({
|
||||
exclude: /node_modules/,
|
||||
options: {
|
||||
getCustomTransformers: () => ({
|
||||
before: [],
|
||||
before: [ReactRefreshTypeScript()],
|
||||
}),
|
||||
// `ts-loader` does not work with HMR unless `transpileOnly` is used.
|
||||
// If you need type checking, `ForkTsCheckerWebpackPlugin` is an alternative.
|
||||
@@ -34,6 +36,8 @@ module.exports = mergeWithRules({
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new ReactRefreshWebpackPlugin(),
|
||||
|
||||
// this can be included automatically by the dev server, however build mode fails if missing
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/mix-fetch",
|
||||
"version": "1.4.1-rc2",
|
||||
"version": "1.4.0-rc.0",
|
||||
"description": "This package is a drop-in replacement for `fetch` to send HTTP requests over the Nym Mixnet.",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
@@ -34,7 +34,7 @@
|
||||
"tsc": "tsc --noEmit true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/mix-fetch-wasm": "1.4.1-rc2",
|
||||
"@nymproject/mix-fetch-wasm": ">=1.2.4-rc.2 || ^1",
|
||||
"comlink": "^4.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/node-tester",
|
||||
"version": "1.3.1",
|
||||
"version": "1.3.0-rc.0",
|
||||
"description": "This package provides a tester that can send test packets to mixnode that is part of the Nym Mixnet.",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
@@ -25,7 +25,7 @@
|
||||
"tsc": "tsc --noEmit true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/nym-node-tester-wasm": ">=1.2.5-rc.0 || ^1",
|
||||
"@nymproject/nym-node-tester-wasm": ">=1.2.4-rc.2 || ^1",
|
||||
"comlink": "^4.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -71,4 +71,4 @@
|
||||
"private": false,
|
||||
"type": "module",
|
||||
"types": "./dist/esm/index.d.ts"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/nodejs-client",
|
||||
"version": "1.4.1-rc0",
|
||||
"version": "1.4.0-rc.0",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
"files": [
|
||||
@@ -25,7 +25,7 @@
|
||||
"tsc": "tsc --noEmit true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/nym-client-wasm-node": ">=1.2.5-rc.0 || ^1",
|
||||
"@nymproject/nym-client-wasm-node": ">=1.2.4-rc.2 || ^1",
|
||||
"comlink": "^4.3.1",
|
||||
"fake-indexeddb": "^4.0.2",
|
||||
"rollup-plugin-polyfill": "^4.2.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk-react",
|
||||
"version": "1.4.1",
|
||||
"version": "1.4.0-rc.0",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
"files": [
|
||||
@@ -20,7 +20,7 @@
|
||||
"tsc": "tsc --noEmit true"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nymproject/sdk": ">=1.4.1-rc1 || ^1"
|
||||
"@nymproject/sdk": ">=1.2.2-rc.0 || ^1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.17.5",
|
||||
@@ -67,4 +67,4 @@
|
||||
"private": false,
|
||||
"type": "module",
|
||||
"types": "./dist/index.d.ts"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nymproject/sdk",
|
||||
"version": "1.4.1-rc2",
|
||||
"version": "1.4.0-rc.0",
|
||||
"license": "Apache-2.0",
|
||||
"author": "Nym Technologies SA",
|
||||
"files": [
|
||||
@@ -30,8 +30,11 @@
|
||||
"test": "node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js -c=jest.config.mjs --no-cache",
|
||||
"tsc": "tsc --noEmit true"
|
||||
},
|
||||
"typeRoots": [
|
||||
"./node_modules/@types/*"
|
||||
],
|
||||
"dependencies": {
|
||||
"@nymproject/nym-client-wasm": "1.4.1-rc2",
|
||||
"@nymproject/nym-client-wasm": ">=1.2.4-rc.2 || ^1",
|
||||
"comlink": "^4.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -51,7 +54,6 @@
|
||||
"@rollup/plugin-url": "^8.0.1",
|
||||
"@rollup/plugin-wasm": "^6.1.1",
|
||||
"@types/jest": "^27.0.1",
|
||||
"@types/minimatch": "5.1.2",
|
||||
"@types/node": "^16.7.13",
|
||||
"@typescript-eslint/eslint-plugin": "^5.13.0",
|
||||
"@typescript-eslint/parser": "^5.13.0",
|
||||
@@ -79,13 +81,7 @@
|
||||
"typedoc": "^0.24.8",
|
||||
"typescript": "^4.8.4"
|
||||
},
|
||||
"resolutions": {
|
||||
"@types/minimatch": "5.1.2"
|
||||
},
|
||||
"private": false,
|
||||
"type": "module",
|
||||
"typeRoots": [
|
||||
"./node_modules/@types/*"
|
||||
],
|
||||
"types": "./dist/esm/index.d.ts"
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ class ClientWrapper {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return this.client.selfAddress();
|
||||
return this.client.self_address();
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,7 +21,7 @@ yarn
|
||||
yarn build:ci:sdk
|
||||
|
||||
# build documentation
|
||||
#yarn docs:prod:build
|
||||
yarn docs:prod:build
|
||||
|
||||
# turn dev mode off
|
||||
yarn dev:off
|
||||
|
||||
@@ -2,12 +2,7 @@ import fs from 'fs';
|
||||
|
||||
const packageJson = JSON.parse(fs.readFileSync('package.json').toString());
|
||||
|
||||
const devWorkspace = [
|
||||
'dist/**',
|
||||
'sdk/typescript/packages/**',
|
||||
'sdk/typescript/examples/**',
|
||||
'sdk/typescript/codegen/**',
|
||||
];
|
||||
const devWorkspace = ['sdk/typescript/packages/**', 'sdk/typescript/examples/**', 'sdk/typescript/codegen/**'];
|
||||
if (!packageJson.workspaces.includes(devWorkspace)) {
|
||||
// add
|
||||
packageJson.workspaces.push(...devWorkspace);
|
||||
|
||||
@@ -2,12 +2,7 @@ import fs from 'fs';
|
||||
|
||||
const packageJson = JSON.parse(fs.readFileSync('package.json').toString());
|
||||
|
||||
const devWorkspace = [
|
||||
'dist/**',
|
||||
'sdk/typescript/packages/**',
|
||||
'sdk/typescript/examples/**',
|
||||
'sdk/typescript/codegen/**',
|
||||
];
|
||||
const devWorkspace = ['sdk/typescript/packages/**', 'sdk/typescript/examples/**', 'sdk/typescript/codegen/**'];
|
||||
|
||||
// remove
|
||||
packageJson.workspaces = packageJson.workspaces.filter((w) => !devWorkspace.includes(w));
|
||||
|
||||
@@ -23,33 +23,33 @@ cd dist
|
||||
#react/sdk-react
|
||||
#)
|
||||
packages=(
|
||||
#"wasm/client"
|
||||
#"wasm/mix-fetch"
|
||||
#"wasm/node-tester"
|
||||
##"wasm/extension-storage"
|
||||
"wasm/client"
|
||||
"wasm/mix-fetch"
|
||||
"wasm/node-tester"
|
||||
"wasm/extension-storage"
|
||||
|
||||
#"node/wasm/client"
|
||||
##"node/wasm/mix-fetch"
|
||||
"node/wasm/client"
|
||||
"node/wasm/mix-fetch"
|
||||
|
||||
"ts/sdk/mix-fetch/cjs"
|
||||
"ts/sdk/mix-fetch/cjs-full-fat"
|
||||
"ts/sdk/mix-fetch/esm"
|
||||
"ts/sdk/mix-fetch/esm-full-fat"
|
||||
|
||||
#"ts/sdk/nodejs-client/cjs"
|
||||
#"ts/sdk/mix-fetch-node/cjs"
|
||||
"ts/sdk/nodejs-client/cjs"
|
||||
"ts/sdk/mix-fetch-node/cjs"
|
||||
|
||||
#"ts/sdk/node-tester/cjs"
|
||||
#"ts/sdk/node-tester/cjs-full-fat"
|
||||
#"ts/sdk/node-tester/esm"
|
||||
#"ts/sdk/node-tester/esm-full-fat"
|
||||
"ts/sdk/node-tester/cjs"
|
||||
"ts/sdk/node-tester/cjs-full-fat"
|
||||
"ts/sdk/node-tester/esm"
|
||||
"ts/sdk/node-tester/esm-full-fat"
|
||||
|
||||
"ts/sdk/sdk/cjs"
|
||||
"ts/sdk/sdk/cjs-full-fat"
|
||||
"ts/sdk/sdk/esm"
|
||||
"ts/sdk/sdk/esm-full-fat"
|
||||
|
||||
#"ts/sdk/contract-clients"
|
||||
"ts/sdk/contract-clients"
|
||||
)
|
||||
|
||||
pushd () {
|
||||
@@ -66,7 +66,7 @@ for item in "${packages[@]}"
|
||||
do
|
||||
pushd "$item"
|
||||
jq -r '. | "📦 " + .version + " " +.name' < package.json
|
||||
popd
|
||||
popd
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
@@ -226,8 +226,7 @@ mod tests {
|
||||
error!("{err}");
|
||||
// this is not an ideal way of checking it, but if test fails due to networking failures
|
||||
// it should be fine to progress
|
||||
let err_str = err.to_string();
|
||||
if err_str.contains("nym api") || err_str.contains("failed to connect") {
|
||||
if err.to_string().contains("nym api request failed") {
|
||||
return Ok(());
|
||||
}
|
||||
return Err(err);
|
||||
@@ -292,8 +291,7 @@ mod tests {
|
||||
error!("{err}");
|
||||
// this is not an ideal way of checking it, but if test fails due to networking failures
|
||||
// it should be fine to progress
|
||||
let err_str = err.to_string();
|
||||
if err_str.contains("nym api") || err_str.contains("failed to connect") {
|
||||
if err.to_string().contains("nym api request failed") {
|
||||
return Ok(());
|
||||
}
|
||||
return Err(err);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
use anyhow::{Context, bail};
|
||||
use anyhow::{bail, Context};
|
||||
use semver::{Prerelease, Version};
|
||||
use std::collections::HashSet;
|
||||
use std::path::Path;
|
||||
@@ -72,9 +72,7 @@ pub(crate) fn try_bump_raw_prerelease(raw: &str) -> anyhow::Result<Prerelease> {
|
||||
impl VersionBumpExt for Version {
|
||||
fn try_bump_prerelease(&self) -> anyhow::Result<Self> {
|
||||
if self.pre.is_empty() {
|
||||
bail!(
|
||||
"the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?"
|
||||
)
|
||||
bail!("the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?")
|
||||
}
|
||||
|
||||
Ok(Version {
|
||||
@@ -88,9 +86,7 @@ impl VersionBumpExt for Version {
|
||||
|
||||
fn try_bump_patch_without_pre(&self) -> anyhow::Result<Self> {
|
||||
if !self.pre.is_empty() {
|
||||
bail!(
|
||||
"the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?"
|
||||
)
|
||||
bail!("the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?")
|
||||
}
|
||||
|
||||
let mut updated = self.clone();
|
||||
@@ -100,9 +96,7 @@ impl VersionBumpExt for Version {
|
||||
|
||||
fn set_initial_release_candidate(&self) -> anyhow::Result<Self> {
|
||||
if !self.pre.is_empty() {
|
||||
bail!(
|
||||
"the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?"
|
||||
)
|
||||
bail!("the current version ({self}) has pre-release data set - are you sure you followed the release process correctly?")
|
||||
}
|
||||
Ok(Version {
|
||||
major: self.major,
|
||||
@@ -115,9 +109,7 @@ impl VersionBumpExt for Version {
|
||||
|
||||
fn try_remove_prerelease(&self) -> anyhow::Result<Self> {
|
||||
if self.pre.is_empty() {
|
||||
bail!(
|
||||
"the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?"
|
||||
)
|
||||
bail!("the current version ({self}) does not have pre-release data set - are you sure you followed the release process correctly?")
|
||||
}
|
||||
Ok(Version {
|
||||
major: self.major,
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
use crate::helpers::try_bump_raw_prerelease;
|
||||
use crate::json_types::DepsSet;
|
||||
use crate::{ReleasePackage, json_types};
|
||||
use anyhow::{Context, bail};
|
||||
use crate::{json_types, ReleasePackage};
|
||||
use anyhow::{bail, Context};
|
||||
use semver::{Comparator, Prerelease, Version, VersionReq};
|
||||
use std::collections::HashSet;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
@@ -4,7 +4,7 @@ authors = [
|
||||
"Dave Hrycyszyn <futurechimp@users.noreply.github.com>",
|
||||
"Jedrzej Stuczynski <andrew@nymtech.net>",
|
||||
]
|
||||
version = "1.4.1-rc2"
|
||||
version = "1.4.0-rc.0"
|
||||
edition = "2021"
|
||||
keywords = ["nym", "sphinx", "wasm", "webassembly", "privacy"]
|
||||
license = "Apache-2.0"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "mix-fetch-wasm"
|
||||
authors = ["Jedrzej Stuczynski <andrew@nymtech.net>"]
|
||||
version = "1.4.1-rc2"
|
||||
version = "1.4.0-rc.0"
|
||||
edition = "2021"
|
||||
keywords = ["nym", "fetch", "wasm", "webassembly", "privacy"]
|
||||
license = "Apache-2.0"
|
||||
@@ -32,7 +32,6 @@ nym-http-api-client = { path = "../../common/http-api-client" }
|
||||
nym-socks5-requests = { path = "../../common/socks5/requests" }
|
||||
nym-ordered-buffer = { path = "../../common/socks5/ordered-buffer" }
|
||||
nym-service-providers-common = { path = "../../service-providers/common" }
|
||||
nym-validator-client = { path = "../../common/client-libs/validator-client", default-features = false }
|
||||
wasm-client-core = { path = "../../common/wasm/client-core" }
|
||||
wasm-utils = { path = "../../common/wasm/utils" }
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
module go-mix-conn
|
||||
|
||||
go 1.24.0
|
||||
go 1.23.0
|
||||
|
||||
require golang.org/x/net v0.46.0
|
||||
toolchain go1.23.3
|
||||
|
||||
require golang.org/x/text v0.30.0 // indirect
|
||||
require golang.org/x/net v0.38.0
|
||||
|
||||
require golang.org/x/text v0.23.0 // indirect
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
use crate::harbourmaster::HarbourMasterApiError;
|
||||
use crate::RequestId;
|
||||
use nym_ordered_buffer::OrderedMessageError;
|
||||
use nym_socks5_requests::ConnectionError;
|
||||
use nym_validator_client::nym_api::error::NymAPIError;
|
||||
use thiserror::Error;
|
||||
use wasm_client_core::error::WasmCoreError;
|
||||
use wasm_client_core::ClientCoreError;
|
||||
@@ -22,9 +22,9 @@ pub enum MixFetchError {
|
||||
NoNetworkRequesters,
|
||||
|
||||
#[error("could not query for the service providers: {source}")]
|
||||
ValidatorClientError {
|
||||
HarbourmasterError {
|
||||
#[from]
|
||||
source: NymAPIError,
|
||||
source: HarbourMasterApiError,
|
||||
},
|
||||
|
||||
#[error("failed to parse mix fetch config options: {source}")]
|
||||
|
||||
@@ -94,12 +94,10 @@ pub fn setup_mix_fetch(opts: MixFetchOpts) -> Promise {
|
||||
}
|
||||
|
||||
future_to_promise(async move {
|
||||
let network_requester_address = get_network_requester(
|
||||
opts.nym_api_url.clone(),
|
||||
opts.base.preferred_network_requester.clone(),
|
||||
)
|
||||
.await
|
||||
.map_promise_err()?;
|
||||
let network_requester_address =
|
||||
get_network_requester(opts.base.preferred_network_requester.clone())
|
||||
.await
|
||||
.map_promise_err()?;
|
||||
|
||||
console_log!("going to use {network_requester_address} network requester");
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// this exists inside mix-fetch rather than being made into repo-wide library since it's a temporary solution
|
||||
// until the API is finalised and endpoints are moved to nym-api
|
||||
|
||||
use async_trait::async_trait;
|
||||
use nym_http_api_client::{ApiClient, HttpClientError, NO_PARAMS};
|
||||
use serde::Deserialize;
|
||||
|
||||
pub use nym_http_api_client::Client;
|
||||
|
||||
pub type HarbourMasterApiError = HttpClientError;
|
||||
|
||||
mod routes {
|
||||
pub const API_VERSION: &str = "v1";
|
||||
|
||||
pub const SERVICES: &str = "services";
|
||||
|
||||
pub const NEW: &str = "new";
|
||||
}
|
||||
|
||||
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
||||
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
||||
pub trait HarbourMasterApiClientExt: ApiClient {
|
||||
// since it's a temporary thing don't worry about paging.
|
||||
async fn get_services_new(&self) -> Result<PagedResult<ServiceNew>, HarbourMasterApiError> {
|
||||
self.get_json(
|
||||
&[routes::API_VERSION, routes::SERVICES, routes::NEW],
|
||||
NO_PARAMS,
|
||||
)
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
||||
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
||||
impl HarbourMasterApiClientExt for Client {}
|
||||
|
||||
// https://gitlab.nymte.ch/nym/shipyard-test-and-earn/-/blob/main/harbour-master/src/http/mod.rs#L13
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct PagedResult<T> {
|
||||
pub page: u32,
|
||||
pub size: u32,
|
||||
pub total: i32,
|
||||
pub items: Vec<T>,
|
||||
}
|
||||
|
||||
// https://gitlab.nymte.ch/nym/shipyard-test-and-earn/-/blob/main/harbour-master/src/http/services.rs#L32
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct ServiceNew {
|
||||
pub service_provider_client_id: String,
|
||||
pub ip_address: String,
|
||||
pub last_successful_ping_utc: String,
|
||||
pub last_updated_utc: String,
|
||||
pub routing_score: f32,
|
||||
}
|
||||
@@ -2,48 +2,36 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
use crate::error::MixFetchError;
|
||||
use crate::error::MixFetchError::NoNetworkRequesters;
|
||||
use nym_http_api_client::Client;
|
||||
use nym_validator_client::nym_api::NymApiClientExt;
|
||||
use crate::harbourmaster;
|
||||
use crate::harbourmaster::HarbourMasterApiClientExt;
|
||||
use rand::seq::SliceRandom;
|
||||
use rand::thread_rng;
|
||||
use wasm_utils::console_log;
|
||||
|
||||
// since this client is temporary (and will be properly integrated into nym-api eventually),
|
||||
// we're using hardcoded URL for mainnet
|
||||
const NYM_API_URL: &str = "https://validator.nymtech.net/api/";
|
||||
const HARBOUR_MASTER: &str = "https://harbourmaster.nymtech.net";
|
||||
|
||||
pub(crate) async fn get_network_requester(
|
||||
nym_api_url: Option<String>,
|
||||
preferred: Option<String>,
|
||||
) -> Result<String, MixFetchError> {
|
||||
if let Some(sp) = preferred {
|
||||
return Ok(sp);
|
||||
}
|
||||
|
||||
let client = Client::new(
|
||||
url::Url::parse(&nym_api_url.unwrap_or(NYM_API_URL.to_string()))?,
|
||||
None,
|
||||
);
|
||||
let nodes = client.get_all_described_nodes().await?;
|
||||
let providers: Vec<_> = nodes
|
||||
.iter()
|
||||
.filter_map(|node| {
|
||||
node.description
|
||||
.network_requester
|
||||
.clone()
|
||||
.map(|n| n.address)
|
||||
})
|
||||
.collect();
|
||||
let client = harbourmaster::Client::new_url(HARBOUR_MASTER, None)?;
|
||||
let providers = client.get_services_new().await?;
|
||||
console_log!(
|
||||
"obtained list of {} service providers on the network",
|
||||
providers.len()
|
||||
providers.items.len()
|
||||
);
|
||||
|
||||
// this will only return a `None` if the list is empty
|
||||
let mut rng = thread_rng();
|
||||
providers
|
||||
.items
|
||||
.choose(&mut rng)
|
||||
.ok_or(NoNetworkRequesters)
|
||||
.map(|service| &service.service_provider_client_id)
|
||||
.cloned()
|
||||
.ok_or(MixFetchError::NoNetworkRequesters)
|
||||
}
|
||||
|
||||
@@ -14,6 +14,8 @@ mod fetch;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod go_bridge;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod harbourmaster;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod helpers;
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod request_writer;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "nym-node-tester-wasm"
|
||||
authors = ["Jedrzej Stuczynski <andrew@nymtech.net>"]
|
||||
version = "1.3.1-rc0"
|
||||
version = "1.3.0-rc.0"
|
||||
edition = "2021"
|
||||
keywords = ["nym", "sphinx", "webassembly", "privacy", "tester"]
|
||||
license = "Apache-2.0"
|
||||
|
||||
Reference in New Issue
Block a user