Repository: boundless-xyz/boundless
Pull request #673: BM-960: Test deployment
Author: login: capossele
Created: 2025-05-21T16:32:31Z | Merged: 2025-05-29T22:13:55Z

- Switch `burn` for `transfer` to `0xdEaD` (the address `0x0` is not allowed to be used with the ERC20 from Openzeppelin)
- Fix `permit`
- Fix `boundless_cli` to work with both HP and USDC as stake token

Closes BM-974
Closes BM-989


Diff:
diff --git a/contracts/deployment.toml b/contracts/deployment.toml
index 8cbeb8d67f..ecd874fc97 100644
--- a/contracts/deployment.toml
+++ b/contracts/deployment.toml
@@ -13,9 +13,9 @@ boundless-market = "0x0000000000000000000000000000000000000000"
 stake-token = "0x0000000000000000000000000000000000000000"
 
 # Guests info
-deployment-commit = "04ee417aa0cac149a0962125e44e899acb3122f4" # v0.7.0
-assessor-image-id = "0x9b914519efb6109de0507a63d5f32e8695bbe0efda1ec152df6fde5eb030a73b"
-assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeif5523ugt54zotjpiqhaeiu4fhz2wrvcwa7m35vqmqahnhjxsvrky"
+deployment-commit = "918934a418b00cce8524caf7a061e058cc945451" # v0.10.0 main
+assessor-image-id = "0xff686da102e474eb25c50f5f7446d832a22e06da99dc692fd2fa94eea56040a9"
+assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeieou3q7djwsatlqnuerppne7ppprzvhwm7eggnzrayrznhrq6bvcm"
 
 ###
 
@@ -46,19 +46,65 @@ assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeif5523ugt54zotjpiq
 name = "Ethereum Sepolia [staging]"
 id = 11155111
 etherscan-url = "https://sepolia.etherscan.io/"
-version = "v0.7.0"
+version = "v0.10.0"
 
 # Accounts
 admin = "0x0466ACfc0F27bBA9fBB7A8508f576527e81E83Bd"
 
 # Contracts
 verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187"
-set-verifier = "0xad2c6335191EA71Ffe2045A8d54b93A851ceca77"
-# deployed at block 8038641
-boundless-market = "0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16"
-stake-token = "0xe5321cF13B07Bf6f6dD621E85E45C8e28adedCc9"
+set-verifier = "0x7aAB646f23D1392d4522CFaB0b7FB5eaf6821d64"
+# deployed at block 8430932
+boundless-market = "0x7b36Ed56ec6045679C178205a81AE878d85B773d"
+stake-token = "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238"
 
 # Guests info
-deployment-commit = "04ee417aa0cac149a0962125e44e899acb3122f4" # v0.7.0
+deployment-commit = "918934a418b00cce8524caf7a061e058cc945451" # v0.10.0 main
+assessor-image-id = "0xff686da102e474eb25c50f5f7446d832a22e06da99dc692fd2fa94eea56040a9"
+assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeieou3q7djwsatlqnuerppne7ppprzvhwm7eggnzrayrznhrq6bvcm"
+
+###
+
+[chains.base-mainnet]
+name = "Base Mainnet"
+id = 8453
+etherscan-url = "https://basescan.org/"
+version = "v0.9.0-rc.1"
+
+# Accounts
+admin = "0x0466ACfc0F27bBA9fBB7A8508f576527e81E83Bd"
+
+# Contracts
+verifier = "0x95345209e34a7043ac5D92e82a35b63FFa088A20"
+set-verifier = "0xa8DB64c92c5E113984C790dDA91789132114BAda"
+# deployed at block 
+boundless-market = "0x581C7e8018f0888364c698f97F64eB069723131F"
+stake-token = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
+
+# Guests info
+deployment-commit = "435e8c40aa832f2bac98ba54a809431e9f120ea7" # v0.9.0 main
 assessor-image-id = "0x9b914519efb6109de0507a63d5f32e8695bbe0efda1ec152df6fde5eb030a73b"
-assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeif5523ugt54zotjpiqhaeiu4fhz2wrvcwa7m35vqmqahnhjxsvrky"
\ No newline at end of file
+assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeif5523ugt54zotjpiqhaeiu4fhz2wrvcwa7m35vqmqahnhjxsvrky"
+
+###
+
+[chains.base-sepolia]
+name = "Base Sepolia"
+id = 84532
+etherscan-url = "https://sepolia.basescan.org/"
+version = "v0.10.0"
+
+# Accounts
+admin = "0x0466ACfc0F27bBA9fBB7A8508f576527e81E83Bd"
+
+# Contracts
+verifier = "0x0b144e07a0826182b6b59788c34b32bfa86fb711"
+set-verifier = "0x8C5a8b5cC272Fe2b74D18843CF9C3aCBc952a760"
+# deployed at block 26370829
+boundless-market = "0xAD0Bd6C436658aF457736d7224a87d2EF56365C8"
+stake-token = "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
+
+# Guests info
+deployment-commit = "918934a418b00cce8524caf7a061e058cc945451" # v0.10.0 main
+assessor-image-id = "0xff686da102e474eb25c50f5f7446d832a22e06da99dc692fd2fa94eea56040a9"
+assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeieou3q7djwsatlqnuerppne7ppprzvhwm7eggnzrayrznhrq6bvcm"
\ No newline at end of file
diff --git a/contracts/scripts/Manage.s.sol b/contracts/scripts/Manage.s.sol
index 1fd689e54d..aaf4a248aa 100644
--- a/contracts/scripts/Manage.s.sol
+++ b/contracts/scripts/Manage.s.sol
@@ -17,7 +17,6 @@ import {ConfigLoader, DeploymentConfig, ConfigParser} from "./Config.s.sol";
 import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
 import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";
 import {Options as UpgradeOptions} from "openzeppelin-foundry-upgrades/Options.sol";
-import {HitPoints} from "../src/HitPoints.sol";
 
 /// @notice Base contract for the scripts below, providing common context and functions.
 contract RiscZeroManagementScript is Script {
@@ -36,28 +35,6 @@ contract RiscZeroManagementScript is Script {
     }
 }
 
-/// @notice Deployment script for the HitPoints deployment.
-/// @dev Use the following environment variable to control the deployment:
-///     * BOUNDLESS_MARKET_OWNER owner of the HitPoints contract
-///
-/// See the Foundry documentation for more information about Solidity scripts.
-/// https://book.getfoundry.sh/tutorials/solidity-scripting
-contract DeployHitPoints is RiscZeroManagementScript {
-    function run() external {
-        address marketOwner = vm.envAddress("BOUNDLESS_MARKET_OWNER");
-        console2.log("marketOwner:", marketOwner);
-
-        vm.startBroadcast(deployerAddress());
-        bytes32 salt = bytes32(0);
-        // Deploy the HitPoints contract
-        address stakeTokenAddress = address(new HitPoints{salt: salt}(marketOwner));
-        HitPoints(stakeTokenAddress).grantMinterRole(marketOwner);
-        vm.stopBroadcast();
-
-        console2.log("Deployed stake-token contract (HitPoints) at %s", stakeTokenAddress);
-    }
-}
-
 /// @notice Deployment script for the market deployment.
 /// @dev Use the following environment variable to control the deployment:
 ///     * BOUNDLESS_MARKET_OWNER owner of the BoundlessMarket contract
@@ -97,9 +74,6 @@ contract DeployBoundlessMarket is RiscZeroManagementScript {
             )
         );
 
-        // Add the market address in the authorized list of the stake-token contract
-        HitPoints(stakeToken).grantAuthorizedTransferRole(marketAddress);
-
         vm.stopBroadcast();
 
         console2.log("Deployed BoundlessMarket proxy contract at %s", marketAddress);
diff --git a/contracts/snapshots/BoundlessMarketBasicTest.json b/contracts/snapshots/BoundlessMarketBasicTest.json
index 50e1ba8352..9878a30c8c 100644
--- a/contracts/snapshots/BoundlessMarketBasicTest.json
+++ b/contracts/snapshots/BoundlessMarketBasicTest.json
@@ -1,13 +1,13 @@
 {
   "ERC20 approve: required for depositStake": "45966",
-  "bytecode size implementation": "23771",
+  "bytecode size implementation": "23783",
   "bytecode size proxy": "89",
   "deposit: first ever deposit": "50920",
   "deposit: second deposit": "33820",
-  "depositStake: 1 HP (tops up market account)": "59488",
-  "depositStake: full (drains testProver account)": "49888",
-  "depositStakeWithPermit: 1 HP (tops up market account)": "72377",
-  "depositStakeWithPermit: full (drains testProver account)": "72368",
+  "depositStake: 1 HP (tops up market account)": "59400",
+  "depositStake: full (drains testProver account)": "49800",
+  "depositStakeWithPermit: 1 HP (tops up market account)": "72272",
+  "depositStakeWithPermit: full (drains testProver account)": "72262",
   "fulfill: a batch of 8": "381426",
   "fulfill: a locked request": "87678",
   "fulfill: a locked request (locked via prover signature)": "87678",
@@ -24,8 +24,8 @@
   "priceAndFulfill: a single request that was not locked": "108206",
   "priceAndFulfill: a single request that was not locked fulfilled by prover not in allow-list": "108206",
   "priceAndFulfill: fulfill already fulfilled was locked request": "101922",
-  "slash: base case": "81430",
-  "slash: fulfilled request after lock deadline": "62995",
+  "slash: base case": "99082",
+  "slash: fulfilled request after lock deadline": "80647",
   "submitRequest: with maxPrice ether": "51904",
   "submitRequest: without ether": "45061",
   "submitRootAndFulfill: a batch of 2 requests": "163312",
@@ -37,6 +37,6 @@
   "submitRootAndPriceAndFulfill: a single request that was not locked fulfilled by prover not in allow-list": "140556",
   "withdraw: 1 ether": "40314",
   "withdraw: full balance": "40326",
-  "withdrawStake: 1 HP balance": "68819",
-  "withdrawStake: full balance": "51815"
+  "withdrawStake: 1 HP balance": "68743",
+  "withdrawStake: full balance": "51739"
 }
\ No newline at end of file
diff --git a/contracts/src/BoundlessMarket.sol b/contracts/src/BoundlessMarket.sol
index eaf8853263..b12dbeb4e0 100644
--- a/contracts/src/BoundlessMarket.sol
+++ b/contracts/src/BoundlessMarket.sol
@@ -12,7 +12,6 @@ import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/acces
 import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
 import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
 import {ERC20} from "solmate/tokens/ERC20.sol";
-import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
 import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";
 import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";
 import {IRiscZeroVerifier, Receipt, ReceiptClaim, ReceiptClaimLib} from "risc0/IRiscZeroVerifier.sol";
@@ -699,7 +698,8 @@ contract BoundlessMarket is
             accounts[client].balance += lock.price;
         }
 
-        ERC20Burnable(STAKE_TOKEN_CONTRACT).burn(burnValue);
+        ERC20(STAKE_TOKEN_CONTRACT).transfer(address(0xdEaD), burnValue);
+        (burnValue);
         emit ProverSlashed(requestId, burnValue, transferValue, stakeRecipient);
     }
 
diff --git a/contracts/src/HitPoints.sol b/contracts/src/HitPoints.sol
index ea79fba3ab..4b9ddec94b 100644
--- a/contracts/src/HitPoints.sol
+++ b/contracts/src/HitPoints.sol
@@ -16,7 +16,6 @@ pragma solidity ^0.8.20;
 
 import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
 import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
-import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
 import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
 import "@openzeppelin/contracts/access/Ownable.sol";
 
@@ -24,7 +23,7 @@ import "./IHitPoints.sol";
 
 /// @title HitPoints ERC20
 /// @notice Implementation of a restricted transfer token using ERC20
