From 035f264f53909e4afb5740118125d57dead4d4f4 Mon Sep 17 00:00:00 2001 From: shekohex Date: Tue, 21 Jan 2025 03:56:53 +0200 Subject: [PATCH] feat: LRT E2E Testing (#885) * feat: LRTs * fix: Update precompiles bytecode to get around the EVM checks As precompiles are implemented inside the Runtime, they don't have a bytecode, and their account code is empty by default. However in Solidity calling a function of a contract often automatically adds a check that the contract bytecode is non-empty. For that reason a dummy code (0x60006000fd) can be inserted at the precompile address to pass that check. * fix: LRT deposit workflow Related to: https://github.com/tangle-network/lrt/pull/1 * chore: Expose the precompiles as type alias * fix: Update LRT Test * feat: LRT withdraw works * chore: fix clippy * Discard changes to precompiles/multi-asset-delegation/src/lib.rs * Discard changes to runtime/testnet/src/precompiles.rs * feat: add LRT rewards test * chore: debugging the issue with unstaking * feat: add balanceOf calls to the precompile * fix: make balanceOf view calls * chore: remove logging * fix: update tests --- Cargo.lock | 27 ++ node/Cargo.toml | 2 +- node/src/chainspec/mainnet.rs | 22 +- node/src/chainspec/testnet.rs | 28 +- node/src/eth.rs | 1 + node/tests/common/mod.rs | 18 + node/tests/evm_restaking.rs | 272 +++++++++++- .../fixtures/TangleLiquidRestakingVault.json | 1 + precompiles/erc20-utils/src/lib.rs | 2 +- .../MultiAssetDelegation.sol | 47 +- precompiles/multi-asset-delegation/src/lib.rs | 53 ++- .../multi-asset-delegation/src/mock.rs | 7 + .../multi-asset-delegation/src/tests.rs | 404 +++++++++++++++++- runtime/mainnet/src/lib.rs | 3 + .../metadata/tangle-testnet-runtime.scale | Bin 392180 -> 392625 bytes tangle-subxt/src/tangle_testnet_runtime.rs | 310 ++++++++++---- 16 files changed, 1084 insertions(+), 113 deletions(-) create mode 100644 node/tests/fixtures/TangleLiquidRestakingVault.json diff --git a/Cargo.lock b/Cargo.lock index 9000a6ec1..8f9d5b9bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -390,7 +390,9 @@ dependencies = [ "alloy-primitives", "alloy-pubsub", "alloy-rpc-client", + "alloy-rpc-types-debug", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", "alloy-transport", "alloy-transport-http", "alloy-transport-ipc", @@ -491,6 +493,7 @@ dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", "alloy-rpc-types-eth", + "alloy-rpc-types-trace", "alloy-serde", "serde", ] @@ -506,6 +509,16 @@ dependencies = [ "alloy-serde", ] +[[package]] +name = "alloy-rpc-types-debug" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358d6a8d7340b9eb1a7589a6c1fb00df2c9b26e90737fa5ed0108724dd8dac2c" +dependencies = [ + "alloy-primitives", + "serde", +] + [[package]] name = "alloy-rpc-types-engine" version = "0.9.2" @@ -542,6 +555,20 @@ dependencies = [ "thiserror 2.0.8", ] +[[package]] +name = "alloy-rpc-types-trace" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd38207e056cc7d1372367fbb4560ddf9107cbd20731743f641246bf0dede149" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.8", +] + [[package]] name = "alloy-serde" version = "0.9.2" diff --git a/node/Cargo.toml b/node/Cargo.toml index 41b47f032..285b00c4b 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -121,7 +121,7 @@ futures-timer = { workspace = true } [dev-dependencies] tangle-subxt = { workspace = true } sp-tracing = { workspace = true } -alloy = { version = "0.9", features = ["full"] } +alloy = { version = "0.9", features = ["full", "provider-debug-api"] } anyhow = "1.0" [features] diff --git a/node/src/chainspec/mainnet.rs b/node/src/chainspec/mainnet.rs index b359ab633..2722a782c 100644 --- a/node/src/chainspec/mainnet.rs +++ b/node/src/chainspec/mainnet.rs @@ -36,8 +36,8 @@ use sp_runtime::{ }; use tangle_primitives::types::{BlockNumber, Signature}; use tangle_runtime::{ - AccountId, Balance, MaxVestingSchedules, Perbill, StakerStatus, TreasuryPalletId, UNIT, - WASM_BINARY, + AccountId, Balance, MaxVestingSchedules, Perbill, Precompiles, StakerStatus, TreasuryPalletId, + UNIT, WASM_BINARY, }; /// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type. @@ -200,12 +200,30 @@ fn mainnet_genesis( }) .collect(); + // As precompiles are implemented inside the Runtime, they don't have a bytecode, and + // their account code is empty by default. However in Solidity calling a function of a + // contract often automatically adds a check that the contract bytecode is non-empty. + // For that reason a dummy code (0x60006000fd) can be inserted at the precompile address + // to pass that check. + let revert_bytecode = [0x60, 0x00, 0x60, 0x00, 0xFD]; let evm_accounts = { let mut map = BTreeMap::new(); for (address, account) in genesis_evm_distribution { map.insert(address, account); } + + Precompiles::used_addresses_h160().for_each(|address| { + map.insert( + address, + fp_evm::GenesisAccount { + nonce: Default::default(), + balance: Default::default(), + storage: Default::default(), + code: revert_bytecode.to_vec(), + }, + ); + }); map }; diff --git a/node/src/chainspec/testnet.rs b/node/src/chainspec/testnet.rs index a23bd1baf..81010b4df 100644 --- a/node/src/chainspec/testnet.rs +++ b/node/src/chainspec/testnet.rs @@ -39,8 +39,8 @@ use tangle_primitives::{ TESTNET_LOCAL_SS58_PREFIX, }; use tangle_testnet_runtime::{ - AccountId, Balance, MaxVestingSchedules, Perbill, StakerStatus, TreasuryPalletId, UNIT, - WASM_BINARY, + AccountId, Balance, MaxVestingSchedules, Perbill, Precompiles, StakerStatus, TreasuryPalletId, + UNIT, WASM_BINARY, }; /// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type. @@ -259,7 +259,7 @@ fn testnet_genesis( // contract often automatically adds a check that the contract bytecode is non-empty. // For that reason a dummy code (0x60006000fd) can be inserted at the precompile address // to pass that check. - let _revert_bytecode = [0x60, 0x00, 0x60, 0x00, 0xFD]; + let revert_bytecode = [0x60, 0x00, 0x60, 0x00, 0xFD]; let evm_accounts = { let mut map = BTreeMap::new(); @@ -268,17 +268,17 @@ fn testnet_genesis( map.insert(address, account); } - // Precompiles::used_addresses().for_each(|address| { - // map.insert( - // address.into(), - // fp_evm::GenesisAccount { - // nonce: Default::default(), - // balance: Default::default(), - // storage: Default::default(), - // code: revert_bytecode.clone(), - // }, - // ); - // }); + Precompiles::used_addresses_h160().for_each(|address| { + map.insert( + address, + fp_evm::GenesisAccount { + nonce: Default::default(), + balance: Default::default(), + storage: Default::default(), + code: revert_bytecode.to_vec(), + }, + ); + }); let fully_loaded_accounts = get_fully_funded_accounts_for([ "8efcaf2c4ebbf88bf07f3bb44a2869c4c675ad7a", diff --git a/node/src/eth.rs b/node/src/eth.rs index 22d5600db..48804eb51 100644 --- a/node/src/eth.rs +++ b/node/src/eth.rs @@ -150,6 +150,7 @@ impl std::str::FromStr for EthApi { } #[allow(dead_code)] +#[derive(Debug, Clone)] pub struct RpcConfig { pub ethapi: Vec, pub ethapi_max_permits: u32, diff --git a/node/tests/common/mod.rs b/node/tests/common/mod.rs index a620f027b..e3c2ac1a7 100644 --- a/node/tests/common/mod.rs +++ b/node/tests/common/mod.rs @@ -8,7 +8,9 @@ use alloy::{ }, transports::BoxTransport, }; +use parity_scale_codec::Encode; use sc_cli::{CliConfiguration, SubstrateCli}; +use sp_tracing::warn; use tangle::{chainspec, cli, eth, service}; use tangle_primitives::types::Block; use tangle_subxt::{subxt, subxt_signer}; @@ -189,6 +191,10 @@ pub trait AddressConverter { fn to_account_id(&self) -> subxt::utils::AccountId32; } +pub trait AccountIdConverter { + fn to_address(&self) -> alloy::primitives::Address; +} + impl AddressConverter for alloy::primitives::Address { fn to_account_id(&self) -> subxt::utils::AccountId32 { let mut data = [0u8; 24]; @@ -200,6 +206,16 @@ impl AddressConverter for alloy::primitives::Address { } } +impl AccountIdConverter for subxt::utils::AccountId32 { + fn to_address(&self) -> alloy::primitives::Address { + self.using_encoded(|b| { + let mut addr = [0u8; 20]; + addr.copy_from_slice(&b[0..20]); + alloy::primitives::Address::from(addr) + }) + } +} + /// Run an end-to-end test with the given future. #[track_caller] pub fn run_e2e_test(f: F) @@ -216,6 +232,7 @@ where "--rpc-methods=unsafe", "--rpc-external", "--rpc-port=9944", + "--ethapi=trace,debug,txpool", #[cfg(feature = "manual-seal")] "--sealing=manual", "--auto-insert-keys", @@ -258,6 +275,7 @@ where max_past_logs: cli.eth.max_past_logs, tracing_raw_max_memory_usage: cli.eth.tracing_raw_max_memory_usage, }; + warn!("Starting the node with the following RPC config: {:?}", rpc_config); runner .async_run(|config| { diff --git a/node/tests/evm_restaking.rs b/node/tests/evm_restaking.rs index b17066d18..187dcc967 100644 --- a/node/tests/evm_restaking.rs +++ b/node/tests/evm_restaking.rs @@ -8,6 +8,7 @@ use core::future::Future; use core::ops::Div; use core::time::Duration; +use alloy::primitives::utils::*; use alloy::primitives::*; use alloy::providers::Provider; use alloy::sol; @@ -37,6 +38,13 @@ sol! { "../precompiles/multi-asset-delegation/MultiAssetDelegation.sol", } +sol! { + #[allow(clippy::too_many_arguments)] + #[sol(rpc, all_derives)] + TangleLiquidRestakingVault, + "tests/fixtures/TangleLiquidRestakingVault.json", +} + const MULTI_ASSET_DELEGATION: Address = address!("0000000000000000000000000000000000000822"); /// Waits for a specific block number to be reached @@ -151,6 +159,33 @@ async fn create_asset( Ok(()) } +/// Deploys and initializes an Tangle Liquid Restaking Vault contract +async fn deploy_tangle_lrt( + provider: AlloyProviderWithWallet, + base_token: Address, + operator: [u8; 32], + name: &str, + symbol: &str, +) -> anyhow::Result
{ + info!( + %base_token, + %name, + %symbol, + "Deploying Tangle LRT contract..."); + let token = TangleLiquidRestakingVault::deploy( + provider.clone(), + base_token, + operator.into(), + vec![], + MULTI_ASSET_DELEGATION, + name.into(), + symbol.into(), + ) + .await?; + info!("Deployed {} Tangle LRT contract at address: {}", symbol, token.address()); + Ok(*token.address()) +} + /// Setup the E2E test environment. #[track_caller] pub fn run_mad_test(f: TFn) @@ -214,6 +249,8 @@ where // Create a new vault and these assets to it. let vault_id = 0; + let deposit_cap = parse_ether("100").unwrap(); + let incentive_cap = parse_ether("100").unwrap(); let update_vault_reward_config = api::tx().sudo().sudo( api::runtime_types::tangle_testnet_runtime::RuntimeCall::Rewards( api::runtime_types::pallet_rewards::pallet::Call::update_vault_reward_config { @@ -221,8 +258,8 @@ where new_config: api::runtime_types::pallet_rewards::types::RewardConfigForAssetVault { apy: api::runtime_types::sp_arithmetic::per_things::Percent(1), - incentive_cap: 100_000_000_000_000, - deposit_cap: 100_000_000_000_000, + incentive_cap: incentive_cap.to::(), + deposit_cap: deposit_cap.to::(), boost_multiplier: None, }, }, @@ -308,12 +345,13 @@ where wbtc_asset_id: 2, }; let result = f(test_inputs).await; - assert!(result.is_ok(), "Test failed: {result:?}"); if result.is_ok() { info!("***************** Test passed **********"); } else { error!("***************** Test failed **********"); + error!("{:?}", result); } + assert!(result.is_ok(), "Test failed: {result:?}"); result }); } @@ -690,3 +728,231 @@ fn deposits_withdraw_asset_id() { anyhow::Ok(()) }) } + +#[test] +fn lrt_deposit_withdraw_erc20() { + run_mad_test(|t| async move { + let alice = TestAccount::Alice; + let alice_provider = alloy_provider_with_wallet(&t.provider, alice.evm_wallet()); + // Join operators + let tnt = U256::from(100_000u128); + assert!(join_as_operator(&alice_provider, tnt).await?); + // Setup a LRT Vault for Alice. + let lrt_address = deploy_tangle_lrt( + alice_provider.clone(), + t.weth, + alice.address().to_account_id().0, + "Liquid Restaked Ether", + "lrtETH", + ) + .await?; + + // Bob as delegator + let bob = TestAccount::Bob; + let bob_provider = alloy_provider_with_wallet(&t.provider, bob.evm_wallet()); + // Mint WETH for Bob + let weth_amount = parse_ether("10").unwrap(); + let weth = MockERC20::new(t.weth, &bob_provider); + weth.mint(bob.address(), weth_amount).send().await?.get_receipt().await?; + info!("Minted {} WETH for Bob", format_ether(weth_amount)); + + let bob_balance = weth.balanceOf(bob.address()).call().await?; + assert_eq!(bob_balance._0, weth_amount); + + // Approve LRT contract to spend WETH + let deposit_amount = weth_amount.div(U256::from(2)); + let approve_result = + weth.approve(lrt_address, deposit_amount).send().await?.get_receipt().await?; + assert!(approve_result.status()); + info!("Approved {} WETH for deposit in LRT", format_ether(deposit_amount)); + + // Deposit WETH to LRT + let lrt = TangleLiquidRestakingVault::new(lrt_address, &bob_provider); + let deposit_result = lrt + .deposit(deposit_amount, bob.address()) + .send() + .await? + .with_timeout(Some(Duration::from_secs(5))) + .get_receipt() + .await?; + assert!(deposit_result.status()); + info!("Deposited {} WETH in LRT", format_ether(deposit_amount)); + + // Bob deposited `deposit_amount` WETH, should receive `deposit_amount` lrtETH in return + let lrt_balance = lrt.balanceOf(bob.address()).call().await?; + assert_eq!(lrt_balance._0, deposit_amount); + // Bob should have `weth_amount - deposit_amount` WETH + let bob_balance = weth.balanceOf(bob.address()).call().await?; + assert_eq!(bob_balance._0, weth_amount - deposit_amount); + + let mad_weth_balance = weth.balanceOf(t.pallet_account_id.to_address()).call().await?; + assert_eq!(mad_weth_balance._0, deposit_amount); + + // LRT should be a delegator to the operator in the MAD pallet. + let operator_key = api::storage() + .multi_asset_delegation() + .operators(alice.address().to_account_id()); + let maybe_operator = t.subxt.storage().at_latest().await?.fetch(&operator_key).await?; + assert!(maybe_operator.is_some()); + assert_eq!(maybe_operator.as_ref().map(|p| p.delegation_count), Some(1)); + assert_eq!( + maybe_operator.map(|p| p.delegations.0[0].clone()), + Some(DelegatorBond { + delegator: lrt_address.to_account_id(), + amount: deposit_amount.to::(), + asset_id: Asset::Erc20((<[u8; 20]>::from(t.weth)).into()), + __ignore: std::marker::PhantomData + }) + ); + + // Wait for a new sessions to happen + let session_index = wait_for_next_session(&t.subxt).await?; + info!("New session started: {}", session_index); + + let withdraw_amount = deposit_amount.div(U256::from(2)); + info!( + ?lrt_address, + ?t.weth, + deposit_amount = %format_ether(deposit_amount), + withdraw_amount = %format_ether(withdraw_amount), + "Scheduling unstake of {} lrtETH", + format_ether(withdraw_amount) + ); + // Schedule unstake + let sch_unstake_result = lrt + .scheduleUnstake(withdraw_amount) + .send() + .await? + .with_timeout(Some(Duration::from_secs(5))) + .get_receipt() + .await?; + + assert!(sch_unstake_result.status()); + info!("Scheduled unstake of {} lrtETH", format_ether(withdraw_amount)); + + // Wait for a new sessions to happen + let session_index = wait_for_next_session(&t.subxt).await?; + info!("New session started: {}", session_index); + + // Execute the unstake + let exec_unstake_result = lrt + .executeUnstake() + .send() + .await? + .with_timeout(Some(Duration::from_secs(5))) + .get_receipt() + .await?; + + assert!(exec_unstake_result.status()); + info!("Executed unstake of {} lrtETH", format_ether(withdraw_amount)); + + // Schedule a withdrawal + let sch_withdraw_result = lrt + .scheduleWithdraw(withdraw_amount) + .send() + .await? + .with_timeout(Some(Duration::from_secs(5))) + .get_receipt() + .await?; + assert!(sch_withdraw_result.status()); + info!("Scheduled withdrawal of {} lrtETH", format_ether(withdraw_amount)); + + // Wait for two new sessions to happen + let session_index = wait_for_next_session(&t.subxt).await?; + info!("New session started: {}", session_index); + // Execute the withdrawal + let exec_withdraw_result = lrt + .withdraw(withdraw_amount, bob.address(), bob.address()) + .send() + .await? + .with_timeout(Some(Duration::from_secs(5))) + .get_receipt() + .await?; + assert!(exec_withdraw_result.status()); + + // Bob deposited `deposit_amount` and withdrew `withdraw_amount` + // `deposit_amount` is 1/2 of the minted amount + // `withdraw_amount` is 1/2 of the deposited amount + // So, Bob should have `weth_amount - deposit_amount + withdraw_amount` WETH + let expected_balance = weth_amount - deposit_amount + withdraw_amount; + let bob_balance = weth.balanceOf(bob.address()).call().await?; + assert_eq!(bob_balance._0, expected_balance); + + anyhow::Ok(()) + }); +} + +#[test] +fn lrt_rewards() { + run_mad_test(|t| async move { + let alice = TestAccount::Alice; + let alice_provider = alloy_provider_with_wallet(&t.provider, alice.evm_wallet()); + // Join operators + let tnt = U256::from(100_000u128); + assert!(join_as_operator(&alice_provider, tnt).await?); + // Setup a LRT Vault for Alice. + let lrt_address = deploy_tangle_lrt( + alice_provider.clone(), + t.weth, + alice.address().to_account_id().0, + "Liquid Restaked Ether", + "lrtETH", + ) + .await?; + + // Bob as delegator + let bob = TestAccount::Bob; + let bob_provider = alloy_provider_with_wallet(&t.provider, bob.evm_wallet()); + // Mint WETH for Bob + let weth_amount = parse_ether("10").unwrap(); + let weth = MockERC20::new(t.weth, &bob_provider); + weth.mint(bob.address(), weth_amount).send().await?.get_receipt().await?; + + // Approve LRT contract to spend WETH + let deposit_amount = weth_amount.div(U256::from(2)); + let approve_result = + weth.approve(lrt_address, deposit_amount).send().await?.get_receipt().await?; + assert!(approve_result.status()); + info!("Approved {} WETH for deposit in LRT", format_ether(deposit_amount)); + + // Deposit WETH to LRT + let lrt = TangleLiquidRestakingVault::new(lrt_address, &bob_provider); + let deposit_result = lrt + .deposit(deposit_amount, bob.address()) + .send() + .await? + .with_timeout(Some(Duration::from_secs(5))) + .get_receipt() + .await?; + assert!(deposit_result.status()); + info!("Deposited {} WETH in LRT", format_ether(deposit_amount)); + + // Wait for two new sessions to happen + let session_index = wait_for_next_session(&t.subxt).await?; + info!("New session started: {}", session_index); + + let vault_id = 0; + let cfg_addr = api::storage().rewards().reward_config_storage(vault_id); + let cfg = t.subxt.storage().at_latest().await?.fetch(&cfg_addr).await?; + let apy = cfg.map(|c| c.apy).unwrap(); + info!("APY: {}%", apy.0); + + let rewards_addr = api::apis().rewards_api().query_user_rewards( + lrt_address.to_account_id(), + Asset::Erc20((<[u8; 20]>::from(t.weth)).into()), + ); + let user_rewards = t.subxt.runtime_api().at_latest().await?.call(rewards_addr).await?; + match user_rewards { + Ok(rewards) => { + info!("User rewards: {} TNT", format_ether(U256::from(rewards))); + assert!(rewards > 0); + }, + Err(e) => { + error!("Error: {:?}", e); + bail!("Error while fetching user rewards"); + }, + } + + anyhow::Ok(()) + }); +} diff --git a/node/tests/fixtures/TangleLiquidRestakingVault.json b/node/tests/fixtures/TangleLiquidRestakingVault.json new file mode 100644 index 000000000..c62cd8f73 --- /dev/null +++ b/node/tests/fixtures/TangleLiquidRestakingVault.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_baseToken","type":"address","internalType":"address"},{"name":"_operator","type":"bytes32","internalType":"bytes32"},{"name":"_blueprintSelection","type":"uint64[]","internalType":"uint64[]"},{"name":"_mads","type":"address","internalType":"address"},{"name":"_name","type":"string","internalType":"string"},{"name":"_symbol","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"type":"function","name":"DOMAIN_SEPARATOR","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addRewardToken","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"allowance","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"asset","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ERC20"}],"stateMutability":"view"},{"type":"function","name":"balanceOf","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"blueprintSelection","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"cancelUnstake","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancelWithdraw","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimRewards","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"tokens","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"rewards","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"convertToAssets","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"convertToShares","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"deposit","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"executeUnstake","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getClaimableRewards","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRewardData","inputs":[{"name":"token","type":"address","internalType":"address"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"},{"name":"lastUpdateTime","type":"uint256","internalType":"uint256"},{"name":"isValid","type":"bool","internalType":"bool"},{"name":"rewardTimestamps","type":"uint256[]","internalType":"uint256[]"},{"name":"rewardAmounts","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getRewardTokens","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"mads","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract MultiAssetDelegation"}],"stateMutability":"view"},{"type":"function","name":"maxDeposit","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxMint","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxRedeem","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxWithdraw","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"nonces","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"operator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"permit","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"previewDeposit","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"previewMint","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"previewRedeem","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"previewWithdraw","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"redeem","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"rewardData","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"index","type":"uint256","internalType":"uint256"},{"name":"lastUpdateTime","type":"uint256","internalType":"uint256"},{"name":"isValid","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"rewardTokens","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"scheduleUnstake","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"scheduleWithdraw","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"scheduledUnstakeAmount","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"scheduledWithdrawAmount","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ERC20"}],"stateMutability":"view"},{"type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unstakeAmount","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"userSnapshots","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"rewardIndex","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"shareBalance","type":"uint256","internalType":"uint256"},{"name":"lastRewardIndex","type":"uint256","internalType":"uint256"},{"name":"pendingRewards","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Delegated","inputs":[{"name":"operator","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"blueprintSelection","type":"uint64[]","indexed":false,"internalType":"uint64[]"}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Deposited","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RewardIndexUpdated","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RewardSnapshotCreated","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"rewardIndex","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RewardTokenAdded","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RewardsClaimed","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"UnstakeCancelled","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"UnstakeCancelled","inputs":[{"name":"operator","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"UnstakeScheduled","inputs":[{"name":"operator","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"receiver","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalCancelled","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalCancelled","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalScheduled","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ExceedsScheduledAmount","inputs":[]},{"type":"error","name":"InsufficientScheduledAmount","inputs":[]},{"type":"error","name":"InvalidRewardToken","inputs":[]},{"type":"error","name":"NoRewardsToClaim","inputs":[]},{"type":"error","name":"NoScheduledAmount","inputs":[]},{"type":"error","name":"RewardTokenAlreadyAdded","inputs":[]},{"type":"error","name":"Unauthorized","inputs":[]},{"type":"error","name":"WithdrawalNotUnstaked","inputs":[]}],"bytecode":{"object":"0x61014060405234801562000011575f80fd5b50604051620046df380380620046df8339810160408190526200003491620003ba565b8583338885858181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000079573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200009f9190620004f2565b5f620000ac8482620005a7565b506001620000bb8382620005a7565b5060ff81166080524660a052620000d162000163565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040515f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b03918216610100521661012052600d85905583516200015690600e906020870190620001fd565b50505050505050620006e9565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200019591906200066f565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b828054828255905f5260205f2090600301600490048101928215620002a7579160200282015f5b838211156200027057835183826101000a8154816001600160401b0302191690836001600160401b03160217905550926020019260080160208160070104928301926001030262000224565b8015620002a55782816101000a8154906001600160401b03021916905560080160208160070104928301926001030262000270565b505b50620002b5929150620002b9565b5090565b5b80821115620002b5575f8155600101620002ba565b80516001600160a01b0381168114620002e6575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156200032a576200032a620002eb565b604052919050565b5f82601f83011262000342575f80fd5b81516001600160401b038111156200035e576200035e620002eb565b602062000374601f8301601f19168201620002ff565b828152858284870101111562000388575f80fd5b5f5b83811015620003a75785810183015182820184015282016200038a565b505f928101909101919091529392505050565b5f805f805f8060c08789031215620003d0575f80fd5b620003db87620002cf565b60208881015160408a01519298509650906001600160401b038082111562000401575f80fd5b818a0191508a601f83011262000415575f80fd5b8151818111156200042a576200042a620002eb565b8060051b6200043b858201620002ff565b918252838101850191858101908e84111562000455575f80fd5b948601945b83861015620004875785519250848316831462000476575f8081fd5b82825294860194908601906200045a565b99506200049b9250505060608b01620002cf565b955060808a0151925080831115620004b1575f80fd5b620004bf8b848c0162000332565b945060a08a0151925080831115620004d5575f80fd5b5050620004e589828a0162000332565b9150509295509295509295565b5f6020828403121562000503575f80fd5b815160ff8116811462000514575f80fd5b9392505050565b600181811c908216806200053057607f821691505b6020821081036200054f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620005a2575f81815260208120601f850160051c810160208610156200057d5750805b601f850160051c820191505b818110156200059e5782815560010162000589565b5050505b505050565b81516001600160401b03811115620005c357620005c3620002eb565b620005db81620005d484546200051b565b8462000555565b602080601f83116001811462000611575f8415620005f95750858301515b5f19600386901b1c1916600185901b1785556200059e565b5f85815260208120601f198616915b82811015620006415788860151825594840194600190910190840162000620565b50858210156200065f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8083546200067e816200051b565b60018281168015620006995760018114620006af57620006dd565b60ff1984168752821515830287019450620006dd565b875f526020805f205f5b85811015620006d45781548a820152908401908201620006b9565b50505082870194505b50929695505050505050565b60805160a05160c05160e0516101005161012051613f1b620007c45f395f818161074b015281816120c4015281816121ad015281816123990152818161271601528181612c2a01528181612cef01528181612f8e0152818161309b015261349901525f818161088a0152818161209b0152818161236a015281816126e701528181612bf301528181612d2001528181612f5f015261346a01525f818161046701528181610bb0015281816113db01528181612b2c01528181613237015261340001525f6110f201525f6110c201525f6104260152613f1b5ff3fe608060405234801561000f575f80fd5b5060043610610325575f3560e01c80638da5cb5b116101a8578063c4f59f9b116100f3578063d905777e1161009e578063ef8b30f711610079578063ef8b30f71461084c578063f2fde38b1461085f578063f56f4f0f14610872578063fc0c546a14610885575f80fd5b8063d905777e146107ce578063dd62ed3e14610803578063e031cc831461082d575f80fd5b8063cce9d801116100ce578063cce9d80114610795578063ce96cb77146107a8578063d505accf146107bb575f80fd5b8063c4f59f9b1461076d578063c63d75b6146104ae578063c6e6f59214610782575f80fd5b8063a9059cbb11610153578063b460af941161012e578063b460af9414610720578063ba08765214610733578063c20bb5ac14610746575f80fd5b8063a9059cbb146106ce578063b294eb18146106e1578063b3d7f6b91461070d575f80fd5b806395d89b411161018357806395d89b41146106945780639f01f7ba1461069c578063a209a86f146106af575f80fd5b80638da5cb5b14610642578063919dd0b71461066257806394bf804d14610681575f80fd5b8063313ce567116102735780634cdad5061161021e5780636e553f65116101f95780636e553f65146105de57806370a08231146105f15780637bb7bed1146106105780637ecebe0014610623575f80fd5b80634cdad50614610553578063570ca73514610566578063596404bb1461056f575f80fd5b8063402d267d1161024e578063402d267d146104ae578063451831e4146104e157806348e5d9f814610505575f80fd5b8063313ce567146104215780633644e5151461045a57806338d52e0f14610462575f80fd5b8063106d08df116102d35780632026ffa3116102ae5780632026ffa3146103db57806323b872dd146103fb5780632b187b2b1461040e575f80fd5b8063106d08df146103ac57806318160ddd146103bf5780631c03e6cc146103c8575f80fd5b8063095ea7b311610303578063095ea7b31461036c5780630a28a4771461038f5780630cea2bda146103a2575f80fd5b806301e1d1141461032957806306fdde031461034457806307a2d13a14610359575b5f80fd5b6103316108ac565b6040519081526020015b60405180910390f35b61034c6108bb565b60405161033b91906138df565b610331610367366004613948565b610946565b61037f61037a366004613987565b610972565b604051901515815260200161033b565b61033161039d366004613948565b6109eb565b6103aa610a0a565b005b6103aa6103ba366004613948565b610a90565b61033160025481565b6103aa6103d63660046139af565b610b90565b6103ee6103e93660046139c8565b610e69565b60405161033b9190613a80565b61037f610409366004613a92565b610fdf565b6103aa61041c366004613948565b610ffe565b6104487f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161033b565b6103316110bf565b6104897f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033b565b6103316104bc3660046139af565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b6104f46104ef3660046139af565b611114565b60405161033b959493929190613acb565b6105366105133660046139af565b60086020525f908152604090208054600182015460029092015490919060ff1683565b60408051938452602084019290925215159082015260600161033b565b610331610561366004613948565b611213565b610331600d5481565b6105b661057d366004613b03565b600960209081525f9283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a00161033b565b6103316105ec366004613b34565b61121d565b6103316105ff3660046139af565b60036020525f908152604090205481565b61048961061e366004613948565b611380565b6103316106313660046139af565b60056020525f908152604090205481565b6006546104899073ffffffffffffffffffffffffffffffffffffffff1681565b6103316106703660046139af565b600c6020525f908152604090205481565b61033161068f366004613b34565b6113b5565b61034c611466565b6103aa6106aa366004613948565b611473565b6103316106bd3660046139af565b600a6020525f908152604090205481565b61037f6106dc366004613987565b611598565b6106f46106ef366004613948565b6115ae565b60405167ffffffffffffffff909116815260200161033b565b61033161071b366004613948565b6115e9565b61033161072e366004613b55565b611607565b610331610741366004613b55565b611787565b6104897f000000000000000000000000000000000000000000000000000000000000000081565b610775611908565b60405161033b9190613b8e565b610331610790366004613948565b611975565b6103aa6107a3366004613948565b611994565b6103316107b63660046139af565b611a63565b6103aa6107c9366004613be7565b611a91565b6103316107dc3660046139af565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b610331610811366004613b03565b600460209081525f928352604080842090915290825290205481565b61033161083b3660046139af565b600b6020525f908152604090205481565b61033161085a366004613948565b611daa565b6103aa61086d3660046139af565b611db4565b610331610880366004613b03565b611ea5565b6104897f000000000000000000000000000000000000000000000000000000000000000081565b5f6108b63061204e565b905090565b5f80546108c790613c54565b80601f01602080910402602001604051908101604052809291908181526020018280546108f390613c54565b801561093e5780601f106109155761010080835404028352916020019161093e565b820191905f5260205f20905b81548152906001019060200180831161092157829003601f168201915b505050505081565b6002545f9080156109695761096461095c6108ac565b84908361212f565b61096b565b825b9392505050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109d99086815260200190565b60405180910390a35060015b92915050565b6002545f9080156109695761096481610a026108ac565b859190612169565b335f908152600b602052604081205490819003610a53576040517f601701d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a5b6121ab565b335f908152600a602052604081208054839290610a79908490613cd2565b9091555050335f908152600b602052604081205550565b5f610a9a826109eb565b335f90815260036020526040902054909150811115610b1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e73756666696369656e74207368617265730000000000000000000000000060448201526064015b60405180910390fd5b335f908152600b602052604081208054849290610b38908490613cd2565b90915550610b499050335f83612227565b610b55600d5483612320565b600d546040518381527f3f3ac42003d85fd976b1896956dfdb3db9b2b67fb64d13e8eefd4c12f749bfc9906020015b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81161580610bfe57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b15610c35576040517fdfde867100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526008602052604090206002015460ff1615610c97576040517f4611beab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a001604052805f81526020014281526020016001151581526020015f67ffffffffffffffff811115610cd057610cd0613ce5565b604051908082528060200260200182016040528015610cf9578160200160208202803683370190505b5081526020015f604051908082528060200260200182016040528015610d29578160200160208202803683370190505b50905273ffffffffffffffffffffffffffffffffffffffff82165f9081526008602090815260409182902083518155838201516001820155918301516002830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560608301518051610dad9260038501920190613882565b5060808201518051610dc9916004840191602090910190613882565b5050600780546001810182555f9182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040519092507ff3e4c2c64e71e6ba2eaab9a599bced62f9eb91d2cda610bf41aa8c80ff2cf8269190a250565b60603373ffffffffffffffffffffffffffffffffffffffff851614610eba576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8167ffffffffffffffff811115610ed357610ed3613ce5565b604051908082528060200260200182016040528015610efc578160200160208202803683370190505b509050610f07612422565b5f5b82811015610fd7575f848483818110610f2457610f24613d12565b9050602002016020810190610f3991906139af565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526008602052604090206002015490915060ff16610f9d576040517fdfde867100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fa7868261247f565b838381518110610fb957610fb9613d12565b60209081029190910101525080610fcf81613d3f565b915050610f09565b509392505050565b5f610feb848484612227565b610ff684848461255d565b949350505050565b335f908152600b602052604090205480821115611047576040517f1ae47f5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110518282613d76565b335f908152600b6020526040902055600d5461106d908361269d565b5f611077836109eb565b9050611084333383612227565b60405183815233907f02fbe69eb5474cc010b6c0c236dd70755556cee48c19373e79147100e04de70b906020015b60405180910390a2505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146110ef576108b661279f565b507f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260086020908152604080832080546001820154600283015460038401805486518189028101890190975280875288978897606097889790969095909460ff90911693909260048801929184918301828280156111a857602002820191905f5260205f20905b815481526020019060010190808311611194575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111f857602002820191905f5260205f20905b8154815260200190600101908083116111e4575b50505050509050955095509550955095505091939590929450565b5f6109e582610946565b5f61122783611daa565b600754909150156112de5761123a612422565b5f5b6007548110156112dc575f6007828154811061125a5761125a613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff1691506112868583612837565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600360205260409020549091506112c790869084906112c1908890613cd2565b846128f6565b505080806112d490613d3f565b91505061123c565b505b6112e88383612a9d565b506112f283612bae565b6109e5600d5484600e80548060200260200160405190810160405280929190818152602001828054801561137657602002820191905f5260205f20905f905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116113315790505b5050505050612cb2565b6007818154811061138f575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f6113bf836115e9565b905061140373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612dab565b61140d8284612ea5565b604080518281526020810185905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a36109e5565b600180546108c790613c54565b335f908152600c6020526040902054808211156114bc576040517f1ae47f5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c68282613d76565b335f908152600c6020908152604080832093909355600a905290812080548492906114f2908490613cd2565b90915550611501905082612f1c565b611566600d5483600e805480602002602001604051908101604052809291908181526020018280548015611376575f918252602091829020805467ffffffffffffffff1684529082028301929091600891018084116113315790505050505050612cb2565b60405182815233907f2eed97477f07c07ec48f8f678f4e84f7c0de55bf33f51c3dc989b1335308031990602001610b84565b5f6115a4338484612227565b61096b8383613016565b600e81815481106115bd575f80fd5b905f5260205f209060049182820401919006600802915054906101000a900467ffffffffffffffff1681565b6002545f908015610969576109646115ff6108ac565b849083612169565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600c6020526040812054841115611665576040517f601701d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166d613099565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600c602052604090205461169d908590613d76565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600c60205260409020556116cb846109eb565b6007549091501561177c576116de612422565b5f5b60075481101561177a575f600782815481106116fe576116fe613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff16915061172a8583612837565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526003602052604090205490915061176590869084906112c1908890613d76565b5050808061177290613d3f565b9150506116e0565b505b610ff68484846130fe565b5f61179184611213565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600c60205260409020549091508111156117f2576040517f601701d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117fa613099565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600c602052604090205461182a908290613d76565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600c6020526040902055600754156118fd5761185f612422565b5f5b6007548110156118fb575f6007828154811061187f5761187f613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff1691506118ab8583612837565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600360205260409020549091506118e690869084906112c1908b90613d76565b505080806118f390613d3f565b915050611861565b505b610ff684848461325e565b6060600780548060200260200160405190810160405280929190818152602001828054801561196b57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611940575b5050505050905090565b6002545f908015610969576109648161198c6108ac565b85919061212f565b335f908152600a60205260409020548111156119dc576040517f090d2fd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f908152600c6020526040812080548392906119fa908490613cd2565b9091555050335f908152600a602052604081208054839290611a1d908490613d76565b90915550611a2c905081613427565b6040518181527f546b4489d0d401144246692e660c7c88e2308702063f0a69461de575cf3fdb61906020015b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260408120546109e590610946565b42841015611afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610b11565b5f6001611b066110bf565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611c54573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611ccf57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611d35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610b11565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f6109e582611975565b60065473ffffffffffffffffffffffffffffffffffffffff163314611e35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610b11565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120548103611ed757505f6109e5565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152600960209081526040808320938616808452938252808320815160a080820184528254825260018084015483870152600280850154848701526003808601546060808701919091526004909601546080860152988852600887528588208651938401875280548452918201548388015281015460ff16151582860152968701805485518188028101880190965280865292979195919493860193929091830182828015611fbd57602002820191905f5260205f20905b815481526020019060010190808311611fa9575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561201357602002820191905f5260205f20905b815481526020019060010190808311611fff575b50505091909252505083518251929350612045926120319250613d76565b604084015190670de0b6b3a764000061212f565b95945050505050565b6040517f467f4cb900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f602483018190527f000000000000000000000000000000000000000000000000000000000000000082166044840152917f00000000000000000000000000000000000000000000000000000000000000009091169063467f4cb990606401602060405180830381865afa15801561210b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190613d89565b5f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0484118302158202612162575f80fd5b5091020490565b5f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411830215820261219c575f80fd5b50910281810615159190040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16627910d06040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561220f575f80fd5b505af1158015612221573d5f803e3d5ffd5b50505050565b6007545f0361223557505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526003602052604080822054928516825290205461226c612422565b5f5b600754811015612318575f6007828154811061228c5761228c613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff1691506122b88883612837565b90506122c988836112c18989613d76565b73ffffffffffffffffffffffffffffffffffffffff871615612303575f6122f08884612837565b905061230188846112c18a89613cd2565b505b5050808061231090613d3f565b91505061226e565b505050505050565b6040517f5bea61c6000000000000000000000000000000000000000000000000000000008152600481018390525f602482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166044830152606482018390527f00000000000000000000000000000000000000000000000000000000000000001690635bea61c6906084015f604051808303815f87803b1580156123da575f80fd5b505af11580156123ec573d5f803e3d5ffd5b50505050817f3f3ac42003d85fd976b1896956dfdb3db9b2b67fb64d13e8eefd4c12f749bfc982604051610b8491815260200190565b5f5b60075481101561247c5761246a6007828154811061244457612444613d12565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16613521565b8061247481613d3f565b915050612424565b50565b5f61248982613521565b5f6124948484612837565b9050801561096b5773ffffffffffffffffffffffffffffffffffffffff84165f908152600360205260408120546124ce91869186916128f6565b6124ef73ffffffffffffffffffffffffffffffffffffffff841685836136a9565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c78360405161254e91815260200190565b60405180910390a39392505050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125ef576125be8382613d76565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604081208054859290612623908490613d76565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061268a9087815260200190565b60405180910390a3506001949350505050565b6040517f504aff13000000000000000000000000000000000000000000000000000000008152600481018390525f602482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166044830152606482018390527f0000000000000000000000000000000000000000000000000000000000000000169063504aff13906084015f604051808303815f87803b158015612757575f80fd5b505af1158015612769573d5f803e3d5ffd5b50505050817f9b273eef61583cf74e826aa833dad475fcc942934d793017466e758e9aaf57cf82604051610b8491815260200190565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516127cf9190613da0565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff8083165f908152600960209081526040808320938516808452938252808320815160a08101835281548152600182015481850152600282015481840152600382015460608201526004909101546080820152938352600890915281208251815492939284916128ba91613d76565b60408401519091505f906128d79083670de0b6b3a7640000612169565b90505f8460800151826128ea9190613cd2565b98975050505050505050565b5f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506040518060a00160405280825f01548152602001428152602001848152602001826003018054905081526020018381525060095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fbb2e4f291bde0a5cfcec3ae5671cace93d49f19913961a8ab7b15a6262514698835f0154428560030180549050604051612a8e939291909283526020830191909152604082015260600190565b60405180910390a35050505050565b5f612aa783611daa565b9050805f03612b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f5348415245530000000000000000000000000000000000000000006044820152606401610b11565b612b5473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333086612dab565b612b5e8282612ea5565b604080518481526020810183905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101611459565b6040517fb3c113950000000000000000000000000000000000000000000000000000000081525f6004820181905273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248401526044830184905260648301919091527f0000000000000000000000000000000000000000000000000000000000000000169063b3c11395906084015f604051808303815f87803b158015612c6b575f80fd5b505af1158015612c7d573d5f803e3d5ffd5b505050507f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea81604051611a5891815260200190565b6040517fa12de0ba00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a12de0ba90612d4c9086905f907f00000000000000000000000000000000000000000000000000000000000000009088908890600401613eab565b5f604051808303815f87803b158015612d63575f80fd5b505af1158015612d75573d5f803e3d5ffd5b50505050827f492992fdafc55cec84ec4623d119a6984ae91c248fafa42c20f9b7277942ed4a83836040516110b2929190613ef6565b5f6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f511416151615612e375750833b153d17155b80612e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610b11565b5050505050565b8060025f828254612eb69190613cd2565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6040517f098d2a200000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063098d2a20906064015f604051808303815f87803b158015612fcf575f80fd5b505af1158015612fe1573d5f803e3d5ffd5b505050507fe8de1e631ea541ac8e6cb398aafb71b991eb58d489298f7bc93ba7e17fa2042b81604051611a5891815260200190565b335f90815260036020526040812080548391908390613036908490613d76565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109d99086815260200190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8fd97956040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561220f575f80fd5b5f613108846109eb565b90503373ffffffffffffffffffffffffffffffffffffffff8316146131bb5773ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146131b9576131888282613d76565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526004602090815260408083203384529091529020555b505b6131c58282613780565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461096b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001684866136a9565b5f3373ffffffffffffffffffffffffffffffffffffffff8316146133105773ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461330e576132dd8582613d76565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526004602090815260408083203384529091529020555b505b61331984611213565b9050805f03613384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f4153534554530000000000000000000000000000000000000000006044820152606401610b11565b61338e8285613780565b604080518281526020810186905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461096b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001684836136a9565b6040517fa125b1460000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a125b146906064015f604051808303815f87803b1580156134da575f80fd5b505af11580156134ec573d5f803e3d5ffd5b505050507f546b4489d0d401144246692e660c7c88e2308702063f0a69461de575cf3fdb6181604051611a5891815260200190565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526008602052604080822090517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529092906370a0823190602401602060405180830381865afa158015613598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135bc9190613d89565b90505f6135c88461380c565b90508082111561369d575f6135dd8284613d76565b600385018054600181810183555f92835260208084204293019290925560048801805491820181558352912001819055600254909150801561369a575f61362d83670de0b6b3a76400008461212f565b905080865f015f8282546136419190613cd2565b909155505085546040805191825242602083015273ffffffffffffffffffffffffffffffffffffffff8916917f1f0d2c1245dfc4eaee921d7b25e80cb547e4739ea0d8163647cf40ebd162e5b0910160405180910390a2505b50505b50504260019091015550565b5f6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015282602482015260205f6044835f895af191505080601f3d1160015f5114161516156137195750823b153d17155b80612221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610b11565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906137b4908490613d76565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612f10565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260408120815b600482015481101561387b5781600401818154811061385357613853613d12565b905f5260205f200154836138679190613cd2565b92508061387381613d3f565b915050613832565b5050919050565b828054828255905f5260205f209081019282156138bb579160200282015b828111156138bb5782518255916020019190600101906138a0565b506138c79291506138cb565b5090565b5b808211156138c7575f81556001016138cc565b5f6020808352835180828501525f5b8181101561390a578581018301518582016040015282016138ee565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215613958575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613982575f80fd5b919050565b5f8060408385031215613998575f80fd5b6139a18361395f565b946020939093013593505050565b5f602082840312156139bf575f80fd5b61096b8261395f565b5f805f604084860312156139da575f80fd5b6139e38461395f565b9250602084013567ffffffffffffffff808211156139ff575f80fd5b818601915086601f830112613a12575f80fd5b813581811115613a20575f80fd5b8760208260051b8501011115613a34575f80fd5b6020830194508093505050509250925092565b5f8151808452602080850194508084015f5b83811015613a7557815187529582019590820190600101613a59565b509495945050505050565b602081525f61096b6020830184613a47565b5f805f60608486031215613aa4575f80fd5b613aad8461395f565b9250613abb6020850161395f565b9150604084013590509250925092565b858152846020820152831515604082015260a060608201525f613af160a0830185613a47565b82810360808401526128ea8185613a47565b5f8060408385031215613b14575f80fd5b613b1d8361395f565b9150613b2b6020840161395f565b90509250929050565b5f8060408385031215613b45575f80fd5b82359150613b2b6020840161395f565b5f805f60608486031215613b67575f80fd5b83359250613b776020850161395f565b9150613b856040850161395f565b90509250925092565b602080825282518282018190525f9190848201906040850190845b81811015613bdb57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613ba9565b50909695505050505050565b5f805f805f805f60e0888a031215613bfd575f80fd5b613c068861395f565b9650613c146020890161395f565b95506040880135945060608801359350608088013560ff81168114613c37575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b600181811c90821680613c6857607f821691505b602082108103613c9f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156109e5576109e5613ca5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d6f57613d6f613ca5565b5060010190565b818103818111156109e5576109e5613ca5565b5f60208284031215613d99575f80fd5b5051919050565b5f80835481600182811c915080831680613dbb57607f831692505b60208084108203613df3577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613e075760018114613e3a57613e65565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650613e65565b5f8a8152602090205f5b86811015613e5d5781548b820152908501908301613e44565b505084890196505b509498975050505050505050565b5f8151808452602080850194508084015f5b83811015613a7557815167ffffffffffffffff1687529582019590820190600101613e85565b85815284602082015273ffffffffffffffffffffffffffffffffffffffff8416604082015282606082015260a060808201525f613eeb60a0830184613e73565b979650505050505050565b828152604060208201525f610ff66040830184613e7356fea164736f6c6343000814000a","sourceMap":"1787:25533:29:-:0;;;7098:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7392:10;7404:5;7425:10;7321;7334:5;7341:7;1290:5:25;1297:7;1306:6;-1:-1:-1;;;;;1306:15:25;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2094:4:24;:12;2101:5;2094:4;:12;:::i;:::-;-1:-1:-1;2116:6:24;:16;2125:7;2116:6;:16;:::i;:::-;-1:-1:-1;2142:20:24;;;;;2192:13;2173:32;;2242:24;:22;:24::i;:::-;2215:51;;-1:-1:-1;;;;;;;;;1335:14:25;;::::1;;::::0;-1:-1:-1;1045:5:23;:14;;-1:-1:-1;;;;;;1045:14:23;;;;;;;;;1075:40;;-1:-1:-1;;1075:40:23;;-1:-1:-1;;1075:40:23;-1:-1:-1;;;;;;1528:21:30;;;;;1559:34;;;7451:8:29::3;:20:::0;;;7481:40;;::::3;::::0;:18:::3;::::0;:40:::3;::::0;::::3;::::0;::::3;:::i;:::-;;7098:430:::0;;;;;;1787:25533;;5510:446:24;5575:7;5672:95;5805:4;5789:22;;;;;;:::i;:::-;;;;;;;;;;5640:295;;;6987:25:34;;;;7028:18;;7021:34;;;;5833:14:24;7071:18:34;;;7064:34;5869:13:24;7114:18:34;;;7107:34;5912:4:24;7157:19:34;;;7150:61;6959:19;;5640:295:24;;;;;;;;;;;;5613:336;;;;;;5594:355;;5510:446;:::o;1787:25533:29:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1787:25533:29;;;;;-1:-1:-1;;;;;1787:25533:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1787:25533:29;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1787:25533:29;;;-1:-1:-1;1787:25533:29;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:34;93:13;;-1:-1:-1;;;;;135:31:34;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:127::-;257:10;252:3;248:20;245:1;238:31;288:4;285:1;278:15;312:4;309:1;302:15;328:275;399:2;393:9;464:2;445:13;;-1:-1:-1;;441:27:34;429:40;;-1:-1:-1;;;;;484:34:34;;520:22;;;481:62;478:88;;;546:18;;:::i;:::-;582:2;575:22;328:275;;-1:-1:-1;328:275:34:o;608:650::-;662:5;715:3;708:4;700:6;696:17;692:27;682:55;;733:1;730;723:12;682:55;756:13;;-1:-1:-1;;;;;781:26:34;;778:52;;;810:18;;:::i;:::-;849:4;877:53;920:2;901:13;;-1:-1:-1;;897:27:34;893:36;;877:53;:::i;:::-;955:2;946:7;939:19;999:3;994:2;989;981:6;977:15;973:24;970:33;967:53;;;1016:1;1013;1006:12;967:53;1038:1;1048:134;1062:2;1059:1;1056:9;1048:134;;;1151:14;;;1147:23;;1141:30;1119:15;;;1115:24;;1108:64;1073:10;;1048:134;;;-1:-1:-1;1225:1:34;1202:16;;;1198:25;;;1191:36;;;;1206:7;608:650;-1:-1:-1;;;608:650:34:o;1263:1744::-;1422:6;1430;1438;1446;1454;1462;1515:3;1503:9;1494:7;1490:23;1486:33;1483:53;;;1532:1;1529;1522:12;1483:53;1555:40;1585:9;1555:40;:::i;:::-;1614:2;1641:18;;;1635:25;1704:2;1689:18;;1683:25;1545:50;;-1:-1:-1;1635:25:34;-1:-1:-1;1614:2:34;-1:-1:-1;;;;;1757:14:34;;;1754:34;;;1784:1;1781;1774:12;1754:34;1822:6;1811:9;1807:22;1797:32;;1867:7;1860:4;1856:2;1852:13;1848:27;1838:55;;1889:1;1886;1879:12;1838:55;1918:2;1912:9;1940:2;1936;1933:10;1930:36;;;1946:18;;:::i;:::-;1992:2;1989:1;1985:10;2015:28;2039:2;2035;2031:11;2015:28;:::i;:::-;2077:15;;;2147:11;;;2143:20;;;2108:12;;;;2175:19;;;2172:39;;;2207:1;2204;2197:12;2172:39;2231:11;;;;2251:302;2267:6;2262:3;2259:15;2251:302;;;2340:3;2334:10;2321:23;;2388:2;2381:5;2377:14;2370:5;2367:25;2357:123;;2434:1;2463:2;2459;2452:14;2357:123;2493:18;;;2284:12;;;;2531;;;;2251:302;;;2572:5;-1:-1:-1;2596:49:34;;-1:-1:-1;;;2641:2:34;2626:18;;2596:49;:::i;:::-;2586:59;;2691:3;2680:9;2676:19;2670:26;2654:42;;2721:2;2711:8;2708:16;2705:36;;;2737:1;2734;2727:12;2705:36;2760:63;2815:7;2804:8;2793:9;2789:24;2760:63;:::i;:::-;2750:73;;2869:3;2858:9;2854:19;2848:26;2832:42;;2899:2;2889:8;2886:16;2883:36;;;2915:1;2912;2905:12;2883:36;;;2938:63;2993:7;2982:8;2971:9;2967:24;2938:63;:::i;:::-;2928:73;;;1263:1744;;;;;;;;:::o;3012:273::-;3080:6;3133:2;3121:9;3112:7;3108:23;3104:32;3101:52;;;3149:1;3146;3139:12;3101:52;3181:9;3175:16;3231:4;3224:5;3220:16;3213:5;3210:27;3200:55;;3251:1;3248;3241:12;3200:55;3274:5;3012:273;-1:-1:-1;;;3012:273:34:o;3290:380::-;3369:1;3365:12;;;;3412;;;3433:61;;3487:4;3479:6;3475:17;3465:27;;3433:61;3540:2;3532:6;3529:14;3509:18;3506:38;3503:161;;3586:10;3581:3;3577:20;3574:1;3567:31;3621:4;3618:1;3611:15;3649:4;3646:1;3639:15;3503:161;;3290:380;;;:::o;3801:545::-;3903:2;3898:3;3895:11;3892:448;;;3939:1;3964:5;3960:2;3953:17;4009:4;4005:2;3995:19;4079:2;4067:10;4063:19;4060:1;4056:27;4050:4;4046:38;4115:4;4103:10;4100:20;4097:47;;;-1:-1:-1;4138:4:34;4097:47;4193:2;4188:3;4184:12;4181:1;4177:20;4171:4;4167:31;4157:41;;4248:82;4266:2;4259:5;4256:13;4248:82;;;4311:17;;;4292:1;4281:13;4248:82;;;4252:3;;;3892:448;3801:545;;;:::o;4522:1352::-;4642:10;;-1:-1:-1;;;;;4664:30:34;;4661:56;;;4697:18;;:::i;:::-;4726:97;4816:6;4776:38;4808:4;4802:11;4776:38;:::i;:::-;4770:4;4726:97;:::i;:::-;4878:4;;4942:2;4931:14;;4959:1;4954:663;;;;5661:1;5678:6;5675:89;;;-1:-1:-1;5730:19:34;;;5724:26;5675:89;-1:-1:-1;;4479:1:34;4475:11;;;4471:24;4467:29;4457:40;4503:1;4499:11;;;4454:57;5777:81;;4924:944;;4954:663;3748:1;3741:14;;;3785:4;3772:18;;-1:-1:-1;;4990:20:34;;;5108:236;5122:7;5119:1;5116:14;5108:236;;;5211:19;;;5205:26;5190:42;;5303:27;;;;5271:1;5259:14;;;;5138:19;;5108:236;;;5112:3;5372:6;5363:7;5360:19;5357:201;;;5433:19;;;5427:26;-1:-1:-1;;5516:1:34;5512:14;;;5528:3;5508:24;5504:37;5500:42;5485:58;5470:74;;5357:201;-1:-1:-1;;;;;5604:1:34;5588:14;;;5584:22;5571:36;;-1:-1:-1;4522:1352:34:o;5879:844::-;6009:3;6038:1;6071:6;6065:13;6101:36;6127:9;6101:36;:::i;:::-;6156:1;6173:18;;;6200:133;;;;6347:1;6342:356;;;;6166:532;;6200:133;-1:-1:-1;;6233:24:34;;6221:37;;6306:14;;6299:22;6287:35;;6278:45;;;-1:-1:-1;6200:133:34;;6342:356;6373:6;6370:1;6363:17;6403:4;6448:2;6445:1;6435:16;6473:1;6487:165;6501:6;6498:1;6495:13;6487:165;;;6579:14;;6566:11;;;6559:35;6622:16;;;;6516:10;;6487:165;;;6491:3;;;6681:6;6676:3;6672:16;6665:23;;6166:532;-1:-1:-1;6714:3:34;;5879:844;-1:-1:-1;;;;;;5879:844:34:o;6728:489::-;1787:25533:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f80fd5b5060043610610325575f3560e01c80638da5cb5b116101a8578063c4f59f9b116100f3578063d905777e1161009e578063ef8b30f711610079578063ef8b30f71461084c578063f2fde38b1461085f578063f56f4f0f14610872578063fc0c546a14610885575f80fd5b8063d905777e146107ce578063dd62ed3e14610803578063e031cc831461082d575f80fd5b8063cce9d801116100ce578063cce9d80114610795578063ce96cb77146107a8578063d505accf146107bb575f80fd5b8063c4f59f9b1461076d578063c63d75b6146104ae578063c6e6f59214610782575f80fd5b8063a9059cbb11610153578063b460af941161012e578063b460af9414610720578063ba08765214610733578063c20bb5ac14610746575f80fd5b8063a9059cbb146106ce578063b294eb18146106e1578063b3d7f6b91461070d575f80fd5b806395d89b411161018357806395d89b41146106945780639f01f7ba1461069c578063a209a86f146106af575f80fd5b80638da5cb5b14610642578063919dd0b71461066257806394bf804d14610681575f80fd5b8063313ce567116102735780634cdad5061161021e5780636e553f65116101f95780636e553f65146105de57806370a08231146105f15780637bb7bed1146106105780637ecebe0014610623575f80fd5b80634cdad50614610553578063570ca73514610566578063596404bb1461056f575f80fd5b8063402d267d1161024e578063402d267d146104ae578063451831e4146104e157806348e5d9f814610505575f80fd5b8063313ce567146104215780633644e5151461045a57806338d52e0f14610462575f80fd5b8063106d08df116102d35780632026ffa3116102ae5780632026ffa3146103db57806323b872dd146103fb5780632b187b2b1461040e575f80fd5b8063106d08df146103ac57806318160ddd146103bf5780631c03e6cc146103c8575f80fd5b8063095ea7b311610303578063095ea7b31461036c5780630a28a4771461038f5780630cea2bda146103a2575f80fd5b806301e1d1141461032957806306fdde031461034457806307a2d13a14610359575b5f80fd5b6103316108ac565b6040519081526020015b60405180910390f35b61034c6108bb565b60405161033b91906138df565b610331610367366004613948565b610946565b61037f61037a366004613987565b610972565b604051901515815260200161033b565b61033161039d366004613948565b6109eb565b6103aa610a0a565b005b6103aa6103ba366004613948565b610a90565b61033160025481565b6103aa6103d63660046139af565b610b90565b6103ee6103e93660046139c8565b610e69565b60405161033b9190613a80565b61037f610409366004613a92565b610fdf565b6103aa61041c366004613948565b610ffe565b6104487f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161033b565b6103316110bf565b6104897f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161033b565b6103316104bc3660046139af565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b6104f46104ef3660046139af565b611114565b60405161033b959493929190613acb565b6105366105133660046139af565b60086020525f908152604090208054600182015460029092015490919060ff1683565b60408051938452602084019290925215159082015260600161033b565b610331610561366004613948565b611213565b610331600d5481565b6105b661057d366004613b03565b600960209081525f9283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a00161033b565b6103316105ec366004613b34565b61121d565b6103316105ff3660046139af565b60036020525f908152604090205481565b61048961061e366004613948565b611380565b6103316106313660046139af565b60056020525f908152604090205481565b6006546104899073ffffffffffffffffffffffffffffffffffffffff1681565b6103316106703660046139af565b600c6020525f908152604090205481565b61033161068f366004613b34565b6113b5565b61034c611466565b6103aa6106aa366004613948565b611473565b6103316106bd3660046139af565b600a6020525f908152604090205481565b61037f6106dc366004613987565b611598565b6106f46106ef366004613948565b6115ae565b60405167ffffffffffffffff909116815260200161033b565b61033161071b366004613948565b6115e9565b61033161072e366004613b55565b611607565b610331610741366004613b55565b611787565b6104897f000000000000000000000000000000000000000000000000000000000000000081565b610775611908565b60405161033b9190613b8e565b610331610790366004613948565b611975565b6103aa6107a3366004613948565b611994565b6103316107b63660046139af565b611a63565b6103aa6107c9366004613be7565b611a91565b6103316107dc3660046139af565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b610331610811366004613b03565b600460209081525f928352604080842090915290825290205481565b61033161083b3660046139af565b600b6020525f908152604090205481565b61033161085a366004613948565b611daa565b6103aa61086d3660046139af565b611db4565b610331610880366004613b03565b611ea5565b6104897f000000000000000000000000000000000000000000000000000000000000000081565b5f6108b63061204e565b905090565b5f80546108c790613c54565b80601f01602080910402602001604051908101604052809291908181526020018280546108f390613c54565b801561093e5780601f106109155761010080835404028352916020019161093e565b820191905f5260205f20905b81548152906001019060200180831161092157829003601f168201915b505050505081565b6002545f9080156109695761096461095c6108ac565b84908361212f565b61096b565b825b9392505050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109d99086815260200190565b60405180910390a35060015b92915050565b6002545f9080156109695761096481610a026108ac565b859190612169565b335f908152600b602052604081205490819003610a53576040517f601701d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a5b6121ab565b335f908152600a602052604081208054839290610a79908490613cd2565b9091555050335f908152600b602052604081205550565b5f610a9a826109eb565b335f90815260036020526040902054909150811115610b1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e73756666696369656e74207368617265730000000000000000000000000060448201526064015b60405180910390fd5b335f908152600b602052604081208054849290610b38908490613cd2565b90915550610b499050335f83612227565b610b55600d5483612320565b600d546040518381527f3f3ac42003d85fd976b1896956dfdb3db9b2b67fb64d13e8eefd4c12f749bfc9906020015b60405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81161580610bfe57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b15610c35576040517fdfde867100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f9081526008602052604090206002015460ff1615610c97576040517f4611beab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a001604052805f81526020014281526020016001151581526020015f67ffffffffffffffff811115610cd057610cd0613ce5565b604051908082528060200260200182016040528015610cf9578160200160208202803683370190505b5081526020015f604051908082528060200260200182016040528015610d29578160200160208202803683370190505b50905273ffffffffffffffffffffffffffffffffffffffff82165f9081526008602090815260409182902083518155838201516001820155918301516002830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560608301518051610dad9260038501920190613882565b5060808201518051610dc9916004840191602090910190613882565b5050600780546001810182555f9182527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040519092507ff3e4c2c64e71e6ba2eaab9a599bced62f9eb91d2cda610bf41aa8c80ff2cf8269190a250565b60603373ffffffffffffffffffffffffffffffffffffffff851614610eba576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8167ffffffffffffffff811115610ed357610ed3613ce5565b604051908082528060200260200182016040528015610efc578160200160208202803683370190505b509050610f07612422565b5f5b82811015610fd7575f848483818110610f2457610f24613d12565b9050602002016020810190610f3991906139af565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526008602052604090206002015490915060ff16610f9d576040517fdfde867100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fa7868261247f565b838381518110610fb957610fb9613d12565b60209081029190910101525080610fcf81613d3f565b915050610f09565b509392505050565b5f610feb848484612227565b610ff684848461255d565b949350505050565b335f908152600b602052604090205480821115611047576040517f1ae47f5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110518282613d76565b335f908152600b6020526040902055600d5461106d908361269d565b5f611077836109eb565b9050611084333383612227565b60405183815233907f02fbe69eb5474cc010b6c0c236dd70755556cee48c19373e79147100e04de70b906020015b60405180910390a2505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146110ef576108b661279f565b507f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260086020908152604080832080546001820154600283015460038401805486518189028101890190975280875288978897606097889790969095909460ff90911693909260048801929184918301828280156111a857602002820191905f5260205f20905b815481526020019060010190808311611194575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111f857602002820191905f5260205f20905b8154815260200190600101908083116111e4575b50505050509050955095509550955095505091939590929450565b5f6109e582610946565b5f61122783611daa565b600754909150156112de5761123a612422565b5f5b6007548110156112dc575f6007828154811061125a5761125a613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff1691506112868583612837565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600360205260409020549091506112c790869084906112c1908890613cd2565b846128f6565b505080806112d490613d3f565b91505061123c565b505b6112e88383612a9d565b506112f283612bae565b6109e5600d5484600e80548060200260200160405190810160405280929190818152602001828054801561137657602002820191905f5260205f20905f905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116113315790505b5050505050612cb2565b6007818154811061138f575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f6113bf836115e9565b905061140373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612dab565b61140d8284612ea5565b604080518281526020810185905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a36109e5565b600180546108c790613c54565b335f908152600c6020526040902054808211156114bc576040517f1ae47f5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c68282613d76565b335f908152600c6020908152604080832093909355600a905290812080548492906114f2908490613cd2565b90915550611501905082612f1c565b611566600d5483600e805480602002602001604051908101604052809291908181526020018280548015611376575f918252602091829020805467ffffffffffffffff1684529082028301929091600891018084116113315790505050505050612cb2565b60405182815233907f2eed97477f07c07ec48f8f678f4e84f7c0de55bf33f51c3dc989b1335308031990602001610b84565b5f6115a4338484612227565b61096b8383613016565b600e81815481106115bd575f80fd5b905f5260205f209060049182820401919006600802915054906101000a900467ffffffffffffffff1681565b6002545f908015610969576109646115ff6108ac565b849083612169565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600c6020526040812054841115611665576040517f601701d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166d613099565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600c602052604090205461169d908590613d76565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600c60205260409020556116cb846109eb565b6007549091501561177c576116de612422565b5f5b60075481101561177a575f600782815481106116fe576116fe613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff16915061172a8583612837565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526003602052604090205490915061176590869084906112c1908890613d76565b5050808061177290613d3f565b9150506116e0565b505b610ff68484846130fe565b5f61179184611213565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600c60205260409020549091508111156117f2576040517f601701d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117fa613099565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600c602052604090205461182a908290613d76565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600c6020526040902055600754156118fd5761185f612422565b5f5b6007548110156118fb575f6007828154811061187f5761187f613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff1691506118ab8583612837565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600360205260409020549091506118e690869084906112c1908b90613d76565b505080806118f390613d3f565b915050611861565b505b610ff684848461325e565b6060600780548060200260200160405190810160405280929190818152602001828054801561196b57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611940575b5050505050905090565b6002545f908015610969576109648161198c6108ac565b85919061212f565b335f908152600a60205260409020548111156119dc576040517f090d2fd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f908152600c6020526040812080548392906119fa908490613cd2565b9091555050335f908152600a602052604081208054839290611a1d908490613d76565b90915550611a2c905081613427565b6040518181527f546b4489d0d401144246692e660c7c88e2308702063f0a69461de575cf3fdb61906020015b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600360205260408120546109e590610946565b42841015611afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610b11565b5f6001611b066110bf565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611c54573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611ccf57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611d35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610b11565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f6109e582611975565b60065473ffffffffffffffffffffffffffffffffffffffff163314611e35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610b11565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600360205260408120548103611ed757505f6109e5565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152600960209081526040808320938616808452938252808320815160a080820184528254825260018084015483870152600280850154848701526003808601546060808701919091526004909601546080860152988852600887528588208651938401875280548452918201548388015281015460ff16151582860152968701805485518188028101880190965280865292979195919493860193929091830182828015611fbd57602002820191905f5260205f20905b815481526020019060010190808311611fa9575b505050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561201357602002820191905f5260205f20905b815481526020019060010190808311611fff575b50505091909252505083518251929350612045926120319250613d76565b604084015190670de0b6b3a764000061212f565b95945050505050565b6040517f467f4cb900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f602483018190527f000000000000000000000000000000000000000000000000000000000000000082166044840152917f00000000000000000000000000000000000000000000000000000000000000009091169063467f4cb990606401602060405180830381865afa15801561210b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190613d89565b5f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0484118302158202612162575f80fd5b5091020490565b5f827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411830215820261219c575f80fd5b50910281810615159190040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16627910d06040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561220f575f80fd5b505af1158015612221573d5f803e3d5ffd5b50505050565b6007545f0361223557505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526003602052604080822054928516825290205461226c612422565b5f5b600754811015612318575f6007828154811061228c5761228c613d12565b5f91825260208220015473ffffffffffffffffffffffffffffffffffffffff1691506122b88883612837565b90506122c988836112c18989613d76565b73ffffffffffffffffffffffffffffffffffffffff871615612303575f6122f08884612837565b905061230188846112c18a89613cd2565b505b5050808061231090613d3f565b91505061226e565b505050505050565b6040517f5bea61c6000000000000000000000000000000000000000000000000000000008152600481018390525f602482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166044830152606482018390527f00000000000000000000000000000000000000000000000000000000000000001690635bea61c6906084015f604051808303815f87803b1580156123da575f80fd5b505af11580156123ec573d5f803e3d5ffd5b50505050817f3f3ac42003d85fd976b1896956dfdb3db9b2b67fb64d13e8eefd4c12f749bfc982604051610b8491815260200190565b5f5b60075481101561247c5761246a6007828154811061244457612444613d12565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16613521565b8061247481613d3f565b915050612424565b50565b5f61248982613521565b5f6124948484612837565b9050801561096b5773ffffffffffffffffffffffffffffffffffffffff84165f908152600360205260408120546124ce91869186916128f6565b6124ef73ffffffffffffffffffffffffffffffffffffffff841685836136a9565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c78360405161254e91815260200190565b60405180910390a39392505050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125ef576125be8382613d76565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604081208054859290612623908490613d76565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061268a9087815260200190565b60405180910390a3506001949350505050565b6040517f504aff13000000000000000000000000000000000000000000000000000000008152600481018390525f602482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166044830152606482018390527f0000000000000000000000000000000000000000000000000000000000000000169063504aff13906084015f604051808303815f87803b158015612757575f80fd5b505af1158015612769573d5f803e3d5ffd5b50505050817f9b273eef61583cf74e826aa833dad475fcc942934d793017466e758e9aaf57cf82604051610b8491815260200190565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516127cf9190613da0565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff8083165f908152600960209081526040808320938516808452938252808320815160a08101835281548152600182015481850152600282015481840152600382015460608201526004909101546080820152938352600890915281208251815492939284916128ba91613d76565b60408401519091505f906128d79083670de0b6b3a7640000612169565b90505f8460800151826128ea9190613cd2565b98975050505050505050565b5f60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506040518060a00160405280825f01548152602001428152602001848152602001826003018054905081526020018381525060095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f0155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fbb2e4f291bde0a5cfcec3ae5671cace93d49f19913961a8ab7b15a6262514698835f0154428560030180549050604051612a8e939291909283526020830191909152604082015260600190565b60405180910390a35050505050565b5f612aa783611daa565b9050805f03612b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f5348415245530000000000000000000000000000000000000000006044820152606401610b11565b612b5473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333086612dab565b612b5e8282612ea5565b604080518481526020810183905273ffffffffffffffffffffffffffffffffffffffff84169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79101611459565b6040517fb3c113950000000000000000000000000000000000000000000000000000000081525f6004820181905273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248401526044830184905260648301919091527f0000000000000000000000000000000000000000000000000000000000000000169063b3c11395906084015f604051808303815f87803b158015612c6b575f80fd5b505af1158015612c7d573d5f803e3d5ffd5b505050507f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea81604051611a5891815260200190565b6040517fa12de0ba00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a12de0ba90612d4c9086905f907f00000000000000000000000000000000000000000000000000000000000000009088908890600401613eab565b5f604051808303815f87803b158015612d63575f80fd5b505af1158015612d75573d5f803e3d5ffd5b50505050827f492992fdafc55cec84ec4623d119a6984ae91c248fafa42c20f9b7277942ed4a83836040516110b2929190613ef6565b5f6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f511416151615612e375750833b153d17155b80612e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610b11565b5050505050565b8060025f828254612eb69190613cd2565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6040517f098d2a200000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063098d2a20906064015f604051808303815f87803b158015612fcf575f80fd5b505af1158015612fe1573d5f803e3d5ffd5b505050507fe8de1e631ea541ac8e6cb398aafb71b991eb58d489298f7bc93ba7e17fa2042b81604051611a5891815260200190565b335f90815260036020526040812080548391908390613036908490613d76565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109d99086815260200190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f8fd97956040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561220f575f80fd5b5f613108846109eb565b90503373ffffffffffffffffffffffffffffffffffffffff8316146131bb5773ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146131b9576131888282613d76565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526004602090815260408083203384529091529020555b505b6131c58282613780565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461096b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001684866136a9565b5f3373ffffffffffffffffffffffffffffffffffffffff8316146133105773ffffffffffffffffffffffffffffffffffffffff82165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461330e576132dd8582613d76565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526004602090815260408083203384529091529020555b505b61331984611213565b9050805f03613384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f5a45524f5f4153534554530000000000000000000000000000000000000000006044820152606401610b11565b61338e8285613780565b604080518281526020810186905273ffffffffffffffffffffffffffffffffffffffff808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461096b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001684836136a9565b6040517fa125b1460000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a125b146906064015f604051808303815f87803b1580156134da575f80fd5b505af11580156134ec573d5f803e3d5ffd5b505050507f546b4489d0d401144246692e660c7c88e2308702063f0a69461de575cf3fdb6181604051611a5891815260200190565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526008602052604080822090517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529092906370a0823190602401602060405180830381865afa158015613598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135bc9190613d89565b90505f6135c88461380c565b90508082111561369d575f6135dd8284613d76565b600385018054600181810183555f92835260208084204293019290925560048801805491820181558352912001819055600254909150801561369a575f61362d83670de0b6b3a76400008461212f565b905080865f015f8282546136419190613cd2565b909155505085546040805191825242602083015273ffffffffffffffffffffffffffffffffffffffff8916917f1f0d2c1245dfc4eaee921d7b25e80cb547e4739ea0d8163647cf40ebd162e5b0910160405180910390a2505b50505b50504260019091015550565b5f6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015282602482015260205f6044835f895af191505080601f3d1160015f5114161516156137195750823b153d17155b80612221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610b11565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906137b4908490613d76565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612f10565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600860205260408120815b600482015481101561387b5781600401818154811061385357613853613d12565b905f5260205f200154836138679190613cd2565b92508061387381613d3f565b915050613832565b5050919050565b828054828255905f5260205f209081019282156138bb579160200282015b828111156138bb5782518255916020019190600101906138a0565b506138c79291506138cb565b5090565b5b808211156138c7575f81556001016138cc565b5f6020808352835180828501525f5b8181101561390a578581018301518582016040015282016138ee565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215613958575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613982575f80fd5b919050565b5f8060408385031215613998575f80fd5b6139a18361395f565b946020939093013593505050565b5f602082840312156139bf575f80fd5b61096b8261395f565b5f805f604084860312156139da575f80fd5b6139e38461395f565b9250602084013567ffffffffffffffff808211156139ff575f80fd5b818601915086601f830112613a12575f80fd5b813581811115613a20575f80fd5b8760208260051b8501011115613a34575f80fd5b6020830194508093505050509250925092565b5f8151808452602080850194508084015f5b83811015613a7557815187529582019590820190600101613a59565b509495945050505050565b602081525f61096b6020830184613a47565b5f805f60608486031215613aa4575f80fd5b613aad8461395f565b9250613abb6020850161395f565b9150604084013590509250925092565b858152846020820152831515604082015260a060608201525f613af160a0830185613a47565b82810360808401526128ea8185613a47565b5f8060408385031215613b14575f80fd5b613b1d8361395f565b9150613b2b6020840161395f565b90509250929050565b5f8060408385031215613b45575f80fd5b82359150613b2b6020840161395f565b5f805f60608486031215613b67575f80fd5b83359250613b776020850161395f565b9150613b856040850161395f565b90509250925092565b602080825282518282018190525f9190848201906040850190845b81811015613bdb57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613ba9565b50909695505050505050565b5f805f805f805f60e0888a031215613bfd575f80fd5b613c068861395f565b9650613c146020890161395f565b95506040880135945060608801359350608088013560ff81168114613c37575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b600181811c90821680613c6857607f821691505b602082108103613c9f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156109e5576109e5613ca5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d6f57613d6f613ca5565b5060010190565b818103818111156109e5576109e5613ca5565b5f60208284031215613d99575f80fd5b5051919050565b5f80835481600182811c915080831680613dbb57607f831692505b60208084108203613df3577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015613e075760018114613e3a57613e65565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650613e65565b5f8a8152602090205f5b86811015613e5d5781548b820152908501908301613e44565b505084890196505b509498975050505050505050565b5f8151808452602080850194508084015f5b83811015613a7557815167ffffffffffffffff1687529582019590820190600101613e85565b85815284602082015273ffffffffffffffffffffffffffffffffffffffff8416604082015282606082015260a060808201525f613eeb60a0830184613e73565b979650505050505050565b828152604060208201525f610ff66040830184613e7356fea164736f6c6343000814000a","sourceMap":"1787:25533:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26364:111;;;:::i;:::-;;;160:25:34;;;148:2;133:18;26364:111:29;;;;;;;;1031:18:24;;;:::i;:::-;;;;;;;:::i;4463:257:25:-;;;;;;:::i;:::-;;:::i;2461:211:24:-;;;;;;:::i;:::-;;:::i;:::-;;;1618:14:34;;1611:22;1593:41;;1581:2;1566:18;2461:211:24;1453:187:34;5114:255:25;;;;;;:::i;:::-;;:::i;15795:397:29:-;;;:::i;:::-;;15153:544;;;;;;:::i;:::-;;:::i;1304:26:24:-;;;;;;7872:554:29;;;;;;:::i;:::-;;:::i;9044:528::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10478:206::-;;;;;;:::i;:::-;;:::i;17634:589::-;;;;;;:::i;:::-;;:::i;1083:31:24:-;;;;;;;;3741:4:34;3729:17;;;3711:36;;3699:2;3684:18;1083:31:24;3569:184:34;5327:177:24;;;:::i;1149:28:25:-;;;;;;;;4131:42:34;4119:55;;;4101:74;;4089:2;4074:18;1149:28:25;3940:241:34;5696:108:25;;;;;;:::i;:::-;-1:-1:-1;5780:17:25;;5696:108;26872:446:29;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;6178:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5078:25:34;;;5134:2;5119:18;;5112:34;;;;5189:14;5182:22;5162:18;;;5155:50;5066:2;5051:18;6178:48:29;4882:329:34;5375:124:25;;;;;;:::i;:::-;;:::i;6914:23:29:-;;;;;;6330:75;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5740:25:34;;;5796:2;5781:18;;5774:34;;;;5824:18;;;5817:34;;;;5882:2;5867:18;;5860:34;5925:3;5910:19;;5903:35;5727:3;5712:19;6330:75:29;5481:463:34;10971:1037:29;;;;;;:::i;:::-;;:::i;1337:44:24:-;;;;;;:::i;:::-;;;;;;;;;;;;;;6039:29:29;;;;;;:::i;:::-;;:::i;1751:41:24:-;;;;;;:::i;:::-;;;;;;;;;;;;;;690:20:23;;;;;;;;;6801:58:29;;;;;;:::i;:::-;;;;;;;;;;;;;;2072:467:25;;;;;;:::i;:::-;;:::i;1056:20:24:-;;;:::i;16914:612:29:-;;;;;;:::i;:::-;;:::i;6468:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;9906:184;;;;;;:::i;:::-;;:::i;7008:34::-;;;;;;:::i;:::-;;:::i;:::-;;;6613:18:34;6601:31;;;6583:50;;6571:2;6556:18;7008:34:29;6439:200:34;4857:251:25;;;;;;:::i;:::-;;:::i;12315:1191:29:-;;;;;;:::i;:::-;;:::i;13805:1185::-;;;;;;:::i;:::-;;:::i;1377:42:30:-;;;;;26093:104:29;;;:::i;:::-;;;;;;;:::i;4200:257:25:-;;;;;;:::i;:::-;;:::i;16349:453:29:-;;;;;;:::i;:::-;;:::i;5921:131:25:-;;;;;;:::i;:::-;;:::i;3838:1483:24:-;;;;;;:::i;:::-;;:::i;6058:112:25:-;;;;;;:::i;:::-;6147:16;;6121:7;6147:16;;;:9;:16;;;;;;;6058:112;1388:64:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6628:57:29;;;;;;:::i;:::-;;;;;;;;;;;;;;4726:125:25;;;;;;:::i;:::-;;:::i;1312:161:23:-;;;;;;:::i;:::-;;:::i;25627:365:29:-;;;;;;:::i;:::-;;:::i;1286:28:30:-;;;;;26364:111:29;26417:7;26443:25;26462:4;26443:10;:25::i;:::-;26436:32;;26364:111;:::o;1031:18:24:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4463:257:25:-;4569:11;;4533:7;;4650:11;;:63;;4673:40;4691:13;:11;:13::i;:::-;4673:6;;4706;4673:17;:40::i;:::-;4650:63;;;4664:6;4650:63;4643:70;4463:257;-1:-1:-1;;;4463:257:25:o;2461:211:24:-;2561:10;2535:4;2551:21;;;:9;:21;;;;;;;;;:30;;;;;;;;;;:39;;;2606:37;2535:4;;2551:30;;2606:37;;;;2584:6;160:25:34;;148:2;133:18;;14:177;2606:37:24;;;;;;;;-1:-1:-1;2661:4:24;2461:211;;;;;:::o;5114:255:25:-;5220:11;;5184:7;;5301:11;;:61;;5324:38;5340:6;5348:13;:11;:13::i;:::-;5324:6;;:38;:15;:38::i;15795:397:29:-;15883:10;15840:17;15860:34;;;:22;:34;;;;;;;15908:14;;;15904:46;;15931:19;;;;;;;;;;;;;;15904:46;16004:17;:15;:17::i;:::-;16113:10;16099:25;;;;:13;:25;;;;;:38;;16128:9;;16099:25;:38;;16128:9;;16099:38;:::i;:::-;;;;-1:-1:-1;;16170:10:29;16184:1;16147:34;;;:22;:34;;;;;:38;-1:-1:-1;15795:397:29:o;15153:544::-;15213:14;15230:23;15246:6;15230:15;:23::i;:::-;15281:10;15271:21;;;;:9;:21;;;;;;15213:40;;-1:-1:-1;15271:31:29;-1:-1:-1;15271:31:29;15263:63;;;;;;;9585:2:34;15263:63:29;;;9567:21:34;9624:2;9604:18;;;9597:30;9663:21;9643:18;;;9636:49;9702:18;;15263:63:29;;;;;;;;;15395:10;15372:34;;;;:22;:34;;;;;:44;;15410:6;;15372:34;:44;;15410:6;;15372:44;:::i;:::-;;;;-1:-1:-1;15496:55:29;;-1:-1:-1;15520:10:29;15540:1;15544:6;15496:23;:55::i;:::-;15606:34;15623:8;;15633:6;15606:16;:34::i;:::-;15673:8;;15656:34;;160:25:34;;;15656:34:29;;148:2:34;133:18;15656:34:29;;;;;;;;15203:494;15153:544;:::o;7872:554::-;7934:19;;;;;:46;;;7974:5;7957:23;;:5;:23;;;7934:46;7930:104;;;8003:20;;;;;;;;;;;;;;7930:104;8047:17;;;;;;;:10;:17;;;;;:25;;;;;8043:63;;;8081:25;;;;;;;;;;;;;;8043:63;8137:209;;;;;;;;8169:1;8137:209;;;;8200:15;8137:209;;;;8238:4;8137:209;;;;;;8288:1;8274:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8274:16:29;-1:-1:-1;8137:209:29;;;;8333:1;8319:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8319:16:29;-1:-1:-1;8137:209:29;;8117:17;;;;;;;:10;:17;;;;;;;;;:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8117:229:29;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;8356:12:29;:24;;;;;;;-1:-1:-1;8356:24:29;;;;;;;;;;;;;;;;;;8396:23;;8356:24;;-1:-1:-1;8396:23:29;;-1:-1:-1;8396:23:29;7872:554;:::o;9044:528::-;9125:24;9165:10;:18;;;;9161:45;;9192:14;;;;;;;;;;;;;;9161:45;9241:6;9227:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9227:28:29;;9217:38;;9310:25;:23;:25::i;:::-;9351:9;9346:220;9366:17;;;9346:220;;;9404:13;9420:6;;9427:1;9420:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9448:17;;;;;;;:10;:17;;;;;:25;;;9404;;-1:-1:-1;9448:25:29;;9443:59;;9482:20;;;;;;;;;;;;;;9443:59;9530:25;9543:4;9549:5;9530:12;:25::i;:::-;9517:7;9525:1;9517:10;;;;;;;;:::i;:::-;;;;;;;;;;:38;-1:-1:-1;9385:3:29;;;;:::i;:::-;;;;9346:220;;;;9044:528;;;;;:::o;10478:206::-;10567:4;10583:41;10607:4;10613:2;10617:6;10583:23;:41::i;:::-;10641:36;10660:4;10666:2;10670:6;10641:18;:36::i;:::-;10634:43;10478:206;-1:-1:-1;;;;10478:206:29:o;17634:589::-;17735:10;17692:17;17712:34;;;:22;:34;;;;;;17760:18;;;17756:60;;;17787:29;;;;;;;;;;;;;;17756:60;17891:18;17903:6;17891:9;:18;:::i;:::-;17877:10;17854:34;;;;:22;:34;;;;;:55;17977:8;;17962:32;;17987:6;17962:14;:32::i;:::-;18059:14;18076:23;18092:6;18076:15;:23::i;:::-;18059:40;;18109:55;18133:10;18145;18157:6;18109:23;:55::i;:::-;18180:36;;160:25:34;;;18197:10:29;;18180:36;;148:2:34;133:18;18180:36:29;;;;;;;;17682:541;;17634:589;:::o;5327:177:24:-;5384:7;5427:16;5410:13;:33;:87;;5473:24;:22;:24::i;5410:87::-;-1:-1:-1;5446:24:24;;5327:177::o;26872:446:29:-;27187:17;;;26970:13;27187:17;;;:10;:17;;;;;;;;27222:10;;27234:19;;;;27255:12;;;;27269:21;;;27214:97;;;;;;;;;;;;;;;;;26970:13;;;;27059:33;;;;27187:17;;27222:10;;27234:19;;27255:12;;;;;27269:21;;27292:18;;;;27214:97;27269:21;;27214:97;;27269:21;27214:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26872:446;;;;;;;:::o;5375:124:25:-;5443:7;5469:23;5485:6;5469:15;:23::i;10971:1037:29:-;11047:14;11125:22;11140:6;11125:14;:22::i;:::-;11206:12;:19;11116:31;;-1:-1:-1;11206:23:29;11202:582;;11245:25;:23;:25::i;:::-;11289:9;11284:490;11308:12;:19;11304:23;;11284:490;;;11352:13;11368:12;11381:1;11368:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;11491:41:29;11516:8;11368:15;11491:24;:41::i;:::-;11713:19;;;;;;;:9;:19;;;;;;11465:67;;-1:-1:-1;11680:79:29;;11696:8;;11706:5;;11713:28;;11735:6;;11713:28;:::i;:::-;11743:15;11680;:79::i;:::-;11334:440;;11329:3;;;;;:::i;:::-;;;;11284:490;;;;11202:582;11822:31;11836:6;11844:8;11822:13;:31::i;:::-;;11904:16;11913:6;11904:8;:16::i;:::-;11931:47;11941:8;;11951:6;11959:18;11931:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:47::i;6039:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6039:29:29;:::o;2072:467:25:-;2144:14;2179:19;2191:6;2179:11;:19::i;:::-;2170:28;-1:-1:-1;2341:57:25;:22;:5;:22;2364:10;2384:4;2170:28;2341:22;:57::i;:::-;2409:23;2415:8;2425:6;2409:5;:23::i;:::-;2448:45;;;10616:25:34;;;10672:2;10657:18;;10650:34;;;2448:45:25;;;;2456:10;;2448:45;;10589:18:34;2448:45:25;;;;;;;;2504:28;6443:73;1056:20:24;;;;;;;:::i;16914:612:29:-;17017:10;16973:17;16993:35;;;:23;:35;;;;;;17042:18;;;17038:60;;;17069:29;;;;;;;;;;;;;;17038:60;17201:18;17213:6;17201:9;:18;:::i;:::-;17187:10;17163:35;;;;:23;:35;;;;;;;;:56;;;;17229:13;:25;;;;;:35;;17258:6;;17163:35;17229;;17258:6;;17229:35;:::i;:::-;;;;-1:-1:-1;17318:23:29;;-1:-1:-1;17334:6:29;17318:15;:23::i;:::-;17417:47;17427:8;;17437:6;17445:18;17417:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:47::i;:::-;17480:39;;160:25:34;;;17500:10:29;;17480:39;;148:2:34;133:18;17480:39:29;14:177:34;9906:184:29;9977:4;9993:47;10017:10;10029:2;10033:6;9993:23;:47::i;:::-;10057:26;10072:2;10076:6;10057:14;:26::i;7008:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4857:251:25:-;4959:11;;4923:7;;5040:11;;:61;;5063:38;5079:13;:11;:13::i;:::-;5063:6;;5094;5063:15;:38::i;12315:1191:29:-;12489:30;;;12407:14;12489:30;;;:23;:30;;;;;;:39;-1:-1:-1;12485:71:29;;;12537:19;;;;;;;;;;;;;;12485:71;12614:18;:16;:18::i;:::-;12703:30;;;;;;;:23;:30;;;;;;:39;;12736:6;;12703:39;:::i;:::-;12670:30;;;;;;;:23;:30;;;;;:72;12805:23;12821:6;12805:15;:23::i;:::-;12894:12;:19;12796:32;;-1:-1:-1;12894:23:29;12890:522;;12933:25;:23;:25::i;:::-;12977:9;12972:430;12996:12;:19;12992:23;;12972:430;;;13040:13;13056:12;13069:1;13056:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;13177:38:29;13202:5;13056:15;13177:24;:38::i;:::-;13345:16;;;;;;;:9;:16;;;;;;13152:63;;-1:-1:-1;13315:72:29;;13331:5;;13338;;13345:25;;13364:6;;13345:25;:::i;13315:72::-;13022:380;;13017:3;;;;;:::i;:::-;;;;12972:430;;;;12890:522;13460:39;13475:6;13483:8;13493:5;13460:14;:39::i;13805:1185::-;13895:14;13973:21;13987:6;13973:13;:21::i;:::-;14061:30;;;;;;;:23;:30;;;;;;13964;;-1:-1:-1;14061:39:29;-1:-1:-1;14057:71:29;;;14109:19;;;;;;;;;;;;;;14057:71;14186:18;:16;:18::i;:::-;14275:30;;;;;;;:23;:30;;;;;;:39;;14308:6;;14275:39;:::i;:::-;14242:30;;;;;;;:23;:30;;;;;:72;14380:12;:19;:23;14376:522;;14419:25;:23;:25::i;:::-;14463:9;14458:430;14482:12;:19;14478:23;;14458:430;;;14526:13;14542:12;14555:1;14542:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;14663:38:29;14688:5;14542:15;14663:24;:38::i;:::-;14831:16;;;;;;;:9;:16;;;;;;14638:63;;-1:-1:-1;14801:72:29;;14817:5;;14824;;14831:25;;14850:6;;14831:25;:::i;14801:72::-;14508:380;;14503:3;;;;;:::i;:::-;;;;14458:430;;;;14376:522;14946:37;14959:6;14967:8;14977:5;14946:12;:37::i;26093:104::-;26143:16;26178:12;26171:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26093:104;:::o;4200:257:25:-;4306:11;;4270:7;;4387:11;;:63;;4410:40;4428:6;4436:13;:11;:13::i;:::-;4410:6;;:40;:17;:40::i;16349:453:29:-;16480:10;16466:25;;;;:13;:25;;;;;;:34;-1:-1:-1;16462:70:29;;;16509:23;;;;;;;;;;;;;;16462:70;16605:10;16581:35;;;;:23;:35;;;;;:45;;16620:6;;16581:35;:45;;16620:6;;16581:45;:::i;:::-;;;;-1:-1:-1;;16650:10:29;16636:25;;;;:13;:25;;;;;:35;;16665:6;;16636:25;:35;;16665:6;;16636:35;:::i;:::-;;;;-1:-1:-1;16727:25:29;;-1:-1:-1;16745:6:29;16727:17;:25::i;:::-;16768:27;;160:25:34;;;16768:27:29;;148:2:34;133:18;16768:27:29;;;;;;;;16349:453;:::o;5921:131:25:-;6028:16;;;5986:7;6028:16;;;:9;:16;;;;;;6012:33;;:15;:33::i;3838:1483:24:-;4057:15;4045:8;:27;;4037:63;;;;;;;10897:2:34;4037:63:24;;;10879:21:34;10936:2;10916:18;;;10909:30;10975:25;10955:18;;;10948:53;11018:18;;4037:63:24;10695:347:34;4037:63:24;4265:24;4292:805;4428:18;:16;:18::i;:::-;4873:13;;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;4511:449;;4555:165;4511:449;;;11334:25:34;11436:18;;;11429:43;;;;11508:15;;;11488:18;;;11481:43;11540:18;;;11533:34;;;11583:19;;;11576:35;;;;11627:19;;;;11620:35;;;4511:449:24;;;;;;;;;;11306:19:34;;;4511:449:24;;;4472:514;;;;;;;;11936:66:34;4350:658:24;;;11924:79:34;12019:11;;;12012:27;;;;12055:12;;;12048:28;;;;12092:12;;4350:658:24;;;;;;;;;;;;;4319:707;;4350:658;4319:707;;;;4292:805;;;;;;;;;12342:25:34;12415:4;12403:17;;12383:18;;;12376:45;12437:18;;;12430:34;;;12480:18;;;12473:34;;;12314:19;;4292:805:24;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4292:805:24;;;;;;-1:-1:-1;;5120:30:24;;;;;;;:59;;;5174:5;5154:25;;:16;:25;;;5120:59;5112:86;;;;;;;12720:2:34;5112:86:24;;;12702:21:34;12759:2;12739:18;;;12732:30;12798:16;12778:18;;;12771:44;12832:18;;5112:86:24;12518:338:34;5112:86:24;5213:27;;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;5283:31;160:25:34;;;5213:36:24;;5283:31;;;;;133:18:34;5283:31:24;;;;;;;3838:1483;;;;;;;:::o;4726:125:25:-;4795:7;4821:23;4837:6;4821:15;:23::i;1312:161:23:-;778:5;;;;764:10;:19;756:44;;;;;;;13063:2:34;756:44:23;;;13045:21:34;13102:2;13082:18;;;13075:30;13141:14;13121:18;;;13114:42;13173:18;;756:44:23;12861:336:34;756:44:23;1392:5:::1;:16:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;1424:42:::1;::::0;1445:10:::1;::::0;1424:42:::1;::::0;-1:-1:-1;;1424:42:23::1;1312:161:::0;:::o;25627:365:29:-;25731:15;;;25708:7;25731:15;;;:9;:15;;;;;;:20;;25727:34;;-1:-1:-1;25760:1:29;25753:8;;25727:34;25805:19;;;;25772:30;25805:19;;;:13;:19;;;;;;;;:26;;;;;;;;;;;;25772:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25867:17;;;:10;:17;;;;;25841:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25772:59;;25841:43;;25867:17;;25841:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25841:43:29;;;;-1:-1:-1;;25949:20:29;;25935:11;;25841:43;;-1:-1:-1;25902:83:29;;25935:34;;-1:-1:-1;25935:34:29;:::i;:::-;25902:21;;;;;2337:4;25902:32;:83::i;:::-;25895:90;25627:365;-1:-1:-1;;;;;25627:365:29:o;1826:139:30:-;1914:44;;;;;:14;13491:15:34;;;1914:44:30;;;13473:34:34;1888:7:30;13523:18:34;;;13516:34;;;1951:5:30;13586:15:34;;13566:18;;;13559:43;1888:7:30;1914:4;:14;;;;;;13385:18:34;;1914:44:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1564:526:26:-;1680:9;1928:1;1915:11;1911:19;1908:1;1905:26;1902:1;1898:34;1891:42;1878:11;1874:60;1864:116;;1964:1;1961;1954:12;1864:116;-1:-1:-1;2051:9:26;;2047:27;;1564:526::o;2096:672::-;2210:9;2458:1;2445:11;2441:19;2438:1;2435:26;2432:1;2428:34;2421:42;2408:11;2404:60;2394:116;;2494:1;2491;2484:12;2394:116;-1:-1:-1;2728:9:26;;2691:27;;;2688:34;;2724:27;;;2684:68;;2096:672::o;3532:83:30:-;3578:4;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3532:83::o;18748:1070:29:-;18846:12;:19;18869:1;18846:24;18842:37;;18748:1070;;;:::o;18842:37::-;18911:15;;;;18889:19;18911:15;;;:9;:15;;;;;;;18956:13;;;;;;;;19043:25;:23;:25::i;:::-;19084:9;19079:733;19103:12;:19;19099:23;;19079:733;;;19143:13;19159:12;19172:1;19159:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;19272:37:29;19297:4;19159:15;19272:24;:37::i;:::-;19247:62;-1:-1:-1;19384:66:29;19400:4;19406:5;19413:20;19427:6;19413:11;:20;:::i;19384:66::-;19469:16;;;;19465:337;;19563:24;19590:35;19615:2;19619:5;19590:24;:35::i;:::-;19563:62;-1:-1:-1;19723:64:29;19739:2;19743:5;19750:18;19762:6;19750:9;:18;:::i;19723:64::-;19487:315;19465:337;19129:683;;19124:3;;;;;:::i;:::-;;;;19079:733;;;;18832:986;;18748:1070;;;:::o;2918:202:30:-;2997:66;;;;;;;;14041:25:34;;;-1:-1:-1;14082:18:34;;;14075:34;2997:29:30;3048:5;14145:55:34;;14125:18;;;14118:83;14217:18;;;14210:34;;;2997:4:30;:29;;;;14013:19:34;;2997:66:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3096:8;3079:34;3106:6;3079:34;;;;160:25:34;;148:2;133:18;;14:177;25164:170:29;25223:9;25218:110;25242:12;:19;25238:23;;25218:110;;;25282:35;25301:12;25314:1;25301:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;25282:18;:35::i;:::-;25263:3;;;;:::i;:::-;;;;25218:110;;;;25164:170::o;22119:617::-;22188:7;22251:25;22270:5;22251:18;:25::i;:::-;22330:22;22355:37;22380:4;22386:5;22355:24;:37::i;:::-;22330:62;-1:-1:-1;22407:18:29;;22403:295;;22544:15;;;;;;;:9;:15;;;;;;22515:48;;22531:4;;22537:5;;22515:15;:48::i;:::-;22578:47;:25;;;22604:4;22610:14;22578:25;:47::i;:::-;22665:5;22644:43;;22659:4;22644:43;;;22672:14;22644:43;;;;160:25:34;;148:2;133:18;;14:177;22644:43:29;;;;;;;;22715:14;22119:617;-1:-1:-1;;;22119:617:29:o;3057:592:24:-;3209:15;;;3175:4;3209:15;;;:9;:15;;;;;;;;3225:10;3209:27;;;;;;;;3298:17;3287:28;;3283:80;;3347:16;3357:6;3347:7;:16;:::i;:::-;3317:15;;;;;;;:9;:15;;;;;;;;3333:10;3317:27;;;;;;;:46;3283:80;3374:15;;;;;;;:9;:15;;;;;:25;;3393:6;;3374:15;:25;;3393:6;;3374:25;:::i;:::-;;;;-1:-1:-1;;3545:13:24;;;;;;;;:9;:13;;;;;;;:23;;;;;;3594:26;3545:13;;3594:26;;;;;;;3562:6;160:25:34;;148:2;133:18;;14:177;3594:26:24;;;;;;;;-1:-1:-1;3638:4:24;;3057:592;-1:-1:-1;;;;3057:592:24:o;3288:198:30:-;3365:64;;;;;;;;14041:25:34;;;-1:-1:-1;14082:18:34;;;14075:34;3365:27:30;3414:5;14145:55:34;;14125:18;;;14118:83;14217:18;;;14210:34;;;3365:4:30;:27;;;;14013:19:34;;3365:64:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3462:8;3445:34;3472:6;3445:34;;;;160:25:34;;148:2;133:18;;14:177;5510:446:24;5575:7;5672:95;5805:4;5789:22;;;;;;:::i;:::-;;;;;;;;;;5640:295;;;15896:25:34;;;;15937:18;;15930:34;;;;5833:14:24;15980:18:34;;;15973:34;5869:13:24;16023:18:34;;;16016:34;5912:4:24;16066:19:34;;;16059:84;15868:19;;5640:295:24;;;;;;;;;;;;5613:336;;;;;;5594:355;;5510:446;:::o;21131:613:29:-;21269:19;;;;21217:7;21269:19;;;:13;:19;;;;;;;;:26;;;;;;;;;;;;21236:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21332:17;;;:10;:17;;;;;21444:20;;21430:11;;21217:7;;21236:59;21217:7;;21430:34;;;:::i;:::-;21581:21;;;;21409:55;;-1:-1:-1;21560:18:29;;21581:57;;21409:55;2337:4;21581:30;:57::i;:::-;21560:78;;21648:20;21684:8;:23;;;21671:10;:36;;;;:::i;:::-;21648:59;21131:613;-1:-1:-1;;;;;;;;21131:613:29:o;20199:564::-;20316:24;20343:10;:17;20354:5;20343:17;;;;;;;;;;;;;;;20316:44;;20399:246;;;;;;;;20441:5;:11;;;20399:246;;;;20477:15;20399:246;;;;20520:10;20399:246;;;;20561:5;:22;;:29;;;;20399:246;;;;20620:14;20399:246;;;20370:13;:19;20384:4;20370:19;;;;;;;;;;;;;;;:26;20390:5;20370:26;;;;;;;;;;;;;;;:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20689:5;20661:95;;20683:4;20661:95;;;20696:5;:11;;;20709:15;20726:5;:22;;:29;;;;20661:95;;;;;;;16356:25:34;;;16412:2;16397:18;;16390:34;;;;16455:2;16440:18;;16433:34;16344:2;16329:18;;16154:319;20661:95:29;;;;;;;;20306:457;20199:564;;;;:::o;1550:516:25:-;1625:14;1744:22;1759:6;1744:14;:22::i;:::-;1735:31;;;1771:1;1734:38;1726:62;;;;;;;16680:2:34;1726:62:25;;;16662:21:34;16719:2;16699:18;;;16692:30;16758:13;16738:18;;;16731:41;16789:18;;1726:62:25;16478:335:34;1726:62:25;1868:57;:22;:5;:22;1891:10;1911:4;1918:6;1868:22;:57::i;:::-;1936:23;1942:8;1952:6;1936:5;:23::i;:::-;1975:45;;;10616:25:34;;;10672:2;10657:18;;10650:34;;;1975:45:25;;;;1983:10;;1975:45;;10589:18:34;1975:45:25;10442:248:34;2079:212:30;2132:119;;;;;2158:1;2132:119;;;17063:25:34;;;2132:12:30;2181:5;17124:55:34;;17104:18;;;17097:83;17196:18;;;17189:34;;;17239:18;;;17232:45;;;;2132:4:30;:12;;;;17035:19:34;;2132:119:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:17;2277:6;2267:17;;;;160:25:34;;148:2;133:18;;14:177;2516:248:30;2624:70;;;;;:13;:4;:13;;;;:70;;2638:8;;2648:1;;2659:5;;2667:6;;2675:18;;2624:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2720:8;2710:47;2730:6;2738:18;2710:47;;;;;;;:::i;1187:1639:27:-;1325:12;1495:4;1489:11;1637:66;1618:17;1611:93;1761:42;1755:4;1751:53;1747:1;1728:17;1724:25;1717:88;1901:42;1897:2;1893:51;1888:2;1869:17;1865:26;1858:87;2031:6;2026:2;2007:17;2003:26;1996:42;2380:2;2377:1;2372:3;2353:17;2350:1;2343:5;2336;2331:52;2320:63;;;2650:7;2643:2;2625:16;2622:24;2618:1;2614;2608:8;2605:15;2601:46;2594:54;2590:68;2587:172;;;-1:-1:-1;2705:18:27;;2698:26;2726:16;2695:48;2688:56;2587:172;2787:7;2779:40;;;;;;;18895:2:34;2779:40:27;;;18877:21:34;18934:2;18914:18;;;18907:30;18973:22;18953:18;;;18946:50;19013:18;;2779:40:27;18693:344:34;2779:40:27;1315:1511;1187:1639;;;;:::o;6150:325:24:-;6235:6;6220:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;6387:13:24;;;;;;;:9;:13;;;;;;;;:23;;;;;;6436:32;160:25:34;;;6436:32:24;;133:18:34;6436:32:24;;;;;;;;6150:325;;:::o;3990:156:30:-;4050:46;;;;;4070:1;4050:46;;;19252:25:34;4050:19:30;4081:5;19313:55:34;;19293:18;;;19286:83;19385:18;;;19378:34;;;4050:4:30;:19;;;;19225:18:34;;4050:46:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4112:27;4132:6;4112:27;;;;160:25:34;;148:2;133:18;;14:177;2678:373:24;2774:10;2748:4;2764:21;;;:9;:21;;;;;:31;;2789:6;;2764:21;2748:4;;2764:31;;2789:6;;2764:31;:::i;:::-;;;;-1:-1:-1;;2941:13:24;;;;;;;:9;:13;;;;;;;:23;;;;;;2990:32;2999:10;;2990:32;;;;2958:6;160:25:34;;148:2;133:18;;14:177;4195:76:30;4242:4;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2545:679:25;2666:14;2701:23;2717:6;2701:15;:23::i;:::-;2692:32;-1:-1:-1;2806:10:25;:19;;;;2802:228;;2859:16;;;2841:15;2859:16;;;:9;:16;;;;;;;;2876:10;2859:28;;;;;;;;2953:17;2942:28;;2938:81;;3003:16;3013:6;3003:7;:16;:::i;:::-;2972;;;;;;;:9;:16;;;;;;;;2989:10;2972:28;;;;;;;:47;2938:81;2827:203;2802:228;3081:20;3087:5;3094:6;3081:5;:20::i;:::-;3117:53;;;10616:25:34;;;10672:2;10657:18;;10650:34;;;3117:53:25;;;;;;;;;3126:10;;3117:53;;10589:18:34;3117:53:25;;;;;;;3181:36;:18;:5;:18;3200:8;3210:6;3181:18;:36::i;3230:713::-;3349:14;3379:10;:19;;;;3375:228;;3432:16;;;3414:15;3432:16;;;:9;:16;;;;;;;;3449:10;3432:28;;;;;;;;3526:17;3515:28;;3511:81;;3576:16;3586:6;3576:7;:16;:::i;:::-;3545;;;;;;;:9;:16;;;;;;;;3562:10;3545:28;;;;;;;:47;3511:81;3400:203;3375:228;3705:21;3719:6;3705:13;:21::i;:::-;3696:30;;;3731:1;3695:37;3687:61;;;;;;;19625:2:34;3687:61:25;;;19607:21:34;19664:2;19644:18;;;19637:30;19703:13;19683:18;;;19676:41;19734:18;;3687:61:25;19423:335:34;3687:61:25;3800:20;3806:5;3813:6;3800:5;:20::i;:::-;3836:53;;;10616:25:34;;;10672:2;10657:18;;10650:34;;;3836:53:25;;;;;;;;;3845:10;;3836:53;;10589:18:34;3836:53:25;;;;;;;3900:36;:18;:5;:18;3919:8;3929:6;3900:18;:36::i;3718:160:30:-;3780:48;;;;;3802:1;3780:48;;;19252:25:34;3780:21:30;3813:5;19313:55:34;;19293:18;;;19286:83;19385:18;;;19378:34;;;3780:4:30;:21;;;;19225:18:34;;3780:48:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3844:27;3864:6;3844:27;;;;160:25:34;;148:2;133:18;;14:177;23615:955:29;23704:17;;;23677:24;23704:17;;;:10;:17;;;;;;23756:37;;;;;23787:4;23756:37;;;4101:74:34;23704:17:29;;;23756:22;;4074:18:34;;23756:37:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23731:62;;23803:24;23830:27;23851:5;23830:20;:27::i;:::-;23803:54;;23889:16;23872:14;:33;23868:647;;;23921:18;23942:33;23959:16;23942:14;:33;:::i;:::-;24027:22;;;:44;;;;;;;;-1:-1:-1;24027:44:29;;;;;;;24055:15;24027:44;;;;;;24085:19;;;:36;;;;;;;;;;;;;;;24153:11;;23921:54;;-1:-1:-1;24182:10:29;;24178:327;;24295:22;24320:44;:10;2337:4;24357:6;24320:21;:44::i;:::-;24295:69;;24397:14;24382:5;:11;;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;24461:11:29;;24435:55;;;10616:25:34;;;24474:15:29;10672:2:34;10657:18;;10650:34;24435:55:29;;;;;;10589:18:34;24435:55:29;;;;;;;24194:311;24178:327;23907:608;;23868:647;-1:-1:-1;;24548:15:29;24525:20;;;;:38;-1:-1:-1;23615:955:29:o;2832:1464:27:-;2944:12;3114:4;3108:11;3256:66;3237:17;3230:93;3378:42;3374:2;3370:51;3366:1;3347:17;3343:25;3336:86;3508:6;3503:2;3484:17;3480:26;3473:42;3855:2;3852:1;3848:2;3829:17;3826:1;3819:5;3812;3807:51;3796:62;;;4125:7;4118:2;4100:16;4097:24;4093:1;4089;4083:8;4080:15;4076:46;4069:54;4065:68;4062:172;;;-1:-1:-1;4180:18:27;;4173:26;4201:16;4170:48;4163:56;4062:172;4262:7;4254:35;;;;;;;19965:2:34;4254:35:27;;;19947:21:34;20004:2;19984:18;;;19977:30;20043:17;20023:18;;;20016:45;20078:18;;4254:35:27;19763:339:34;6481:328:24;6553:15;;;;;;;:9;:15;;;;;:25;;6572:6;;6553:15;:25;;6572:6;;6553:25;:::i;:::-;;;;-1:-1:-1;;6721:11:24;:21;;;;;;;6768:34;;160:25:34;;;-1:-1:-1;;6768:34:24;;;;;;148:2:34;133:18;6768:34:24;14:177:34;24778:266:29;24898:17;;;24846:13;24898:17;;;:10;:17;;;;;24846:13;24925:113;24949:19;;;:26;24945:30;;24925:113;;;25005:5;:19;;25025:1;25005:22;;;;;;;;:::i;:::-;;;;;;;;;24996:31;;;;;:::i;:::-;;-1:-1:-1;24977:3:29;;;;:::i;:::-;;;;24925:113;;;;24861:183;24778:266;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:607:34;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;794:2;724:66;719:2;711:6;707:15;703:88;692:9;688:104;684:113;676:121;;;;196:607;;;;:::o;808:180::-;867:6;920:2;908:9;899:7;895:23;891:32;888:52;;;936:1;933;926:12;888:52;-1:-1:-1;959:23:34;;808:180;-1:-1:-1;808:180:34:o;993:196::-;1061:20;;1121:42;1110:54;;1100:65;;1090:93;;1179:1;1176;1169:12;1090:93;993:196;;;:::o;1194:254::-;1262:6;1270;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;1362:29;1381:9;1362:29;:::i;:::-;1352:39;1438:2;1423:18;;;;1410:32;;-1:-1:-1;;;1194:254:34:o;1645:186::-;1704:6;1757:2;1745:9;1736:7;1732:23;1728:32;1725:52;;;1773:1;1770;1763:12;1725:52;1796:29;1815:9;1796:29;:::i;1836:689::-;1931:6;1939;1947;2000:2;1988:9;1979:7;1975:23;1971:32;1968:52;;;2016:1;2013;2006:12;1968:52;2039:29;2058:9;2039:29;:::i;:::-;2029:39;;2119:2;2108:9;2104:18;2091:32;2142:18;2183:2;2175:6;2172:14;2169:34;;;2199:1;2196;2189:12;2169:34;2237:6;2226:9;2222:22;2212:32;;2282:7;2275:4;2271:2;2267:13;2263:27;2253:55;;2304:1;2301;2294:12;2253:55;2344:2;2331:16;2370:2;2362:6;2359:14;2356:34;;;2386:1;2383;2376:12;2356:34;2439:7;2434:2;2424:6;2421:1;2417:14;2413:2;2409:23;2405:32;2402:45;2399:65;;;2460:1;2457;2450:12;2399:65;2491:2;2487;2483:11;2473:21;;2513:6;2503:16;;;;;1836:689;;;;;:::o;2530:435::-;2583:3;2621:5;2615:12;2648:6;2643:3;2636:19;2674:4;2703:2;2698:3;2694:12;2687:19;;2740:2;2733:5;2729:14;2761:1;2771:169;2785:6;2782:1;2779:13;2771:169;;;2846:13;;2834:26;;2880:12;;;;2915:15;;;;2807:1;2800:9;2771:169;;;-1:-1:-1;2956:3:34;;2530:435;-1:-1:-1;;;;;2530:435:34:o;2970:261::-;3149:2;3138:9;3131:21;3112:4;3169:56;3221:2;3210:9;3206:18;3198:6;3169:56;:::i;3236:328::-;3313:6;3321;3329;3382:2;3370:9;3361:7;3357:23;3353:32;3350:52;;;3398:1;3395;3388:12;3350:52;3421:29;3440:9;3421:29;:::i;:::-;3411:39;;3469:38;3503:2;3492:9;3488:18;3469:38;:::i;:::-;3459:48;;3554:2;3543:9;3539:18;3526:32;3516:42;;3236:328;;;;;:::o;4186:691::-;4521:6;4510:9;4503:25;4564:6;4559:2;4548:9;4544:18;4537:34;4621:6;4614:14;4607:22;4602:2;4591:9;4587:18;4580:50;4666:3;4661:2;4650:9;4646:18;4639:31;4484:4;4693:57;4745:3;4734:9;4730:19;4722:6;4693:57;:::i;:::-;4799:9;4791:6;4787:22;4781:3;4770:9;4766:19;4759:51;4827:44;4864:6;4856;4827:44;:::i;5216:260::-;5284:6;5292;5345:2;5333:9;5324:7;5320:23;5316:32;5313:52;;;5361:1;5358;5351:12;5313:52;5384:29;5403:9;5384:29;:::i;:::-;5374:39;;5432:38;5466:2;5455:9;5451:18;5432:38;:::i;:::-;5422:48;;5216:260;;;;;:::o;5949:254::-;6017:6;6025;6078:2;6066:9;6057:7;6053:23;6049:32;6046:52;;;6094:1;6091;6084:12;6046:52;6130:9;6117:23;6107:33;;6159:38;6193:2;6182:9;6178:18;6159:38;:::i;6644:328::-;6721:6;6729;6737;6790:2;6778:9;6769:7;6765:23;6761:32;6758:52;;;6806:1;6803;6796:12;6758:52;6842:9;6829:23;6819:33;;6871:38;6905:2;6894:9;6890:18;6871:38;:::i;:::-;6861:48;;6928:38;6962:2;6951:9;6947:18;6928:38;:::i;:::-;6918:48;;6644:328;;;;;:::o;7238:681::-;7409:2;7461:21;;;7531:13;;7434:18;;;7553:22;;;7380:4;;7409:2;7632:15;;;;7606:2;7591:18;;;7380:4;7675:218;7689:6;7686:1;7683:13;7675:218;;;7754:13;;7769:42;7750:62;7738:75;;7868:15;;;;7833:12;;;;7711:1;7704:9;7675:218;;;-1:-1:-1;7910:3:34;;7238:681;-1:-1:-1;;;;;;7238:681:34:o;7924:693::-;8035:6;8043;8051;8059;8067;8075;8083;8136:3;8124:9;8115:7;8111:23;8107:33;8104:53;;;8153:1;8150;8143:12;8104:53;8176:29;8195:9;8176:29;:::i;:::-;8166:39;;8224:38;8258:2;8247:9;8243:18;8224:38;:::i;:::-;8214:48;;8309:2;8298:9;8294:18;8281:32;8271:42;;8360:2;8349:9;8345:18;8332:32;8322:42;;8414:3;8403:9;8399:19;8386:33;8459:4;8452:5;8448:16;8441:5;8438:27;8428:55;;8479:1;8476;8469:12;8428:55;7924:693;;;;-1:-1:-1;7924:693:34;;;;8502:5;8554:3;8539:19;;8526:33;;-1:-1:-1;8606:3:34;8591:19;;;8578:33;;7924:693;-1:-1:-1;;7924:693:34:o;8622:437::-;8701:1;8697:12;;;;8744;;;8765:61;;8819:4;8811:6;8807:17;8797:27;;8765:61;8872:2;8864:6;8861:14;8841:18;8838:38;8835:218;;8909:77;8906:1;8899:88;9010:4;9007:1;9000:15;9038:4;9035:1;9028:15;8835:218;;8622:437;;;:::o;9064:184::-;9116:77;9113:1;9106:88;9213:4;9210:1;9203:15;9237:4;9234:1;9227:15;9253:125;9318:9;;;9339:10;;;9336:36;;;9352:18;;:::i;9731:184::-;9783:77;9780:1;9773:88;9880:4;9877:1;9870:15;9904:4;9901:1;9894:15;9920:184;9972:77;9969:1;9962:88;10069:4;10066:1;10059:15;10093:4;10090:1;10083:15;10109:195;10148:3;10179:66;10172:5;10169:77;10166:103;;10249:18;;:::i;:::-;-1:-1:-1;10296:1:34;10285:13;;10109:195::o;10309:128::-;10376:9;;;10397:11;;;10394:37;;;10411:18;;:::i;13613:184::-;13683:6;13736:2;13724:9;13715:7;13711:23;13707:32;13704:52;;;13752:1;13749;13742:12;13704:52;-1:-1:-1;13775:16:34;;13613:184;-1:-1:-1;13613:184:34:o;14384:1248::-;14514:3;14543:1;14576:6;14570:13;14606:3;14628:1;14656:9;14652:2;14648:18;14638:28;;14716:2;14705:9;14701:18;14738;14728:61;;14782:4;14774:6;14770:17;14760:27;;14728:61;14808:2;14856;14848:6;14845:14;14825:18;14822:38;14819:222;;14895:77;14890:3;14883:90;14996:4;14993:1;14986:15;15026:4;15021:3;15014:17;14819:222;15057:18;15084:191;;;;15289:1;15284:323;;;;15050:557;;15084:191;15132:66;15121:9;15117:82;15112:3;15105:95;15255:6;15248:14;15241:22;15233:6;15229:35;15224:3;15220:45;15213:52;;15084:191;;15284:323;14331:1;14324:14;;;14368:4;14355:18;;15382:1;15396:165;15410:6;15407:1;15404:13;15396:165;;;15488:14;;15475:11;;;15468:35;15531:16;;;;15425:10;;15396:165;;;15400:3;;15590:6;15585:3;15581:16;15574:23;;15050:557;-1:-1:-1;15623:3:34;;14384:1248;-1:-1:-1;;;;;;;;14384:1248:34:o;17288:459::-;17340:3;17378:5;17372:12;17405:6;17400:3;17393:19;17431:4;17460:2;17455:3;17451:12;17444:19;;17497:2;17490:5;17486:14;17518:1;17528:194;17542:6;17539:1;17536:13;17528:194;;;17607:13;;17622:18;17603:38;17591:51;;17662:12;;;;17697:15;;;;17564:1;17557:9;17528:194;;17752:602;18049:6;18038:9;18031:25;18092:6;18087:2;18076:9;18072:18;18065:34;18147:42;18139:6;18135:55;18130:2;18119:9;18115:18;18108:83;18227:6;18222:2;18211:9;18207:18;18200:34;18271:3;18265;18254:9;18250:19;18243:32;18012:4;18292:56;18343:3;18332:9;18328:19;18320:6;18292:56;:::i;:::-;18284:64;17752:602;-1:-1:-1;;;;;;;17752:602:34:o;18359:329::-;18564:6;18553:9;18546:25;18607:2;18602;18591:9;18587:18;18580:30;18527:4;18627:55;18678:2;18667:9;18663:18;18655:6;18627:55;:::i","linkReferences":{},"immutableReferences":{"40503":[{"start":1062,"length":32}],"40517":[{"start":4290,"length":32}],"40519":[{"start":4338,"length":32}],"40909":[{"start":1127,"length":32},{"start":2992,"length":32},{"start":5083,"length":32},{"start":11052,"length":32},{"start":12855,"length":32},{"start":13312,"length":32}],"43301":[{"start":2186,"length":32},{"start":8347,"length":32},{"start":9066,"length":32},{"start":9959,"length":32},{"start":11251,"length":32},{"start":11552,"length":32},{"start":12127,"length":32},{"start":13418,"length":32}],"43305":[{"start":1867,"length":32},{"start":8388,"length":32},{"start":8621,"length":32},{"start":9113,"length":32},{"start":10006,"length":32},{"start":11306,"length":32},{"start":11503,"length":32},{"start":12174,"length":32},{"start":12443,"length":32},{"start":13465,"length":32}]}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","addRewardToken(address)":"1c03e6cc","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","asset()":"38d52e0f","balanceOf(address)":"70a08231","blueprintSelection(uint256)":"b294eb18","cancelUnstake(uint256)":"2b187b2b","cancelWithdraw(uint256)":"9f01f7ba","claimRewards(address,address[])":"2026ffa3","convertToAssets(uint256)":"07a2d13a","convertToShares(uint256)":"c6e6f592","decimals()":"313ce567","deposit(uint256,address)":"6e553f65","executeUnstake()":"0cea2bda","getClaimableRewards(address,address)":"f56f4f0f","getRewardData(address)":"451831e4","getRewardTokens()":"c4f59f9b","mads()":"c20bb5ac","maxDeposit(address)":"402d267d","maxMint(address)":"c63d75b6","maxRedeem(address)":"d905777e","maxWithdraw(address)":"ce96cb77","mint(uint256,address)":"94bf804d","name()":"06fdde03","nonces(address)":"7ecebe00","operator()":"570ca735","owner()":"8da5cb5b","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","previewDeposit(uint256)":"ef8b30f7","previewMint(uint256)":"b3d7f6b9","previewRedeem(uint256)":"4cdad506","previewWithdraw(uint256)":"0a28a477","redeem(uint256,address,address)":"ba087652","rewardData(address)":"48e5d9f8","rewardTokens(uint256)":"7bb7bed1","scheduleUnstake(uint256)":"106d08df","scheduleWithdraw(uint256)":"cce9d801","scheduledUnstakeAmount(address)":"e031cc83","scheduledWithdrawAmount(address)":"919dd0b7","symbol()":"95d89b41","token()":"fc0c546a","totalAssets()":"01e1d114","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferOwnership(address)":"f2fde38b","unstakeAmount(address)":"a209a86f","userSnapshots(address,address)":"596404bb","withdraw(uint256,address,address)":"b460af94"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_baseToken\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_operator\",\"type\":\"bytes32\"},{\"internalType\":\"uint64[]\",\"name\":\"_blueprintSelection\",\"type\":\"uint64[]\"},{\"internalType\":\"address\",\"name\":\"_mads\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ExceedsScheduledAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientScheduledAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRewardToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoRewardsToClaim\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoScheduledAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RewardTokenAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawalNotUnstaked\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operator\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64[]\",\"name\":\"blueprintSelection\",\"type\":\"uint64[]\"}],\"name\":\"Delegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"RewardIndexUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewardIndex\",\"type\":\"uint256\"}],\"name\":\"RewardSnapshotCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"RewardTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RewardsClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UnstakeCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operator\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UnstakeCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operator\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UnstakeScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrawalScheduled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"addRewardToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"contract ERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"blueprintSelection\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"cancelUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"cancelWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"claimRewards\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"rewards\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"convertToAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"convertToShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getClaimableRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getRewardData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"},{\"internalType\":\"uint256[]\",\"name\":\"rewardTimestamps\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"rewardAmounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRewardTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mads\",\"outputs\":[{\"internalType\":\"contract MultiAssetDelegation\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"maxDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"maxMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"maxRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"maxWithdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"previewDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"previewMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"previewRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"previewWithdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"scheduleUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"scheduleWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"scheduledUnstakeAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"scheduledWithdrawAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract ERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"unstakeAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userSnapshots\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"rewardIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastRewardIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pendingRewards\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Key implementation details: 1. Reward Distribution: - Uses an index-based accounting system where each reward token has a global index - Index increases proportionally to (reward amount / total supply) for each reward - User checkpoints store the last seen index to calculate entitled rewards 2. Share Transfers: - Historical rewards always stay with the original holder - New holders start earning from their entry index - Transfers trigger checkpoints for both sender and receiver 3. Precision & Math: - Uses FixedPointMathLib for safe fixed-point calculations - Reward index uses REWARD_FACTOR (1e18) as scale factor - mulDivDown for index updates to prevent accumulating errors - mulDivUp for final reward calculations to prevent dust 4. Delegation: - Deposits are automatically delegated to operator - Curator can update blueprint selection - Withdrawals require unstaking through Tangle runtime\",\"events\":{\"RewardIndexUpdated(address,uint256,uint256)\":{\"params\":{\"index\":\"The new global index value\",\"timestamp\":\"When the update occurred\",\"token\":\"The reward token whose index was updated\"}},\"RewardSnapshotCreated(address,address,uint256,uint256,uint256)\":{\"params\":{\"index\":\"The global reward index at snapshot time\",\"rewardIndex\":\"The index in the rewardTimestamps array\",\"timestamp\":\"When the snapshot was created\",\"token\":\"The reward token the snapshot is for\",\"user\":\"The user the snapshot is for\"}},\"RewardsClaimed(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of rewards claimed\",\"token\":\"The reward token being claimed\",\"user\":\"The user claiming rewards\"}}},\"kind\":\"dev\",\"methods\":{\"addRewardToken(address)\":{\"details\":\"Initializes reward tracking for a new token Requirements: - Token must not be zero address or base asset - Token must not already be registered\",\"params\":{\"token\":\"Address of reward token to register\"}},\"cancelUnstake(uint256)\":{\"params\":{\"assets\":\"Amount of assets to cancel unstaking\"}},\"cancelWithdraw(uint256)\":{\"params\":{\"assets\":\"Amount of assets to cancel withdrawal\"}},\"claimRewards(address,address[])\":{\"details\":\"Claims all pending rewards for given tokens For each token: 1. Updates global index to include any new rewards 2. Calculates user's entitled rewards since last snapshot 3. Transfers rewards and creates new snapshot Requirements: - Caller must be the user claiming rewards - Tokens must be valid reward tokens\",\"params\":{\"tokens\":\"Array of reward token addresses to claim\",\"user\":\"Address to claim rewards for\"},\"returns\":{\"rewards\":\"Array of claimed amounts per token\"}},\"deposit(uint256,address)\":{\"details\":\"Overrides ERC4626 deposit to handle reward snapshots and delegation\",\"params\":{\"assets\":\"Amount of assets to deposit\",\"receiver\":\"Recipient of the shares\"},\"returns\":{\"shares\":\"Amount of shares minted\"}},\"executeUnstake()\":{\"details\":\"Must have previously scheduled the unstake\"},\"getClaimableRewards(address,address)\":{\"details\":\"View function to check pending rewards\",\"params\":{\"token\":\"Reward token address\",\"user\":\"User address\"},\"returns\":{\"_0\":\"Claimable reward amount\"}},\"getRewardData(address)\":{\"details\":\"Returns full reward tracking state\",\"params\":{\"token\":\"Reward token address\"},\"returns\":{\"index\":\"Current reward index\",\"isValid\":\"Whether token is valid\",\"lastUpdateTime\":\"Last update timestamp\",\"rewardAmounts\":\"Array of reward amounts\",\"rewardTimestamps\":\"Array of reward timestamps\"}},\"getRewardTokens()\":{\"returns\":{\"_0\":\"Array of reward token addresses\"}},\"redeem(uint256,address,address)\":{\"details\":\"Overrides ERC4626 redeem to handle reward snapshots\",\"params\":{\"owner\":\"Owner of the shares\",\"receiver\":\"Recipient of the assets\",\"shares\":\"Amount of shares to redeem\"},\"returns\":{\"assets\":\"Amount of assets redeemed\"}},\"scheduleUnstake(uint256)\":{\"details\":\"Must be called before withdrawal can be executed\",\"params\":{\"assets\":\"Amount of assets to unstake\"}},\"scheduleWithdraw(uint256)\":{\"details\":\"Must have previously unstaked the assets\",\"params\":{\"assets\":\"Amount of assets to withdraw\"}},\"totalAssets()\":{\"details\":\"Returns total base assets, excluding reward tokens\",\"returns\":{\"_0\":\"Total value in terms of asset tokens\"}},\"transfer(address,uint256)\":{\"details\":\"Overrides ERC20 transfer to handle reward snapshots Historical rewards stay with sender, recipient starts fresh\",\"params\":{\"amount\":\"Number of shares to transfer\",\"to\":\"Recipient of the shares\"},\"returns\":{\"_0\":\"success Whether transfer succeeded\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Overrides ERC20 transferFrom to handle reward snapshots Historical rewards stay with sender, recipient starts fresh\",\"params\":{\"amount\":\"Number of shares to transfer\",\"from\":\"Sender of the shares\",\"to\":\"Recipient of the shares\"},\"returns\":{\"_0\":\"success Whether transfer succeeded\"}},\"withdraw(uint256,address,address)\":{\"details\":\"Overrides ERC4626 withdraw to handle reward snapshots\",\"params\":{\"assets\":\"Amount of assets to withdraw\",\"owner\":\"Owner of the shares\",\"receiver\":\"Recipient of the assets\"},\"returns\":{\"shares\":\"Amount of shares burned\"}}},\"stateVariables\":{\"REWARD_FACTOR\":{\"details\":\"Used to maintain precision in reward/share calculations Index calculation: newRewards * REWARD_FACTOR / totalSupply Reward calculation: shareBalance * (currentIndex - checkpointIndex) / REWARD_FACTOR\"},\"rewardData\":{\"details\":\"Tracks global indices and reward history\"},\"rewardTokens\":{\"details\":\"Used to iterate all reward tokens for operations like checkpointing\"},\"scheduledUnstakeAmount\":{\"details\":\"Maps user => amount scheduled for unstake\"},\"scheduledWithdrawAmount\":{\"details\":\"Maps user => amount scheduled for withdrawal\"},\"userSnapshots\":{\"details\":\"Maps user => token => snapshot data\"}},\"title\":\"TangleLiquidRestakingVault\",\"version\":1},\"userdoc\":{\"errors\":{\"ExceedsScheduledAmount()\":[{\"notice\":\"Attempted to cancel more than scheduled\"}],\"InsufficientScheduledAmount()\":[{\"notice\":\"Attempted to cancel more than scheduled\"}],\"InvalidRewardToken()\":[{\"notice\":\"Attempted to add an invalid reward token (zero address or base asset)\"}],\"NoRewardsToClaim()\":[{\"notice\":\"Attempted to claim rewards but none were available\"}],\"NoScheduledAmount()\":[{\"notice\":\"No scheduled amount to execute\"}],\"RewardTokenAlreadyAdded()\":[{\"notice\":\"Attempted to add a reward token that was already added\"}],\"Unauthorized()\":[{\"notice\":\"Attempted operation by unauthorized caller\"}],\"WithdrawalNotUnstaked()\":[{\"notice\":\"Attempted withdrawal without unstaking first\"}]},\"events\":{\"Delegated(bytes32,uint256,uint64[])\":{\"notice\":\"Emitted when delegation occurs\"},\"Deposited(uint256)\":{\"notice\":\"Emitted when assets are deposited\"},\"RewardIndexUpdated(address,uint256,uint256)\":{\"notice\":\"Emitted when the global reward index is updated\"},\"RewardSnapshotCreated(address,address,uint256,uint256,uint256)\":{\"notice\":\"Emitted when a new snapshot is created for a user\"},\"RewardTokenAdded(address)\":{\"notice\":\"Emitted when a new reward token is added\"},\"RewardsClaimed(address,address,uint256)\":{\"notice\":\"Emitted when rewards are claimed by a user\"},\"UnstakeCancelled(address,uint256)\":{\"notice\":\"Emitted when an unstake request is cancelled\"},\"UnstakeCancelled(bytes32,uint256)\":{\"notice\":\"Emitted when unstake is cancelled\"},\"UnstakeScheduled(bytes32,uint256)\":{\"notice\":\"Emitted when unstake is scheduled\"},\"WithdrawalCancelled(address,uint256)\":{\"notice\":\"Emitted when a withdrawal request is cancelled\"},\"WithdrawalCancelled(uint256)\":{\"notice\":\"Emitted when withdrawal is cancelled\"},\"WithdrawalScheduled(uint256)\":{\"notice\":\"Emitted when withdrawal is scheduled\"}},\"kind\":\"user\",\"methods\":{\"addRewardToken(address)\":{\"notice\":\"Register a new reward token\"},\"blueprintSelection(uint256)\":{\"notice\":\"Blueprint selection for delegation and exposure\"},\"cancelUnstake(uint256)\":{\"notice\":\"Cancel a scheduled unstake\"},\"cancelWithdraw(uint256)\":{\"notice\":\"Cancel a scheduled withdrawal\"},\"claimRewards(address,address[])\":{\"notice\":\"Claim accumulated rewards for specified tokens\"},\"deposit(uint256,address)\":{\"notice\":\"Deposit assets into vault and delegate\"},\"executeUnstake()\":{\"notice\":\"Execute the unstake\"},\"getClaimableRewards(address,address)\":{\"notice\":\"Get claimable rewards for a user and token\"},\"getRewardData(address)\":{\"notice\":\"Get reward data for a token\"},\"getRewardTokens()\":{\"notice\":\"Get all reward token addresses\"},\"mads()\":{\"notice\":\"The MultiAssetDelegation implementation\"},\"operator()\":{\"notice\":\"Operator address for delegation\"},\"redeem(uint256,address,address)\":{\"notice\":\"Redeem shares for assets\"},\"rewardData(address)\":{\"notice\":\"Reward accounting data per token\"},\"rewardTokens(uint256)\":{\"notice\":\"List of registered reward tokens\"},\"scheduleUnstake(uint256)\":{\"notice\":\"Schedule unstaking of assets\"},\"scheduleWithdraw(uint256)\":{\"notice\":\"Schedule withdrawal of assets\"},\"scheduledUnstakeAmount(address)\":{\"notice\":\"Tracks scheduled unstake requests\"},\"scheduledWithdrawAmount(address)\":{\"notice\":\"Tracks scheduled withdraw requests\"},\"token()\":{\"notice\":\"The ERC20 token being delegated\"},\"totalAssets()\":{\"notice\":\"Calculate total vault value\"},\"transfer(address,uint256)\":{\"notice\":\"Transfer shares to another address\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfer shares from one address to another\"},\"unstakeAmount(address)\":{\"notice\":\"Tracks unstaking status for withdrawals\"},\"userSnapshots(address,address)\":{\"notice\":\"User reward snapshots per token\"},\"withdraw(uint256,address,address)\":{\"notice\":\"Execute withdrawal after delay\"}},\"notice\":\"ERC4626-compliant vault that implements reward distribution with index-based accounting\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/TangleLiquidRestakingVault.sol\":\"TangleLiquidRestakingVault\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":@openzeppelin-contracts-5.2.0/=dependencies/@openzeppelin-contracts-5.2.0/\",\":forge-std-1.9.5/=dependencies/forge-std-1.9.5/\",\":solmate-6.8.0/=dependencies/solmate-6.8.0/\"]},\"sources\":{\"dependencies/solmate-6.8.0/src/auth/Owned.sol\":{\"keccak256\":\"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://1ff52bbee698b9cf9e4574615e6550be0887ccf355f6571e23d6f25b332e79b4\",\"dweb:/ipfs/QmVorA2apojVRStzS7h8aFccR3Uv32G6HVtBtFHZrE7YXx\"]},\"dependencies/solmate-6.8.0/src/tokens/ERC20.sol\":{\"keccak256\":\"0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35\",\"dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97\"]},\"dependencies/solmate-6.8.0/src/tokens/ERC4626.sol\":{\"keccak256\":\"0xbc0fbc5200d17334a98ce69b49d4c5eb95f5716995679b0bab2562e924fba483\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://6069b0b4b8b6d75f0fcc15b521ac92f80ba4648b22ebccef78727f3472e55431\",\"dweb:/ipfs/Qmer8KABno4MvAZ7uawPpEKyU5mpSBqtTaBBK5Yf1kZPtZ\"]},\"dependencies/solmate-6.8.0/src/utils/FixedPointMathLib.sol\":{\"keccak256\":\"0x1b62af9baf5b8e991ed7531bc87f45550ba9d61e8dbff5caf237ccaf3a3fd843\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b7b38b977c5305b18ceefbeed4c9ceaaaefa419b520de62de6604ea661f8c0a9\",\"dweb:/ipfs/QmecMRzgfMyDVa2pvBqMMDLYBappaj7Aa3qcMoQYEQrhWi\"]},\"dependencies/solmate-6.8.0/src/utils/SafeTransferLib.sol\":{\"keccak256\":\"0x2725cc1d6f78a6aba23f6b5421f064dea9dfdadeb4689bf987f8962d62383746\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://c94c2cf587af021525b6ef9fa2cf42cf2144b4956d7fb48a9bb4142185d04cf6\",\"dweb:/ipfs/Qmf5CkSKGwEJVCmFRNK66M6WyCxBU8aPyuhDSTsBeVpsne\"]},\"src/MultiAssetDelegation.sol\":{\"keccak256\":\"0x950687e127bcb2c32cf6ec34ffbaf04520678eac2f1e21a606ede64bb173f928\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://af8b9f9462b69072a747c013c104deee224fe9ed0d1a160189b9475a488a3bd8\",\"dweb:/ipfs/QmWtEgBywdJpZxDEx9K4PFNxdmypSvmuxNMEiKEeKaYDEa\"]},\"src/TangleLiquidRestakingVault.sol\":{\"keccak256\":\"0x07aad0c499b14c12882cdcbdfd93b0a4ee60b62167f18932c53658a81d9d75bf\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://04b878c268b175b111a31e8ace4fa5526daf7b54ee0904226a10f6fa632ae82b\",\"dweb:/ipfs/QmRni14sfLFTD5zek2wPEQP71hc1aUjqZvyfbG34RVM4jo\"]},\"src/TangleMultiAssetDelegationWrapper.sol\":{\"keccak256\":\"0x4792f1319f2f990188589042ac141c4acb2c555fe3b97305cfaccd4e142a332c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3d64080dfe46e33fe4b895a3c73d48188864b5bac4d87466af6f4c21f111be63\",\"dweb:/ipfs/QmW6KLLXFUHybZHCi6JVgF3naHXJ5nCad8eaHb3hphQsWP\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.20+commit.a1b79de6"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"bytes32","name":"_operator","type":"bytes32"},{"internalType":"uint64[]","name":"_blueprintSelection","type":"uint64[]"},{"internalType":"address","name":"_mads","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"ExceedsScheduledAmount"},{"inputs":[],"type":"error","name":"InsufficientScheduledAmount"},{"inputs":[],"type":"error","name":"InvalidRewardToken"},{"inputs":[],"type":"error","name":"NoRewardsToClaim"},{"inputs":[],"type":"error","name":"NoScheduledAmount"},{"inputs":[],"type":"error","name":"RewardTokenAlreadyAdded"},{"inputs":[],"type":"error","name":"Unauthorized"},{"inputs":[],"type":"error","name":"WithdrawalNotUnstaked"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operator","type":"bytes32","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false},{"internalType":"uint64[]","name":"blueprintSelection","type":"uint64[]","indexed":false}],"type":"event","name":"Delegated","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"Deposit","anonymous":false},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Deposited","anonymous":false},{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":true},{"internalType":"uint256","name":"index","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"RewardIndexUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"address","name":"token","type":"address","indexed":true},{"internalType":"uint256","name":"index","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false},{"internalType":"uint256","name":"rewardIndex","type":"uint256","indexed":false}],"type":"event","name":"RewardSnapshotCreated","anonymous":false},{"inputs":[{"internalType":"address","name":"token","type":"address","indexed":true}],"type":"event","name":"RewardTokenAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"address","name":"token","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"RewardsClaimed","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"UnstakeCancelled","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operator","type":"bytes32","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"UnstakeCancelled","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operator","type":"bytes32","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"UnstakeScheduled","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"address","name":"receiver","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"Withdraw","anonymous":false},{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"WithdrawalCancelled","anonymous":false},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"WithdrawalCancelled","anonymous":false},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"WithdrawalScheduled","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addRewardToken"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"blueprintSelection","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"cancelUnstake"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"cancelWithdraw"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"claimRewards","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function","name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function","name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"executeUnstake"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function","name":"getClaimableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function","name":"getRewardData","outputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"uint256[]","name":"rewardTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardAmounts","type":"uint256[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getRewardTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"mads","outputs":[{"internalType":"contract MultiAssetDelegation","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"operator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"permit"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"rewardData","outputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"bool","name":"isValid","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"scheduleUnstake"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"scheduleWithdraw"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"scheduledUnstakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"scheduledWithdrawAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"token","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"unstakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"userSnapshots","outputs":[{"internalType":"uint256","name":"rewardIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"shareBalance","type":"uint256"},{"internalType":"uint256","name":"lastRewardIndex","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"addRewardToken(address)":{"details":"Initializes reward tracking for a new token Requirements: - Token must not be zero address or base asset - Token must not already be registered","params":{"token":"Address of reward token to register"}},"cancelUnstake(uint256)":{"params":{"assets":"Amount of assets to cancel unstaking"}},"cancelWithdraw(uint256)":{"params":{"assets":"Amount of assets to cancel withdrawal"}},"claimRewards(address,address[])":{"details":"Claims all pending rewards for given tokens For each token: 1. Updates global index to include any new rewards 2. Calculates user's entitled rewards since last snapshot 3. Transfers rewards and creates new snapshot Requirements: - Caller must be the user claiming rewards - Tokens must be valid reward tokens","params":{"tokens":"Array of reward token addresses to claim","user":"Address to claim rewards for"},"returns":{"rewards":"Array of claimed amounts per token"}},"deposit(uint256,address)":{"details":"Overrides ERC4626 deposit to handle reward snapshots and delegation","params":{"assets":"Amount of assets to deposit","receiver":"Recipient of the shares"},"returns":{"shares":"Amount of shares minted"}},"executeUnstake()":{"details":"Must have previously scheduled the unstake"},"getClaimableRewards(address,address)":{"details":"View function to check pending rewards","params":{"token":"Reward token address","user":"User address"},"returns":{"_0":"Claimable reward amount"}},"getRewardData(address)":{"details":"Returns full reward tracking state","params":{"token":"Reward token address"},"returns":{"index":"Current reward index","isValid":"Whether token is valid","lastUpdateTime":"Last update timestamp","rewardAmounts":"Array of reward amounts","rewardTimestamps":"Array of reward timestamps"}},"getRewardTokens()":{"returns":{"_0":"Array of reward token addresses"}},"redeem(uint256,address,address)":{"details":"Overrides ERC4626 redeem to handle reward snapshots","params":{"owner":"Owner of the shares","receiver":"Recipient of the assets","shares":"Amount of shares to redeem"},"returns":{"assets":"Amount of assets redeemed"}},"scheduleUnstake(uint256)":{"details":"Must be called before withdrawal can be executed","params":{"assets":"Amount of assets to unstake"}},"scheduleWithdraw(uint256)":{"details":"Must have previously unstaked the assets","params":{"assets":"Amount of assets to withdraw"}},"totalAssets()":{"details":"Returns total base assets, excluding reward tokens","returns":{"_0":"Total value in terms of asset tokens"}},"transfer(address,uint256)":{"details":"Overrides ERC20 transfer to handle reward snapshots Historical rewards stay with sender, recipient starts fresh","params":{"amount":"Number of shares to transfer","to":"Recipient of the shares"},"returns":{"_0":"success Whether transfer succeeded"}},"transferFrom(address,address,uint256)":{"details":"Overrides ERC20 transferFrom to handle reward snapshots Historical rewards stay with sender, recipient starts fresh","params":{"amount":"Number of shares to transfer","from":"Sender of the shares","to":"Recipient of the shares"},"returns":{"_0":"success Whether transfer succeeded"}},"withdraw(uint256,address,address)":{"details":"Overrides ERC4626 withdraw to handle reward snapshots","params":{"assets":"Amount of assets to withdraw","owner":"Owner of the shares","receiver":"Recipient of the assets"},"returns":{"shares":"Amount of shares burned"}}},"version":1},"userdoc":{"kind":"user","methods":{"addRewardToken(address)":{"notice":"Register a new reward token"},"blueprintSelection(uint256)":{"notice":"Blueprint selection for delegation and exposure"},"cancelUnstake(uint256)":{"notice":"Cancel a scheduled unstake"},"cancelWithdraw(uint256)":{"notice":"Cancel a scheduled withdrawal"},"claimRewards(address,address[])":{"notice":"Claim accumulated rewards for specified tokens"},"deposit(uint256,address)":{"notice":"Deposit assets into vault and delegate"},"executeUnstake()":{"notice":"Execute the unstake"},"getClaimableRewards(address,address)":{"notice":"Get claimable rewards for a user and token"},"getRewardData(address)":{"notice":"Get reward data for a token"},"getRewardTokens()":{"notice":"Get all reward token addresses"},"mads()":{"notice":"The MultiAssetDelegation implementation"},"operator()":{"notice":"Operator address for delegation"},"redeem(uint256,address,address)":{"notice":"Redeem shares for assets"},"rewardData(address)":{"notice":"Reward accounting data per token"},"rewardTokens(uint256)":{"notice":"List of registered reward tokens"},"scheduleUnstake(uint256)":{"notice":"Schedule unstaking of assets"},"scheduleWithdraw(uint256)":{"notice":"Schedule withdrawal of assets"},"scheduledUnstakeAmount(address)":{"notice":"Tracks scheduled unstake requests"},"scheduledWithdrawAmount(address)":{"notice":"Tracks scheduled withdraw requests"},"token()":{"notice":"The ERC20 token being delegated"},"totalAssets()":{"notice":"Calculate total vault value"},"transfer(address,uint256)":{"notice":"Transfer shares to another address"},"transferFrom(address,address,uint256)":{"notice":"Transfer shares from one address to another"},"unstakeAmount(address)":{"notice":"Tracks unstaking status for withdrawals"},"userSnapshots(address,address)":{"notice":"User reward snapshots per token"},"withdraw(uint256,address,address)":{"notice":"Execute withdrawal after delay"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts-5.2.0/=dependencies/@openzeppelin-contracts-5.2.0/","forge-std-1.9.5/=dependencies/forge-std-1.9.5/","solmate-6.8.0/=dependencies/solmate-6.8.0/"],"optimizer":{"enabled":true,"runs":1000000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/TangleLiquidRestakingVault.sol":"TangleLiquidRestakingVault"},"evmVersion":"shanghai","libraries":{}},"sources":{"dependencies/solmate-6.8.0/src/auth/Owned.sol":{"keccak256":"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea","urls":["bzz-raw://1ff52bbee698b9cf9e4574615e6550be0887ccf355f6571e23d6f25b332e79b4","dweb:/ipfs/QmVorA2apojVRStzS7h8aFccR3Uv32G6HVtBtFHZrE7YXx"],"license":"AGPL-3.0-only"},"dependencies/solmate-6.8.0/src/tokens/ERC20.sol":{"keccak256":"0xcdfd8db76b2a3415620e4d18cc5545f3d50de792dbf2c3dd5adb40cbe6f94b10","urls":["bzz-raw://57b3ab70cde374af1cf2c9888636e8de6cf660f087b1c9abd805e9271e19fa35","dweb:/ipfs/QmNrLDBAHYFjpjSd12jerm1AdBkDqEYUUaXgnT854BUZ97"],"license":"AGPL-3.0-only"},"dependencies/solmate-6.8.0/src/tokens/ERC4626.sol":{"keccak256":"0xbc0fbc5200d17334a98ce69b49d4c5eb95f5716995679b0bab2562e924fba483","urls":["bzz-raw://6069b0b4b8b6d75f0fcc15b521ac92f80ba4648b22ebccef78727f3472e55431","dweb:/ipfs/Qmer8KABno4MvAZ7uawPpEKyU5mpSBqtTaBBK5Yf1kZPtZ"],"license":"AGPL-3.0-only"},"dependencies/solmate-6.8.0/src/utils/FixedPointMathLib.sol":{"keccak256":"0x1b62af9baf5b8e991ed7531bc87f45550ba9d61e8dbff5caf237ccaf3a3fd843","urls":["bzz-raw://b7b38b977c5305b18ceefbeed4c9ceaaaefa419b520de62de6604ea661f8c0a9","dweb:/ipfs/QmecMRzgfMyDVa2pvBqMMDLYBappaj7Aa3qcMoQYEQrhWi"],"license":"AGPL-3.0-only"},"dependencies/solmate-6.8.0/src/utils/SafeTransferLib.sol":{"keccak256":"0x2725cc1d6f78a6aba23f6b5421f064dea9dfdadeb4689bf987f8962d62383746","urls":["bzz-raw://c94c2cf587af021525b6ef9fa2cf42cf2144b4956d7fb48a9bb4142185d04cf6","dweb:/ipfs/Qmf5CkSKGwEJVCmFRNK66M6WyCxBU8aPyuhDSTsBeVpsne"],"license":"AGPL-3.0-only"},"src/MultiAssetDelegation.sol":{"keccak256":"0x950687e127bcb2c32cf6ec34ffbaf04520678eac2f1e21a606ede64bb173f928","urls":["bzz-raw://af8b9f9462b69072a747c013c104deee224fe9ed0d1a160189b9475a488a3bd8","dweb:/ipfs/QmWtEgBywdJpZxDEx9K4PFNxdmypSvmuxNMEiKEeKaYDEa"],"license":"GPL-3.0-only"},"src/TangleLiquidRestakingVault.sol":{"keccak256":"0x07aad0c499b14c12882cdcbdfd93b0a4ee60b62167f18932c53658a81d9d75bf","urls":["bzz-raw://04b878c268b175b111a31e8ace4fa5526daf7b54ee0904226a10f6fa632ae82b","dweb:/ipfs/QmRni14sfLFTD5zek2wPEQP71hc1aUjqZvyfbG34RVM4jo"],"license":"UNLICENSED"},"src/TangleMultiAssetDelegationWrapper.sol":{"keccak256":"0x4792f1319f2f990188589042ac141c4acb2c555fe3b97305cfaccd4e142a332c","urls":["bzz-raw://3d64080dfe46e33fe4b895a3c73d48188864b5bac4d87466af6f4c21f111be63","dweb:/ipfs/QmW6KLLXFUHybZHCi6JVgF3naHXJ5nCad8eaHb3hphQsWP"],"license":"UNLICENSED"}},"version":1},"id":29} \ No newline at end of file diff --git a/precompiles/erc20-utils/src/lib.rs b/precompiles/erc20-utils/src/lib.rs index 6d6ba6635..3dceb0273 100644 --- a/precompiles/erc20-utils/src/lib.rs +++ b/precompiles/erc20-utils/src/lib.rs @@ -86,7 +86,7 @@ pub fn erc20_transfer( log::debug!( target: "evm", - "erc20_transfer: context: {:?}, exit_reason: {:?}, input: ({:?}, {}), output: 0x{}", + "ERC20.transfer: context: {:?}, exit_reason: {:?}, input: ({:?}, {}), output: 0x{}", context, exit_reason, to.0, diff --git a/precompiles/multi-asset-delegation/MultiAssetDelegation.sol b/precompiles/multi-asset-delegation/MultiAssetDelegation.sol index 3029340cf..48e461d74 100644 --- a/precompiles/multi-asset-delegation/MultiAssetDelegation.sol +++ b/precompiles/multi-asset-delegation/MultiAssetDelegation.sol @@ -14,35 +14,45 @@ MultiAssetDelegation constant MULTI_ASSET_DELEGATION_CONTRACT = MultiAssetDelega interface MultiAssetDelegation { /// @dev Join as an operator with a bond amount. /// @param bondAmount The amount to bond as an operator. + /// @custom:selector de883d74 function joinOperators(uint256 bondAmount) external; /// @dev Schedule to leave as an operator. + /// @custom:selector ce3edd76 function scheduleLeaveOperators() external; /// @dev Cancel the scheduled leave as an operator. + /// @custom:selector 9b1300c1 function cancelLeaveOperators() external; /// @dev Execute the leave as an operator. + /// @custom:selector 0de1fc17 function executeLeaveOperators() external; /// @dev Bond more as an operator. /// @param additionalBond The additional amount to bond. + /// @custom:selector eede281b function operatorBondMore(uint256 additionalBond) external; /// @dev Schedule to unstake as an operator. /// @param unstakeAmount The amount to unstake. + /// @custom:selector 44aff252 function scheduleOperatorUnstake(uint256 unstakeAmount) external; /// @dev Execute the unstake as an operator. + /// @custom:selector b0dfce06 function executeOperatorUnstake() external; /// @dev Cancel the scheduled unstake as an operator. + /// @custom:selector ac359f2b function cancelOperatorUnstake() external; /// @dev Go offline as an operator. + /// @custom:selector a6485ccd function goOffline() external; /// @dev Go online as an operator. + /// @custom:selector 6e5b676b function goOnline() external; /// @dev Deposit an amount of an asset. @@ -50,21 +60,25 @@ interface MultiAssetDelegation { /// @param tokenAddress The address of the ERC20 token (if assetId is 0). /// @param amount The amount to deposit. /// @param lockMultiplier The lock multiplier. + /// @custom:selector b3c11395 function deposit(uint256 assetId, address tokenAddress, uint256 amount, uint8 lockMultiplier) external; /// @dev Schedule a withdrawal of an amount of an asset. /// @param assetId The ID of the asset (0 for ERC20). /// @param tokenAddress The address of the ERC20 token (if assetId is 0). /// @param amount The amount to withdraw. + /// @custom:selector a125b146 function scheduleWithdraw(uint256 assetId, address tokenAddress, uint256 amount) external; /// @dev Execute the scheduled withdrawal. + /// @custom:selector f8fd9795 function executeWithdraw() external; /// @dev Cancel the scheduled withdrawal. /// @param assetId The ID of the asset (0 for ERC20). /// @param tokenAddress The address of the ERC20 token (if assetId is 0). /// @param amount The amount to cancel withdrawal. + /// @custom:selector 098d2a20 function cancelWithdraw(uint256 assetId, address tokenAddress, uint256 amount) external; /// @dev Delegate an amount of an asset to an operator. @@ -73,16 +87,26 @@ interface MultiAssetDelegation { /// @param tokenAddress The address of the ERC20 token (if assetId is 0). /// @param amount The amount to delegate. /// @param blueprintSelection The blueprint selection. - function delegate(bytes32 operator, uint256 assetId, address tokenAddress, uint256 amount, uint64[] memory blueprintSelection) external; + /// @custom:selector a12de0ba + function delegate( + bytes32 operator, + uint256 assetId, + address tokenAddress, + uint256 amount, + uint64[] memory blueprintSelection + ) external; /// @dev Schedule an unstake of an amount of an asset as a delegator. /// @param operator The address of the operator. /// @param assetId The ID of the asset (0 for ERC20). /// @param tokenAddress The address of the ERC20 token (if assetId is 0). /// @param amount The amount to unstake. - function scheduleDelegatorUnstake(bytes32 operator, uint256 assetId, address tokenAddress, uint256 amount) external; + /// @custom:selector 5bea61c6 + function scheduleDelegatorUnstake(bytes32 operator, uint256 assetId, address tokenAddress, uint256 amount) + external; /// @dev Execute the scheduled unstake as a delegator. + /// @custom:selector 007910d0 function executeDelegatorUnstake() external; /// @dev Cancel the scheduled unstake as a delegator. @@ -90,5 +114,22 @@ interface MultiAssetDelegation { /// @param assetId The ID of the asset (0 for ERC20). /// @param tokenAddress The address of the ERC20 token (if assetId is 0). /// @param amount The amount to cancel unstake. + /// @custom:selector 504aff13 function cancelDelegatorUnstake(bytes32 operator, uint256 assetId, address tokenAddress, uint256 amount) external; -} \ No newline at end of file + + /// @dev Get the total balance of the delegator (including the delegated balance). + /// @param who The address of the account. + /// @param assetId The ID of the asset (0 for ERC20). + /// @param tokenAddress The address of the ERC20 token (if assetId is 0). + /// @return The total balance of the delegator. + /// @custom:selector 467f4cb9 + function balanceOf(address who, uint256 assetId, address tokenAddress) external view returns (uint256); + + /// @dev Get the delegated balance of the delegator. + /// @param who The address of the delegator. + /// @param assetId The ID of the asset (0 for ERC20). + /// @param tokenAddress The address of the ERC20 token (if assetId is 0). + /// @return The delegated balance of the delegator. + /// @custom:selector aabd20df + function delegatedBalanceOf(address who, uint256 assetId, address tokenAddress) external view returns (uint256); +} diff --git a/precompiles/multi-asset-delegation/src/lib.rs b/precompiles/multi-asset-delegation/src/lib.rs index 743296063..e29cfad2c 100644 --- a/precompiles/multi-asset-delegation/src/lib.rs +++ b/precompiles/multi-asset-delegation/src/lib.rs @@ -39,6 +39,7 @@ pub mod mock; pub mod mock_evm; #[cfg(test)] mod tests; + use tangle_primitives::types::rewards::LockMultiplier; use evm_erc20_utils::*; @@ -50,7 +51,7 @@ use frame_support::{ use pallet_evm::AddressMapping; use pallet_multi_asset_delegation::types::DelegatorBlueprintSelection; use precompile_utils::prelude::*; -use sp_core::{H160, H256, U256}; +use sp_core::{H256, U256}; use sp_runtime::traits::Dispatchable; use sp_std::{marker::PhantomData, vec::Vec}; use tangle_primitives::{services::Asset, types::WrappedAccountId32}; @@ -75,6 +76,50 @@ where AssetIdOf: TryFrom + Into + From, Runtime::AccountId: From, { + #[precompile::public("balanceOf(address,uint256,address)")] + #[precompile::view] + fn balance_of( + handle: &mut impl PrecompileHandle, + who: Address, + asset_id: U256, + token_address: Address, + ) -> EvmResult { + handle.record_cost(RuntimeHelper::::db_read_gas_cost())?; + let who = Runtime::AddressMapping::into_account_id(who.0); + let Some(delegator) = pallet_multi_asset_delegation::Pallet::::delegators(&who) + else { + return Ok(U256::zero()); + }; + let asset = match (asset_id.as_u128(), token_address.0 .0) { + (0, erc20_token) if erc20_token != [0; 20] => Asset::Erc20(erc20_token.into()), + (other_asset_id, _) => Asset::Custom(other_asset_id.into()), + }; + let amount = delegator.deposits.get(&asset).map(|d| d.amount).unwrap_or_default(); + Ok(amount.into()) + } + + #[precompile::public("delegatedBalanceOf(address,uint256,address)")] + #[precompile::view] + fn delegated_balance_of( + handle: &mut impl PrecompileHandle, + who: Address, + asset_id: U256, + token_address: Address, + ) -> EvmResult { + handle.record_cost(RuntimeHelper::::db_read_gas_cost())?; + let who = Runtime::AddressMapping::into_account_id(who.0); + let Some(delegator) = pallet_multi_asset_delegation::Pallet::::delegators(&who) + else { + return Ok(U256::zero()); + }; + let asset = match (asset_id.as_u128(), token_address.0 .0) { + (0, erc20_token) if erc20_token != [0; 20] => Asset::Erc20(erc20_token.into()), + (other_asset_id, _) => Asset::Custom(other_asset_id.into()), + }; + let amount = delegator.deposits.get(&asset).map(|d| d.delegated_amount).unwrap_or_default(); + Ok(amount.into()) + } + #[precompile::public("joinOperators(uint256)")] fn join_operators(handle: &mut impl PrecompileHandle, bond_amount: U256) -> EvmResult { handle.record_cost(RuntimeHelper::::db_read_gas_cost())?; @@ -413,8 +458,7 @@ where let caller = handle.context().caller; let who = Runtime::AddressMapping::into_account_id(caller); - let operator = - Runtime::AddressMapping::into_account_id(H160::from_slice(&operator.0[12..])); + let operator = Runtime::AccountId::from(WrappedAccountId32(operator.0)); let (deposit_asset, amount) = match (asset_id.as_u128(), token_address.0 .0) { (0, erc20_token) if erc20_token != [0; 20] => { @@ -461,8 +505,7 @@ where let caller = handle.context().caller; let who = Runtime::AddressMapping::into_account_id(caller); - let operator = - Runtime::AddressMapping::into_account_id(H160::from_slice(&operator.0[12..])); + let operator = Runtime::AccountId::from(WrappedAccountId32(operator.0)); let (deposit_asset, amount) = match (asset_id.as_u128(), token_address.0 .0) { (0, erc20_token) if erc20_token != [0; 20] => { diff --git a/precompiles/multi-asset-delegation/src/mock.rs b/precompiles/multi-asset-delegation/src/mock.rs index 11e857712..55ed9f4de 100644 --- a/precompiles/multi-asset-delegation/src/mock.rs +++ b/precompiles/multi-asset-delegation/src/mock.rs @@ -132,6 +132,13 @@ impl From for H160 { } } +impl From for Address { + fn from(x: TestAccount) -> Address { + let h160: H160 = x.into(); + Address::from(h160) + } +} + impl From for AccountId32 { fn from(x: TestAccount) -> Self { match x { diff --git a/precompiles/multi-asset-delegation/src/tests.rs b/precompiles/multi-asset-delegation/src/tests.rs index ab41ab3a1..1a7ef646b 100644 --- a/precompiles/multi-asset-delegation/src/tests.rs +++ b/precompiles/multi-asset-delegation/src/tests.rs @@ -218,6 +218,8 @@ fn test_deposit_assets_insufficient_balance_erc20() { .execute_reverts(|output| output == b"Failed to transfer ERC20 tokens: false"); assert!(Delegators::::get(delegator_account).is_none()); + + // Delegate }); } @@ -264,10 +266,9 @@ fn test_delegate_assets() { .unwrap() .delegations .iter() - .find(|x| x.delegator == delegator_account + .any(|x| x.delegator == delegator_account && x.asset_id == Asset::Custom(1) - && x.amount == 100) - .is_some()); + && x.amount == 100)); }); } @@ -307,6 +308,89 @@ fn test_delegate_assets_insufficient_balance() { }); } +#[test] +fn test_unstake_assets_erc20() { + ExtBuilder::default().build().execute_with(|| { + let delegator_account = sp_core::sr25519::Public::from(TestAccount::Alex); + let operator_account = sp_core::sr25519::Public::from(TestAccount::Bobo); + + Balances::make_free_balance_be(&operator_account, 20_000); + assert_ok!(MultiAssetDelegation::join_operators( + RuntimeOrigin::signed(operator_account), + 10_000 + )); + + create_and_mint_tokens(1, delegator_account, 500); + Balances::make_free_balance_be(&delegator_account, 500); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::deposit { + asset_id: U256::zero(), + amount: U256::from(200), + token_address: Address(USDC_ERC20), + lock_multiplier: 0, + }, + ) + .with_subcall_handle(|subcall| { + // Intercept the call + assert!(!subcall.is_static); + assert_eq!(subcall.address, USDC_ERC20); + assert_eq!(subcall.context.caller, TestAccount::Alex.into()); + assert_eq!(subcall.context.apparent_value, U256::zero()); + assert_eq!(subcall.context.address, USDC_ERC20); + assert_eq!(subcall.input[0..4], keccak256!("transfer(address,uint256)")[0..4]); + // if all of the above passed, then it is okay. + + let mut out = SubcallOutput::succeed(); + out.output = ethabi::encode(&[ethabi::Token::Bool(true)]).to_vec(); + out + }) + .execute_returns(()); + + assert!(Delegators::::get(delegator_account).is_some()); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegate { + operator: operator_account.into(), + asset_id: U256::zero(), + amount: U256::from(200), + token_address: Address(USDC_ERC20), + blueprint_selection: Default::default(), + }, + ) + .execute_returns(()); + + assert!(Delegators::::get(delegator_account).is_some()); + + // Unstake + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::schedule_delegator_unstake { + operator: operator_account.into(), + asset_id: U256::zero(), + amount: U256::from(200), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(()); + + let d = Delegators::::get(delegator_account).unwrap(); + assert!(d + .delegator_unstake_requests + .iter() + .any(|x| x.amount == 200 && x.asset_id == Asset::Erc20(USDC_ERC20))); + }); +} + #[test] fn test_schedule_withdraw() { ExtBuilder::default().build().execute_with(|| { @@ -614,3 +698,317 @@ fn test_operator_go_offline_and_online() { assert_eq!(Balances::free_balance(operator_account), 20_000 - 10_000); }); } + +#[test] +fn balance_of_works() { + ExtBuilder::default().build().execute_with(|| { + let delegator_account = sp_core::sr25519::Public::from(TestAccount::Alex); + let operator_account = sp_core::sr25519::Public::from(TestAccount::Bobo); + + Balances::make_free_balance_be(&operator_account, 20_000); + assert_ok!(MultiAssetDelegation::join_operators( + RuntimeOrigin::signed(operator_account), + 10_000 + )); + + create_and_mint_tokens(1, delegator_account, 500); + Balances::make_free_balance_be(&delegator_account, 500); + + // Not a delegator yet. + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::zero()); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::zero()); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::deposit { + asset_id: U256::zero(), + amount: U256::from(200), + token_address: Address(USDC_ERC20), + lock_multiplier: 0, + }, + ) + .with_subcall_handle(|subcall| { + // Intercept the call + assert!(!subcall.is_static); + assert_eq!(subcall.address, USDC_ERC20); + assert_eq!(subcall.context.caller, TestAccount::Alex.into()); + assert_eq!(subcall.context.apparent_value, U256::zero()); + assert_eq!(subcall.context.address, USDC_ERC20); + assert_eq!(subcall.input[0..4], keccak256!("transfer(address,uint256)")[0..4]); + // if all of the above passed, then it is okay. + + let mut out = SubcallOutput::succeed(); + out.output = ethabi::encode(&[ethabi::Token::Bool(true)]).to_vec(); + out + }) + .execute_returns(()); + + assert!(Delegators::::get(delegator_account).is_some()); + + // Deposit successful, now check balance + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(200)); + + // This should still zero, since it's not delegated yet. + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::zero()); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegate { + operator: operator_account.into(), + asset_id: U256::zero(), + amount: U256::from(100), + token_address: Address(USDC_ERC20), + blueprint_selection: Default::default(), + }, + ) + .execute_returns(()); + + assert!(Delegators::::get(delegator_account).is_some()); + // Delegated balance should now be 100 + // Deposit balance should be the same as before. + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(200)); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(100)); + + // Unstake + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::schedule_delegator_unstake { + operator: operator_account.into(), + asset_id: U256::zero(), + amount: U256::from(50), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(()); + + let d = Delegators::::get(delegator_account).unwrap(); + assert!(d + .delegator_unstake_requests + .iter() + .any(|x| x.amount == 50 && x.asset_id == Asset::Erc20(USDC_ERC20))); + + // Now check balance again + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(200)); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(100)); + + MultiAssetDelegation::handle_round_change(5); + // Execute unstake + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::execute_delegator_unstake {}, + ) + .execute_returns(()); + + // Check balance again + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(200)); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(50)); + + // Schedule withdraw + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::schedule_withdraw { + asset_id: U256::zero(), + amount: U256::from(100), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(()); + + // Check balance again + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(100)); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(50)); + + MultiAssetDelegation::handle_round_change(6); + + // Execute withdraw + PrecompilesValue::get() + .prepare_test(TestAccount::Alex, H160::from_low_u64_be(1), PCall::execute_withdraw {}) + .with_subcall_handle(|subcall| { + // Intercept the call + assert!(!subcall.is_static); + assert_eq!(subcall.address, USDC_ERC20); + assert_eq!(subcall.context.caller, MultiAssetDelegation::pallet_evm_account()); + assert_eq!(subcall.context.apparent_value, U256::zero()); + assert_eq!(subcall.context.address, USDC_ERC20); + assert_eq!(subcall.input[0..4], keccak256!("transfer(address,uint256)")[0..4]); + // if all of the above passed, then it is okay. + + let mut out = SubcallOutput::succeed(); + out.output = ethabi::encode(&[ethabi::Token::Bool(true)]).to_vec(); + out + }) + .execute_returns(()); + + // Check balance again + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(100)); + + PrecompilesValue::get() + .prepare_test( + TestAccount::Alex, + H160::from_low_u64_be(1), + PCall::delegated_balance_of { + who: TestAccount::Alex.into(), + asset_id: U256::zero(), + token_address: Address(USDC_ERC20), + }, + ) + .execute_returns(U256::from(50)); + }); +} + +#[test] +fn test_solidity_interface_has_all_function_selectors_documented_and_implemented() { + check_precompile_implements_solidity_interfaces( + &["MultiAssetDelegation.sol"], + PCall::supports_selector, + ) +} diff --git a/runtime/mainnet/src/lib.rs b/runtime/mainnet/src/lib.rs index a42362fa5..097771e04 100644 --- a/runtime/mainnet/src/lib.rs +++ b/runtime/mainnet/src/lib.rs @@ -177,6 +177,9 @@ pub fn native_version() -> NativeVersion { NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } } +// Precompiles +pub type Precompiles = precompiles::TanglePrecompiles; + pub const MAXIMUM_BLOCK_LENGTH: u32 = 5 * 1024 * 1024; parameter_types! { diff --git a/tangle-subxt/metadata/tangle-testnet-runtime.scale b/tangle-subxt/metadata/tangle-testnet-runtime.scale index b62033f51bc2890985a6c6f85cf883addec6c981..644c30c5cc56b9283dad97af7d8554b0a455e473 100644 GIT binary patch delta 1513 zcmah}eNa?Y6u;-adw17(Tlhh2hWSbqFd;K0&BVe1wMqOyOtWlV*{8d?>@NGE^oIcD2@CVIN1#Oj~Dgx;ENumS>Dx>_&r2G2+rx zHgnDlY|1hzvV}+Ga9B1wWp_BG^dGCPpt${DaXYZ$cEMN!Su`eHc#OsG6JwHRJnd9m z`VdlY=frw*m{N#Fv`vB42aCKSEArys)C;jLQ*pX2E)C8C9Zm-mXfzx4Vx&WSNa+p- zMka&+p##)bgO@`g_156Hq(jm~phud3^hp1Odg!ehoH@Hhf|xB%#kj`cM6hVTV%}qN z>CM*Nwxe`!EnWyE^jIxkk#Lk#Z?L<}HY?_u$|TT4uD4kgP8zw{mZM-)#y8-C%IM8n zd_1Xql9GyvN-Cx(sR${VL;FtSrT;6ZlD<@j- z`AIj?J@qEK!_bfsev}aZxR7Nd8g!X)_~(- zfL?9D^TlCFqV}`m{d8UHyAD<#&GarblFj0sO!U^?Oaex4k^# zjV5iXu8)5BG8eI29a;R2s%S@EdN$C{j+2e!^ReS(k0$?AQbF~%MTl9-NtYNIo8;-d zbvRVsp`m-8esz+pq=6G;CM~ZZL*txBPLL#ZWK8vq4}wMER9?H&!^sg|@`XD8Sjy%U zH)1VbG6L#5iL~w{`CgUy+NZA$BIfatv!Y-`^f^D-E&yURe$qY{(%8OkvQ4!qK2zCm za2TDbb~9d^>sB1E=-p1mp?8Gcns`HYw#{wj&&!BpgEQ0&%*GLTL(*k{yeX6~8!Q&t z#oJ35Lg5n0U-BTxiSi3OGws=T__vx}rd1ZVVt1IWuAMuU%c-)(%-fM|_c*TZ5-ETK z?1`VqAc%$1A-bT4?29Ut$|aPX?RGd6E@GF(mc18MQhyJ5gukcW9+JY})7$`A3VymZ zK=PoDb_K{c(7?)mCTd|;i==VoJu1cD2I@@)rzyFOo&JS132=_tdx;Eio|g2HV{n!eyzU2rq!@Z>$~Cf@wf;&51+iZmV7}kUbpeKH~tAM=9ZMGPx^)C|5N=L~B5VhKK U%y^w_6Ja`Q`I{tz7^Ox30?(2EP5=M^ delta 1209 zcmZXUe@xVM7{|Y#@ArA`j{IC6gmKvqe~{kGF#lk3t{a{Urqv}UF=gv>UT)s_?7KbB=h^dq zJI}e5=1bAU>PZc-wBS8Sbqe?qy=QS1mck){`Yq zeOi?5(jLjCq2#QcQ)8aw{lJ5-B-N)X)KkGY`epZoap6^Q_v<(b`4vWn1V*C#11s^zdnE zTIpqJ?r)P);4S=Y+%m>HqcKBEG}1*4Ct)!SoQ73dJ#h{AqYdQCrteJezo&zI z>C3kLG3f>Y-?Bc^oq;7U^v6v+Fni*Gm^5nC3tW+(Y~;DHLAgjTbwM)iIRihjk*NP$ zMj#FroDB=cV8NL5jc!P1A#!!Y5;jiDeUM7ubwfG39`#>iVcPA3r!vBE(8z3PBnFMd z2oWEYuxTnj3mI&NJU;nf8J##QgGh-zu$(1OP7kErXEe%z+L)4Pr0@nXi`pJ2Phx(G zoQGvBmlh2|mUw3n*3QuvB{i;k)`j%-C2;E$zvG`zQpM6ycx<(PePRFnRwvTyX7uY8 z{+oY!Cy1nnFzaJVQE@K4*^IBoysw&Zvq8Bqv>-H5hQfFR2Q^daK#hN9H%3=f9`oB| zX~P`);3z&oIbYzlyS%KUn5j3JgWore+3qHr5@X3HJa}BM1mDZGehOmqaSSv4|B1A* z4Tp3;od4*T^aPRl4gRdDrZk%JVzK&%CJIks?*f)9QigDoj_OBn2iq%dj^G5-s`)+| zyM(*uRr5n!$=>FwthCylmaR6&wlbxK?4!6suIrIed=XkX9HxpG9Qr?Nir services_api::ServicesApi { services_api::ServicesApi } + pub fn rewards_api(&self) -> rewards_api::RewardsApi { + rewards_api::RewardsApi + } pub fn ethereum_runtime_rpc_api( &self, ) -> ethereum_runtime_rpc_api::EthereumRuntimeRPCApi { @@ -735,6 +739,76 @@ pub mod api { } } } + pub mod rewards_api { + use super::root_mod; + use super::runtime_types; + pub struct RewardsApi; + impl RewardsApi { + #[doc = " Query all the rewards that this operator is providing along with their blueprints."] + #[doc = ""] + #[doc = " ## Arguments"] + #[doc = " - `operator`: The operator account id."] + #[doc = " ## Return"] + #[doc = " - [`RpcRewardsWithBlueprint`]: A list of rewards with their blueprints."] + pub fn query_user_rewards( + &self, + account_id: types::query_user_rewards::AccountId, + asset_id: types::query_user_rewards::AssetId, + ) -> ::subxt::ext::subxt_core::runtime_api::payload::StaticPayload< + types::QueryUserRewards, + types::query_user_rewards::output::Output, + > { + ::subxt::ext::subxt_core::runtime_api::payload::StaticPayload::new_static( + "RewardsApi", + "query_user_rewards", + types::QueryUserRewards { account_id, asset_id }, + [ + 46u8, 226u8, 33u8, 74u8, 67u8, 130u8, 55u8, 151u8, 57u8, 20u8, 186u8, + 107u8, 95u8, 50u8, 110u8, 155u8, 193u8, 245u8, 88u8, 102u8, 120u8, + 204u8, 68u8, 225u8, 130u8, 225u8, 54u8, 78u8, 59u8, 75u8, 64u8, 255u8, + ], + ) + } + } + pub mod types { + use super::runtime_types; + pub mod query_user_rewards { + use super::runtime_types; + pub type AccountId = ::subxt::ext::subxt_core::utils::AccountId32; + pub type AssetId = + runtime_types::tangle_primitives::services::Asset<::core::primitive::u128>; + pub mod output { + use super::runtime_types; + pub type Output = ::core::result::Result< + ::core::primitive::u128, + runtime_types::sp_runtime::DispatchError, + >; + } + } + #[derive( + :: subxt :: ext :: subxt_core :: ext :: codec :: Decode, + :: subxt :: ext :: subxt_core :: ext :: codec :: Encode, + :: subxt :: ext :: subxt_core :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: subxt_core :: ext :: scale_encode :: EncodeAsType, + Clone, + Debug, + Eq, + PartialEq, + )] + # [codec (crate = :: subxt :: ext :: subxt_core :: ext :: codec)] + #[codec(dumb_trait_bound)] + #[decode_as_type( + crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_decode" + )] + #[encode_as_type( + crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode" + )] + pub struct QueryUserRewards { + pub account_id: query_user_rewards::AccountId, + pub asset_id: query_user_rewards::AssetId, + } + } + } pub mod ethereum_runtime_rpc_api { use super::root_mod; use super::runtime_types; @@ -3678,9 +3752,9 @@ pub mod api { .hash(); runtime_metadata_hash == [ - 83u8, 92u8, 60u8, 232u8, 161u8, 29u8, 48u8, 238u8, 84u8, 44u8, 120u8, 124u8, 99u8, - 86u8, 193u8, 48u8, 169u8, 241u8, 198u8, 29u8, 169u8, 145u8, 68u8, 35u8, 85u8, - 179u8, 198u8, 227u8, 66u8, 186u8, 124u8, 221u8, + 99u8, 93u8, 193u8, 42u8, 211u8, 104u8, 234u8, 235u8, 171u8, 3u8, 153u8, 72u8, 70u8, + 163u8, 182u8, 100u8, 8u8, 50u8, 39u8, 108u8, 150u8, 209u8, 247u8, 109u8, 156u8, + 247u8, 215u8, 61u8, 186u8, 239u8, 214u8, 181u8, ] } pub mod system { @@ -4885,10 +4959,9 @@ pub mod api { "Events", (), [ - 66u8, 225u8, 157u8, 197u8, 20u8, 49u8, 178u8, 155u8, 55u8, 247u8, - 244u8, 27u8, 204u8, 232u8, 170u8, 209u8, 107u8, 126u8, 128u8, 38u8, - 194u8, 244u8, 116u8, 216u8, 187u8, 237u8, 159u8, 35u8, 247u8, 158u8, - 91u8, 69u8, + 45u8, 92u8, 3u8, 147u8, 173u8, 150u8, 111u8, 24u8, 237u8, 254u8, 227u8, + 245u8, 243u8, 249u8, 160u8, 187u8, 44u8, 102u8, 192u8, 53u8, 54u8, + 14u8, 98u8, 119u8, 87u8, 48u8, 94u8, 121u8, 184u8, 166u8, 241u8, 167u8, ], ) } @@ -5582,9 +5655,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 104u8, 243u8, 183u8, 73u8, 83u8, 234u8, 164u8, 179u8, 6u8, 107u8, 67u8, - 149u8, 235u8, 16u8, 42u8, 90u8, 249u8, 201u8, 222u8, 150u8, 170u8, - 30u8, 43u8, 196u8, 37u8, 157u8, 170u8, 67u8, 59u8, 221u8, 169u8, 188u8, + 163u8, 184u8, 237u8, 177u8, 162u8, 77u8, 210u8, 38u8, 204u8, 177u8, + 239u8, 115u8, 85u8, 253u8, 142u8, 16u8, 154u8, 51u8, 139u8, 236u8, + 162u8, 164u8, 164u8, 226u8, 3u8, 37u8, 90u8, 171u8, 41u8, 241u8, 196u8, + 230u8, ], ) } @@ -5607,9 +5681,10 @@ pub mod api { weight, }, [ - 215u8, 34u8, 23u8, 153u8, 100u8, 61u8, 32u8, 12u8, 189u8, 228u8, 72u8, - 213u8, 232u8, 117u8, 226u8, 202u8, 5u8, 38u8, 106u8, 93u8, 8u8, 90u8, - 249u8, 226u8, 10u8, 112u8, 234u8, 229u8, 102u8, 33u8, 5u8, 100u8, + 137u8, 66u8, 229u8, 37u8, 3u8, 74u8, 65u8, 42u8, 189u8, 95u8, 177u8, + 192u8, 82u8, 248u8, 226u8, 134u8, 131u8, 68u8, 9u8, 147u8, 210u8, + 108u8, 223u8, 134u8, 252u8, 54u8, 158u8, 187u8, 68u8, 193u8, 65u8, + 48u8, ], ) } @@ -5648,9 +5723,9 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 44u8, 47u8, 139u8, 71u8, 178u8, 40u8, 185u8, 191u8, 46u8, 165u8, 200u8, - 70u8, 32u8, 77u8, 82u8, 205u8, 30u8, 69u8, 11u8, 254u8, 44u8, 116u8, - 105u8, 77u8, 199u8, 188u8, 54u8, 13u8, 79u8, 115u8, 51u8, 242u8, + 250u8, 73u8, 102u8, 88u8, 6u8, 214u8, 90u8, 202u8, 72u8, 254u8, 81u8, + 104u8, 160u8, 200u8, 172u8, 12u8, 84u8, 44u8, 66u8, 121u8, 92u8, 124u8, + 176u8, 24u8, 175u8, 226u8, 136u8, 154u8, 22u8, 26u8, 214u8, 72u8, ], ) } @@ -16574,10 +16649,9 @@ pub mod api { length_bound, }, [ - 177u8, 185u8, 60u8, 203u8, 108u8, 119u8, 224u8, 73u8, 94u8, 154u8, 7u8, - 37u8, 77u8, 100u8, 193u8, 219u8, 235u8, 133u8, 224u8, 150u8, 208u8, - 253u8, 134u8, 7u8, 121u8, 145u8, 163u8, 72u8, 119u8, 237u8, 139u8, - 165u8, + 168u8, 245u8, 229u8, 113u8, 186u8, 50u8, 189u8, 28u8, 4u8, 93u8, 20u8, + 203u8, 155u8, 237u8, 159u8, 226u8, 149u8, 3u8, 159u8, 24u8, 12u8, + 185u8, 35u8, 57u8, 143u8, 92u8, 87u8, 233u8, 153u8, 54u8, 192u8, 229u8, ], ) } @@ -16610,9 +16684,10 @@ pub mod api { length_bound, }, [ - 78u8, 80u8, 61u8, 233u8, 178u8, 156u8, 126u8, 234u8, 121u8, 226u8, - 143u8, 185u8, 190u8, 210u8, 79u8, 141u8, 93u8, 193u8, 24u8, 233u8, 0u8, - 50u8, 65u8, 31u8, 51u8, 218u8, 113u8, 69u8, 121u8, 82u8, 92u8, 239u8, + 110u8, 199u8, 178u8, 207u8, 130u8, 62u8, 107u8, 71u8, 208u8, 197u8, + 174u8, 180u8, 216u8, 155u8, 219u8, 9u8, 110u8, 31u8, 230u8, 190u8, + 251u8, 38u8, 152u8, 236u8, 217u8, 107u8, 61u8, 176u8, 140u8, 144u8, + 84u8, 235u8, ], ) } @@ -17003,10 +17078,9 @@ pub mod api { "ProposalOf", (), [ - 185u8, 49u8, 29u8, 63u8, 134u8, 160u8, 131u8, 52u8, 195u8, 14u8, 233u8, - 173u8, 155u8, 140u8, 220u8, 255u8, 111u8, 249u8, 87u8, 92u8, 171u8, - 142u8, 229u8, 54u8, 181u8, 176u8, 137u8, 203u8, 106u8, 175u8, 39u8, - 62u8, + 145u8, 29u8, 250u8, 9u8, 203u8, 90u8, 35u8, 56u8, 124u8, 105u8, 43u8, + 203u8, 252u8, 210u8, 53u8, 30u8, 138u8, 8u8, 31u8, 220u8, 36u8, 53u8, + 7u8, 200u8, 158u8, 212u8, 95u8, 250u8, 29u8, 26u8, 240u8, 160u8, ], ) } @@ -17030,10 +17104,9 @@ pub mod api { _0.borrow(), ), [ - 185u8, 49u8, 29u8, 63u8, 134u8, 160u8, 131u8, 52u8, 195u8, 14u8, 233u8, - 173u8, 155u8, 140u8, 220u8, 255u8, 111u8, 249u8, 87u8, 92u8, 171u8, - 142u8, 229u8, 54u8, 181u8, 176u8, 137u8, 203u8, 106u8, 175u8, 39u8, - 62u8, + 145u8, 29u8, 250u8, 9u8, 203u8, 90u8, 35u8, 56u8, 124u8, 105u8, 43u8, + 203u8, 252u8, 210u8, 53u8, 30u8, 138u8, 8u8, 31u8, 220u8, 36u8, 53u8, + 7u8, 200u8, 158u8, 212u8, 95u8, 250u8, 29u8, 26u8, 240u8, 160u8, ], ) } @@ -33437,9 +33510,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 170u8, 120u8, 244u8, 215u8, 159u8, 130u8, 64u8, 248u8, 162u8, 92u8, - 252u8, 99u8, 196u8, 12u8, 134u8, 221u8, 199u8, 37u8, 48u8, 159u8, 67u8, - 183u8, 154u8, 93u8, 64u8, 51u8, 150u8, 138u8, 42u8, 125u8, 191u8, 21u8, + 26u8, 185u8, 207u8, 48u8, 159u8, 175u8, 62u8, 226u8, 116u8, 183u8, + 146u8, 248u8, 197u8, 153u8, 236u8, 61u8, 201u8, 157u8, 222u8, 179u8, + 149u8, 138u8, 15u8, 184u8, 40u8, 117u8, 66u8, 3u8, 39u8, 54u8, 45u8, + 174u8, ], ) } @@ -33482,9 +33556,9 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 233u8, 84u8, 88u8, 220u8, 250u8, 230u8, 53u8, 70u8, 200u8, 49u8, 34u8, - 90u8, 138u8, 217u8, 219u8, 227u8, 138u8, 45u8, 40u8, 210u8, 48u8, - 152u8, 220u8, 67u8, 99u8, 239u8, 130u8, 0u8, 18u8, 131u8, 175u8, 106u8, + 26u8, 94u8, 109u8, 26u8, 181u8, 255u8, 182u8, 61u8, 62u8, 224u8, 107u8, + 167u8, 217u8, 156u8, 189u8, 252u8, 30u8, 214u8, 131u8, 162u8, 105u8, + 96u8, 26u8, 20u8, 160u8, 239u8, 58u8, 127u8, 15u8, 29u8, 143u8, 175u8, ], ) } @@ -33523,9 +33597,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 26u8, 48u8, 231u8, 40u8, 187u8, 247u8, 71u8, 102u8, 215u8, 81u8, 45u8, - 11u8, 12u8, 11u8, 140u8, 101u8, 145u8, 60u8, 224u8, 101u8, 50u8, 85u8, - 129u8, 158u8, 93u8, 163u8, 248u8, 179u8, 50u8, 215u8, 60u8, 49u8, + 43u8, 61u8, 59u8, 243u8, 190u8, 84u8, 93u8, 176u8, 22u8, 212u8, 47u8, + 136u8, 46u8, 126u8, 48u8, 255u8, 134u8, 234u8, 169u8, 212u8, 238u8, + 106u8, 72u8, 137u8, 130u8, 169u8, 11u8, 211u8, 195u8, 70u8, 206u8, + 52u8, ], ) } @@ -33550,10 +33625,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 86u8, 120u8, 18u8, 16u8, 48u8, 232u8, 57u8, 152u8, 246u8, 123u8, 41u8, - 45u8, 51u8, 85u8, 114u8, 206u8, 146u8, 164u8, 50u8, 195u8, 199u8, - 118u8, 153u8, 118u8, 201u8, 247u8, 57u8, 11u8, 137u8, 93u8, 165u8, - 204u8, + 174u8, 234u8, 82u8, 253u8, 6u8, 3u8, 178u8, 254u8, 69u8, 119u8, 49u8, + 52u8, 80u8, 107u8, 193u8, 127u8, 173u8, 96u8, 102u8, 255u8, 72u8, + 206u8, 95u8, 209u8, 209u8, 184u8, 253u8, 174u8, 217u8, 173u8, 209u8, + 59u8, ], ) } @@ -38549,9 +38624,9 @@ pub mod api { "batch", types::Batch { calls }, [ - 36u8, 112u8, 231u8, 84u8, 153u8, 73u8, 93u8, 209u8, 62u8, 76u8, 85u8, - 41u8, 65u8, 147u8, 23u8, 7u8, 52u8, 218u8, 247u8, 249u8, 127u8, 105u8, - 58u8, 58u8, 86u8, 183u8, 66u8, 148u8, 159u8, 47u8, 1u8, 177u8, + 130u8, 215u8, 236u8, 248u8, 241u8, 29u8, 96u8, 180u8, 1u8, 145u8, 53u8, + 182u8, 25u8, 109u8, 56u8, 113u8, 48u8, 24u8, 250u8, 131u8, 5u8, 204u8, + 180u8, 179u8, 14u8, 64u8, 89u8, 93u8, 90u8, 8u8, 135u8, 200u8, ], ) } @@ -38581,10 +38656,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 100u8, 96u8, 223u8, 113u8, 197u8, 79u8, 127u8, 17u8, 10u8, 109u8, - 119u8, 140u8, 168u8, 255u8, 27u8, 80u8, 52u8, 125u8, 18u8, 99u8, 90u8, - 243u8, 112u8, 79u8, 74u8, 247u8, 191u8, 114u8, 184u8, 67u8, 186u8, - 49u8, + 164u8, 238u8, 25u8, 157u8, 116u8, 162u8, 95u8, 95u8, 55u8, 241u8, + 107u8, 43u8, 111u8, 167u8, 42u8, 155u8, 201u8, 4u8, 166u8, 8u8, 191u8, + 235u8, 251u8, 170u8, 217u8, 174u8, 106u8, 181u8, 154u8, 156u8, 4u8, + 37u8, ], ) } @@ -38610,10 +38685,9 @@ pub mod api { "batch_all", types::BatchAll { calls }, [ - 254u8, 236u8, 247u8, 111u8, 228u8, 2u8, 141u8, 46u8, 149u8, 46u8, - 200u8, 248u8, 143u8, 11u8, 71u8, 47u8, 116u8, 198u8, 101u8, 80u8, - 244u8, 68u8, 1u8, 202u8, 184u8, 221u8, 205u8, 233u8, 140u8, 100u8, - 213u8, 89u8, + 214u8, 27u8, 118u8, 220u8, 93u8, 23u8, 59u8, 220u8, 20u8, 2u8, 89u8, + 222u8, 82u8, 0u8, 63u8, 5u8, 25u8, 166u8, 169u8, 135u8, 250u8, 164u8, + 204u8, 33u8, 2u8, 53u8, 58u8, 58u8, 214u8, 157u8, 255u8, 204u8, ], ) } @@ -38636,9 +38710,9 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 50u8, 240u8, 106u8, 208u8, 186u8, 70u8, 231u8, 190u8, 151u8, 167u8, - 27u8, 105u8, 189u8, 163u8, 223u8, 39u8, 35u8, 70u8, 130u8, 217u8, 61u8, - 11u8, 201u8, 70u8, 5u8, 64u8, 67u8, 70u8, 81u8, 177u8, 60u8, 213u8, + 155u8, 249u8, 58u8, 170u8, 84u8, 86u8, 119u8, 177u8, 35u8, 5u8, 161u8, + 91u8, 56u8, 152u8, 217u8, 204u8, 239u8, 240u8, 235u8, 68u8, 71u8, + 238u8, 123u8, 218u8, 131u8, 134u8, 155u8, 76u8, 132u8, 65u8, 6u8, 45u8, ], ) } @@ -38664,9 +38738,10 @@ pub mod api { "force_batch", types::ForceBatch { calls }, [ - 95u8, 201u8, 187u8, 141u8, 50u8, 90u8, 145u8, 42u8, 68u8, 174u8, 13u8, - 90u8, 98u8, 79u8, 63u8, 236u8, 222u8, 224u8, 161u8, 211u8, 71u8, 15u8, - 188u8, 52u8, 133u8, 55u8, 224u8, 99u8, 142u8, 82u8, 130u8, 65u8, + 51u8, 107u8, 41u8, 241u8, 110u8, 148u8, 41u8, 79u8, 214u8, 100u8, + 231u8, 137u8, 189u8, 87u8, 95u8, 227u8, 243u8, 26u8, 157u8, 205u8, + 38u8, 82u8, 39u8, 170u8, 48u8, 7u8, 60u8, 49u8, 156u8, 9u8, 253u8, + 137u8, ], ) } @@ -38689,9 +38764,9 @@ pub mod api { weight, }, [ - 135u8, 148u8, 175u8, 193u8, 215u8, 123u8, 165u8, 22u8, 123u8, 243u8, - 190u8, 183u8, 191u8, 15u8, 48u8, 146u8, 93u8, 56u8, 38u8, 171u8, 16u8, - 253u8, 228u8, 198u8, 46u8, 39u8, 117u8, 19u8, 26u8, 12u8, 70u8, 168u8, + 159u8, 157u8, 208u8, 9u8, 147u8, 219u8, 203u8, 156u8, 60u8, 101u8, + 159u8, 133u8, 136u8, 114u8, 94u8, 228u8, 78u8, 73u8, 57u8, 249u8, 79u8, + 156u8, 94u8, 132u8, 24u8, 26u8, 91u8, 232u8, 213u8, 75u8, 32u8, 105u8, ], ) } @@ -39166,9 +39241,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 108u8, 216u8, 152u8, 4u8, 93u8, 13u8, 249u8, 119u8, 34u8, 61u8, 97u8, - 245u8, 129u8, 62u8, 207u8, 161u8, 43u8, 34u8, 113u8, 75u8, 165u8, 35u8, - 252u8, 215u8, 159u8, 170u8, 40u8, 64u8, 160u8, 3u8, 42u8, 27u8, + 207u8, 95u8, 82u8, 84u8, 239u8, 174u8, 168u8, 233u8, 98u8, 227u8, + 228u8, 232u8, 228u8, 199u8, 96u8, 83u8, 47u8, 252u8, 22u8, 166u8, + 208u8, 119u8, 7u8, 195u8, 160u8, 121u8, 73u8, 75u8, 132u8, 72u8, 216u8, + 195u8, ], ) } @@ -39230,10 +39306,9 @@ pub mod api { max_weight, }, [ - 1u8, 100u8, 146u8, 226u8, 26u8, 79u8, 235u8, 59u8, 210u8, 107u8, 0u8, - 56u8, 165u8, 175u8, 83u8, 234u8, 208u8, 100u8, 101u8, 87u8, 138u8, - 100u8, 189u8, 65u8, 212u8, 101u8, 175u8, 250u8, 138u8, 126u8, 70u8, - 91u8, + 225u8, 29u8, 101u8, 181u8, 6u8, 234u8, 234u8, 21u8, 86u8, 204u8, 183u8, + 123u8, 134u8, 162u8, 197u8, 2u8, 212u8, 36u8, 218u8, 35u8, 23u8, 151u8, + 92u8, 3u8, 1u8, 230u8, 186u8, 126u8, 132u8, 242u8, 174u8, 13u8, ], ) } @@ -42366,10 +42441,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 27u8, 220u8, 137u8, 175u8, 120u8, 237u8, 245u8, 233u8, 76u8, 183u8, - 229u8, 113u8, 192u8, 39u8, 118u8, 181u8, 211u8, 8u8, 254u8, 117u8, - 127u8, 146u8, 217u8, 214u8, 249u8, 226u8, 17u8, 156u8, 209u8, 34u8, - 180u8, 186u8, + 219u8, 170u8, 34u8, 33u8, 216u8, 139u8, 65u8, 77u8, 100u8, 199u8, + 220u8, 153u8, 173u8, 6u8, 184u8, 194u8, 91u8, 120u8, 19u8, 254u8, + 215u8, 127u8, 219u8, 216u8, 48u8, 119u8, 176u8, 242u8, 40u8, 62u8, 5u8, + 248u8, ], ) } @@ -42629,9 +42704,10 @@ pub mod api { call: ::subxt::ext::subxt_core::alloc::boxed::Box::new(call), }, [ - 81u8, 66u8, 67u8, 103u8, 145u8, 192u8, 9u8, 6u8, 49u8, 211u8, 145u8, - 127u8, 122u8, 176u8, 198u8, 228u8, 51u8, 57u8, 62u8, 88u8, 186u8, - 157u8, 207u8, 141u8, 23u8, 64u8, 219u8, 36u8, 229u8, 15u8, 84u8, 49u8, + 26u8, 14u8, 246u8, 164u8, 123u8, 24u8, 159u8, 255u8, 212u8, 222u8, + 64u8, 132u8, 179u8, 182u8, 135u8, 142u8, 158u8, 180u8, 150u8, 214u8, + 63u8, 171u8, 154u8, 37u8, 59u8, 87u8, 57u8, 179u8, 25u8, 155u8, 41u8, + 166u8, ], ) } @@ -49955,6 +50031,35 @@ pub mod api { const PALLET: &'static str = "Lst"; const CALL: &'static str = "set_commission_claim_permission"; } + #[derive( + :: subxt :: ext :: subxt_core :: ext :: codec :: Decode, + :: subxt :: ext :: subxt_core :: ext :: codec :: Encode, + :: subxt :: ext :: subxt_core :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: subxt_core :: ext :: scale_encode :: EncodeAsType, + Clone, + Debug, + Eq, + PartialEq, + )] + # [codec (crate = :: subxt :: ext :: subxt_core :: ext :: codec)] + #[codec(dumb_trait_bound)] + #[decode_as_type( + crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_decode" + )] + #[encode_as_type( + crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode" + )] + pub struct SetLastPoolId { + pub pool_id: set_last_pool_id::PoolId, + } + pub mod set_last_pool_id { + use super::runtime_types; + pub type PoolId = ::core::primitive::u32; + } + impl ::subxt::ext::subxt_core::blocks::StaticExtrinsic for SetLastPoolId { + const PALLET: &'static str = "Lst"; + const CALL: &'static str = "set_last_pool_id"; + } } pub struct TransactionApi; impl TransactionApi { @@ -50702,6 +50807,23 @@ pub mod api { ], ) } + pub fn set_last_pool_id( + &self, + pool_id: types::set_last_pool_id::PoolId, + ) -> ::subxt::ext::subxt_core::tx::payload::StaticPayload + { + ::subxt::ext::subxt_core::tx::payload::StaticPayload::new_static( + "Lst", + "set_last_pool_id", + types::SetLastPoolId { pool_id }, + [ + 144u8, 224u8, 38u8, 208u8, 118u8, 48u8, 28u8, 112u8, 196u8, 139u8, + 69u8, 15u8, 119u8, 203u8, 144u8, 76u8, 255u8, 43u8, 23u8, 79u8, 27u8, + 30u8, 157u8, 242u8, 51u8, 91u8, 255u8, 79u8, 157u8, 242u8, 162u8, + 100u8, + ], + ) + } } } #[doc = "Events of this pallet."] @@ -51261,6 +51383,32 @@ pub mod api { const PALLET: &'static str = "Lst"; const EVENT: &'static str = "MinBalanceExcessAdjusted"; } + #[derive( + :: subxt :: ext :: subxt_core :: ext :: codec :: Decode, + :: subxt :: ext :: subxt_core :: ext :: codec :: Encode, + :: subxt :: ext :: subxt_core :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: subxt_core :: ext :: scale_encode :: EncodeAsType, + Clone, + Debug, + Eq, + PartialEq, + )] + # [codec (crate = :: subxt :: ext :: subxt_core :: ext :: codec)] + #[codec(dumb_trait_bound)] + #[decode_as_type(crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: subxt_core :: ext :: scale_encode")] + #[doc = "The last PoolId is updated"] + pub struct LastPoolIdUpdated { + pub pool_id: last_pool_id_updated::PoolId, + } + pub mod last_pool_id_updated { + use super::runtime_types; + pub type PoolId = ::core::primitive::u32; + } + impl ::subxt::ext::subxt_core::events::StaticEvent for LastPoolIdUpdated { + const PALLET: &'static str = "Lst"; + const EVENT: &'static str = "LastPoolIdUpdated"; + } } pub mod storage { use super::runtime_types; @@ -66615,7 +66763,7 @@ pub mod api { )] #[doc = "Contains a variant per dispatchable extrinsic that this pallet has."] pub enum Call { - # [codec (index = 0)] # [doc = "Stakes funds with a pool by transferring the bonded amount from member to pool account."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `amount` - Amount to stake"] # [doc = "* `pool_id` - Target pool ID"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::MinimumBondNotMet`] - Amount below minimum bond"] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::DefensiveError`] - Reward pool not found"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "* Member must have `existential deposit + amount` in account"] # [doc = "* Pool must be in [`PoolState::Open`] state"] join { # [codec (compact)] amount : :: core :: primitive :: u128 , pool_id : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "Bond additional funds into an existing pool position."] # [doc = ""] # [doc = "Additional funds can come from either free balance or accumulated rewards."] # [doc = "Automatically pays out all pending rewards."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Target pool ID"] # [doc = "* `extra` - Source and amount of additional funds"] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed"] # [doc = "* Must have permission to bond extra if not self"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks permission"] # [doc = "* [`Error::DefensiveError`] - Reward pool not found"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "* This transaction prioritizes readability and correctness over optimization"] # [doc = "* Multiple storage reads/writes are performed to reuse code"] # [doc = "* See `bond_extra_other` to bond pending rewards of other members"] bond_extra { pool_id : :: core :: primitive :: u32 , extra : runtime_types :: pallet_tangle_lst :: types :: BondExtra < :: core :: primitive :: u128 > , } , # [codec (index = 3)] # [doc = "Unbond points from a member's pool position, collecting any pending rewards."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `member_account` - Account to unbond from"] # [doc = "* `pool_id` - Target pool ID"] # [doc = "* `unbonding_points` - Amount of points to unbond"] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Permissionless if:"] # [doc = " - Pool is blocked and caller is root/bouncer (kick)"] # [doc = " - Pool is destroying and member is not depositor"] # [doc = " - Pool is destroying, member is depositor, and pool is empty"] # [doc = "* Permissioned (caller must be member) if:"] # [doc = " - Caller is not depositor"] # [doc = " - Caller is depositor, pool is destroying, and pool is empty"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NoBalanceToUnbond`] - Member has insufficient points"] # [doc = "* [`Error::DefensiveError`] - Not enough space in unbond pool"] # [doc = ""] # [doc = "# Note"] # [doc = "If no unlocking chunks are available, [`Call::pool_withdraw_unbonded`] can be called first."] # [doc = "The staking interface will attempt this automatically but may still return `NoMoreChunks`"] # [doc = "if chunks cannot be released."] unbond { member_account : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , # [codec (compact)] unbonding_points : :: core :: primitive :: u128 , } , # [codec (index = 4)] # [doc = "Withdraws unbonded funds from the pool's staking account."] # [doc = ""] # [doc = "Useful for clearing unlocking chunks when there are too many to call `unbond`."] # [doc = "Prevents `NoMoreChunks` errors from the staking system."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Can be signed by any account"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `num_slashing_spans` - Number of slashing spans to check"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NotDestroying`] - Pool is in destroying state"] pool_withdraw_unbonded { pool_id : :: core :: primitive :: u32 , num_slashing_spans : :: core :: primitive :: u32 , } , # [codec (index = 5)] # [doc = "Withdraw unbonded funds from a member account."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Permissionless if:"] # [doc = " - Pool is in destroy mode and target is not depositor"] # [doc = " - Target is depositor and only member in sub pools"] # [doc = " - Pool is blocked and caller is root/bouncer"] # [doc = "* Permissioned if caller is target and not depositor"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `member_account` - Account to withdraw from"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `num_slashing_spans` - Number of slashing spans"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolMemberNotFound`] - Member account not found"] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::SubPoolsNotFound`] - Sub pools not found"] # [doc = "* [`Error::CannotWithdrawAny`] - No unbonded funds available"] # [doc = ""] # [doc = "If target is depositor, pool will be destroyed."] withdraw_unbonded { member_account : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , num_slashing_spans : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "Create a new delegation pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed by the account that will become the initial depositor"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `amount` - Amount to delegate to the pool"] # [doc = "* `root` - Account to set as pool root"] # [doc = "* `nominator` - Account to set as pool nominator"] # [doc = "* `bouncer` - Account to set as pool bouncer"] # [doc = "* `name` - Optional pool name bounded by `T::MaxNameLength`"] # [doc = "* `icon` - Optional pool icon bounded by `T::MaxIconLength`"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::OverflowRisk`] - Pool ID increment would overflow"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "Caller must have `amount + existential_deposit` transferable funds."] create { # [codec (compact)] amount : :: core :: primitive :: u128 , root : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , nominator : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , bouncer : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , name : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , icon : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , } , # [codec (index = 7)] # [doc = "Create a new delegation pool with a previously used pool ID."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed by the account that will become the depositor"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `amount` - Amount to delegate to the pool"] # [doc = "* `root` - Account to set as pool root"] # [doc = "* `nominator` - Account to set as pool nominator"] # [doc = "* `bouncer` - Account to set as pool bouncer"] # [doc = "* `pool_id` - Pool ID to reuse"] # [doc = "* `name` - Optional pool name"] # [doc = "* `icon` - Optional pool icon"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolIdInUse`] - Pool ID is already in use"] # [doc = "* [`Error::InvalidPoolId`] - Pool ID is greater than last pool ID"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "Caller must have `amount + existential_deposit` transferable funds."] create_with_pool_id { # [codec (compact)] amount : :: core :: primitive :: u128 , root : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , nominator : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , bouncer : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , name : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , icon : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , } , # [codec (index = 8)] # [doc = "Nominate validators on behalf of the pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Pool nominator or root role can nominate validators"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `validators` - List of validator accounts to nominate"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NotNominator`] - Caller lacks nominator permissions"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "Forwards nomination call to staking pallet using pool's bonded account."] nominate { pool_id : :: core :: primitive :: u32 , validators : :: subxt :: ext :: subxt_core :: alloc :: vec :: Vec < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , } , # [codec (index = 9)] # [doc = "Updates the state of a pool. Once a pool is in `Destroying` state, its state cannot be"] # [doc = "changed again under any circumstances."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Pool bouncer or root role can set any state"] # [doc = "* Any account can set state to `Destroying` if pool fails `ok_to_be_open` conditions"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `state` - New state to set"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::CanNotChangeState`] - Pool is in destroying state or caller lacks permissions"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "State changes are validated through `ok_to_be_open` which checks pool properties like"] # [doc = "commission, member count and roles."] set_state { pool_id : :: core :: primitive :: u32 , state : runtime_types :: pallet_tangle_lst :: types :: pools :: PoolState , } , # [codec (index = 10)] # [doc = "Updates the metadata for a given pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be called by the pool bouncer or root role"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `metadata` - New metadata to set"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::MetadataExceedsMaxLen`] - Metadata length exceeds maximum allowed"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks required permissions"] set_metadata { pool_id : :: core :: primitive :: u32 , metadata : :: subxt :: ext :: subxt_core :: alloc :: vec :: Vec < :: core :: primitive :: u8 > , } , # [codec (index = 11)] # [doc = "Updates the global configuration parameters for nomination pools."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be called by Root"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `min_join_bond` - Config operation for minimum bond to join a pool"] # [doc = "* `min_create_bond` - Config operation for minimum bond to create a pool "] # [doc = "* `max_pools` - Config operation for maximum number of pools"] # [doc = "* `global_max_commission` - Config operation for maximum global commission"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`DispatchError::BadOrigin`] - Caller is not Root"] set_configs { min_join_bond : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: core :: primitive :: u128 > , min_create_bond : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: core :: primitive :: u128 > , max_pools : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: core :: primitive :: u32 > , global_max_commission : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < runtime_types :: sp_arithmetic :: per_things :: Perbill > , } , # [codec (index = 12)] # [doc = "Update the roles of a pool."] # [doc = ""] # [doc = "Updates root, nominator and bouncer roles for a given pool. The depositor role cannot be changed."] # [doc = "Emits a `RolesUpdated` event on successful update."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Origin must be Root or pool root"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `new_root` - New root role configuration"] # [doc = "* `new_nominator` - New nominator role configuration "] # [doc = "* `new_bouncer` - New bouncer role configuration"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Origin does not have permission"] update_roles { pool_id : :: core :: primitive :: u32 , new_root : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , new_nominator : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , new_bouncer : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , } , # [codec (index = 13)] # [doc = "Chill on behalf of the pool by forwarding the call to the staking pallet."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Origin must be signed by pool nominator or root role"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NotNominator`] - Origin lacks nomination permission"] chill { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 14)] # [doc = "Bond additional funds for a pool member into their respective pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Origin must match member account for bonding from free balance/pending rewards"] # [doc = "* Any origin can bond from pending rewards if member has `PermissionlessAll` or"] # [doc = " `PermissionlessCompound` claim permissions"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `member` - Pool member account to bond for"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `extra` - Amount to bond from free balance or pending rewards"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::PoolMemberNotFound`] - Account is not a member of pool"] # [doc = "* [`Error::NoPermission`] - Origin lacks permission to bond for member"] bond_extra_other { member : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , extra : runtime_types :: pallet_tangle_lst :: types :: BondExtra < :: core :: primitive :: u128 > , } , # [codec (index = 17)] # [doc = "Set or remove the commission rate and payee for a pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Caller must have commission management permission for the pool"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `pool_id` - The pool identifier"] # [doc = "* `new_commission` - Optional commission rate and payee. None removes existing commission"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - The pool_id does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks commission management permission"] set_commission { pool_id : :: core :: primitive :: u32 , new_commission : :: core :: option :: Option < (runtime_types :: sp_arithmetic :: per_things :: Perbill , :: subxt :: ext :: subxt_core :: utils :: AccountId32 ,) > , } , # [codec (index = 18)] # [doc = "Set the maximum commission rate for a pool. Initial max can be set to any value, with only"] # [doc = "lower values allowed thereafter. Current commission will be reduced if above new max."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Caller must have commission management permission for the pool"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `pool_id` - The pool identifier"] # [doc = "* `max_commission` - The new maximum commission rate"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - The pool_id does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks commission management permission"] set_commission_max { pool_id : :: core :: primitive :: u32 , max_commission : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 19)] # [doc = "Set the commission change rate for a pool."] # [doc = ""] # [doc = "Initial change rate is not bounded, whereas subsequent updates can only be more"] # [doc = "restrictive than the current."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed by an account with commission management permission."] # [doc = "* `pool_id` - The identifier of the pool to set commission change rate for."] # [doc = "* `change_rate` - The new commission change rate configuration."] set_commission_change_rate { pool_id : :: core :: primitive :: u32 , change_rate : runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionChangeRate < :: core :: primitive :: u64 > , } , # [codec (index = 20)] # [doc = "Claim pending commission for a pool."] # [doc = ""] # [doc = "The dispatch origin of this call must be signed by an account with commission claim permission."] # [doc = "Pending commission is paid out and added to total claimed commission. Total pending commission"] # [doc = "is reset to zero."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed by an account with commission claim permission."] # [doc = "* `pool_id` - The identifier of the pool to claim commission from."] claim_commission { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 21)] # [doc = "Top up the deficit or withdraw the excess ED from the pool."] # [doc = ""] # [doc = "When a pool is created, the pool depositor transfers ED to the reward account of the"] # [doc = "pool. ED is subject to change and over time, the deposit in the reward account may be"] # [doc = "insufficient to cover the ED deficit of the pool or vice-versa where there is excess"] # [doc = "deposit to the pool. This call allows anyone to adjust the ED deposit of the"] # [doc = "pool by either topping up the deficit or claiming the excess."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed."] # [doc = "* `pool_id` - The identifier of the pool to adjust the deposit for."] adjust_pool_deposit { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 22)] # [doc = "Set or remove a pool's commission claim permission."] # [doc = ""] # [doc = "Only the `Root` role of the pool is able to configure commission claim permissions."] # [doc = "This determines which accounts are allowed to claim the pool's pending commission."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed by the pool's root account."] # [doc = "* `pool_id` - The identifier of the pool to set permissions for."] # [doc = "* `permission` - Optional commission claim permission configuration. If None, removes any existing permission."] set_commission_claim_permission { pool_id : :: core :: primitive :: u32 , permission : :: core :: option :: Option < runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionClaimPermission < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > > , } , } + # [codec (index = 0)] # [doc = "Stakes funds with a pool by transferring the bonded amount from member to pool account."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `amount` - Amount to stake"] # [doc = "* `pool_id` - Target pool ID"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::MinimumBondNotMet`] - Amount below minimum bond"] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::DefensiveError`] - Reward pool not found"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "* Member must have `existential deposit + amount` in account"] # [doc = "* Pool must be in [`PoolState::Open`] state"] join { # [codec (compact)] amount : :: core :: primitive :: u128 , pool_id : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "Bond additional funds into an existing pool position."] # [doc = ""] # [doc = "Additional funds can come from either free balance or accumulated rewards."] # [doc = "Automatically pays out all pending rewards."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Target pool ID"] # [doc = "* `extra` - Source and amount of additional funds"] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed"] # [doc = "* Must have permission to bond extra if not self"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks permission"] # [doc = "* [`Error::DefensiveError`] - Reward pool not found"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "* This transaction prioritizes readability and correctness over optimization"] # [doc = "* Multiple storage reads/writes are performed to reuse code"] # [doc = "* See `bond_extra_other` to bond pending rewards of other members"] bond_extra { pool_id : :: core :: primitive :: u32 , extra : runtime_types :: pallet_tangle_lst :: types :: BondExtra < :: core :: primitive :: u128 > , } , # [codec (index = 3)] # [doc = "Unbond points from a member's pool position, collecting any pending rewards."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `member_account` - Account to unbond from"] # [doc = "* `pool_id` - Target pool ID"] # [doc = "* `unbonding_points` - Amount of points to unbond"] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Permissionless if:"] # [doc = " - Pool is blocked and caller is root/bouncer (kick)"] # [doc = " - Pool is destroying and member is not depositor"] # [doc = " - Pool is destroying, member is depositor, and pool is empty"] # [doc = "* Permissioned (caller must be member) if:"] # [doc = " - Caller is not depositor"] # [doc = " - Caller is depositor, pool is destroying, and pool is empty"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NoBalanceToUnbond`] - Member has insufficient points"] # [doc = "* [`Error::DefensiveError`] - Not enough space in unbond pool"] # [doc = ""] # [doc = "# Note"] # [doc = "If no unlocking chunks are available, [`Call::pool_withdraw_unbonded`] can be called first."] # [doc = "The staking interface will attempt this automatically but may still return `NoMoreChunks`"] # [doc = "if chunks cannot be released."] unbond { member_account : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , # [codec (compact)] unbonding_points : :: core :: primitive :: u128 , } , # [codec (index = 4)] # [doc = "Withdraws unbonded funds from the pool's staking account."] # [doc = ""] # [doc = "Useful for clearing unlocking chunks when there are too many to call `unbond`."] # [doc = "Prevents `NoMoreChunks` errors from the staking system."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Can be signed by any account"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `num_slashing_spans` - Number of slashing spans to check"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NotDestroying`] - Pool is in destroying state"] pool_withdraw_unbonded { pool_id : :: core :: primitive :: u32 , num_slashing_spans : :: core :: primitive :: u32 , } , # [codec (index = 5)] # [doc = "Withdraw unbonded funds from a member account."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Permissionless if:"] # [doc = " - Pool is in destroy mode and target is not depositor"] # [doc = " - Target is depositor and only member in sub pools"] # [doc = " - Pool is blocked and caller is root/bouncer"] # [doc = "* Permissioned if caller is target and not depositor"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `member_account` - Account to withdraw from"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `num_slashing_spans` - Number of slashing spans"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolMemberNotFound`] - Member account not found"] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::SubPoolsNotFound`] - Sub pools not found"] # [doc = "* [`Error::CannotWithdrawAny`] - No unbonded funds available"] # [doc = ""] # [doc = "If target is depositor, pool will be destroyed."] withdraw_unbonded { member_account : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , num_slashing_spans : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "Create a new delegation pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed by the account that will become the initial depositor"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `amount` - Amount to delegate to the pool"] # [doc = "* `root` - Account to set as pool root"] # [doc = "* `nominator` - Account to set as pool nominator"] # [doc = "* `bouncer` - Account to set as pool bouncer"] # [doc = "* `name` - Optional pool name bounded by `T::MaxNameLength`"] # [doc = "* `icon` - Optional pool icon bounded by `T::MaxIconLength`"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::OverflowRisk`] - Pool ID increment would overflow"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "Caller must have `amount + existential_deposit` transferable funds."] create { # [codec (compact)] amount : :: core :: primitive :: u128 , root : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , nominator : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , bouncer : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , name : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , icon : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , } , # [codec (index = 7)] # [doc = "Create a new delegation pool with a previously used pool ID."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be signed by the account that will become the depositor"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `amount` - Amount to delegate to the pool"] # [doc = "* `root` - Account to set as pool root"] # [doc = "* `nominator` - Account to set as pool nominator"] # [doc = "* `bouncer` - Account to set as pool bouncer"] # [doc = "* `pool_id` - Pool ID to reuse"] # [doc = "* `name` - Optional pool name"] # [doc = "* `icon` - Optional pool icon"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolIdInUse`] - Pool ID is already in use"] # [doc = "* [`Error::InvalidPoolId`] - Pool ID is greater than last pool ID"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "Caller must have `amount + existential_deposit` transferable funds."] create_with_pool_id { # [codec (compact)] amount : :: core :: primitive :: u128 , root : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , nominator : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , bouncer : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , name : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , icon : :: core :: option :: Option < runtime_types :: bounded_collections :: bounded_vec :: BoundedVec < :: core :: primitive :: u8 > > , } , # [codec (index = 8)] # [doc = "Nominate validators on behalf of the pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Pool nominator or root role can nominate validators"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `validators` - List of validator accounts to nominate"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NotNominator`] - Caller lacks nominator permissions"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "Forwards nomination call to staking pallet using pool's bonded account."] nominate { pool_id : :: core :: primitive :: u32 , validators : :: subxt :: ext :: subxt_core :: alloc :: vec :: Vec < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , } , # [codec (index = 9)] # [doc = "Updates the state of a pool. Once a pool is in `Destroying` state, its state cannot be"] # [doc = "changed again under any circumstances."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Pool bouncer or root role can set any state"] # [doc = "* Any account can set state to `Destroying` if pool fails `ok_to_be_open` conditions"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `state` - New state to set"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::CanNotChangeState`] - Pool is in destroying state or caller lacks permissions"] # [doc = ""] # [doc = "# Note"] # [doc = ""] # [doc = "State changes are validated through `ok_to_be_open` which checks pool properties like"] # [doc = "commission, member count and roles."] set_state { pool_id : :: core :: primitive :: u32 , state : runtime_types :: pallet_tangle_lst :: types :: pools :: PoolState , } , # [codec (index = 10)] # [doc = "Updates the metadata for a given pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be called by the pool bouncer or root role"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `metadata` - New metadata to set"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::MetadataExceedsMaxLen`] - Metadata length exceeds maximum allowed"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks required permissions"] set_metadata { pool_id : :: core :: primitive :: u32 , metadata : :: subxt :: ext :: subxt_core :: alloc :: vec :: Vec < :: core :: primitive :: u8 > , } , # [codec (index = 11)] # [doc = "Updates the global configuration parameters for nomination pools."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Must be called by Root"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `min_join_bond` - Config operation for minimum bond to join a pool"] # [doc = "* `min_create_bond` - Config operation for minimum bond to create a pool "] # [doc = "* `max_pools` - Config operation for maximum number of pools"] # [doc = "* `global_max_commission` - Config operation for maximum global commission"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`DispatchError::BadOrigin`] - Caller is not Root"] set_configs { min_join_bond : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: core :: primitive :: u128 > , min_create_bond : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: core :: primitive :: u128 > , max_pools : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: core :: primitive :: u32 > , global_max_commission : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < runtime_types :: sp_arithmetic :: per_things :: Perbill > , } , # [codec (index = 12)] # [doc = "Update the roles of a pool."] # [doc = ""] # [doc = "Updates root, nominator and bouncer roles for a given pool. The depositor role cannot be changed."] # [doc = "Emits a `RolesUpdated` event on successful update."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Origin must be Root or pool root"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - Origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `new_root` - New root role configuration"] # [doc = "* `new_nominator` - New nominator role configuration "] # [doc = "* `new_bouncer` - New bouncer role configuration"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Origin does not have permission"] update_roles { pool_id : :: core :: primitive :: u32 , new_root : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , new_nominator : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , new_bouncer : runtime_types :: pallet_tangle_lst :: types :: ConfigOp < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , } , # [codec (index = 13)] # [doc = "Chill on behalf of the pool by forwarding the call to the staking pallet."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Origin must be signed by pool nominator or root role"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `pool_id` - Pool identifier"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::NotNominator`] - Origin lacks nomination permission"] chill { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 14)] # [doc = "Bond additional funds for a pool member into their respective pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Origin must match member account for bonding from free balance/pending rewards"] # [doc = "* Any origin can bond from pending rewards if member has `PermissionlessAll` or"] # [doc = " `PermissionlessCompound` claim permissions"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `member` - Pool member account to bond for"] # [doc = "* `pool_id` - Pool identifier"] # [doc = "* `extra` - Amount to bond from free balance or pending rewards"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - Pool does not exist"] # [doc = "* [`Error::PoolMemberNotFound`] - Account is not a member of pool"] # [doc = "* [`Error::NoPermission`] - Origin lacks permission to bond for member"] bond_extra_other { member : :: subxt :: ext :: subxt_core :: utils :: MultiAddress < :: subxt :: ext :: subxt_core :: utils :: AccountId32 , :: core :: primitive :: u32 > , pool_id : :: core :: primitive :: u32 , extra : runtime_types :: pallet_tangle_lst :: types :: BondExtra < :: core :: primitive :: u128 > , } , # [codec (index = 17)] # [doc = "Set or remove the commission rate and payee for a pool."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Caller must have commission management permission for the pool"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `pool_id` - The pool identifier"] # [doc = "* `new_commission` - Optional commission rate and payee. None removes existing commission"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - The pool_id does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks commission management permission"] set_commission { pool_id : :: core :: primitive :: u32 , new_commission : :: core :: option :: Option < (runtime_types :: sp_arithmetic :: per_things :: Perbill , :: subxt :: ext :: subxt_core :: utils :: AccountId32 ,) > , } , # [codec (index = 18)] # [doc = "Set the maximum commission rate for a pool. Initial max can be set to any value, with only"] # [doc = "lower values allowed thereafter. Current commission will be reduced if above new max."] # [doc = ""] # [doc = "# Permissions"] # [doc = ""] # [doc = "* Caller must have commission management permission for the pool"] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call"] # [doc = "* `pool_id` - The pool identifier"] # [doc = "* `max_commission` - The new maximum commission rate"] # [doc = ""] # [doc = "# Errors"] # [doc = ""] # [doc = "* [`Error::PoolNotFound`] - The pool_id does not exist"] # [doc = "* [`Error::DoesNotHavePermission`] - Caller lacks commission management permission"] set_commission_max { pool_id : :: core :: primitive :: u32 , max_commission : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 19)] # [doc = "Set the commission change rate for a pool."] # [doc = ""] # [doc = "Initial change rate is not bounded, whereas subsequent updates can only be more"] # [doc = "restrictive than the current."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed by an account with commission management permission."] # [doc = "* `pool_id` - The identifier of the pool to set commission change rate for."] # [doc = "* `change_rate` - The new commission change rate configuration."] set_commission_change_rate { pool_id : :: core :: primitive :: u32 , change_rate : runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionChangeRate < :: core :: primitive :: u64 > , } , # [codec (index = 20)] # [doc = "Claim pending commission for a pool."] # [doc = ""] # [doc = "The dispatch origin of this call must be signed by an account with commission claim permission."] # [doc = "Pending commission is paid out and added to total claimed commission. Total pending commission"] # [doc = "is reset to zero."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed by an account with commission claim permission."] # [doc = "* `pool_id` - The identifier of the pool to claim commission from."] claim_commission { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 21)] # [doc = "Top up the deficit or withdraw the excess ED from the pool."] # [doc = ""] # [doc = "When a pool is created, the pool depositor transfers ED to the reward account of the"] # [doc = "pool. ED is subject to change and over time, the deposit in the reward account may be"] # [doc = "insufficient to cover the ED deficit of the pool or vice-versa where there is excess"] # [doc = "deposit to the pool. This call allows anyone to adjust the ED deposit of the"] # [doc = "pool by either topping up the deficit or claiming the excess."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed."] # [doc = "* `pool_id` - The identifier of the pool to adjust the deposit for."] adjust_pool_deposit { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 22)] # [doc = "Set or remove a pool's commission claim permission."] # [doc = ""] # [doc = "Only the `Root` role of the pool is able to configure commission claim permissions."] # [doc = "This determines which accounts are allowed to claim the pool's pending commission."] # [doc = ""] # [doc = "# Arguments"] # [doc = ""] # [doc = "* `origin` - The origin of the call. Must be signed by the pool's root account."] # [doc = "* `pool_id` - The identifier of the pool to set permissions for."] # [doc = "* `permission` - Optional commission claim permission configuration. If None, removes any existing permission."] set_commission_claim_permission { pool_id : :: core :: primitive :: u32 , permission : :: core :: option :: Option < runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionClaimPermission < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > > , } , # [codec (index = 23)] set_last_pool_id { pool_id : :: core :: primitive :: u32 , } , } #[derive( :: subxt :: ext :: subxt_core :: ext :: codec :: Decode, :: subxt :: ext :: subxt_core :: ext :: codec :: Encode, @@ -66793,7 +66941,7 @@ pub mod api { )] #[doc = "Events of this pallet."] pub enum Event { - # [codec (index = 0)] # [doc = "A pool has been created."] Created { depositor : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "A member has become bonded in a pool."] Bonded { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , bonded : :: core :: primitive :: u128 , joined : :: core :: primitive :: bool , } , # [codec (index = 2)] # [doc = "A payout has been made to a member."] PaidOut { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , payout : :: core :: primitive :: u128 , } , # [codec (index = 3)] # [doc = "A member has unbonded from their pool."] # [doc = ""] # [doc = "- `balance` is the corresponding balance of the number of points that has been"] # [doc = " requested to be unbonded (the argument of the `unbond` transaction) from the bonded"] # [doc = " pool."] # [doc = "- `points` is the number of points that are issued as a result of `balance` being"] # [doc = " dissolved into the corresponding unbonding pool."] # [doc = "- `era` is the era in which the balance will be unbonded."] # [doc = "In the absence of slashing, these values will match. In the presence of slashing, the"] # [doc = "number of points that are issued in the unbonding pool will be less than the amount"] # [doc = "requested to be unbonded."] Unbonded { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , points : :: core :: primitive :: u128 , era : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "A member has withdrawn from their pool."] # [doc = ""] # [doc = "The given number of `points` have been dissolved in return for `balance`."] # [doc = ""] # [doc = "Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance"] # [doc = "will be 1."] Withdrawn { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , points : :: core :: primitive :: u128 , } , # [codec (index = 5)] # [doc = "A pool has been destroyed."] Destroyed { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "The state of a pool has changed"] StateChanged { pool_id : :: core :: primitive :: u32 , new_state : runtime_types :: pallet_tangle_lst :: types :: pools :: PoolState , } , # [codec (index = 7)] # [doc = "A member has been removed from a pool."] # [doc = ""] # [doc = "The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked)."] MemberRemoved { pool_id : :: core :: primitive :: u32 , member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , } , # [codec (index = 8)] # [doc = "The roles of a pool have been updated to the given new roles. Note that the depositor"] # [doc = "can never change."] RolesUpdated { root : :: core :: option :: Option < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , bouncer : :: core :: option :: Option < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , nominator : :: core :: option :: Option < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , } , # [codec (index = 9)] # [doc = "The active balance of pool `pool_id` has been slashed to `balance`."] PoolSlashed { pool_id : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , } , # [codec (index = 10)] # [doc = "The unbond pool at `era` of pool `pool_id` has been slashed to `balance`."] UnbondingPoolSlashed { pool_id : :: core :: primitive :: u32 , era : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , } , # [codec (index = 11)] # [doc = "A pool's commission setting has been changed."] PoolCommissionUpdated { pool_id : :: core :: primitive :: u32 , current : :: core :: option :: Option < (runtime_types :: sp_arithmetic :: per_things :: Perbill , :: subxt :: ext :: subxt_core :: utils :: AccountId32 ,) > , } , # [codec (index = 12)] # [doc = "A pool's maximum commission setting has been changed."] PoolMaxCommissionUpdated { pool_id : :: core :: primitive :: u32 , max_commission : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 13)] # [doc = "A pool's commission `change_rate` has been changed."] PoolCommissionChangeRateUpdated { pool_id : :: core :: primitive :: u32 , change_rate : runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionChangeRate < :: core :: primitive :: u64 > , } , # [codec (index = 14)] # [doc = "Pool commission claim permission has been updated."] PoolCommissionClaimPermissionUpdated { pool_id : :: core :: primitive :: u32 , permission : :: core :: option :: Option < runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionClaimPermission < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > > , } , # [codec (index = 15)] # [doc = "Pool commission has been claimed."] PoolCommissionClaimed { pool_id : :: core :: primitive :: u32 , commission : :: core :: primitive :: u128 , } , # [codec (index = 16)] # [doc = "Topped up deficit in frozen ED of the reward pool."] MinBalanceDeficitAdjusted { pool_id : :: core :: primitive :: u32 , amount : :: core :: primitive :: u128 , } , # [codec (index = 17)] # [doc = "Claimed excess frozen ED of the reward pool."] MinBalanceExcessAdjusted { pool_id : :: core :: primitive :: u32 , amount : :: core :: primitive :: u128 , } , } + # [codec (index = 0)] # [doc = "A pool has been created."] Created { depositor : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , } , # [codec (index = 1)] # [doc = "A member has become bonded in a pool."] Bonded { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , bonded : :: core :: primitive :: u128 , joined : :: core :: primitive :: bool , } , # [codec (index = 2)] # [doc = "A payout has been made to a member."] PaidOut { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , payout : :: core :: primitive :: u128 , } , # [codec (index = 3)] # [doc = "A member has unbonded from their pool."] # [doc = ""] # [doc = "- `balance` is the corresponding balance of the number of points that has been"] # [doc = " requested to be unbonded (the argument of the `unbond` transaction) from the bonded"] # [doc = " pool."] # [doc = "- `points` is the number of points that are issued as a result of `balance` being"] # [doc = " dissolved into the corresponding unbonding pool."] # [doc = "- `era` is the era in which the balance will be unbonded."] # [doc = "In the absence of slashing, these values will match. In the presence of slashing, the"] # [doc = "number of points that are issued in the unbonding pool will be less than the amount"] # [doc = "requested to be unbonded."] Unbonded { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , points : :: core :: primitive :: u128 , era : :: core :: primitive :: u32 , } , # [codec (index = 4)] # [doc = "A member has withdrawn from their pool."] # [doc = ""] # [doc = "The given number of `points` have been dissolved in return for `balance`."] # [doc = ""] # [doc = "Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance"] # [doc = "will be 1."] Withdrawn { member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , pool_id : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , points : :: core :: primitive :: u128 , } , # [codec (index = 5)] # [doc = "A pool has been destroyed."] Destroyed { pool_id : :: core :: primitive :: u32 , } , # [codec (index = 6)] # [doc = "The state of a pool has changed"] StateChanged { pool_id : :: core :: primitive :: u32 , new_state : runtime_types :: pallet_tangle_lst :: types :: pools :: PoolState , } , # [codec (index = 7)] # [doc = "A member has been removed from a pool."] # [doc = ""] # [doc = "The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked)."] MemberRemoved { pool_id : :: core :: primitive :: u32 , member : :: subxt :: ext :: subxt_core :: utils :: AccountId32 , } , # [codec (index = 8)] # [doc = "The roles of a pool have been updated to the given new roles. Note that the depositor"] # [doc = "can never change."] RolesUpdated { root : :: core :: option :: Option < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , bouncer : :: core :: option :: Option < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , nominator : :: core :: option :: Option < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > , } , # [codec (index = 9)] # [doc = "The active balance of pool `pool_id` has been slashed to `balance`."] PoolSlashed { pool_id : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , } , # [codec (index = 10)] # [doc = "The unbond pool at `era` of pool `pool_id` has been slashed to `balance`."] UnbondingPoolSlashed { pool_id : :: core :: primitive :: u32 , era : :: core :: primitive :: u32 , balance : :: core :: primitive :: u128 , } , # [codec (index = 11)] # [doc = "A pool's commission setting has been changed."] PoolCommissionUpdated { pool_id : :: core :: primitive :: u32 , current : :: core :: option :: Option < (runtime_types :: sp_arithmetic :: per_things :: Perbill , :: subxt :: ext :: subxt_core :: utils :: AccountId32 ,) > , } , # [codec (index = 12)] # [doc = "A pool's maximum commission setting has been changed."] PoolMaxCommissionUpdated { pool_id : :: core :: primitive :: u32 , max_commission : runtime_types :: sp_arithmetic :: per_things :: Perbill , } , # [codec (index = 13)] # [doc = "A pool's commission `change_rate` has been changed."] PoolCommissionChangeRateUpdated { pool_id : :: core :: primitive :: u32 , change_rate : runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionChangeRate < :: core :: primitive :: u64 > , } , # [codec (index = 14)] # [doc = "Pool commission claim permission has been updated."] PoolCommissionClaimPermissionUpdated { pool_id : :: core :: primitive :: u32 , permission : :: core :: option :: Option < runtime_types :: pallet_tangle_lst :: types :: commission :: CommissionClaimPermission < :: subxt :: ext :: subxt_core :: utils :: AccountId32 > > , } , # [codec (index = 15)] # [doc = "Pool commission has been claimed."] PoolCommissionClaimed { pool_id : :: core :: primitive :: u32 , commission : :: core :: primitive :: u128 , } , # [codec (index = 16)] # [doc = "Topped up deficit in frozen ED of the reward pool."] MinBalanceDeficitAdjusted { pool_id : :: core :: primitive :: u32 , amount : :: core :: primitive :: u128 , } , # [codec (index = 17)] # [doc = "Claimed excess frozen ED of the reward pool."] MinBalanceExcessAdjusted { pool_id : :: core :: primitive :: u32 , amount : :: core :: primitive :: u128 , } , # [codec (index = 18)] # [doc = "The last PoolId is updated"] LastPoolIdUpdated { pool_id : :: core :: primitive :: u32 , } , } #[derive( :: subxt :: ext :: subxt_core :: ext :: codec :: Decode, :: subxt :: ext :: subxt_core :: ext :: codec :: Encode,