From 2ed74252fb4c73e78a0e60cf69ff297f45ef707d Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 9 Jan 2024 14:04:52 -0500 Subject: [PATCH 01/31] Add pausable ism with tests --- contracts/isms/pausable/Cargo.toml | 43 +++++++ contracts/isms/pausable/src/lib.rs | 164 +++++++++++++++++++++++++ packages/interface/src/ism/mod.rs | 1 + packages/interface/src/ism/pausable.rs | 26 ++++ 4 files changed, 234 insertions(+) create mode 100644 contracts/isms/pausable/Cargo.toml create mode 100644 contracts/isms/pausable/src/lib.rs create mode 100644 packages/interface/src/ism/pausable.rs diff --git a/contracts/isms/pausable/Cargo.toml b/contracts/isms/pausable/Cargo.toml new file mode 100644 index 00000000..41cef4a1 --- /dev/null +++ b/contracts/isms/pausable/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "hpl-ism-pausable" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true +documentation.workspace = true +keywords.workspace = true + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +# use library feature to disable all instantiate/execute/query exports +library = [] + +[dependencies] +cosmwasm-std.workspace = true +cosmwasm-storage.workspace = true +cosmwasm-schema.workspace = true + +cw-storage-plus.workspace = true +cw2.workspace = true +cw-utils.workspace = true + +schemars.workspace = true +serde-json-wasm.workspace = true + +thiserror.workspace = true + +hpl-ownable.workspace = true +hpl-pausable.workspace = true +hpl-interface.workspace = true + +[dev-dependencies] +rstest.workspace = true +ibcx-test-utils.workspace = true + +anyhow.workspace = true diff --git a/contracts/isms/pausable/src/lib.rs b/contracts/isms/pausable/src/lib.rs new file mode 100644 index 00000000..51c44146 --- /dev/null +++ b/contracts/isms/pausable/src/lib.rs @@ -0,0 +1,164 @@ +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; +use cosmwasm_std::{ + ensure, to_json_binary, Deps, DepsMut, Env, Event, MessageInfo, QueryResponse, Response, + StdError, +}; +use hpl_interface::ism::{ + pausable::{ExecuteMsg, InstantiateMsg, QueryMsg}, + IsmQueryMsg, IsmType, ModuleTypeResponse, VerifyResponse, +}; + +#[derive(thiserror::Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("{0}")] + PaymentError(#[from] cw_utils::PaymentError), + + #[error("unauthorized")] + Unauthorized {}, + + #[error("hook paused")] + Paused {}, +} + +// version info for migration info +pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +fn new_event(name: &str) -> Event { + Event::new(format!("hpl_hook_pausable::{}", name)) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> Result { + cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + + let owner = deps.api.addr_validate(&msg.owner)?; + + hpl_ownable::initialize(deps.storage, &owner)?; + hpl_pausable::initialize(deps.storage, &msg.paused)?; + + Ok(Response::new().add_event( + new_event("initialize") + .add_attribute("sender", info.sender) + .add_attribute("owner", owner), + )) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + match msg { + ExecuteMsg::Ownable(msg) => Ok(hpl_ownable::handle(deps, env, info, msg)?), + ExecuteMsg::Pausable(msg) => Ok(hpl_pausable::handle(deps, env, info, msg)?), + } +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { + use IsmQueryMsg::*; + + match msg { + QueryMsg::Pausable(msg) => Ok(hpl_pausable::handle_query(deps, env, msg)?), + QueryMsg::Ownable(msg) => Ok(hpl_ownable::handle_query(deps, env, msg)?), + QueryMsg::Ism(msg) => match msg { + ModuleType {} => Ok(to_json_binary(&ModuleTypeResponse { typ: IsmType::Null })?), + Verify { + metadata: _, + message: _, + } => { + ensure!( + !hpl_pausable::get_pause_info(deps.storage)?, + ContractError::Paused {} + ); + Ok(to_json_binary(&VerifyResponse { verified: true })?) + } + _ => unimplemented!(), + }, + } +} + +#[cfg(test)] +mod test { + use cosmwasm_schema::serde::{de::DeserializeOwned, Serialize}; + use cosmwasm_std::{ + from_json, + testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage}, + to_json_binary, Addr, OwnedDeps, + }; + use hpl_ownable::get_owner; + use hpl_pausable::get_pause_info; + use ibcx_test_utils::{addr, hex}; + use rstest::{fixture, rstest}; + + use super::*; + + type TestDeps = OwnedDeps; + + fn query(deps: Deps, msg: S) -> T { + let req: QueryMsg = from_json(to_json_binary(&msg).unwrap()).unwrap(); + let res = crate::query(deps, mock_env(), req).unwrap(); + from_json(res).unwrap() + } + + #[fixture] + fn deps( + #[default(addr("deployer"))] sender: Addr, + #[default(addr("owner"))] owner: Addr, + #[default(false)] paused: bool, + ) -> TestDeps { + let mut deps = mock_dependencies(); + + instantiate( + deps.as_mut(), + mock_env(), + mock_info(sender.as_str(), &[]), + InstantiateMsg { + owner: owner.to_string(), + paused, + }, + ) + .unwrap(); + + deps + } + + #[rstest] + fn test_init(deps: TestDeps) { + assert!(!get_pause_info(deps.as_ref().storage).unwrap()); + assert_eq!("owner", get_owner(deps.as_ref().storage).unwrap().as_str()); + } + + #[rstest] + #[case(false)] + #[should_panic(expected = "hook paused")] + #[case(true)] + fn test_query(mut deps: TestDeps, #[case] paused: bool) { + if paused { + hpl_pausable::pause(deps.as_mut().storage, &addr("owner")).unwrap(); + } + + let raw_message = hex("0000000000000068220000000000000000000000000d1255b09d94659bb0888e0aa9fca60245ce402a0000682155208cd518cffaac1b5d8df216a9bd050c9a03f0d4f3ba88e5268ac4cd12ee2d68656c6c6f"); + let raw_metadata = raw_message.clone(); + + query::<_, VerifyResponse>( + deps.as_ref(), + QueryMsg::Ism(IsmQueryMsg::Verify { + metadata: raw_metadata, + message: raw_message, + }), + ); + } +} diff --git a/packages/interface/src/ism/mod.rs b/packages/interface/src/ism/mod.rs index 13cccbe4..f3947053 100644 --- a/packages/interface/src/ism/mod.rs +++ b/packages/interface/src/ism/mod.rs @@ -1,6 +1,7 @@ pub mod aggregate; pub mod multisig; pub mod routing; +pub mod pausable; use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{Addr, CustomQuery, HexBinary, QuerierWrapper, StdResult}; diff --git a/packages/interface/src/ism/pausable.rs b/packages/interface/src/ism/pausable.rs new file mode 100644 index 00000000..1f48934f --- /dev/null +++ b/packages/interface/src/ism/pausable.rs @@ -0,0 +1,26 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; + +use crate::{ownable::{OwnableMsg, OwnableQueryMsg}, pausable::{PausableMsg, PausableQueryMsg}}; + +use super::IsmQueryMsg; + +#[cw_serde] +pub struct InstantiateMsg { + pub owner: String, + pub paused: bool +} + +#[cw_serde] +pub enum ExecuteMsg { + Ownable(OwnableMsg), + Pausable(PausableMsg) +} + +#[cw_serde] +#[derive(QueryResponses)] +#[query_responses(nested)] +pub enum QueryMsg { + Ownable(OwnableQueryMsg), + Ism(IsmQueryMsg), + Pausable(PausableQueryMsg) +} From a6c890aea1599ff102858ef75528df4cfc8df720 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 9 Jan 2024 14:08:49 -0500 Subject: [PATCH 02/31] Fix paused query error case --- contracts/isms/pausable/src/lib.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/isms/pausable/src/lib.rs b/contracts/isms/pausable/src/lib.rs index 51c44146..d89ebe22 100644 --- a/contracts/isms/pausable/src/lib.rs +++ b/contracts/isms/pausable/src/lib.rs @@ -107,10 +107,9 @@ mod test { type TestDeps = OwnedDeps; - fn query(deps: Deps, msg: S) -> T { + fn query(deps: Deps, msg: crate::QueryMsg) -> Result { let req: QueryMsg = from_json(to_json_binary(&msg).unwrap()).unwrap(); - let res = crate::query(deps, mock_env(), req).unwrap(); - from_json(res).unwrap() + crate::query(deps, mock_env(), req) } #[fixture] @@ -153,12 +152,14 @@ mod test { let raw_message = hex("0000000000000068220000000000000000000000000d1255b09d94659bb0888e0aa9fca60245ce402a0000682155208cd518cffaac1b5d8df216a9bd050c9a03f0d4f3ba88e5268ac4cd12ee2d68656c6c6f"); let raw_metadata = raw_message.clone(); - query::<_, VerifyResponse>( + query( deps.as_ref(), QueryMsg::Ism(IsmQueryMsg::Verify { metadata: raw_metadata, message: raw_message, }), - ); + ) + .map_err(|e| e.to_string()) + .unwrap(); } } From ee01584ee668ffc09f64a05ad9261bcc9a18f313 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 9 Jan 2024 14:19:55 -0500 Subject: [PATCH 03/31] Run CI against all PRs --- .github/workflows/test.yaml | 2 -- contracts/isms/pausable/src/lib.rs | 1 - 2 files changed, 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7959e3cd..ae8bdc8f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,8 +2,6 @@ name: test on: pull_request: - branches: - - "main" push: branches: - "main" diff --git a/contracts/isms/pausable/src/lib.rs b/contracts/isms/pausable/src/lib.rs index d89ebe22..16b82b85 100644 --- a/contracts/isms/pausable/src/lib.rs +++ b/contracts/isms/pausable/src/lib.rs @@ -92,7 +92,6 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Date: Tue, 9 Jan 2024 14:22:53 -0500 Subject: [PATCH 04/31] Add pausable ISM to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 79814e61..fe00de58 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ grcov . -s . --binary-path ./target/debug/ -t lcov --branch --ignore-not-existin - [aggregate ism](./contracts/isms/aggregate) + - [pausable](./contracts/isms/pausable) + - For testing: [mock ism](./contracts/mocks/mock-ism) 5. Set deployed hooks and isms to Mailbox From c2c2804767b0801c539c67fc5cf8b586af3135fa Mon Sep 17 00:00:00 2001 From: nambrot Date: Tue, 9 Jan 2024 16:04:51 -0500 Subject: [PATCH 05/31] Build wasm --- .github/workflows/test.yaml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 7959e3cd..9462f34d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,12 +30,19 @@ jobs: key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Rust - run: rustup update stable + run: rustup update 1.69 - name: Install target run: rustup target add wasm32-unknown-unknown - - run: cargo test --workspace --exclude hpl-tests + - name: Install cw-optimizoor + run: cargo install cw-optimizoor + + - name: Run tests + run: cargo test --workspace --exclude hpl-tests + + - name: Optimize wasm + run: cargo cw-optimizoor coverage: runs-on: ubuntu-latest From ef9c6f38173ea763ab8eb0a093f20724051bcfde Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 9 Jan 2024 16:46:04 -0500 Subject: [PATCH 06/31] Fix scripts --- scripts/action/ism.ts | 14 +++++++------- scripts/action/mailbox.ts | 18 +++++++++--------- scripts/src/contracts/hpl_ism_pausable.ts | 7 +++++++ scripts/src/contracts/index.ts | 5 +++-- scripts/src/migrations/InitializeStandalone.ts | 9 +++++---- scripts/src/types.ts | 10 +++++----- 6 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 scripts/src/contracts/hpl_ism_pausable.ts diff --git a/scripts/action/ism.ts b/scripts/action/ism.ts index 897a8d3f..f842d776 100644 --- a/scripts/action/ism.ts +++ b/scripts/action/ism.ts @@ -1,17 +1,17 @@ -import { Command } from "commander"; import { ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { Command } from "commander"; import { version } from "../package.json"; import { config, getSigningClient } from "../src/config"; -import { loadContext } from "../src/load_context"; -import { ContractFetcher } from "./fetch"; import { - HplMailbox, - HplIgp, - HplIgpGasOracle, HplHookMerkle, + HplIgp, + HplIgpOracle, HplIsmAggregate, + HplMailbox, } from "../src/contracts"; +import { loadContext } from "../src/load_context"; +import { ContractFetcher } from "./fetch"; const program = new Command(); @@ -51,7 +51,7 @@ function makeHandler( const fetcher = new ContractFetcher(ctx, client); const mailbox = fetcher.get(HplMailbox, "hpl_mailbox"); const igp = fetcher.get(HplIgp, "hpl_igp"); - const igp_oracle = fetcher.get(HplIgpGasOracle, "hpl_igp_oracle"); + const igp_oracle = fetcher.get(HplIgpOracle, "hpl_igp_oracle"); const hook_merkle = fetcher.get(HplHookMerkle, "hpl_hook_merkle"); const hook_aggregate = fetcher.get(HplIsmAggregate, "hpl_hook_aggregate"); diff --git a/scripts/action/mailbox.ts b/scripts/action/mailbox.ts index 2509708d..bd40ea1a 100644 --- a/scripts/action/mailbox.ts +++ b/scripts/action/mailbox.ts @@ -1,18 +1,18 @@ -import { Command } from "commander"; import { ExecuteResult } from "@cosmjs/cosmwasm-stargate"; +import { Command } from "commander"; import { version } from "../package.json"; import { config, getSigningClient } from "../src/config"; +import { + HplHookMerkle, + HplIgp, + HplIgpOracle, + HplIsmAggregate, + HplMailbox, +} from "../src/contracts"; import { addPad } from "../src/conv"; import { loadContext } from "../src/load_context"; import { ContractFetcher } from "./fetch"; -import { - HplMailbox, - HplIgp, - HplIgpGasOracle, - HplHookMerkle, - HplIsmAggregate, -} from "../src/contracts"; const program = new Command(); @@ -54,7 +54,7 @@ function makeHandler( const fetcher = new ContractFetcher(ctx, client); const mailbox = fetcher.get(HplMailbox, "hpl_mailbox"); const igp = fetcher.get(HplIgp, "hpl_igp"); - const igp_oracle = fetcher.get(HplIgpGasOracle, "hpl_igp_oracle"); + const igp_oracle = fetcher.get(HplIgpOracle, "hpl_igp_oracle"); const hook_merkle = fetcher.get(HplHookMerkle, "hpl_hook_merkle"); const hook_aggregate = fetcher.get(HplIsmAggregate, "hpl_hook_aggregate"); diff --git a/scripts/src/contracts/hpl_ism_pausable.ts b/scripts/src/contracts/hpl_ism_pausable.ts new file mode 100644 index 00000000..7fce739a --- /dev/null +++ b/scripts/src/contracts/hpl_ism_pausable.ts @@ -0,0 +1,7 @@ +import { injectable } from "inversify"; +import { BaseContract } from "../types"; + +@injectable() +export class HplIsmPausable extends BaseContract { + contractName: string = "hpl_ism_pausable"; +} diff --git a/scripts/src/contracts/index.ts b/scripts/src/contracts/index.ts index 8016e991..417f7be2 100644 --- a/scripts/src/contracts/index.ts +++ b/scripts/src/contracts/index.ts @@ -8,6 +8,7 @@ export * from "./hpl_igp"; export * from "./hpl_igp_oracle"; export * from "./hpl_ism_aggregate"; export * from "./hpl_ism_multisig"; +export * from "./hpl_ism_pausable"; export * from "./hpl_ism_routing"; export * from "./hpl_mailbox"; export * from "./hpl_test_mock_hook"; @@ -16,10 +17,10 @@ export * from "./hpl_validator_announce"; export * from "./hpl_warp_cw20"; export * from "./hpl_warp_native"; -import { readdirSync } from "fs"; -import { Context, Contract, ContractConstructor } from "../types"; import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate"; +import { readdirSync } from "fs"; import { Container } from "inversify"; +import { Context, Contract, ContractConstructor } from "../types"; const contractNames: string[] = readdirSync(__dirname) .filter((f) => f !== "index.ts") diff --git a/scripts/src/migrations/InitializeStandalone.ts b/scripts/src/migrations/InitializeStandalone.ts index 920cc5b4..1bede003 100644 --- a/scripts/src/migrations/InitializeStandalone.ts +++ b/scripts/src/migrations/InitializeStandalone.ts @@ -1,12 +1,13 @@ import { injectable } from "inversify"; -import { Context, Migration } from "../types"; import { - HplMailbox, HplHookMerkle, - HplIgpGasOracle, + HplIgp, + HplIgpOracle, HplIsmMultisig, + HplMailbox, HplTestMockHook, } from "../contracts"; +import { Context, Migration } from "../types"; @injectable() export default class InitializeStandalone implements Migration { @@ -18,7 +19,7 @@ export default class InitializeStandalone implements Migration { private mailbox: HplMailbox, private hook_merkle: HplHookMerkle, private igp: HplIgp, - private igp_oracle: HplIgpGasOracle, + private igp_oracle: HplIgpOracle, private ism_multisig: HplIsmMultisig, private test_mock_hook: HplTestMockHook ) {} diff --git a/scripts/src/types.ts b/scripts/src/types.ts index b28f9edc..95c63af6 100644 --- a/scripts/src/types.ts +++ b/scripts/src/types.ts @@ -1,10 +1,10 @@ import { - ExecuteResult, - SigningCosmWasmClient, + ExecuteResult, + SigningCosmWasmClient, } from "@cosmjs/cosmwasm-stargate"; -import { getWasmPath } from "./load_wasm"; -import fs from "fs"; import { fromBech32 } from "@cosmjs/encoding"; +import fs from "fs"; +import { getWasmPath } from "./load_wasm"; export interface ContractContext { codeId: number | undefined; @@ -165,7 +165,7 @@ export interface HplIgpCoreInstantiateMsg { beneficiary: string; } -export interface HplIgpGasOracleInstantiateMsg {} +export interface HplIgpOracleInstantiateMsg {} export interface HplIsmMultisigInstantiateMsg { owner: string; From 8a9aa1bce9f72f8eb11afae217886eb08a2f49e1 Mon Sep 17 00:00:00 2001 From: nambrot Date: Tue, 9 Jan 2024 17:32:25 -0500 Subject: [PATCH 07/31] Allow threshold == set size and add tests --- contracts/isms/multisig/src/contract.rs | 76 +++++- contracts/isms/multisig/src/execute.rs | 319 ------------------------ 2 files changed, 75 insertions(+), 320 deletions(-) delete mode 100644 contracts/isms/multisig/src/execute.rs diff --git a/contracts/isms/multisig/src/contract.rs b/contracts/isms/multisig/src/contract.rs index ce4075a1..6741189d 100644 --- a/contracts/isms/multisig/src/contract.rs +++ b/contracts/isms/multisig/src/contract.rs @@ -64,7 +64,7 @@ pub fn execute( ContractError::invalid_addr("length should be 20") ); ensure!( - validators.len() > threshold as usize && threshold > 0, + validators.len() >= threshold as usize && threshold > 0, ContractError::invalid_args(&format!( "threshold not in range. 0 < <= {}", validators.len(), @@ -137,3 +137,77 @@ pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result Result { Ok(Response::new()) } + +#[cfg(test)] +mod test { + use cosmwasm_std::{ + testing::mock_dependencies, HexBinary, + }; + use hpl_interface::{ + build_test_executor, build_test_querier, + ism::multisig::ExecuteMsg, + }; + use ibcx_test_utils::{addr, hex}; + use rstest::rstest; + + use crate::state::VALIDATORS; + + build_test_executor!(crate::contract::execute); + build_test_querier!(crate::contract::query); + + #[rstest] + #[case("owner", vec![hex(&"deadbeef".repeat(5))])] + #[should_panic(expected = "unauthorized")] + #[case("someone", vec![hex(&"deadbeef".repeat(5))])] + fn test_enroll(#[case] sender: &str, #[case] validators: Vec) { + let mut deps = mock_dependencies(); + + hpl_ownable::initialize(deps.as_mut().storage, &addr("owner")).unwrap(); + + test_execute( + deps.as_mut(), + &addr(sender), + ExecuteMsg::SetValidators { + domain: 1, + threshold: 1, + validators: validators.clone(), + }, + vec![], + ); + + assert_eq!( + VALIDATORS.load(deps.as_ref().storage, 1).unwrap(), + validators + ); + } + + #[rstest] + #[case("owner")] + #[should_panic(expected = "unauthorized")] + #[case("someone")] + fn test_unenroll(#[case] sender: &str) { + let mut deps = mock_dependencies(); + + hpl_ownable::initialize(deps.as_mut().storage, &addr("owner")).unwrap(); + + test_execute( + deps.as_mut(), + &addr("owner"), + ExecuteMsg::SetValidators { + domain: 1, + threshold: 1, + validators: vec![hex(&"deadbeef".repeat(5))], + }, + vec![], + ); + + test_execute( + deps.as_mut(), + &addr(sender), + ExecuteMsg::UnsetDomain { domain: 1 } , + vec![], + ); + + assert!(!VALIDATORS.has(deps.as_ref().storage, 1)); + } +} diff --git a/contracts/isms/multisig/src/execute.rs b/contracts/isms/multisig/src/execute.rs deleted file mode 100644 index d4661fbb..00000000 --- a/contracts/isms/multisig/src/execute.rs +++ /dev/null @@ -1,319 +0,0 @@ -use cosmwasm_std::{ensure_eq, DepsMut, Event, HexBinary, MessageInfo, Response, StdResult}; -use hpl_interface::ism::multisig::{ThresholdSet, ValidatorSet as MsgValidatorSet}; -use hpl_ownable::get_owner; - -use crate::{ - event::{emit_enroll_validator, emit_set_threshold, emit_unenroll_validator}, - state::{THRESHOLD, VALIDATORS}, - ContractError, -}; - -pub fn set_threshold( - deps: DepsMut, - info: MessageInfo, - threshold: ThresholdSet, -) -> Result { - ensure_eq!( - get_owner(deps.storage)?, - info.sender, - ContractError::Unauthorized - ); - THRESHOLD.save(deps.storage, threshold.domain, &threshold.threshold)?; - - Ok(Response::new().add_event(emit_set_threshold(threshold.domain, threshold.threshold))) -} - -pub fn set_thresholds( - deps: DepsMut, - info: MessageInfo, - thresholds: Vec, -) -> Result { - ensure_eq!( - get_owner(deps.storage)?, - info.sender, - ContractError::Unauthorized - ); - - let events: Vec = thresholds - .into_iter() - .map(|v| { - THRESHOLD.save(deps.storage, v.domain, &v.threshold)?; - Ok(emit_set_threshold(v.domain, v.threshold)) - }) - .collect::>()?; - - Ok(Response::new().add_events(events)) -} - -pub fn enroll_validator( - deps: DepsMut, - info: MessageInfo, - msg: MsgValidatorSet, -) -> Result { - ensure_eq!( - info.sender, - get_owner(deps.storage)?, - ContractError::Unauthorized {} - ); - - ensure_eq!( - msg.validator.len(), - 20, - ContractError::invalid_addr("length should be 20") - ); - - let validator_state = VALIDATORS.may_load(deps.storage, msg.domain)?; - - if let Some(mut validators) = validator_state { - if validators.contains(&msg.validator) { - return Err(ContractError::ValidatorDuplicate {}); - } - - validators.push(msg.validator.clone()); - validators.sort(); - - VALIDATORS.save(deps.storage, msg.domain, &validators)?; - } else { - VALIDATORS.save(deps.storage, msg.domain, &vec![msg.validator.clone()])?; - } - - Ok(Response::new().add_event(emit_enroll_validator(msg.domain, msg.validator.to_hex()))) -} - -pub fn enroll_validators( - deps: DepsMut, - info: MessageInfo, - validators: Vec, -) -> Result { - ensure_eq!( - info.sender, - get_owner(deps.storage)?, - ContractError::Unauthorized {} - ); - - let mut events: Vec = Vec::new(); - - for msg in validators.into_iter() { - ensure_eq!( - msg.validator.len(), - 20, - ContractError::invalid_addr("length should be 20") - ); - - let validators_state = VALIDATORS.may_load(deps.storage, msg.domain)?; - - if let Some(mut validators) = validators_state { - if validators.contains(&msg.validator) { - return Err(ContractError::ValidatorDuplicate {}); - } - - validators.push(msg.validator.clone()); - validators.sort(); - - VALIDATORS.save(deps.storage, msg.domain, &validators)?; - events.push(emit_enroll_validator(msg.domain, msg.validator.to_hex())); - } else { - VALIDATORS.save(deps.storage, msg.domain, &vec![msg.validator.clone()])?; - events.push(emit_enroll_validator(msg.domain, msg.validator.to_hex())); - } - } - - Ok(Response::new().add_events(events)) -} - -pub fn unenroll_validator( - deps: DepsMut, - info: MessageInfo, - domain: u32, - validator: HexBinary, -) -> Result { - ensure_eq!( - info.sender, - get_owner(deps.storage)?, - ContractError::Unauthorized {} - ); - - let validators = VALIDATORS - .load(deps.storage, domain) - .map_err(|_| ContractError::ValidatorNotExist {})?; - - if !validators.contains(&validator) { - return Err(ContractError::ValidatorNotExist {}); - } - - let mut validator_list: Vec = - validators.into_iter().filter(|v| v != &validator).collect(); - - validator_list.sort(); - - VALIDATORS.save(deps.storage, domain, &validator_list)?; - - Ok(Response::new().add_event(emit_unenroll_validator(domain, validator.to_hex()))) -} - -#[cfg(test)] -mod test { - use cosmwasm_std::{ - testing::{mock_dependencies, mock_info}, - Addr, HexBinary, Storage, - }; - use hpl_interface::{ - build_test_executor, build_test_querier, - ism::multisig::{ExecuteMsg, ValidatorSet}, - }; - use ibcx_test_utils::{addr, hex}; - use rstest::rstest; - - use crate::state::VALIDATORS; - - build_test_executor!(crate::contract::execute); - build_test_querier!(crate::contract::query); - - use super::*; - const ADDR1_VAULE: &str = "addr1"; - const ADDR2_VAULE: &str = "addr2"; - - fn mock_owner(storage: &mut dyn Storage, owner: Addr) { - hpl_ownable::initialize(storage, &owner).unwrap(); - } - - #[test] - fn test_set_threshold() { - let mut deps = mock_dependencies(); - let owner = Addr::unchecked(ADDR1_VAULE); - mock_owner(deps.as_mut().storage, owner.clone()); - - let threshold = ThresholdSet { - domain: 1u32, - threshold: 8u8, - }; - - // set_threshold failure test - let info = mock_info(ADDR2_VAULE, &[]); - let fail_result = set_threshold(deps.as_mut(), info, threshold.clone()).unwrap_err(); - - assert!(matches!(fail_result, ContractError::Unauthorized {})); - - // set_threshold success test - let info = mock_info(owner.as_str(), &[]); - let result = set_threshold(deps.as_mut(), info, threshold.clone()).unwrap(); - - assert_eq!( - result.events, - vec![emit_set_threshold(threshold.domain, threshold.threshold)] - ); - - // check it actually saved - let saved_threshold = THRESHOLD.load(&deps.storage, threshold.domain).unwrap(); - assert_eq!(saved_threshold, threshold.threshold); - } - - #[test] - fn test_set_thresholds() { - let mut deps = mock_dependencies(); - let owner = Addr::unchecked(ADDR1_VAULE); - mock_owner(deps.as_mut().storage, owner.clone()); - - let thresholds: Vec = vec![ - ThresholdSet { - domain: 1u32, - threshold: 8u8, - }, - ThresholdSet { - domain: 2u32, - threshold: 7u8, - }, - ThresholdSet { - domain: 3u32, - threshold: 6u8, - }, - ]; - - // set_threshold failure test - let info = mock_info(ADDR2_VAULE, &[]); - let fail_result = set_thresholds(deps.as_mut(), info, thresholds.clone()).unwrap_err(); - - assert!(matches!(fail_result, ContractError::Unauthorized {})); - - // set_threshold success test - let info = mock_info(owner.as_str(), &[]); - let result = set_thresholds(deps.as_mut(), info, thresholds.clone()).unwrap(); - - assert_eq!( - result.events, - vec![ - emit_set_threshold(1u32, 8u8), - emit_set_threshold(2u32, 7u8), - emit_set_threshold(3u32, 6u8), - ] - ); - - // check it actually saved - for threshold in thresholds { - let saved_threshold = THRESHOLD.load(&deps.storage, threshold.domain).unwrap(); - assert_eq!(saved_threshold, threshold.threshold); - } - } - - #[rstest] - #[case("owner", vec![hex(&"deadbeef".repeat(5))])] - #[should_panic(expected = "unauthorized")] - #[case("someone", vec![hex(&"deadbeef".repeat(5))])] - #[should_panic(expected = "duplicate validator")] - #[case("owner", vec![hex(&"deadbeef".repeat(5)),hex(&"deadbeef".repeat(5))])] - fn test_enroll(#[case] sender: &str, #[case] validators: Vec) { - let mut deps = mock_dependencies(); - - hpl_ownable::initialize(deps.as_mut().storage, &addr("owner")).unwrap(); - - for validator in validators.clone() { - test_execute( - deps.as_mut(), - &addr(sender), - ExecuteMsg::EnrollValidator { - set: ValidatorSet { - domain: 1, - validator, - }, - }, - vec![], - ); - } - - assert_eq!( - VALIDATORS.load(deps.as_ref().storage, 1).unwrap(), - validators - ); - } - - #[rstest] - #[case("owner", hex("deadbeef"))] - #[should_panic(expected = "unauthorized")] - #[case("someone", hex("deadbeef"))] - #[should_panic(expected = "validator not exist")] - #[case("owner", hex("debeefed"))] - fn test_unenroll(#[case] sender: &str, #[case] target: HexBinary) { - let mut deps = mock_dependencies(); - - hpl_ownable::initialize(deps.as_mut().storage, &addr("owner")).unwrap(); - - VALIDATORS - .save(deps.as_mut().storage, 1, &vec![hex("deadbeef")]) - .unwrap(); - - test_execute( - deps.as_mut(), - &addr(sender), - ExecuteMsg::UnenrollValidator { - domain: 1, - validator: target, - }, - vec![], - ); - - assert!(VALIDATORS - .load(deps.as_ref().storage, 1) - .unwrap() - .is_empty()); - } -} From 63c62bb7ad536412dd3a2738b6d91361509edf63 Mon Sep 17 00:00:00 2001 From: nambrot Date: Tue, 9 Jan 2024 17:44:00 -0500 Subject: [PATCH 08/31] Upload artifacts --- .github/workflows/test.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9462f34d..5d787d4a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -44,6 +44,18 @@ jobs: - name: Optimize wasm run: cargo cw-optimizoor + - name: Rename + run: rename 's/(.*)(-aarch64)(.*)/$1$3/d' * + + - name: Zip + run: cd artifacts && zip -r ../wasm_codes.zip * && cd ../ + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: wasm_codes + path: wasm_codes.zip + coverage: runs-on: ubuntu-latest env: @@ -61,7 +73,7 @@ jobs: uses: taiki-e/install-action@cargo-llvm-cov - name: Generate code coverage - run: cargo llvm-cov --all-features --workspace --exclude hpl-tests --codecov --output-path codecov.json + run: cargo +nightly llvm-cov --all-features --workspace --exclude hpl-tests --codecov --output-path codecov.json - name: Upload to codecov.io uses: codecov/codecov-action@v3 From ae2706d3d8fb682a44a024435969b59e4d3e13b3 Mon Sep 17 00:00:00 2001 From: nambrot Date: Tue, 9 Jan 2024 17:59:29 -0500 Subject: [PATCH 09/31] Force --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 5d787d4a..bad3686f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,7 +35,7 @@ jobs: - name: Install target run: rustup target add wasm32-unknown-unknown - - name: Install cw-optimizoor + - name: Install cw-optimizoor --force run: cargo install cw-optimizoor - name: Run tests From 46d3e36f512f1c3a215a23dd7701fe611ce4bd95 Mon Sep 17 00:00:00 2001 From: nambrot Date: Wed, 10 Jan 2024 15:51:01 -0500 Subject: [PATCH 10/31] Move into makefile --- .github/workflows/test.yaml | 13 ++----------- Makefile | 6 ++++++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index bad3686f..db5cb10f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,20 +35,11 @@ jobs: - name: Install target run: rustup target add wasm32-unknown-unknown - - name: Install cw-optimizoor --force - run: cargo install cw-optimizoor - - name: Run tests run: cargo test --workspace --exclude hpl-tests - - name: Optimize wasm - run: cargo cw-optimizoor - - - name: Rename - run: rename 's/(.*)(-aarch64)(.*)/$1$3/d' * - - - name: Zip - run: cd artifacts && zip -r ../wasm_codes.zip * && cd ../ + - name: Build wasm + run: make ci-build - name: Upload artifacts uses: actions/upload-artifact@v2 diff --git a/Makefile b/Makefile index fa2176ef..fa69ad5b 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,12 @@ clean: schema: ls ./contracts | xargs -n 1 -t beaker wasm ts-gen +ci-build: + cargo install cw-optimizoor --force + cargo cw-optimizoor + rename 's/(.*)(-x86)(.*)/$1$3/d' * + cd artifacts && zip -r ../wasm_codes.zip * && cd ../ + build: cargo wasm From f7af326f0ad816c31929d00c11062cf1ecf78497 Mon Sep 17 00:00:00 2001 From: nambrot Date: Wed, 10 Jan 2024 19:51:47 -0500 Subject: [PATCH 11/31] Install rename --- .github/workflows/test.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index db5cb10f..1d21d0f5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -32,6 +32,9 @@ jobs: - name: Install Rust run: rustup update 1.69 + - name: Install rename + run: apt-get install -y rename + - name: Install target run: rustup target add wasm32-unknown-unknown From 280fb0786568ed71dfd8604e662b0af2a3e32167 Mon Sep 17 00:00:00 2001 From: nambrot Date: Wed, 10 Jan 2024 19:52:33 -0500 Subject: [PATCH 12/31] Rename properly --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fa69ad5b..1abcc23b 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ schema: ci-build: cargo install cw-optimizoor --force cargo cw-optimizoor - rename 's/(.*)(-x86)(.*)/$1$3/d' * + rename 's/(.*)(-x86_64)(.*)/$1$3/d' * cd artifacts && zip -r ../wasm_codes.zip * && cd ../ build: From bf522bec4e7da0dc78877e8f13444f941ba3dc81 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 11 Jan 2024 14:40:53 -0500 Subject: [PATCH 13/31] Add cosmjs patch for injective deploy --- scripts/package.json | 10 ++++- .../@cosmjs__cosmwasm-stargate@0.31.0.patch | 41 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch diff --git a/scripts/package.json b/scripts/package.json index d7699162..a599bb9b 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -33,5 +33,13 @@ "ts-yaml": "^1.0.0", "tsx": "^3.13.0", "typescript": "^5.1.6" + }, + "resolutions": { + "@cosmjs/stargate": "0.31.0" + }, + "pnpm": { + "patchedDependencies": { + "@cosmjs/cosmwasm-stargate@0.31.0": "patches/@cosmjs__cosmwasm-stargate@0.31.0.patch" + } } -} \ No newline at end of file +} diff --git a/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch b/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch new file mode 100644 index 00000000..0f8655cb --- /dev/null +++ b/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch @@ -0,0 +1,41 @@ +diff --git a/build/cosmwasmclient.js b/build/cosmwasmclient.js +index 8f6305b0263886c5c31fab661c9235723ba1e6e9..b2aac8730ae07b2e62fec2c0a5ee9e6808239a68 100644 +--- a/build/cosmwasmclient.js ++++ b/build/cosmwasmclient.js +@@ -81,6 +81,10 @@ class CosmWasmClient { + async getAccount(searchAddress) { + try { + const account = await this.forceGetQueryClient().auth.account(searchAddress); ++ if (searchAddress.startsWith('inj')) { ++ const m = await require('@injectivelabs/sdk-ts'); ++ return m.injectiveAccountParser(account); ++ } + return account ? (0, stargate_1.accountFromAny)(account) : null; + } + catch (error) { +diff --git a/build/signingcosmwasmclient.js b/build/signingcosmwasmclient.js +index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..61c9f1f154cc54a9dfc654cb1541d11fc57fc072 100644 +--- a/build/signingcosmwasmclient.js ++++ b/build/signingcosmwasmclient.js +@@ -107,7 +107,8 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { + throw new Error(createDeliverTxResponseErrorMessage(result)); + } + const parsedLogs = stargate_1.logs.parseRawLog(result.rawLog); +- const codeIdAttr = stargate_1.logs.findAttribute(parsedLogs, "store_code", "code_id"); ++ const escapedCodeIdAttr = stargate_1.logs.findAttribute(parsedLogs, "cosmwasm.wasm.v1.EventCodeStored", "code_id"); ++ const codeIdAttr = { value: escapedCodeIdAttr.value.replace(/\"/g, "") }; + return { + checksum: (0, encoding_1.toHex)((0, crypto_1.sha256)(wasmCode)), + originalSize: wasmCode.length, +diff --git a/package.json b/package.json +index b073b4317319dbfd761befe3d163bfe6a00dbcef..293b53bdc5e9a62f624de27ee562ae9677f670d8 100644 +--- a/package.json ++++ b/package.json +@@ -38,6 +38,7 @@ + "pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js" + }, + "dependencies": { ++ "@injectivelabs/sdk-ts": "^1.14.4", + "@cosmjs/amino": "^0.31.0", + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", From 1e5d4f3f19688617e8a78d8072568f50cf22fcde Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 11 Jan 2024 17:15:56 -0500 Subject: [PATCH 14/31] Add testnet deploy --- scripts/context/injective-1.json | 77 ++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 scripts/context/injective-1.json diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json new file mode 100644 index 00000000..8d4f9a9a --- /dev/null +++ b/scripts/context/injective-1.json @@ -0,0 +1,77 @@ +{ + "contracts": { + "hpl_hook_aggregate": { + "codeId": 6176, + "digest": "977813f4f02201c87678e5a7e9d9ad6c184f0e6031cdf3a3a72b796b3f88ab00" + }, + "hpl_hook_merkle": { + "codeId": 6177, + "digest": "c2f6065fa75c334e7d3423cd23da1a8147ac9b8971e91c5771b1d846e457b62b" + }, + "hpl_hook_pausable": { + "codeId": 6178, + "digest": "6a5087d4ebecec08439a73f2e45d7bc07f384dc1d60e63dbb0fedac891364a18" + }, + "hpl_hook_routing": { + "codeId": 6179, + "digest": "3218ea7b5758f33575ebeada23bdb58323444ed8c3ccb5fcc79eede5fa5ad5f7" + }, + "hpl_hook_routing_custom": { + "codeId": 6180, + "digest": "88e78b2073577f6122ff6e910a3710c5f5523ae8b27d38f221fa26b74e9b9d26" + }, + "hpl_hook_routing_fallback": { + "codeId": 6181, + "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" + }, + "hpl_igp": { + "codeId": 6182, + "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" + }, + "hpl_igp_oracle": { + "codeId": 6183, + "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" + }, + "hpl_ism_aggregate": { + "codeId": 6184, + "digest": "e1dee705d3500d1c21c209de42910ce3559138743246a3bd1dfddd8fb9d36620" + }, + "hpl_ism_multisig": { + "codeId": 6185, + "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91" + }, + "hpl_ism_pausable": { + "codeId": 6186, + "digest": "ea99783338118ad18cd81f6a3924a9826a328333314791a6379d5fdc940fd54d" + }, + "hpl_ism_routing": { + "codeId": 6187, + "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" + }, + "hpl_mailbox": { + "codeId": 6188, + "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" + }, + "hpl_test_mock_hook": { + "codeId": 6189, + "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" + }, + "hpl_test_mock_msg_receiver": { + "codeId": 6190, + "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" + }, + "hpl_validator_announce": { + "codeId": 6191, + "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" + }, + "hpl_warp_cw20": { + "codeId": 6192, + "digest": "5a292442e9f5107a66e85faf61bb23172f7c713ef2fe7733daf4c5870493b5a5" + }, + "hpl_warp_native": { + "codeId": 6193, + "digest": "5a50fe598804046dd787113af85154be5df938458463388129ff79d5971531b6" + } + }, + "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" +} \ No newline at end of file From 4817d7ab732e715e82dd6537e7b160216e1bafea Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 11 Jan 2024 17:17:24 -0500 Subject: [PATCH 15/31] Use new set validators interface --- scripts/src/deploy.ts | 47 ++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/scripts/src/deploy.ts b/scripts/src/deploy.ts index 8f176c41..0b64a937 100644 --- a/scripts/src/deploy.ts +++ b/scripts/src/deploy.ts @@ -1,21 +1,21 @@ import { Client, IsmType } from "../src/config"; import { - HplMailbox, - HplValidatorAnnounce, HplHookAggregate, HplHookMerkle, HplHookPausable, HplHookRouting, HplHookRoutingCustom, HplIgp, + HplIgpOracle, HplIsmAggregate, HplIsmMultisig, HplIsmRouting, + HplMailbox, HplTestMockHook, HplTestMockMsgReceiver, + HplValidatorAnnounce, HplWarpCw20, HplWarpNative, - HplIgpOracle, } from "./contracts"; export type Contracts = { @@ -76,36 +76,19 @@ export const deploy_ism = async ( })) ) ); - await client.wasm.execute( - client.signer, - multisig_ism_res.address!, - { - enroll_validators: { - set: Object.entries(ism.validators).flatMap(([domain, validator]) => - validator.addrs.map((v) => ({ - domain: Number(domain), - validator: v, - })) - ), - }, - }, - "auto" - ); - - console.log("Set thresholds"); - await client.wasm.execute( + const setValidatorMessages = Object.entries(ism.validators).flatMap(([domain, set]) => ({ + contractAddress: multisig_ism_res.address!, + msg: { + set_validators: { + domain: Number(domain), + threshold: set.threshold, + validators: set.addrs + } + } + })); + await client.wasm.executeMultiple( client.signer, - multisig_ism_res.address!, - { - set_thresholds: { - set: Object.entries(ism.validators).map( - ([domain, { threshold }]) => ({ - domain: Number(domain), - threshold, - }) - ), - }, - }, + setValidatorMessages, "auto" ); From 60c380768d1ec430a798cc90850a4f899108dc38 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 11 Jan 2024 18:11:16 -0500 Subject: [PATCH 16/31] Save injective testnet deploy --- scripts/action/deploy.ts | 14 +++--- scripts/save.json | 97 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 scripts/save.json diff --git a/scripts/action/deploy.ts b/scripts/action/deploy.ts index 3df56508..d9064359 100644 --- a/scripts/action/deploy.ts +++ b/scripts/action/deploy.ts @@ -1,11 +1,14 @@ +// prevents "TypeError: Reflect.hasOwnMetadata is not a function" +import "reflect-metadata"; + import { writeFileSync } from "fs"; -import { loadContext } from "../src/load_context"; import { Client, HookType, config, getSigningClient } from "../src/config"; +import { loadContext } from "../src/load_context"; -import { ContractFetcher } from "./fetch"; -import { Context } from "../src/types"; import { Contracts, deploy_ism } from "../src/deploy"; +import { Context } from "../src/types"; +import { ContractFetcher } from "./fetch"; const name = (c: any) => c.contractName; const addr = (ctx: Context, c: any) => ctx.contracts[name(c)].address!; @@ -97,6 +100,7 @@ const deploy_igp = async ( owner: client.signer, gas_token: config.deploy.igp.token || config.network.gas.denom, beneficiary: client.signer, + default_gas_usage: "25000" // must be string }); // init igp oracle @@ -154,8 +158,8 @@ const deploy_ism_hook = async ( type: "multisig", owner: "", validators: { - 5: { - addrs: [client.signer_addr], + 123: { + addrs: [client.signer_addr, client.signer_addr], threshold: 1, }, }, diff --git a/scripts/save.json b/scripts/save.json new file mode 100644 index 00000000..baa4e076 --- /dev/null +++ b/scripts/save.json @@ -0,0 +1,97 @@ +{ + "contracts": { + "hpl_hook_aggregate": { + "codeId": 6176, + "digest": "977813f4f02201c87678e5a7e9d9ad6c184f0e6031cdf3a3a72b796b3f88ab00" + }, + "hpl_hook_merkle": { + "codeId": 6177, + "digest": "c2f6065fa75c334e7d3423cd23da1a8147ac9b8971e91c5771b1d846e457b62b" + }, + "hpl_hook_pausable": { + "codeId": 6178, + "digest": "6a5087d4ebecec08439a73f2e45d7bc07f384dc1d60e63dbb0fedac891364a18" + }, + "hpl_hook_routing": { + "codeId": 6179, + "digest": "3218ea7b5758f33575ebeada23bdb58323444ed8c3ccb5fcc79eede5fa5ad5f7" + }, + "hpl_hook_routing_custom": { + "codeId": 6180, + "digest": "88e78b2073577f6122ff6e910a3710c5f5523ae8b27d38f221fa26b74e9b9d26" + }, + "hpl_hook_routing_fallback": { + "codeId": 6181, + "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" + }, + "hpl_igp": { + "address": "inj1zju872205d4v6m7p8gjfrkqgth6muf50vcxk7t", + "codeId": 6182, + "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" + }, + "hpl_igp_oracle": { + "address": "inj13qzhseqr54vqtt57zm79p4t7qcrlsvmv6m5g37", + "codeId": 6183, + "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" + }, + "hpl_ism_aggregate": { + "codeId": 6184, + "digest": "e1dee705d3500d1c21c209de42910ce3559138743246a3bd1dfddd8fb9d36620" + }, + "hpl_ism_multisig": { + "codeId": 6185, + "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91" + }, + "hpl_ism_pausable": { + "codeId": 6186, + "digest": "ea99783338118ad18cd81f6a3924a9826a328333314791a6379d5fdc940fd54d" + }, + "hpl_ism_routing": { + "codeId": 6187, + "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" + }, + "hpl_mailbox": { + "address": "inj14wh3ulp9kwv023hpgay75559m5w9f6muus28c5", + "codeId": 6188, + "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" + }, + "hpl_test_mock_hook": { + "codeId": 6189, + "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" + }, + "hpl_test_mock_msg_receiver": { + "address": "inj1zg7k8gcpt55v2y6jp0aas7rgytwt9jvhtyx80z", + "codeId": 6190, + "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" + }, + "hpl_validator_announce": { + "address": "inj1u6vljdpdeljvzlpm5wezjpwj08es08ywypcyu5", + "codeId": 6191, + "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" + }, + "hpl_warp_cw20": { + "codeId": 6192, + "digest": "5a292442e9f5107a66e85faf61bb23172f7c713ef2fe7733daf4c5870493b5a5" + }, + "hpl_warp_native": { + "codeId": 6193, + "digest": "5a50fe598804046dd787113af85154be5df938458463388129ff79d5971531b6" + }, + "hpl_default_ism": { + "codeId": 6185, + "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91", + "address": "inj155gpjxrz2tcf6203z339akkscc8ve0gssghr0s" + }, + "hpl_default_hook": { + "codeId": 6189, + "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", + "address": "inj120kxmy7u0cf6t53k2ftpghdmcmnm0x48tuhz0w" + }, + "hpl_required_hook": { + "codeId": 6189, + "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", + "address": "inj1jw97fkpays529hg8qz0vke4tcrl7lve30p4upz" + } + }, + "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" +} \ No newline at end of file From 7aec5189ebc8b62e90879996f359f520455f5830 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 11 Jan 2024 18:23:16 -0500 Subject: [PATCH 17/31] Deploy warp route --- scripts/action/warp.ts | 3 +++ scripts/context/injective-1.json | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/scripts/action/warp.ts b/scripts/action/warp.ts index 0e1587fe..def3e80f 100644 --- a/scripts/action/warp.ts +++ b/scripts/action/warp.ts @@ -1,3 +1,6 @@ +// prevents "TypeError: Reflect.hasOwnMetadata is not a function" +import "reflect-metadata"; + import { version } from "../package.json"; import { loadContext } from "../src/load_context"; import { config, getSigningClient } from "../src/config"; diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json index 8d4f9a9a..7de66228 100644 --- a/scripts/context/injective-1.json +++ b/scripts/context/injective-1.json @@ -25,10 +25,12 @@ "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" }, "hpl_igp": { + "address": "inj1zju872205d4v6m7p8gjfrkqgth6muf50vcxk7t", "codeId": 6182, "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" }, "hpl_igp_oracle": { + "address": "inj13qzhseqr54vqtt57zm79p4t7qcrlsvmv6m5g37", "codeId": 6183, "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" }, @@ -49,6 +51,7 @@ "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" }, "hpl_mailbox": { + "address": "inj14wh3ulp9kwv023hpgay75559m5w9f6muus28c5", "codeId": 6188, "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" }, @@ -57,10 +60,12 @@ "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" }, "hpl_test_mock_msg_receiver": { + "address": "inj1zg7k8gcpt55v2y6jp0aas7rgytwt9jvhtyx80z", "codeId": 6190, "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" }, "hpl_validator_announce": { + "address": "inj1u6vljdpdeljvzlpm5wezjpwj08es08ywypcyu5", "codeId": 6191, "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" }, @@ -71,7 +76,22 @@ "hpl_warp_native": { "codeId": 6193, "digest": "5a50fe598804046dd787113af85154be5df938458463388129ff79d5971531b6" + }, + "hpl_default_ism": { + "codeId": 6185, + "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91", + "address": "inj155gpjxrz2tcf6203z339akkscc8ve0gssghr0s" + }, + "hpl_default_hook": { + "codeId": 6189, + "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", + "address": "inj120kxmy7u0cf6t53k2ftpghdmcmnm0x48tuhz0w" + }, + "hpl_required_hook": { + "codeId": 6189, + "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", + "address": "inj1jw97fkpays529hg8qz0vke4tcrl7lve30p4upz" } }, "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" -} \ No newline at end of file +} From 95c599dbe9538a5256e7a3b2a1514d486932993d Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 12 Jan 2024 11:43:03 -0500 Subject: [PATCH 18/31] Add updated patched --- .../@cosmjs__cosmwasm-stargate@0.31.0.patch | 36 +++++++++++++++++-- scripts/pnpm-lock.yaml | 29 ++++++++------- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch b/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch index 0f8655cb..121bba74 100644 --- a/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch +++ b/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch @@ -14,10 +14,21 @@ index 8f6305b0263886c5c31fab661c9235723ba1e6e9..b2aac8730ae07b2e62fec2c0a5ee9e68 } catch (error) { diff --git a/build/signingcosmwasmclient.js b/build/signingcosmwasmclient.js -index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..61c9f1f154cc54a9dfc654cb1541d11fc57fc072 100644 +index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..a940d39b781dbd0e20a19411fe25d9b8034e104c 100644 --- a/build/signingcosmwasmclient.js +++ b/build/signingcosmwasmclient.js -@@ -107,7 +107,8 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { +@@ -86,6 +86,10 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { + throw new Error("Failed to retrieve account from signer"); + } + const pubkey = (0, amino_1.encodeSecp256k1Pubkey)(accountFromSigner.pubkey); ++ if (signerAddress.startsWith('inj')) { ++ pubkey['typeUrl'] = '/injective.crypto.v1beta1.ethsecp256k1.PubKey'; ++ } ++ + const { sequence } = await this.getSequence(signerAddress); + const { gasInfo } = await this.forceGetQueryClient().tx.simulate(anyMsgs, memo, pubkey, sequence); + (0, utils_1.assertDefined)(gasInfo); +@@ -107,7 +111,8 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { throw new Error(createDeliverTxResponseErrorMessage(result)); } const parsedLogs = stargate_1.logs.parseRawLog(result.rawLog); @@ -27,6 +38,27 @@ index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..61c9f1f154cc54a9dfc654cb1541d11f return { checksum: (0, encoding_1.toHex)((0, crypto_1.sha256)(wasmCode)), originalSize: wasmCode.length, +@@ -388,6 +393,10 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { + throw new Error("Failed to retrieve account from signer"); + } + const pubkey = (0, proto_signing_1.encodePubkey)((0, amino_1.encodeSecp256k1Pubkey)(accountFromSigner.pubkey)); ++ if (signerAddress.startsWith('inj')) { ++ pubkey['typeUrl'] = '/injective.crypto.v1beta1.ethsecp256k1.PubKey'; ++ } ++ + const signMode = signing_1.SignMode.SIGN_MODE_LEGACY_AMINO_JSON; + const msgs = messages.map((msg) => this.aminoTypes.toAmino(msg)); + const signDoc = (0, amino_1.makeSignDoc)(msgs, fee, chainId, memo, accountNumber, sequence); +@@ -416,6 +425,9 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { + throw new Error("Failed to retrieve account from signer"); + } + const pubkey = (0, proto_signing_1.encodePubkey)((0, amino_1.encodeSecp256k1Pubkey)(accountFromSigner.pubkey)); ++ if (signerAddress.startsWith('inj')) { ++ pubkey['typeUrl'] = '/injective.crypto.v1beta1.ethsecp256k1.PubKey'; ++ } + const txBody = { + typeUrl: "/cosmos.tx.v1beta1.TxBody", + value: { diff --git a/package.json b/package.json index b073b4317319dbfd761befe3d163bfe6a00dbcef..293b53bdc5e9a62f624de27ee562ae9677f670d8 100644 --- a/package.json diff --git a/scripts/pnpm-lock.yaml b/scripts/pnpm-lock.yaml index 66ec77a8..0956a649 100644 --- a/scripts/pnpm-lock.yaml +++ b/scripts/pnpm-lock.yaml @@ -4,6 +4,14 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@cosmjs/stargate': 0.31.0 + +patchedDependencies: + '@cosmjs/cosmwasm-stargate@0.31.0': + hash: cu4322e3ou7zilwfoydhfcb2te + path: patches/@cosmjs__cosmwasm-stargate@0.31.0.patch + dependencies: '@cosmjs/cosmwasm': specifier: ^0.25.6 @@ -13,7 +21,7 @@ dependencies: version: 0.25.6 '@cosmjs/cosmwasm-stargate': specifier: ^0.31.0 - version: 0.31.0 + version: 0.31.0(patch_hash=cu4322e3ou7zilwfoydhfcb2te) '@cosmjs/crypto': specifier: ^0.31.0 version: 0.31.0 @@ -24,7 +32,7 @@ dependencies: specifier: ^0.31.0 version: 0.31.0 '@cosmjs/stargate': - specifier: ^0.31.0 + specifier: 0.31.0 version: 0.31.0 '@cosmjs/tendermint-rpc': specifier: 0.31.0 @@ -108,7 +116,7 @@ packages: - debug dev: false - /@cosmjs/cosmwasm-stargate@0.31.0: + /@cosmjs/cosmwasm-stargate@0.31.0(patch_hash=cu4322e3ou7zilwfoydhfcb2te): resolution: {integrity: sha512-l6aX++3LhaAGZO46qIgrrNF40lYhOrdPfl35Z32ks6Wf3mwgbQEZwaxnoGzwUePY7/yaIiEFJ1JO6MlVPZVuag==} dependencies: '@cosmjs/amino': 0.31.0 @@ -127,6 +135,7 @@ packages: - debug - utf-8-validate dev: false + patched: true /@cosmjs/cosmwasm@0.25.6: resolution: {integrity: sha512-o+YM2NvL3/2O5lnG/vHk9QE+DvDH6FNYfvzO/evit17sAr/m5G2E8fuROlU+Z9Ml6Nj0QXgqhsR81WCGcup1Sw==} @@ -267,12 +276,12 @@ packages: dependencies: '@confio/ics23': 0.6.8 '@cosmjs/amino': 0.31.0 - '@cosmjs/encoding': 0.31.0 - '@cosmjs/math': 0.31.0 + '@cosmjs/encoding': 0.31.1 + '@cosmjs/math': 0.31.1 '@cosmjs/proto-signing': 0.31.0 - '@cosmjs/stream': 0.31.0 + '@cosmjs/stream': 0.31.1 '@cosmjs/tendermint-rpc': 0.31.0 - '@cosmjs/utils': 0.31.0 + '@cosmjs/utils': 0.31.1 cosmjs-types: 0.8.0 long: 4.0.0 protobufjs: 6.11.4 @@ -283,12 +292,6 @@ packages: - utf-8-validate dev: false - /@cosmjs/stream@0.31.0: - resolution: {integrity: sha512-Y+aSHwhHkLGIaQOdqRob+yga2zr9ifl9gZDKD+B7+R5pdWN5f2TTDhYWxA6YZcZ6xRmfr7u8a7tDh7iYLC/zKA==} - dependencies: - xstream: 11.14.0 - dev: false - /@cosmjs/stream@0.31.1: resolution: {integrity: sha512-xsIGD9bpBvYYZASajCyOevh1H5pDdbOWmvb4UwGZ78doGVz3IC3Kb9BZKJHIX2fjq9CMdGVJHmlM+Zp5aM8yZA==} dependencies: From d5666cd6774df04ab611ad9ce8663e717cc25a51 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Fri, 12 Jan 2024 14:22:16 -0500 Subject: [PATCH 19/31] Update test.yaml --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1d21d0f5..90919b87 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,7 +33,7 @@ jobs: run: rustup update 1.69 - name: Install rename - run: apt-get install -y rename + run: sudo apt-get install -y rename - name: Install target run: rustup target add wasm32-unknown-unknown From e7c890c8c443082ad7a7a5fa1cc7f74aab536888 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 12 Jan 2024 15:58:09 -0500 Subject: [PATCH 20/31] Deploy with patches --- scripts/context/injective-1.json | 16 +- scripts/package.json | 1 + .../@cosmjs__cosmwasm-stargate@0.31.0.patch | 20 +- scripts/pnpm-lock.yaml | 1592 ++++++++++++++++- scripts/save.json | 97 - 5 files changed, 1603 insertions(+), 123 deletions(-) delete mode 100644 scripts/save.json diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json index 7de66228..fc2e214c 100644 --- a/scripts/context/injective-1.json +++ b/scripts/context/injective-1.json @@ -25,12 +25,12 @@ "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" }, "hpl_igp": { - "address": "inj1zju872205d4v6m7p8gjfrkqgth6muf50vcxk7t", + "address": "inj1u70j2p7zsc3vlapyh6u2sar8wz9k9njqt9u0vy", "codeId": 6182, "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" }, "hpl_igp_oracle": { - "address": "inj13qzhseqr54vqtt57zm79p4t7qcrlsvmv6m5g37", + "address": "inj1627vkljz6dxq8jq5423p8pln3qhu3qgzmajy2f", "codeId": 6183, "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" }, @@ -51,7 +51,7 @@ "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" }, "hpl_mailbox": { - "address": "inj14wh3ulp9kwv023hpgay75559m5w9f6muus28c5", + "address": "inj1ralyv2xnzga08s70v6ncfglp9glu7gwgds4el8", "codeId": 6188, "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" }, @@ -60,12 +60,12 @@ "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" }, "hpl_test_mock_msg_receiver": { - "address": "inj1zg7k8gcpt55v2y6jp0aas7rgytwt9jvhtyx80z", + "address": "inj1xaevlalutahaphep3c02y250px7cpgqne4avfx", "codeId": 6190, "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" }, "hpl_validator_announce": { - "address": "inj1u6vljdpdeljvzlpm5wezjpwj08es08ywypcyu5", + "address": "inj1zw7wz7dd3wtdgwd4e358q0d9pvcs72zhzfak0l", "codeId": 6191, "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" }, @@ -80,17 +80,17 @@ "hpl_default_ism": { "codeId": 6185, "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91", - "address": "inj155gpjxrz2tcf6203z339akkscc8ve0gssghr0s" + "address": "inj12s96znn087acwv0pzs64nvnpqcq8hru7lnmn7z" }, "hpl_default_hook": { "codeId": 6189, "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", - "address": "inj120kxmy7u0cf6t53k2ftpghdmcmnm0x48tuhz0w" + "address": "inj1evwugy02r8cpunp2qwxmwes5d25ljjthuuuh7f" }, "hpl_required_hook": { "codeId": 6189, "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", - "address": "inj1jw97fkpays529hg8qz0vke4tcrl7lve30p4upz" + "address": "inj1tv02afkjs8nel7xgdmayv4q6tk7zcdzzxzyark" } }, "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" diff --git a/scripts/package.json b/scripts/package.json index a599bb9b..530b05e8 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -19,6 +19,7 @@ "@cosmjs/proto-signing": "^0.31.0", "@cosmjs/stargate": "^0.31.0", "@cosmjs/tendermint-rpc": "0.31.0", + "@injectivelabs/sdk-ts": "^1.14.5", "axios": "^1.6.2", "colors": "^1.4.0", "commander": "^11.1.0", diff --git a/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch b/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch index 121bba74..f25763f4 100644 --- a/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch +++ b/scripts/patches/@cosmjs__cosmwasm-stargate@0.31.0.patch @@ -14,12 +14,14 @@ index 8f6305b0263886c5c31fab661c9235723ba1e6e9..b2aac8730ae07b2e62fec2c0a5ee9e68 } catch (error) { diff --git a/build/signingcosmwasmclient.js b/build/signingcosmwasmclient.js -index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..a940d39b781dbd0e20a19411fe25d9b8034e104c 100644 +index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..8493e0bd7140d67493bc10d7e6e033d860ef54bb 100644 --- a/build/signingcosmwasmclient.js +++ b/build/signingcosmwasmclient.js -@@ -86,6 +86,10 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { +@@ -85,7 +85,12 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { + if (!accountFromSigner) { throw new Error("Failed to retrieve account from signer"); } ++ const pubkey = (0, amino_1.encodeSecp256k1Pubkey)(accountFromSigner.pubkey); + if (signerAddress.startsWith('inj')) { + pubkey['typeUrl'] = '/injective.crypto.v1beta1.ethsecp256k1.PubKey'; @@ -28,7 +30,7 @@ index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..a940d39b781dbd0e20a19411fe25d9b8 const { sequence } = await this.getSequence(signerAddress); const { gasInfo } = await this.forceGetQueryClient().tx.simulate(anyMsgs, memo, pubkey, sequence); (0, utils_1.assertDefined)(gasInfo); -@@ -107,7 +111,8 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { +@@ -107,7 +112,8 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { throw new Error(createDeliverTxResponseErrorMessage(result)); } const parsedLogs = stargate_1.logs.parseRawLog(result.rawLog); @@ -38,7 +40,7 @@ index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..a940d39b781dbd0e20a19411fe25d9b8 return { checksum: (0, encoding_1.toHex)((0, crypto_1.sha256)(wasmCode)), originalSize: wasmCode.length, -@@ -388,6 +393,10 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { +@@ -388,6 +394,10 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { throw new Error("Failed to retrieve account from signer"); } const pubkey = (0, proto_signing_1.encodePubkey)((0, amino_1.encodeSecp256k1Pubkey)(accountFromSigner.pubkey)); @@ -49,16 +51,6 @@ index 2780b8c5ff5ed95c1e3a2994266279d1d682d994..a940d39b781dbd0e20a19411fe25d9b8 const signMode = signing_1.SignMode.SIGN_MODE_LEGACY_AMINO_JSON; const msgs = messages.map((msg) => this.aminoTypes.toAmino(msg)); const signDoc = (0, amino_1.makeSignDoc)(msgs, fee, chainId, memo, accountNumber, sequence); -@@ -416,6 +425,9 @@ class SigningCosmWasmClient extends cosmwasmclient_1.CosmWasmClient { - throw new Error("Failed to retrieve account from signer"); - } - const pubkey = (0, proto_signing_1.encodePubkey)((0, amino_1.encodeSecp256k1Pubkey)(accountFromSigner.pubkey)); -+ if (signerAddress.startsWith('inj')) { -+ pubkey['typeUrl'] = '/injective.crypto.v1beta1.ethsecp256k1.PubKey'; -+ } - const txBody = { - typeUrl: "/cosmos.tx.v1beta1.TxBody", - value: { diff --git a/package.json b/package.json index b073b4317319dbfd761befe3d163bfe6a00dbcef..293b53bdc5e9a62f624de27ee562ae9677f670d8 100644 --- a/package.json diff --git a/scripts/pnpm-lock.yaml b/scripts/pnpm-lock.yaml index 0956a649..bc1ee573 100644 --- a/scripts/pnpm-lock.yaml +++ b/scripts/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: patchedDependencies: '@cosmjs/cosmwasm-stargate@0.31.0': - hash: cu4322e3ou7zilwfoydhfcb2te + hash: kqg7wqittjmd6q55ctq6eck7yq path: patches/@cosmjs__cosmwasm-stargate@0.31.0.patch dependencies: @@ -21,7 +21,7 @@ dependencies: version: 0.25.6 '@cosmjs/cosmwasm-stargate': specifier: ^0.31.0 - version: 0.31.0(patch_hash=cu4322e3ou7zilwfoydhfcb2te) + version: 0.31.0(patch_hash=kqg7wqittjmd6q55ctq6eck7yq) '@cosmjs/crypto': specifier: ^0.31.0 version: 0.31.0 @@ -37,6 +37,9 @@ dependencies: '@cosmjs/tendermint-rpc': specifier: 0.31.0 version: 0.31.0 + '@injectivelabs/sdk-ts': + specifier: ^1.14.5 + version: 1.14.5 axios: specifier: ^1.6.2 version: 1.6.2 @@ -78,6 +81,39 @@ devDependencies: packages: + /@apollo/client@3.8.9(graphql@16.8.1): + resolution: {integrity: sha512-IcQDFEEPc9+PEQsxhxQvsoQ04BRarOzi/Ila5PcniRSDeKJWgY22dnp6+V1i1fWXRDVd1ybdvze4sFESDVQUCQ==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) + '@wry/equality': 0.5.7 + '@wry/trie': 0.5.0 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + hoist-non-react-statics: 3.3.2 + optimism: 0.18.0 + prop-types: 15.8.1 + response-iterator: 0.2.6 + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.6.2 + zen-observable-ts: 1.2.5 + dev: false + /@confio/ics23@0.6.8: resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} dependencies: @@ -103,6 +139,15 @@ packages: '@cosmjs/utils': 0.31.1 dev: false + /@cosmjs/amino@0.31.3: + resolution: {integrity: sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw==} + dependencies: + '@cosmjs/crypto': 0.31.3 + '@cosmjs/encoding': 0.31.3 + '@cosmjs/math': 0.31.3 + '@cosmjs/utils': 0.31.3 + dev: false + /@cosmjs/cosmwasm-launchpad@0.25.6: resolution: {integrity: sha512-rzpYg/A8tvXbY6p89LabPB1mqCtTUv+33nN+s+VWMH0oOl0LSIgLE0yIT61kwTaf2dWQvRVeFaiRLFC72/w/zw==} dependencies: @@ -116,7 +161,7 @@ packages: - debug dev: false - /@cosmjs/cosmwasm-stargate@0.31.0(patch_hash=cu4322e3ou7zilwfoydhfcb2te): + /@cosmjs/cosmwasm-stargate@0.31.0(patch_hash=kqg7wqittjmd6q55ctq6eck7yq): resolution: {integrity: sha512-l6aX++3LhaAGZO46qIgrrNF40lYhOrdPfl35Z32ks6Wf3mwgbQEZwaxnoGzwUePY7/yaIiEFJ1JO6MlVPZVuag==} dependencies: '@cosmjs/amino': 0.31.0 @@ -184,6 +229,18 @@ packages: libsodium-wrappers-sumo: 0.7.11 dev: false + /@cosmjs/crypto@0.31.3: + resolution: {integrity: sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ==} + dependencies: + '@cosmjs/encoding': 0.31.3 + '@cosmjs/math': 0.31.3 + '@cosmjs/utils': 0.31.3 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers-sumo: 0.7.11 + dev: false + /@cosmjs/encoding@0.25.6: resolution: {integrity: sha512-0imUOB8XkUstI216uznPaX1hqgvLQ2Xso3zJj5IV5oJuNlsfDj9nt/iQxXWbJuettc6gvrFfpf+Vw2vBZSZ75g==} dependencies: @@ -208,6 +265,14 @@ packages: readonly-date: 1.0.0 dev: false + /@cosmjs/encoding@0.31.3: + resolution: {integrity: sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + /@cosmjs/json-rpc@0.31.1: resolution: {integrity: sha512-gIkCj2mUDHAxvmJnHtybXtMLZDeXrkDZlujjzhvJlWsIuj1kpZbKtYqh+eNlfwhMkMMAlQa/y4422jDmizW+ng==} dependencies: @@ -247,6 +312,12 @@ packages: bn.js: 5.2.1 dev: false + /@cosmjs/math@0.31.3: + resolution: {integrity: sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A==} + dependencies: + bn.js: 5.2.1 + dev: false + /@cosmjs/proto-signing@0.31.0: resolution: {integrity: sha512-JNlyOJRkn8EKB9mCthkjr6lVX6eyVQ09PFdmB4/DR874E62dFTvQ+YvyKMAgN7K7Dcjj26dVlAD3f6Xs7YOGDg==} dependencies: @@ -259,6 +330,18 @@ packages: long: 4.0.0 dev: false + /@cosmjs/proto-signing@0.31.3: + resolution: {integrity: sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA==} + dependencies: + '@cosmjs/amino': 0.31.3 + '@cosmjs/crypto': 0.31.3 + '@cosmjs/encoding': 0.31.3 + '@cosmjs/math': 0.31.3 + '@cosmjs/utils': 0.31.3 + cosmjs-types: 0.8.0 + long: 4.0.0 + dev: false + /@cosmjs/socket@0.31.1: resolution: {integrity: sha512-XTtEr+x3WGbqkzoGX0sCkwVqf5n+bBqDwqNgb+DWaBABQxHVRuuainrTVp0Yc91D3Iy2twLQzeBA9OrRxDSerw==} dependencies: @@ -329,6 +412,10 @@ packages: resolution: {integrity: sha512-n4Se1wu4GnKwztQHNFfJvUeWcpvx3o8cWhSbNs9JQShEuB3nv3R5lqFBtDCgHZF/emFQAP+ZjF8bTfCs9UBGhA==} dev: false + /@cosmjs/utils@0.31.3: + resolution: {integrity: sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA==} + dev: false + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -336,6 +423,14 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@ensdomains/ens-validation@0.1.0: + resolution: {integrity: sha512-rbDh2K6GfqXvBcJUISaTTYEt3f079WA4ohTE5Lh4/8EaaPAk/9vk3EisMUQV2UVxeFIZQEEyRCIOmRTpqN0W7A==} + dev: false + + /@ensdomains/eth-ens-namehash@2.0.15: + resolution: {integrity: sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw==} + dev: false + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -534,6 +629,528 @@ packages: dev: true optional: true + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: false + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: false + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: false + + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: false + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: false + + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: false + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: false + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: false + + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: false + + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: false + + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 16.8.1 + dev: false + + /@injectivelabs/core-proto-ts@0.0.21: + resolution: {integrity: sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==} + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + google-protobuf: 3.21.2 + protobufjs: 7.2.5 + rxjs: 7.8.1 + dev: false + + /@injectivelabs/dmm-proto-ts@1.0.19: + resolution: {integrity: sha512-2FCzCziy1RhzmnkAVIU+Asby/GXAVQqKt5/o1s52j0LJXfJMpiCrV6soLfnjTebj61T+1WvJBPFoZCCiVYBpcw==} + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + google-protobuf: 3.21.2 + protobufjs: 7.2.5 + rxjs: 7.8.1 + dev: false + + /@injectivelabs/exceptions@1.14.5(google-protobuf@3.21.2): + resolution: {integrity: sha512-WQ+hxpKz4g4+ZXNTXLFKpf9D9uosleZLqC++2+wK81IQ/lcwi5GrTLYdasOhJeu3c+LKWxHQRHJfSsvt8TQWbA==} + requiresBuild: true + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + '@injectivelabs/ts-types': 1.14.5 + http-status-codes: 2.3.0 + link-module-alias: 1.2.0 + shx: 0.3.4 + transitivePeerDependencies: + - google-protobuf + dev: false + + /@injectivelabs/grpc-web-node-http-transport@0.0.2(@injectivelabs/grpc-web@0.0.1): + resolution: {integrity: sha512-rpyhXLiGY/UMs6v6YmgWHJHiO9l0AgDyVNv+jcutNVt4tQrmNvnpvz2wCAGOFtq5LuX/E9ChtTVpk3gWGqXcGA==} + peerDependencies: + '@injectivelabs/grpc-web': '>=0.0.1' + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + dev: false + + /@injectivelabs/grpc-web-react-native-transport@0.0.2(@injectivelabs/grpc-web@0.0.1): + resolution: {integrity: sha512-mk+aukQXnYNgPsPnu3KBi+FD0ZHQpazIlaBZ2jNZG7QAVmxTWtv3R66Zoq99Wx2dnE946NsZBYAoa0K5oSjnow==} + peerDependencies: + '@injectivelabs/grpc-web': '>=0.0.1' + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + dev: false + + /@injectivelabs/grpc-web@0.0.1(google-protobuf@3.21.2): + resolution: {integrity: sha512-Pu5YgaZp+OvR5UWfqbrPdHer3+gDf+b5fQoY+t2VZx1IAVHX8bzbN9EreYTvTYtFeDpYRWM8P7app2u4EX5wTw==} + peerDependencies: + google-protobuf: ^3.14.0 + dependencies: + browser-headers: 0.4.1 + google-protobuf: 3.21.2 + dev: false + + /@injectivelabs/indexer-proto-ts@1.11.32: + resolution: {integrity: sha512-gCkbMlBq34MY2xZcauDEsCP0h5l/FgKMwCgJ8aWGaTkh27XBWpl1zvlreuWg/IpSvTPJZBoADW9KqixqyoBdJw==} + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + google-protobuf: 3.21.2 + protobufjs: 7.2.5 + rxjs: 7.8.1 + dev: false + + /@injectivelabs/mito-proto-ts@1.0.55: + resolution: {integrity: sha512-clFKpU/LCYvYiPg5PRjhVJFTxKcfJHzaj5saJHuL32LaOaB3Rd8L3CqP9qUrg78L7eKjjXjyG97U3NdRdZBlWg==} + dependencies: + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + google-protobuf: 3.21.2 + protobufjs: 7.2.5 + rxjs: 7.8.1 + dev: false + + /@injectivelabs/networks@1.14.5(google-protobuf@3.21.2): + resolution: {integrity: sha512-9GINd/pPBX6Jyc26pmlLC54s7nLlXsBLZ/1fo8a0nvHkrrODRDE4IldP6KsA9OLVomMPk5TyBUgYLGgM3ST9GA==} + requiresBuild: true + dependencies: + '@injectivelabs/exceptions': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/ts-types': 1.14.5 + '@injectivelabs/utils': 1.14.5(google-protobuf@3.21.2) + link-module-alias: 1.2.0 + shx: 0.3.4 + transitivePeerDependencies: + - debug + - google-protobuf + dev: false + + /@injectivelabs/sdk-ts@1.14.5: + resolution: {integrity: sha512-j/6EcvNgQn563L0P5x80cZDTbYYbsXmHgtIbj8DCzemzgPRadmZLtlMDBjMQZ0ZcMhDSMfVOCINBOB2bBz2qMw==} + requiresBuild: true + dependencies: + '@apollo/client': 3.8.9(graphql@16.8.1) + '@cosmjs/amino': 0.31.3 + '@cosmjs/proto-signing': 0.31.3 + '@cosmjs/stargate': 0.31.0 + '@ensdomains/ens-validation': 0.1.0 + '@ensdomains/eth-ens-namehash': 2.0.15 + '@ethersproject/bytes': 5.7.0 + '@injectivelabs/core-proto-ts': 0.0.21 + '@injectivelabs/dmm-proto-ts': 1.0.19 + '@injectivelabs/exceptions': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/grpc-web': 0.0.1(google-protobuf@3.21.2) + '@injectivelabs/grpc-web-node-http-transport': 0.0.2(@injectivelabs/grpc-web@0.0.1) + '@injectivelabs/grpc-web-react-native-transport': 0.0.2(@injectivelabs/grpc-web@0.0.1) + '@injectivelabs/indexer-proto-ts': 1.11.32 + '@injectivelabs/mito-proto-ts': 1.0.55 + '@injectivelabs/networks': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/test-utils': 1.14.3 + '@injectivelabs/token-metadata': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/ts-types': 1.14.5 + '@injectivelabs/utils': 1.14.5(google-protobuf@3.21.2) + '@metamask/eth-sig-util': 4.0.1 + axios: 0.27.2 + bech32: 2.0.0 + bip39: 3.1.0 + cosmjs-types: 0.7.2 + ethereumjs-util: 7.1.5 + ethers: 5.7.2 + google-protobuf: 3.21.2 + graphql: 16.8.1 + http-status-codes: 2.3.0 + js-sha3: 0.8.0 + jscrypto: 1.0.3 + keccak256: 1.0.6 + link-module-alias: 1.2.0 + secp256k1: 4.0.3 + shx: 0.3.4 + snakecase-keys: 5.5.0 + transitivePeerDependencies: + - bufferutil + - debug + - graphql-ws + - react + - react-dom + - subscriptions-transport-ws + - utf-8-validate + dev: false + + /@injectivelabs/test-utils@1.14.3: + resolution: {integrity: sha512-dVe262sACa7YkRr7mfXx58yI/ieuQqm3IMGq7EMweFKI6Kh2gh8FAM2bsDgm1cGewEIhJ9tWh6OM5uNheeVamg==} + requiresBuild: true + dependencies: + axios: 0.21.4 + bignumber.js: 9.1.2 + link-module-alias: 1.2.0 + shx: 0.3.4 + snakecase-keys: 5.5.0 + store2: 2.14.2 + transitivePeerDependencies: + - debug + dev: false + + /@injectivelabs/token-metadata@1.14.5(google-protobuf@3.21.2): + resolution: {integrity: sha512-GiIiNDixfvbfEjzZG7ixtGYmJllFIcA2Xl1LnsK5yawT8Q+/SoSIJig4tE+0CC/AaGHS1GxDKySrIdMse7PZ0w==} + requiresBuild: true + dependencies: + '@injectivelabs/exceptions': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/networks': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/ts-types': 1.14.5 + '@injectivelabs/utils': 1.14.5(google-protobuf@3.21.2) + '@types/lodash.values': 4.3.9 + copyfiles: 2.4.1 + jsonschema: 1.4.1 + link-module-alias: 1.2.0 + lodash: 4.17.21 + lodash.values: 4.3.0 + shx: 0.3.4 + transitivePeerDependencies: + - debug + - google-protobuf + dev: false + + /@injectivelabs/ts-types@1.14.5: + resolution: {integrity: sha512-dwmEJE90vMr1zkQhz5lX2280sBMe2GvAj98vOHoL2RLTo0OQkJZrirUHwsTkexJf7sFZIT2PlmLCfix9Ulcp5A==} + requiresBuild: true + dependencies: + link-module-alias: 1.2.0 + shx: 0.3.4 + dev: false + + /@injectivelabs/utils@1.14.5(google-protobuf@3.21.2): + resolution: {integrity: sha512-L2ul/7rgop8RLJBhlXjt6Q/A6fXeRZ3hhCZFXGXmA63vz9RSqOFHILiRp6hAFsuZbiITjmVx0eubFPaQU0MymA==} + requiresBuild: true + dependencies: + '@injectivelabs/exceptions': 1.14.5(google-protobuf@3.21.2) + '@injectivelabs/ts-types': 1.14.5 + axios: 0.21.4 + bignumber.js: 9.1.2 + http-status-codes: 2.3.0 + link-module-alias: 1.2.0 + shx: 0.3.4 + snakecase-keys: 5.5.0 + store2: 2.14.2 + transitivePeerDependencies: + - debug + - google-protobuf + dev: false + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -550,6 +1167,17 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@metamask/eth-sig-util@4.0.1: + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + dev: false + /@noble/hashes@1.3.1: resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} engines: {node: '>= 16'} @@ -614,10 +1242,32 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true + /@types/bn.js@4.11.6: + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + dependencies: + '@types/node': 20.4.4 + dev: false + + /@types/bn.js@5.1.5: + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + dependencies: + '@types/node': 20.4.4 + dev: false + /@types/js-yaml@4.0.8: resolution: {integrity: sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==} dev: true + /@types/lodash.values@4.3.9: + resolution: {integrity: sha512-IJ20OEfqNwm3k8ENwoM3q0yOs4UMpgtD4GqxB4lwBHToGthHWqhyh5DdSgQjioocz0QK2SSBkJfCq95ZTV8BTw==} + dependencies: + '@types/lodash': 4.14.202 + dev: false + + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + dev: false + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -625,6 +1275,53 @@ packages: /@types/node@20.4.4: resolution: {integrity: sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==} + /@types/pbkdf2@3.1.2: + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + dependencies: + '@types/node': 20.4.4 + dev: false + + /@types/secp256k1@4.0.6: + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + dependencies: + '@types/node': 20.4.4 + dev: false + + /@wry/caches@1.0.1: + resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@wry/context@0.7.4: + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@wry/equality@0.5.7: + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@wry/trie@0.4.3: + resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + + /@wry/trie@0.5.0: + resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -636,6 +1333,29 @@ packages: hasBin: true dev: true + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -663,6 +1383,15 @@ packages: - debug dev: false + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + /axios@1.6.2: resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: @@ -673,6 +1402,16 @@ packages: - debug dev: false + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false @@ -681,12 +1420,24 @@ packages: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} dev: false + /bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + dev: false + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: false + /bip39@3.1.0: resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} dependencies: '@noble/hashes': 1.3.1 dev: false + /blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + dev: false + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} dev: false @@ -695,14 +1446,106 @@ packages: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: false + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} dev: false + /browser-headers@0.4.1: + resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==} + dev: false + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + dev: false + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: false + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -720,6 +1563,34 @@ packages: engines: {node: '>=16'} dev: false + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /copyfiles@2.4.1: + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + hasBin: true + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + noms: 0.0.0 + through2: 2.0.5 + untildify: 4.0.0 + yargs: 16.2.0 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmjs-types@0.7.2: + resolution: {integrity: sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + /cosmjs-types@0.8.0: resolution: {integrity: sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==} dependencies: @@ -727,6 +1598,27 @@ packages: protobufjs: 6.11.4 dev: false + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: false + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: false + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -754,6 +1646,13 @@ packages: engines: {node: '>=0.3.1'} dev: true + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: @@ -766,6 +1665,10 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: false + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -796,12 +1699,125 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true + /ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + dev: false + + /ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + dev: false + + /ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.4 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + dev: false + + /ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/bn.js': 5.1.5 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + dev: false + + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + dev: false + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: false @@ -825,6 +1841,10 @@ packages: mime-types: 2.1.35 dev: false + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -837,6 +1857,15 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -852,6 +1881,17 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -859,6 +1899,30 @@ packages: define-properties: 1.2.0 dev: false + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graphql-tag@2.12.6(graphql@16.8.1): + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 16.8.1 + tslib: 2.6.2 + dev: false + + /graphql@16.8.1: + resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: @@ -898,6 +1962,13 @@ packages: minimalistic-assert: 1.0.1 dev: false + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: @@ -906,14 +1977,64 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: false + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: false + /inversify@6.0.1: resolution: {integrity: sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==} dev: false + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + /isomorphic-ws@4.0.1(ws@7.5.9): resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -926,6 +2047,10 @@ packages: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} dev: false + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -934,6 +2059,33 @@ packages: esprima: 4.0.1 dev: true + /jscrypto@1.0.3: + resolution: {integrity: sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==} + hasBin: true + dev: false + + /jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: false + + /keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + keccak: 3.0.4 + dev: false + + /keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + readable-stream: 3.6.2 + dev: false + /libsodium-sumo@0.7.11: resolution: {integrity: sha512-bY+7ph7xpk51Ez2GbE10lXAQ5sJma6NghcIDaSPbM/G9elfrjLa0COHl/7P6Wb/JizQzl5UQontOOP1z0VwbLA==} dev: false @@ -954,14 +2106,60 @@ packages: resolution: {integrity: sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A==} dev: false + /link-module-alias@1.2.0: + resolution: {integrity: sha512-ahPjXepbSVKbahTB6LxR//VHm8HPfI+QQygCH+E82spBY4HR5VPJTvlhKBc9F7muVxnS6C1rRfoPOXAbWO/fyw==} + engines: {node: '> 8.0.0'} + hasBin: true + dependencies: + chalk: 2.4.2 + dev: false + + /lodash.values@4.3.0: + resolution: {integrity: sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: false + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: false + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -982,9 +2180,14 @@ packages: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} dev: false + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -993,15 +2196,96 @@ packages: minimist: 1.2.8 dev: true + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: false + + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + dev: false + + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + dev: false + + /noms@0.0.0: + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + dependencies: + inherits: 2.0.4 + readable-stream: 1.0.34 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: false + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /optimism@0.18.0: + resolution: {integrity: sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==} + dependencies: + '@wry/caches': 1.0.1 + '@wry/context': 0.7.4 + '@wry/trie': 0.4.3 + tslib: 2.6.2 + dev: false + /pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} dev: false + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + /protobufjs@6.11.4: resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true @@ -1022,10 +2306,60 @@ packages: long: 4.0.0 dev: false + /protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.4.4 + long: 5.2.3 + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1043,14 +2377,40 @@ packages: resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} dev: false + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.8 + dev: false + /reflect-metadata@0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /response-iterator@0.2.6: + resolution: {integrity: sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==} + engines: {node: '>=0.8'} + dev: false + /ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: @@ -1058,10 +2418,45 @@ packages: inherits: 2.0.4 dev: false + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + dependencies: + bn.js: 5.2.1 + dev: false + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: false + + /secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + elliptic: 6.5.4 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + dev: false + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + /sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true @@ -1070,6 +2465,41 @@ packages: safe-buffer: 5.2.1 dev: false + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: false + + /shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + dependencies: + minimist: 1.2.8 + shelljs: 0.8.5 + dev: false + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /snakecase-keys@5.5.0: + resolution: {integrity: sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw==} + engines: {node: '>=12'} + dependencies: + map-obj: 4.3.0 + snake-case: 3.0.4 + type-fest: 3.13.1 + dev: false + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -1086,17 +2516,85 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true + /store2@2.14.2: + resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: false + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + /symbol-observable@2.0.3: resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} engines: {node: '>=0.10'} dev: false + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + dev: false + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: false + + /ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.2 + dev: false + /ts-node@10.9.1(@types/node@20.4.4)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -1150,6 +2648,10 @@ packages: ts-node: 6.2.0 dev: true + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + /tsx@3.13.0: resolution: {integrity: sha512-rjmRpTu3as/5fjNq/kOkOtihgLxuIz6pbKdj9xwP4J5jOLkBxw/rjN5ANw+KyrrOXV5uB7HC8+SrrSJxT65y+A==} hasBin: true @@ -1161,12 +2663,30 @@ packages: fsevents: 2.3.3 dev: true + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + dev: false + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: false + + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: false + /typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true dev: true + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -1175,6 +2695,32 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -1195,6 +2741,34 @@ packages: symbol-observable: 2.0.3 dev: false + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + /yn@2.0.0: resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} engines: {node: '>=4'} @@ -1204,3 +2778,13 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true + + /zen-observable-ts@1.2.5: + resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + dependencies: + zen-observable: 0.8.15 + dev: false + + /zen-observable@0.8.15: + resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + dev: false diff --git a/scripts/save.json b/scripts/save.json deleted file mode 100644 index baa4e076..00000000 --- a/scripts/save.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "contracts": { - "hpl_hook_aggregate": { - "codeId": 6176, - "digest": "977813f4f02201c87678e5a7e9d9ad6c184f0e6031cdf3a3a72b796b3f88ab00" - }, - "hpl_hook_merkle": { - "codeId": 6177, - "digest": "c2f6065fa75c334e7d3423cd23da1a8147ac9b8971e91c5771b1d846e457b62b" - }, - "hpl_hook_pausable": { - "codeId": 6178, - "digest": "6a5087d4ebecec08439a73f2e45d7bc07f384dc1d60e63dbb0fedac891364a18" - }, - "hpl_hook_routing": { - "codeId": 6179, - "digest": "3218ea7b5758f33575ebeada23bdb58323444ed8c3ccb5fcc79eede5fa5ad5f7" - }, - "hpl_hook_routing_custom": { - "codeId": 6180, - "digest": "88e78b2073577f6122ff6e910a3710c5f5523ae8b27d38f221fa26b74e9b9d26" - }, - "hpl_hook_routing_fallback": { - "codeId": 6181, - "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" - }, - "hpl_igp": { - "address": "inj1zju872205d4v6m7p8gjfrkqgth6muf50vcxk7t", - "codeId": 6182, - "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" - }, - "hpl_igp_oracle": { - "address": "inj13qzhseqr54vqtt57zm79p4t7qcrlsvmv6m5g37", - "codeId": 6183, - "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" - }, - "hpl_ism_aggregate": { - "codeId": 6184, - "digest": "e1dee705d3500d1c21c209de42910ce3559138743246a3bd1dfddd8fb9d36620" - }, - "hpl_ism_multisig": { - "codeId": 6185, - "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91" - }, - "hpl_ism_pausable": { - "codeId": 6186, - "digest": "ea99783338118ad18cd81f6a3924a9826a328333314791a6379d5fdc940fd54d" - }, - "hpl_ism_routing": { - "codeId": 6187, - "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" - }, - "hpl_mailbox": { - "address": "inj14wh3ulp9kwv023hpgay75559m5w9f6muus28c5", - "codeId": 6188, - "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" - }, - "hpl_test_mock_hook": { - "codeId": 6189, - "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" - }, - "hpl_test_mock_msg_receiver": { - "address": "inj1zg7k8gcpt55v2y6jp0aas7rgytwt9jvhtyx80z", - "codeId": 6190, - "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" - }, - "hpl_validator_announce": { - "address": "inj1u6vljdpdeljvzlpm5wezjpwj08es08ywypcyu5", - "codeId": 6191, - "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" - }, - "hpl_warp_cw20": { - "codeId": 6192, - "digest": "5a292442e9f5107a66e85faf61bb23172f7c713ef2fe7733daf4c5870493b5a5" - }, - "hpl_warp_native": { - "codeId": 6193, - "digest": "5a50fe598804046dd787113af85154be5df938458463388129ff79d5971531b6" - }, - "hpl_default_ism": { - "codeId": 6185, - "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91", - "address": "inj155gpjxrz2tcf6203z339akkscc8ve0gssghr0s" - }, - "hpl_default_hook": { - "codeId": 6189, - "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", - "address": "inj120kxmy7u0cf6t53k2ftpghdmcmnm0x48tuhz0w" - }, - "hpl_required_hook": { - "codeId": 6189, - "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", - "address": "inj1jw97fkpays529hg8qz0vke4tcrl7lve30p4upz" - } - }, - "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" -} \ No newline at end of file From 3f772741e0ea99e3fd0dd409dbb648fc31654e4e Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 12 Jan 2024 16:29:32 -0500 Subject: [PATCH 21/31] Send message to goerli --- scripts/action/mailbox.ts | 15 +++++++++------ scripts/context/injective-1.json | 25 +++++++++++-------------- scripts/context/terminal-output | 7 +++++++ 3 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 scripts/context/terminal-output diff --git a/scripts/action/mailbox.ts b/scripts/action/mailbox.ts index bd40ea1a..811f8d05 100644 --- a/scripts/action/mailbox.ts +++ b/scripts/action/mailbox.ts @@ -1,14 +1,17 @@ +// prevents "TypeError: Reflect.hasOwnMetadata is not a function" +import "reflect-metadata"; + import { ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { Command } from "commander"; import { version } from "../package.json"; import { config, getSigningClient } from "../src/config"; import { - HplHookMerkle, - HplIgp, - HplIgpOracle, - HplIsmAggregate, - HplMailbox, + HplHookMerkle, + HplIgp, + HplIgpOracle, + HplIsmAggregate, + HplMailbox, } from "../src/contracts"; import { addPad } from "../src/conv"; import { loadContext } from "../src/load_context"; @@ -83,7 +86,7 @@ function makeHandler( msg_body: Buffer.from(msg_body, "utf-8").toString("hex"), }, }, - [{ denom: "token", amount: "26000000" }] + [{ denom: "inj", amount: "2500" }] ); console.log(parseWasmEventLog(res)); }; diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json index fc2e214c..dd6f321a 100644 --- a/scripts/context/injective-1.json +++ b/scripts/context/injective-1.json @@ -25,12 +25,12 @@ "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" }, "hpl_igp": { - "address": "inj1u70j2p7zsc3vlapyh6u2sar8wz9k9njqt9u0vy", + "address": "inj1ezjuhmkdpa7svfsccfsntshfsse9855l0cm8ph", "codeId": 6182, "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" }, "hpl_igp_oracle": { - "address": "inj1627vkljz6dxq8jq5423p8pln3qhu3qgzmajy2f", + "address": "inj1xra3jscyaffvgv6f0zmy2w3tw5um2c5daspv25", "codeId": 6183, "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" }, @@ -51,7 +51,7 @@ "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" }, "hpl_mailbox": { - "address": "inj1ralyv2xnzga08s70v6ncfglp9glu7gwgds4el8", + "address": "inj10w6ulrndlzlgzlhj7uwp37utunyfk6vhudjnxf", "codeId": 6188, "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" }, @@ -60,12 +60,12 @@ "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" }, "hpl_test_mock_msg_receiver": { - "address": "inj1xaevlalutahaphep3c02y250px7cpgqne4avfx", + "address": "inj12hh0vcyzpseglymykwcshzn2sccr8ul32ezrly", "codeId": 6190, "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" }, "hpl_validator_announce": { - "address": "inj1zw7wz7dd3wtdgwd4e358q0d9pvcs72zhzfak0l", + "address": "inj1p96kge7yvvawcpvzqlvmzkmvhdqvyukv896k3y", "codeId": 6191, "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" }, @@ -80,18 +80,15 @@ "hpl_default_ism": { "codeId": 6185, "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91", - "address": "inj12s96znn087acwv0pzs64nvnpqcq8hru7lnmn7z" + "address": "inj1w50jz93a4ypaxsj8ga3waw8s55enc4p9y8j2uj" }, "hpl_default_hook": { - "codeId": 6189, - "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", - "address": "inj1evwugy02r8cpunp2qwxmwes5d25ljjthuuuh7f" + "address": "inj1ezjuhmkdpa7svfsccfsntshfsse9855l0cm8ph" }, "hpl_required_hook": { - "codeId": 6189, - "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4", - "address": "inj1tv02afkjs8nel7xgdmayv4q6tk7zcdzzxzyark" + "codeId": 6177, + "digest": "c2f6065fa75c334e7d3423cd23da1a8147ac9b8971e91c5771b1d846e457b62b", + "address": "inj1z09d0ljz46dm95qvqcpk7ly3r7pupvslcmpnjc" } - }, - "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" + } } diff --git a/scripts/context/terminal-output b/scripts/context/terminal-output new file mode 100644 index 00000000..dd252b1c --- /dev/null +++ b/scripts/context/terminal-output @@ -0,0 +1,7 @@ +hpl_mailbox | inj10w6ulrndlzlgzlhj7uwp37utunyfk6vhudjnxf | 7bb5cf8e6df8be817ef2f71c18fb8be4c89b6997 | BF9CE7698F53BE69AC30CFA8EAF62BA1593B27E0233B573699AC4886D8F10F3B +hpl_validator_announce | inj1p96kge7yvvawcpvzqlvmzkmvhdqvyukv896k3y | 09756467c4633aec058207d9b15b6cbb40c272cc | 6DC8C0FDBA1D27C26121965F498C7B3330957F52CA013DB25572B9DF1F3E12A9 +hpl_igp | inj1ezjuhmkdpa7svfsccfsntshfsse9855l0cm8ph | c8a5cbeecd0f7d062618c26135c2e9843253d29f | 1D45BD322F50424EBAB0AB5F8C97786B6E139130EF0497D666DAFBA4BC43EA86 +hpl_igp_oracle | inj1xra3jscyaffvgv6f0zmy2w3tw5um2c5daspv25 | 30fb194304ea52c4334978b6453a2b7539b5628d | A7246D0F8B56242AB96D606A4AD444BFC1CD3F7A0D0BA8FD1A38CE460D6A835E +hpl_ism_multisig | inj1w50jz93a4ypaxsj8ga3waw8s55enc4p9y8j2uj | 751f21163da903d342474762eeb8f0a5333c5425 | 9F574E39EA090AA2CB0DBFFD807B66CFDAC54EFEF68FA8FB365CF1CB605B5998 +hpl_hook_merkle | inj1z09d0ljz46dm95qvqcpk7ly3r7pupvslcmpnjc | 13cad7fe42ae9bb2d00c06036f7c911f83c0b21f | BA47A0BED33785A4978F3C04DAEEB08C909E5C21DBEEBB56460264C35E2A6D96 +hpl_test_mock_msg_receiver | inj12hh0vcyzpseglymykwcshzn2sccr8ul32ezrly | 55eef660820c328f9364b3b10b8a6a863033f3f1 | 37E440CA32C86DA850FAC9C561635C201729FD5206B8D50C72658A8645C4D0DA From 04468ba1896b416ac97aa7a85ea638916460f467 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 16 Jan 2024 17:39:13 -0500 Subject: [PATCH 22/31] Fix renaming --- .github/workflows/test.yaml | 8 ++++---- Makefile | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 90919b87..d67cf536 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,13 +30,13 @@ jobs: key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Rust - run: rustup update 1.69 + run: rustup update 1.72 - name: Install rename run: sudo apt-get install -y rename - - name: Install target - run: rustup target add wasm32-unknown-unknown + - name: Install rust deps + run: make install - name: Run tests run: cargo test --workspace --exclude hpl-tests @@ -44,7 +44,7 @@ jobs: - name: Build wasm run: make ci-build - - name: Upload artifacts + - name: Upload wasm archive uses: actions/upload-artifact@v2 with: name: wasm_codes diff --git a/Makefile b/Makefile index 1abcc23b..3c2b8962 100644 --- a/Makefile +++ b/Makefile @@ -1,22 +1,22 @@ - clean: @cargo clean @rm -rf ./artifacts +install: + cargo install cw-optimizoor cosmwasm-check beaker + rustup target add wasm32-unknown-unknown + schema: ls ./contracts | xargs -n 1 -t beaker wasm ts-gen -ci-build: - cargo install cw-optimizoor --force - cargo cw-optimizoor - rename 's/(.*)(-x86_64)(.*)/$1$3/d' * - cd artifacts && zip -r ../wasm_codes.zip * && cd ../ - build: + cargo build cargo wasm - -build-dev: clean cargo cw-optimizoor + rename --force 's/(.*)-(.*)\.wasm/$$1\.wasm/d' artifacts/* -check: build-dev +check: build ls -d ./artifacts/*.wasm | xargs -I x cosmwasm-check x + +ci-build: check + zip -jr wasm_codes.zip artifacts From ddb174b1b77b24b13a9b1beb7210c73955bb9ff3 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 16 Jan 2024 17:41:34 -0500 Subject: [PATCH 23/31] Fix makefile indentation --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3c2b8962..9c0c898d 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ clean: install: cargo install cw-optimizoor cosmwasm-check beaker - rustup target add wasm32-unknown-unknown + rustup target add wasm32-unknown-unknown schema: ls ./contracts | xargs -n 1 -t beaker wasm ts-gen From 189ecf3ed7ada06f37905f1fab6a4828521f5230 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Tue, 16 Jan 2024 17:51:26 -0500 Subject: [PATCH 24/31] Force cargo install --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9c0c898d..a7b1cf3e 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ clean: @rm -rf ./artifacts install: - cargo install cw-optimizoor cosmwasm-check beaker + cargo install --force cw-optimizoor cosmwasm-check beaker rustup target add wasm32-unknown-unknown schema: From 05c34f75077fae70bb2e9847d5c92ad36522e229 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 19 Jan 2024 12:47:22 -0500 Subject: [PATCH 25/31] simple fee hook (#6) * Implement simple fee hook * Address pr comments * Fix unit tests * Make set fee only owner * Implement remaining unit tests * Fix merkle integration test use --------- Co-authored-by: nambrot Co-authored-by: ByeongSu Hong --- .github/workflows/test.yaml | 2 +- Cargo.toml | 1 + contracts/core/mailbox/src/execute.rs | 74 ++---- contracts/hooks/fee/Cargo.toml | 42 +++ contracts/hooks/fee/src/lib.rs | 275 ++++++++++++++++++++ contracts/hooks/merkle/src/lib.rs | 16 +- integration-test/tests/contracts/cw/hook.rs | 1 - packages/interface/src/hook/fee.rs | 83 ++++++ packages/interface/src/hook/merkle.rs | 5 - packages/interface/src/hook/mod.rs | 1 + 10 files changed, 430 insertions(+), 70 deletions(-) create mode 100644 contracts/hooks/fee/Cargo.toml create mode 100644 contracts/hooks/fee/src/lib.rs create mode 100644 packages/interface/src/hook/fee.rs diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e010b368..1cbe220c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -65,7 +65,7 @@ jobs: uses: taiki-e/install-action@cargo-llvm-cov - name: Generate code coverage - run: cargo +nightly llvm-cov --all-features --workspace --exclude hpl-tests --codecov --output-path codecov.json + run: cargo llvm-cov --workspace --exclude hpl-tests --codecov --output-path codecov.json - name: Upload to codecov.io uses: codecov/codecov-action@v3 diff --git a/Cargo.toml b/Cargo.toml index 643fe642..9ef3ffa3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,6 +94,7 @@ hpl-mailbox = { path = "./contracts/core/mailbox" } hpl-validator-announce = { path = "./contracts/core/va" } hpl-hook-merkle = { path = "./contracts/hooks/merkle" } +hpl-hook-fee = { path = "./contracts/hooks/fee" } hpl-hook-pausable = { path = "./contracts/hooks/pausable" } hpl-hook-routing = { path = "./contracts/hooks/routing" } hpl-hook-routing-custom = { path = "./contracts/hooks/routing-custom" } diff --git a/contracts/core/mailbox/src/execute.rs b/contracts/core/mailbox/src/execute.rs index 3e43a62f..33792d39 100644 --- a/contracts/core/mailbox/src/execute.rs +++ b/contracts/core/mailbox/src/execute.rs @@ -1,13 +1,14 @@ use cosmwasm_std::{ - ensure, ensure_eq, to_json_binary, wasm_execute, BankMsg, Coins, DepsMut, Env, HexBinary, - MessageInfo, Response, StdResult, + ensure, ensure_eq, to_json_binary, wasm_execute, Coin, Coins, DepsMut, Env, + HexBinary, MessageInfo, Response, }; +use cw_utils::PaymentError::MissingDenom; use hpl_interface::{ core::{ mailbox::{DispatchMsg, DispatchResponse}, HandleMsg, }, - hook::{self, post_dispatch}, + hook::{post_dispatch, quote_dispatch}, ism, types::Message, }; @@ -107,74 +108,47 @@ pub fn dispatch( } ); - // calculate gas - let default_hook = config.get_default_hook(); - let required_hook = config.get_required_hook(); - + // build hyperlane message let msg = dispatch_msg .clone() .to_msg(MAILBOX_VERSION, nonce, config.local_domain, &info.sender)?; - let msg_id = msg.id(); + let metadata = dispatch_msg.clone().metadata.unwrap_or_default(); + let hook = dispatch_msg.get_hook_addr(deps.api, config.get_default_hook())?; - let base_fee = hook::quote_dispatch( - &deps.querier, - dispatch_msg.get_hook_addr(deps.api, default_hook)?, - dispatch_msg.metadata.clone().unwrap_or_default(), - msg.clone(), - )? - .fees; - - let required_fee = hook::quote_dispatch( - &deps.querier, - &required_hook, - dispatch_msg.metadata.clone().unwrap_or_default(), - msg.clone(), - )? - .fees; - - // assert gas received is satisfies required gas - let mut total_fee = required_fee.clone().into_iter().try_fold( - Coins::try_from(base_fee.clone())?, - |mut acc, fee| { - acc.add(fee)?; - StdResult::Ok(acc) - }, - )?; - for fund in info.funds { - total_fee.sub(fund)?; - } + // assert gas received satisfies required gas + let required_hook = config.get_required_hook(); + let required_hook_fees: Vec = + quote_dispatch(&deps.querier, &required_hook, metadata.clone(), msg.clone())?.fees; - // interaction - let hook = dispatch_msg.get_hook_addr(deps.api, config.get_default_hook())?; - let hook_metadata = dispatch_msg.metadata.unwrap_or_default(); + let mut funds = Coins::try_from(info.funds)?; + for coin in required_hook_fees.iter() { + if let Err(_) = funds.sub(coin.clone()) { + return Err(ContractError::Payment(MissingDenom(coin.denom.clone()))); + } + } - // effects + // commit to message + let msg_id = msg.id(); NONCE.save(deps.storage, &(nonce + 1))?; LATEST_DISPATCHED_ID.save(deps.storage, &msg_id.to_vec())?; - // make message + // build post dispatch calls let post_dispatch_msgs = vec![ post_dispatch( required_hook, - hook_metadata.clone(), + metadata.clone(), msg.clone(), - Some(required_fee), + Some(required_hook_fees), )?, - post_dispatch(hook, hook_metadata, msg.clone(), Some(base_fee))?, + post_dispatch(hook, metadata, msg.clone(), Some(funds.to_vec()))?, ]; - let refund_msg = BankMsg::Send { - to_address: info.sender.to_string(), - amount: total_fee.to_vec(), - }; - Ok(Response::new() .add_event(emit_dispatch_id(msg_id.clone())) .add_event(emit_dispatch(msg)) .set_data(to_json_binary(&DispatchResponse { message_id: msg_id })?) - .add_messages(post_dispatch_msgs) - .add_message(refund_msg)) + .add_messages(post_dispatch_msgs)) } pub fn process( diff --git a/contracts/hooks/fee/Cargo.toml b/contracts/hooks/fee/Cargo.toml new file mode 100644 index 00000000..d5f6e792 --- /dev/null +++ b/contracts/hooks/fee/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "hpl-hook-fee" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true +documentation.workspace = true +keywords.workspace = true + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] +# use library feature to disable all instantiate/execute/query exports +library = [] + +[dependencies] +cosmwasm-std.workspace = true +cosmwasm-storage.workspace = true +cosmwasm-schema.workspace = true + +cw-storage-plus.workspace = true +cw2.workspace = true +cw-utils.workspace = true + +schemars.workspace = true +serde-json-wasm.workspace = true + +thiserror.workspace = true + +hpl-ownable.workspace = true +hpl-interface.workspace = true + +[dev-dependencies] +rstest.workspace = true +ibcx-test-utils.workspace = true + +anyhow.workspace = true diff --git a/contracts/hooks/fee/src/lib.rs b/contracts/hooks/fee/src/lib.rs new file mode 100644 index 00000000..743d6e79 --- /dev/null +++ b/contracts/hooks/fee/src/lib.rs @@ -0,0 +1,275 @@ +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; +use cosmwasm_std::{ + ensure, ensure_eq, BankMsg, Coin, CosmosMsg, Deps, DepsMut, Env, Event, MessageInfo, + QueryResponse, Response, StdError, +}; +use cw_storage_plus::Item; +use hpl_interface::{ + hook::{ + fee::{ExecuteMsg, FeeHookMsg, FeeHookQueryMsg, FeeResponse, InstantiateMsg, QueryMsg}, + HookQueryMsg, MailboxResponse, QuoteDispatchResponse, + }, + to_binary, +}; + +#[derive(thiserror::Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("{0}")] + PaymentError(#[from] cw_utils::PaymentError), + + #[error("unauthorized")] + Unauthorized {}, + + #[error("hook paused")] + Paused {}, +} + +// version info for migration info +pub const CONTRACT_NAME: &str = env!("CARGO_PKG_NAME"); +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +pub const COIN_FEE_KEY: &str = "coin_fee"; +pub const COIN_FEE: Item = Item::new(COIN_FEE_KEY); + +fn new_event(name: &str) -> Event { + Event::new(format!("hpl_hook_fee::{}", name)) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> Result { + cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + + let owner = deps.api.addr_validate(&msg.owner)?; + + hpl_ownable::initialize(deps.storage, &owner)?; + COIN_FEE.save(deps.storage, &msg.fee)?; + + Ok(Response::new().add_event( + new_event("initialize") + .add_attribute("sender", info.sender) + .add_attribute("owner", owner) + .add_attribute("fee_denom", msg.fee.denom) + .add_attribute("fee_amount", msg.fee.amount), + )) +} + +fn get_fee(deps: Deps) -> Result { + let fee = COIN_FEE.load(deps.storage)?; + + Ok(FeeResponse { fee }) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + match msg { + ExecuteMsg::Ownable(msg) => Ok(hpl_ownable::handle(deps, env, info, msg)?), + ExecuteMsg::FeeHook(msg) => match msg { + FeeHookMsg::SetFee { fee } => { + let owner = hpl_ownable::get_owner(deps.storage)?; + ensure_eq!(owner, info.sender, StdError::generic_err("unauthorized")); + + COIN_FEE.save(deps.storage, &fee)?; + + Ok(Response::new().add_event( + new_event("set_fee") + .add_attribute("fee_denom", fee.denom) + .add_attribute("fee_amount", fee.amount), + )) + } + FeeHookMsg::Claim { recipient } => { + let owner = hpl_ownable::get_owner(deps.storage)?; + ensure_eq!(owner, info.sender, StdError::generic_err("unauthorized")); + + let recipient = recipient.unwrap_or(owner); + let balances = deps.querier.query_all_balances(&env.contract.address)?; + + let claim_msg: CosmosMsg = BankMsg::Send { + to_address: recipient.into_string(), + amount: balances, + } + .into(); + + Ok(Response::new() + .add_message(claim_msg) + .add_event(new_event("claim"))) + } + }, + ExecuteMsg::PostDispatch(_) => { + let fee = COIN_FEE.load(deps.storage)?; + let supplied = cw_utils::must_pay(&info, &fee.denom)?; + + ensure!( + supplied.u128() >= fee.amount.u128(), + // TODO: improve error + StdError::generic_err("insufficient funds") + ); + + Ok(Response::new().add_event( + new_event("post_dispatch") + .add_attribute("paid_denom", fee.denom) + .add_attribute("paid_amount", supplied), + )) + } + } +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { + match msg { + QueryMsg::Ownable(msg) => Ok(hpl_ownable::handle_query(deps, env, msg)?), + QueryMsg::Hook(msg) => match msg { + HookQueryMsg::Mailbox {} => to_binary(get_mailbox(deps)), + HookQueryMsg::QuoteDispatch(_) => to_binary(quote_dispatch(deps)), + }, + QueryMsg::FeeHook(FeeHookQueryMsg::Fee {}) => to_binary(get_fee(deps)), + } +} + +fn get_mailbox(_deps: Deps) -> Result { + Ok(MailboxResponse { + mailbox: "unrestricted".to_string(), + }) +} + +fn quote_dispatch(deps: Deps) -> Result { + let fee = COIN_FEE.load(deps.storage)?; + Ok(QuoteDispatchResponse { fees: vec![fee] }) +} + +#[cfg(test)] +mod test { + use cosmwasm_schema::serde::{de::DeserializeOwned, Serialize}; + use cosmwasm_std::{ + coin, from_json, + testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage}, + to_json_binary, Addr, HexBinary, OwnedDeps, + }; + use hpl_interface::hook::{PostDispatchMsg, QuoteDispatchMsg}; + use hpl_ownable::get_owner; + use ibcx_test_utils::{addr, gen_bz}; + use rstest::{fixture, rstest}; + + use super::*; + + type TestDeps = OwnedDeps; + + fn query(deps: Deps, msg: S) -> T { + let req: QueryMsg = from_json(to_json_binary(&msg).unwrap()).unwrap(); + let res = crate::query(deps, mock_env(), req).unwrap(); + from_json(res).unwrap() + } + + #[fixture] + fn deps( + #[default(addr("deployer"))] sender: Addr, + #[default(addr("owner"))] owner: Addr, + #[default(coin(100, "uusd"))] fee: Coin, + ) -> TestDeps { + let mut deps = mock_dependencies(); + + instantiate( + deps.as_mut(), + mock_env(), + mock_info(sender.as_str(), &[]), + InstantiateMsg { + owner: owner.to_string(), + fee, + }, + ) + .unwrap(); + + deps + } + + #[rstest] + fn test_init(deps: TestDeps) { + assert_eq!("uusd", get_fee(deps.as_ref()).unwrap().fee.denom.as_str()); + assert_eq!("owner", get_owner(deps.as_ref().storage).unwrap().as_str()); + } + + #[rstest] + #[case(&[coin(100, "uusd")])] + #[should_panic(expected = "Generic error: insufficient funds")] + #[case(&[coin(99, "uusd")])] + fn test_post_dispatch(mut deps: TestDeps, #[case] funds: &[Coin]) { + execute( + deps.as_mut(), + mock_env(), + mock_info("owner", funds), + ExecuteMsg::PostDispatch(PostDispatchMsg { + metadata: HexBinary::default(), + message: gen_bz(100), + }), + ) + .map_err(|e| e.to_string()) + .unwrap(); + } + + #[rstest] + fn test_query(deps: TestDeps) { + let res: MailboxResponse = query(deps.as_ref(), QueryMsg::Hook(HookQueryMsg::Mailbox {})); + assert_eq!("unrestricted", res.mailbox.as_str()); + + let res: QuoteDispatchResponse = query( + deps.as_ref(), + QueryMsg::Hook(HookQueryMsg::QuoteDispatch(QuoteDispatchMsg::default())), + ); + assert_eq!(res.fees, vec![coin(100, "uusd")]); + } + + #[rstest] + #[case(addr("owner"), coin(200, "uusd"))] + #[should_panic(expected = "unauthorized")] + #[case(addr("deployer"), coin(200, "uusd"))] + fn test_set_fee(mut deps: TestDeps, #[case] sender: Addr, #[case] fee: Coin) { + execute( + deps.as_mut(), + mock_env(), + mock_info(sender.as_str(), &[]), + ExecuteMsg::FeeHook(FeeHookMsg::SetFee { fee: fee.clone() }), + ) + .map_err(|e| e.to_string()) + .unwrap(); + + assert_eq!(fee, get_fee(deps.as_ref()).unwrap().fee); + } + + #[rstest] + #[case(addr("owner"), Some(addr("deployer")))] + #[case(addr("owner"), None)] + #[should_panic(expected = "unauthorized")] + #[case(addr("deployer"), None)] + fn test_claim(mut deps: TestDeps, #[case] sender: Addr, #[case] recipient: Option) { + let res = execute( + deps.as_mut(), + mock_env(), + mock_info(sender.as_str(), &[]), + ExecuteMsg::FeeHook(FeeHookMsg::Claim { recipient: recipient.clone() }), + ) + .map_err(|e| e.to_string()) + .unwrap(); + + assert_eq!( + CosmosMsg::Bank(BankMsg::Send { + to_address: recipient.unwrap_or_else(|| addr("owner")).into_string(), + amount: vec![], + }), + res.messages[0].msg + ); + println!("{:?}", res); + } +} diff --git a/contracts/hooks/merkle/src/lib.rs b/contracts/hooks/merkle/src/lib.rs index e837cb83..be13388a 100644 --- a/contracts/hooks/merkle/src/lib.rs +++ b/contracts/hooks/merkle/src/lib.rs @@ -59,18 +59,14 @@ pub fn instantiate( ) -> Result { cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - let owner = deps.api.addr_validate(&msg.owner)?; let mailbox = deps.api.addr_validate(&msg.mailbox)?; - hpl_ownable::initialize(deps.storage, &owner)?; - MAILBOX.save(deps.storage, &mailbox)?; MESSAGE_TREE.save(deps.storage, &MerkleTree::default())?; Ok(Response::new().add_event( new_event("initialize") .add_attribute("sender", info.sender) - .add_attribute("owner", owner) .add_attribute("mailbox", mailbox), )) } @@ -78,12 +74,11 @@ pub fn instantiate( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( deps: DepsMut, - env: Env, - info: MessageInfo, + _env: Env, + _info: MessageInfo, msg: ExecuteMsg, ) -> Result { match msg { - ExecuteMsg::Ownable(msg) => Ok(hpl_ownable::handle(deps, env, info, msg)?), ExecuteMsg::PostDispatch(PostDispatchMsg { message, .. }) => { let mailbox = MAILBOX.load(deps.storage)?; @@ -123,11 +118,10 @@ pub fn execute( } #[cfg_attr(not(feature = "library"), entry_point)] -pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> Result { +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result { use MerkleHookQueryMsg::*; match msg { - QueryMsg::Ownable(msg) => Ok(hpl_ownable::handle_query(deps, env, msg)?), QueryMsg::Hook(msg) => match msg { HookQueryMsg::Mailbox {} => to_binary(get_mailbox(deps)), HookQueryMsg::QuoteDispatch(_) => to_binary(quote_dispatch()), @@ -214,7 +208,6 @@ mod test { use hpl_interface::{ build_test_executor, build_test_querier, core::mailbox, hook::QuoteDispatchMsg, }; - use hpl_ownable::get_owner; use ibcx_test_utils::hex; use rstest::{fixture, rstest}; @@ -228,7 +221,6 @@ mod test { #[fixture] fn deps( #[default(Addr::unchecked("deployer"))] sender: Addr, - #[default(Addr::unchecked("owner"))] owner: Addr, #[default(Addr::unchecked("mailbox"))] mailbox: Addr, ) -> TestDeps { let mut deps = mock_dependencies(); @@ -238,7 +230,6 @@ mod test { mock_env(), mock_info(sender.as_str(), &[]), InstantiateMsg { - owner: owner.to_string(), mailbox: mailbox.to_string(), }, ) @@ -249,7 +240,6 @@ mod test { #[rstest] fn test_init(deps: TestDeps) { - assert_eq!("owner", get_owner(deps.as_ref().storage).unwrap().as_str()); assert_eq!( "mailbox", MAILBOX.load(deps.as_ref().storage).unwrap().as_str() diff --git a/integration-test/tests/contracts/cw/hook.rs b/integration-test/tests/contracts/cw/hook.rs index c7d4cfb3..413c8cd2 100644 --- a/integration-test/tests/contracts/cw/hook.rs +++ b/integration-test/tests/contracts/cw/hook.rs @@ -99,7 +99,6 @@ impl Hook { .instantiate( codes.hook_merkle, &hook::merkle::InstantiateMsg { - owner: owner.address(), mailbox, }, Some(deployer.address().as_str()), diff --git a/packages/interface/src/hook/fee.rs b/packages/interface/src/hook/fee.rs new file mode 100644 index 00000000..b814b642 --- /dev/null +++ b/packages/interface/src/hook/fee.rs @@ -0,0 +1,83 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::{Addr, Coin}; + +use crate::ownable::{OwnableMsg, OwnableQueryMsg}; + +use super::{HookQueryMsg, PostDispatchMsg}; + +pub const TREE_DEPTH: usize = 32; + +#[cw_serde] +pub struct InstantiateMsg { + pub owner: String, + pub fee: Coin, +} + +#[cw_serde] +pub enum ExecuteMsg { + Ownable(OwnableMsg), + PostDispatch(PostDispatchMsg), + FeeHook(FeeHookMsg), +} + +#[cw_serde] +pub enum FeeHookMsg { + SetFee { + fee: Coin, + }, + Claim { + recipient: Option + } +} + +#[cw_serde] +#[derive(QueryResponses)] +#[query_responses(nested)] +pub enum QueryMsg { + Ownable(OwnableQueryMsg), + Hook(HookQueryMsg), + FeeHook(FeeHookQueryMsg), +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum FeeHookQueryMsg { + #[returns(FeeResponse)] + Fee {} +} + +#[cw_serde] +pub struct FeeResponse { + pub fee: Coin, +} + +#[cfg(test)] +mod test { + use cosmwasm_std::HexBinary; + + use super::*; + use crate::{ + hook::{ExpectedHookQueryMsg, PostDispatchMsg, QuoteDispatchMsg}, + msg_checker, + }; + + #[test] + fn test_hook_interface() { + let _checked: ExecuteMsg = msg_checker( + PostDispatchMsg { + metadata: HexBinary::default(), + message: HexBinary::default(), + } + .wrap(), + ); + + let _checked: QueryMsg = msg_checker(ExpectedHookQueryMsg::Hook(HookQueryMsg::Mailbox {})); + let _checked: QueryMsg = msg_checker( + QuoteDispatchMsg { + metadata: HexBinary::default(), + message: HexBinary::default(), + } + .request(), + ); + } +} diff --git a/packages/interface/src/hook/merkle.rs b/packages/interface/src/hook/merkle.rs index 007ac839..85d6180d 100644 --- a/packages/interface/src/hook/merkle.rs +++ b/packages/interface/src/hook/merkle.rs @@ -1,21 +1,17 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::HexBinary; -use crate::ownable::{OwnableMsg, OwnableQueryMsg}; - use super::{HookQueryMsg, PostDispatchMsg}; pub const TREE_DEPTH: usize = 32; #[cw_serde] pub struct InstantiateMsg { - pub owner: String, pub mailbox: String, } #[cw_serde] pub enum ExecuteMsg { - Ownable(OwnableMsg), PostDispatch(PostDispatchMsg), } @@ -23,7 +19,6 @@ pub enum ExecuteMsg { #[derive(QueryResponses)] #[query_responses(nested)] pub enum QueryMsg { - Ownable(OwnableQueryMsg), Hook(HookQueryMsg), MerkleHook(MerkleHookQueryMsg), } diff --git a/packages/interface/src/hook/mod.rs b/packages/interface/src/hook/mod.rs index 0c368b0b..1c76d998 100644 --- a/packages/interface/src/hook/mod.rs +++ b/packages/interface/src/hook/mod.rs @@ -4,6 +4,7 @@ pub mod pausable; pub mod routing; pub mod routing_custom; pub mod routing_fallback; +pub mod fee; use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::{ From 94fed0f53931c0e94173252e34b018b1c31eb21b Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 19 Jan 2024 14:36:54 -0500 Subject: [PATCH 26/31] Add mailbox unit tests for post dispatch (#7) * Add mailbox unit tests for post dispatch * Add test for different denoms --- contracts/core/mailbox/src/error.rs | 8 +- contracts/core/mailbox/src/execute.rs | 135 +++++++++++++++++++++++--- 2 files changed, 127 insertions(+), 16 deletions(-) diff --git a/contracts/core/mailbox/src/error.rs b/contracts/core/mailbox/src/error.rs index 18d56746..8df21fca 100644 --- a/contracts/core/mailbox/src/error.rs +++ b/contracts/core/mailbox/src/error.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::StdError; +use cosmwasm_std::{Coin, StdError}; use thiserror::Error; #[derive(Error, Debug, PartialEq)] @@ -9,6 +9,12 @@ pub enum ContractError { #[error("{0}")] Payment(#[from] cw_utils::PaymentError), + #[error("insufficient hook payment: wanted {wanted:?}, received {received:?}")] + HookPayment { + wanted: Vec, + received: Vec, + }, + #[error("{0}")] CoinsError(#[from] cosmwasm_std::CoinsError), diff --git a/contracts/core/mailbox/src/execute.rs b/contracts/core/mailbox/src/execute.rs index 33792d39..c8b1dff5 100644 --- a/contracts/core/mailbox/src/execute.rs +++ b/contracts/core/mailbox/src/execute.rs @@ -1,8 +1,7 @@ use cosmwasm_std::{ - ensure, ensure_eq, to_json_binary, wasm_execute, Coin, Coins, DepsMut, Env, - HexBinary, MessageInfo, Response, + ensure, ensure_eq, to_json_binary, wasm_execute, Coin, Coins, DepsMut, Env, HexBinary, + MessageInfo, Response }; -use cw_utils::PaymentError::MissingDenom; use hpl_interface::{ core::{ mailbox::{DispatchMsg, DispatchResponse}, @@ -121,10 +120,13 @@ pub fn dispatch( let required_hook_fees: Vec = quote_dispatch(&deps.querier, &required_hook, metadata.clone(), msg.clone())?.fees; - let mut funds = Coins::try_from(info.funds)?; + let mut funds = Coins::try_from(info.funds.clone())?; for coin in required_hook_fees.iter() { if let Err(_) = funds.sub(coin.clone()) { - return Err(ContractError::Payment(MissingDenom(coin.denom.clone()))); + return Err(ContractError::HookPayment { + wanted: required_hook_fees, + received: info.funds, + }); } } @@ -225,15 +227,18 @@ pub fn process( #[cfg(test)] mod tests { + use std::collections::HashMap; + use cosmwasm_std::{ coin, from_json, testing::{mock_dependencies, mock_env, mock_info, MockApi, MockQuerier, MockStorage}, - to_json_binary, Addr, ContractResult, OwnedDeps, QuerierResult, SystemResult, WasmQuery, + to_json_binary, Addr, ContractResult, CosmosMsg, OwnedDeps, QuerierResult, + SystemResult, WasmMsg, WasmQuery, }; use hpl_interface::{ core::mailbox::InstantiateMsg, - hook::{ExpectedHookQueryMsg, HookQueryMsg, QuoteDispatchResponse}, + hook::{ExpectedHookQueryMsg, HookQueryMsg, PostDispatchMsg, QuoteDispatchResponse}, ism::IsmQueryMsg, types::bech32_encode, }; @@ -252,8 +257,11 @@ mod tests { type TestDeps = OwnedDeps; - fn mock_query_handler(req: &WasmQuery) -> QuerierResult { - let (req, _addr) = match req { + fn mock_query_handler( + req: &WasmQuery, + addr_fees: &Option>>, + ) -> QuerierResult { + let (req, addr) = match req { WasmQuery::Smart { msg, contract_addr } => (from_json(msg).unwrap(), contract_addr), _ => unreachable!("wrong query type"), }; @@ -263,17 +271,18 @@ mod tests { _ => unreachable!("wrong query type"), }; - let mut fees = Coins::default(); + let mut fees = match addr_fees { + Some(fees) => fees.get(addr).unwrap_or(&vec![]).clone(), + None => vec![], + }; if !req.metadata.is_empty() { let parsed_fee = u32::from_be_bytes(req.metadata.as_slice().try_into().unwrap()); - fees = Coins::from(coin(parsed_fee as u128, "utest")); + fees = vec![coin(parsed_fee as u128, "utest")]; } - let res = QuoteDispatchResponse { - fees: fees.into_vec(), - }; + let res = QuoteDispatchResponse { fees }; let res = to_json_binary(&res).unwrap(); SystemResult::Ok(ContractResult::Ok(res)) @@ -396,7 +405,7 @@ mod tests { let mut deps = mock_dependencies(); - deps.querier.update_wasm(mock_query_handler); + deps.querier.update_wasm(|q| mock_query_handler(q, &None)); instantiate( deps.as_mut(), @@ -442,6 +451,102 @@ mod tests { ); } + #[rstest] + #[case(vec![coin(100, "usd")], vec![coin(100, "usd")])] + #[should_panic] + #[case(vec![coin(100, "usd")], vec![coin(50, "usd")])] + #[should_panic] + #[case(vec![coin(100, "usdt")], vec![coin(100, "usd")])] + #[case(vec![coin(50, "usd")], vec![coin(100, "usd")])] + fn test_post_dispatch(#[case] required_hook_fees: Vec, #[case] funds: Vec) { + let mut deps = mock_dependencies(); + + let mut hook_fees = HashMap::new(); + hook_fees.insert("required_hook".into(), required_hook_fees.clone()); + + // not enforced by mailbox + // hook_fees.insert("default_hook".into(), default_hook_fees); + + let opt = Some(hook_fees); + + deps.querier + .update_wasm(move |q| mock_query_handler(q, &opt)); + + let hrp = "osmo"; + + instantiate( + deps.as_mut(), + mock_env(), + mock_info(OWNER, &[]), + InstantiateMsg { + hrp: "osmo".to_string(), + owner: OWNER.to_string(), + domain: LOCAL_DOMAIN, + }, + ) + .unwrap(); + + set_default_hook(deps.as_mut(), mock_info(OWNER, &[]), "default_hook".into()).unwrap(); + set_required_hook(deps.as_mut(), mock_info(OWNER, &[]), "required_hook".into()).unwrap(); + + let dispatch_msg = DispatchMsg::new(DEST_DOMAIN, gen_bz(32), gen_bz(123)); + + let sender = bech32_encode(hrp, gen_bz(32).as_slice()).unwrap(); + + let msg = dispatch_msg + .clone() + .to_msg( + MAILBOX_VERSION, + NONCE.load(deps.as_ref().storage).unwrap(), + LOCAL_DOMAIN, + &sender, + ) + .unwrap(); + + let post_dispatch_msg = to_json_binary( + &PostDispatchMsg { + metadata: HexBinary::default(), + message: msg.into(), + } + .wrap(), // not sure why I need this + ) + .unwrap(); + + let res = dispatch( + deps.as_mut(), + mock_info(sender.as_str(), &funds), + dispatch_msg.clone(), + ) + .map_err(|e| e.to_string()) + .unwrap(); + + let msgs: Vec<_> = res.messages.into_iter().map(|v| v.msg).collect(); + + assert_eq!( + msgs[0], + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "required_hook".to_string(), + msg: post_dispatch_msg.clone(), + funds: required_hook_fees.clone() + },) + ); + + // subtract required_hook_fees from funds + let mut remaining_funds = Coins::try_from(funds).unwrap(); + for coin in required_hook_fees { + remaining_funds.sub(coin).unwrap(); + } + + assert_eq!( + msgs[1], + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: "default_hook".to_string(), + msg: post_dispatch_msg, + funds: remaining_funds.into_vec() // forward all remaining funds + }) + ); + } + fn test_process_query_handler(query: &WasmQuery) -> QuerierResult { match query { WasmQuery::Smart { contract_addr, msg } => { From 0cb074026e67320597a3a5fe2bacf853fed4664e Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 19 Jan 2024 15:39:47 -0500 Subject: [PATCH 27/31] Upload new wasm --- scripts/context/injective-1.json | 95 +++++++++++++------------------- scripts/context/terminal-output | 7 --- 2 files changed, 39 insertions(+), 63 deletions(-) delete mode 100644 scripts/context/terminal-output diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json index dd6f321a..293450e9 100644 --- a/scripts/context/injective-1.json +++ b/scripts/context/injective-1.json @@ -1,94 +1,77 @@ { "contracts": { "hpl_hook_aggregate": { - "codeId": 6176, - "digest": "977813f4f02201c87678e5a7e9d9ad6c184f0e6031cdf3a3a72b796b3f88ab00" + "codeId": 6407, + "digest": "ff2c972cc66ec5c5aeaac0506a39b48e37387126c07ca7e8a45f9b18d34aa0f2" }, "hpl_hook_merkle": { - "codeId": 6177, - "digest": "c2f6065fa75c334e7d3423cd23da1a8147ac9b8971e91c5771b1d846e457b62b" + "codeId": 6408, + "digest": "25e0c969f233c2db5dd81b17005a0367935bfea9f6b8275873026562d9583920" }, "hpl_hook_pausable": { - "codeId": 6178, - "digest": "6a5087d4ebecec08439a73f2e45d7bc07f384dc1d60e63dbb0fedac891364a18" + "codeId": 6409, + "digest": "10bce0701f9cb67cb1b80aaeb0af7d8bc91175b6a9299783ae420f1adc413ed3" }, "hpl_hook_routing": { - "codeId": 6179, - "digest": "3218ea7b5758f33575ebeada23bdb58323444ed8c3ccb5fcc79eede5fa5ad5f7" + "codeId": 6410, + "digest": "3a7f4ef76b596c77faef35890e924e8f8550fdb6f2569fa62ec67dbcbb7f1006" }, "hpl_hook_routing_custom": { - "codeId": 6180, - "digest": "88e78b2073577f6122ff6e910a3710c5f5523ae8b27d38f221fa26b74e9b9d26" + "codeId": 6411, + "digest": "6fd4796181e046ae71dc7f2cdefa8459e26431da67b0e9028c0952b980f6dfc2" }, "hpl_hook_routing_fallback": { - "codeId": 6181, - "digest": "e1b8044e6b543db2a9e46939b8ca6b91ae5cef94efda36b4aecf7ccd8dbaf284" + "codeId": 6412, + "digest": "14fa5137267486053d8b065a5420d215c0c7b33dec51f573d26d7d231a432883" }, "hpl_igp": { - "address": "inj1ezjuhmkdpa7svfsccfsntshfsse9855l0cm8ph", - "codeId": 6182, - "digest": "4914b55ca8347ac392c8c6f32cd86fe4c29366ff97e582a4a811863c596b6599" + "codeId": 6413, + "digest": "b42c7d9b2c77d01ddbc77e027ce1d6950b635ed7e564df928095056c2ae2759a" }, "hpl_igp_oracle": { - "address": "inj1xra3jscyaffvgv6f0zmy2w3tw5um2c5daspv25", - "codeId": 6183, - "digest": "c3f9d2859cce5036a9dc9e575534f73094641f94cf7625e3e9212080df2a811f" + "codeId": 6414, + "digest": "53872a2989164ee487187910fe0813adcfdb04f3876f5ceead14aafed2c181c1" }, "hpl_ism_aggregate": { - "codeId": 6184, - "digest": "e1dee705d3500d1c21c209de42910ce3559138743246a3bd1dfddd8fb9d36620" + "codeId": 6415, + "digest": "6ff86c257611dfc0c4d9e82b67ac969fdee4ead8b6c5563a1f16c9b9b059ab7a" }, "hpl_ism_multisig": { - "codeId": 6185, - "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91" + "codeId": 6416, + "digest": "8969e6927592b91b0cd8755bc79cf0152a2a5f51375dd86980ea36670623e2ac" }, "hpl_ism_pausable": { - "codeId": 6186, - "digest": "ea99783338118ad18cd81f6a3924a9826a328333314791a6379d5fdc940fd54d" + "codeId": 6417, + "digest": "0470b0d1b7d16baabe014f5fea500b80a748421c61ba061183b3953326321c74" }, "hpl_ism_routing": { - "codeId": 6187, - "digest": "aa6aeb31486d585dc887b9a03b47a7f1d8bcf6e96e75c5160cbaf5ee8ce494fd" + "codeId": 6418, + "digest": "f86fc1bbabf2688770a2900ef25a02fa2e2c198b0e42b861162a3900f9a6c7aa" }, "hpl_mailbox": { - "address": "inj10w6ulrndlzlgzlhj7uwp37utunyfk6vhudjnxf", - "codeId": 6188, - "digest": "9815c3c37ebde6702273b47d1ae806d3170cd703e2784ad1043d63b4e8728de6" + "codeId": 6419, + "digest": "2ed06bf3633ff0af4821527b1eca5a2633f2865f1bd577c3c6a4e694c7f688b1" }, "hpl_test_mock_hook": { - "codeId": 6189, - "digest": "52d57c90addd6e5019637c396be9446d595d1cfa8dea2223a1a1338a31ec6ef4" + "codeId": 6420, + "digest": "3a03d211d98ac3d32a39ff188be19e4ec9a5f992269f696197b7f09952c909df" }, "hpl_test_mock_msg_receiver": { - "address": "inj12hh0vcyzpseglymykwcshzn2sccr8ul32ezrly", - "codeId": 6190, - "digest": "356f407eed36584feaa610fc278422c190c26093f5356e5a7f9dddf3d894758a" + "codeId": 6421, + "digest": "9dba7ab71a392b369561370eaffbcd450abaeca64111d2ff5daa389912846313" }, "hpl_validator_announce": { - "address": "inj1p96kge7yvvawcpvzqlvmzkmvhdqvyukv896k3y", - "codeId": 6191, - "digest": "eeb5d32ceebf6f467040a981fab3d3ecd144d0fdf27939ed12335e7a5fdba165" + "codeId": 6422, + "digest": "4d8d5b22b1ebbd8cc221ee9bcf3e79587bfbfc91845e5726dd9de052d410c8dc" }, "hpl_warp_cw20": { - "codeId": 6192, - "digest": "5a292442e9f5107a66e85faf61bb23172f7c713ef2fe7733daf4c5870493b5a5" + "codeId": 6423, + "digest": "4da1db8d03aab8df02fb0588326e392e457e2234c2ea7f32cb062c0d1d276322" }, "hpl_warp_native": { - "codeId": 6193, - "digest": "5a50fe598804046dd787113af85154be5df938458463388129ff79d5971531b6" - }, - "hpl_default_ism": { - "codeId": 6185, - "digest": "eb31327e288888262e0072cbb2a0283dfd8b9508878f3995c7f33131089fba91", - "address": "inj1w50jz93a4ypaxsj8ga3waw8s55enc4p9y8j2uj" - }, - "hpl_default_hook": { - "address": "inj1ezjuhmkdpa7svfsccfsntshfsse9855l0cm8ph" - }, - "hpl_required_hook": { - "codeId": 6177, - "digest": "c2f6065fa75c334e7d3423cd23da1a8147ac9b8971e91c5771b1d846e457b62b", - "address": "inj1z09d0ljz46dm95qvqcpk7ly3r7pupvslcmpnjc" + "codeId": 6424, + "digest": "3dbf222865d96c9496bdddc815ff3c0b776bc143d7d56045330ec4ebfd5a69fe" } - } -} + }, + "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" +} \ No newline at end of file diff --git a/scripts/context/terminal-output b/scripts/context/terminal-output deleted file mode 100644 index dd252b1c..00000000 --- a/scripts/context/terminal-output +++ /dev/null @@ -1,7 +0,0 @@ -hpl_mailbox | inj10w6ulrndlzlgzlhj7uwp37utunyfk6vhudjnxf | 7bb5cf8e6df8be817ef2f71c18fb8be4c89b6997 | BF9CE7698F53BE69AC30CFA8EAF62BA1593B27E0233B573699AC4886D8F10F3B -hpl_validator_announce | inj1p96kge7yvvawcpvzqlvmzkmvhdqvyukv896k3y | 09756467c4633aec058207d9b15b6cbb40c272cc | 6DC8C0FDBA1D27C26121965F498C7B3330957F52CA013DB25572B9DF1F3E12A9 -hpl_igp | inj1ezjuhmkdpa7svfsccfsntshfsse9855l0cm8ph | c8a5cbeecd0f7d062618c26135c2e9843253d29f | 1D45BD322F50424EBAB0AB5F8C97786B6E139130EF0497D666DAFBA4BC43EA86 -hpl_igp_oracle | inj1xra3jscyaffvgv6f0zmy2w3tw5um2c5daspv25 | 30fb194304ea52c4334978b6453a2b7539b5628d | A7246D0F8B56242AB96D606A4AD444BFC1CD3F7A0D0BA8FD1A38CE460D6A835E -hpl_ism_multisig | inj1w50jz93a4ypaxsj8ga3waw8s55enc4p9y8j2uj | 751f21163da903d342474762eeb8f0a5333c5425 | 9F574E39EA090AA2CB0DBFFD807B66CFDAC54EFEF68FA8FB365CF1CB605B5998 -hpl_hook_merkle | inj1z09d0ljz46dm95qvqcpk7ly3r7pupvslcmpnjc | 13cad7fe42ae9bb2d00c06036f7c911f83c0b21f | BA47A0BED33785A4978F3C04DAEEB08C909E5C21DBEEBB56460264C35E2A6D96 -hpl_test_mock_msg_receiver | inj12hh0vcyzpseglymykwcshzn2sccr8ul32ezrly | 55eef660820c328f9364b3b10b8a6a863033f3f1 | 37E440CA32C86DA850FAC9C561635C201729FD5206B8D50C72658A8645C4D0DA From 0aee4150ca92b5cbdac4b52f5bbe824090807209 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 19 Jan 2024 15:43:48 -0500 Subject: [PATCH 28/31] Remove owner from merkle instantiate --- scripts/action/deploy.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/action/deploy.ts b/scripts/action/deploy.ts index d9064359..bd3e2ff0 100644 --- a/scripts/action/deploy.ts +++ b/scripts/action/deploy.ts @@ -229,7 +229,6 @@ const deploy_hook = async ( case "merkle": const merkle_hook_res = await hooks.merkle.instantiate({ - owner: hook.owner === "" ? client.signer : hook.owner, mailbox: addr(ctx, mailbox), }); From aef5195d91915761cbabcb93a53f451c53b8943e Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Fri, 19 Jan 2024 15:44:20 -0500 Subject: [PATCH 29/31] Deploy core to testnet --- scripts/context/injective-1.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json index 293450e9..1532e927 100644 --- a/scripts/context/injective-1.json +++ b/scripts/context/injective-1.json @@ -25,10 +25,12 @@ "digest": "14fa5137267486053d8b065a5420d215c0c7b33dec51f573d26d7d231a432883" }, "hpl_igp": { + "address": "inj1p0q2uylnnv226xpg9hn8jylf0fy9vwyea85qhr", "codeId": 6413, "digest": "b42c7d9b2c77d01ddbc77e027ce1d6950b635ed7e564df928095056c2ae2759a" }, "hpl_igp_oracle": { + "address": "inj1k4ju5nppwcucpet7ggjhefdweme35husalxm9a", "codeId": 6414, "digest": "53872a2989164ee487187910fe0813adcfdb04f3876f5ceead14aafed2c181c1" }, @@ -49,6 +51,7 @@ "digest": "f86fc1bbabf2688770a2900ef25a02fa2e2c198b0e42b861162a3900f9a6c7aa" }, "hpl_mailbox": { + "address": "inj1rk600zvjzw0ype8q9526m63d7upk2usg40fu72", "codeId": 6419, "digest": "2ed06bf3633ff0af4821527b1eca5a2633f2865f1bd577c3c6a4e694c7f688b1" }, @@ -57,10 +60,12 @@ "digest": "3a03d211d98ac3d32a39ff188be19e4ec9a5f992269f696197b7f09952c909df" }, "hpl_test_mock_msg_receiver": { + "address": "inj1q33naqf9zqx6zf0de7m0znjtaxsueyn7928f3r", "codeId": 6421, "digest": "9dba7ab71a392b369561370eaffbcd450abaeca64111d2ff5daa389912846313" }, "hpl_validator_announce": { + "address": "inj1vghn9za7kdxpjx8hjckv86e7h77kl0r2pte7xw", "codeId": 6422, "digest": "4d8d5b22b1ebbd8cc221ee9bcf3e79587bfbfc91845e5726dd9de052d410c8dc" }, @@ -71,7 +76,20 @@ "hpl_warp_native": { "codeId": 6424, "digest": "3dbf222865d96c9496bdddc815ff3c0b776bc143d7d56045330ec4ebfd5a69fe" + }, + "hpl_default_ism": { + "codeId": 6416, + "digest": "8969e6927592b91b0cd8755bc79cf0152a2a5f51375dd86980ea36670623e2ac", + "address": "inj1xk20l3fcmycqyezu808q2lrt3xvfq8l3363w5a" + }, + "hpl_default_hook": { + "address": "inj1p0q2uylnnv226xpg9hn8jylf0fy9vwyea85qhr" + }, + "hpl_required_hook": { + "codeId": 6408, + "digest": "25e0c969f233c2db5dd81b17005a0367935bfea9f6b8275873026562d9583920", + "address": "inj13wcydgk47m74k4qucq59l74gs249u5zmlqsjxn" } }, "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" -} \ No newline at end of file +} From 97bf0f5290a1d401d36e790f3fda95bf871dce21 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Mon, 22 Jan 2024 17:31:51 -0500 Subject: [PATCH 30/31] Support pausable ISM deploys --- scripts/action/deploy.ts | 2 +- scripts/action/fetch.ts | 9 +++++---- scripts/src/config.ts | 15 ++++++++++----- scripts/src/deploy.ts | 12 +++++++++++- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/scripts/action/deploy.ts b/scripts/action/deploy.ts index bd3e2ff0..21e81de7 100644 --- a/scripts/action/deploy.ts +++ b/scripts/action/deploy.ts @@ -159,7 +159,7 @@ const deploy_ism_hook = async ( owner: "", validators: { 123: { - addrs: [client.signer_addr, client.signer_addr], + addrs: [client.signer_addr], threshold: 1, }, }, diff --git a/scripts/action/fetch.ts b/scripts/action/fetch.ts index 270968d4..97d53126 100644 --- a/scripts/action/fetch.ts +++ b/scripts/action/fetch.ts @@ -1,10 +1,6 @@ import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate"; -import { Context } from "../src/types"; import { Client } from "../src/config"; -import { Contracts } from "../src/deploy"; import { - HplMailbox, - HplValidatorAnnounce, HplHookAggregate, HplHookMerkle, HplHookPausable, @@ -15,11 +11,15 @@ import { HplIsmAggregate, HplIsmMultisig, HplIsmRouting, + HplMailbox, HplTestMockHook, HplTestMockMsgReceiver, + HplValidatorAnnounce, HplWarpCw20, HplWarpNative, } from "../src/contracts"; +import { Contracts } from "../src/deploy"; +import { Context } from "../src/types"; type Const = new ( address: string | undefined, @@ -70,6 +70,7 @@ export class ContractFetcher { aggregate: this.get(HplIsmAggregate, "hpl_ism_aggregate"), multisig: this.get(HplIsmMultisig, "hpl_ism_multisig"), routing: this.get(HplIsmRouting, "hpl_ism_routing"), + pausable: this.get(HplHookPausable, "hpl_ism_pausable"), }, mocks: { hook: this.get(HplTestMockHook, "hpl_test_mock_hook"), diff --git a/scripts/src/config.ts b/scripts/src/config.ts index 86f7337c..e4a1c5dc 100644 --- a/scripts/src/config.ts +++ b/scripts/src/config.ts @@ -1,14 +1,14 @@ -import yaml from "js-yaml"; -import { readFileSync } from "fs"; import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate"; +import { Secp256k1, keccak256 } from "@cosmjs/crypto"; +import { DirectSecp256k1Wallet } from "@cosmjs/proto-signing"; +import { GasPrice, SigningStargateClient } from "@cosmjs/stargate"; import { Tendermint34Client, Tendermint37Client, TendermintClient, } from "@cosmjs/tendermint-rpc"; -import { DirectSecp256k1Wallet } from "@cosmjs/proto-signing"; -import { GasPrice, SigningStargateClient } from "@cosmjs/stargate"; -import { Secp256k1, keccak256 } from "@cosmjs/crypto"; +import { readFileSync } from "fs"; +import yaml from "js-yaml"; export type IsmType = | { @@ -27,6 +27,11 @@ export type IsmType = type: "routing"; owner: string; isms: { [domain: number]: IsmType }; + } + | { + type: "pausable"; + owner: string; + paused?: boolean; }; export type HookType = diff --git a/scripts/src/deploy.ts b/scripts/src/deploy.ts index 0b64a937..97be272d 100644 --- a/scripts/src/deploy.ts +++ b/scripts/src/deploy.ts @@ -9,6 +9,7 @@ import { HplIgpOracle, HplIsmAggregate, HplIsmMultisig, + HplIsmPausable, HplIsmRouting, HplMailbox, HplTestMockHook, @@ -39,6 +40,7 @@ export type Contracts = { aggregate: HplIsmAggregate; multisig: HplIsmMultisig; routing: HplIsmRouting; + pausable: HplIsmPausable; }; mocks: { hook: HplTestMockHook; @@ -128,7 +130,15 @@ export const deploy_ism = async ( return routing_ism_res.address!; + case "pausable": + const pausable_ism_res = await isms.pausable.instantiate({ + owner: ism.owner === "" ? client.signer : ism.owner, + paused: ism.paused ?? false + }); + + return pausable_ism_res.address!; + default: - throw new Error("invalid ism type"); + throw new Error(`unsupported ism ${ism}`); } }; From ed6b3cc31def7a1b8c1fc88e498b53f3a799810c Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Wed, 24 Jan 2024 18:48:59 -0500 Subject: [PATCH 31/31] Deploy core to injective mainnet --- scripts/action/deploy.ts | 2 +- scripts/context/injective-1.json | 107 ++++++++++++++++--------------- scripts/src/config.ts | 1 + scripts/src/deploy.ts | 10 ++- 4 files changed, 66 insertions(+), 54 deletions(-) diff --git a/scripts/action/deploy.ts b/scripts/action/deploy.ts index 21e81de7..3dbee047 100644 --- a/scripts/action/deploy.ts +++ b/scripts/action/deploy.ts @@ -100,7 +100,7 @@ const deploy_igp = async ( owner: client.signer, gas_token: config.deploy.igp.token || config.network.gas.denom, beneficiary: client.signer, - default_gas_usage: "25000" // must be string + default_gas_usage: "250000" // must be string }); // init igp oracle diff --git a/scripts/context/injective-1.json b/scripts/context/injective-1.json index 1532e927..de765934 100644 --- a/scripts/context/injective-1.json +++ b/scripts/context/injective-1.json @@ -1,95 +1,102 @@ { "contracts": { "hpl_hook_aggregate": { - "codeId": 6407, - "digest": "ff2c972cc66ec5c5aeaac0506a39b48e37387126c07ca7e8a45f9b18d34aa0f2" + "codeId": 381, + "digest": "1d3c711db8ef6a536b94e72259361551343cee1645565f2ae88c9199fb1beef9" + }, + "hpl_hook_fee": { + "codeId": 382, + "digest": "33b4e8ee59c4c5f6c95dde746d21666c7f81a49ce7391a5bd074a3104b703496" }, "hpl_hook_merkle": { - "codeId": 6408, - "digest": "25e0c969f233c2db5dd81b17005a0367935bfea9f6b8275873026562d9583920" + "codeId": 383, + "digest": "c20c709a72769679ce1750927fe38107dfdbc5da2fa1c6da51bdf559aa5f652e" }, "hpl_hook_pausable": { - "codeId": 6409, - "digest": "10bce0701f9cb67cb1b80aaeb0af7d8bc91175b6a9299783ae420f1adc413ed3" + "codeId": 384, + "digest": "454a4b99f7b3674c7fdc8e2c143bb2deb7fb66c9f94de98b893b56cd4fe2a0e7" }, "hpl_hook_routing": { - "codeId": 6410, - "digest": "3a7f4ef76b596c77faef35890e924e8f8550fdb6f2569fa62ec67dbcbb7f1006" + "codeId": 385, + "digest": "d5cc55f7287d5ee0e59cf236e6211c8a68bd54bd773f4ee03ffb67df288b57ba" }, "hpl_hook_routing_custom": { - "codeId": 6411, - "digest": "6fd4796181e046ae71dc7f2cdefa8459e26431da67b0e9028c0952b980f6dfc2" + "codeId": 386, + "digest": "55e9c6e12965617fd5dd19cac6c1d460009daeec66cc32a64ea8fe3432d7c854" }, "hpl_hook_routing_fallback": { - "codeId": 6412, - "digest": "14fa5137267486053d8b065a5420d215c0c7b33dec51f573d26d7d231a432883" + "codeId": 387, + "digest": "89108d56675015c03cd266bd55bde577b57cfc946d1cea02f4d79dc31d037da5" }, "hpl_igp": { - "address": "inj1p0q2uylnnv226xpg9hn8jylf0fy9vwyea85qhr", - "codeId": 6413, - "digest": "b42c7d9b2c77d01ddbc77e027ce1d6950b635ed7e564df928095056c2ae2759a" + "address": "inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr", + "codeId": 388, + "digest": "9fe334789058e7e236dc4bbea1c3becaa85b884ad762012b1a4753d7159e4c80" }, "hpl_igp_oracle": { - "address": "inj1k4ju5nppwcucpet7ggjhefdweme35husalxm9a", - "codeId": 6414, - "digest": "53872a2989164ee487187910fe0813adcfdb04f3876f5ceead14aafed2c181c1" + "address": "inj1qkmy09d749jdl7p88slrxgzdfnt7u4wnfk7gxk", + "codeId": 389, + "digest": "e3b595296ce0638668bfe0e08dcfcf9717f0955c063d45f15c393dfedd0a309c" }, "hpl_ism_aggregate": { - "codeId": 6415, - "digest": "6ff86c257611dfc0c4d9e82b67ac969fdee4ead8b6c5563a1f16c9b9b059ab7a" + "codeId": 390, + "digest": "b425d0b79c1a51bf4c3e49adb00b389ca8fcccac12b355289c5f6daf27959a18" }, "hpl_ism_multisig": { - "codeId": 6416, - "digest": "8969e6927592b91b0cd8755bc79cf0152a2a5f51375dd86980ea36670623e2ac" + "codeId": 391, + "digest": "ce34a65d380eb4ddb0e47a5e859c740f2f34675a026d8d123eaf548230e704a4" }, "hpl_ism_pausable": { - "codeId": 6417, - "digest": "0470b0d1b7d16baabe014f5fea500b80a748421c61ba061183b3953326321c74" + "codeId": 392, + "digest": "8e5b96cd62378563267be930edb8c3dd9494ec13c6de7909172cdf0fe4edd4b2" }, "hpl_ism_routing": { - "codeId": 6418, - "digest": "f86fc1bbabf2688770a2900ef25a02fa2e2c198b0e42b861162a3900f9a6c7aa" + "codeId": 393, + "digest": "8453cbfbaa0c68d0980689c734ff1f13c221e5a6e5c1938dea7645d1926a5e6e" }, "hpl_mailbox": { - "address": "inj1rk600zvjzw0ype8q9526m63d7upk2usg40fu72", - "codeId": 6419, - "digest": "2ed06bf3633ff0af4821527b1eca5a2633f2865f1bd577c3c6a4e694c7f688b1" + "address": "inj1palm2wtp6urg0c6j4f2ukv5u5ahdcrqek0sapt", + "codeId": 394, + "digest": "f21ec28636172a8d52602145b00f4cb56ba9d001dd6d4cbe6d5e38ace04ea3f3" }, "hpl_test_mock_hook": { - "codeId": 6420, - "digest": "3a03d211d98ac3d32a39ff188be19e4ec9a5f992269f696197b7f09952c909df" + "codeId": 395, + "digest": "b35975f8d3741d6fff93e262c2bd11ac582464c2adfc7ba95999952349a36395" + }, + "hpl_test_mock_ism": { + "codeId": 396, + "digest": "b99645eab7b564218d184aaf8f840d5944c7bc6c4a55cef6aa36bbff0c44e078" }, "hpl_test_mock_msg_receiver": { - "address": "inj1q33naqf9zqx6zf0de7m0znjtaxsueyn7928f3r", - "codeId": 6421, - "digest": "9dba7ab71a392b369561370eaffbcd450abaeca64111d2ff5daa389912846313" + "address": "inj1sy7sz0ek0353qym2q92l306m3h4tty24t5l9dt", + "codeId": 397, + "digest": "b073c3253a17ab2709e9eabc7c7010832632832ec24bdc6f4ff5ca87fcd26cba" }, "hpl_validator_announce": { - "address": "inj1vghn9za7kdxpjx8hjckv86e7h77kl0r2pte7xw", - "codeId": 6422, - "digest": "4d8d5b22b1ebbd8cc221ee9bcf3e79587bfbfc91845e5726dd9de052d410c8dc" + "address": "inj1r7eztvhul0n4uc22r438m6tl7dezgthdw2cjjx", + "codeId": 398, + "digest": "768b0192d7b307dd6dbd26b8285f33b92530150186171d25b1831fe2fa16ce8a" }, "hpl_warp_cw20": { - "codeId": 6423, - "digest": "4da1db8d03aab8df02fb0588326e392e457e2234c2ea7f32cb062c0d1d276322" + "codeId": 399, + "digest": "656725112ce2574d29ddcc7221a07c82de0bf3da5dc9ca22f70c256bdaa266e2" }, "hpl_warp_native": { - "codeId": 6424, - "digest": "3dbf222865d96c9496bdddc815ff3c0b776bc143d7d56045330ec4ebfd5a69fe" + "codeId": 400, + "digest": "1dc6d8e868dc606c04d2fcb075c8aa68c45416565ebefa60a5252362adcc05c4" }, "hpl_default_ism": { - "codeId": 6416, - "digest": "8969e6927592b91b0cd8755bc79cf0152a2a5f51375dd86980ea36670623e2ac", - "address": "inj1xk20l3fcmycqyezu808q2lrt3xvfq8l3363w5a" + "codeId": 390, + "digest": "b425d0b79c1a51bf4c3e49adb00b389ca8fcccac12b355289c5f6daf27959a18", + "address": "inj1jkvdheut9sdzz492wagp2n3cxh9537w3v4786a" }, "hpl_default_hook": { - "address": "inj1p0q2uylnnv226xpg9hn8jylf0fy9vwyea85qhr" + "address": "inj1y7h9y2vwtdfmxjm6ur9x8czcghp3u86e2wtcxr" }, "hpl_required_hook": { - "codeId": 6408, - "digest": "25e0c969f233c2db5dd81b17005a0367935bfea9f6b8275873026562d9583920", - "address": "inj13wcydgk47m74k4qucq59l74gs249u5zmlqsjxn" + "codeId": 383, + "digest": "c20c709a72769679ce1750927fe38107dfdbc5da2fa1c6da51bdf559aa5f652e", + "address": "inj1269dxcuyglc8mmecf95lf63elt3cq2tz57ka6h" } - }, - "address": "inj1cj08fl9hycsvdhctfqv6rq22al3hjttyxdx768" + } } diff --git a/scripts/src/config.ts b/scripts/src/config.ts index e4a1c5dc..2d8c1f28 100644 --- a/scripts/src/config.ts +++ b/scripts/src/config.ts @@ -22,6 +22,7 @@ export type IsmType = type: "aggregate"; owner: string; isms: IsmType[]; + threshold: number; } | { type: "routing"; diff --git a/scripts/src/deploy.ts b/scripts/src/deploy.ts index 97be272d..f9e3771d 100644 --- a/scripts/src/deploy.ts +++ b/scripts/src/deploy.ts @@ -97,11 +97,14 @@ export const deploy_ism = async ( return multisig_ism_res.address!; case "aggregate": + let sub_modules = []; + for (const v of ism.isms) { + sub_modules.push(await deploy_ism(client, v, contracts)); + } const aggregate_ism_res = await isms.aggregate.instantiate({ owner: ism.owner === "" ? client.signer : ism.owner, - isms: await Promise.all( - ism.isms.map((v) => deploy_ism(client, v, contracts)) - ), + isms: sub_modules, + threshold: ism.threshold, }); return aggregate_ism_res.address!; @@ -131,6 +134,7 @@ export const deploy_ism = async ( return routing_ism_res.address!; case "pausable": + const pausable_ism_res = await isms.pausable.instantiate({ owner: ism.owner === "" ? client.signer : ism.owner, paused: ism.paused ?? false