-contract HitPoints is ERC20, ERC20Burnable, ERC20Permit, IHitPoints, AccessControl, Ownable {
+contract HitPoints is ERC20, ERC20Permit, IHitPoints, AccessControl, Ownable {
     // Maximum allowed balance (uint96 max value)
     uint256 constant MAX_BALANCE = type(uint96).max;
     // Role identifier for minting operation
diff --git a/contracts/test/BoundlessMarket.t.sol b/contracts/test/BoundlessMarket.t.sol
index 42919fa105..0dca7671c4 100644
--- a/contracts/test/BoundlessMarket.t.sol
+++ b/contracts/test/BoundlessMarket.t.sol
@@ -2877,9 +2877,9 @@ contract BoundlessMarketBasicTest is BoundlessMarketTest {
         snapshotMarketStakeTreasuryBalance();
 
         // Slash the request
-        // Burning = sending tokens to address 0, expect a transfer event to be emitted to address 0
+        // Burning = sending tokens to address 0xdEaD, expect a transfer event to be emitted to address 0xdEaD
         vm.expectEmit(true, true, true, false);
-        emit IERC20.Transfer(address(proxy), address(0x0), request.offer.lockStake);
+        emit IERC20.Transfer(address(proxy), address(0xdEaD), request.offer.lockStake);
         vm.expectEmit(true, true, true, true);
         emit IBoundlessMarket.ProverSlashed(
             request.id,
@@ -3102,9 +3102,9 @@ contract BoundlessMarketBasicTest is BoundlessMarketTest {
         otherProver.snapshotStakeBalance();
 
         // We expect the prover that ultimately fulfilled the request to receive stake.
-        // Burning = sending tokens to address 0, expect a transfer event to be emitted to address 0
+        // Burning = sending tokens to address 0xdEaD, expect a transfer event to be emitted to address 0xdEaD
         vm.expectEmit(true, true, true, false);
-        emit IERC20.Transfer(address(proxy), address(0x0), request.offer.lockStake);
+        emit IERC20.Transfer(address(proxy), address(0xdEaD), request.offer.lockStake);
         vm.expectEmit(true, true, true, true);
         emit IBoundlessMarket.ProverSlashed(
             request.id,
@@ -3133,9 +3133,9 @@ contract BoundlessMarketBasicTest is BoundlessMarketTest {
         vm.warp(request.offer.deadline() + 1);
 
         // We expect the prover that ultimately fulfilled the request to receive stake.
-        // Burning = sending tokens to address 0, expect a transfer event to be emitted to address 0
+        // Burning = sending tokens to address 0xdEaD, expect a transfer event to be emitted to address 0xdEaD
         vm.expectEmit(true, true, true, false);
-        emit IERC20.Transfer(address(proxy), address(0x0), request.offer.lockStake);
+        emit IERC20.Transfer(address(proxy), address(0xdEaD), request.offer.lockStake);
         vm.expectEmit(true, true, true, true);
         emit IBoundlessMarket.ProverSlashed(
             request.id,
diff --git a/crates/boundless-cli/src/bin/boundless-cli.rs b/crates/boundless-cli/src/bin/boundless-cli.rs
index 18fa3283a7..d89f1959ad 100644
--- a/crates/boundless-cli/src/bin/boundless-cli.rs
+++ b/crates/boundless-cli/src/bin/boundless-cli.rs
@@ -46,7 +46,7 @@ use std::{
 use alloy::{
     network::Ethereum,
     primitives::{
-        utils::{format_ether, parse_ether},
+        utils::{format_ether, format_units, parse_ether, parse_units},
         Address, Bytes, FixedBytes, TxKind, B256, U256,
     },
     providers::{network::EthereumWallet, Provider, ProviderBuilder},
@@ -137,19 +137,13 @@ enum AccountCommands {
     },
     /// Deposit stake funds into the market
     DepositStake {
-        /// Amount in HP to deposit.
-        ///
-        /// e.g. 10 is uint256(10 * 10**18).
-        #[clap(value_parser = parse_ether)]
-        amount: U256,
+        /// Amount to deposit in HP or USDC based on the chain ID.
+        amount: String,
     },
     /// Withdraw stake funds from the market
     WithdrawStake {
-        /// Amount in HP to withdraw.
-        ///
-        /// e.g. 10 is uint256(10 * 10**18).
-        #[clap(value_parser = parse_ether)]
-        amount: U256,
+        /// Amount to withdraw in HP or USDC based on the chain ID.
+        amount: String,
     },
     /// Check the stake balance of an account in the market
     StakeBalance {
@@ -522,10 +516,19 @@ async fn handle_account_command(
             Ok(())
         }
         AccountCommands::DepositStake { amount } => {
-            tracing::info!("Depositing {} HP as stake", format_ether(*amount));
-            match client.boundless_market.deposit_stake_with_permit(*amount, &private_key).await {
+            let symbol = client.boundless_market.stake_token_symbol().await?;
+            let decimals = client.boundless_market.stake_token_decimals().await?;
+            let parsed_amount = parse_units(amount, decimals)
+                .map_err(|e| anyhow!("Failed to parse amount: {}", e))?
+                .into();
+            tracing::info!("Depositing {amount} {symbol} as stake");
+            match client
+                .boundless_market
+                .deposit_stake_with_permit(parsed_amount, &private_key)
+                .await
+            {
                 Ok(_) => {
-                    tracing::info!("Successfully deposited {} HP as stake", format_ether(*amount));
+                    tracing::info!("Successfully deposited {amount} {symbol} as stake");
                     Ok(())
                 }
                 Err(e) => {
@@ -541,16 +544,25 @@ async fn handle_account_command(
             }
         }
         AccountCommands::WithdrawStake { amount } => {
-            tracing::info!("Withdrawing {} HP from stake", format_ether(*amount));
-            client.boundless_market.withdraw_stake(*amount).await?;
-            tracing::info!("Successfully withdrew {} HP from stake", format_ether(*amount));
+            let symbol = client.boundless_market.stake_token_symbol().await?;
+            let decimals = client.boundless_market.stake_token_decimals().await?;
+            let parsed_amount = parse_units(amount, decimals)
+                .map_err(|e| anyhow!("Failed to parse amount: {}", e))?
+                .into();
+            tracing::info!("Withdrawing {amount} {symbol} from stake");
+            client.boundless_market.withdraw_stake(parsed_amount).await?;
+            tracing::info!("Successfully withdrew {amount} {symbol} from stake");
             Ok(())
         }
         AccountCommands::StakeBalance { address } => {
+            let symbol = client.boundless_market.stake_token_symbol().await?;
+            let decimals = client.boundless_market.stake_token_decimals().await?;
             let addr = address.unwrap_or(client.boundless_market.caller());
             tracing::info!("Checking stake balance for address {}", addr);
             let balance = client.boundless_market.balance_of_stake(addr).await?;
-            tracing::info!("Stake balance for address {}: {} HP", addr, format_ether(balance));
+            let balance = format_units(balance, decimals)
+                .map_err(|e| anyhow!("Failed to format stake balance: {}", e))?;
+            tracing::info!("Stake balance for address {}: {} {}", addr, balance, symbol);
             Ok(())
         }
     }
@@ -1328,7 +1340,7 @@ async fn handle_config_command(args: &MainArgs) -> Result<()> {
         };
     } else {
         // Verifier router is recommended, but not required for most operations.
-        println!("⚠️Verifier router address not configured");
+        println!("⚠️ Verifier router address not configured");
     }
 
     println!(
@@ -1550,18 +1562,18 @@ mod tests {
         let mut args = MainArgs {
             config,
             command: Command::Account(Box::new(AccountCommands::DepositStake {
-                amount: default_allowance(),
+                amount: format_ether(default_allowance()),
             })),
         };
 
         run(&args).await.unwrap();
         assert!(logs_contain(&format!(
             "Depositing {} HP as stake",
-            format_units(default_allowance(), "ether").unwrap()
+            format_ether(default_allowance())
         )));
         assert!(logs_contain(&format!(
             "Successfully deposited {} HP as stake",
-            format_units(default_allowance(), "ether").unwrap()
+            format_ether(default_allowance())
         )));
 
         let balance =
@@ -1583,17 +1595,17 @@ mod tests {
         )));
 
         args.command = Command::Account(Box::new(AccountCommands::WithdrawStake {
-            amount: default_allowance(),
+            amount: format_ether(default_allowance()),
         }));
 
         run(&args).await.unwrap();
         assert!(logs_contain(&format!(
             "Withdrawing {} HP from stake",
-            format_units(default_allowance(), "ether").unwrap()
+            format_ether(default_allowance())
         )));
         assert!(logs_contain(&format!(
             "Successfully withdrew {} HP from stake",
-            format_units(default_allowance(), "ether").unwrap()
+            format_ether(default_allowance())
         )));
 
         let balance =
@@ -1609,7 +1621,7 @@ mod tests {
         let mut args = MainArgs {
             config,
             command: Command::Account(Box::new(AccountCommands::DepositStake {
-                amount: default_allowance(),
+                amount: format_ether(default_allowance()),
             })),
         };
 
@@ -1620,7 +1632,7 @@ mod tests {
         )));
 
         args.command = Command::Account(Box::new(AccountCommands::WithdrawStake {
-            amount: default_allowance(),
+            amount: format_ether(default_allowance()),
         }));
 
         let err = run(&args).await.unwrap_err();
diff --git a/crates/boundless-market/src/contracts/boundless_market.rs b/crates/boundless-market/src/contracts/boundless_market.rs
index dbffdf22c0..50e0c6520a 100644
--- a/crates/boundless-market/src/contracts/boundless_market.rs
+++ b/crates/boundless-market/src/contracts/boundless_market.rs
@@ -1282,8 +1282,8 @@ impl<P: Provider> BoundlessMarketService<P> {
             deadline,
         };
         tracing::debug!("Permit: {:?}", permit);
-        let chain_id = self.get_chain_id().await?;
-        let sig = permit.sign(signer, token_address.into(), chain_id).await?.as_bytes();
+        let domain_separator = contract.DOMAIN_SEPARATOR().call().await?;
+        let sig = permit.sign(signer, domain_separator).await?.as_bytes();
         let r = B256::from_slice(&sig[..32]);
         let s = B256::from_slice(&sig[32..64]);
         let v: u8 = sig[64];
@@ -1344,6 +1344,35 @@ impl<P: Provider> BoundlessMarketService<P> {
         }
         Ok(())
     }
+
+    /// Returns the stake token address used by the market.
+    pub async fn stake_token_address(&self) -> Result<Address, MarketError> {
+        tracing::trace!("Calling STAKE_TOKEN_CONTRACT()");
+        let address = self
+            .instance
+            .STAKE_TOKEN_CONTRACT()
+            .call()
+            .await
+            .context("STAKE_TOKEN_CONTRACT call failed")?
+            .0;
+        Ok(address.into())
+    }
+
+    /// Returns the stake token's symbol.
+    pub async fn stake_token_symbol(&self) -> Result<String, MarketError> {
+        let address = self.stake_token_address().await?;
+        let contract = IERC20::new(address, self.instance.provider());
+        let symbol = contract.symbol().call().await.context("Failed to get token symbol")?;
+        Ok(symbol)
+    }
+
+    /// Returns the stake token's decimals.
+    pub async fn stake_token_decimals(&self) -> Result<u8, MarketError> {
+        let address = self.stake_token_address().await?;
+        let contract = IERC20::new(address, self.instance.provider());
+        let decimals = contract.decimals().call().await.context("Failed to get token decimals")?;
+        Ok(decimals)
+    }
 }
 
 impl Offer {
diff --git a/crates/boundless-market/src/contracts/bytecode.rs b/crates/boundless-market/src/contracts/bytecode.rs
index d0b02f62b1..8e21220091 100644
--- a/crates/boundless-market/src/contracts/bytecode.rs
+++ b/crates/boundless-market/src/contracts/bytecode.rs
@@ -1,7 +1,7 @@
 // Auto-generated file, do not edit manually
 
 alloy::sol! {
-    #[sol(rpc, bytecode = "610100346101d557601f615ff538819003918201601f19168301916001600160401b038311848410176101d9578084926060946040528339810103126101d5578051906001600160a01b03821682036101d5576020810151604090910151916001600160a01b03831683036101d5573060805260a05260c05260e0527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c166101c6576002600160401b03196001600160401b0382160161015d575b604051615e0790816101ee823960805181818161185201526118e5015260a0518181816122fa0152818161320601528181613355015281816134ec0152818161388a015281816139be0152613a66015260c051818181610d7d015281816110e8015281816133ad01526138e3015260e05181818161131101528181611457015281816117b601528181611c5d015281816121180152614b790152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f6100c1565b63f92ee8a960e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816308c84e70146122e8575080630cdedb5a146122615780631704f60f146121df57806317e828c4146121cd5780631ce03024146121af57806325d5971f146120785780632abff1f214611f6d5780632e1a7d4d14611f4f5780633336f89914611f34578063380f9c3814611eed5780633b5c226614611ea957806341451f9414611df857806345bc4d1014611a8f5780634f1ef286146118a657806352d1902d1461183f57806353182c6714611824578063553c0248146118085780635b07fdd8146117e55780635fbb4921146117a057806360dfd4a914611708578063635556241461164457806370a0823114611601578063715018a614611582578063775045cb1461156557806379ba5097146115185780638040fdc0146113af5780638094e614146112eb57806381bf6c24146112a257806384b0196e1461117a5780638da5cb5b14611145578063956b0960146111285780639f04f4201461110b5780639fe9428c146110d0578063ad3cb1cc14611087578063ae4449451461106f578063ae7330f114610fc6578063b4206dd214610f87578063c515c15f14610f02578063c7c9636f14610ead578063cb09e7c014610e67578063cb74db1114610e3e578063cb82cc8f14610e20578063cdc9712314610d2a578063cfbebd8b14610a24578063cfc0106e14610a0c578063d0e30db0146109f5578063d7697087146109da578063e30c3978146109a5578063efff97851461096b578063f2800f1a14610914578063f2fde38b1461088e578063f399e22e146102b9578063fb4ccf901461028e5763ffa1ad7414610270575f80fd5b3461028b578060031936011261028b57602060405160018152f35b80fd5b503461028b576102b56102a96102a3366127b1565b91613c3b565b60405191829182612463565b0390f35b503461028b57604036600319011261028b576102d3612329565b906024356001600160401b03811161088a576102f3903690600401612353565b90925f80516020615d9b833981519152549060ff8260401c1615916001600160401b03811680159081610882575b6001149081610878575b15908161086f575b506108605767ffffffffffffffff1981166001175f80516020615d9b8339815191525582610834575b506103656159bd565b61036d6159bd565b6001600160a01b038116156108205761038590614ade565b61038d6159bd565b604091825161039c8482612685565b601081526f12509bdd5b991b195cdcd3585c9ad95d60821b60208201528351906103c68583612685565b60018252603160f81b60208301526103dc6159bd565b6103e46159bd565b8051906001600160401b03821161080c5761040c5f80516020615cdb83398151915254612ba2565b601f811161079d575b50602090601f8311600114610721576104459291889183610617575b50508160011b915f199060031b1c19161790565b5f80516020615cdb833981519152555b8051906001600160401b03821161070d5761047d5f80516020615d1b83398151915254612ba2565b601f811161069e575b50602090601f8311600114610622576104b592918791836106175750508160011b915f199060031b1c19161790565b5f80516020615d1b833981519152555b835f80516020615d3b83398151915255835f80516020615dbb833981519152556001600160401b0381116106035761050781610502600254612ba2565b612bda565b83601f82116001146105945781908596610536949596926105895750508160011b915f199060031b1c19161790565b6002555b610542575080f35b5f80516020615d9b833981519152805460ff60401b1916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a180f35b013590505f80610431565b60028552601f198216955f80516020615cbb83398151915291865b8881106105eb575083600195969798106105d2575b505050811b0160025561053a565b01355f19600384901b60f8161c191690555f80806105c4565b909260206001819286860135815501940191016105af565b634e487b7160e01b84526041600452602484fd5b015190505f80610431565b5f80516020615d1b83398151915287528187209190601f198416885b818110610686575090846001959493921061066e575b505050811b015f80516020615d1b833981519152556104c5565b01515f1960f88460031b161c191690555f8080610654565b9293602060018192878601518155019501930161063e565b5f80516020615d1b83398151915287527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510610703575b601f0160051c01905b8181106106f85750610486565b8781556001016106eb565b90915081906106e2565b634e487b7160e01b86526041600452602486fd5b5f80516020615cdb83398151915288528188209190601f198416895b818110610785575090846001959493921061076d575b505050811b015f80516020615cdb83398151915255610455565b01515f1960f88460031b161c191690555f8080610753565b9293602060018192878601518155019501930161073d565b5f80516020615cdb83398151915288527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c81019160208510610802575b601f0160051c01905b8181106107f75750610415565b8881556001016107ea565b90915081906107e1565b634e487b7160e01b87526041600452602487fd5b631e4fbdf760e01b84526004849052602484fd5b68ffffffffffffffffff191668010000000000000001175f80516020615d9b833981519152555f61035c565b63f92ee8a960e01b8552600485fd5b9050155f610333565b303b15915061032b565b849150610321565b5080fd5b503461028b57602036600319011261028b576108a8612329565b6108b06146cc565b5f80516020615ddb83398151915280546001600160a01b0319166001600160a01b039283169081179091555f80516020615cfb833981519152549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461028b57602036600319011261028b576004359061093382613582565b15610959576040816020936001600160401b039352808452205460a01c16604051908152f35b60249163d2be005d60e01b8252600452fd5b503461028b576102b561099161098c61098336612715565b94929093612aa7565b612e77565b60405191829160208352602083019061243f565b503461028b578060031936011261028b575f80516020615ddb833981519152546040516001600160a01b039091168152602090f35b503461028b576102b56102a96109ef366127b1565b91613c2f565b508060031936011261028b57610a09613bc7565b80f35b503461028b57610a09610a1e366127b1565b9161377b565b503461028b57606036600319011261028b576004356001600160401b03811161088a576101608160040191600319903603011261088a576024356001600160401b038111610d2657610a7a903690600401612353565b916044356001600160401b038111610d2257610a9a903690600401612353565b82359391610aa7856149f6565b939096610abc610ab736886128f8565b614047565b91610ace83610ac961595c565b61542a565b97600160c01b1615610ce057604051630b135d3f60e11b81529160209183918291610afe91908c60048501612826565b03816001600160a01b038c165afa908115610cd5578991610ca6575b506001600160e01b0319166374eca2c160e11b01610c97575b604051610b41606082612685565b60218152602081017f4c6f636b526571756573742850726f6f66526571756573742072657175657374815260408201602960f81b9052610b7f613e34565b90610b88613e7e565b610b90613ec3565b610b98613f7d565b8d610ba1613dad565b92610baa613fca565b94604051978897602089019a5180918c5e880160208101918583528051926020849201905e0160200183815281516020819301825e0182815281516020819301825e0190815281516020819301825e018d815281516020819301825e018c815281516020819301825e018b815203601f1981018252610c299082612685565b519020906040519060208201928352604082015260408152610c4c606082612685565b519020610c5761595c565b90610c619161542a565b913690610c6d926126c1565b610c76916159e8565b610c8291939293615a22565b610c8b836144c3565b94610a09969194614f77565b638baa579f60e01b8852600488fd5b610cc8915060203d602011610cce575b610cc08183612685565b8101906143c2565b5f610b1a565b503d610cb6565b6040513d8b823e3d90fd5b610cf2610cf891610d019336916126c1565b886159e8565b90929192615a22565b6001600160a01b03888116911614610b3357638baa579f60e01b8852600488fd5b8480fd5b8280fd5b503461028b578060031936011261028b57604051908060025490610d4d82612ba2565b8085529160018116908115610df95750600114610daf575b6102b584610d7581860382612685565b6040519182917f0000000000000000000000000000000000000000000000000000000000000000835260406020840152604083019061243f565b600281525f80516020615cbb833981519152939250905b808210610ddf57509091508101602001610d7582610d65565b919260018160209254838588010152019101909291610dc6565b60ff191660208087019190915292151560051b85019092019250610d759150839050610d65565b503461028b57602036600319011261028b57610a0960043533614b49565b503461028b57602036600319011261028b576020610e5d600435613582565b6040519015158152f35b503461028b57602036600319011261028b576020906001600160601b03906040906001600160a01b03610e98612329565b16815260018452205460601c16604051908152f35b503461028b57610ebc3661256c565b96959392919490955b818110610eda576102b56102a9898989613c2f565b80610efc610eeb6001938589612ded565b610ef6838789612e10565b91612aa7565b01610ec5565b503461028b57602036600319011261028b57604060e091600435815280602052208054906001600160601b0360026001830154920154916040519360018060a01b03811685526001600160401b038160a01c16602086015262ffffff81871c16604086015260f81c6060850152818116608085015260601c1660a083015260c0820152f35b503461028b57610a09610f99366124c2565b9091610fb2610fa882356149f6565b93909485846143e2565b91610fbc826144c3565b9490933393614f77565b503461028b57606036600319011261028b5780610fe1612329565b6044356001600160401b03811161106b57611000903690600401612353565b6001600160a01b0390921691823b156110665761103992849283604051809681958294636691f64760e01b845260243560048501612826565b03925af1801561105b5761104a5750f35b8161105491612685565b61028b5780f35b6040513d84823e3d90fd5b505050fd5b5050fd5b503461028b57610a0961108136612515565b90613178565b503461028b578060031936011261028b57506102b56040516110aa604082612685565b60058152640352e302e360dc1b602082015260405191829160208352602083019061243f565b503461028b578060031936011261028b5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461028b578060031936011261028b57602060405161c3508152f35b503461028b578060031936011261028b576020604051611d4c8152f35b503461028b578060031936011261028b575f80516020615cfb833981519152546040516001600160a01b039091168152602090f35b503461028b578060031936011261028b575f80516020615d3b83398151915254158061128c575b1561124f576111f3906111b26135af565b906111bb61367c565b906020611201604051936111cf8386612685565b8385525f368137604051968796600f60f81b885260e08589015260e088019061243f565b90868203604088015261243f565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061123857505050500390f35b835185528695509381019392810192600101611229565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020615dbb83398151915254156111a1565b503461028b57602036600319011261028b576112df60209160406112c76004356149f6565b6001600160a01b039091168352600185529120614a30565b90506040519015158152f35b503461028b5760a036600319011261028b576004358160443560ff811680910361088a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610d2657829160e48392604051948593849263d505accf60e01b84523360048501523060248501528960448501526024356064850152608484015260643560a484015260843560c48401525af161139a575b50610a098233614b49565b816113a491612685565b61088a57815f61138f565b503461028b57602036600319011261028b576004356113cc6146cc565b30825260016020526001600160601b03604083205460601c166001600160601b036113f68361469b565b16116115055761142c6114088261469b565b30845260016020526001600160601b03604085209181835460601c16031690612b57565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156114fa5783916114cb575b50156114bc576040519081527ff0ed97f7b968f9d8268bc8d104a11b3586ceeadd0e0af5f73769e2b479f9d0ae60203092a280f35b6312171d8360e31b8252600482fd5b6114ed915060203d6020116114f3575b6114e58183612685565b810190612b8a565b5f611487565b503d6114db565b6040513d85823e3d90fd5b63112fed8b60e31b825230600452602482fd5b503461028b578060031936011261028b575f80516020615ddb83398151915254336001600160a01b039091160361155257610a0933614ade565b63118cdaa760e01b815233600452602490fd5b503461028b576102b561099161157d61098336612715565b612d06565b503461028b578060031936011261028b5761159b6146cc565b5f80516020615ddb83398151915280546001600160a01b03199081169091555f80516020615cfb8339815191528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461028b57602036600319011261028b576020906001600160601b03906040906001600160a01b03611632612329565b16815260018452205416604051908152f35b503461028b57602036600319011261028b576004356116616146cc565b30825260016020526001600160601b036040832054166001600160601b036116888361469b565b1611611505576116978161469b565b30835260016020526001600160601b03806040852092818454160316166001600160601b03198254161790558180808084335af16116d3612ecb565b50156114bc576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203092a280f35b503461028b57602036600319011261028b57600460606040602093833581528085522060026040519161173a83612605565b805460018060a01b03811684526001600160401b038160a01c168785015262ffffff8160e01c16604085015260f81c848401526001600160601b0360018201548181166080860152851c1660a0840152015460c082015201511615156040519015158152f35b503461028b578060031936011261028b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461028b578060031936011261028b57602061180061595c565b604051908152f35b503461028b578060031936011261028b57602090604051908152f35b503461028b576102b561099161183936612515565b90612e77565b503461028b578060031936011261028b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036118975760206040515f80516020615d5b8339815191528152f35b63703e46dd60e11b8152600490fd5b50604036600319011261028b576118bb612329565b906024356001600160401b03811161088a576118db9036906004016126f7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611a6d575b50611a5e5761191d6146cc565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596611a2a575b5061196257634c9c8ce360e01b84526004839052602484fd5b9091845f80516020615d5b8339815191528103611a185750813b15611a06575f80516020615d5b83398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a281518390156119ec57808360206119e895519101845af46119e2612ecb565b91615c5c565b5080f35b505050346119f75780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011611a56575b81611a4660209383612685565b81010312610d225751945f611949565b3d9150611a39565b63703e46dd60e11b8252600482fd5b5f80516020615d5b833981519152546001600160a01b0316141590505f611910565b503461028b57602036600319011261028b57600435611ad0611ab0826149f6565b6001600160a01b0390911680855260016020526040852090929190614a30565b5015611de45781835282602052604083209060405191611aef83612605565b805460018060a01b03811684526001600160401b038160a01c16602085015262ffffff8160e01c16604085015260f81c60608401526001810154600260808501926001600160601b03831684526001600160601b0360a087019360601c168352015460c08501526004606085015116611dd0576001606085015116611dbc576001600160401b03611b7f856149d4565b16421115611d935784865260208690526040862080546001600160f81b03811660f891821c60041790911b6001600160f81b031916178155869060029082600182015501556001600160601b03815116611d4c810290808204611d4c1490151715611d7f57611c046001600160601b03949392612710611c0993049586915116612e4a565b61469b565b916002606060018060a01b038751169601511615155f14611d1b57505060018060a01b03831685526001602052611c5a60408620611c54836001600160601b03835460601c16612e57565b90612b57565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561088a57818091602460405180948193630852cd8d60e31b83528960048401525af1801561105b57611d02575b5050907f79ca7c80cf57b513ffdf8aa37ec70e40757f5e0d35219241860bb4b4c2fa7616926001600160601b0360609360405193845216602083015260018060a01b03166040820152a280f35b81611d0f91949394612685565b610d225790845f611cb5565b9093506001600160601b0330943088526001602052611d4760408920611c548685835460601c16612e57565b511690865260016020526001600160601b03611d6a604088209282845416612e57565b166001600160601b0319825416179055611c5a565b634e487b7160e01b87526011600452602487fd5b6044866001600160401b0387611da8886149d4565b9063079c66ab60e41b845260045216602452fd5b631cfdeebb60e01b86526004859052602486fd5b633231064d60e11b86526004859052602486fd5b63d2be005d60e01b83526004829052602483fd5b503461028b57602036600319011261028b5760043590611e1782613582565b1561095957604081602093611e98935280845220600260405191611e3a83612605565b805460018060a01b03811684526001600160401b038160a01c168685015262ffffff8160e01c16604085015260f81c60608401526001600160601b036001820154818116608086015260601c1660a0840152015460c08201526149d4565b6001600160401b0360405191168152f35b503461028b57611eb83661256c565b96959392919490955b818110611ed6576102b56102a9898989613c3b565b80611ee7610eeb6001938589612ded565b01611ec1565b50611ef7366124c2565b505034611f27575b357f7fab7e8a635b9e4d20f8afff898bb2016ab093457ea8adc210f90fdbec6d8dfb8280a280f35b611f2f613bc7565b611eff565b503461028b576102b5610991611f4936612515565b90612d06565b503461028b57602036600319011261028b57610a09600435336146ff565b503461028b57602036600319011261028b576004356001600160401b03811161088a57611f9e903690600401612353565b611fa99291926146cc565b6001600160401b03811161206457611fc681610502600254612ba2565b81601f8211600114611ff95781908394611ff394926105895750508160011b915f199060031b1c19161790565b60025580f35b60028352601f198216935f80516020615cbb83398151915291845b86811061204c5750836001959610612033575b505050811b0160025580f35b01355f19600384901b60f8161c191690555f8080612027565b90926020600181928686013581550194019101612014565b634e487b7160e01b82526041600452602482fd5b503461028b57602036600319011261028b5760043533825260016020526001600160601b03604083205460601c166001600160601b036120b78361469b565b161161219c576120ed6120c98261469b565b33845260016020526001600160601b03604085209181835460601c16031690612b57565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156114fa57839161217d575b50156114bc576040519081527ff0ed97f7b968f9d8268bc8d104a11b3586ceeadd0e0af5f73769e2b479f9d0ae60203392a280f35b612196915060203d6020116114f3576114e58183612685565b5f612148565b63112fed8b60e31b825233600452602482fd5b503461028b578060031936011261028b576020604051620186a08152f35b503461028b57610a09610ef6366124c2565b503461028b576121ee366123b0565b969095919490936001600160a01b039092169190823b15610d22579161222f939185809460405196879586948593636691f64760e01b855260048501612826565b03925af1801561105b5761224c575b6102b56102a9868686613c2f565b612257828092612685565b61028b578061223e565b346122e45761226f366123b0565b93959194909290916001600160a01b0316803b156122e4576122ab965f8094604051998a9586948593636691f64760e01b855260048501612826565b03925af19283156122d9576102b5946102a9946122c9575b50613c3b565b5f6122d391612685565b5f6122c3565b6040513d5f823e3d90fd5b5f80fd5b346122e4575f3660031901126122e4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b600435906001600160a01b03821682036122e457565b35906001600160a01b03821682036122e457565b9181601f840112156122e4578235916001600160401b0383116122e457602083818601950101116122e457565b9181601f840112156122e4578235916001600160401b0383116122e4576020808501948460051b0101116122e457565b60a06003198201126122e4576004356001600160a01b03811681036122e45791602435916044356001600160401b0381116122e457816123f291600401612353565b929092916064356001600160401b0381116122e4578161241491600401612380565b92909291608435906001600160401b0382116122e45760809082900360031901126122e45760040190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b83831061249557505050505090565b90919293946020806124b3600193603f19868203018752895161243f565b97019301930191939290612486565b9060406003198301126122e4576004356001600160401b0381116122e45761016081840360031901126122e45760040191602435906001600160401b0382116122e45761251191600401612353565b9091565b9060406003198301126122e4576004356001600160401b0381116122e45760a081840360031901126122e45760040191602435906001600160401b0382116122e45760809082900360031901126122e45760040190565b60806003198201126122e4576004356001600160401b0381116122e4578161259691600401612380565b929092916024356001600160401b0381116122e457816125b891600401612380565b929092916044356001600160401b0381116122e457816125da91600401612380565b92909291606435906001600160401b0382116122e45760809082900360031901126122e45760040190565b60e081019081106001600160401b0382111761262057604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761262057604052565b608081019081106001600160401b0382111761262057604052565b604081019081106001600160401b0382111761262057604052565b90601f801991011681019081106001600160401b0382111761262057604052565b6001600160401b03811161262057601f01601f191660200190565b9291926126cd826126a6565b916126db6040519384612685565b8294818452818301116122e4578281602093845f960137010152565b9080601f830112156122e457816020612712933591016126c1565b90565b60806003198201126122e4576004356001600160401b0381116122e45761016081830360031901126122e457600401916024356001600160401b0381116122e4578261276391600401612353565b929092916044356001600160401b0381116122e45760a081840360031901126122e45760040191606435906001600160401b0382116122e45760809082900360031901126122e45760040190565b60406003198201126122e4576004356001600160401b0381116122e457816127db91600401612380565b92909291602435906001600160401b0382116122e45760809082900360031901126122e45760040190565b908060209392818452848401375f828201840152601f01601f1916010190565b604090612712949281528160208201520191612806565b35906001600160601b03821682036122e457565b35906001600160e01b0319821682036122e457565b359063ffffffff821682036122e457565b91908260e09103126122e45760405161288f81612605565b8092803582526020810135602083015260408101356001600160401b03811681036122e45760c091829160408501526128ca60608201612866565b60608501526128db60808201612866565b60808501526128ec60a08201612866565b60a08501520135910152565b9190610160838203126122e4576040519061291282612634565b81938035835260208101356001600160401b0381116122e45781018083039060a082126122e45760408051926129478461264f565b82358452601f1901126122e4576040516129608161266a565b61296c6020830161233f565b815261297a6040830161283d565b6020820152602083015260608101356001600160401b0381116122e45781016040818603126122e457604051916129b08361266a565b813560028110156122e45783526020820135926001600160401b0384116122e4576129e2876129f295608095016126f7565b6020820152604085015201612851565b6060820152602084015260408101356001600160401b0381116122e457810182601f820112156122e45782816020612a2c933591016126c1565b604084015260608101356001600160401b0381116122e4578101916040838203126122e45760405192612a5e8461266a565b803560028110156122e45784526020810135926001600160401b0384116122e457608094612a9284612aa2968895016126f7565b6020820152606087015201612877565b910152565b91823590600160c01b821615612b2b57602092612b0292611c0492612af292612adb92871c6001600160a01b0316886143e2565b945b612ae6816144c3565b50506080369101612877565b6001600160401b034216906145b7565b6001600160601b0360405191612b178361266a565b600183521691018190526001607f1b17905d565b5050506020612b02611c04612af2612b51612b49610ab736886128f8565b610ac961595c565b94612add565b80546bffffffffffffffffffffffff60601b191660609290921b6bffffffffffffffffffffffff60601b16919091179055565b908160209103126122e4575180151581036122e45790565b90600182811c92168015612bd0575b6020831014612bbc57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612bb1565b601f8111612be6575050565b60025f5260205f20906020601f840160051c83019310612c20575b601f0160051c01905b818110612c15575050565b5f8155600101612c0a565b9091508190612c01565b356001600160a01b03811681036122e45790565b903590601e19813603018212156122e457018035906001600160401b0382116122e4576020019160608202360383136122e457565b359061ffff821682036122e457565b91908260609103126122e457604051606081018181106001600160401b03821117612620576040526040612aa2818395612cbb81612c73565b8552612cc96020820161233f565b60208601520161283d565b903590601e19813603018212156122e457018035906001600160401b0382116122e4576020019181360383136122e457565b9190612d128184613178565b612d27612d2160608301612c2a565b846147d1565b92803591827f4321394035f9f33b5a0c036d91d311549f949cdfc2a4fe70bd3745115b248da85f80a260208101612d5e8183612c3e565b9050612d6b575b50505050565b612d7491612c3e565b91909115612dd957612dd092612d8d6040933690612c82565b6001600160601b038460018060a01b036020840151169201511691612db56060850185612cd4565b939092612dc56080870187612cd4565b9790960135926148fa565b5f808080612d65565b634e487b7160e01b5f52603260045260245ffd5b9190811015612dd95760051b8101359061015e19813603018212156122e4570190565b90821015612dd9576125119160051b810190612cd4565b601f19810191908211612e3657565b634e487b7160e01b5f52601160045260245ffd5b91908203918211612e3657565b906001600160601b03809116911601906001600160601b038211612e3657565b612e8682606092949394612d06565b92016001600160a01b03612e9982612c2a565b165f5260016020526001600160601b0360405f20541680612eb8575050565b612ec4612ec992612c2a565b6146ff565b565b3d15612ef5573d90612edc826126a6565b91612eea6040519384612685565b82523d5f602084013e565b606090565b6001600160401b0381116126205760051b60200190565b903590601e19813603018212156122e457018035906001600160401b0382116122e457602001918160061b360383136122e457565b6020815260406020612f6284518383860152606085019061243f565b93015191015290565b90929192612f7881612efa565b93612f866040519586612685565b60606020868481520192028301928184116122e457915b838310612faa5750505050565b6020606091612fb98486612c82565b815201920191612f9d565b929192612fd082612efa565b93612fde6040519586612685565b602085848152019260061b8201918183116122e457925b8284106130025750505050565b6040848303126122e4576020604091825161301c8161266a565b61302587612c73565b8152613032838801612851565b83820152815201930192612ff5565b6020815260a0810191805192608060208401528351809152602060c084019401905f5b8181106130ea57505050602081810151838503601f190160408501528051808652948201949101905f5b8181106130ba57505050604081015160608381019190915201516001600160a01b031660809091015290565b8251805161ffff1687526020908101516001600160e01b031916818801526040909601959092019160010161308e565b8251805161ffff1687526020818101516001600160a01b0316818901526040918201516001600160601b03169188019190915260609096019590920191600101613064565b9190811015612dd95760061b0190565b356001600160e01b0319811681036122e45790565b9061316e9060409396959496606084526060840191612806565b9460208201520152565b5f9160205f61318a6060850185612cd4565b908160405192839283378101838152039060025afa156122d9576131bb6131b65f516040850135614c7b565b614da3565b916131ea6040516131cb8161264f565b5f81528235602082015260208301356040820152846060820152614e94565b60408301936131f98585612f11565b1590506134e657613252907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169061323c6080860186612cd4565b93906040519461324b8661266a565b36916126c1565b83526020830152803b156134ae576132819187916040518080958194631599ead560e01b835260048301612f46565b03915afa80156134db579086916134c6575b506020915b6132a28686612f11565b90916132e36132b386890189612c3e565b9490936132da6132c560608c01612c2a565b95604051976132d38961264f565b3691612f6b565b86523691612fc4565b85840152604083015260018060a01b0316606082015260405161331b8161330d8682019485613041565b03601f198101835282612685565b604051918291518091835e8101838152039060025afa156114fa578351926133438184612f11565b9050151580613468575b6133fa5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906133889080612cd4565b823b15610d225760405163ab750e7560e01b815293859385939092849283926133d6927f00000000000000000000000000000000000000000000000000000000000000009160048601613154565b03915afa801561105b576133e8575050565b6133f3828092612685565b61028b5750565b613405859184612f11565b15613454576134196020613424920161313f565b926080810190612cd4565b60049391931161088a57632e2ce35360e21b82526001600160e01b03199081166004529135909116602452604490fd5b634e487b7160e01b82526032600452602482fd5b506134738184612f11565b156134b2576020613484910161313f565b6134916080840184612cd4565b6004116134ae57356001600160e01b03199081169116141561334d565b8680fd5b634e487b7160e01b86526032600452602486fd5b816134d091612685565b610d2257845f613293565b6040513d88823e3d90fd5b613522907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169061323c6080860186612cd4565b83526020830152803b156122e457613551915f916040518080958194631599ead560e01b835260048301612f46565b039161c350fa80156122d95761356c575b5084602091613298565b6135799195505f90612685565b5f936020613562565b61358e6135ab916149f6565b6001600160a01b039091165f908152600160205260409020614a30565b5090565b604051905f825f80516020615cdb83398151915254916135ce83612ba2565b808352926001811690811561365d57506001146135f2575b612ec992500383612685565b505f80516020615cdb8339815191525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310613641575050906020612ec9928201016135e6565b6020919350806001915483858901015201910190918492613629565b60209250612ec994915060ff191682840152151560051b8201016135e6565b604051905f825f80516020615d1b833981519152549161369b83612ba2565b808352926001811690811561365d57506001146136be57612ec992500383612685565b505f80516020615d1b8339815191525f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061370d575050906020612ec9928201016135e6565b60209193508060019154838589010152019101909184926136f5565b3561ffff811681036122e45790565b9190811015612dd95760051b81013590609e19813603018212156122e4570190565b805115612dd95760200190565b8051821015612dd95760209160051b010190565b61ffff8211613bae5761378d82612efa565b9061379b6040519283612685565b828252601f196137aa84612efa565b013660208401376137ba83612efa565b6137c76040519182612685565b838152601f196137d685612efa565b0136602083013760408501936137ec8587612f11565b90505f5b8787838310613af557505050505f5b818110613927575050505061383260209261381a5f93615323565b61384161382986880188612c3e565b94909388612f11565b6132da6132c560608b01612c2a565b85840152604083015260018060a01b0316606082015260405161386b8161330d8682019485613041565b604051918291518091835e8101838152039060025afa156122d9575f517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916138bd9080612cd4565b919092803b156122e45761390c935f936040519586948593849363ab750e7560e01b85527f00000000000000000000000000000000000000000000000000000000000000009160048601613154565b03915afa80156122d95761391d5750565b5f612ec991612685565b613932818386613738565b9060205f6139436060850185612cd4565b908160405192839283378101838152039060025afa156122d95761396f6131b65f516040850135614c7b565b9161399e60405161397f8161264f565b8381528235602082015260208301356040820152846060820152614e94565b6139a88389613767565b526139b38286613767565b51613a6057613a04927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916139f5906080810190612cd4565b94906040519561324b8761266a565b84526020840152803b156122e457613a33925f916040518080968194631599ead560e01b835260048301612f46565b039161c350fa9182156122d957600192613a50575b505b016137ff565b5f613a5a91612685565b5f613a48565b613a9d927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316916139f5906080810190612cd4565b84526020840152803b156122e457613acc925f916040518080968194631599ead560e01b835260048301612f46565b03915afa9182156122d957600192613ae5575b50613a4a565b5f613aef91612685565b5f613adf565b613b3b61ffff613b33613b2e86613b1c86613b286020613b2285613b1c613b459c8e612f11565b9061312f565b0161313f565b98612f11565b613729565b168689613738565b6080810190612cd4565b6004929192116122e4576001613b7d61ffff613b76613b2e878f978f613b1c9163ffffffff60e01b90351699612f11565b1688613767565b526001600160e01b031916818103613b995750506001016137f0565b632e2ce35360e21b5f5260045260245260445ffd5b506377e4aa5360e11b5f5260045261ffff60245260445ffd5b613bd03461469b565b335f5260016020526001600160601b03613bf160405f209282845416612e57565b166001600160601b03198254161790556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b82606092612e86929594955b9291613c4881838661377b565b613c5182612efa565b93613c5f6040519586612685565b828552601f19613c6e84612efa565b015f5b818110613d9c575050845f5b848110613d2d57505060208201613c948184612c3e565b9390505f5b848110613ca857505050505050565b613cb28383612c3e565b909190811015612dd957613d27613cd160019360608402013690612c82565b613ce161ffff8251168a89613738565b906001600160601b036040868060a01b036020840151169201511691613d0a6060820182612cd4565b91613d186080820182612cd4565b959094604083013592356148fa565b01613c99565b80613d50613d3e6001938887613738565b613d4a60608801612c2a565b906147d1565b613d5a8285613767565b52613d658184613767565b50613d71818786613738565b357f4321394035f9f33b5a0c036d91d311549f949cdfc2a4fe70bd3745115b248da85f80a201613c7d565b806060602080938a01015201613c71565b60405190613dbc608083612685565b605a82527f6c2c496e70757420696e7075742c4f66666572206f66666572290000000000006060837f50726f6f66526571756573742875696e743235362069642c526571756972656d60208201527f656e747320726571756972656d656e74732c737472696e6720696d616765557260408201520152565b60405190613e43606083612685565b60268252654c696d69742960d01b6040837f43616c6c6261636b286164647265737320616464722c75696e7439362067617360208201520152565b60405190613e8d606083612685565b60218252602960f81b6040837f496e7075742875696e743820696e707574547970652c6279746573206461746160208201520152565b60405190613ed260c083612685565b6084825263616b652960e01b60a0837f4f666665722875696e74323536206d696e50726963652c75696e74323536206d60208201527f617850726963652c75696e7436342062696464696e6753746172742c75696e7460408201527f33322072616d705570506572696f642c75696e743332206c6f636b54696d656f60608201527f75742c75696e7433322074696d656f75742c75696e74323536206c6f636b537460808201520152565b60405190613f8c606083612685565b602982526874657320646174612960b81b6040837f5072656469636174652875696e743820707265646963617465547970652c627960208201520152565b60405190613fd9608083612685565b605382527274652c6279746573342073656c6563746f722960681b6060837f526571756972656d656e7473286279746573333220696d61676549642c43616c60208201527f6c6261636b2063616c6c6261636b2c507265646963617465207072656469636160408201520152565b61404f613dad565b614057613e34565b61405f613e7e565b90614068613ec3565b614070613f7d565b614078613fca565b916040519485946020860197805160208192018a5e860160208101915f83528051926020849201905e016020015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815203601f19810182526140ee9082612685565b519020908051906020810151614102613fca565b61410a613e34565b614112613f7d565b90604051918291602083019480516020819201875e830160208101915f83528051926020849201905e016020015f815281516020819301825e015f815203601f19810182526141619082612685565b519020908051906020810151614175613e34565b8051906020012090600160a01b6001900381511690602001516001600160601b0316604051916020830193845260408301526060820152606081526141bb608082612685565b5190209060408101516141cc613f7d565b80519060200120908051906141e082615420565b602001518051906020012060405191602083019384526141ff81615420565b6040830152606082015260608152614218608082612685565b5190209063ffffffff60e01b90606001511691604051936020850195865260408501526060840152608083015260a082015260a0815261425960c082612685565b519020906040810151805190602001206060820151614276613e7e565b805190602001209080519061428a82615420565b602001518051906020012060405191602083019384526142a981615420565b60408301526060820152606081526142c2608082612685565b51902091608001516142d2613ec3565b60405180602081019280516020819201855e8101602081015f905203602001601f19810182526143029082612685565b5190209080519060208101519060408101516001600160401b0316606082015163ffffffff16608083015163ffffffff169160a084015163ffffffff169360c0015194604051966020880198895260408801526060870152608086015260a085015260c084015260e0830152610100820152610100815261438561012082612685565b51902092604051946020860196875260408601526060850152608084015260a083015260c082015260c081526143bc60e082612685565b51902090565b908160209103126122e457516001600160e01b0319811681036122e45790565b92916143f4612b49610ab736876128f8565b9335600160c01b161561448d579160209161442693604051809581948293630b135d3f60e11b84528960048501612826565b03916001600160a01b0316620186a0fa9081156122d9575f9161446e575b506001600160e01b0319166374eca2c160e11b0161445f5790565b638baa579f60e01b5f5260045ffd5b614487915060203d602011610cce57610cc08183612685565b5f614444565b61449f6144a5916144ae9436916126c1565b846159e8565b90939193615a22565b6001600160a01b0390811691160361445f5790565b906144d13660808401612877565b80516020820151106145885763ffffffff606082015116608082019063ffffffff825116106145885763ffffffff90511660a082019063ffffffff825116106145885761453d9063ffffffff6001600160401b03604061453086615447565b9501511691511690614597565b9262ffffff6001600160401b036145548487614f57565b1611614588576001600160401b038416904282106145725750509190565b63873fd26b60e01b5f523560045260245260445ffd5b6341abc80160e01b5f5260045ffd5b906001600160401b03809116911601906001600160401b038211612e3657565b9060408201906001600160401b0380835116911690811115614695576001600160401b036145e484615447565b16811161468e576001600160401b03825116906001600160401b03614615606086019363ffffffff85511690614597565b16811115614627575050506020015190565b614654906001600160401b0363ffffffff6146486020880151885190612e4a565b94511694511690612e4a565b925192818102918183041490151715612e3657811561467a57048101809111612e365790565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b50505190565b6001600160601b0381116146b5576001600160601b031690565b6306dfcc6560e41b5f52606060045260245260445ffd5b5f80516020615cfb833981519152546001600160a01b031633036146ec57565b63118cdaa760e01b5f523360045260245ffd5b9060018060a01b03821691825f5260016020526001600160601b0360405f2054166001600160601b036147318461469b565b16116147be575f80808481946147468261469b565b88845260016020526001600160601b03806040862092818454160316166001600160601b03198254161790555af161477c612ecb565b50156147af5760207f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591604051908152a2565b6312171d8360e31b5f5260045ffd5b8263112fed8b60e31b5f5260045260245ffd5b9081356147dd816149f6565b60018060a09493941b0383165f5260016020526147fd8160405f20614a30565b9390156148ec57825f525f60205260405f20926040519361481d85612605565b600281549160018060a01b03831687526001600160401b038360a01c169283602089015262ffffff8160e01c16604089015260f81c60608801526001600160601b03600182015481811660808a015260601c1660a0880152015460c08601524211155f146148d857602061489397013593615801565b905b815161489d57565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb356460405160208152806148d3602082018661243f565b0390a1565b60206148e6970135936155d6565b90614895565b60206148e69601359261546a565b966001600160a01b03909116959094909392863b156122e457866001600160601b035f969261496488946149529a6040519b8c9a8b998a9663a12da43f60e01b88526004880152606060248801526064870191612806565b84810360031901604486015291612806565b039416f190816149c4575b506149c0577f5c5960582bfc7a494183b4e9a66bfe8ecffc07a83a48d136e732400f7b98bf509061499e612ecb565b906149bb604051928392835260406020840152604083019061243f565b0390a2565b5050565b5f6149ce91612685565b5f61496f565b6127129062ffffff60406001600160401b036020840151169201511690614597565b906001600160c11b0319821661458857602082901c6001600160a01b03169163ffffffff1690565b6302000000821015612dd95701905f90565b63ffffffff821691906020831015614a82576401fffffffe905460c01c9160011b169180830460021490151715612e36576001600160401b03906003831b1616901c9060026001831615159216151590565b91614a8d9150612e27565b908160011b9180830460021481151715612e365760ff91614abd9160071c6001600160f81b031690600101614a1e565b90549060031b1c9116906003821b16901c9060026001831615159216151590565b5f80516020615ddb83398151915280546001600160a01b03199081169091555f80516020615cfb83398151915280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6040516323b872dd60e01b81526001600160a01b03918216600482018190523060248301526044820184905292917f000000000000000000000000000000000000000000000000000000000000000016906020905f9060649082855af19081601f3d1160015f5114161516614c56575b5015614c1a57602081614c11614bef7f1da2c4060997c108162f55c30ad2268924b069210f8c686ba302e1acc6909ccc9461469b565b855f5260018452611c5460405f20916001600160601b03835460601c16612e57565b604051908152a2565b60405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606490fd5b3b153d171590505f614bb9565b60405190614c708261266a565b5f6020838281520152565b905f6080604051614c8b81612634565b828152826020820152604051614ca08161266a565b8381528360208201526040820152826060820152015260405190614cc38261266a565b5f82525f602083015260405190614cd98261266a565b8152602081015f815260205f600c6040516b1c9a5cd8cc0b93dd5d1c1d5d60a21b815260025afa156122d9576020915f918251915190516040519185830193845260408301526060820152600160f91b608082015260628152614d3d608282612685565b604051918291518091835e8101838152039060025afa156122d9575f519060405192614d6884612634565b83527fa3acc27117418996340b84e5a90f3ef4c49d22c79e44aad822ec9c313e1eb8e2602084015260408301525f6060830152608082015290565b60205f60126040517172697363302e52656365697074436c61696d60701b815260025afa156122d9575f519060608101519181519260208301519360406080850151940193845151906003821015614e8057945160209081015160408051808401978852908101959095526060850193909352608084019690965260a08301949094526001600160f81b031960f894851b811660c0840152931b90921660c4830152600160fa1b60c883015260aa82525f91614e6060ca82612685565b604051918291518091835e8101838152039060025afa156122d9575f5190565b634e487b7160e01b5f52602160045260245ffd5b6056604051614ea4608082612685565b81815275742c6279746573333220636c61696d4469676573742960501b606060208301927f4173736573736f72436f6d6d69746d656e742875696e7432353620696e64657884527f2c75696e743235362069642c62797465733332207265717565737444696765736040820152015220908051906020810151906060604082015191015191604051936020850195865260408501526060840152608083015260a082015260a081526143bc60c082612685565b906001600160401b03809116911603906001600160401b038211612e3657565b959492939160018060a01b0316805f526001602052614f998560405f20614a30565b9061530f576152fb576001600160401b038416968742116152e357614fc7611c04612af23660808501612877565b94825f52600160205260405f20976001600160601b03895416956001600160601b038816948588106152d1575060018060a01b031696875f52600160205260405f20906001600160601b03825460601c16976101408601358099106152be57916001600160601b038061506c936150719796950316166001600160601b03198d5416178c556001600160601b0361505d8a61469b565b81835460601c16031690612b57565b614f57565b936001600160401b03851662ffffff81116152a75750916001600160601b036151899261516f60ff6150a56002989761469b565b92604051996150b38b612605565b8b8b5260208b019e8f5262ffffff60408c019116815260608b01915f835260808c019788528660a08d019616865260c08c01998a52359e8f5f525f60205260405f209b60018060a01b039060018060a01b039051161660018060a01b03198d5416178c5551908b549062ffffff60e01b905160e01b16916001600160401b0360a01b9060a01b16906affffffffffffffffffffff60a01b191617178a555116889081549060ff60f81b9060f81b169060018060f81b0316179055565b818060018901945116168219845416178355511690612b57565b5191015563ffffffff8216916020831015615219576401fffffffe9060011b169180830460021490151715612e365782546001600160c01b038116600190931b6001600160401b031660c091821c17901b6001600160c01b031916919091179091557ffb1dd4383bc31d469e205e04236dbca09ae13ab0373414dccbe098a861ddef5590602090604051908152a2565b509061522490612e27565b908160011b9282840460021483151715612e36577ffb1dd4383bc31d469e205e04236dbca09ae13ab0373414dccbe098a861ddef55936020936152a29260ff9160019161527f9160071c6001600160f81b0316908301614a1e565b929093161b82548260031b1c179082549060031b91821b915f19901b1916179055565b614c11565b6306dfcc6560e41b5f52601860045260245260445ffd5b8963112fed8b60e31b5f5260045260245ffd5b63112fed8b60e31b5f5260045260245ffd5b879063cfe6a8fd60e01b5f523560045260245260445ffd5b86631cfdeebb60e01b5f523560045260245ffd5b8763a905765160e01b5f523560045260245ffd5b8051156145885760018151146154175780515b6001811161534c57506153489061375a565b5190565b60018101808211612e365760011c905f5b8160011c81106153ab5750600180821614615379575b50615336565b5f198101908111612e365761538e9083613767565b515f198201828111612e36576153a49084613767565b525f615373565b600181901b906001600160ff1b0381168103612e36576153cb8286613767565b5160018301809311612e36576153e360019387613767565b519081811015615408575f5260205260405f205b6154018287613767565b520161535d565b905f5260205260405f206153f7565b6153489061375a565b60021115614e8057565b6042916040519161190160f01b8352600283015260228201522090565b6127129063ffffffff60806001600160401b036040840151169201511690614597565b909395949260609661558a5761547f90615a82565b80511561555e5760206001600160601b03910151169360018060a01b031690815f5260016020526154b460405f209384615b47565b604051905f80516020615d7b8339815191525f80a26001600160601b03835416918583106155355750506001600160601b038481920316166001600160601b031982541617905560018060a01b03165f5260016020526001600160601b0361552360405f209282845416612e57565b166001600160601b0319825416179055565b945094955050505063112fed8b60e31b6020830152602482015260248152612712604482612685565b509394505050506040519063b2e276f760e01b6020830152602482015260248152612712604482612685565b5093945050505060405190631cfdeebb60e01b6020830152602482015260248152612712604482612685565b906001600160601b03809116911603906001600160601b038211612e3657565b919496959390926060976001606085015116151580156157f1575b6157c3579061560792911561578a575b50615a82565b8051156157775760206001600160601b03910151169360018060a01b0316805f5260016020526001600160601b03608060405f2093015116858181115f146157425790615653916155b6565b906001600160601b03835416906001600160601b0383168210615714575082546bffffffffffffffffffffffff19169190036001600160601b03161790555b5f90815260208190526040812080546affffffffffffffffffffff60a01b81166001600160a01b0385169081176001600160a01b0319929092161760f890811c600290811790911b6001600160f81b031916919091178255015560018060a01b03165f5260016020526001600160601b0361552360405f209282845416612e57565b9697505050505050506040519063112fed8b60e31b6020830152602482015260248152612712604482612685565b6001600160601b03925061575990615762926155b6565b82845416612e57565b166001600160601b0319825416179055615692565b8263b2e276f760e01b5f5260045260245ffd5b6001600160a01b0387165f9081526001602052604090206157ab9190615b47565b835f80516020615d7b8339815191525f80a25f615601565b50505050929350505060405190631cfdeebb60e01b6020830152602482015260248152612712604482612685565b50600260608501511615156155f1565b9396959492909260609760016060870151161515801561594c575b6157c35760c086015190808203615933575050156158fe575b505081516001600160a01b0393841693168390036158d45760a0612ec993926001600160601b03925f525f6020525f600260408220600160f81b60018060f81b03825416178155826001820155015582608082015116845f526001602052836158a560405f209282845416612e57565b168419825416179055015116905f526001602052611c5460405f20916001600160601b03835460601c16612e57565b92935050506040519063a905765160e01b6020830152602482015260248152612712604482612685565b61591a9160018060a01b03165f52600160205260405f20615b47565b805f80516020615d7b8339815191525f80a25f80615835565b85637b54493160e01b5f5260045260245260445260645ffd5b506002606087015116151561581c565b615964615abe565b61596c615b15565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526143bc60c082612685565b60ff5f80516020615d9b8339815191525460401c16156159d957565b631afcd79f60e31b5f5260045ffd5b8151919060418303615a1857615a119250602082015190606060408401519301515f1a90615be4565b9192909190565b50505f9160029190565b6004811015614e805780615a34575050565b60018103615a4b5763f645eedf60e01b5f5260045ffd5b60028103615a66575063fce698f760e01b5f5260045260245ffd5b600314615a705750565b6335e2f38360e21b5f5260045260245ffd5b615a8a614c63565b505c615a94614c63565b506001600160601b0360405191615aaa8361266a565b6001607f1b81161515835216602082015290565b615ac66135af565b8051908115615ad6576020012090565b50505f80516020615d3b833981519152548015615af05790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615b1d61367c565b8051908115615b2d576020012090565b50505f80516020615dbb833981519152548015615af05790565b9063ffffffff8116906020821015615ba4576401fffffffe9060011b169080820460021490151715612e365781546001600160c01b038116600290921b6001600160401b031660c091821c17901b6001600160c01b031916179055565b50615bae90612e27565b8060011b9080820460021481151715612e3657612ec99260ff9160029161527f9160071c6001600160f81b031690600101614a1e565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615c51579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156122d9575f516001600160a01b03811615615c4757905f905f90565b505f906001905f90565b5050505f9160039190565b90615c805750805115615c7157805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580615cb1575b615c91575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15615c8956fe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acea16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc1cedb001a5114ea90393cd9f134224e9e1312545ee8a9b9533d780be6a9bf8b7f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a164736f6c634300081a000a")]
+    #[sol(rpc, bytecode = "610100346101b957601f615eb938819003918201601f19168301916001600160401b038311848410176101bd578084926060946040528339810103126101b9578051906001600160a01b03821682036101b9576020810151604090910151916001600160a01b03831683036101b9573060805260a05260c05260e0527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c166101aa576002600160401b03196001600160401b03821601610141575b604051615ce790816101d2823960805181818161185c01526118ef015260a0518181816123220152818161302a015281816134e0015261358e015260c051818181610cbd01528181610fea0152613094015260e0518181816112b6015281816113fc015281816117c001528181611ca3015281816121b50152614e190152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f6100c1565b63f92ee8a960e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816308c84e70146123105750806317e828c4146122f757806318e0e1611461226a5780631ce030241461224c57806325d5971f146121155780632abff1f21461200a5780632e1a7d4d14611fec5780632f13a90a14611f6457806331750cc714611f4c578063380f9c3814611eda57806341451f9414611e2957806345bc4d1014611ab4578063487c7b8c14611a995780634f1ef286146118b057806352d1902d14611849578063553c02481461182d5780635b07fdd81461180a5780635f37a503146117ef5780635fbb4921146117aa57806360dfd4a914611712578063635556241461164e57806370a082311461160b578063715018a61461158c57806379ba50971461153f5780637ed75e36146114bd5780638040fdc0146113545780638094e6141461129057806380bd38db1461126f57806381bf6c241461122657806384b0196e146110fe5780638da5cb5b146110c95780638e3b694514611047578063956b09601461102a5780639f04f4201461100d5780639fe9428c14610fd2578063ad3cb1cc14610f89578063ae7330f114610ee0578063b4206dd214610ea3578063c515c15f14610e1e578063c5fe2fac14610df1578063cb09e7c014610dab578063cb74db1114610d82578063cb82cc8f14610d64578063cdc9712314610c6a578063cfbebd8b1461096b578063d0e30db014610954578063e30c39781461091f578063f2800f1a146108c8578063f2fde38b14610842578063f399e22e1461026d5763ffa1ad741461024f575f80fd5b3461026a578060031936011261026a57602060405160018152f35b80fd5b503461026a57604036600319011261026a576102876123d1565b906024356001600160401b03811161083e576102a7903690600401612351565b90925f80516020615c7b833981519152549060ff8260401c1615916001600160401b03811680159081610836575b600114908161082c575b159081610823575b506108145767ffffffffffffffff1981166001175f80516020615c7b83398151915255826107e8575b506103196158d9565b6103216158d9565b6001600160a01b038116156107d45761033990614d7e565b6103416158d9565b60409182516103508482612671565b601081526f12509bdd5b991b195cdcd3585c9ad95d60821b602082015283519061037a8583612671565b60018252603160f81b60208301526103906158d9565b6103986158d9565b8051906001600160401b0382116107c0576103c05f80516020615bdb83398151915254612be6565b601f8111610751575b50602090601f83116001146106d5576103f992918891836105cb575b50508160011b915f199060031b1c19161790565b5f80516020615bdb833981519152555b8051906001600160401b0382116106c1576104315f80516020615c1b83398151915254612be6565b601f8111610652575b50602090601f83116001146105d65761046992918791836105cb5750508160011b915f199060031b1c19161790565b5f80516020615c1b833981519152555b835f80516020615c3b83398151915255835f80516020615c9b833981519152556001600160401b0381116105b7576104bb816104b6600254612be6565b612c1e565b83601f821160011461054857819085966104ea9495969261053d5750508160011b915f199060031b1c19161790565b6002555b6104f6575080f35b5f80516020615c7b833981519152805460ff60401b1916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a180f35b013590505f806103e5565b60028552601f198216955f80516020615b9b83398151915291865b88811061059f57508360019596979810610586575b505050811b016002556104ee565b01355f19600384901b60f8161c191690555f8080610578565b90926020600181928686013581550194019101610563565b634e487b7160e01b84526041600452602484fd5b015190505f806103e5565b5f80516020615c1b83398151915287528187209190601f198416885b81811061063a5750908460019594939210610622575b505050811b015f80516020615c1b83398151915255610479565b01515f1960f88460031b161c191690555f8080610608565b929360206001819287860151815501950193016105f2565b5f80516020615c1b83398151915287527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c810191602085106106b7575b601f0160051c01905b8181106106ac575061043a565b87815560010161069f565b9091508190610696565b634e487b7160e01b86526041600452602486fd5b5f80516020615bdb83398151915288528188209190601f198416895b8181106107395750908460019594939210610721575b505050811b015f80516020615bdb83398151915255610409565b01515f1960f88460031b161c191690555f8080610707565b929360206001819287860151815501950193016106f1565b5f80516020615bdb83398151915288527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c810191602085106107b6575b601f0160051c01905b8181106107ab57506103c9565b88815560010161079e565b9091508190610795565b634e487b7160e01b87526041600452602487fd5b631e4fbdf760e01b84526004849052602484fd5b68ffffffffffffffffff191668010000000000000001175f80516020615c7b833981519152555f610310565b63f92ee8a960e01b8552600485fd5b9050155f6102e7565b303b1591506102df565b8491506102d5565b5080fd5b503461026a57602036600319011261026a5761085c6123d1565b6108646147bb565b5f80516020615cbb83398151915280546001600160a01b0319166001600160a01b039283169081179091555f80516020615bfb833981519152549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461026a57602036600319011261026a57600435906108e782613cb6565b1561090d576040816020936001600160401b039352808452205460a01c16604051908152f35b60249163d2be005d60e01b8252600452fd5b503461026a578060031936011261026a575f80516020615cbb833981519152546040516001600160a01b039091168152602090f35b508060031936011261026a57610968613e5d565b80f35b503461026a57606036600319011261026a576004356001600160401b03811161083e576101608160040191600319903603011261083e576024356001600160401b038111610c66576109c1903690600401612351565b916044356001600160401b038111610c62576109e1903690600401612351565b8235916109ed836149df565b929091610a026109fd36886128ed565b61415f565b610a1381610a0e615878565b6152ef565b95600160c01b1615610c2157604051630b135d3f60e11b815260208180610a3f8d8d8c60048501612b84565b03816001600160a01b0389165afa908115610c16578b91610be7575b506001600160e01b0319166374eca2c160e11b01610bd8575b604051610a82606082612671565b60218152602081017f4c6f636b526571756573742850726f6f66526571756573742072657175657374815260408201602960f81b9052610ac0613f4c565b90610ac9613f96565b8d610ad2613fdb565b610ada614095565b610ae2613ec5565b91610aeb6140e2565b94604051978897602089019a5180918c5e880160208101918783528051926020849201905e0160200185815281516020819301825e0184815281516020819301825e0183815281516020819301825e0182815281516020819301825e0190815281516020819301825e018d815203601f1981018252610b6a9082612671565b519020906040519060208201928352604082015260408152610b8d606082612671565b519020610b98615878565b90610ba2916152ef565b913690610bae926126ad565b610bb791615904565b610bc39195929561593e565b610bcc856145db565b96610968989196614f23565b638baa579f60e01b8a5260048afd5b610c09915060203d602011610c0f575b610c018183612671565b8101906144da565b5f610a5b565b503d610bf7565b6040513d8d823e3d90fd5b610c41610c38610c32368c8c6126ad565b88615904565b9092919261593e565b6001600160a01b03858116911614610a7457638baa579f60e01b8a5260048afd5b8480fd5b8280fd5b503461026a578060031936011261026a57604051908060025490610c8d82612be6565b8085529160018116908115610d3d5750600114610cf3575b610cef84610cb581860382612671565b6040519182917f000000000000000000000000000000000000000000000000000000000000000083526040602084015260408301906124fe565b0390f35b600281525f80516020615b9b833981519152939250905b808210610d2357509091508101602001610cb582610ca5565b919260018160209254838588010152019101909291610d0a565b60ff191660208087019190915292151560051b85019092019250610cb59150839050610ca5565b503461026a57602036600319011261026a5761096860043533614de9565b503461026a57602036600319011261026a576020610da1600435613cb6565b6040519015158152f35b503461026a57602036600319011261026a576020906001600160601b03906040906001600160a01b03610ddc6123d1565b16815260018452205460601c16604051908152f35b503461026a57610cef610e12610e0636612790565b95949094939193613c7a565b60405191829182612522565b503461026a57602036600319011261026a57604060e091600435815280602052208054906001600160601b0360026001830154920154916040519360018060a01b03811685526001600160401b038160a01c16602086015262ffffff81871c16604086015260f81c6060850152818116608085015260601c1660a083015260c0820152f35b503461026a57610968610eb53661237e565b91610ec081356149df565b90610ecd858583866144fa565b610ed6846145db565b9690953395614f23565b503461026a57606036600319011261026a5780610efb6123d1565b6044356001600160401b038111610f8557610f1a903690600401612351565b6001600160a01b0390921691823b15610f8057610f5392849283604051809681958294636691f64760e01b845260243560048501612b84565b03925af18015610f7557610f645750f35b81610f6e91612671565b61026a5780f35b6040513d84823e3d90fd5b505050fd5b5050fd5b503461026a578060031936011261026a5750610cef604051610fac604082612671565b60058152640352e302e360dc1b60208201526040519182916020835260208301906124fe565b503461026a578060031936011261026a5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461026a578060031936011261026a57602060405161c3508152f35b503461026a578060031936011261026a576020604051611d4c8152f35b503461026a5761105636612701565b969095919490936001600160a01b039092169190823b15610c625791611097939185809460405196879586948593636691f64760e01b855260048501612b84565b03925af18015610f75576110b4575b610cef610e12868686613967565b6110bf828092612671565b61026a57806110a6565b503461026a578060031936011261026a575f80516020615bfb833981519152546040516001600160a01b039091168152602090f35b503461026a578060031936011261026a575f80516020615c3b833981519152541580611210575b156111d35761117790611136613ce3565b9061113f613db0565b906020611185604051936111538386612671565b8385525f368137604051968796600f60f81b885260e08589015260e08801906124fe565b9086820360408801526124fe565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b8281106111bc57505050500390f35b8351855286955093810193928101926001016111ad565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b505f80516020615c9b8339815191525415611125565b503461026a57602036600319011261026a57611263602091604061124b6004356149df565b6001600160a01b039091168352600185529120614a19565b90506040519015158152f35b503461026a57610cef610e1261128436612790565b95949094939193613c38565b503461026a5760a036600319011261026a576004358160443560ff811680910361083e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610c6657829160e48392604051948593849263d505accf60e01b84523360048501523060248501528960448501526024356064850152608484015260643560a484015260843560c48401525af161133f575b506109688233614de9565b8161134991612671565b61083e57815f611334565b503461026a57602036600319011261026a576004356113716147bb565b30825260016020526001600160601b03604083205460601c166001600160601b0361139b8361478a565b16116114aa576113d16113ad8261478a565b30845260016020526001600160601b03604085209181835460601c16031690612b9b565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561149f578391611470575b5015611461576040519081527ff0ed97f7b968f9d8268bc8d104a11b3586ceeadd0e0af5f73769e2b479f9d0ae60203092a280f35b6312171d8360e31b8252600482fd5b611492915060203d602011611498575b61148a8183612671565b810190612bce565b5f61142c565b503d611480565b6040513d85823e3d90fd5b63112fed8b60e31b825230600452602482fd5b503461026a576114cc36612701565b969095919490936001600160a01b039092169190823b15610c62579161150d939185809460405196879586948593636691f64760e01b855260048501612b84565b03925af18015610f755761152a575b610cef610e12868686613b7c565b611535828092612671565b61026a578061151c565b503461026a578060031936011261026a575f80516020615cbb83398151915254336001600160a01b03909116036115795761096833614d7e565b63118cdaa760e01b815233600452602490fd5b503461026a578060031936011261026a576115a56147bb565b5f80516020615cbb83398151915280546001600160a01b03199081169091555f80516020615bfb8339815191528054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461026a57602036600319011261026a576020906001600160601b03906040906001600160a01b0361163c6123d1565b16815260018452205416604051908152f35b503461026a57602036600319011261026a5760043561166b6147bb565b30825260016020526001600160601b036040832054166001600160601b036116928361478a565b16116114aa576116a18161478a565b30835260016020526001600160601b03806040852092818454160316166001600160601b03198254161790558180808084335af16116dd613bcf565b5015611461576040519081527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560203092a280f35b503461026a57602036600319011261026a576004606060406020938335815280855220600260405191611744836125d6565b805460018060a01b03811684526001600160401b038160a01c168785015262ffffff8160e01c16604085015260f81c848401526001600160601b0360018201548181166080860152851c1660a0840152015460c082015201511615156040519015158152f35b503461026a578060031936011261026a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461026a57610cef610e1261180436612581565b91613b7c565b503461026a578060031936011261026a576020611825615878565b604051908152f35b503461026a578060031936011261026a57602090604051908152f35b503461026a578060031936011261026a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036118a15760206040515f80516020615c5b8339815191528152f35b63703e46dd60e11b8152600490fd5b50604036600319011261026a576118c56123d1565b906024356001600160401b03811161083e576118e59036906004016126e3565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611a77575b50611a68576119276147bb565b6040516352d1902d60e01b8152926001600160a01b0381169190602085600481865afa80958596611a34575b5061196c57634c9c8ce360e01b84526004839052602484fd5b9091845f80516020615c5b8339815191528103611a225750813b15611a10575f80516020615c5b83398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a281518390156119f657808360206119f295519101845af46119ec613bcf565b91615b3c565b5080f35b50505034611a015780f35b63b398979f60e01b8152600490fd5b634c9c8ce360e01b8452600452602483fd5b632a87526960e21b8552600452602484fd5b9095506020813d602011611a60575b81611a5060209383612671565b81010312610c625751945f611953565b3d9150611a43565b63703e46dd60e11b8252600482fd5b5f80516020615c5b833981519152546001600160a01b0316141590505f61191a565b503461026a57610cef610e12611aae36612581565b91613967565b503461026a57602036600319011261026a57600435611af5611ad5826149df565b6001600160a01b0390911680855260016020526040852090929190614a19565b5015611e1557818352826020526040832060405190611b13826125d6565b805460018060a01b03811683526001600160401b038160a01c16602084015262ffffff8160e01c16604084015260f81c60608301526001810154600260808401926001600160601b03831684526001600160601b0360a086019360601c168352015460c08401526004606084015116611e01576001606084015116611ded576001600160401b03611ba3846149bd565b16421115611dc45784865260208690526040862080546001600160f81b03811660f891821c60041790911b6001600160f81b031916178155869060029082600182015501556001600160601b03815116611d4c810290808204611d4c1490151715611db057611c276001600160601b039392612710611c2c9304948591511661393a565b61478a565b936002606060018060a01b038651169501511615155f14611d4c57505060018060a01b03821685526001602052611c7d60408620611c77856001600160601b03835460601c16613947565b90612b9b565b60405163a9059cbb60e01b815261dead60048201526024810182905291602083604481897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611d41577f79ca7c80cf57b513ffdf8aa37ec70e40757f5e0d35219241860bb4b4c2fa7616946060946001600160601b0392611d24575b5060405193845216602083015260018060a01b03166040820152a280f35b611d3c9060203d6020116114985761148a8183612671565b611d06565b6040513d88823e3d90fd5b9092506001600160601b0330933088526001602052611d7860408920611c778885835460601c16613947565b511690865260016020526001600160601b03611d9b604088209282845416613947565b166001600160601b0319825416179055611c7d565b634e487b7160e01b87526011600452602487fd5b6044866001600160401b0387611dd9876149bd565b9063079c66ab60e41b845260045216602452fd5b631cfdeebb60e01b86526004859052602486fd5b633231064d60e11b86526004859052602486fd5b63d2be005d60e01b83526004829052602483fd5b503461026a57602036600319011261026a5760043590611e4882613cb6565b1561090d57604081602093611ec9935280845220600260405191611e6b836125d6565b805460018060a01b03811684526001600160401b038160a01c168685015262ffffff8160e01c16604085015260f81c60608401526001600160601b036001820154818116608086015260601c1660a0840152015460c08201526149bd565b6001600160401b0360405191168152f35b507f514a642174f202700c54726383c13321326925ff87df30f0bfbf49d9adfc41a6611f053661237e565b9291909234611f3f575b611f3960405192839260408452611f296040850183613752565b9184830360208601523596612b64565b0390a280f35b611f47613e5d565b611f0f565b503461026a57610968611f5e36612581565b91612e21565b503461026a57611f733661242b565b9a93969297909960018060a09b949b9897981b031691823b15610c625791611fb6939185809460405196879586948593636691f64760e01b855260048501612b84565b03925af18015610f7557611fd7575b610cef610e128a8a8a8a8a8a8a613c7a565b611fe2828092612671565b61026a5780611fc5565b503461026a57602036600319011261026a57610968600435336147ee565b503461026a57602036600319011261026a576004356001600160401b03811161083e5761203b903690600401612351565b6120469291926147bb565b6001600160401b03811161210157612063816104b6600254612be6565b81601f82116001146120965781908394612090949261053d5750508160011b915f199060031b1c19161790565b60025580f35b60028352601f198216935f80516020615b9b83398151915291845b8681106120e957508360019596106120d0575b505050811b0160025580f35b01355f19600384901b60f8161c191690555f80806120c4565b909260206001819286860135815501940191016120b1565b634e487b7160e01b82526041600452602482fd5b503461026a57602036600319011261026a5760043533825260016020526001600160601b03604083205460601c166001600160601b036121548361478a565b16116122395761218a6121668261478a565b33845260016020526001600160601b03604085209181835460601c16031690612b9b565b60405163a9059cbb60e01b815233600482015260248101829052602081604481866001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561149f57839161221a575b5015611461576040519081527ff0ed97f7b968f9d8268bc8d104a11b3586ceeadd0e0af5f73769e2b479f9d0ae60203392a280f35b612233915060203d6020116114985761148a8183612671565b5f6121e5565b63112fed8b60e31b825233600452602482fd5b503461026a578060031936011261026a576020604051620186a08152f35b346122f3576122783661242b565b97999598909691959294929091906001600160a01b0316803b156122f3576122ba9a5f80946040519d8e9586948593636691f64760e01b855260048501612b84565b03925af19687156122e857610cef98610e12986122d8575b50613c38565b5f6122e291612671565b5f6122d2565b6040513d5f823e3d90fd5b5f80fd5b346122f35761230e6123083661237e565b91612a9c565b005b346122f3575f3660031901126122f3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9181601f840112156122f3578235916001600160401b0383116122f357602083818601950101116122f357565b9060406003198301126122f3576004356001600160401b0381116122f35761016081840360031901126122f35760040191602435906001600160401b0382116122f3576123cd91600401612351565b9091565b600435906001600160a01b03821682036122f357565b35906001600160a01b03821682036122f357565b9181601f840112156122f3578235916001600160401b0383116122f3576020808501948460051b0101116122f357565b60e06003198201126122f3576004356001600160a01b03811681036122f35791602435916044356001600160401b0381116122f3578161246d91600401612351565b929092916064356001600160401b0381116122f3578161248f916004016123fb565b929092916084356001600160401b0381116122f357816124b1916004016123fb565b9290929160a4356001600160401b0381116122f357816124d3916004016123fb565b9290929160c435906001600160401b0382116122f35760809082900360031901126122f35760040190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b602081016020825282518091526040820191602060408360051b8301019401925f915b83831061255457505050505090565b9091929394602080612572600193603f1986820301875289516124fe565b97019301930191939290612545565b60406003198201126122f3576004356001600160401b0381116122f357816125ab916004016123fb565b92909291602435906001600160401b0382116122f35760809082900360031901126122f35760040190565b60e081019081106001600160401b038211176125f157604052565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b038211176125f157604052565b608081019081106001600160401b038211176125f157604052565b604081019081106001600160401b038211176125f157604052565b606081019081106001600160401b038211176125f157604052565b90601f801991011681019081106001600160401b038211176125f157604052565b6001600160401b0381116125f157601f01601f191660200190565b9291926126b982612692565b916126c76040519384612671565b8294818452818301116122f3578281602093845f960137010152565b9080601f830112156122f3578160206126fe933591016126ad565b90565b60a06003198201126122f3576004356001600160a01b03811681036122f35791602435916044356001600160401b0381116122f3578161274391600401612351565b929092916064356001600160401b0381116122f35781612765916004016123fb565b92909291608435906001600160401b0382116122f35760809082900360031901126122f35760040190565b60806003198201126122f3576004356001600160401b0381116122f357816127ba916004016123fb565b929092916024356001600160401b0381116122f357816127dc916004016123fb565b929092916044356001600160401b0381116122f357816127fe916004016123fb565b92909291606435906001600160401b0382116122f35760809082900360031901126122f35760040190565b35906001600160601b03821682036122f357565b35906001600160e01b0319821682036122f357565b35906001600160401b03821682036122f357565b359063ffffffff821682036122f357565b91908260e09103126122f35760405161288f816125d6565b60c080829480358452602081013560208501526128ae60408201612852565b60408501526128bf60608201612866565b60608501526128d060808201612866565b60808501526128e160a08201612866565b60a08501520135910152565b9190610160838203126122f3576040519061290782612605565b81938035835260208101356001600160401b0381116122f35781018083039060a082126122f357604080519261293c84612620565b82358452601f1901126122f3576040516129558161263b565b612961602083016123e7565b815261296f60408301612829565b6020820152602083015260608101356001600160401b0381116122f35781016040818603126122f357604051916129a58361263b565b813560028110156122f35783526020820135926001600160401b0384116122f3576129d7876129e795608095016126e3565b602082015260408501520161283d565b6060820152602084015260408101356001600160401b0381116122f357810182601f820112156122f35782816020612a21933591016126ad565b604084015260608101356001600160401b0381116122f3578101916040838203126122f35760405192612a538461263b565b803560028110156122f35784526020810135926001600160401b0384116122f357608094612a8784612a97968895016126e3565b6020820152606087015201612877565b910152565b91823591600160c01b831615612b4357612ac29260201c6001600160a01b0316846144fa565b905b6040612b01611c27612af1612ad8856145db565b90506001600160401b0342911610946080369101612877565b6001600160401b034216906146a6565b6001600160601b03825191612b1583612656565b60018352602083018590521691018190526001607f1b9115612b3d576001607e1b5b1717905d565b5f612b37565b505050612b5e612b566109fd36846128ed565b610a0e615878565b90612ac4565b908060209392818452848401375f828201840152601f01601f1916010190565b6040906126fe949281528160208201520191612b64565b80546bffffffffffffffffffffffff60601b191660609290921b6bffffffffffffffffffffffff60601b16919091179055565b908160209103126122f3575180151581036122f35790565b90600182811c92168015612c14575b6020831014612c0057565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612bf5565b601f8111612c2a575050565b60025f5260205f20906020601f840160051c83019310612c64575b601f0160051c01905b818110612c59575050565b5f8155600101612c4e565b9091508190612c45565b6001600160401b0381116125f15760051b60200190565b903590601e19813603018212156122f357018035906001600160401b0382116122f357602001918160061b360383136122f357565b9190811015612cca5760061b0190565b634e487b7160e01b5f52603260045260245ffd5b3561ffff811681036122f35790565b9190811015612cca5760051b81013590609e19813603018212156122f3570190565b903590601e19813603018212156122f357018035906001600160401b0382116122f3576020019181360383136122f357565b805115612cca5760200190565b8051821015612cca5760209160051b010190565b6020815260406020612d7e8451838386015260608501906124fe565b93015191015290565b903590601e19813603018212156122f357018035906001600160401b0382116122f3576020019160608202360383136122f357565b356001600160a01b03811681036122f35790565b359061ffff821682036122f357565b91908260609103126122f357604051612df781612656565b6040612a97818395612e0881612dd0565b8552612e16602082016123e7565b602086015201612829565b61ffff82116136ea57612e3382612c6e565b90612e416040519283612671565b828252601f19612e5084612c6e565b01366020840137612e6083612c6e565b90612e6e6040519283612671565b838252601f19612e7d85612c6e565b013660208401376040850193612e938587612c85565b90505f5b8181106136305750505f5b8181106131a8575050505090612eba612ed1926148c0565b90612ec86020850185612d87565b93909185612c85565b612ee060608796939601612dbc565b9160405193612eee85612620565b612ef782612c6e565b91612f056040519384612671565b80835260606020840191028201913683116122f357905b82821061318e575050508352612f3181612c6e565b94612f3f6040519687612671565b818652602086019160061b8101903682116122f357915b81831061314f575050506020820193845260408201928352606082019060018060a01b031681526040519260208401946020865260c08501935193608060408701528451809152602060e087019501905f5b81811061310a575050505192603f19858203016060860152602080855192838152019401905f5b8181106130da5750509051608085015250516001600160a01b031660a0830152819003601f19810182526020925f92909161300a9082612671565b604051918291518091835e8101838152039060025afa156122e8575f51907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169061305d9080612d0f565b9091803b156122f3575f92613091926040519586948593849363ab750e7560e01b8552606060048601526064850191612b64565b907f00000000000000000000000000000000000000000000000000000000000000006024840152604483015203915afa80156122e8576130ce5750565b5f6130d891612671565b565b8251805161ffff1687526020908101516001600160e01b0319168188015260409096019590920191600101612fcf565b8251805161ffff1688526020818101516001600160a01b0316818a01526040918201516001600160601b03169189019190915260609097019690920191600101612fa8565b6040833603126122f357602060409182516131698161263b565b61317286612dd0565b815261317f83870161283d565b83820152815201920191612f56565b602060609161319d3685612ddf565b815201910190612f1c565b6131b3818385612ced565b9060205f6131c46060850185612d0f565b908160405192839283378101838152039060025afa156122e8575f515f60806040516131ef81612605565b8281528260208201526040516132048161263b565b83815283602082015260408201528260608201520152604051906132278261263b565b5f82525f60208301526040519061323d8261263b565b8152602081015f815260205f600c6040516b1c9a5cd8cc0b93dd5d1c1d5d60a21b815260025afa156122e8576020915f918251915190516040519185830193845260408301526060820152600160f91b6080820152606281526132a1608282612671565b604051918291518091835e8101838152039060025afa156122e8575f51906040516132cb81612605565b6040850135815260208101907fa3acc27117418996340b84e5a90f3ef4c49d22c79e44aad822ec9c313e1eb8e282526040810192835260608101915f83526080820194855260205f60126040517172697363302e52656365697074436c61696d60701b815260025afa156122e8575f51925191519051945184515190600382101561361c57945160209081015160408051808401978852908101959095526060850193909352608084019690965260a08301949094526001600160f81b031960f894851b811660c0840152931b90921660c4830152600160fa1b60c883015260aa82525f916133bb60ca82612671565b604051918291518091835e8101838152039060025afa156122e8575f51604051906133e582612620565b828252602082019184358352604081019260208601358452606082019383855260809460566040516134178882612671565b81815275742c6279746573333220636c61696d4469676573742960501b606060208301927f4173736573736f72436f6d6d69746d656e742875696e7432353620696e64657884527f2c75696e743235362069642c627974657333322072657175657374446967657360408201520152209351925191519051916040519360208501958652604085015260608401528583015260a082015260a081526134bd60c082612671565b5190206134ca848a612d4e565b526134d58388612d4e565b516135885761352c937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135169190810190612d0f565b9490604051956135258761263b565b36916126ad565b84526020840152803b156122f35761355b925f916040518080968194631599ead560e01b835260048301612d62565b039161c350fa9182156122e857600192613578575b505b01612ea2565b5f61358291612671565b5f613570565b6135c4937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316926135169190810190612d0f565b84526020840152803b156122f3576135f3925f916040518080968194631599ead560e01b835260048301612d62565b03915afa9182156122e85760019261360c575b50613572565b5f61361691612671565b5f613606565b634e487b7160e01b5f52602160045260245ffd5b6020613646826136408a8c612c85565b90612cba565b013563ffffffff60e01b81168091036122f35761368b61368161ffff613679613674866136408f8f90612c85565b612cde565b168688612ced565b6080810190612d0f565b6004929192116122f35760016136c361ffff6136bc613674878f978f6136409163ffffffff60e01b90351699612c85565b1689612d4e565b528181036136d5575050600101612e97565b632e2ce35360e21b5f5260045260245260445ffd5b506377e4aa5360e11b5f5260045261ffff60245260445ffd5b9035603e19823603018112156122f3570190565b6002111561361c57565b9035601e19823603018112156122f35701602081359101916001600160401b0382116122f35781360383136122f357565b90813581526020820135609e19833603018112156122f35782016101606020830152803561016083015260018060a01b0361378f602083016123e7565b166101808301526001600160601b036137aa60408301612829565b166101a08301526137be6060820182613703565b9060a06101c084015281359160028310156122f3576137f761380a91846137e761384396613717565b6102008701526020810190613721565b6040610220870152610240860191612b64565b906001600160e01b0319906138219060800161283d565b166101e08401526138356040850185613721565b908483036040860152612b64565b6138506060840184613703565b8282036060840152803560028110156122f35761014092604061388785948461387b61389796613717565b84526020810190613721565b9190928160208201520191612b64565b936080810135608085015260a081013560a08501526001600160401b036138c060c08301612852565b1660c085015263ffffffff6138d760e08301612866565b1660e085015263ffffffff6138ef6101008301612866565b1661010085015263ffffffff6139086101208301612866565b16610120850152013591015290565b601f1981019190821161392657565b634e487b7160e01b5f52601160045260245ffd5b9190820391821161392657565b906001600160601b03809116911601906001600160601b03821161392657565b9291613974818386612e21565b61397d82612c6e565b9361398b6040519586612671565b828552601f1961399a84612c6e565b015f5b818110613b6b575050845f5b848110613b2c575050602082016139c08184612d87565b9390505f5b8481106139d457505050505050565b6139de8383612d87565b821015612cca576139f59036906060840201612ddf565b90613a0661ffff8351168887612ced565b916020613a1581850135614d34565b0151613b22576001600160601b03604060018060a01b036020840151169201511692613a446060820182612d0f565b94613a526080840184612d0f565b969091853b156122f35760405f8787613aa9839760019d613a9787519b8c9a8b998a9763a12da43f60e01b895201356004880152606060248801526064870191612b64565b84810360031901604486015291612b64565b0393f19081613b12575b50613b0b577f5c5960582bfc7a494183b4e9a66bfe8ecffc07a83a48d136e732400f7b98bf5090613ae2613bcf565b92613b01604051928392835260406020840152359460408301906124fe565b0390a25b016139c5565b5050613b05565b5f613b1c91612671565b5f613ab3565b5060019150613b05565b80613b4f613b3d6001938887612ced565b613b4960608801612dbc565b90614b2c565b613b598285612d4e565b52613b648184612d4e565b50016139a9565b806060602080938a0101520161399d565b82606092613b8c92959495613967565b92016001600160a01b03613b9f82612dbc565b165f5260016020526001600160601b0360405f20541680613bbe575050565b613bca6130d892612dbc565b6147ee565b3d15613bf9573d90613be082612692565b91613bee6040519384612671565b82523d5f602084013e565b606090565b9190811015612cca5760051b8101359061015e19813603018212156122f3570190565b90821015612cca576123cd9160051b810190612d0f565b919695949392905f5b818110613c5757505050506126fe939450613b7c565b80613c748a6123088387613c6e600197898c613bfe565b93613c21565b01613c41565b919695949392905f5b818110613c9957505050506126fe939450613967565b80613cb08a6123088387613c6e600197898c613bfe565b01613c83565b613cc2613cdf916149df565b6001600160a01b039091165f908152600160205260409020614a19565b5090565b604051905f825f80516020615bdb8339815191525491613d0283612be6565b8083529260018116908115613d915750600114613d26575b6130d892500383612671565b505f80516020615bdb8339815191525f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b818310613d755750509060206130d892820101613d1a565b6020919350806001915483858901015201910190918492613d5d565b602092506130d894915060ff191682840152151560051b820101613d1a565b604051905f825f80516020615c1b8339815191525491613dcf83612be6565b8083529260018116908115613d915750600114613df2576130d892500383612671565b505f80516020615c1b8339815191525f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b818310613e415750509060206130d892820101613d1a565b6020919350806001915483858901015201910190918492613e29565b613e663461478a565b335f5260016020526001600160601b03613e8760405f209282845416613947565b166001600160601b03198254161790556040513481527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60203392a2565b60405190613ed4608083612671565b605a82527f6c2c496e70757420696e7075742c4f66666572206f66666572290000000000006060837f50726f6f66526571756573742875696e743235362069642c526571756972656d60208201527f656e747320726571756972656d656e74732c737472696e6720696d616765557260408201520152565b60405190613f5b606083612671565b60268252654c696d69742960d01b6040837f43616c6c6261636b286164647265737320616464722c75696e7439362067617360208201520152565b60405190613fa5606083612671565b60218252602960f81b6040837f496e7075742875696e743820696e707574547970652c6279746573206461746160208201520152565b60405190613fea60c083612671565b6084825263616b652960e01b60a0837f4f666665722875696e74323536206d696e50726963652c75696e74323536206d60208201527f617850726963652c75696e7436342062696464696e6753746172742c75696e7460408201527f33322072616d705570506572696f642c75696e743332206c6f636b54696d656f60608201527f75742c75696e7433322074696d656f75742c75696e74323536206c6f636b537460808201520152565b604051906140a4606083612671565b602982526874657320646174612960b81b6040837f5072656469636174652875696e743820707265646963617465547970652c627960208201520152565b604051906140f1608083612671565b605382527274652c6279746573342073656c6563746f722960681b6060837f526571756972656d656e7473286279746573333220696d61676549642c43616c60208201527f6c6261636b2063616c6c6261636b2c507265646963617465207072656469636160408201520152565b614167613ec5565b61416f613f4c565b614177613f96565b90614180613fdb565b614188614095565b6141906140e2565b916040519485946020860197805160208192018a5e860160208101915f83528051926020849201905e016020015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815281516020819301825e015f815203601f19810182526142069082612671565b51902090805190602081015161421a6140e2565b614222613f4c565b61422a614095565b90604051918291602083019480516020819201875e830160208101915f83528051926020849201905e016020015f815281516020819301825e015f815203601f19810182526142799082612671565b51902090805190602081015161428d613f4c565b8051906020012090600160a01b6001900381511690602001516001600160601b0316604051916020830193845260408301526060820152606081526142d3608082612671565b5190209060408101516142e4614095565b80519060200120908051906142f882613717565b6020015180519060200120604051916020830193845261431781613717565b6040830152606082015260608152614330608082612671565b5190209063ffffffff60e01b90606001511691604051936020850195865260408501526060840152608083015260a082015260a0815261437160c082612671565b51902090604081015180519060200120606082015161438e613f96565b80519060200120908051906143a282613717565b602001518051906020012060405191602083019384526143c181613717565b60408301526060820152606081526143da608082612671565b51902091608001516143ea613fdb565b60405180602081019280516020819201855e8101602081015f905203602001601f198101825261441a9082612671565b5190209080519060208101519060408101516001600160401b0316606082015163ffffffff16608083015163ffffffff169160a084015163ffffffff169360c0015194604051966020880198895260408801526060870152608086015260a085015260c084015260e0830152610100820152610100815261449d61012082612671565b51902092604051946020860196875260408601526060850152608084015260a083015260c082015260c081526144d460e082612671565b51902090565b908160209103126122f357516001600160e01b0319811681036122f35790565b929161450c612b566109fd36876128ed565b9335600160c01b16156145a5579160209161453e93604051809581948293630b135d3f60e11b84528960048501612b84565b03916001600160a01b0316620186a0fa9081156122e8575f91614586575b506001600160e01b0319166374eca2c160e11b016145775790565b638baa579f60e01b5f5260045ffd5b61459f915060203d602011610c0f57610c018183612671565b5f61455c565b6145b76145bd916145c69436916126ad565b84615904565b9093919361593e565b6001600160a01b039081169116036145775790565b6145e9906080369101612877565b9081516020830151106146775763ffffffff606083015116608083019063ffffffff825116106146775763ffffffff90511660a083019063ffffffff82511610614677576146569063ffffffff6001600160401b0360406146498761530c565b9601511691511690614686565b9162ffffff6001600160401b0361466d8386614f03565b1611614677579190565b6341abc80160e01b5f5260045ffd5b906001600160401b03809116911601906001600160401b03821161392657565b9060408201906001600160401b0380835116911690811115614784576001600160401b036146d38461530c565b16811161477d576001600160401b03825116906001600160401b03614704606086019363ffffffff85511690614686565b16811115614716575050506020015190565b614743906001600160401b0363ffffffff614737602088015188519061393a565b9451169451169061393a565b925192818102918183041490151715613926578115614769570481018091116139265790565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b50505190565b6001600160601b0381116147a4576001600160601b031690565b6306dfcc6560e41b5f52606060045260245260445ffd5b5f80516020615bfb833981519152546001600160a01b031633036147db57565b63118cdaa760e01b5f523360045260245ffd5b9060018060a01b03821691825f5260016020526001600160601b0360405f2054166001600160601b036148208461478a565b16116148ad575f80808481946148358261478a565b88845260016020526001600160601b03806040862092818454160316166001600160601b03198254161790555af161486b613bcf565b501561489e5760207f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6591604051908152a2565b6312171d8360e31b5f5260045ffd5b8263112fed8b60e31b5f5260045260245ffd5b8051156146775760018151146149b45780515b600181116148e957506148e590612d41565b5190565b600181018082116139265760011c905f5b8160011c81106149485750600180821614614916575b506148d3565b5f1981019081116139265761492b9083612d4e565b515f198201828111613926576149419084612d4e565b525f614910565b600181901b906001600160ff1b0381168103613926576149688286612d4e565b51600183018093116139265761498060019387612d4e565b5190818110156149a5575f5260205260405f205b61499e8287612d4e565b52016148fa565b905f5260205260405f20614994565b6148e590612d41565b6126fe9062ffffff60406001600160401b036020840151169201511690614686565b906001600160c11b0319821661467757602082901c6001600160a01b03169163ffffffff1690565b6302000000821015612cca5701905f90565b63ffffffff821691906020831015614a6b576401fffffffe905460c01c9160011b169180830460021490151715613926576001600160401b03906003831b1616901c9060026001831615159216151590565b91614a769150613917565b908160011b91808304600214811517156139265760ff91614aa69160071c6001600160f81b031690600101614a07565b90549060031b1c9116906003821b16901c9060026001831615159216151590565b906126fe9160208152813560208201526020820135604082015260408201356060820152614b1a614b0f614afe6060850185613721565b60a0608086015260c0850191612b64565b926080810190613721565b9160a0601f1982860301910152612b64565b9190918035614b3a816149df565b60018060a01b0382165f526001602052614b578160405f20614a19565b919092614b676020870135614d34565b936020850151614cac5792867f3eb6e922886168616596d8bf7407911d08725b2cf3a578ddc363df13fe2f415795938a9388614c51975f14614ca3575f525f6020528860405f209660405197614bbc896125d6565b600281549160018060a01b0383168b526001600160401b038360a01c16928360208d015262ffffff8160e01c1660408d015260f81c60608c01526001600160601b0360018201548c608083831691015260601c1660a08c0152015460c08a01524211155f14614c945750614c2f966156d0565b955b8651614c56575b6040516001600160a01b03909116949091829182614ac7565b0390a3565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb35646040516020815280614c8c602082018b6124fe565b0390a1614c38565b614c9d97615492565b95614c31565b614c9d9661532f565b5050505050919250506040519063873fd26b60e01b6020830152602482015260248152614cda604482612671565b7f210e4fd706e561df48472433bcc50b4589f2c13e784e9992f4c3e6de26eb35646040516020815280614d1060208201856124fe565b0390a190565b60405190614d2382612656565b5f6040838281528260208201520152565b614d3c614d16565b505c614d46614d16565b506001600160601b0360405191614d5c83612656565b6001607f1b8116151583526001607e1b81161515602084015216604082015290565b5f80516020615cbb83398151915280546001600160a01b03199081169091555f80516020615bfb83398151915280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6040516323b872dd60e01b81526001600160a01b03918216600482018190523060248301526044820184905292917f000000000000000000000000000000000000000000000000000000000000000016906020905f9060649082855af19081601f3d1160015f5114161516614ef6575b5015614eba57602081614eb1614e8f7f1da2c4060997c108162f55c30ad2268924b069210f8c686ba302e1acc6909ccc9461478a565b855f5260018452611c7760405f20916001600160601b03835460601c16613947565b604051908152a2565b60405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606490fd5b3b153d171590505f614e59565b906001600160401b03809116911603906001600160401b03821161392657565b9590929796949360018060a01b031697885f526001602052614f488560405f20614a19565b906152db576152c7576001600160401b038616988942116152af57614f76611c27612af13660808c01612877565b96815f52600160205260405f20996001600160601b038b5416946001600160601b038a169384871061529d575060018060a01b031698895f52600160205260405f20906001600160601b03825460601c16966101408d013580981061528a57918d6001600160601b038061501c946150219897960316166001600160601b03198254161790556001600160601b0361500d8961478a565b81835460601c16031690612b9b565b614f03565b926001600160401b03841662ffffff811161527357506150409061478a565b6040519361504d856125d6565b88855260208086019c8d5262ffffff90911660408087019182525f60608801818152608089019687526001600160601b0390951660a0808a0191825260c08a019889528e35808452958390529290912097519e51925194519290911b67ffffffffffffffff60a01b166001600160a01b039e909e169d909d1760e09390931b62ffffff60e01b169290921760f89290921b6001600160f81b031916919091178455996001840191516001600160601b03166001600160601b03166001600160601b0319835416178255516001600160601b031661512991612b9b565b51906002015563ffffffff831692602084105f146151e4576401fffffffe9060011b1692808404600214901517156139265785546001600160c01b038116600190941b6001600160401b031660c091821c17901b6001600160c01b031916929092179094557f6f5de72b704dc2c15a0930f92bc5d83253c73358372a4fe4d004ec1a35d7569a936151df915b6151d16040519586958652606060208701526060860190613752565b918483036040860152612b64565b0390a2565b50916151ef90613917565b918260011b9583870460021484151715613926577f6f5de72b704dc2c15a0930f92bc5d83253c73358372a4fe4d004ec1a35d7569a966151df9461526e9260ff9160019161524b9160071c6001600160f81b0316908301614a07565b929093161b82548260031b1c179082549060031b91821b915f19901b1916179055565b6151b5565b6306dfcc6560e41b5f52601860045260245260445ffd5b8b63112fed8b60e31b5f5260045260245ffd5b63112fed8b60e31b5f5260045260245ffd5b898863cfe6a8fd60e01b5f523560045260245260445ffd5b86631cfdeebb60e01b5f523560045260245ffd5b8763a905765160e01b5f523560045260245ffd5b6042916040519161190160f01b8352600283015260228201522090565b6126fe9063ffffffff60806001600160401b036040840151169201511690614686565b95919694939060609680511561545f57604001516001600160601b031694615432575f80516020615bbb8339815191526153a09596979860018060a01b031693845f52600160205261538560405f209687615a27565b6040516001600160a01b039190911696879482919082614ac7565b0390a36001600160601b038254169084821061540657506001600160601b038481920316166001600160601b03198254161790555f5260016020526001600160601b036153f460405f209282845416613947565b166001600160601b0319825416179055565b949550505050506040519063112fed8b60e31b60208301526024820152602481526126fe604482612671565b955050505050915060405190631cfdeebb60e01b60208301526024820152602481526126fe604482612671565b50635502416760e01b5f5260045260245ffd5b906001600160601b03809116911603906001600160601b03821161392657565b92919397969490976060988051156156bd5760406001600160601b0391015116966001606086015116151580156156ad575b61567e571561562d575b50506001600160a01b03165f818152600160205260409020608092909201516001600160601b031685818111156155f8579061550991615472565b906001600160601b03835416906001600160601b03831682106155ca575082546bffffffffffffffffffffffff19169190036001600160601b03161790555b5f90815260208190526040812080546affffffffffffffffffffff60a01b81166001600160a01b0385169081176001600160a01b0319929092161760f890811c600290811790911b6001600160f81b031916919091178255015560018060a01b03165f5260016020526001600160601b036153f460405f209282845416613947565b9697505050505050506040519063112fed8b60e31b60208301526024820152602481526126fe604482612671565b6001600160601b03925061560f9061561892615472565b82845416613947565b166001600160601b0319825416179055615548565b6001600160a01b0383165f90815260016020526040902061564e9190615a27565b835f80516020615bbb8339815191526040518061567460018060a01b038a169582614ac7565b0390a35f806154ce565b5050505050929350505060405190631cfdeebb60e01b60208301526024820152602481526126fe604482612671565b50600260608601511615156154c4565b85635502416760e01b5f5260045260245ffd5b939190929695949660609760c0860151602085013580820361585f57505060016060870151161515801561584f575b61582157156157d4575b505082516001600160a01b03948516941684900390506157aa5760a06130d893926001600160601b03925f525f6020525f600260408220600160f81b60018060f81b03825416178155826001820155015582608082015116845f5260016020528361577b60405f209282845416613947565b168419825416179055015116905f526001602052611c7760405f20916001600160601b03835460601c16613947565b92935050506040519063a905765160e01b60208301526024820152602481526126fe604482612671565b6157f09160018060a01b03165f52600160205260405f20615a27565b815f80516020615bbb8339815191526040518061581660018060a01b0389169582614ac7565b0390a35f8080615709565b50505050929350505060405190631cfdeebb60e01b60208301526024820152602481526126fe604482612671565b50600260608701511615156156ff565b86637b54493160e01b5f5260045260245260445260645ffd5b61588061599e565b6158886159f5565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526144d460c082612671565b60ff5f80516020615c7b8339815191525460401c16156158f557565b631afcd79f60e31b5f5260045ffd5b81519190604183036159345761592d9250602082015190606060408401519301515f1a90615ac4565b9192909190565b50505f9160029190565b600481101561361c5780615950575050565b600181036159675763f645eedf60e01b5f5260045ffd5b60028103615982575063fce698f760e01b5f5260045260245ffd5b60031461598c5750565b6335e2f38360e21b5f5260045260245ffd5b6159a6613ce3565b80519081156159b6576020012090565b50505f80516020615c3b8339815191525480156159d05790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b6159fd613db0565b8051908115615a0d576020012090565b50505f80516020615c9b8339815191525480156159d05790565b9063ffffffff8116906020821015615a84576401fffffffe9060011b1690808204600214901517156139265781546001600160c01b038116600290921b6001600160401b031660c091821c17901b6001600160c01b031916179055565b50615a8e90613917565b8060011b9080820460021481151715613926576130d89260ff9160029161524b9160071c6001600160f81b031690600101614a07565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615b31579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156122e8575f516001600160a01b03811615615b2757905f905f90565b505f906001905f90565b5050505f9160039190565b90615b605750805115615b5157805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580615b91575b615b71575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15615b6956fe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace2682b2738d8666734f483aa3e081360183bbd5428f40ad104639f5961025142ba16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a164736f6c634300081a000a")]
     contract BoundlessMarket {
         constructor(address verifier, bytes32 assessorId, address stakeTokenContract) {}
             function initialize(address initialOwner, string calldata imageUrl) {}
@@ -9,7 +9,7 @@ alloy::sol! {
 }
 
 alloy::sol! {
-    #[sol(rpc, bytecode = "61016080604052346104cb576020816121ea803803809161002082856104cf565b8339810103126104cb57516001600160a01b038116908181036104cb5760405161004b6040826104cf565b600981526020810168486974506f696e747360b81b8152604051906100716040836104cf565b6009825268486974506f696e747360b81b6020830152604051926100966040856104cf565b6002845261048560f41b6020850152604051936100b46040866104cf565b60018552603160f81b60208601908152845190946001600160401b0382116103ce5760035490600182811c921680156104c1575b60208310146103b05781601f849311610453575b50602090601f83116001146103ed575f926103e2575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116103ce5760045490600182811c921680156103c4575b60208310146103b05781601f849311610342575b50602090601f83116001146102dc575f926102d1575b50508160011b915f199060031b1c1916176004555b61019281610623565b6101205261019f846107aa565b61014052519020918260e05251902080610100524660a0526040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815261020860c0826104cf565b5190206080523060c05281156102be57600980546001600160a01b03198116841790915561026392906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36104f2565b5061026c610568565b506040516118a790816108e3823960805181611228015260a051816112e5015260c051816111f2015260e051816112770152610100518161129d0152610120518161060c015261014051816106350152f35b631e4fbdf760e01b5f525f60045260245ffd5b015190505f80610174565b60045f9081528281209350601f198516905b81811061032a5750908460019594939210610312575b505050811b01600455610189565b01515f1960f88460031b161c191690555f8080610304565b929360206001819287860151815501950193016102ee565b60045f529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810191602085106103a6575b90601f859493920160051c01905b818110610398575061015e565b5f815584935060010161038b565b909150819061037d565b634e487b7160e01b5f52602260045260245ffd5b91607f169161014a565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610112565b60035f9081528281209350601f198516905b81811061043b5750908460019594939210610423575b505050811b01600355610127565b01515f1960f88460031b161c191690555f8080610415565b929360206001819287860151815501950193016103ff565b60035f529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191602085106104b7575b90601f859493920160051c01905b8181106104a957506100fc565b5f815584935060010161049c565b909150819061048e565b91607f16916100e8565b5f80fd5b601f909101601f19168101906001600160401b038211908210176103ce57604052565b6001600160a01b0381165f9081525f805160206121ca833981519152602052604090205460ff16610563576001600160a01b03165f8181525f805160206121ca83398151915260205260408120805460ff191660011790553391905f8051602061218a8339815191528180a4600190565b505f90565b5f80525f805160206121aa8339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf5460ff1661061f575f8080525f805160206121aa8339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf805460ff1916600117905533907f1c64e5e5a710fb0608449c7cd933acf9cf88b08f7bfa074e5c97e006d88247125f8051602061218a8339815191528280a4600190565b5f90565b908151602081105f1461069d575090601f81511161065d57602081519101516020821061064e571790565b5f198260200360031b1b161790565b604460209160405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b6001600160401b0381116103ce57600554600181811c911680156107a0575b60208210146103b057601f811161076d575b50602092601f821160011461070c57928192935f92610701575b50508160011b915f199060031b1c19161760055560ff90565b015190505f806106e8565b601f1982169360055f52805f20915f5b868110610755575083600195961061073d575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f808061072f565b9192602060018192868501518155019401920161071c565b60055f52601f60205f20910160051c810190601f830160051c015b81811061079557506106ce565b5f8155600101610788565b90607f16906106bc565b908151602081105f146107d5575090601f81511161065d57602081519101516020821061064e571790565b6001600160401b0381116103ce57600654600181811c911680156108d8575b60208210146103b057601f81116108a5575b50602092601f821160011461084457928192935f92610839575b50508160011b915f199060031b1c19161760065560ff90565b015190505f80610820565b601f1982169360065f52805f20915f5b86811061088d5750836001959610610875575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f8080610867565b91926020600181928685015181550194019201610854565b60065f52601f60205f20910160051c810190601f830160051c015b8181106108cd5750610806565b5f81556001016108c0565b90607f16906107f456fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610c455750806306fdde0314610ba0578063095ea7b314610b7a57806318160ddd14610b5d57806323b872dd14610b25578063248a9ca314610afa5780632738cf0814610ad15780632f2ff15d14610a93578063313ce56714610a785780633644e51514610a5657806336568abe14610a125780633dd1eb61146109e957806340c10f191461085357806342966c681461083657806369e2f0fb1461080d57806370a08231146107d6578063715018a61461077b578063732076d31461075457806379cc6790146107245780637ecebe00146106ec57806384b0196e146105f45780638da5cb5b146105cc57806391d148541461058357806395d89b41146104a1578063a217fddf14610487578063a9059cbb14610456578063b8f3c3071461042d578063d505accf146102ea578063d547741f146102a5578063dd62ed3e14610255578063f2fde38b146101a75763fe6d81241461017c575f80fd5b346101a3575f3660031901126101a35760206040515f805160206117db8339815191528152f35b5f80fd5b346101a35760203660031901126101a3576101c0610cbc565b6101c8610f9f565b6009546101dd906001600160a01b0316611407565b506101e7816110cb565b506101f0610f9f565b6001600160a01b0316801561024257600980546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b346101a35760403660031901126101a35761026e610cbc565b610276610cd2565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346101a35760403660031901126101a3576102e86004356102c4610cd2565b906102e36102de825f526008602052600160405f20015490565b6111b5565b611476565b005b346101a35760e03660031901126101a357610303610cbc565b61030b610cd2565b604435906064359260843560ff811681036101a35784421161041a576103df6103e89160018060a01b03841696875f52600760205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528a604084015260018060a01b038916606084015289608084015260a083015260c082015260c081526103ad60e082610da1565b5190206103b86111ef565b906040519161190160f01b83526002830152602282015260c43591604260a43592206116a3565b90929192611726565b6001600160a01b031684810361040357506102e893506115a6565b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b346101a35760203660031901126101a3576102e8610449610cbc565b610451610f9f565b611389565b346101a35760403660031901126101a35761047c610472610cbc565b6024359033610e9d565b602060405160018152f35b346101a3575f3660031901126101a35760206040515f8152f35b346101a3575f3660031901126101a3576040515f6004546104c181610ce8565b808452906001811690811561055f5750600114610501575b6104fd836104e981850382610da1565b604051918291602083526020830190610c98565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610545575090915081016020016104e96104d9565b91926001816020925483858801015201910190929161052d565b60ff191660208086019190915291151560051b840190910191506104e990506104d9565b346101a35760403660031901126101a35761059c610cd2565b6004355f52600860205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346101a3575f3660031901126101a3576009546040516001600160a01b039091168152602090f35b346101a3575f3660031901126101a3576106906106307f0000000000000000000000000000000000000000000000000000000000000000611609565b6106597f000000000000000000000000000000000000000000000000000000000000000061166c565b602061069e6040519261066c8385610da1565b5f84525f368137604051958695600f60f81b875260e08588015260e0870190610c98565b908582036040870152610c98565b4660608501523060808501525f60a085015283810360c08501528180845192838152019301915f5b8281106106d557505050500390f35b8351855286955093810193928101926001016106c6565b346101a35760203660031901126101a3576001600160a01b0361070d610cbc565b165f526007602052602060405f2054604051908152f35b346101a35760403660031901126101a3576102e8610740610cbc565b6024359061074f823383610dd7565b6114e7565b346101a3575f3660031901126101a35760206040515f8051602061187b8339815191528152f35b346101a3575f3660031901126101a357610793610f9f565b600980546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101a35760203660031901126101a3576001600160a01b036107f7610cbc565b165f525f602052602060405f2054604051908152f35b346101a35760203660031901126101a3576102e8610829610cbc565b610831610f9f565b61130b565b346101a35760203660031901126101a3576102e8600435336114e7565b346101a35760403660031901126101a35761086c610cbc565b335f9081525f805160206117bb8339815191526020526040902054602435919060ff16156109c5576001600160a01b031680156109b2575f80525f805160206117fb8339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf5460ff16158061098e575b61097f5760025482810180911161096b57600255805f525f60205260405f20828154019055805f5f8051602061183b8339815191526020604051868152a3805f525f6020526001600160601b0360405f20541161093c57005b805f525f60205260405f20549082820391821161096b5763538fd55b60e11b5f5260045260245260445260645ffd5b634e487b7160e01b5f52601160045260245ffd5b6325cdf54f60e21b5f5260045ffd5b505f8181525f805160206117fb833981519152602052604090205460ff16156108e3565b63ec442f0560e01b5f525f60045260245ffd5b63e2517d3f60e01b5f52336004525f805160206117db83398151915260245260445ffd5b346101a35760203660031901126101a3576102e8610a05610cbc565b610a0d610f9f565b61104b565b346101a35760403660031901126101a357610a2b610cd2565b336001600160a01b03821603610a47576102e890600435611476565b63334bd91960e11b5f5260045ffd5b346101a3575f3660031901126101a3576020610a706111ef565b604051908152f35b346101a3575f3660031901126101a357602060405160128152f35b346101a35760403660031901126101a3576102e8600435610ab2610cd2565b90610acc6102de825f526008602052600160405f20015490565b61113c565b346101a35760203660031901126101a3576102e8610aed610cbc565b610af5610f9f565b610fc6565b346101a35760203660031901126101a3576020610a706004355f526008602052600160405f20015490565b346101a35760603660031901126101a35761047c610b41610cbc565b610b49610cd2565b60443591610b58833383610dd7565b610e9d565b346101a3575f3660031901126101a3576020600254604051908152f35b346101a35760403660031901126101a35761047c610b96610cbc565b60243590336115a6565b346101a3575f3660031901126101a3576040515f600354610bc081610ce8565b808452906001811690811561055f5750600114610be7576104fd836104e981850382610da1565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610c2b575090915081016020016104e96104d9565b919260018160209254838588010152019101909291610c13565b346101a35760203660031901126101a3576004359063ffffffff60e01b82168092036101a357602091637965db0b60e01b8114908115610c87575b5015158152f35b6301ffc9a760e01b14905083610c80565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101a357565b602435906001600160a01b03821682036101a357565b90600182811c92168015610d16575b6020831014610d0257565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610cf7565b5f9291815491610d2f83610ce8565b8083529260018116908115610d845750600114610d4b57505050565b5f9081526020812093945091925b838310610d6a575060209250010190565b600181602092949394548385870101520191019190610d59565b915050602093945060ff929192191683830152151560051b010190565b90601f8019910116810190811067ffffffffffffffff821117610dc357604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b039081165f8181526001602081815260408084209587168452949052929020549392918401610e0e575b50505050565b828410610e7a578015610e67576001600160a01b03821615610e54575f52600160205260405f209060018060a01b03165f5260205260405f20910390555f808080610e08565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115610f8c576001600160a01b03169081156109b2575f8181525f805160206117fb833981519152602052604090205460ff161580610f68575b61097f57805f525f60205260405f2054838110610f4e5790838392825f525f6020520360405f2055815f525f60205260405f208481540190555f8051602061183b8339815191526020604051868152a3805f525f6020526001600160601b0360405f20541161093c575050565b915063391434e360e21b5f5260045260245260445260645ffd5b505f8281525f805160206117fb833981519152602052604090205460ff1615610ee1565b634b637e8f60e11b5f525f60045260245ffd5b6009546001600160a01b03163303610fb357565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b0381165f9081525f805160206117fb833981519152602052604090205460ff16611046576001600160a01b03165f8181525f805160206117fb83398151915260205260408120805460ff191660011790553391905f8051602061187b833981519152905f8051602061179b8339815191529080a4600190565b505f90565b6001600160a01b0381165f9081525f805160206117bb833981519152602052604090205460ff16611046576001600160a01b03165f8181525f805160206117bb83398151915260205260408120805460ff191660011790553391905f805160206117db833981519152905f8051602061179b8339815191529080a4600190565b6001600160a01b0381165f9081525f8051602061181b833981519152602052604090205460ff16611046576001600160a01b03165f8181525f8051602061181b83398151915260205260408120805460ff191660011790553391905f8051602061179b8339815191528180a4600190565b5f8181526008602090815260408083206001600160a01b038616845290915290205460ff166111af575f8181526008602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f8051602061179b8339815191529080a4600190565b50505f90565b5f81815260086020908152604080832033845290915290205460ff16156111d95750565b63e2517d3f60e01b5f523360045260245260445ffd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614806112e2575b1561124a577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a081526112dc60c082610da1565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614611221565b6001600160a01b0381165f9081525f805160206117bb833981519152602052604090205460ff1615611046576001600160a01b03165f8181525f805160206117bb83398151915260205260408120805460ff191690553391905f805160206117db833981519152905f8051602061185b8339815191529080a4600190565b6001600160a01b0381165f9081525f805160206117fb833981519152602052604090205460ff1615611046576001600160a01b03165f8181525f805160206117fb83398151915260205260408120805460ff191690553391905f8051602061187b833981519152905f8051602061185b8339815191529080a4600190565b6001600160a01b0381165f9081525f8051602061181b833981519152602052604090205460ff1615611046576001600160a01b03165f8181525f8051602061181b83398151915260205260408120805460ff191690553391905f8051602061185b8339815191528180a4600190565b5f8181526008602090815260408083206001600160a01b038616845290915290205460ff16156111af575f8181526008602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291905f8051602061185b8339815191529080a4600190565b9091906001600160a01b03168015610f8c575f8181525f805160206117fb833981519152602052604090205460ff161580611566575b61097f57805f525f60205260405f2054838110610f4e576020845f94955f8051602061183b833981519152938587528684520360408620558060025403600255604051908152a3565b505f80525f805160206117fb8339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf5460ff161561151d565b6001600160a01b0316908115610e67576001600160a01b0316918215610e545760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff811461164f5760ff811690601f8211611640576040519161162d604084610da1565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b5060405161166981611662816005610d20565b0382610da1565b90565b60ff81146116905760ff811690601f8211611640576040519161162d604084610da1565b5060405161166981611662816006610d20565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b03841161171b579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15611710575f516001600160a01b0381161561170657905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b60048110156117865780611738575050565b6001810361174f5763f645eedf60e01b5f5260045ffd5b6002810361176a575063fce698f760e01b5f5260045260245ffd5b6003146117745750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffdfe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dba682078eba37bca8662ade60eacd8e3fb6b879f4ad882618e7fd467572c020af0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc99f27e1ced449d0391672dfd8b33c5ac9642366ee4163605233bae574eb26e48c5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3eff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b1c64e5e5a710fb0608449c7cd933acf9cf88b08f7bfa074e5c97e006d8824712a164736f6c634300081a000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9f27e1ced449d0391672dfd8b33c5ac9642366ee4163605233bae574eb26e48c5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7")]
+    #[sol(rpc, bytecode = "61016080604052346104cb576020816120b0803803809161002082856104cf565b8339810103126104cb57516001600160a01b038116908181036104cb5760405161004b6040826104cf565b600981526020810168486974506f696e747360b81b8152604051906100716040836104cf565b6009825268486974506f696e747360b81b6020830152604051926100966040856104cf565b6002845261048560f41b6020850152604051936100b46040866104cf565b60018552603160f81b60208601908152845190946001600160401b0382116103ce5760035490600182811c921680156104c1575b60208310146103b05781601f849311610453575b50602090601f83116001146103ed575f926103e2575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116103ce5760045490600182811c921680156103c4575b60208310146103b05781601f849311610342575b50602090601f83116001146102dc575f926102d1575b50508160011b915f199060031b1c1916176004555b61019281610623565b6101205261019f846107aa565b61014052519020918260e05251902080610100524660a0526040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815261020860c0826104cf565b5190206080523060c05281156102be57600980546001600160a01b03198116841790915561026392906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36104f2565b5061026c610568565b5060405161176d90816108e38239608051816111cd015260a0518161128a015260c05181611197015260e0518161121c01526101005181611242015261012051816105f60152610140518161061f0152f35b631e4fbdf760e01b5f525f60045260245ffd5b015190505f80610174565b60045f9081528281209350601f198516905b81811061032a5750908460019594939210610312575b505050811b01600455610189565b01515f1960f88460031b161c191690555f8080610304565b929360206001819287860151815501950193016102ee565b60045f529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810191602085106103a6575b90601f859493920160051c01905b818110610398575061015e565b5f815584935060010161038b565b909150819061037d565b634e487b7160e01b5f52602260045260245ffd5b91607f169161014a565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610112565b60035f9081528281209350601f198516905b81811061043b5750908460019594939210610423575b505050811b01600355610127565b01515f1960f88460031b161c191690555f8080610415565b929360206001819287860151815501950193016103ff565b60035f529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191602085106104b7575b90601f859493920160051c01905b8181106104a957506100fc565b5f815584935060010161049c565b909150819061048e565b91607f16916100e8565b5f80fd5b601f909101601f19168101906001600160401b038211908210176103ce57604052565b6001600160a01b0381165f9081525f80516020612090833981519152602052604090205460ff16610563576001600160a01b03165f8181525f8051602061209083398151915260205260408120805460ff191660011790553391905f805160206120508339815191528180a4600190565b505f90565b5f80525f805160206120708339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf5460ff1661061f575f8080525f805160206120708339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf805460ff1916600117905533907f1c64e5e5a710fb0608449c7cd933acf9cf88b08f7bfa074e5c97e006d88247125f805160206120508339815191528280a4600190565b5f90565b908151602081105f1461069d575090601f81511161065d57602081519101516020821061064e571790565b5f198260200360031b1b161790565b604460209160405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b6001600160401b0381116103ce57600554600181811c911680156107a0575b60208210146103b057601f811161076d575b50602092601f821160011461070c57928192935f92610701575b50508160011b915f199060031b1c19161760055560ff90565b015190505f806106e8565b601f1982169360055f52805f20915f5b868110610755575083600195961061073d575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f808061072f565b9192602060018192868501518155019401920161071c565b60055f52601f60205f20910160051c810190601f830160051c015b81811061079557506106ce565b5f8155600101610788565b90607f16906106bc565b908151602081105f146107d5575090601f81511161065d57602081519101516020821061064e571790565b6001600160401b0381116103ce57600654600181811c911680156108d8575b60208210146103b057601f81116108a5575b50602092601f821160011461084457928192935f92610839575b50508160011b915f199060031b1c19161760065560ff90565b015190505f80610820565b601f1982169360065f52805f20915f5b86811061088d5750836001959610610875575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f8080610867565b91926020600181928685015181550194019201610854565b60065f52601f60205f20910160051c810190601f830160051c015b8181106108cd5750610806565b5f81556001016108c0565b90607f16906107f456fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610c9d5750806306fdde0314610bf8578063095ea7b314610bd257806318160ddd14610bb557806323b872dd14610ad5578063248a9ca314610aaa5780632738cf0814610a815780632f2ff15d14610a43578063313ce56714610a285780633644e51514610a0657806336568abe146109c25780633dd1eb611461099957806340c10f19146107f057806369e2f0fb146107c757806370a0823114610790578063715018a614610735578063732076d31461070e5780637ecebe00146106d657806384b0196e146105de5780638da5cb5b146105b657806391d148541461056d57806395d89b411461048b578063a217fddf14610471578063a9059cbb14610440578063b8f3c30714610417578063d505accf146102d4578063d547741f1461028f578063dd62ed3e1461023f578063f2fde38b146101915763fe6d812414610166575f80fd5b3461018d575f36600319011261018d5760206040515f805160206116c18339815191528152f35b5f80fd5b3461018d57602036600319011261018d576101aa610d14565b6101b2610f44565b6009546101c7906001600160a01b03166113ac565b506101d181611070565b506101da610f44565b6001600160a01b0316801561022c57600980546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b3461018d57604036600319011261018d57610258610d14565b610260610d2a565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461018d57604036600319011261018d576102d26004356102ae610d2a565b906102cd6102c8825f526008602052600160405f20015490565b61115a565b61141b565b005b3461018d5760e036600319011261018d576102ed610d14565b6102f5610d2a565b604435906064359260843560ff8116810361018d57844211610404576103c96103d29160018060a01b03841696875f52600760205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528a604084015260018060a01b038916606084015289608084015260a083015260c082015260c0815261039760e082610df9565b5190206103a2611194565b906040519161190160f01b83526002830152602282015260c43591604260a4359220611589565b9092919261160c565b6001600160a01b03168481036103ed57506102d2935061148c565b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b3461018d57602036600319011261018d576102d2610433610d14565b61043b610f44565b61132e565b3461018d57604036600319011261018d5761046661045c610d14565b6024359033610e2f565b602060405160018152f35b3461018d575f36600319011261018d5760206040515f8152f35b3461018d575f36600319011261018d576040515f6004546104ab81610d40565b808452906001811690811561054957506001146104eb575b6104e7836104d381850382610df9565b604051918291602083526020830190610cf0565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061052f575090915081016020016104d36104c3565b919260018160209254838588010152019101909291610517565b60ff191660208086019190915291151560051b840190910191506104d390506104c3565b3461018d57604036600319011261018d57610586610d2a565b6004355f52600860205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461018d575f36600319011261018d576009546040516001600160a01b039091168152602090f35b3461018d575f36600319011261018d5761067a61061a7f00000000000000000000000000000000000000000000000000000000000000006114ef565b6106437f0000000000000000000000000000000000000000000000000000000000000000611552565b6020610688604051926106568385610df9565b5f84525f368137604051958695600f60f81b875260e08588015260e0870190610cf0565b908582036040870152610cf0565b4660608501523060808501525f60a085015283810360c08501528180845192838152019301915f5b8281106106bf57505050500390f35b8351855286955093810193928101926001016106b0565b3461018d57602036600319011261018d576001600160a01b036106f7610d14565b165f526007602052602060405f2054604051908152f35b3461018d575f36600319011261018d5760206040515f805160206117418339815191528152f35b3461018d575f36600319011261018d5761074d610f44565b600980546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461018d57602036600319011261018d576001600160a01b036107b1610d14565b165f525f602052602060405f2054604051908152f35b3461018d57602036600319011261018d576102d26107e3610d14565b6107eb610f44565b6112b0565b3461018d57604036600319011261018d57610809610d14565b335f9081525f805160206116a18339815191526020526040902054602435919060ff1615610975576001600160a01b03168015610962575f80525f805160206116e18339815191526020527f01be3e6f97001cf116ea8f5cec42d044a10e897cbd383685b72e0237d0cef4bf5460ff16158061093e575b61092f5760025482810180911161091b57600255805f525f60205260405f20828154019055805f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051868152a3805f525f6020526001600160601b0360405f2054116108ec57005b805f525f60205260405f20549082820391821161091b5763538fd55b60e11b5f5260045260245260445260645ffd5b634e487b7160e01b5f52601160045260245ffd5b6325cdf54f60e21b5f5260045ffd5b505f8181525f805160206116e1833981519152602052604090205460ff1615610880565b63ec442f0560e01b5f525f60045260245ffd5b63e2517d3f60e01b5f52336004525f805160206116c183398151915260245260445ffd5b3461018d57602036600319011261018d576102d26109b5610d14565b6109bd610f44565b610ff0565b3461018d57604036600319011261018d576109db610d2a565b336001600160a01b038216036109f7576102d29060043561141b565b63334bd91960e11b5f5260045ffd5b3461018d575f36600319011261018d576020610a20611194565b604051908152f35b3461018d575f36600319011261018d57602060405160128152f35b3461018d57604036600319011261018d576102d2600435610a62610d2a565b90610a7c6102c8825f526008602052600160405f20015490565b6110e1565b3461018d57602036600319011261018d576102d2610a9d610d14565b610aa5610f44565b610f6b565b3461018d57602036600319011261018d576020610a206004355f526008602052600160405f20015490565b3461018d57606036600319011261018d57610aee610d14565b610af6610d2a565b6001600160a01b0382165f818152600160208181526040808420338552909152909120549193604435939290918101610b35575b506104669350610e2f565b838110610b9a578415610b87573315610b7457610466945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610b2a565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461018d575f36600319011261018d576020600254604051908152f35b3461018d57604036600319011261018d57610466610bee610d14565b602435903361148c565b3461018d575f36600319011261018d576040515f600354610c1881610d40565b80845290600181169081156105495750600114610c3f576104e7836104d381850382610df9565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610c83575090915081016020016104d36104c3565b919260018160209254838588010152019101909291610c6b565b3461018d57602036600319011261018d576004359063ffffffff60e01b821680920361018d57602091637965db0b60e01b8114908115610cdf575b5015158152f35b6301ffc9a760e01b14905083610cd8565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361018d57565b602435906001600160a01b038216820361018d57565b90600182811c92168015610d6e575b6020831014610d5a57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610d4f565b5f9291815491610d8783610d40565b8083529260018116908115610ddc5750600114610da357505050565b5f9081526020812093945091925b838310610dc2575060209250010190565b600181602092949394548385870101520191019190610db1565b915050602093945060ff929192191683830152151560051b010190565b90601f8019910116810190811067ffffffffffffffff821117610e1b57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b0316908115610f31576001600160a01b0316908115610962575f8181525f805160206116e1833981519152602052604090205460ff161580610f0d575b61092f57805f525f60205260405f2054838110610ef35790838392825f525f6020520360405f2055815f525f60205260405f208481540190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051868152a3805f525f6020526001600160601b0360405f2054116108ec575050565b915063391434e360e21b5f5260045260245260445260645ffd5b505f8281525f805160206116e1833981519152602052604090205460ff1615610e73565b634b637e8f60e11b5f525f60045260245ffd5b6009546001600160a01b03163303610f5857565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b0381165f9081525f805160206116e1833981519152602052604090205460ff16610feb576001600160a01b03165f8181525f805160206116e183398151915260205260408120805460ff191660011790553391905f80516020611741833981519152905f805160206116818339815191529080a4600190565b505f90565b6001600160a01b0381165f9081525f805160206116a1833981519152602052604090205460ff16610feb576001600160a01b03165f8181525f805160206116a183398151915260205260408120805460ff191660011790553391905f805160206116c1833981519152905f805160206116818339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611701833981519152602052604090205460ff16610feb576001600160a01b03165f8181525f8051602061170183398151915260205260408120805460ff191660011790553391905f805160206116818339815191528180a4600190565b5f8181526008602090815260408083206001600160a01b038616845290915290205460ff16611154575f8181526008602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f805160206116818339815191529080a4600190565b50505f90565b5f81815260086020908152604080832033845290915290205460ff161561117e5750565b63e2517d3f60e01b5f523360045260245260445ffd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480611287575b156111ef577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815261128160c082610df9565b51902090565b507f000000000000000000000000000000000000000000000000000000000000000046146111c6565b6001600160a01b0381165f9081525f805160206116a1833981519152602052604090205460ff1615610feb576001600160a01b03165f8181525f805160206116a183398151915260205260408120805460ff191690553391905f805160206116c1833981519152905f805160206117218339815191529080a4600190565b6001600160a01b0381165f9081525f805160206116e1833981519152602052604090205460ff1615610feb576001600160a01b03165f8181525f805160206116e183398151915260205260408120805460ff191690553391905f80516020611741833981519152905f805160206117218339815191529080a4600190565b6001600160a01b0381165f9081525f80516020611701833981519152602052604090205460ff1615610feb576001600160a01b03165f8181525f8051602061170183398151915260205260408120805460ff191690553391905f805160206117218339815191528180a4600190565b5f8181526008602090815260408083206001600160a01b038616845290915290205460ff1615611154575f8181526008602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291905f805160206117218339815191529080a4600190565b6001600160a01b0316908115610b87576001600160a01b0316918215610b745760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff81146115355760ff811690601f82116115265760405191611513604084610df9565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b5060405161154f81611548816005610d78565b0382610df9565b90565b60ff81146115765760ff811690601f82116115265760405191611513604084610df9565b5060405161154f81611548816006610d78565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411611601579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156115f6575f516001600160a01b038116156115ec57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b600481101561166c578061161e575050565b600181036116355763f645eedf60e01b5f5260045ffd5b60028103611650575063fce698f760e01b5f5260045260245ffd5b60031461165a5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffdfe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dba682078eba37bca8662ade60eacd8e3fb6b879f4ad882618e7fd467572c020af0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc99f27e1ced449d0391672dfd8b33c5ac9642366ee4163605233bae574eb26e48c5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b1c64e5e5a710fb0608449c7cd933acf9cf88b08f7bfa074e5c97e006d8824712a164736f6c634300081a000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9f27e1ced449d0391672dfd8b33c5ac9642366ee4163605233bae574eb26e48c5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7")]
     contract HitPoints {
         constructor(address initialOwner) payable {}
     }
diff --git a/crates/boundless-market/src/contracts/mod.rs b/crates/boundless-market/src/contracts/mod.rs
index de7e90dc0f..adc390bf7c 100644
--- a/crates/boundless-market/src/contracts/mod.rs
+++ b/crates/boundless-market/src/contracts/mod.rs
@@ -67,11 +67,10 @@ pub use boundless_market_contract::{
 #[cfg(not(target_os = "zkvm"))]
 pub mod token {
     use alloy::{
-        primitives::{Address, Signature},
+        primitives::{Signature, B256},
         signers::Signer,
         sol_types::SolStruct,
     };
-    use alloy_sol_types::eip712_domain;
     use anyhow::Result;
     use serde::Serialize;
 
@@ -103,6 +102,8 @@ pub mod token {
             error ERC20InvalidSpender(address spender);
             function approve(address spender, uint256 value) external returns (bool);
             function balanceOf(address account) external view returns (uint256);
+            function symbol() external view returns (string memory);
+            function decimals() external view returns (uint8);
         }
     }
 
@@ -115,22 +116,27 @@ pub mod token {
     }
 
     impl Permit {
-        /// Signs the [Permit] with the given signer and EIP-712 domain derived from the given
-        /// contract address and chain ID.
+        /// Signs the [Permit] with the given signer and EIP-712 domain separator.
+        ///
+        /// The content to be signed is the hash of the magic bytes 0x1901
+        /// concatenated with the domain separator and the `hashStruct` result:
+        /// `keccak256("\x19\x01" ‖ domainSeparator ‖ hashStruct(permit))`
         pub async fn sign(
             &self,
             signer: &impl Signer,
-            contract_addr: Address,
-            chain_id: u64,
+            domain_separator: B256,
         ) -> Result<Signature> {
-            let domain = eip712_domain! {
-                name: "HitPoints",
-                version: "1",
-                chain_id: chain_id,
-                verifying_contract: contract_addr,
-            };
-            let hash = self.eip712_signing_hash(&domain);
-            Ok(signer.sign_hash(&hash).await?)
+            let struct_hash = self.eip712_hash_struct();
+            let prefix: &[u8] = &[0x19, 0x01];
+            let signing_bytes = prefix
+                .iter()
+                .chain(domain_separator.as_slice())
+                .chain(struct_hash.as_slice())
+                .cloned()
+                .collect::<Vec<u8>>();
+            let signing_hash = alloy::primitives::keccak256(signing_bytes);
+
+            Ok(signer.sign_hash(&signing_hash).await?)
         }
     }
 }
diff --git a/crates/boundless-market/src/deployments.rs b/crates/boundless-market/src/deployments.rs
index be6d720f8a..bec94d493d 100644
--- a/crates/boundless-market/src/deployments.rs
+++ b/crates/boundless-market/src/deployments.rs
@@ -40,7 +40,7 @@ pub struct Deployment {
     /// Address of the [RiscZeroVerifierRouter] contract.
     ///
     /// The verifier router implements [IRiscZeroVerifier]. Each network has a canonical router,
-    /// that is deployed by the core team. You can additionall deploy and manage your own verifier
+    /// that is deployed by the core team. You can additionally deploy and manage your own verifier
     /// instead. See the [Boundless docs for more details].
     ///
     /// [RiscZeroVerifierRouter]: https://github.com/risc0/risc0-ethereum/blob/main/contracts/src/RiscZeroVerifierRouter.sol
@@ -83,6 +83,7 @@ impl Deployment {
     pub const fn from_chain(chain: NamedChain) -> Option<Deployment> {
         match chain {
             NamedChain::Sepolia => Some(SEPOLIA),
+            NamedChain::Base => Some(BASE),
             _ => None,
         }
     }
@@ -104,3 +105,13 @@ pub const SEPOLIA: Deployment = Deployment {
     stake_token_address: Some(address!("0xe5321cF13B07Bf6f6dD621E85E45C8e28adedCc9")),
     order_stream_url: Some(Cow::Borrowed("https://eth-sepolia.beboundless.xyz")),
 };
+
+/// [Deployment] for the Base mainnet.
+pub const BASE: Deployment = Deployment {
+    chain_id: Some(NamedChain::Base as u64),
+    boundless_market_address: address!("0x581C7e8018f0888364c698f97F64eB069723131F"),
+    verifier_router_address: Some(address!("0x95345209e34a7043ac5D92e82a35b63FFa088A20")),
+    set_verifier_address: address!("0xa8DB64c92c5E113984C790dDA91789132114BAda"),
+    stake_token_address: Some(address!("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")),
+    order_stream_url: Some(Cow::Borrowed("https://base-mainnet.beboundless.xyz")),
+};
diff --git a/infra/indexer/Pulumi.staging.yaml b/infra/indexer/Pulumi.staging.yaml
index 2fdd1c124f..c6e5810d93 100644
--- a/infra/indexer/Pulumi.staging.yaml
+++ b/infra/indexer/Pulumi.staging.yaml
@@ -3,10 +3,10 @@ encryptedkey: AQICAHhnm/1/W7/xeF2uxmXOGjFzOf6jjMX+KgbMb0K+LSCbsAHtr8teNb0/7Lg/Tm
 config:
   aws:region: us-west-2
   indexer:BASE_STACK: organization/bootstrap/services-staging
-  indexer:BOUNDLESS_ADDRESS: 0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16
+  indexer:BOUNDLESS_ADDRESS: 0x7b36Ed56ec6045679C178205a81AE878d85B773d
   indexer:DOCKER_DIR: ../../
   indexer:DOCKER_TAG: latest
-  indexer:START_BLOCK: "8361293"
+  indexer:START_BLOCK: "8430932"
   indexer:ETH_RPC_URL:
     secure: v1:4pKxXVXfnrSPsGgZ:f4+sIlT5tyYGsvuH/qIWeycuGVqRgi4yUczU1iRUf5CjHSOA7d+o16mSwq++gDJ8GEPpkXi1RHP/DWU9HNKUTllP6iSfkyX0eT1kvwo06Im8ezIjBg==
   indexer:RDS_PASSWORD:
diff --git a/infra/order-generator/Pulumi.staging.yaml b/infra/order-generator/Pulumi.staging.yaml
index 6d44707e47..42bf9167ec 100644
--- a/infra/order-generator/Pulumi.staging.yaml
+++ b/infra/order-generator/Pulumi.staging.yaml
@@ -11,8 +11,8 @@ config:
   order-generator-base:SLACK_ALERTS_TOPIC_ARN: arn:aws:sns:us-west-2:968153779208:boundless-alerts-topic
   order-generator-base:PAGERDUTY_ALERTS_TOPIC_ARN: arn:aws:sns:us-west-2:968153779208:boundless-pagerduty-topic
   order-generator-base:BASE_STACK: organization/bootstrap/services-staging
-  order-generator-base:BOUNDLESS_MARKET_ADDR: 0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16
-  order-generator-base:SET_VERIFIER_ADDR: 0xEf0A93B2310d52358F1eCA0C946aD7D25596e7dd
+  order-generator-base:BOUNDLESS_MARKET_ADDR: 0x7b36Ed56ec6045679C178205a81AE878d85B773d
+  order-generator-base:SET_VERIFIER_ADDR: 0x7aAB646f23D1392d4522CFaB0b7FB5eaf6821d64
   order-generator-base:DOCKER_DIR: ../../
   order-generator-base:DOCKER_TAG: latest
   order-generator-base:LOG_LEVEL: info
diff --git a/infra/order-stream/Pulumi.staging.yaml b/infra/order-stream/Pulumi.staging.yaml
index 25c4d5afa5..2c00e85282 100644
--- a/infra/order-stream/Pulumi.staging.yaml
+++ b/infra/order-stream/Pulumi.staging.yaml
@@ -3,7 +3,7 @@ encryptedkey: AQICAHhnm/1/W7/xeF2uxmXOGjFzOf6jjMX+KgbMb0K+LSCbsAHtr8teNb0/7Lg/Tm
 config:
   aws:region: us-west-2
   order-stream:BASE_STACK: organization/bootstrap/services-staging
-  order-stream:BOUNDLESS_ADDRESS: 0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16
+  order-stream:BOUNDLESS_ADDRESS: 0x7b36Ed56ec6045679C178205a81AE878d85B773d
   order-stream:BYPASS_ADDRS: 0x821Abe5Dfa67c08af9a67C344C3b2651F7960136
   order-stream:DOCKER_DIR: ../../
   order-stream:DOCKER_TAG: latest
diff --git a/infra/prover/Pulumi.staging.yaml b/infra/prover/Pulumi.staging.yaml
index 44d23ef508..7f76dfb08d 100644
--- a/infra/prover/Pulumi.staging.yaml
+++ b/infra/prover/Pulumi.staging.yaml
@@ -3,8 +3,8 @@ encryptedkey: AQICAHhnm/1/W7/xeF2uxmXOGjFzOf6jjMX+KgbMb0K+LSCbsAGwxtZQaXmuKc6n1f
 config:
   aws:region: us-west-2
   base-prover:DOCKER_DIR: "../../"
-  base-prover:SET_VERIFIER_ADDR: 0xad2c6335191EA71Ffe2045A8d54b93A851ceca77
-  base-prover:BOUNDLESS_MARKET_ADDR: 0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16
+  base-prover:SET_VERIFIER_ADDR: 0x7aAB646f23D1392d4522CFaB0b7FB5eaf6821d64
+  base-prover:BOUNDLESS_MARKET_ADDR: 0x7b36Ed56ec6045679C178205a81AE878d85B773d
   base-prover:ORDER_STREAM_URL:
     secure: v1:vFbwPj9LyBtHmeEa:QUPhb7T6oHXwEhydaXIOIw/dttiHus9nlpl2HarpY08/kPTM7APec8dnCWrSLJqmiUC/URv5swvFuoKg38nVQwNGR9N16uAHkZIODjadW1uKchEysg==
   base-prover:DOCKER_TAG: latest
diff --git a/infra/slasher/Pulumi.staging.yaml b/infra/slasher/Pulumi.staging.yaml
index f5dfae1af7..a6662b21e4 100644
--- a/infra/slasher/Pulumi.staging.yaml
+++ b/infra/slasher/Pulumi.staging.yaml
@@ -4,7 +4,7 @@ config:
   slasher:PRIVATE_KEY:
     secure: v1:3efkipLM4idAlwaJ:zL3IFTwgobXL0/UB8myW8kA9QZlXJTkRLUQ6O40/jbF6VDQ1gTEFP2oOpzCuCjsR+3ZiaYHzJSe3AB0Ej6bIahODR0llzAF+RpzcB/tmz2U=
   slasher:BASE_STACK: organization/bootstrap/services-staging
-  slasher:BOUNDLESS_MARKET_ADDR: 0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16
+  slasher:BOUNDLESS_MARKET_ADDR: 0x7b36Ed56ec6045679C178205a81AE878d85B773d
   slasher:DOCKER_DIR: ../../
   slasher:DOCKER_TAG: latest
   slasher:INTERVAL: "60"


Reviews:
user: login: willpote
body: We need to update this file also: https://github.com/boundless-xyz/boundless/blob/willpote/alarms-fixes-0526/crates/boundless-market/src/deployments.rs#L98

I also wonder if it would be nicer if the CLI used this to figure out the currency rather than having if/else statements. We're going to migrate Sep to USDC, then eventually migrate USDC to stake token, and would be nice if this was just a config update in `deployments.rs`
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-26T17:05:29Z
user: login: capossele
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T14:02:32Z
user: login: capossele
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T14:05:46Z
user: login: willpote
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T21:34:21Z
user: login: willpote
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T21:40:14Z
user: login: capossele
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T21:43:26Z

Review comments:
diff_hunk: @@ -46,19 +46,65 @@ assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeif5523ugt54zotjpiq
 name = "Ethereum Sepolia [staging]"
 id = 11155111
 etherscan-url = "https://sepolia.etherscan.io/"
-version = "v0.7.0"
+version = "v0.10.0"
 
 # Accounts
 admin = "0x0466ACfc0F27bBA9fBB7A8508f576527e81E83Bd"
 
 # Contracts
 verifier = "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187"
-set-verifier = "0xad2c6335191EA71Ffe2045A8d54b93A851ceca77"
-# deployed at block 8038641
-boundless-market = "0x2d124b86179F0De2d5B7A75E4dcD7e35a3363B16"
-stake-token = "0xe5321cF13B07Bf6f6dD621E85E45C8e28adedCc9"
+set-verifier = "0x7aAB646f23D1392d4522CFaB0b7FB5eaf6821d64"
+# deployed at block 8430932
+boundless-market = "0x7b36Ed56ec6045679C178205a81AE878d85B773d"
+stake-token = "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238"
 
 # Guests info
-deployment-commit = "04ee417aa0cac149a0962125e44e899acb3122f4" # v0.7.0
+deployment-commit = "918934a418b00cce8524caf7a061e058cc945451" # v0.10.0 main
+assessor-image-id = "0xff686da102e474eb25c50f5f7446d832a22e06da99dc692fd2fa94eea56040a9"
+assessor-guest-url = "https://gateway.pinata.cloud/ipfs/bafybeieou3q7djwsatlqnuerppne7ppprzvhwm7eggnzrayrznhrq6bvcm"
+
+###
+
+[chains.base-mainnet]
+name = "Base Mainnet"
+id = 8453
+etherscan-url = "https://basescan.org/"
+version = "v0.9.0-rc.1"
+
+# Accounts
+admin = "0x0466ACfc0F27bBA9fBB7A8508f576527e81E83Bd"
+
+# Contracts
+verifier = "0x95345209e34a7043ac5D92e82a35b63FFa088A20"
+set-verifier = "0xa8DB64c92c5E113984C790dDA91789132114BAda"
+# deployed at block 
+boundless-market = "0x581C7e8018f0888364c698f97F64eB069723131F"
+stake-token = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
path: contracts/deployment.toml
user: login: capossele
body: This is only temporary, until we do a new deployment
created_at: 2025-05-29T14:02:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,3 +105,13 @@ pub const SEPOLIA: Deployment = Deployment {
     stake_token_address: Some(address!("0xe5321cF13B07Bf6f6dD621E85E45C8e28adedCc9")),
     order_stream_url: Some(Cow::Borrowed("https://eth-sepolia.beboundless.xyz")),
 };
+
+/// [Deployment] for the Base mainnet.
+pub const BASE: Deployment = Deployment {
+    chain_id: Some(NamedChain::Base as u64),
+    boundless_market_address: address!("0x581C7e8018f0888364c698f97F64eB069723131F"),
+    verifier_router_address: Some(address!("0x95345209e34a7043ac5D92e82a35b63FFa088A20")),
+    set_verifier_address: address!("0xa8DB64c92c5E113984C790dDA91789132114BAda"),
+    stake_token_address: Some(address!("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")),
+    order_stream_url: Some(Cow::Borrowed("https://base-mainnet.beboundless.xyz")),
path: crates/boundless-market/src/deployments.rs
user: login: capossele
body: Temporary values
created_at: 2025-05-29T14:05:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -699,7 +698,8 @@ contract BoundlessMarket is
             accounts[client].balance += lock.price;
         }
 
-        ERC20Burnable(STAKE_TOKEN_CONTRACT).burn(burnValue);
+        ERC20(STAKE_TOKEN_CONTRACT).transfer(address(0xdEaD), burnValue);
+        (burnValue);
path: contracts/src/BoundlessMarket.sol
user: login: willpote
body: Needed?
created_at: 2025-05-29T21:40:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -699,7 +698,8 @@ contract BoundlessMarket is
             accounts[client].balance += lock.price;
         }
 
-        ERC20Burnable(STAKE_TOKEN_CONTRACT).burn(burnValue);
+        ERC20(STAKE_TOKEN_CONTRACT).transfer(address(0xdEaD), burnValue);
+        (burnValue);
path: contracts/src/BoundlessMarket.sol
user: login: capossele
body: USDC does not support burn afair
created_at: 2025-05-29T21:43:26Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-26T13:17:32Z
body: 🚀 Documentation Preview

Deployment URL: https://boundless-documentation-4u0vnqzwc-risczero.vercel.app

_Updated at: 2025-05-26 13:17:32 UTC_
author_association: NONE
user: login: linear[bot]
created_at: 2025-05-29T14:12:35Z
body: <p><a href="https://linear.app/risczero/issue/BM-974/deploy-to-base-sepolia-using-usdc">BM-974 Deploy to Base Sepolia using USDC</a></p>
author_association: NONE
user: login: linear[bot]
created_at: 2025-05-29T14:14:16Z
body: <p><a href="https://linear.app/risczero/issue/BM-989/deploy-to-base-sepolia-deploy-usdc-stake-version-to-eth-sepolia">BM-989 Deploy to Base Sepolia, Deploy USDC stake version to Eth Sepolia</a></p>
author_association: NONE