From e53c3968e2caa5b6cef391d28d71115fe175bef3 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Sun, 4 Jan 2026 20:49:12 -0600 Subject: [PATCH 01/27] chore: sync hive --- .hive/issues.jsonl | 5 +++++ .hive/memories.jsonl | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 .hive/issues.jsonl create mode 100644 .hive/memories.jsonl diff --git a/.hive/issues.jsonl b/.hive/issues.jsonl new file mode 100644 index 0000000..5bc66e4 --- /dev/null +++ b/.hive/issues.jsonl @@ -0,0 +1,5 @@ +{"id":"cell-3rwh3f-mk0ju2wieyj","title":"Comparative Research: Solana vs EVM M-Extensions","description":"Research and analyze both Solana M-Extensions (current repo) and EVM M-Extensions (github.com/m0-foundation/evm-m-extensions) with focus on architectural similarities, differences, and cross-chain compatibility considerations","status":"open","priority":1,"issue_type":"epic","created_at":"2026-01-05T02:36:12.978Z","updated_at":"2026-01-05T02:36:12.978Z","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk0ju2wmj30","title":"Research Solana M-Extensions Architecture","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.982Z","updated_at":"2026-01-05T02:49:09.019Z","closed_at":"2026-01-05T02:49:09.019Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk0ju2wo0kc","title":"Research EVM M-Extensions Implementation","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.984Z","updated_at":"2026-01-05T02:49:10.021Z","closed_at":"2026-01-05T02:49:10.021Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk0ju2wps8w","title":"Analyze Audit Reports for Security Patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.985Z","updated_at":"2026-01-05T02:49:11.316Z","closed_at":"2026-01-05T02:49:11.316Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk0ju2wrukx","title":"Synthesize Comparative Analysis","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-05T02:36:12.987Z","updated_at":"2026-01-05T02:49:12.317Z","closed_at":"2026-01-05T02:49:12.317Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} diff --git a/.hive/memories.jsonl b/.hive/memories.jsonl new file mode 100644 index 0000000..d812c82 --- /dev/null +++ b/.hive/memories.jsonl @@ -0,0 +1,29 @@ +{"id":"mem-1112b12b6c4c7c76","information":"Solana M-Extensions - Part 2: State Accounts\n\nExtGlobalV2 structure:\n- admin (Pubkey): Config authority\n- pending_admin (Option): Two-step transfer\n- ext_mint, m_mint, m_earn_global_account (Pubkeys)\n- bump, m_vault_bump, ext_mint_authority_bump (u8)\n- yield_config (YieldConfig): Variant-specific state\n- wrap_authorities (Vec): Whitelist for wrap/unwrap\n\nYieldConfig variants:\n- NoYield: 1 byte (just variant tag)\n- ScaledUi: 25 bytes (variant + fee_bps + last_m_index + last_ext_index)\n- Crank: 57 bytes (variant + earn_authority + last_m_index + last_ext_index + timestamp)\n\nEarner (crank): Tracks per-user yield with last_claim_index, last_claim_timestamp, user, user_token_account, earn_manager, optional recipient_token_account.\n\nEarnManager (crank): Manages earner groups with is_active, fee_bps (0-10000), fee_token_account.\n\nAccount size formula: 8 + 32 + 33 + 96 + 3 + YieldConfig::space() + 4 + 32*wrap_authorities.len()","created_at":"2026-01-05T02:42:29.339Z","tags":"solana,m-extensions,state-management,accounts"} +{"id":"mem-1828176cd0619fb8","information":"JMIExtension - wrap() Implementation Details\n\n**Access**: onlySwapFacility modifier (msg.sender must be swapFacility immutable address)\n\n**Flow**:\n1. Validate asset (not 0x0, not mToken itself) - reverts InvalidAsset\n2. Validate recipient (not 0x0) - reverts InvalidRecipient \n3. Validate amount > 0 - reverts InsufficientAmount\n4. _beforeWrap checks: isAllowedToWrap (cap check), not paused, account/recipient not frozen\n5. Record balanceBefore = IERC20(asset).balanceOf(this)\n6. safeTransferFrom(swapFacility, this, amount) in asset decimals\n7. **Fee-on-Transfer Guard**: Compare balanceAfter - balanceBefore == amount, revert InsufficientAssetReceived if mismatch\n8. Convert to extension decimals: jmiAmount = amount / 10^(assetDecimals - 6) for high-decimal assets\n9. Validate jmiAmount > 0 (prevents truncation to zero)\n10. Update: assets[asset].balance += safe240(amount), totalAssets += jmiAmount\n11. Mint jmiAmount to recipient\n\n**Key**: Amount parameter is in asset's native decimals. Balance stored in asset decimals. totalAssets in extension decimals (6).","created_at":"2026-01-05T02:42:07.149Z","tags":"jmi,wrap,implementation,fee-on-transfer,decimal-conversion"} +{"id":"mem-1c8087e9416dd2c6","information":"Solana M-Extensions - Part 9: Gotchas and Edge Cases\n\n1. ScaledUi REQUIRES Token2022: Will fail InvalidTokenProgram if wrong program\n2. Vault must be thawed: Initialize fails if vault frozen (not yet approved earner by M0)\n3. Index sync is idempotent: Multiple txs can sync, last wins (no race issues)\n4. Fee precision loss: ScaledUi uses f64.powf(), loses ~10^-16 precision (acceptable)\n5. EarnManager fee opt-out: If fee_token_account closed, fee silently skipped (no revert)\n6. Double-claim prevention: Earner can't claim twice in same cycle (last_claim_index check)\n7. Shared wrap authorities: Same authorities for both wrap AND unwrap (not separate)\n8. M vault MUST be ATA: vault_m_token_account must be associated_token of m_vault PDA\n9. Swap whitelist required: ext_swap only works with whitelisted extensions\n10. Remaining accounts split: Swap requires correct split_idx or fails InvalidIndex\n\nRounding strategy: ALL conversions round DOWN in favor of protocol (prevents over-minting).\n\nOptional signers: wrap_authority and unwrap_authority can be None (falls back to token_authority).\n\nOrphaned earner cleanup: remove_orphaned_earner instruction handles stuck accounts.","created_at":"2026-01-05T02:43:32.241Z","tags":"solana,m-extensions,gotchas,edge-cases,best-practices"} +{"id":"mem-1cf41cafac0f7917","information":"Solana M-Extensions - Part 5: Crank Yield Distribution\n\nClaimFor instruction (earn_authority only):\n1. Validate earner.last_claim_index < global.last_ext_index (prevent double-claim)\n2. Calculate rewards: (snapshot_balance * global_index / last_claim_index) - snapshot_balance\n3. Validate collateralization: ext_supply + rewards <= principal_to_amount_down(vault_m_amount, m_index)\n4. Calculate EarnManager fee if active: fee = (rewards * fee_bps) / 10000 (rounded down)\n5. Mint fee to earn_manager_token_account (if exists, else skip)\n6. Mint (rewards - fee) to recipient_token_account or user_token_account\n7. Update earner.last_claim_index and last_claim_timestamp\n8. Emit RewardsClaim event\n\nEarnManager operations:\n- add_earner: Creates Earner account with current global index\n- remove_earner: Closes Earner account\n- transfer_earner: Moves to different manager\n- configure_earn_manager: Updates fee_bps\n\nDoS prevention: If fee_token_account closed, fee silently skipped (doesn't revert transaction).","created_at":"2026-01-05T02:42:52.399Z","tags":"solana,m-extensions,crank,yield,claim,earn-manager"} +{"id":"mem-2870afd93a575921","information":"JMIExtension Spec - Invariants & Edge Cases\n\n**Mandatory Invariants (from spec)**\n1. totalAssets ≤ totalSupply (always)\n - Maintained by paired state updates on wrap/replace\n2. totalAssets == Σ(asset balances in extension decimals)\n - Conversion functions ensure consistency\n\n**Implicit Invariants**\n1. mBalanceOf(this) ≥ mBacking (for unwrap to work)\n - Can break if replaceAssetWithM depletes $M too fast\n - Protected by isAllowedToUnwrap() check\n2. Cached balance ≥ Actual balance (for non-M assets)\n - Breaks on direct transfers (by design)\n\n**Critical Edge Cases**\n1. Truncation on high-decimal wraps\n - Wrapping 1 wei DAI → 0 JMI → reverts (InsufficientAmount)\n - Minimum wrap DAI: 1e12 (0.000001 DAI)\n\n2. Overflow on low-decimal scale-up\n - 4-decimal asset * 100 can overflow\n - Solidity 0.8.26 reverts on overflow\n\n3. Cap checked before conversion\n - Asset cap in asset's decimals, not extension decimals\n - Example: DAI cap of 1M checked as 1_000_000e18\n\n4. M backing exhaustion\n - Cannot unwrap if totalAssets == totalSupply (no M backing)\n - Requires solvers to replace assets with M\n\n5. Yield recipient change\n - Auto-claims pending yield for old recipient first\n - Prevents yield loss on recipient change\n\n**Solver Backend Requirements** (from spec)\n- Monitor AssetReplacedWithM events\n- Trigger when totalAssets high / M backing low\n- Acquire M, call replaceAssetWithM, receive collateral\n- Purpose: Convert non-M collateral → M for yield generation","created_at":"2026-01-04T21:48:40.688Z","tags":"m0,jmi,invariants,edge-cases,solver-integration"} +{"id":"mem-2cd05921967db163","information":"JMIExtension - setAssetCap() & Yield Management\n\n**setAssetCap(address asset, uint256 cap)**:\n- Access: ASSET_CAP_MANAGER_ROLE only\n- Validates asset != 0x0 and asset != mToken (M has no cap)\n- Cap in asset's native decimals (e.g., 1_000_000e18 for 1M DAI)\n- **Gas Optimization**: If assets[asset].decimals == 0, fetches IERC20(asset).decimals() and caches it. Subsequent calls skip this fetch.\n- Early return if cap unchanged\n- Emits AssetCapSet(asset, cap)\n\n**isAllowedToWrap(address asset, uint256 amount)**:\n- Returns false if amount == 0\n- M (primary asset): Always returns true (no cap)\n- Non-M assets: Returns assetCap(asset) >= (assetBalanceOf(asset) + amount)\n- Cap checked in asset's decimals BEFORE conversion to extension decimals\n\n**claimYield()** (inherited from MYieldToOne):\n- Calculates yield = mBalanceOf(this) - _mBacking() where _mBacking() = totalSupply - totalAssets\n- If yield > 0, mints yield to yieldRecipient\n- After claim: totalSupply increases, mBacking increases by same amount, yield resets to 0\n- Yield accrues automatically from M's rebasing nature, no manual sync needed\n\n**setYieldRecipient(address account)**:\n- Access: YIELD_RECIPIENT_MANAGER_ROLE only\n- CRITICAL: Calls claimYield() FIRST to claim pending yield for old recipient before switch\n- Prevents yield loss on recipient change\n- Reverts ZeroYieldRecipient if account == 0x0\n- Emits YieldRecipientSet(account)","created_at":"2026-01-05T02:42:58.806Z","tags":"jmi,setAssetCap,yield,claimYield,gas-optimization"} +{"id":"mem-306ee6b2a1887e89","information":"Analyzed liquidity-delivery/svm Solana Anchor project dependencies:\n\n**Core Dependencies (from Cargo.lock):**\n- anchor-lang: 0.31.1\n- anchor-spl: 0.31.1\n- solana-program: 2.2.1\n- agave packages (feature-set, precompiles, etc.): 3.0.8\n\n**Required Toolchain Versions:**\n- Rust: 1.88.0 (as specified in README)\n- Solana CLI: 2.2.1 (matches solana-program version in Cargo.lock)\n- Anchor CLI: 0.31.1 (must match anchor-lang version)\n\n**Key Finding:** The README already specifies correct versions, but the agave version (3.0.8) is implicitly tied to Solana 2.2.1. Users must have EXACT versions:\n- Rust 1.88.0\n- Solana/Agave 2.2.1\n- Anchor 0.31.1\n\n**Optional Dependencies:**\n- Node: 24.10.0 (mentioned in README, not currently used)\n- pnpm: 9.15.4 (package_manager in Anchor.toml, no package.json exists)\n\n**Current README Status:** Already comprehensive and accurate. Specifies all pinned versions correctly. Only minor improvement needed: clarify that agave 3.0.8 is bundled with Solana 2.2.1.","created_at":"2026-01-04T17:53:25.446Z","tags":"solana,anchor,rust,dependencies,version-pinning,build-requirements"} +{"id":"mem-33e2828bfb4def9e","information":"JMI Extension - Integration & Deployment\n\n## SwapFacility Integration\n- **Exclusive Gateway**: Only SwapFacility can call wrap/unwrap/replaceAssetWithM\n- Uses ISwapFacility.msgSender() to track original caller for hooks\n- User flow: User → SwapFacility → JMIExtension\n- SwapFacility handles M token approvals\n\n## M Token Integration \n- Implements IMTokenLike interface\n- Can toggle earning: enableEarning() / disableEarning()\n- Earning status affects yield accrual\n- Yield = mBalanceOf(this) - mBacking\n\n## Deployment Pattern\n- TransparentUpgradeableProxy\n- Constructor: sets immutables (mToken, swapFacility), disables initializers\n- Initialize: sets name, symbol, yieldRecipient, grants roles, sets initial caps\n\n## Testing Insights (from unit tests)\n- Fuzz tests: decimal conversions, cap boundaries, overflow scenarios\n- Mock assets: USDC (6 decimals), DAI (18), 4-decimal asset\n- Fee-on-transfer rejection verified\n- Inflation attack prevention tested\n- Safe240 overflow handling\n\n## Audits Available\n- Multiple audits in /audits/JMI/\n- Certora formal verification\n- ChainSecurity review","created_at":"2026-01-04T21:43:47.247Z","tags":"m0,jmi,deployment,testing,integration"} +{"id":"mem-35770db254617e4c","information":"Solana vs EVM M-Extensions - Architecture Comparison\n\n**Conceptual Equivalents:**\n- Program/Contract: Solana uses two programs (m_ext + ext_swap); EVM uses inheritance (JMIExtension → MYieldToOne → MExtension)\n- Global State: Solana uses ExtGlobalV2 PDA at [global] seed; EVM uses ERC-7201 namespaced storage at deterministic slots\n- Access Control: Solana uses has_one = admin constraints + wrap_authorities Vec; EVM uses 5-role OpenZeppelin AccessControl\n- Upgradeability: Solana uses anchor upgrade; EVM uses TransparentUpgradeableProxy\n- Yield Variants: Solana uses compile-time features (no-yield, scaled-ui, crank); EVM uses runtime inheritance\n\n**Platform Constraint Differences:**\n- Solana externalizes state to PDAs with explicit seeds; EVM uses contract storage\n- Solana requires rent-exemption (~1-2 SOL); EVM pays gas per operation\n- Solana composability via CPI; EVM via function calls\n- Solana two-program pattern (ext_swap delegates via CPI); EVM single contract with SwapFacility msgSender() delegation","created_at":"2026-01-05T02:47:43.108Z","tags":"solana,evm,m-extensions,architecture,comparison,cross-chain"} +{"id":"mem-40f6ec85ac0655a2","information":"Solana vs EVM M-Extensions - Wrap/Unwrap Mechanism Comparison\n\n**Solana Wrap Flow:**\n1. Validate signer in wrap_authorities whitelist\n2. sync_index() updates multiplier (ScaledUi: Token2022 extension; Crank: global state)\n3. Transfer M from user → m_vault\n4. Calculate ext_principal = m_amount * 1e12 / index (round DOWN)\n5. Mint ext_principal to user\n6. Verify: ext_supply + rewards <= vault_m_amount\n\n**EVM Wrap Flow:**\n1. Check cached balance: require(assetBalanceOf == assets[asset].balance)\n2. balanceBefore = mToken.balanceOf(address(this))\n3. safeTransferFrom(msg.sender, this, mAssetAmount)\n4. balanceAfter = mToken.balanceOf(address(this))\n5. Revert if balanceBefore + amount != balanceAfter (fee-on-transfer protection)\n6. Mint extension tokens (1:1 after decimal conversion)\n\n**Key Difference:** Solana uses index-based conversion with round-down; EVM uses balance validation with fee-on-transfer protection. Solana applies fee via ext_increase = m_increase^(1-fee); EVM doesn't have fee-on-transfer in M token.","created_at":"2026-01-05T02:47:50.808Z","tags":"solana,evm,m-extensions,wrap,unwrap,conversion,comparison"} +{"id":"mem-44324b6d5d81c4a4","information":"Cross-Chain Bridging for Solana-EVM M-Extensions\n\n**Fundamental Challenges:**\n1. Account model vs contract storage (explicit vs implicit context)\n2. Rent vs gas economics\n3. Index precision differences (u128 * 1e12 vs uint256 decimal conversion)\n4. Yield distribution (compile-time vs runtime)\n\n**Potential Bridging Points:**\n1. Canonical M Token Mapping: m_mint (Solana) ↔ mToken (EVM) with decimal normalization\n2. Extension Token Representation: ext_mint ↔ JMIExtension contract address\n3. State Synchronization: Index/multiplier sync, yield accumulation coordination\n4. Collateralization Verification: Cross-chain proof of reserves\n\n**Recommended Architecture:**\n- Lock-and-Mint Pattern: Lock ext tokens on source → Emit event → Relayer submits proof → Mint wrapped tokens on destination\n- Index Synchronization: Periodic oracle updates push Solana index → EVM state\n- Security: Rate limiting, emergency pause, validator set security critical\n- Invariant: sum(ext_supply_all_chains) <= sum(m_backing_all_chains)\n\n**Bridge Options:** Wormhole or LayerZero for message passing between Solana and EVM chains","created_at":"2026-01-05T02:48:06.190Z","tags":"cross-chain,bridging,solana,evm,m-extensions,wormhole,layerzero"} +{"id":"mem-71905a721f735005","information":"JMIExtension Specification - Core Design Patterns\n\n**Multi-Asset Collateral Model**\n- totalSupply = $M backing + totalAssets (non-M collateral)\n- $M backing calculated as: totalSupply - totalAssets \n- Yield = mBalance - $M backing\n\n**Decimal Conversion Rules** (Critical for correctness)\n- Always truncates down (rounds in protocol's favor)\n- DAI (18d) → JMI (6d): divides by 1e12 (loses up to 1e12-1 wei)\n- 4-decimal → JMI (6d): multiplies by 100 (can overflow)\n- USDC (6d) → JMI (6d): 1:1 exact\n\n**State Management**\n- Asset struct: cap (uint256), balance (uint240), decimals (uint8)\n- uint240 limit aligns with $M max supply\n- Decimals cached on first setAssetCap for gas efficiency\n- totalAssets tracks aggregate in extension decimals (6)\n\n**SwapFacility Trust Model**\n- Immutable address set in constructor\n- Only SwapFacility can call wrap/unwrap/replaceAssetWithM\n- JMI trusts SwapFacility for reentrancy, validation, user approvals\n- Single point of trust architecture\n\n**Yield Mechanism**\n- $M is rebasing token with continuous accrual\n- Yield auto-accrues without manual updates\n- claimYield() mints NEW JMI tokens to yieldRecipient\n- After claim: totalSupply increases, yield() resets to 0","created_at":"2026-01-04T21:48:22.933Z","tags":"m0,jmi,specification,design-patterns,decimal-conversion"} +{"id":"mem-729d932423b302b5","information":"JMI Extension - Security & Patterns\n\n## Key Security Features\n1. **Fee-on-Transfer Guard**: Checks balanceBefore vs balanceAfter, reverts if mismatch\n2. **Safe240 Casting**: Asset balances capped at uint240 max (aligns with M supply)\n3. **Inflation Protection**: replaceAssetWithM uses cached balance not actual\n4. **Reentrancy**: SwapFacility enforces via ReentrancyLock\n5. **Decimal Truncation**: Always rounds down to prevent excess minting\n6. **SwapFacility Exclusive**: ONLY SwapFacility can call wrap/unwrap/replace\n\n## Access Control Roles\n- ASSET_CAP_MANAGER_ROLE: setAssetCap(asset, cap)\n- YIELD_RECIPIENT_MANAGER_ROLE: setYieldRecipient(account) \n- FREEZE_MANAGER_ROLE: freeze/unfreeze accounts\n- PAUSER_ROLE: pause/unpause all user actions\n- DEFAULT_ADMIN_ROLE: grant/revoke roles\n\n## Critical Invariants\n1. totalSupply == mBacking + totalAssets\n2. yield = mBalance - mBacking (excess M)\n3. assetBalanceOf(asset) + amount <= assetCap(asset)\n\n## Common Gotchas\n- Truncation: 1 wei DAI wraps to 0 JMI (reverts)\n- Asset cap checked before conversion (in asset decimals)\n- Cannot unwrap if all backing is non-M assets\n- Direct asset transfers bypass accounting (use cached balance)","created_at":"2026-01-04T21:43:40.000Z","tags":"m0,jmi,security,solidity,access-control"} +{"id":"mem-75957c04ec1d3974","information":"PR Review Agent Structure: Use mode:subagent, temperature:0.1, write:false, edit:false, but ENABLE bash:true (needed for cargo clippy, cargo fmt --check, cargo test, anchor build). Review format: 1-Summary 2-Critical Issues (security MUST FIX) 3-Major Issues (logic bugs SHOULD FIX) 4-Minor Issues (quality improvements) 5-Positive Feedback 6-Tool Output. Project uses Anchor 0.31.1 with anchor-litesvm for tests, patterns: instructions/, state/, error.rs with #[error_code], constants.rs for magic numbers.","created_at":"2026-01-04T18:35:12.683Z","tags":"code-review,agent-config,pr-review,solana,anchor"} +{"id":"mem-77ddec869efa7b6c","information":"JMIExtension Storage Architecture (ERC-7201)\n\n**JMIExtensionStorageStruct** (slot 0x4717d46f2e033163981fa31651301a35281b6b08316965d315fd1577bad94b00):\n- mapping(address => Asset) assets with struct Asset { uint256 cap, uint240 balance, uint8 decimals }\n- uint256 totalAssets (aggregate non-M in extension decimals)\n\n**MYieldToOneStorageStruct** (slot 0xee2f6fc7e2e5879b17985791e0d12536cba689bda43c77b8911497248f4af100):\n- uint256 totalSupply\n- address yieldRecipient \n- mapping(address => uint256) balanceOf\n\n**Inheritance**: JMIExtension → MYieldToOne → MExtension → ERC20ExtendedUpgradeable + Freezable + Pausable\n\n**Immutables** (set in constructor, cannot change): mToken, swapFacility\n\nConstructor disables initializers on implementation contract. Deployed via TransparentUpgradeableProxy pattern.","created_at":"2026-01-05T02:41:55.108Z","tags":"jmi,erc7201,storage,architecture,upgradeable"} +{"id":"mem-7a5e732d21d67c9f","information":"Code Review Agent for Solana/Anchor: Available tools are CASS (session search), cargo clippy v0.1.88, rustfmt v1.8.0, Rust v1.88.0, Anchor v0.31.1. Agent should have bash:true to run linters and tests. Key focus: Solana security (account validation, signer checks, PDA validation, overflow protection), Anchor patterns (account constraints, space calc, CPI safety), Rust best practices (no unwrap, checked math, proper error handling). Common vulnerabilities: missing signer validation, integer overflow, unvalidated ownership, improper PDA seeds, missing status checks.","created_at":"2026-01-04T18:35:04.653Z","tags":"code-review,solana,anchor,rust,security,pr-review"} +{"id":"mem-7b3a8fb4267c764f","information":"Solana M-Extensions Program Architecture - Part 1: Core Overview\n\nM-Extensions implements wrapper tokens backed 1:1 by M0 $M stablecoin using Anchor 0.31.1 on Solana 2.1.0.\n\nTwo programs: m_ext (3C865D264L4NkAm78zfnDzQJJvXuU3fMjRUvRxyPi5da) and ext_swap (MSwapi3WhNKMUGm9YrxGhypgUEt7wYQH3ZgG32XoWzH).\n\nThree yield variants (compile-time features):\n- NoYield: All yield to admin\n- ScaledUi: Automatic rebasing via Token2022 ScaledUiAmount extension\n- Crank: Manual distribution via earn_authority with EarnManager/Earner hierarchy\n\nPDA patterns:\n- ExtGlobalV2: seeds=[b\"global\"] - main state\n- Mint Authority: seeds=[b\"mint_authority\"] - mints extension tokens\n- M Vault: seeds=[b\"m_vault\"] - holds collateral\n- Earner: seeds=[b\"earner\", user_token_account] - yield tracking (crank only)\n- EarnManager: seeds=[b\"earn_manager\", manager_pubkey] - manager state (crank only)\n\nDependencies: spl-token-2022 v7.0.0, earn program from m0-foundation/solana-m.","created_at":"2026-01-05T02:42:20.759Z","tags":"solana,m-extensions,architecture,pda,anchor"} +{"id":"mem-94392126876527a1","information":"JustMintIt (JMI) Extension Research - M0 Foundation\n\n**Repository**: https://github.com/m0-foundation/evm-m-extensions\n**Path**: src/projects/jmi/JMIExtension.sol\n\n## What JMI Solves\nJMI wraps yield-bearing $M token into non-rebasing ERC-20 with multi-asset collateral backing. Unlike other M extensions that only accept $M, JMI allows minting with approved stablecoins (USDC, DAI, etc.) assuming 1:1 peg. All yield flows to single recipient.\n\n## Architecture\nInheritance: JMIExtension → MYieldToOne → MExtension (base) + Freezable + Pausable\n\n**Storage (ERC-7201)**:\n- JMIExtensionStorageStruct: per-asset caps/balances/decimals + totalAssets\n- MYieldToOneStorageStruct: totalSupply, yieldRecipient, balanceOf mapping\n\n**Immutables**: mToken, swapFacility (set in constructor)\n\n## Core Minting Mechanism\n```solidity\nfunction wrap(address asset, address recipient, uint256 amount)\n```\n\nFlow:\n1. Check asset allowed via cap (isAllowedToWrap checks cap not reached)\n2. Transfer asset from SwapFacility to JMI contract\n3. Verify actual received == expected (prevents fee-on-transfer)\n4. Convert asset decimals → extension decimals (6) - always truncates down\n5. Update storage: assets[asset].balance += amount, totalAssets += jmiAmount\n6. Mint jmiAmount to recipient (1:1 in extension decimals)\n\n**Decimal Conversion**: DAI (18) → JMI (6) divides by 10^12. USDC (6) → JMI (6) is 1:1.\n\n## Asset Replacement\n```solidity\nfunction replaceAssetWithM(address asset, address recipient, uint256 amount)\n```\nM holders swap M for held collateral. Reduces totalAssets, increases M backing. Uses cached assetBalanceOf to prevent inflation attacks from direct transfers.","created_at":"2026-01-04T21:43:31.840Z","tags":"m0,jmi,solidity,evm,minting,collateral"} +{"id":"mem-99f901d3659c8895","information":"SwapFacility Integration - JMI Specifics\n\n**SwapFacility as Exclusive Gateway**:\n- Only SwapFacility contract can call wrap/unwrap/replaceAssetWithM on JMI\n- SwapFacility set as immutable in constructor, cannot be changed post-deployment\n- SwapFacility exposes msgSender() function to track original caller (user → SwapFacility → JMI)\n- JMI passes msgSender() to hooks (_beforeWrap, _beforeUnwrap) for freeze/pause checks on actual user\n\n**User Flow Examples**:\n1. Wrap USDC → JMI: User calls SwapFacility.swap(USDC, JMI, amount, recipient) → SwapFacility calls JMI.wrap(USDC, recipient, amount)\n2. Unwrap JMI → M: User calls SwapFacility.swapOutM(JMI, amount, recipient) → SwapFacility calls JMI.unwrap(recipient, amount)\n3. Replace DAI with M: Solver calls SwapFacility.replaceAssetWithM(DAI, MExtension, JMI, amount, recipient) → SwapFacility unwraps M from MExtension, calls JMI.replaceAssetWithM(DAI, recipient, amount)\n\n**SwapFacility Functions for JMI**:\n- swap(tokenIn, tokenOut, amount, recipient): General swap, supports asset → JMI or JMI → M paths\n- swapInM(extensionOut, amount, recipient): M → JMI (also works for wrapping M directly)\n- swapOutM(extensionIn, amount, recipient): JMI → M\n- replaceAssetWithM(asset, extensionIn, extensionOut, amount, recipient): Complex flow for solver-driven collateral replacement\n- All have *WithPermit variants for gasless approvals (EIP-2612)\n\n**Trust Model**: JMI fully trusts SwapFacility for reentrancy protection, user approvals, validation. Single point of trust architecture.","created_at":"2026-01-05T02:42:42.750Z","tags":"jmi,swapfacility,integration,user-flow,trust-model"} +{"id":"mem-adcd85dd16e398d5","information":"JMIExtension - replaceAssetWithM() Implementation\n\n**Access**: onlySwapFacility only\n**Parameters**: amount is in M decimals (6), NOT asset decimals\n\n**Flow**:\n1. Check not paused\n2. Validate asset (not 0x0, not mToken), recipient, amount > 0\n3. Convert M amount → asset amount: assetAmount = amount * 10^(assetDecimals - 6) for high-decimal\n4. Validate assetAmount > 0 (prevents truncation)\n5. Check cached balance: assets[asset].balance >= assetAmount (NOT IERC20(asset).balanceOf(this))\n6. Update: assets[asset].balance -= assetAmount, totalAssets -= amount\n7. Transfer amount of $M from swapFacility to this contract\n8. Transfer assetAmount of asset to recipient\n9. Emit AssetReplacedWithM(asset, assetAmount, recipient, amount)\n\n**Why Cached Balance**: Direct asset transfers bypass accounting. Cached balance prevents inflation attack: attacker sends asset directly, then calls replaceAssetWithM to extract excess.\n\n**Solver Use Case**: When totalAssets high / M backing low, solver acquires M, calls replaceAssetWithM via SwapFacility, receives collateral (USDC/DAI), JMI backing shifts from non-M → M for better yield.","created_at":"2026-01-05T02:42:18.507Z","tags":"jmi,replaceAssetWithM,solver,cached-balance,inflation-protection"} +{"id":"mem-cafb415402214246","information":"JMIExtension - Access Control & Roles\n\n**Roles** (OpenZeppelin AccessControl):\n- DEFAULT_ADMIN_ROLE: Grant/revoke other roles\n- ASSET_CAP_MANAGER_ROLE = keccak256(\"ASSET_CAP_MANAGER_ROLE\"): setAssetCap(asset, cap)\n- YIELD_RECIPIENT_MANAGER_ROLE = keccak256(\"YIELD_RECIPIENT_MANAGER_ROLE\"): setYieldRecipient(account)\n- FREEZE_MANAGER_ROLE (inherited Freezable): freeze/unfreeze accounts\n- PAUSER_ROLE (inherited Pausable): pause/unpause all user actions\n\n**Initialization**:\ninitialize() parameters: name, symbol, yieldRecipient, admin, assetCapManager, freezeManager, pauser, yieldRecipientManager\n- Grants DEFAULT_ADMIN_ROLE to admin\n- Grants ASSET_CAP_MANAGER_ROLE to assetCapManager (reverts ZeroAssetCapManager if 0x0)\n- Grants YIELD_RECIPIENT_MANAGER_ROLE to yieldRecipientManager (reverts ZeroYieldRecipientManager if 0x0)\n- Grants FREEZE_MANAGER_ROLE to freezeManager\n- Grants PAUSER_ROLE to pauser\n\n**onlySwapFacility Modifier**: All wrap/unwrap/replaceAssetWithM functions check msg.sender == swapFacility immutable. SwapFacility uses msgSender() to track original caller for hooks.","created_at":"2026-01-05T02:42:29.511Z","tags":"jmi,access-control,roles,openzeppelin,initialization"} +{"id":"mem-cc4fdf6e3f1f237f","information":"Solana M-Extensions - Part 7: Security Model\n\nAccess control hierarchy:\n1. Admin: transfer_admin, add/remove_wrap_authority, claim_fees, set_fee, set_earn_authority, add/remove_earn_manager\n2. Wrap Authority: wrap, unwrap\n3. Earn Authority (crank): sync, claim_for\n4. Earn Manager (crank): add/remove/transfer_earner, configure_earn_manager\n5. Earner (crank): set_recipient\n\nCritical validations:\n- Collateralization: ext_supply + rewards <= vault_m_amount (prevents over-minting)\n- Vault freeze: vault_m_token_account.state == Initialized (ensures earner approval)\n- Index monotonicity: new_m_index >= last_m_index >= last_ext_index >= 1e12\n- Fee bounds: fee_bps <= 10000 (100%)\n- Authority checks: wrap_authorities.contains(signer), earn_authority == signer\n\nTwo-step admin transfer: Prevents accidental admin loss via pending_admin.\n\nAuditors: Asymmetric Research, Adevar Labs, OtterSec, Halborn (5 audit reports in /audits).","created_at":"2026-01-05T02:43:09.020Z","tags":"solana,m-extensions,security,access-control,audits"} +{"id":"mem-ce10817154ce1f74","information":"Solana M-Extensions - Part 3: Wrap/Unwrap Mechanism\n\nWrap instruction (mint extension tokens):\n1. Validate signer in wrap_authorities\n2. sync_index() updates ext multiplier if needed\n3. Get current m_index and ext_index\n4. Convert: m_principal → m_amount (m_index) → ext_amount → ext_principal (ext_index)\n5. Transfer M tokens from user to vault (transfer_checked CPI)\n6. Mint Ext tokens to user (mint_to CPI with PDA signer)\n\nFormula: ext_principal = amount_to_principal_down(principal_to_amount_down(m_principal, m_index), ext_index)\n\nUnwrap instruction (burn extension tokens):\n1. Same auth and sync\n2. Convert: ext_principal → ext_amount → m_amount → m_principal\n3. Burn Ext tokens from user\n4. Transfer M tokens from vault to user (PDA signer)\n\nKey: All conversions round DOWN to prevent over-minting. Tokens stored as principal (rebasing-resistant), converted to amount for calculations.","created_at":"2026-01-05T02:42:36.332Z","tags":"solana,m-extensions,wrap,unwrap,conversion"} +{"id":"mem-cfe1512d7a2e4aba","information":"JMIExtension Spec - Security Model & Attack Mitigations\n\n**Fee-on-Transfer Protection**\n```solidity\nuint256 balanceBefore = asset.balanceOf(this);\nasset.transferFrom(swapFacility, this, amount);\nuint256 received = asset.balanceOf(this) - balanceBefore;\nif (received < amount) revert InsufficientAssetReceived(...);\n```\nPrevents accounting discrepancy from deflationary tokens.\n\n**Inflation Attack Mitigation**\n- Uses cached assets[].balance not actual balance\n- Direct transfers bypass accounting → stuck forever\n- replaceAssetWithM can't drain more than tracked balance\n- Spec explicitly warns: \"Assets sent directly are stuck\"\n\n**Safe240 Casting**\n- Asset balances capped at uint240 max\n- Aligns with $M ecosystem supply limit\n- Prevents overflow beyond M protocol constraints\n\n**Asset Cap Enforcement**\n- Checked on every wrap operation\n- Cap in asset's native decimals (before conversion)\n- Can be dynamically adjusted by ASSET_CAP_MANAGER_ROLE\n- Protects against over-concentration in single collateral\n\n**Pausability Scope**\n- Blocks: wrap, unwrap, transfer, replaceAssetWithM\n- Does NOT block: role management, view functions, yield calculations\n- Emergency stop for exploit scenarios\n\n**Freezing Mechanism**\n- Per-account sanctions/compliance tool\n- Frozen accounts cannot send, receive, wrap, unwrap\n- Independent from pausability (different scopes)","created_at":"2026-01-04T21:48:30.908Z","tags":"m0,jmi,security,attack-mitigation,access-control"} +{"id":"mem-d010955d4796a4cd","information":"Solana M-Extensions - Part 8: Token Extension Requirements\n\nFor Extension Mint:\n- MUST have freeze_authority (validated in Initialize)\n- ScaledUi variant: MUST use Token2022 with ScaledUiAmount extension\n- NoYield/Crank: Can use Token2022 OR legacy Token Program\n- CANNOT have transfer hooks or transfer tax (per README)\n- Mint authority MUST be PDA seeds=[b\"mint_authority\"]\n- ScaledUiAmount authority MUST match mint_authority PDA (if present)\n\nFor M Mint:\n- MUST use Token2022 (hardcoded checks)\n- Must have ScaledUiAmount extension (for index tracking)\n- Must have freeze authority (for earner permissioning)\n\nInitialize validation:\n- Checks ext_mint.supply == 0\n- Validates ext_mint decimals == m_mint decimals\n- For ScaledUi: Validates ext_token_program == Token2022 ID\n- For ScaledUi: Checks ScaledUiAmount extension exists\n- Validates vault_m_token_account is thawed (approved earner)\n- Validates wrap_authorities uniqueness (no duplicates)\n\nInitial indices: m_index from earn program, ext_index = 1e12 (1.0).","created_at":"2026-01-05T02:43:16.972Z","tags":"solana,m-extensions,token2022,extensions,validation"} +{"id":"mem-d698798b29e557b1","information":"Solana M-Extensions - Part 6: EXT_SWAP Program\n\nTwo-phase atomic swap (unwrap from_ext → wrap to_ext):\n\nPhase 1 - Unwrap:\n- Burns from_ext principal from user\n- CPI to from_ext_program.unwrap()\n- Transfers M from from_vault to swap_m_account\n- Records m_delta (actual amount received)\n\nPhase 2 - Wrap:\n- Uses exact m_delta from Phase 1\n- CPI to to_ext_program.wrap()\n- Transfers M from swap_m_account to to_vault\n- Mints to_ext principal to user\n\nKey insight: M amount is intermediate, NOT user-specified. User specifies ext_principal IN, receives calculated ext_principal OUT based on index ratios.\n\nAuthority handling:\n- If swap_program in wrap_authorities: Uses swap_global PDA as authority\n- Else: Requires explicit wrap_authority/unwrap_authority signers\n\nSwapGlobal state: Maintains whitelisted_extensions (program_id + mint + token_program) and whitelisted_unwrappers.\n\nRemaining accounts: Supports variable split via remaining_accounts_split_idx for extensibility.","created_at":"2026-01-05T02:43:01.047Z","tags":"solana,m-extensions,ext-swap,swap,cpi"} +{"id":"mem-de66ba3c435ef4d3","information":"Solana M-Extensions - Part 4: Index/Multiplier System\n\nIndex represents multiplier * 1e12. Constants: INDEX_SCALE_U64 = 1_000_000_000_000.\n\nKey functions:\n- multiplier_to_index(f64) → u64: Truncates multiplier * 1e12\n- principal_to_amount_down(principal, index): (index * principal) / 1e12 (rounds down)\n- amount_to_principal_down(amount, index): (amount * 1e12) / index (rounds down)\n- principal_to_amount_up: Adds (index - 1) before division for ceiling\n\nScaledUi sync_index():\n1. Calculate m_increase_factor = new_m_index / last_m_index\n2. Apply fee: ext_increase_factor = m_increase_factor^(1 - fee_on_yield)\n3. Calculate: new_ext_index = last_ext_index * ext_increase_factor\n4. CPI to update_multiplier on Token2022 mint\n\nCrank sync():\n- Only updates global_account indices (no Token2022 interaction)\n- new_ext_index = (last_ext_index * current_m_index) / last_m_index\n- Requires earn_authority signer\n\nPrecision: Uses f64.powf() with ~10^-16 error (acceptable for 10^-12 target).","created_at":"2026-01-05T02:42:45.059Z","tags":"solana,m-extensions,index,multiplier,conversion,math"} +{"id":"mem-e0922cd876067080","information":"Solana vs EVM M-Extensions - Security Model Comparison\n\n**Common Security Principles:**\n- Two-step admin transfer (pending_admin pattern)\n- Collateralization invariants (supply <= backing)\n- Authority whitelisting (wrap_authorities vs SwapFacility exclusivity)\n- Freeze validation before operations\n\n**Solana-Specific Security (from 5 audits):**\n- Explicit account validation via has_one constraints\n- Token2022 extension whitelist for supported features\n- Down-rounding in all conversions prevents over-minting\n- CPI safety: verify program IDs before cross-program calls\n- Fuzzing: 3M+ executions verified vault solvency, index monotonicity, fee idempotency\n\n**EVM-Specific Security:**\n- Fee-on-transfer guard (balance before/after check)\n- Cached balance strategy prevents inflation attacks\n- Safe240 casts prevent overflow\n- Role-based permissions for 5 distinct operations (DEFAULT_ADMIN, ASSET_CAP_MANAGER, YIELD_RECIPIENT_MANAGER, FREEZE_MANAGER, PAUSER)\n- Auto-claim on yieldRecipient change prevents yield loss","created_at":"2026-01-05T02:47:57.984Z","tags":"solana,evm,m-extensions,security,audits,comparison"} +{"id":"mem-e18e37cd56a01c06","information":"Solana M-Extensions - Part 10: Build and Deployment\n\nFeature flags (Cargo.toml):\n- default = [\"no-yield\"]\n- scaled-ui, no-yield, crank (mutually exclusive)\n- migrate (for V1 upgrades)\n- wm = [\"crank\", \"migrate\"] (wM-specific)\n\nConstraint: Only ONE yield feature can be enabled (compile-time check in lib.rs lines 27-38).\n\nBuild optimization (release profile):\n- lto = \"fat\": Link-time optimization\n- codegen-units = 1: Single compilation unit\n- overflow-checks = true: Runtime overflow detection\n\nDeployment flow:\n1. Get extension approved as earner through M0 governance\n2. Extension added to merkle root, bridged to Solana\n3. Earn program thaws vault_m_token_account\n4. Deploy extension program with chosen variant\n5. Create ext_mint with correct properties\n6. Call initialize() with wrap_authorities\n7. (Optional) Get whitelisted on ext_swap\n\nProduction addresses:\n- Earn: mz2vDzjbQDUDXBH6FPF5s4odCJ4y8YLE5QWaZ8XdZ9Z\n- Portal: mzp1q2j5Hr1QuLC3KFBCAUz5aUckT6qyuZKZ3WJnMmY\n- wM: wMXX1K1nca5W4pZr1piETe78gcAVVrEFi9f4g46uXko\n\nTesting: Jest 29.0.3 with anchor-litesvm 0.1.2, covers all 5 variant combinations.","created_at":"2026-01-05T02:43:47.517Z","tags":"solana,m-extensions,build,deployment,configuration"} \ No newline at end of file From 308b0afaff1298ce9f12dc8f8f9b1528959da02a Mon Sep 17 00:00:00 2001 From: eloqjava Date: Mon, 5 Jan 2026 07:05:20 -0600 Subject: [PATCH 02/27] chore: sync hive --- .hive/issues.jsonl | 6 ++++++ .hive/memories.jsonl | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.hive/issues.jsonl b/.hive/issues.jsonl index 5bc66e4..9069a4a 100644 --- a/.hive/issues.jsonl +++ b/.hive/issues.jsonl @@ -3,3 +3,9 @@ {"id":"cell-3rwh3f-mk0ju2wo0kc","title":"Research EVM M-Extensions Implementation","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.984Z","updated_at":"2026-01-05T02:49:10.021Z","closed_at":"2026-01-05T02:49:10.021Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} {"id":"cell-3rwh3f-mk0ju2wps8w","title":"Analyze Audit Reports for Security Patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.985Z","updated_at":"2026-01-05T02:49:11.316Z","closed_at":"2026-01-05T02:49:11.316Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} {"id":"cell-3rwh3f-mk0ju2wrukx","title":"Synthesize Comparative Analysis","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-05T02:36:12.987Z","updated_at":"2026-01-05T02:49:12.317Z","closed_at":"2026-01-05T02:49:12.317Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk15j9bxlm2","title":"Understand solana-m-extensions architecture","description":"High-level overview of program purposes, extension interactions, and key state structures for planning new extension additions","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-05T12:43:39.645Z","updated_at":"2026-01-05T13:05:20.340Z","closed_at":"2026-01-05T13:05:20.340Z","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk15j9c2kyn","title":"Analyze m_ext program structure and purpose","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.650Z","updated_at":"2026-01-05T12:52:55.188Z","closed_at":"2026-01-05T12:52:55.188Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk15j9c4frj","title":"Analyze ext_swap program structure and purpose","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.652Z","updated_at":"2026-01-05T12:52:57.497Z","closed_at":"2026-01-05T12:52:57.497Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk15j9c6d3d","title":"Analyze test suite and integration patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.654Z","updated_at":"2026-01-05T12:57:29.068Z","closed_at":"2026-01-05T12:57:29.068Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk15j9c8s76","title":"Review audit reports for security patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.656Z","updated_at":"2026-01-05T12:52:59.085Z","closed_at":"2026-01-05T12:52:59.085Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} +{"id":"cell-3rwh3f-mk15j9c97n5","title":"Synthesize architectural overview document","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.657Z","updated_at":"2026-01-05T13:05:18.419Z","closed_at":"2026-01-05T13:05:18.419Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} diff --git a/.hive/memories.jsonl b/.hive/memories.jsonl index d812c82..cf901e7 100644 --- a/.hive/memories.jsonl +++ b/.hive/memories.jsonl @@ -1,29 +1,43 @@ +{"id":"mem-07b9b4409ecdff33","information":"M-Extensions Crank System Security (V2 Audits)\n\n**Key Vulnerabilities in Earn/Crank Architecture**:\n\n1. **Instruction Type Enforcement** (Halborn V2 HIGH): InboxItem destination type not enforced - wrong release function locks funds permanently. Must validate mint_type matches instruction.\n\n2. **Sync-Before-Remove Pattern** (Adevar V2 L03): Removing earner without sync loses pending yield. Always sync before removing/modifying yield participants.\n\n3. **Active Status Checks** (Adevar V2 L02): Inactive earn manager can redirect yield. Validate authority AND active status in yield paths.\n\n4. **Frozen Account Abuse** (Adevar V2 L04): Earn manager sets frozen token account to block earner yield (DoS). Check account.state == Initialized before CPI.\n\n5. **Migration Handling** (Adevar V2 L05): Donations to old vault cause migration failure. Handle unexpected balances gracefully.\n\n6. **Scalability Limit** (Adevar): Jito bundles support ~12 extensions max (5 tx × 35 accounts ÷ 7 per op). Beyond this, arbitrage possible. Mitigation: Execute highest→lowest yield order.\n\n**Access Hierarchy**: Admin → Wrap Authority → Earn Authority → Earn Manager → Earner","created_at":"2026-01-05T12:51:51.938Z","tags":"solana,m-extensions,crank,security,v2-audit"} {"id":"mem-1112b12b6c4c7c76","information":"Solana M-Extensions - Part 2: State Accounts\n\nExtGlobalV2 structure:\n- admin (Pubkey): Config authority\n- pending_admin (Option): Two-step transfer\n- ext_mint, m_mint, m_earn_global_account (Pubkeys)\n- bump, m_vault_bump, ext_mint_authority_bump (u8)\n- yield_config (YieldConfig): Variant-specific state\n- wrap_authorities (Vec): Whitelist for wrap/unwrap\n\nYieldConfig variants:\n- NoYield: 1 byte (just variant tag)\n- ScaledUi: 25 bytes (variant + fee_bps + last_m_index + last_ext_index)\n- Crank: 57 bytes (variant + earn_authority + last_m_index + last_ext_index + timestamp)\n\nEarner (crank): Tracks per-user yield with last_claim_index, last_claim_timestamp, user, user_token_account, earn_manager, optional recipient_token_account.\n\nEarnManager (crank): Manages earner groups with is_active, fee_bps (0-10000), fee_token_account.\n\nAccount size formula: 8 + 32 + 33 + 96 + 3 + YieldConfig::space() + 4 + 32*wrap_authorities.len()","created_at":"2026-01-05T02:42:29.339Z","tags":"solana,m-extensions,state-management,accounts"} {"id":"mem-1828176cd0619fb8","information":"JMIExtension - wrap() Implementation Details\n\n**Access**: onlySwapFacility modifier (msg.sender must be swapFacility immutable address)\n\n**Flow**:\n1. Validate asset (not 0x0, not mToken itself) - reverts InvalidAsset\n2. Validate recipient (not 0x0) - reverts InvalidRecipient \n3. Validate amount > 0 - reverts InsufficientAmount\n4. _beforeWrap checks: isAllowedToWrap (cap check), not paused, account/recipient not frozen\n5. Record balanceBefore = IERC20(asset).balanceOf(this)\n6. safeTransferFrom(swapFacility, this, amount) in asset decimals\n7. **Fee-on-Transfer Guard**: Compare balanceAfter - balanceBefore == amount, revert InsufficientAssetReceived if mismatch\n8. Convert to extension decimals: jmiAmount = amount / 10^(assetDecimals - 6) for high-decimal assets\n9. Validate jmiAmount > 0 (prevents truncation to zero)\n10. Update: assets[asset].balance += safe240(amount), totalAssets += jmiAmount\n11. Mint jmiAmount to recipient\n\n**Key**: Amount parameter is in asset's native decimals. Balance stored in asset decimals. totalAssets in extension decimals (6).","created_at":"2026-01-05T02:42:07.149Z","tags":"jmi,wrap,implementation,fee-on-transfer,decimal-conversion"} {"id":"mem-1c8087e9416dd2c6","information":"Solana M-Extensions - Part 9: Gotchas and Edge Cases\n\n1. ScaledUi REQUIRES Token2022: Will fail InvalidTokenProgram if wrong program\n2. Vault must be thawed: Initialize fails if vault frozen (not yet approved earner by M0)\n3. Index sync is idempotent: Multiple txs can sync, last wins (no race issues)\n4. Fee precision loss: ScaledUi uses f64.powf(), loses ~10^-16 precision (acceptable)\n5. EarnManager fee opt-out: If fee_token_account closed, fee silently skipped (no revert)\n6. Double-claim prevention: Earner can't claim twice in same cycle (last_claim_index check)\n7. Shared wrap authorities: Same authorities for both wrap AND unwrap (not separate)\n8. M vault MUST be ATA: vault_m_token_account must be associated_token of m_vault PDA\n9. Swap whitelist required: ext_swap only works with whitelisted extensions\n10. Remaining accounts split: Swap requires correct split_idx or fails InvalidIndex\n\nRounding strategy: ALL conversions round DOWN in favor of protocol (prevents over-minting).\n\nOptional signers: wrap_authority and unwrap_authority can be None (falls back to token_authority).\n\nOrphaned earner cleanup: remove_orphaned_earner instruction handles stuck accounts.","created_at":"2026-01-05T02:43:32.241Z","tags":"solana,m-extensions,gotchas,edge-cases,best-practices"} {"id":"mem-1cf41cafac0f7917","information":"Solana M-Extensions - Part 5: Crank Yield Distribution\n\nClaimFor instruction (earn_authority only):\n1. Validate earner.last_claim_index < global.last_ext_index (prevent double-claim)\n2. Calculate rewards: (snapshot_balance * global_index / last_claim_index) - snapshot_balance\n3. Validate collateralization: ext_supply + rewards <= principal_to_amount_down(vault_m_amount, m_index)\n4. Calculate EarnManager fee if active: fee = (rewards * fee_bps) / 10000 (rounded down)\n5. Mint fee to earn_manager_token_account (if exists, else skip)\n6. Mint (rewards - fee) to recipient_token_account or user_token_account\n7. Update earner.last_claim_index and last_claim_timestamp\n8. Emit RewardsClaim event\n\nEarnManager operations:\n- add_earner: Creates Earner account with current global index\n- remove_earner: Closes Earner account\n- transfer_earner: Moves to different manager\n- configure_earn_manager: Updates fee_bps\n\nDoS prevention: If fee_token_account closed, fee silently skipped (doesn't revert transaction).","created_at":"2026-01-05T02:42:52.399Z","tags":"solana,m-extensions,crank,yield,claim,earn-manager"} +{"id":"mem-1edb78877570ff8b","information":"M-Extensions Security Patterns - Complete Checklist\n\nACCESS CONTROL:\n- Two-step admin transfer: transfer_admin() sets pending_admin → accept_admin() atomic swap\n- Role hierarchy (crank): Admin > EarnAuthority (claim_for) > EarnManager (add/remove earners) > Earner (set_recipient)\n- Explicit validation: ALWAYS use has_one constraints, NEVER rely on implicit Anchor checks\n\nSYNC-BEFORE-MODIFY:\n- CRITICAL: Call sync_index() before config changes (fee_bps, wrap_authorities) to prevent retroactive fee application\n- Adevar Finding #2: Changing fee without sync applies new fee to historical yield\n\nFLOATING POINT:\n- Use integer math with basis points: amount * fee_bps / 10_000\n- Conversion utils: multiplier_to_index (f64→u64), principal_to_amount_down, amount_to_principal_down\n- ALWAYS round down in protocol favor\n\nTOKEN VALIDATION:\n- Validate mint::token_program in all accounts\n- Fee-on-transfer protection: measure actual balance changes, not calculated estimates\n- Pattern: let actual = balance_after - balance_before\n\nCRANK SECURITY (Halborn V2):\n- Validate InboxItem instruction type discriminator\n- Timestamp checks prevent replay: clock.unix_timestamp > last_claim_timestamp\n- Apply earn_manager fee BEFORE earner distribution\n- Cleanup: remove_orphaned_earner() for inactive managers","created_at":"2026-01-05T13:03:39.762Z","tags":"solana,m-extensions,security,access-control,sync-pattern,floating-point,crank,audits"} +{"id":"mem-1f9158e131072f9d","information":"M-Extensions Audit Security Patterns - Sync-Before-Modify Pattern\n\n**CRITICAL PATTERN: Always Sync Multiplier Before Config Changes**\n\nAdevar audit Finding #2 identified retroactive fee application vulnerability:\n\n```rust\n// VULNERABLE - Fee change affects past yield\npub fn set_fee(ctx: Context, new_fee_bps: u64) -> Result<()> {\n ctx.accounts.ext_global.fee_bps = new_fee_bps; // ← Applied retroactively!\n Ok(())\n}\n\n// SECURE - Sync first, then update\npub fn set_fee(ctx: Context, new_fee_bps: u64) -> Result<()> {\n sync_multiplier(&ctx)?; // ← Lock in old fee rate for past yield\n ctx.accounts.ext_global.fee_bps = new_fee_bps; // ← Only affects future yield\n Ok(())\n}\n```\n\n**Why this matters**: Without syncing first, the new fee retroactively affects ALL accumulated yield since last sync. This breaks economic guarantees for users.\n\n**Core Invariants Protected by Sync**:\n1. `ext_supply + rewards <= vault_m_amount` (collateralization)\n2. `new_m_index >= last_m_index >= last_ext_index >= 1e12` (monotonicity)\n3. Fee boundaries: `fee_bps <= 10000` (100%)\n\n**General Pattern**: Before ANY state change that affects yield calculation (fee, mint, authority), call sync to checkpoint current state with old parameters.\n\n**Related**: Adevar V2 L03 - Earners lose pending yield when removed because removal doesn't sync first. Same root cause.","created_at":"2026-01-05T12:50:54.025Z","tags":"solana,m-extensions,security,yield,sync-pattern,audits,adevar"} {"id":"mem-2870afd93a575921","information":"JMIExtension Spec - Invariants & Edge Cases\n\n**Mandatory Invariants (from spec)**\n1. totalAssets ≤ totalSupply (always)\n - Maintained by paired state updates on wrap/replace\n2. totalAssets == Σ(asset balances in extension decimals)\n - Conversion functions ensure consistency\n\n**Implicit Invariants**\n1. mBalanceOf(this) ≥ mBacking (for unwrap to work)\n - Can break if replaceAssetWithM depletes $M too fast\n - Protected by isAllowedToUnwrap() check\n2. Cached balance ≥ Actual balance (for non-M assets)\n - Breaks on direct transfers (by design)\n\n**Critical Edge Cases**\n1. Truncation on high-decimal wraps\n - Wrapping 1 wei DAI → 0 JMI → reverts (InsufficientAmount)\n - Minimum wrap DAI: 1e12 (0.000001 DAI)\n\n2. Overflow on low-decimal scale-up\n - 4-decimal asset * 100 can overflow\n - Solidity 0.8.26 reverts on overflow\n\n3. Cap checked before conversion\n - Asset cap in asset's decimals, not extension decimals\n - Example: DAI cap of 1M checked as 1_000_000e18\n\n4. M backing exhaustion\n - Cannot unwrap if totalAssets == totalSupply (no M backing)\n - Requires solvers to replace assets with M\n\n5. Yield recipient change\n - Auto-claims pending yield for old recipient first\n - Prevents yield loss on recipient change\n\n**Solver Backend Requirements** (from spec)\n- Monitor AssetReplacedWithM events\n- Trigger when totalAssets high / M backing low\n- Acquire M, call replaceAssetWithM, receive collateral\n- Purpose: Convert non-M collateral → M for yield generation","created_at":"2026-01-04T21:48:40.688Z","tags":"m0,jmi,invariants,edge-cases,solver-integration"} {"id":"mem-2cd05921967db163","information":"JMIExtension - setAssetCap() & Yield Management\n\n**setAssetCap(address asset, uint256 cap)**:\n- Access: ASSET_CAP_MANAGER_ROLE only\n- Validates asset != 0x0 and asset != mToken (M has no cap)\n- Cap in asset's native decimals (e.g., 1_000_000e18 for 1M DAI)\n- **Gas Optimization**: If assets[asset].decimals == 0, fetches IERC20(asset).decimals() and caches it. Subsequent calls skip this fetch.\n- Early return if cap unchanged\n- Emits AssetCapSet(asset, cap)\n\n**isAllowedToWrap(address asset, uint256 amount)**:\n- Returns false if amount == 0\n- M (primary asset): Always returns true (no cap)\n- Non-M assets: Returns assetCap(asset) >= (assetBalanceOf(asset) + amount)\n- Cap checked in asset's decimals BEFORE conversion to extension decimals\n\n**claimYield()** (inherited from MYieldToOne):\n- Calculates yield = mBalanceOf(this) - _mBacking() where _mBacking() = totalSupply - totalAssets\n- If yield > 0, mints yield to yieldRecipient\n- After claim: totalSupply increases, mBacking increases by same amount, yield resets to 0\n- Yield accrues automatically from M's rebasing nature, no manual sync needed\n\n**setYieldRecipient(address account)**:\n- Access: YIELD_RECIPIENT_MANAGER_ROLE only\n- CRITICAL: Calls claimYield() FIRST to claim pending yield for old recipient before switch\n- Prevents yield loss on recipient change\n- Reverts ZeroYieldRecipient if account == 0x0\n- Emits YieldRecipientSet(account)","created_at":"2026-01-05T02:42:58.806Z","tags":"jmi,setAssetCap,yield,claimYield,gas-optimization"} +{"id":"mem-2ea0fdb7e4a97c8a","information":"M_EXT Program Instruction Organization Pattern:\n\nThe m_ext program uses a hierarchical feature-based instruction organization that's critical for understanding code flow:\n\n1. **Root level** (programs/m_ext/src/instructions/): Core instructions available across all variants (wrap, unwrap, initialize, transfer_admin, claim_fees, manage_wrap_authority)\n\n2. **Variant-specific subdirectories**:\n - scaled_ui/ - ScaledUi variant instructions (set_fee, sync)\n - crank/ - Crank variant with role-based hierarchy:\n - admin/ (set_earn_authority, add/remove_earn_manager)\n - earn_authority/ (claim_for, sync)\n - earn_manager/ (add/remove/transfer_earner, configure)\n - earner/ (set_recipient)\n - remove_orphaned_earner.rs (open instruction)\n\n3. **Feature flag coordination**: lib.rs uses cfg_if! to conditionally compile instruction modules based on features. Instructions are feature-gated at both module inclusion (mod.rs) and entrypoint (lib.rs #[program]) levels.\n\nWHY this matters: When tracing instruction execution, you must check BOTH the Cargo.toml features AND the instruction's module path to understand which variant-specific code is active. The same instruction name (e.g., \"sync\") has different implementations across variants.","created_at":"2026-01-05T12:47:38.855Z","tags":"solana,m-extensions,architecture,instruction-organization,feature-flags,code-structure"} {"id":"mem-306ee6b2a1887e89","information":"Analyzed liquidity-delivery/svm Solana Anchor project dependencies:\n\n**Core Dependencies (from Cargo.lock):**\n- anchor-lang: 0.31.1\n- anchor-spl: 0.31.1\n- solana-program: 2.2.1\n- agave packages (feature-set, precompiles, etc.): 3.0.8\n\n**Required Toolchain Versions:**\n- Rust: 1.88.0 (as specified in README)\n- Solana CLI: 2.2.1 (matches solana-program version in Cargo.lock)\n- Anchor CLI: 0.31.1 (must match anchor-lang version)\n\n**Key Finding:** The README already specifies correct versions, but the agave version (3.0.8) is implicitly tied to Solana 2.2.1. Users must have EXACT versions:\n- Rust 1.88.0\n- Solana/Agave 2.2.1\n- Anchor 0.31.1\n\n**Optional Dependencies:**\n- Node: 24.10.0 (mentioned in README, not currently used)\n- pnpm: 9.15.4 (package_manager in Anchor.toml, no package.json exists)\n\n**Current README Status:** Already comprehensive and accurate. Specifies all pinned versions correctly. Only minor improvement needed: clarify that agave 3.0.8 is bundled with Solana 2.2.1.","created_at":"2026-01-04T17:53:25.446Z","tags":"solana,anchor,rust,dependencies,version-pinning,build-requirements"} {"id":"mem-33e2828bfb4def9e","information":"JMI Extension - Integration & Deployment\n\n## SwapFacility Integration\n- **Exclusive Gateway**: Only SwapFacility can call wrap/unwrap/replaceAssetWithM\n- Uses ISwapFacility.msgSender() to track original caller for hooks\n- User flow: User → SwapFacility → JMIExtension\n- SwapFacility handles M token approvals\n\n## M Token Integration \n- Implements IMTokenLike interface\n- Can toggle earning: enableEarning() / disableEarning()\n- Earning status affects yield accrual\n- Yield = mBalanceOf(this) - mBacking\n\n## Deployment Pattern\n- TransparentUpgradeableProxy\n- Constructor: sets immutables (mToken, swapFacility), disables initializers\n- Initialize: sets name, symbol, yieldRecipient, grants roles, sets initial caps\n\n## Testing Insights (from unit tests)\n- Fuzz tests: decimal conversions, cap boundaries, overflow scenarios\n- Mock assets: USDC (6 decimals), DAI (18), 4-decimal asset\n- Fee-on-transfer rejection verified\n- Inflation attack prevention tested\n- Safe240 overflow handling\n\n## Audits Available\n- Multiple audits in /audits/JMI/\n- Certora formal verification\n- ChainSecurity review","created_at":"2026-01-04T21:43:47.247Z","tags":"m0,jmi,deployment,testing,integration"} {"id":"mem-35770db254617e4c","information":"Solana vs EVM M-Extensions - Architecture Comparison\n\n**Conceptual Equivalents:**\n- Program/Contract: Solana uses two programs (m_ext + ext_swap); EVM uses inheritance (JMIExtension → MYieldToOne → MExtension)\n- Global State: Solana uses ExtGlobalV2 PDA at [global] seed; EVM uses ERC-7201 namespaced storage at deterministic slots\n- Access Control: Solana uses has_one = admin constraints + wrap_authorities Vec; EVM uses 5-role OpenZeppelin AccessControl\n- Upgradeability: Solana uses anchor upgrade; EVM uses TransparentUpgradeableProxy\n- Yield Variants: Solana uses compile-time features (no-yield, scaled-ui, crank); EVM uses runtime inheritance\n\n**Platform Constraint Differences:**\n- Solana externalizes state to PDAs with explicit seeds; EVM uses contract storage\n- Solana requires rent-exemption (~1-2 SOL); EVM pays gas per operation\n- Solana composability via CPI; EVM via function calls\n- Solana two-program pattern (ext_swap delegates via CPI); EVM single contract with SwapFacility msgSender() delegation","created_at":"2026-01-05T02:47:43.108Z","tags":"solana,evm,m-extensions,architecture,comparison,cross-chain"} +{"id":"mem-3a9be4569b6e53da","information":"M-Extensions Integration Patterns - Token-2022 and CPI\n\nTOKEN-2022 EXTENSIONS:\nScaledUiAmountConfig (scaled-ui variant):\n- Purpose: Rebasing token (UI amount = principal × multiplier)\n- Integration: sync_index() CPI to spl_token_2022::extension::scaled_ui_amount::instruction::update_multiplier()\n- Authority: ext_mint_authority PDA has update permission\n- CRITICAL: Sync before wrap authority/fee changes\n\nPermanentDelegate: Extension mint authority for admin ops (fee collection). Validate delegate authority = expected PDA.\n\nDefaultAccountState: New accounts start frozen/initialized for compliance.\n\nCPI PATTERNS:\nm_ext wrap: sync_index() → transfer_tokens(m) → mint_tokens(ext)\next_swap (atomic two-phase):\n Phase 1: CPI from_ext_program.unwrap() → measure M = swap_m_account.amount - initial_balance\n Phase 2: CPI to_ext_program.wrap(measured_M)\n \nCross-program PDA validation:\n#[account(seeds = [EXT_GLOBAL_SEED], seeds::program = from_ext_program.key(), bump)]\n\nDYNAMIC CPI (ext_swap):\n- remaining_accounts split at idx: [from_accounts..., to_accounts...]\n- Build instruction dynamically for whitelisted programs\n- invoke_signed with swap authority seeds","created_at":"2026-01-05T13:03:54.653Z","tags":"solana,m-extensions,token-2022,cpi,scaled-ui,permanent-delegate,cross-program"} {"id":"mem-40f6ec85ac0655a2","information":"Solana vs EVM M-Extensions - Wrap/Unwrap Mechanism Comparison\n\n**Solana Wrap Flow:**\n1. Validate signer in wrap_authorities whitelist\n2. sync_index() updates multiplier (ScaledUi: Token2022 extension; Crank: global state)\n3. Transfer M from user → m_vault\n4. Calculate ext_principal = m_amount * 1e12 / index (round DOWN)\n5. Mint ext_principal to user\n6. Verify: ext_supply + rewards <= vault_m_amount\n\n**EVM Wrap Flow:**\n1. Check cached balance: require(assetBalanceOf == assets[asset].balance)\n2. balanceBefore = mToken.balanceOf(address(this))\n3. safeTransferFrom(msg.sender, this, mAssetAmount)\n4. balanceAfter = mToken.balanceOf(address(this))\n5. Revert if balanceBefore + amount != balanceAfter (fee-on-transfer protection)\n6. Mint extension tokens (1:1 after decimal conversion)\n\n**Key Difference:** Solana uses index-based conversion with round-down; EVM uses balance validation with fee-on-transfer protection. Solana applies fee via ext_increase = m_increase^(1-fee); EVM doesn't have fee-on-transfer in M token.","created_at":"2026-01-05T02:47:50.808Z","tags":"solana,evm,m-extensions,wrap,unwrap,conversion,comparison"} {"id":"mem-44324b6d5d81c4a4","information":"Cross-Chain Bridging for Solana-EVM M-Extensions\n\n**Fundamental Challenges:**\n1. Account model vs contract storage (explicit vs implicit context)\n2. Rent vs gas economics\n3. Index precision differences (u128 * 1e12 vs uint256 decimal conversion)\n4. Yield distribution (compile-time vs runtime)\n\n**Potential Bridging Points:**\n1. Canonical M Token Mapping: m_mint (Solana) ↔ mToken (EVM) with decimal normalization\n2. Extension Token Representation: ext_mint ↔ JMIExtension contract address\n3. State Synchronization: Index/multiplier sync, yield accumulation coordination\n4. Collateralization Verification: Cross-chain proof of reserves\n\n**Recommended Architecture:**\n- Lock-and-Mint Pattern: Lock ext tokens on source → Emit event → Relayer submits proof → Mint wrapped tokens on destination\n- Index Synchronization: Periodic oracle updates push Solana index → EVM state\n- Security: Rate limiting, emergency pause, validator set security critical\n- Invariant: sum(ext_supply_all_chains) <= sum(m_backing_all_chains)\n\n**Bridge Options:** Wormhole or LayerZero for message passing between Solana and EVM chains","created_at":"2026-01-05T02:48:06.190Z","tags":"cross-chain,bridging,solana,evm,m-extensions,wormhole,layerzero"} +{"id":"mem-5147e997f161d3ff","information":"M-Extensions New Extension Integration Guide\n\nADDING NEW YIELD VARIANT (requires fork):\n1. Add mutually-exclusive feature flag in Cargo.toml\n2. Extend YieldVariant enum in state/mod.rs\n3. Implement YieldConfig struct with cfg_if! block, add space() method\n4. Add variant-specific instructions (sync, claim, config)\n5. Update utils/conversion.rs sync_index() for new variant\n6. MAINTAIN INVARIANTS: ext_mint.supply ≤ vault_m_account.amount, sync before config changes, use measured amounts\n\nADDING NEW TOKEN-2022 EXTENSION:\n1. Declare in Initialize: ExtensionType::YourExtension\n2. Calculate mint size: ExtensionType::get_account_len::(&[extensions])\n3. If mutable config: Assign PDA authority (ext_mint_authority), implement sync instruction with CPI\n4. Update test harness create_mint_with_extensions()\n5. Validate authority: has_one constraints for extension PDAs\n\nEXAMPLE - TransferFee Extension:\n```rust\n// Initialize.rs\nlet extensions = vec![ExtensionType::ScaledUiAmountConfig, ExtensionType::TransferFeeConfig];\n// YieldConfig\npub struct YieldConfig { /*...*/ transfer_fee_bps: u64 }\n// Sync instruction\npub fn sync_transfer_fee(ctx: Context) -> Result<()> {\n let ix = spl_token_2022::extension::transfer_fee::instruction::set_transfer_fee(...);\n invoke_signed(&ix, accounts, &[authority_seeds])?;\n}\n```\n\nWHITELISTING IN EXT_SWAP:\n1. Deploy m_ext variant with unique program_id\n2. Admin calls whitelist_extension(program_id, mint, token_program)\n3. Swap validates whitelist, uses remaining_accounts for dynamic CPI","created_at":"2026-01-05T13:04:11.665Z","tags":"solana,m-extensions,integration,new-extensions,token-2022,yield-variant,whitelist"} +{"id":"mem-59acaa84cadb234d","information":"M-Extensions Detailed State Relationships\n\nExtGlobalV2 (PDA seeds=[b\"global\"]):\n- admin: Pubkey (config authority)\n- pending_admin: Option (two-step transfer pattern)\n- ext_mint: Pubkey (Token-2022 mint)\n- m_mint: Pubkey (M token reference)\n- m_earn_global_account: Pubkey\n- yield_config: YieldConfig (variant enum: NoYield | ScaledUi{fee_bps, last_m_index, last_ext_index} | Crank{earn_authority, last_m/ext_index, timestamp})\n- wrap_authorities: Vec\n\nCrank Hierarchy (crank variant only):\nEarnManager (seeds=[b\"earn_manager\", manager_pubkey]) → Earner (seeds=[b\"earner\", user, manager])\n- Manager: earn_manager authority, is_active, fee_bps, fee_token_account\n- Earner: user, user_token_account, earn_manager, recipient_token_account (optional), last_claim_index, last_claim_timestamp\n\nSwapGlobal (seeds=[b\"global\"], ext_swap):\n- admin, whitelisted_unwrappers: Vec, whitelisted_extensions: Vec<{program_id, mint, token_program}>\n\nKey PDAs: ext_mint_authority (mints/burns), m_vault (holds collateral), swap_m_account (intermediate buffer).","created_at":"2026-01-05T13:03:19.025Z","tags":"solana,m-extensions,state-accounts,pda-patterns,earn-manager,earner"} {"id":"mem-71905a721f735005","information":"JMIExtension Specification - Core Design Patterns\n\n**Multi-Asset Collateral Model**\n- totalSupply = $M backing + totalAssets (non-M collateral)\n- $M backing calculated as: totalSupply - totalAssets \n- Yield = mBalance - $M backing\n\n**Decimal Conversion Rules** (Critical for correctness)\n- Always truncates down (rounds in protocol's favor)\n- DAI (18d) → JMI (6d): divides by 1e12 (loses up to 1e12-1 wei)\n- 4-decimal → JMI (6d): multiplies by 100 (can overflow)\n- USDC (6d) → JMI (6d): 1:1 exact\n\n**State Management**\n- Asset struct: cap (uint256), balance (uint240), decimals (uint8)\n- uint240 limit aligns with $M max supply\n- Decimals cached on first setAssetCap for gas efficiency\n- totalAssets tracks aggregate in extension decimals (6)\n\n**SwapFacility Trust Model**\n- Immutable address set in constructor\n- Only SwapFacility can call wrap/unwrap/replaceAssetWithM\n- JMI trusts SwapFacility for reentrancy, validation, user approvals\n- Single point of trust architecture\n\n**Yield Mechanism**\n- $M is rebasing token with continuous accrual\n- Yield auto-accrues without manual updates\n- claimYield() mints NEW JMI tokens to yieldRecipient\n- After claim: totalSupply increases, yield() resets to 0","created_at":"2026-01-04T21:48:22.933Z","tags":"m0,jmi,specification,design-patterns,decimal-conversion"} {"id":"mem-729d932423b302b5","information":"JMI Extension - Security & Patterns\n\n## Key Security Features\n1. **Fee-on-Transfer Guard**: Checks balanceBefore vs balanceAfter, reverts if mismatch\n2. **Safe240 Casting**: Asset balances capped at uint240 max (aligns with M supply)\n3. **Inflation Protection**: replaceAssetWithM uses cached balance not actual\n4. **Reentrancy**: SwapFacility enforces via ReentrancyLock\n5. **Decimal Truncation**: Always rounds down to prevent excess minting\n6. **SwapFacility Exclusive**: ONLY SwapFacility can call wrap/unwrap/replace\n\n## Access Control Roles\n- ASSET_CAP_MANAGER_ROLE: setAssetCap(asset, cap)\n- YIELD_RECIPIENT_MANAGER_ROLE: setYieldRecipient(account) \n- FREEZE_MANAGER_ROLE: freeze/unfreeze accounts\n- PAUSER_ROLE: pause/unpause all user actions\n- DEFAULT_ADMIN_ROLE: grant/revoke roles\n\n## Critical Invariants\n1. totalSupply == mBacking + totalAssets\n2. yield = mBalance - mBacking (excess M)\n3. assetBalanceOf(asset) + amount <= assetCap(asset)\n\n## Common Gotchas\n- Truncation: 1 wei DAI wraps to 0 JMI (reverts)\n- Asset cap checked before conversion (in asset decimals)\n- Cannot unwrap if all backing is non-M assets\n- Direct asset transfers bypass accounting (use cached balance)","created_at":"2026-01-04T21:43:40.000Z","tags":"m0,jmi,security,solidity,access-control"} {"id":"mem-75957c04ec1d3974","information":"PR Review Agent Structure: Use mode:subagent, temperature:0.1, write:false, edit:false, but ENABLE bash:true (needed for cargo clippy, cargo fmt --check, cargo test, anchor build). Review format: 1-Summary 2-Critical Issues (security MUST FIX) 3-Major Issues (logic bugs SHOULD FIX) 4-Minor Issues (quality improvements) 5-Positive Feedback 6-Tool Output. Project uses Anchor 0.31.1 with anchor-litesvm for tests, patterns: instructions/, state/, error.rs with #[error_code], constants.rs for magic numbers.","created_at":"2026-01-04T18:35:12.683Z","tags":"code-review,agent-config,pr-review,solana,anchor"} +{"id":"mem-77812921332c4dd0","information":"M_EXT Integration with SPL Token-2022 ScaledUiAmount Extension:\n\nThe scaled-ui variant uses a critical integration with Token-2022's ScaledUiAmount extension that requires specific CPI patterns:\n\n**Key Integration Points:**\n\n1. **Multiplier Updates (sync_index function)**:\n - Uses invoke_signed (not anchor CpiContext) to call spl_token_2022::extension::scaled_ui_amount::instruction::update_multiplier()\n - Requires ext_token_program.key() == spl_token_2022::ID (safety check before CPI)\n - After invoke_signed, MUST call ext_mint.reload() to reflect new multiplier in account data\n\n2. **Index Conversion Logic**:\n - M index → Ext index: Apply fee_bps calculation\n - Index → Multiplier: index_to_multiplier(ext_index) = (ext_index as f64) / INDEX_SCALE_F64\n - Multiplier → Index: multiplier_to_index(multiplier) = (multiplier * INDEX_SCALE_F64) as u64\n - INDEX_SCALE = 1e12 (1 trillion) for precision\n\n3. **Vault State Check**:\n - Only updates multiplier if vault_m_token_account.state == AccountState::Initialized (not frozen)\n - If frozen, updates last_m_index but returns current ext_index without rebasing\n - This prevents yield distribution when vault is not earning from M mint\n\nWHY this matters: The ScaledUiAmount extension automatically rebases all token balances when multiplier changes, so sync() effectively distributes yield to ALL holders atomically. The invoke_signed + reload pattern is critical - forgetting reload() causes stale multiplier in subsequent calculations. The vault state check ensures the program doesn't distribute yield it hasn't earned.","created_at":"2026-01-05T12:48:14.985Z","tags":"solana,m-extensions,scaled-ui,spl-token-2022,scaled-ui-amount,cpi,invoke-signed,multiplier,rebasing"} {"id":"mem-77ddec869efa7b6c","information":"JMIExtension Storage Architecture (ERC-7201)\n\n**JMIExtensionStorageStruct** (slot 0x4717d46f2e033163981fa31651301a35281b6b08316965d315fd1577bad94b00):\n- mapping(address => Asset) assets with struct Asset { uint256 cap, uint240 balance, uint8 decimals }\n- uint256 totalAssets (aggregate non-M in extension decimals)\n\n**MYieldToOneStorageStruct** (slot 0xee2f6fc7e2e5879b17985791e0d12536cba689bda43c77b8911497248f4af100):\n- uint256 totalSupply\n- address yieldRecipient \n- mapping(address => uint256) balanceOf\n\n**Inheritance**: JMIExtension → MYieldToOne → MExtension → ERC20ExtendedUpgradeable + Freezable + Pausable\n\n**Immutables** (set in constructor, cannot change): mToken, swapFacility\n\nConstructor disables initializers on implementation contract. Deployed via TransparentUpgradeableProxy pattern.","created_at":"2026-01-05T02:41:55.108Z","tags":"jmi,erc7201,storage,architecture,upgradeable"} {"id":"mem-7a5e732d21d67c9f","information":"Code Review Agent for Solana/Anchor: Available tools are CASS (session search), cargo clippy v0.1.88, rustfmt v1.8.0, Rust v1.88.0, Anchor v0.31.1. Agent should have bash:true to run linters and tests. Key focus: Solana security (account validation, signer checks, PDA validation, overflow protection), Anchor patterns (account constraints, space calc, CPI safety), Rust best practices (no unwrap, checked math, proper error handling). Common vulnerabilities: missing signer validation, integer overflow, unvalidated ownership, improper PDA seeds, missing status checks.","created_at":"2026-01-04T18:35:04.653Z","tags":"code-review,solana,anchor,rust,security,pr-review"} {"id":"mem-7b3a8fb4267c764f","information":"Solana M-Extensions Program Architecture - Part 1: Core Overview\n\nM-Extensions implements wrapper tokens backed 1:1 by M0 $M stablecoin using Anchor 0.31.1 on Solana 2.1.0.\n\nTwo programs: m_ext (3C865D264L4NkAm78zfnDzQJJvXuU3fMjRUvRxyPi5da) and ext_swap (MSwapi3WhNKMUGm9YrxGhypgUEt7wYQH3ZgG32XoWzH).\n\nThree yield variants (compile-time features):\n- NoYield: All yield to admin\n- ScaledUi: Automatic rebasing via Token2022 ScaledUiAmount extension\n- Crank: Manual distribution via earn_authority with EarnManager/Earner hierarchy\n\nPDA patterns:\n- ExtGlobalV2: seeds=[b\"global\"] - main state\n- Mint Authority: seeds=[b\"mint_authority\"] - mints extension tokens\n- M Vault: seeds=[b\"m_vault\"] - holds collateral\n- Earner: seeds=[b\"earner\", user_token_account] - yield tracking (crank only)\n- EarnManager: seeds=[b\"earn_manager\", manager_pubkey] - manager state (crank only)\n\nDependencies: spl-token-2022 v7.0.0, earn program from m0-foundation/solana-m.","created_at":"2026-01-05T02:42:20.759Z","tags":"solana,m-extensions,architecture,pda,anchor"} +{"id":"mem-8073133a37f39fa6","information":"M-Extensions Audit Security Patterns - Cross-Chain Bridge Considerations\n\n**Portal/Bridge Security Patterns from V2 Audits**\n\n**Inbound Rate Limit Bypass** (Adevar V2 M01 - MEDIUM)\n- Multi-transceiver portal configurations can bypass rate limits\n- Issue: Rate limit checked using WRONG amount variable\n- **Pattern**: When aggregating messages from multiple sources (transceivers), validate EACH source independently AND aggregated total\n\n**Mint Validation in Cross-Chain Context** (Halborn V2)\n- Insufficient M-token mint validation during earn program initialization\n- Bridge must validate: mint address, authority, decimals, extensions\n- **Why critical**: Wrong mint allows fake tokens to be accepted as collateral\n\n**Release Instruction Mapping** (Halborn V2 - HIGH)\n```rust\n// InboxItem specifies destination: M-token or Extension-token\n// MUST enforce correct release instruction\n\nstruct InboxItem {\n destination_mint: Pubkey,\n mint_type: MintType, // M or Extension\n amount: u64,\n}\n\n// Release instructions must validate mint_type matches\npub fn release_inbound_mint(inbox_item) {\n require!(inbox_item.mint_type == MintType::M, WrongReleaseInstruction);\n}\n\npub fn release_inbound_mint_extension(inbox_item) {\n require!(inbox_item.mint_type == MintType::Extension, WrongReleaseInstruction);\n}\n```\n\n**Why this matters**: Permissionless release means attacker can call wrong instruction, causing M-tokens to be minted but locked in portal (not transferred to recipient). Funds permanently lost.\n\n**Token Account Ownership Validation**:\n- Verify token accounts owned by correct program (Token vs Token2022)\n- Check token account authority matches expected PDA\n- Validate mint matches expected mint for that account\n\n**General Bridge Pattern**: \n1. Validate message source/transceiver authenticity\n2. Check rate limits per-source AND aggregated\n3. Validate destination mint configuration\n4. Enforce correct instruction for mint type\n5. Verify token account ownership/authority","created_at":"2026-01-05T12:51:40.342Z","tags":"solana,m-extensions,bridge,portal,cross-chain,security,audits,v2"} +{"id":"mem-88fda62c93c6365f","information":"M-Extensions Bridge/Portal Security (V2 Audits)\n\n**Critical Portal Patterns**:\n\n1. **Rate Limit Bypass** (Adevar V2 M01): Multi-transceiver configs bypass limits due to wrong amount variable. Validate EACH source independently AND aggregated total.\n\n2. **Mint Validation** (Halborn V2): Insufficient validation allows fake tokens as collateral. Must check: address, authority, decimals, extensions.\n\n3. **Release Instruction Mapping** (Halborn V2 HIGH): Permissionless release + wrong instruction = funds locked. InboxItem.mint_type (M vs Extension) MUST match release function called.\n\n**Pattern**: \n- Validate message source authenticity\n- Check rate limits per-source AND total\n- Validate mint configuration fully\n- Enforce mint_type → instruction mapping\n- Verify token account ownership/authority\n\n**Why critical**: Wrong release locks M-tokens in portal instead of delivering to recipient. Permanent fund loss.","created_at":"2026-01-05T12:51:56.696Z","tags":"solana,m-extensions,bridge,portal,cross-chain,security,v2-audit"} {"id":"mem-94392126876527a1","information":"JustMintIt (JMI) Extension Research - M0 Foundation\n\n**Repository**: https://github.com/m0-foundation/evm-m-extensions\n**Path**: src/projects/jmi/JMIExtension.sol\n\n## What JMI Solves\nJMI wraps yield-bearing $M token into non-rebasing ERC-20 with multi-asset collateral backing. Unlike other M extensions that only accept $M, JMI allows minting with approved stablecoins (USDC, DAI, etc.) assuming 1:1 peg. All yield flows to single recipient.\n\n## Architecture\nInheritance: JMIExtension → MYieldToOne → MExtension (base) + Freezable + Pausable\n\n**Storage (ERC-7201)**:\n- JMIExtensionStorageStruct: per-asset caps/balances/decimals + totalAssets\n- MYieldToOneStorageStruct: totalSupply, yieldRecipient, balanceOf mapping\n\n**Immutables**: mToken, swapFacility (set in constructor)\n\n## Core Minting Mechanism\n```solidity\nfunction wrap(address asset, address recipient, uint256 amount)\n```\n\nFlow:\n1. Check asset allowed via cap (isAllowedToWrap checks cap not reached)\n2. Transfer asset from SwapFacility to JMI contract\n3. Verify actual received == expected (prevents fee-on-transfer)\n4. Convert asset decimals → extension decimals (6) - always truncates down\n5. Update storage: assets[asset].balance += amount, totalAssets += jmiAmount\n6. Mint jmiAmount to recipient (1:1 in extension decimals)\n\n**Decimal Conversion**: DAI (18) → JMI (6) divides by 10^12. USDC (6) → JMI (6) is 1:1.\n\n## Asset Replacement\n```solidity\nfunction replaceAssetWithM(address asset, address recipient, uint256 amount)\n```\nM holders swap M for held collateral. Reduces totalAssets, increases M backing. Uses cached assetBalanceOf to prevent inflation attacks from direct transfers.","created_at":"2026-01-04T21:43:31.840Z","tags":"m0,jmi,solidity,evm,minting,collateral"} {"id":"mem-99f901d3659c8895","information":"SwapFacility Integration - JMI Specifics\n\n**SwapFacility as Exclusive Gateway**:\n- Only SwapFacility contract can call wrap/unwrap/replaceAssetWithM on JMI\n- SwapFacility set as immutable in constructor, cannot be changed post-deployment\n- SwapFacility exposes msgSender() function to track original caller (user → SwapFacility → JMI)\n- JMI passes msgSender() to hooks (_beforeWrap, _beforeUnwrap) for freeze/pause checks on actual user\n\n**User Flow Examples**:\n1. Wrap USDC → JMI: User calls SwapFacility.swap(USDC, JMI, amount, recipient) → SwapFacility calls JMI.wrap(USDC, recipient, amount)\n2. Unwrap JMI → M: User calls SwapFacility.swapOutM(JMI, amount, recipient) → SwapFacility calls JMI.unwrap(recipient, amount)\n3. Replace DAI with M: Solver calls SwapFacility.replaceAssetWithM(DAI, MExtension, JMI, amount, recipient) → SwapFacility unwraps M from MExtension, calls JMI.replaceAssetWithM(DAI, recipient, amount)\n\n**SwapFacility Functions for JMI**:\n- swap(tokenIn, tokenOut, amount, recipient): General swap, supports asset → JMI or JMI → M paths\n- swapInM(extensionOut, amount, recipient): M → JMI (also works for wrapping M directly)\n- swapOutM(extensionIn, amount, recipient): JMI → M\n- replaceAssetWithM(asset, extensionIn, extensionOut, amount, recipient): Complex flow for solver-driven collateral replacement\n- All have *WithPermit variants for gasless approvals (EIP-2612)\n\n**Trust Model**: JMI fully trusts SwapFacility for reentrancy protection, user approvals, validation. Single point of trust architecture.","created_at":"2026-01-05T02:42:42.750Z","tags":"jmi,swapfacility,integration,user-flow,trust-model"} +{"id":"mem-9bb4b14961516a2e","information":"M-Extensions Audit Security Patterns - Access Control & Initialization\n\n**CRITICAL: Explicit Authority Validation Required**\n\nSolana's account-based model requires EXPLICIT authority checks via Anchor constraints. Multiple audits (OtterSec ADV-00, Adevar #1, Halborn) found CRITICAL vulnerability in ext_swap whitelist operations:\n\n```rust\n// VULNERABLE - Missing admin check\npub fn whitelist_extension(ctx: Context, ext_program: Pubkey) -> Result<()> {\n // ANY user can call this!\n}\n\n// SECURE - Explicit has_one constraint\n#[derive(Accounts)]\npub struct WhitelistExt<'info> {\n #[account(mut, has_one = admin)] // ← MANDATORY\n pub swap_global: Account<'info, SwapGlobal>,\n pub admin: Signer<'info>,\n}\n```\n\n**Why this matters**: Without `has_one = admin`, ANY user can manipulate whitelists, add rogue extensions, or grant themselves privileges.\n\n**Front-Running During Initialization**\n- Initialization instructions are often permissionless (no authority required)\n- Malicious actors can front-run legitimate deployment with incorrect parameters\n- M0 accepted this risk - controls via deployment process, not on-chain enforcement\n- Alternative: Add initialization authority parameter and check\n\n**Pattern**: For privileged operations, ALWAYS add `has_one = authority` or explicit signer checks. Don't assume implicit authorization.","created_at":"2026-01-05T12:50:45.876Z","tags":"solana,m-extensions,security,access-control,audits,critical-vulnerability"} {"id":"mem-adcd85dd16e398d5","information":"JMIExtension - replaceAssetWithM() Implementation\n\n**Access**: onlySwapFacility only\n**Parameters**: amount is in M decimals (6), NOT asset decimals\n\n**Flow**:\n1. Check not paused\n2. Validate asset (not 0x0, not mToken), recipient, amount > 0\n3. Convert M amount → asset amount: assetAmount = amount * 10^(assetDecimals - 6) for high-decimal\n4. Validate assetAmount > 0 (prevents truncation)\n5. Check cached balance: assets[asset].balance >= assetAmount (NOT IERC20(asset).balanceOf(this))\n6. Update: assets[asset].balance -= assetAmount, totalAssets -= amount\n7. Transfer amount of $M from swapFacility to this contract\n8. Transfer assetAmount of asset to recipient\n9. Emit AssetReplacedWithM(asset, assetAmount, recipient, amount)\n\n**Why Cached Balance**: Direct asset transfers bypass accounting. Cached balance prevents inflation attack: attacker sends asset directly, then calls replaceAssetWithM to extract excess.\n\n**Solver Use Case**: When totalAssets high / M backing low, solver acquires M, calls replaceAssetWithM via SwapFacility, receives collateral (USDC/DAI), JMI backing shifts from non-M → M for better yield.","created_at":"2026-01-05T02:42:18.507Z","tags":"jmi,replaceAssetWithM,solver,cached-balance,inflation-protection"} +{"id":"mem-bd02892ecccd0e6f","information":"M-Extensions Audit Security Patterns - Floating Point Precision Gotchas\n\n**CRITICAL: f64 Multiplier Calculation Can Cause Insolvency**\n\nAdevar audit Finding #3 identified rounding issues in `calculate_new_multiplier`:\n\n**Problem**: Using `f64.powf()` for yield calculation can round UP instead of down, creating slight over-distribution that compounds over time → eventual insolvency.\n\n```rust\nfn calculate_new_multiplier(\n last_ext_multiplier: f64,\n last_m_multiplier: f64,\n new_m_multiplier: f64,\n fee_bps: u64,\n) -> Result {\n // f64 arithmetic can round up, breaking collateralization!\n // Users claim slightly more than they should\n}\n```\n\n**Why f64 is unavoidable**: Token2022 ScaledUi extension CPI interface REQUIRES f64 multiplier. Can't switch to pure integer math.\n\n**Recommended Solutions**:\n1. Replace `powf` with deterministic approximations (linear interpolation, Taylor series)\n2. Redesign fee model to use purely linear functions (avoid exponentiation)\n3. Always round DOWN in favor of protocol (conservative rounding)\n4. Add periodic collateralization checks to detect drift\n\n**Related Gotchas**:\n- **Rounding in wrap/unwrap**: Small amounts can round to zero or lose precision\n- **Same-token swaps** (Adevar #4): Unwrap + wrap cycle loses value due to double rounding - MUST forbid\n- **Sanity checks** (Adevar Enhancement #5): Enforce minimum amounts to prevent dust issues\n\n**Pattern**: When f64 math is required by external interfaces, use conservative rounding (always favor protocol), add sanity checks, and monitor collateralization invariants.","created_at":"2026-01-05T12:51:03.295Z","tags":"solana,m-extensions,security,floating-point,precision,rounding,insolvency,audits"} {"id":"mem-cafb415402214246","information":"JMIExtension - Access Control & Roles\n\n**Roles** (OpenZeppelin AccessControl):\n- DEFAULT_ADMIN_ROLE: Grant/revoke other roles\n- ASSET_CAP_MANAGER_ROLE = keccak256(\"ASSET_CAP_MANAGER_ROLE\"): setAssetCap(asset, cap)\n- YIELD_RECIPIENT_MANAGER_ROLE = keccak256(\"YIELD_RECIPIENT_MANAGER_ROLE\"): setYieldRecipient(account)\n- FREEZE_MANAGER_ROLE (inherited Freezable): freeze/unfreeze accounts\n- PAUSER_ROLE (inherited Pausable): pause/unpause all user actions\n\n**Initialization**:\ninitialize() parameters: name, symbol, yieldRecipient, admin, assetCapManager, freezeManager, pauser, yieldRecipientManager\n- Grants DEFAULT_ADMIN_ROLE to admin\n- Grants ASSET_CAP_MANAGER_ROLE to assetCapManager (reverts ZeroAssetCapManager if 0x0)\n- Grants YIELD_RECIPIENT_MANAGER_ROLE to yieldRecipientManager (reverts ZeroYieldRecipientManager if 0x0)\n- Grants FREEZE_MANAGER_ROLE to freezeManager\n- Grants PAUSER_ROLE to pauser\n\n**onlySwapFacility Modifier**: All wrap/unwrap/replaceAssetWithM functions check msg.sender == swapFacility immutable. SwapFacility uses msgSender() to track original caller for hooks.","created_at":"2026-01-05T02:42:29.511Z","tags":"jmi,access-control,roles,openzeppelin,initialization"} {"id":"mem-cc4fdf6e3f1f237f","information":"Solana M-Extensions - Part 7: Security Model\n\nAccess control hierarchy:\n1. Admin: transfer_admin, add/remove_wrap_authority, claim_fees, set_fee, set_earn_authority, add/remove_earn_manager\n2. Wrap Authority: wrap, unwrap\n3. Earn Authority (crank): sync, claim_for\n4. Earn Manager (crank): add/remove/transfer_earner, configure_earn_manager\n5. Earner (crank): set_recipient\n\nCritical validations:\n- Collateralization: ext_supply + rewards <= vault_m_amount (prevents over-minting)\n- Vault freeze: vault_m_token_account.state == Initialized (ensures earner approval)\n- Index monotonicity: new_m_index >= last_m_index >= last_ext_index >= 1e12\n- Fee bounds: fee_bps <= 10000 (100%)\n- Authority checks: wrap_authorities.contains(signer), earn_authority == signer\n\nTwo-step admin transfer: Prevents accidental admin loss via pending_admin.\n\nAuditors: Asymmetric Research, Adevar Labs, OtterSec, Halborn (5 audit reports in /audits).","created_at":"2026-01-05T02:43:09.020Z","tags":"solana,m-extensions,security,access-control,audits"} {"id":"mem-ce10817154ce1f74","information":"Solana M-Extensions - Part 3: Wrap/Unwrap Mechanism\n\nWrap instruction (mint extension tokens):\n1. Validate signer in wrap_authorities\n2. sync_index() updates ext multiplier if needed\n3. Get current m_index and ext_index\n4. Convert: m_principal → m_amount (m_index) → ext_amount → ext_principal (ext_index)\n5. Transfer M tokens from user to vault (transfer_checked CPI)\n6. Mint Ext tokens to user (mint_to CPI with PDA signer)\n\nFormula: ext_principal = amount_to_principal_down(principal_to_amount_down(m_principal, m_index), ext_index)\n\nUnwrap instruction (burn extension tokens):\n1. Same auth and sync\n2. Convert: ext_principal → ext_amount → m_amount → m_principal\n3. Burn Ext tokens from user\n4. Transfer M tokens from vault to user (PDA signer)\n\nKey: All conversions round DOWN to prevent over-minting. Tokens stored as principal (rebasing-resistant), converted to amount for calculations.","created_at":"2026-01-05T02:42:36.332Z","tags":"solana,m-extensions,wrap,unwrap,conversion"} {"id":"mem-cfe1512d7a2e4aba","information":"JMIExtension Spec - Security Model & Attack Mitigations\n\n**Fee-on-Transfer Protection**\n```solidity\nuint256 balanceBefore = asset.balanceOf(this);\nasset.transferFrom(swapFacility, this, amount);\nuint256 received = asset.balanceOf(this) - balanceBefore;\nif (received < amount) revert InsufficientAssetReceived(...);\n```\nPrevents accounting discrepancy from deflationary tokens.\n\n**Inflation Attack Mitigation**\n- Uses cached assets[].balance not actual balance\n- Direct transfers bypass accounting → stuck forever\n- replaceAssetWithM can't drain more than tracked balance\n- Spec explicitly warns: \"Assets sent directly are stuck\"\n\n**Safe240 Casting**\n- Asset balances capped at uint240 max\n- Aligns with $M ecosystem supply limit\n- Prevents overflow beyond M protocol constraints\n\n**Asset Cap Enforcement**\n- Checked on every wrap operation\n- Cap in asset's native decimals (before conversion)\n- Can be dynamically adjusted by ASSET_CAP_MANAGER_ROLE\n- Protects against over-concentration in single collateral\n\n**Pausability Scope**\n- Blocks: wrap, unwrap, transfer, replaceAssetWithM\n- Does NOT block: role management, view functions, yield calculations\n- Emergency stop for exploit scenarios\n\n**Freezing Mechanism**\n- Per-account sanctions/compliance tool\n- Frozen accounts cannot send, receive, wrap, unwrap\n- Independent from pausability (different scopes)","created_at":"2026-01-04T21:48:30.908Z","tags":"m0,jmi,security,attack-mitigation,access-control"} {"id":"mem-d010955d4796a4cd","information":"Solana M-Extensions - Part 8: Token Extension Requirements\n\nFor Extension Mint:\n- MUST have freeze_authority (validated in Initialize)\n- ScaledUi variant: MUST use Token2022 with ScaledUiAmount extension\n- NoYield/Crank: Can use Token2022 OR legacy Token Program\n- CANNOT have transfer hooks or transfer tax (per README)\n- Mint authority MUST be PDA seeds=[b\"mint_authority\"]\n- ScaledUiAmount authority MUST match mint_authority PDA (if present)\n\nFor M Mint:\n- MUST use Token2022 (hardcoded checks)\n- Must have ScaledUiAmount extension (for index tracking)\n- Must have freeze authority (for earner permissioning)\n\nInitialize validation:\n- Checks ext_mint.supply == 0\n- Validates ext_mint decimals == m_mint decimals\n- For ScaledUi: Validates ext_token_program == Token2022 ID\n- For ScaledUi: Checks ScaledUiAmount extension exists\n- Validates vault_m_token_account is thawed (approved earner)\n- Validates wrap_authorities uniqueness (no duplicates)\n\nInitial indices: m_index from earn program, ext_index = 1e12 (1.0).","created_at":"2026-01-05T02:43:16.972Z","tags":"solana,m-extensions,token2022,extensions,validation"} +{"id":"mem-d13521c089c3a6d0","information":"Solana M-Extensions Architecture - Complete Synthesis\n\nPROGRAMS: (1) m_ext - 3 variants (no-yield/scaled-ui/crank) for wrapped M tokens with configurable yield; (2) ext_swap - atomic cross-extension swaps via two-phase unwrap→measure→wrap pattern.\n\nSTATE: ExtGlobalV2 (admin, ext_mint, m_mint, yield_config, wrap_authorities), EarnManager/Earner PDAs (crank-only), SwapGlobal (whitelists).\n\nINTEGRATION: Token-2022 ScaledUiAmountConfig via sync_index() CPI, PermanentDelegate for admin ops, DefaultAccountState for compliance. PDA patterns: [b\"global\"], [b\"mint_authority\"], [b\"m_vault\"], [b\"earn_manager\", key], [b\"earner\", user, manager].\n\nSECURITY: Two-step admin transfer, sync-before-modify pattern (prevent retroactive fees), integer math only (no f64), measured amounts (fee-on-transfer protection), explicit authority validation (has_one constraints), crank instruction type enforcement.\n\nNEW EXTENSIONS: (1) Add feature flag; (2) Extend YieldConfig; (3) Implement sync if mutable config; (4) Calculate mint size with ExtensionType::get_account_len; (5) Whitelist in ext_swap if needed.\n\nINVARIANTS: ext_mint.supply ≤ vault_m_account.amount, sync before config changes, round down conversions, measured actual balances.","created_at":"2026-01-05T13:03:05.401Z","tags":"solana,m-extensions,architecture,security,integration,overview"} {"id":"mem-d698798b29e557b1","information":"Solana M-Extensions - Part 6: EXT_SWAP Program\n\nTwo-phase atomic swap (unwrap from_ext → wrap to_ext):\n\nPhase 1 - Unwrap:\n- Burns from_ext principal from user\n- CPI to from_ext_program.unwrap()\n- Transfers M from from_vault to swap_m_account\n- Records m_delta (actual amount received)\n\nPhase 2 - Wrap:\n- Uses exact m_delta from Phase 1\n- CPI to to_ext_program.wrap()\n- Transfers M from swap_m_account to to_vault\n- Mints to_ext principal to user\n\nKey insight: M amount is intermediate, NOT user-specified. User specifies ext_principal IN, receives calculated ext_principal OUT based on index ratios.\n\nAuthority handling:\n- If swap_program in wrap_authorities: Uses swap_global PDA as authority\n- Else: Requires explicit wrap_authority/unwrap_authority signers\n\nSwapGlobal state: Maintains whitelisted_extensions (program_id + mint + token_program) and whitelisted_unwrappers.\n\nRemaining accounts: Supports variable split via remaining_accounts_split_idx for extensibility.","created_at":"2026-01-05T02:43:01.047Z","tags":"solana,m-extensions,ext-swap,swap,cpi"} {"id":"mem-de66ba3c435ef4d3","information":"Solana M-Extensions - Part 4: Index/Multiplier System\n\nIndex represents multiplier * 1e12. Constants: INDEX_SCALE_U64 = 1_000_000_000_000.\n\nKey functions:\n- multiplier_to_index(f64) → u64: Truncates multiplier * 1e12\n- principal_to_amount_down(principal, index): (index * principal) / 1e12 (rounds down)\n- amount_to_principal_down(amount, index): (amount * 1e12) / index (rounds down)\n- principal_to_amount_up: Adds (index - 1) before division for ceiling\n\nScaledUi sync_index():\n1. Calculate m_increase_factor = new_m_index / last_m_index\n2. Apply fee: ext_increase_factor = m_increase_factor^(1 - fee_on_yield)\n3. Calculate: new_ext_index = last_ext_index * ext_increase_factor\n4. CPI to update_multiplier on Token2022 mint\n\nCrank sync():\n- Only updates global_account indices (no Token2022 interaction)\n- new_ext_index = (last_ext_index * current_m_index) / last_m_index\n- Requires earn_authority signer\n\nPrecision: Uses f64.powf() with ~10^-16 error (acceptable for 10^-12 target).","created_at":"2026-01-05T02:42:45.059Z","tags":"solana,m-extensions,index,multiplier,conversion,math"} {"id":"mem-e0922cd876067080","information":"Solana vs EVM M-Extensions - Security Model Comparison\n\n**Common Security Principles:**\n- Two-step admin transfer (pending_admin pattern)\n- Collateralization invariants (supply <= backing)\n- Authority whitelisting (wrap_authorities vs SwapFacility exclusivity)\n- Freeze validation before operations\n\n**Solana-Specific Security (from 5 audits):**\n- Explicit account validation via has_one constraints\n- Token2022 extension whitelist for supported features\n- Down-rounding in all conversions prevents over-minting\n- CPI safety: verify program IDs before cross-program calls\n- Fuzzing: 3M+ executions verified vault solvency, index monotonicity, fee idempotency\n\n**EVM-Specific Security:**\n- Fee-on-transfer guard (balance before/after check)\n- Cached balance strategy prevents inflation attacks\n- Safe240 casts prevent overflow\n- Role-based permissions for 5 distinct operations (DEFAULT_ADMIN, ASSET_CAP_MANAGER, YIELD_RECIPIENT_MANAGER, FREEZE_MANAGER, PAUSER)\n- Auto-claim on yieldRecipient change prevents yield loss","created_at":"2026-01-05T02:47:57.984Z","tags":"solana,evm,m-extensions,security,audits,comparison"} -{"id":"mem-e18e37cd56a01c06","information":"Solana M-Extensions - Part 10: Build and Deployment\n\nFeature flags (Cargo.toml):\n- default = [\"no-yield\"]\n- scaled-ui, no-yield, crank (mutually exclusive)\n- migrate (for V1 upgrades)\n- wm = [\"crank\", \"migrate\"] (wM-specific)\n\nConstraint: Only ONE yield feature can be enabled (compile-time check in lib.rs lines 27-38).\n\nBuild optimization (release profile):\n- lto = \"fat\": Link-time optimization\n- codegen-units = 1: Single compilation unit\n- overflow-checks = true: Runtime overflow detection\n\nDeployment flow:\n1. Get extension approved as earner through M0 governance\n2. Extension added to merkle root, bridged to Solana\n3. Earn program thaws vault_m_token_account\n4. Deploy extension program with chosen variant\n5. Create ext_mint with correct properties\n6. Call initialize() with wrap_authorities\n7. (Optional) Get whitelisted on ext_swap\n\nProduction addresses:\n- Earn: mz2vDzjbQDUDXBH6FPF5s4odCJ4y8YLE5QWaZ8XdZ9Z\n- Portal: mzp1q2j5Hr1QuLC3KFBCAUz5aUckT6qyuZKZ3WJnMmY\n- wM: wMXX1K1nca5W4pZr1piETe78gcAVVrEFi9f4g46uXko\n\nTesting: Jest 29.0.3 with anchor-litesvm 0.1.2, covers all 5 variant combinations.","created_at":"2026-01-05T02:43:47.517Z","tags":"solana,m-extensions,build,deployment,configuration"} \ No newline at end of file +{"id":"mem-e18e37cd56a01c06","information":"Solana M-Extensions - Part 10: Build and Deployment\n\nFeature flags (Cargo.toml):\n- default = [\"no-yield\"]\n- scaled-ui, no-yield, crank (mutually exclusive)\n- migrate (for V1 upgrades)\n- wm = [\"crank\", \"migrate\"] (wM-specific)\n\nConstraint: Only ONE yield feature can be enabled (compile-time check in lib.rs lines 27-38).\n\nBuild optimization (release profile):\n- lto = \"fat\": Link-time optimization\n- codegen-units = 1: Single compilation unit\n- overflow-checks = true: Runtime overflow detection\n\nDeployment flow:\n1. Get extension approved as earner through M0 governance\n2. Extension added to merkle root, bridged to Solana\n3. Earn program thaws vault_m_token_account\n4. Deploy extension program with chosen variant\n5. Create ext_mint with correct properties\n6. Call initialize() with wrap_authorities\n7. (Optional) Get whitelisted on ext_swap\n\nProduction addresses:\n- Earn: mz2vDzjbQDUDXBH6FPF5s4odCJ4y8YLE5QWaZ8XdZ9Z\n- Portal: mzp1q2j5Hr1QuLC3KFBCAUz5aUckT6qyuZKZ3WJnMmY\n- wM: wMXX1K1nca5W4pZr1piETe78gcAVVrEFi9f4g46uXko\n\nTesting: Jest 29.0.3 with anchor-litesvm 0.1.2, covers all 5 variant combinations.","created_at":"2026-01-05T02:43:47.517Z","tags":"solana,m-extensions,build,deployment,configuration"} +{"id":"mem-eed27d435d854e4e","information":"M_EXT Crank Variant Yield Distribution Flow:\n\nThe crank variant implements a three-tier hierarchy for manual yield distribution that differs fundamentally from scaled-ui's automatic rebasing:\n\n**Roles:**\n1. **Admin**: Designates earn_authority, adds/removes EarnManagers\n2. **Earn Authority**: Calls sync() to update indices from M mint, then claim_for() to distribute yield to individual Earners\n3. **Earn Manager**: Manages groups of Earners, collects fees (0-10000 bps) from distributed yield\n4. **Earner**: Individual yield recipients, can set alternate recipient_token_account\n\n**Critical Flow (claim_for instruction)**:\n1. Earn authority calls claim_for(snapshot_balance) for specific Earner\n2. Program calculates: principal = amount_to_principal_down(snapshot_balance, last_claim_index)\n3. Calculates rewards: principal_to_amount_down(principal, current_index) - snapshot_balance\n4. Mints manager fee: (rewards * earn_manager.fee_bps) / 10000 to earn_manager.fee_token_account\n5. Mints net rewards to earner's recipient (or user_token_account if no recipient set)\n6. Updates earner.last_claim_index and last_claim_timestamp\n\nWHY this matters: Unlike scaled-ui where yield accrues automatically via multiplier updates, crank requires explicit claim_for calls for each earner. This enables flexible fee structures but requires off-chain coordination to ensure all earners get claimed. The snapshot_balance parameter allows earn_authority to batch-process claims based on off-chain indexer state.","created_at":"2026-01-05T12:47:54.516Z","tags":"solana,m-extensions,crank,yield-distribution,earn-system,claim-for,manual-distribution"} \ No newline at end of file From 8d91f9413607b06cb76c6f19ca5808ddd9843c88 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Mon, 12 Jan 2026 13:18:01 -0600 Subject: [PATCH 03/27] initial draft of src changes --- programs/ext_swap/Cargo.toml | 2 +- programs/ext_swap/src/instructions/mod.rs | 2 + .../src/instructions/replace_asset_with_m.rs | 243 ++++++++++++++++++ programs/ext_swap/src/instructions/swap.rs | 18 +- programs/ext_swap/src/instructions/wrap.rs | 50 ++-- programs/ext_swap/src/lib.rs | 7 + programs/m_ext/Cargo.toml | 3 + programs/m_ext/src/errors.rs | 13 + programs/m_ext/src/instructions/initialize.rs | 14 +- programs/m_ext/src/instructions/jmi/mod.rs | 9 + programs/m_ext/src/instructions/jmi/pause.rs | 26 ++ .../instructions/jmi/replace_asset_with_m.rs | 155 +++++++++++ .../src/instructions/jmi/set_asset_cap.rs | 82 ++++++ .../m_ext/src/instructions/jmi/unpause.rs | 26 ++ programs/m_ext/src/instructions/mod.rs | 8 + programs/m_ext/src/instructions/unwrap.rs | 13 + programs/m_ext/src/instructions/wrap.rs | 200 +++++++++----- programs/m_ext/src/lib.rs | 26 ++ programs/m_ext/src/state/asset_config.rs | 17 ++ programs/m_ext/src/state/mod.rs | 24 ++ programs/m_ext/src/utils/conversion.rs | 50 ++++ programs/m_ext/src/utils/token.rs | 53 ++++ 22 files changed, 948 insertions(+), 93 deletions(-) create mode 100644 programs/ext_swap/src/instructions/replace_asset_with_m.rs create mode 100644 programs/m_ext/src/instructions/jmi/mod.rs create mode 100644 programs/m_ext/src/instructions/jmi/pause.rs create mode 100644 programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs create mode 100644 programs/m_ext/src/instructions/jmi/set_asset_cap.rs create mode 100644 programs/m_ext/src/instructions/jmi/unpause.rs create mode 100644 programs/m_ext/src/state/asset_config.rs diff --git a/programs/ext_swap/Cargo.toml b/programs/ext_swap/Cargo.toml index 65f42c7..a325063 100644 --- a/programs/ext_swap/Cargo.toml +++ b/programs/ext_swap/Cargo.toml @@ -23,4 +23,4 @@ anchor-lang.workspace = true anchor-spl.workspace = true earn.workspace = true solana-security-txt.workspace = true -m_ext = {path = "../m_ext", features = ["cpi"]} +m_ext = {path = "../m_ext", features = ["cpi", "jmi"]} diff --git a/programs/ext_swap/src/instructions/mod.rs b/programs/ext_swap/src/instructions/mod.rs index 62a8a67..8e579da 100644 --- a/programs/ext_swap/src/instructions/mod.rs +++ b/programs/ext_swap/src/instructions/mod.rs @@ -1,10 +1,12 @@ pub mod initialize; +pub mod replace_asset_with_m; pub mod swap; pub mod unwrap; pub mod whitelist; pub mod wrap; pub use initialize::*; +pub use replace_asset_with_m::*; pub use swap::*; pub use unwrap::*; pub use whitelist::*; diff --git a/programs/ext_swap/src/instructions/replace_asset_with_m.rs b/programs/ext_swap/src/instructions/replace_asset_with_m.rs new file mode 100644 index 0000000..1fa2b64 --- /dev/null +++ b/programs/ext_swap/src/instructions/replace_asset_with_m.rs @@ -0,0 +1,243 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use m_ext::cpi::accounts::{ReplaceAssetWithM as ExtReplaceAssetWithM, Unwrap}; +use m_ext::state::{EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}; + +use crate::{ + errors::SwapError, + state::{SwapGlobal, GLOBAL_SEED}, +}; + +#[derive(Accounts)] +pub struct ReplaceAssetWithM<'info> { + pub signer: Signer<'info>, + + // Required if the swap program is not whitelisted on the extension + pub unwrap_authority: Option>, + pub replace_authority: Option>, + + /* + * Program globals + */ + #[account( + seeds = [GLOBAL_SEED], + bump = swap_global.bump, + )] + pub swap_global: Box>, + + /// Source extension global (for unwrap) + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + seeds::program = from_ext_program.key(), + bump, + )] + /// CHECK: CPI will validate the global account + pub from_global: AccountInfo<'info>, + + /// JMI extension global (for replace_asset_with_m) + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + seeds::program = jmi_ext_program.key(), + bump, + )] + /// CHECK: CPI will validate the global account + pub jmi_global: AccountInfo<'info>, + + /* + * Mints + */ + #[account(mut)] + /// Validated by unwrap on the extension program + pub from_mint: Box>, + #[account(mint::token_program = m_token_program)] + pub m_mint: Box>, + #[account(mint::token_program = asset_token_program)] + pub asset_mint: Box>, + + /* + * Asset config for JMI + */ + #[account(mut)] + /// CHECK: CPI will validate the asset config + pub asset_config: AccountInfo<'info>, + + /* + * Token Accounts + */ + #[account( + mut, + token::mint = from_mint, + token::token_program = from_token_program, + )] + pub from_token_account: Box>, + #[account( + mut, + token::mint = asset_mint, + token::token_program = asset_token_program, + )] + pub to_asset_token_account: Box>, + #[account( + mut, + associated_token::mint = m_mint, + associated_token::authority = swap_global, + associated_token::token_program = m_token_program, + )] + pub swap_m_account: Box>, + + /* + * Authorities & Vaults for source extension (unwrap) + */ + #[account( + seeds = [M_VAULT_SEED], + seeds::program = from_ext_program.key(), + bump, + )] + /// CHECK: account does not hold data + pub from_m_vault_auth: AccountInfo<'info>, + #[account( + seeds = [MINT_AUTHORITY_SEED], + seeds::program = from_ext_program.key(), + bump, + )] + /// CHECK: account does not hold data + pub from_mint_authority: AccountInfo<'info>, + #[account( + mut, + associated_token::mint = m_mint, + associated_token::authority = from_m_vault_auth, + associated_token::token_program = m_token_program, + )] + pub from_m_vault: Box>, + + /* + * Vaults for JMI extension (replace_asset_with_m) + */ + #[account( + seeds = [M_VAULT_SEED], + seeds::program = jmi_ext_program.key(), + bump, + )] + /// CHECK: account does not hold data + pub jmi_m_vault_auth: AccountInfo<'info>, + #[account( + mut, + associated_token::mint = m_mint, + associated_token::authority = jmi_m_vault_auth, + associated_token::token_program = m_token_program, + )] + pub jmi_m_vault: Box>, + #[account( + mut, + associated_token::mint = asset_mint, + associated_token::authority = jmi_m_vault_auth, + associated_token::token_program = asset_token_program, + )] + pub jmi_asset_vault: Box>, + + /* + * Token Programs + */ + pub from_token_program: Interface<'info, TokenInterface>, + pub asset_token_program: Interface<'info, TokenInterface>, + pub m_token_program: Interface<'info, TokenInterface>, + + /* + * Programs + */ + /// CHECK: checked against whitelisted extensions + pub from_ext_program: UncheckedAccount<'info>, + /// CHECK: checked against whitelisted extensions + pub jmi_ext_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, +} + +impl<'info> ReplaceAssetWithM<'info> { + fn validate(&self, from_principal: u64) -> Result<()> { + // Validate both extensions are whitelisted + for ext_program in [&self.from_ext_program, &self.jmi_ext_program] { + if !self.swap_global.is_extension_whitelisted(ext_program.key) { + return err!(SwapError::InvalidExtension); + } + } + + if from_principal == 0 { + return err!(SwapError::InvalidAmount); + } + + Ok(()) + } + + #[access_control(ctx.accounts.validate(from_principal))] + pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, from_principal: u64) -> Result<()> { + let m_pre_balance = ctx.accounts.swap_m_account.amount; + + // Set swap program as authority if none provided + let unwrap_authority = match &ctx.accounts.unwrap_authority { + Some(auth) => auth.to_account_info(), + None => ctx.accounts.swap_global.to_account_info(), + }; + + // 1. Unwrap source extension → M (to swap_m_account) + m_ext::cpi::unwrap( + CpiContext::new_with_signer( + ctx.accounts.from_ext_program.to_account_info(), + Unwrap { + token_authority: ctx.accounts.signer.to_account_info(), + unwrap_authority: Some(unwrap_authority), + m_mint: ctx.accounts.m_mint.to_account_info(), + ext_mint: ctx.accounts.from_mint.to_account_info(), + global_account: ctx.accounts.from_global.to_account_info(), + m_vault: ctx.accounts.from_m_vault_auth.to_account_info(), + ext_mint_authority: ctx.accounts.from_mint_authority.to_account_info(), + to_m_token_account: ctx.accounts.swap_m_account.to_account_info(), + vault_m_token_account: ctx.accounts.from_m_vault.to_account_info(), + from_ext_token_account: ctx.accounts.from_token_account.to_account_info(), + m_token_program: ctx.accounts.m_token_program.to_account_info(), + ext_token_program: ctx.accounts.from_token_program.to_account_info(), + }, + &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], + ), + from_principal, + )?; + + // 2. Calculate M received + ctx.accounts.swap_m_account.reload()?; + let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; + + // Set swap program as authority if none provided + let replace_authority = match &ctx.accounts.replace_authority { + Some(auth) => auth.to_account_info(), + None => ctx.accounts.swap_global.to_account_info(), + }; + + // 3. Call JMI replace_asset_with_m + m_ext::cpi::replace_asset_with_m( + CpiContext::new_with_signer( + ctx.accounts.jmi_ext_program.to_account_info(), + ExtReplaceAssetWithM { + token_authority: ctx.accounts.swap_global.to_account_info(), + replace_authority: Some(replace_authority), + m_mint: ctx.accounts.m_mint.to_account_info(), + asset_mint: ctx.accounts.asset_mint.to_account_info(), + global_account: ctx.accounts.jmi_global.to_account_info(), + asset_config: ctx.accounts.asset_config.to_account_info(), + m_vault: ctx.accounts.jmi_m_vault_auth.to_account_info(), + from_m_token_account: ctx.accounts.swap_m_account.to_account_info(), + vault_m_token_account: ctx.accounts.jmi_m_vault.to_account_info(), + vault_asset_token_account: ctx.accounts.jmi_asset_vault.to_account_info(), + to_asset_token_account: ctx.accounts.to_asset_token_account.to_account_info(), + m_token_program: ctx.accounts.m_token_program.to_account_info(), + asset_token_program: ctx.accounts.asset_token_program.to_account_info(), + }, + &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], + ), + m_amount, + )?; + + msg!("{} ext -> {} M -> asset", from_principal, m_amount); + + Ok(()) + } +} diff --git a/programs/ext_swap/src/instructions/swap.rs b/programs/ext_swap/src/instructions/swap.rs index 704dee6..c905c01 100644 --- a/programs/ext_swap/src/instructions/swap.rs +++ b/programs/ext_swap/src/instructions/swap.rs @@ -126,6 +126,9 @@ pub struct Swap<'info> { )] pub to_m_vault: Box>, + /// CHECK: validated within the destination wrap CPI if provided + pub asset_config: Option>, + /* * Token Programs */ @@ -227,16 +230,21 @@ impl<'info> Swap<'info> { Wrap { token_authority: ctx.accounts.swap_global.to_account_info(), wrap_authority: Some(wrap_authority), - m_mint: ctx.accounts.m_mint.to_account_info(), + source_mint: ctx.accounts.m_mint.to_account_info(), ext_mint: ctx.accounts.to_mint.to_account_info(), global_account: ctx.accounts.to_global.to_account_info(), - m_vault: ctx.accounts.to_m_vault_auth.to_account_info(), + source_vault: ctx.accounts.to_m_vault_auth.to_account_info(), ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), - from_m_token_account: ctx.accounts.swap_m_account.to_account_info(), - vault_m_token_account: ctx.accounts.to_m_vault.to_account_info(), + from_source_token_account: ctx.accounts.swap_m_account.to_account_info(), + vault_source_token_account: ctx.accounts.to_m_vault.to_account_info(), to_ext_token_account: ctx.accounts.to_token_account.to_account_info(), - m_token_program: ctx.accounts.m_token_program.to_account_info(), + source_token_program: ctx.accounts.m_token_program.to_account_info(), ext_token_program: ctx.accounts.to_token_program.to_account_info(), + asset_config: ctx + .accounts + .asset_config + .as_ref() + .map(|a| a.to_account_info()), }, &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], ) diff --git a/programs/ext_swap/src/instructions/wrap.rs b/programs/ext_swap/src/instructions/wrap.rs index 8f06123..0dc2ce1 100644 --- a/programs/ext_swap/src/instructions/wrap.rs +++ b/programs/ext_swap/src/instructions/wrap.rs @@ -36,18 +36,18 @@ pub struct Wrap<'info> { #[account(mut)] /// Validated by wrap on the extension program pub to_mint: Box>, - #[account(mint::token_program = m_token_program)] - pub m_mint: Box>, + #[account(mint::token_program = source_token_program)] + pub source_mint: Box>, /* * Token Accounts */ #[account( mut, - token::mint = m_mint, - token::token_program = m_token_program, + token::mint = source_mint, + token::token_program = source_token_program, )] - pub m_token_account: Box>, + pub source_token_account: Box>, #[account( mut, token::mint = to_mint, @@ -64,7 +64,7 @@ pub struct Wrap<'info> { bump, )] /// CHECK: account does not hold data - pub to_m_vault_auth: AccountInfo<'info>, + pub to_vault_auth: AccountInfo<'info>, #[account( seeds = [MINT_AUTHORITY_SEED], seeds::program = to_ext_program.key(), @@ -78,17 +78,20 @@ pub struct Wrap<'info> { */ #[account( mut, - associated_token::mint = m_mint, - associated_token::authority = to_m_vault_auth, - associated_token::token_program = m_token_program, + associated_token::mint = source_mint, + associated_token::authority = to_vault_auth, + associated_token::token_program = source_token_program, )] - pub to_m_vault: Box>, + pub to_source_vault: Box>, + + /// CHECK: validated within the destination wrap CPI if provided + pub asset_config: Option>, /* * Token Programs */ pub to_token_program: Interface<'info, TokenInterface>, - pub m_token_program: Interface<'info, TokenInterface>, + pub source_token_program: Interface<'info, TokenInterface>, /* * Programs @@ -99,7 +102,7 @@ pub struct Wrap<'info> { } impl<'info> Wrap<'info> { - fn validate(&self, m_principal: u64) -> Result<()> { + fn validate(&self, amount: u64) -> Result<()> { if !self .swap_global .is_extension_whitelisted(self.to_ext_program.key) @@ -107,15 +110,15 @@ impl<'info> Wrap<'info> { return err!(SwapError::InvalidExtension); } - if m_principal == 0 { + if amount == 0 { return err!(SwapError::InvalidAmount); } Ok(()) } - #[access_control(ctx.accounts.validate(m_principal))] - pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, m_principal: u64) -> Result<()> { + #[access_control(ctx.accounts.validate(amount))] + pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, amount: u64) -> Result<()> { // Set swap program as authority if none provided let wrap_authority = match &ctx.accounts.wrap_authority { Some(auth) => auth.to_account_info(), @@ -128,21 +131,26 @@ impl<'info> Wrap<'info> { ExtWrap { token_authority: ctx.accounts.signer.to_account_info(), wrap_authority: Some(wrap_authority), - m_mint: ctx.accounts.m_mint.to_account_info(), + source_mint: ctx.accounts.source_mint.to_account_info(), ext_mint: ctx.accounts.to_mint.to_account_info(), global_account: ctx.accounts.to_global.to_account_info(), - m_vault: ctx.accounts.to_m_vault_auth.to_account_info(), + source_vault: ctx.accounts.to_vault_auth.to_account_info(), ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), - from_m_token_account: ctx.accounts.m_token_account.to_account_info(), - vault_m_token_account: ctx.accounts.to_m_vault.to_account_info(), + from_source_token_account: ctx.accounts.source_token_account.to_account_info(), + vault_source_token_account: ctx.accounts.to_source_vault.to_account_info(), to_ext_token_account: ctx.accounts.to_token_account.to_account_info(), - m_token_program: ctx.accounts.m_token_program.to_account_info(), + source_token_program: ctx.accounts.source_token_program.to_account_info(), ext_token_program: ctx.accounts.to_token_program.to_account_info(), + asset_config: ctx + .accounts + .asset_config + .as_ref() + .map(|a| a.to_account_info()), }, &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], ) .with_remaining_accounts(ctx.remaining_accounts.to_vec()), - m_principal, + amount, ) } } diff --git a/programs/ext_swap/src/lib.rs b/programs/ext_swap/src/lib.rs index 0db817d..35be669 100644 --- a/programs/ext_swap/src/lib.rs +++ b/programs/ext_swap/src/lib.rs @@ -76,4 +76,11 @@ pub mod ext_swap { ) -> Result<()> { Unwrap::handler(ctx, amount) } + + pub fn replace_asset_with_m<'info>( + ctx: Context<'_, '_, '_, 'info, ReplaceAssetWithM<'info>>, + amount: u64, + ) -> Result<()> { + ReplaceAssetWithM::handler(ctx, amount) + } } diff --git a/programs/m_ext/Cargo.toml b/programs/m_ext/Cargo.toml index 1608d4e..71e9655 100644 --- a/programs/m_ext/Cargo.toml +++ b/programs/m_ext/Cargo.toml @@ -25,6 +25,9 @@ crank = [] migrate = [] wm = ["crank", "migrate"] +# JMI modifier (works WITH no-yield only) +jmi = [] + [dependencies] anchor-lang.workspace = true anchor-spl.workspace = true diff --git a/programs/m_ext/src/errors.rs b/programs/m_ext/src/errors.rs index 32b6c35..81e2f84 100644 --- a/programs/m_ext/src/errors.rs +++ b/programs/m_ext/src/errors.rs @@ -34,4 +34,17 @@ pub enum ExtError { InvalidTokenProgram, #[msg("Vault token account frozen.")] VaultFrozen, + + #[msg("Contract is paused.")] + Paused, + #[msg("Asset not allowed for wrapping.")] + AssetNotAllowed, + #[msg("Asset cap would be exceeded.")] + AssetCapExceeded, + #[msg("Insufficient M backing for unwrap.")] + InsufficientMBacking, + #[msg("Cannot set cap for M token.")] + CannotCapMToken, + #[msg("Insufficient asset backing for replacement.")] + InsufficientAssetBacking, } diff --git a/programs/m_ext/src/instructions/initialize.rs b/programs/m_ext/src/instructions/initialize.rs index ec70160..3a1d610 100644 --- a/programs/m_ext/src/instructions/initialize.rs +++ b/programs/m_ext/src/instructions/initialize.rs @@ -114,7 +114,11 @@ impl Initialize<'_> { // The wrap authorities are validated and stored in the global account. // The fee_bps is used by the scaled-ui variant. It is validated to be within the allowed range. // The earn_authority is only required for the crank variant. - fn validate(&self, _fee_bps: Option, _earn_authority: Option) -> Result<()> { + fn validate( + &self, + _fee_bps: Option, + _earn_authority: Option, + ) -> Result<()> { // Validate the ext_mint_authority PDA is the mint authority for the ext mint let ext_mint_authority = self.ext_mint_authority.key(); if self.ext_mint.mint_authority.unwrap_or_default() != ext_mint_authority { @@ -198,7 +202,15 @@ impl Initialize<'_> { last_ext_index: INDEX_SCALE_U64, // we set the extension index to 1.0 initially timestamp: timestamp as u64, }; + } else if #[cfg(feature = "jmi")] { + // JMI extends no-yield with additional fields + yield_config = YieldConfig { + yield_variant: YieldVariant::NoYield, + total_assets: 0, + is_paused: false, + }; } else { + // Base no-yield without JMI yield_config = YieldConfig { yield_variant: YieldVariant::NoYield, }; diff --git a/programs/m_ext/src/instructions/jmi/mod.rs b/programs/m_ext/src/instructions/jmi/mod.rs new file mode 100644 index 0000000..83bdeb4 --- /dev/null +++ b/programs/m_ext/src/instructions/jmi/mod.rs @@ -0,0 +1,9 @@ +pub mod pause; +pub mod replace_asset_with_m; +pub mod set_asset_cap; +pub mod unpause; + +pub use pause::*; +pub use replace_asset_with_m::*; +pub use set_asset_cap::*; +pub use unpause::*; diff --git a/programs/m_ext/src/instructions/jmi/pause.rs b/programs/m_ext/src/instructions/jmi/pause.rs new file mode 100644 index 0000000..649f0fd --- /dev/null +++ b/programs/m_ext/src/instructions/jmi/pause.rs @@ -0,0 +1,26 @@ +use anchor_lang::prelude::*; + +use crate::{ + errors::ExtError, + state::{ExtGlobalV2, EXT_GLOBAL_SEED}, +}; + +#[derive(Accounts)] +pub struct Pause<'info> { + pub admin: Signer<'info>, + + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + bump = global_account.bump, + has_one = admin @ ExtError::NotAuthorized, + )] + pub global_account: Account<'info, ExtGlobalV2>, +} + +impl Pause<'_> { + pub fn handler(ctx: Context) -> Result<()> { + ctx.accounts.global_account.yield_config.is_paused = true; + Ok(()) + } +} diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs new file mode 100644 index 0000000..153eb6f --- /dev/null +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -0,0 +1,155 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, Token2022, TokenAccount, TokenInterface}; + +use crate::{ + errors::ExtError, + state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, M_VAULT_SEED}, + utils::{ + conversion::convert_from_6_decimals, + token::{transfer_tokens, transfer_tokens_from_program_interface}, + }, +}; + +#[derive(Accounts)] +pub struct ReplaceAssetWithM<'info> { + pub token_authority: Signer<'info>, + + /// Will be set if a whitelisted authority is signing for a user + pub replace_authority: Option>, + + #[account(mint::token_program = m_token_program)] + pub m_mint: InterfaceAccount<'info, Mint>, + + #[account(mint::token_program = asset_token_program)] + pub asset_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + bump = global_account.bump, + has_one = m_mint @ ExtError::InvalidAccount, + )] + pub global_account: Account<'info, ExtGlobalV2>, + + #[account( + mut, + seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], + bump = asset_config.bump, + )] + pub asset_config: Account<'info, AssetConfig>, + + /// CHECK: Validated by seed + #[account( + seeds = [M_VAULT_SEED], + bump = global_account.m_vault_bump, + )] + pub m_vault: AccountInfo<'info>, + + #[account( + mut, + token::mint = m_mint, + token::token_program = m_token_program, + )] + pub from_m_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = m_mint, + associated_token::authority = m_vault, + associated_token::token_program = m_token_program, + )] + pub vault_m_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = asset_mint, + associated_token::authority = m_vault, + associated_token::token_program = asset_token_program, + )] + pub vault_asset_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + token::mint = asset_mint, + token::token_program = asset_token_program, + )] + pub to_asset_token_account: InterfaceAccount<'info, TokenAccount>, + + pub m_token_program: Program<'info, Token2022>, + pub asset_token_program: Interface<'info, TokenInterface>, +} + +impl ReplaceAssetWithM<'_> { + pub fn validate(&self, m_amount: u64) -> Result<()> { + let auth = match &self.replace_authority { + Some(auth) => auth.key, + None => self.token_authority.key, + }; + + // Ensure the caller is authorized (same as wrap/unwrap) + if !self.global_account.wrap_authorities.contains(auth) { + return err!(ExtError::NotAuthorized); + } + + if m_amount == 0 { + return err!(ExtError::InvalidAmount); + } + + // Validate the contract is not paused + if self.global_account.yield_config.is_paused { + return err!(ExtError::Paused); + } + + Ok(()) + } + + #[access_control(ctx.accounts.validate(m_amount))] + pub fn handler(ctx: Context, m_amount: u64) -> Result<()> { + // Convert M amount (6 decimals) to asset amount (asset decimals) + let asset_amount = convert_from_6_decimals(m_amount, ctx.accounts.asset_config.decimals)?; + + // Validate sufficient asset backing + if asset_amount > ctx.accounts.asset_config.balance { + return err!(ExtError::InsufficientAssetBacking); + } + + // Transfer M from caller to vault + transfer_tokens( + &ctx.accounts.from_m_token_account, + &ctx.accounts.vault_m_token_account, + m_amount, + &ctx.accounts.m_mint, + &ctx.accounts.token_authority.to_account_info(), + &ctx.accounts.m_token_program, + )?; + + // Transfer asset from vault to recipient + transfer_tokens_from_program_interface( + &ctx.accounts.vault_asset_token_account, + &ctx.accounts.to_asset_token_account, + asset_amount, + &ctx.accounts.asset_mint, + &ctx.accounts.m_vault, + &[&[M_VAULT_SEED, &[ctx.accounts.global_account.m_vault_bump]]], + &ctx.accounts.asset_token_program, + )?; + + // Update tracking + ctx.accounts.asset_config.balance = ctx + .accounts + .asset_config + .balance + .checked_sub(asset_amount) + .ok_or(ExtError::MathUnderflow)?; + + ctx.accounts.global_account.yield_config.total_assets = ctx + .accounts + .global_account + .yield_config + .total_assets + .checked_sub(m_amount) + .ok_or(ExtError::MathUnderflow)?; + + Ok(()) + } +} diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs new file mode 100644 index 0000000..8559f1c --- /dev/null +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -0,0 +1,82 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + errors::ExtError, + state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, M_VAULT_SEED}, +}; + +#[derive(Accounts)] +pub struct SetAssetCap<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account(mint::token_program = asset_token_program)] + pub asset_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + bump = global_account.bump, + has_one = admin @ ExtError::NotAuthorized, + )] + pub global_account: Account<'info, ExtGlobalV2>, + + #[account( + init_if_needed, + payer = admin, + space = 8 + AssetConfig::INIT_SPACE, + seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], + bump, + )] + pub asset_config: Account<'info, AssetConfig>, + + /// CHECK: PDA used as vault authority for all token types + #[account( + seeds = [M_VAULT_SEED], + bump = global_account.m_vault_bump, + )] + pub vault_authority: AccountInfo<'info>, + + /// Asset vault ATA - created if needed + #[account( + init_if_needed, + payer = admin, + associated_token::mint = asset_mint, + associated_token::authority = vault_authority, + associated_token::token_program = asset_token_program, + )] + pub vault_asset_token_account: InterfaceAccount<'info, TokenAccount>, + + pub asset_token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +impl SetAssetCap<'_> { + pub fn validate(&self) -> Result<()> { + // Cannot set cap for M token + if self.asset_mint.key() == self.global_account.m_mint { + return err!(ExtError::CannotCapMToken); + } + Ok(()) + } + + #[access_control(ctx.accounts.validate())] + pub fn handler(ctx: Context, cap: u64) -> Result<()> { + let asset_config = &mut ctx.accounts.asset_config; + + // If first initialization (all fields are zero), set decimals and bump + if asset_config.decimals == 0 && asset_config.cap == 0 && asset_config.balance == 0 { + asset_config.decimals = ctx.accounts.asset_mint.decimals; + asset_config.bump = ctx.bumps.asset_config; + } + + asset_config.cap = cap; + + Ok(()) + } +} diff --git a/programs/m_ext/src/instructions/jmi/unpause.rs b/programs/m_ext/src/instructions/jmi/unpause.rs new file mode 100644 index 0000000..975cd62 --- /dev/null +++ b/programs/m_ext/src/instructions/jmi/unpause.rs @@ -0,0 +1,26 @@ +use anchor_lang::prelude::*; + +use crate::{ + errors::ExtError, + state::{ExtGlobalV2, EXT_GLOBAL_SEED}, +}; + +#[derive(Accounts)] +pub struct Unpause<'info> { + pub admin: Signer<'info>, + + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + bump = global_account.bump, + has_one = admin @ ExtError::NotAuthorized, + )] + pub global_account: Account<'info, ExtGlobalV2>, +} + +impl Unpause<'_> { + pub fn handler(ctx: Context) -> Result<()> { + ctx.accounts.global_account.yield_config.is_paused = false; + Ok(()) + } +} diff --git a/programs/m_ext/src/instructions/mod.rs b/programs/m_ext/src/instructions/mod.rs index 2326a83..f98caf1 100644 --- a/programs/m_ext/src/instructions/mod.rs +++ b/programs/m_ext/src/instructions/mod.rs @@ -29,3 +29,11 @@ cfg_if::cfg_if!( pub use migrate::*; } ); + +// JMI-specific instructions +cfg_if::cfg_if!( + if #[cfg(feature = "jmi")] { + pub mod jmi; + pub use jmi::*; + } +); diff --git a/programs/m_ext/src/instructions/unwrap.rs b/programs/m_ext/src/instructions/unwrap.rs index c8570e8..6590134 100644 --- a/programs/m_ext/src/instructions/unwrap.rs +++ b/programs/m_ext/src/instructions/unwrap.rs @@ -95,6 +95,19 @@ impl Unwrap<'_> { return err!(ExtError::InvalidAmount); } + // JMI: validate M backing - amount must not exceed (ext_supply - total_assets) + #[cfg(feature = "jmi")] + { + let m_backing = self + .ext_mint + .supply + .checked_sub(self.global_account.yield_config.total_assets) + .ok_or(ExtError::MathOverflow)?; + if ext_principal > m_backing { + return err!(ExtError::InsufficientMBacking); + } + } + Ok(()) } diff --git a/programs/m_ext/src/instructions/wrap.rs b/programs/m_ext/src/instructions/wrap.rs index 0994dff..e06936e 100644 --- a/programs/m_ext/src/instructions/wrap.rs +++ b/programs/m_ext/src/instructions/wrap.rs @@ -1,26 +1,35 @@ use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, Token2022, TokenAccount, TokenInterface}; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, state::{ExtGlobalV2, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}, - utils::{ - conversion::{ - amount_to_principal_down, multiplier_to_index, principal_to_amount_down, sync_index, - }, - token::{mint_tokens, transfer_tokens}, - }, + utils::token::{mint_tokens, transfer_tokens_interface}, }; +#[cfg(feature = "jmi")] +use crate::state::{AssetConfig, ASSET_CONFIG_SEED}; + +use crate::utils::conversion::{ + amount_to_principal_down, multiplier_to_index, principal_to_amount_down, sync_index, +}; + +#[cfg(feature = "jmi")] +use crate::utils::conversion::convert_to_6_decimals; + +/// Unified Wrap accounts struct +/// - Non-JMI: source_mint must be M +/// - JMI: source_mint can be M or approved asset #[derive(Accounts)] pub struct Wrap<'info> { pub token_authority: Signer<'info>, - // Will be set if a whitelisted authority is signing for a user + /// Will be set if a whitelisted authority is signing for a user pub wrap_authority: Option>, - #[account(mint::token_program = m_token_program)] - pub m_mint: InterfaceAccount<'info, Mint>, + /// Source token mint (M for non-JMI; M or approved asset for JMI) + #[account(mint::token_program = source_token_program)] + pub source_mint: InterfaceAccount<'info, Mint>, #[account(mut, mint::token_program = ext_token_program)] pub ext_mint: InterfaceAccount<'info, Mint>, @@ -29,7 +38,6 @@ pub struct Wrap<'info> { mut, seeds = [EXT_GLOBAL_SEED], bump = global_account.bump, - has_one = m_mint @ ExtError::InvalidAccount, has_one = ext_mint @ ExtError::InvalidAccount, )] pub global_account: Account<'info, ExtGlobalV2>, @@ -39,7 +47,7 @@ pub struct Wrap<'info> { seeds = [M_VAULT_SEED], bump = global_account.m_vault_bump )] - pub m_vault: AccountInfo<'info>, + pub source_vault: AccountInfo<'info>, /// CHECK: This account is validated by the seed, it stores no data #[account( @@ -50,37 +58,43 @@ pub struct Wrap<'info> { #[account( mut, - token::mint = m_mint, - // signer must be authority of the from token account or delegated by the owner - // this is checked by the token program - token::token_program = m_token_program, + token::mint = source_mint, + token::token_program = source_token_program, )] - pub from_m_token_account: InterfaceAccount<'info, TokenAccount>, + pub from_source_token_account: InterfaceAccount<'info, TokenAccount>, #[account( mut, - associated_token::mint = m_mint, - associated_token::authority = m_vault, - associated_token::token_program = m_token_program, + associated_token::mint = source_mint, + associated_token::authority = source_vault, + associated_token::token_program = source_token_program, )] - pub vault_m_token_account: InterfaceAccount<'info, TokenAccount>, + pub vault_source_token_account: InterfaceAccount<'info, TokenAccount>, #[account( mut, token::mint = ext_mint, - // signer is arbitrary to allow wrapping to another user's account token::token_program = ext_token_program, )] pub to_ext_token_account: InterfaceAccount<'info, TokenAccount>, - // we have duplicate entries for the token2022 program since the interface needs to be consistent - // but we want to leave open the possibility that either may not have to be token2022 in the future - pub m_token_program: Program<'info, Token2022>, + #[cfg(feature = "jmi")] + /// AssetConfig for non-M assets (JMI only) + /// - JMI + M path: must be None + /// - JMI + asset path: must be Some with cap > 0 + #[account( + mut, + seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), source_mint.key().as_ref()], + bump = asset_config.bump, + )] + pub asset_config: Option>, + + pub source_token_program: Interface<'info, TokenInterface>, pub ext_token_program: Interface<'info, TokenInterface>, } impl Wrap<'_> { - pub fn validate(&self, m_principal: u64) -> Result<()> { + pub fn validate(&self, amount: u64) -> Result<()> { let auth = match &self.wrap_authority { Some(auth) => auth.key, None => self.token_authority.key, @@ -91,60 +105,116 @@ impl Wrap<'_> { return err!(ExtError::NotAuthorized); } - if m_principal == 0 { + if amount == 0 { return err!(ExtError::InvalidAmount); } + // Non-JMI: source_mint MUST be m_mint (replaces has_one constraint) + #[cfg(not(feature = "jmi"))] + { + if self.source_mint.key() != self.global_account.m_mint { + return err!(ExtError::InvalidAccount); + } + } + + // JMI: validate asset is either M or has an AssetConfig with cap > 0 + #[cfg(feature = "jmi")] + { + let is_m = self.source_mint.key() == self.global_account.m_mint; + if !is_m { + match &self.asset_config { + Some(config) => { + if config.cap == 0 { + return err!(ExtError::AssetNotAllowed); + } + } + None => { + return err!(ExtError::AssetNotAllowed); + } + } + } + } + Ok(()) } - #[access_control(ctx.accounts.validate(m_principal))] - pub fn handler(ctx: Context, m_principal: u64) -> Result<()> { + // Single unified handler for all feature combinations + #[access_control(ctx.accounts.validate(amount))] + pub fn handler(ctx: Context, amount: u64) -> Result<()> { let authority_seeds: &[&[&[u8]]] = &[&[ MINT_AUTHORITY_SEED, &[ctx.accounts.global_account.ext_mint_authority_bump], ]]; - // If necessary, sync the index between M and Ext tokens - // Return the current value to use for conversions - let ext_index: u64 = sync_index( - &mut ctx.accounts.ext_mint, - &mut ctx.accounts.global_account, - &ctx.accounts.m_mint, - &ctx.accounts.vault_m_token_account, - &ctx.accounts.ext_mint_authority, - authority_seeds, - &ctx.accounts.ext_token_program, - )?; + let mut ext_amount = { + let ext_index: u64 = sync_index( + &mut ctx.accounts.ext_mint, + &mut ctx.accounts.global_account, + &ctx.accounts.source_mint, + &ctx.accounts.vault_source_token_account, + &ctx.accounts.ext_mint_authority, + authority_seeds, + &ctx.accounts.ext_token_program, + )?; + + let m_scaled_ui_config = + earn::utils::conversion::get_scaled_ui_config(&ctx.accounts.source_mint)?; + let m_index = multiplier_to_index(m_scaled_ui_config.new_multiplier.into())?; + + amount_to_principal_down(principal_to_amount_down(amount, m_index)?, ext_index)? + }; - // Get the current M index - let m_scaled_ui_config = - earn::utils::conversion::get_scaled_ui_config(&ctx.accounts.m_mint)?; - let m_index = multiplier_to_index(m_scaled_ui_config.new_multiplier.into())?; - - // Calculate the principal amount of ext tokens to mint - // based on the principal amount of m tokens to wrap - let ext_principal = - amount_to_principal_down(principal_to_amount_down(m_principal, m_index)?, ext_index)?; - - // Transfer the amount of m tokens from the user to the m vault - transfer_tokens( - &ctx.accounts.from_m_token_account, // from - &ctx.accounts.vault_m_token_account, // to - m_principal, // amount - &ctx.accounts.m_mint, // mint - &ctx.accounts.token_authority.to_account_info(), // authority - &ctx.accounts.m_token_program, // token program + // JMI: cap tracking for non-M assets (only with no-yield) + #[cfg(feature = "jmi")] + { + let is_m = ctx.accounts.source_mint.key() == ctx.accounts.global_account.m_mint; + if !is_m { + let asset_config = ctx + .accounts + .asset_config + .as_mut() + .ok_or(ExtError::AssetNotAllowed)?; + + let new_balance = asset_config + .balance + .checked_add(amount) + .ok_or(ExtError::MathOverflow)?; + if new_balance > asset_config.cap { + return err!(ExtError::AssetCapExceeded); + } + asset_config.balance = new_balance; + + let amount_in_6_decimals = convert_to_6_decimals(amount, asset_config.decimals)?; + ctx.accounts.global_account.yield_config.total_assets = ctx + .accounts + .global_account + .yield_config + .total_assets + .checked_add(amount_in_6_decimals) + .ok_or(ExtError::MathOverflow)?; + + ext_amount = amount_in_6_decimals; + } + } + + // Transfer source tokens from user to vault + transfer_tokens_interface( + &ctx.accounts.from_source_token_account, + &ctx.accounts.vault_source_token_account, + amount, + &ctx.accounts.source_mint, + &ctx.accounts.token_authority.to_account_info(), + &ctx.accounts.source_token_program, )?; - // Mint the amount of ext tokens to the user + // Mint ext tokens to user mint_tokens( - &ctx.accounts.to_ext_token_account, // to - ext_principal, // amount - &ctx.accounts.ext_mint, // mint - &ctx.accounts.ext_mint_authority, // authority - authority_seeds, // authority seeds - &ctx.accounts.ext_token_program, // token program + &ctx.accounts.to_ext_token_account, + ext_amount, + &ctx.accounts.ext_mint, + &ctx.accounts.ext_mint_authority, + authority_seeds, + &ctx.accounts.ext_token_program, )?; Ok(()) diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index d0edb80..3477dc2 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -44,6 +44,11 @@ const _: () = { "Invalid feature configuration: 'migrate' and 'crank' cannot be enabled without 'wm'" ); } + + // JMI can only be used with no-yield (not scaled-ui or crank) + if cfg!(feature = "jmi") && (cfg!(feature = "scaled-ui") || cfg!(feature = "crank")) { + panic!("JMI feature can only be enabled with no-yield variant"); + } }; #[program] @@ -110,6 +115,27 @@ pub mod m_ext { RevokeAdminTransfer::handler(ctx) } + // JMI-specific instructions + #[cfg(feature = "jmi")] + pub fn set_asset_cap(ctx: Context, cap: u64) -> Result<()> { + SetAssetCap::handler(ctx, cap) + } + + #[cfg(feature = "jmi")] + pub fn pause(ctx: Context) -> Result<()> { + Pause::handler(ctx) + } + + #[cfg(feature = "jmi")] + pub fn unpause(ctx: Context) -> Result<()> { + Unpause::handler(ctx) + } + + #[cfg(feature = "jmi")] + pub fn replace_asset_with_m(ctx: Context, m_amount: u64) -> Result<()> { + ReplaceAssetWithM::handler(ctx, m_amount) + } + #[cfg(feature = "crank")] pub fn set_earn_authority( ctx: Context, diff --git a/programs/m_ext/src/state/asset_config.rs b/programs/m_ext/src/state/asset_config.rs new file mode 100644 index 0000000..726f174 --- /dev/null +++ b/programs/m_ext/src/state/asset_config.rs @@ -0,0 +1,17 @@ +use anchor_lang::prelude::*; + +/// Per-asset configuration for JMI multi-asset backing +/// PDA seeds: [ASSET_CONFIG_SEED, global_account, asset_mint] +#[account] +#[derive(InitSpace)] +pub struct AssetConfig { + /// Maximum balance allowed for this asset (in asset decimals, 0 = disabled) + pub cap: u64, + /// Current tracked balance (in asset decimals) + pub balance: u64, + /// Asset decimals (cached from mint) + pub decimals: u8, + /// PDA bump seed + pub bump: u8, +} +// Size: 8 (discriminator) + 8 + 8 + 1 + 1 = 26 bytes diff --git a/programs/m_ext/src/state/mod.rs b/programs/m_ext/src/state/mod.rs index 9efa039..a54e36f 100644 --- a/programs/m_ext/src/state/mod.rs +++ b/programs/m_ext/src/state/mod.rs @@ -41,6 +41,10 @@ pub const MINT_AUTHORITY_SEED: &[u8] = b"mint_authority"; #[constant] pub const M_VAULT_SEED: &[u8] = b"m_vault"; +#[cfg(feature = "jmi")] +#[constant] +pub const ASSET_CONFIG_SEED: &[u8] = b"asset_config"; + #[derive(AnchorSerialize, AnchorDeserialize, Clone)] #[repr(u8)] pub enum YieldVariant { @@ -92,7 +96,27 @@ cfg_if! { pub use earner::*; pub use earn_manager::*; + } else if #[cfg(feature = "jmi")] { + // JMI extends no-yield with additional fields + #[derive(AnchorSerialize, AnchorDeserialize, Clone)] + pub struct YieldConfig { + pub yield_variant: YieldVariant, // 1 byte + pub total_assets: u64, // 8 bytes - sum of non-M assets (6 decimals) + pub is_paused: bool, // 1 byte - global pause state + } + + impl YieldConfig { + pub fn space() -> usize { + 1 + // yield_variant + 8 + // total_assets + 1 // is_paused + } + } + + pub mod asset_config; + pub use asset_config::*; } else { + // Base no-yield without JMI #[derive(AnchorSerialize, AnchorDeserialize, Clone)] pub struct YieldConfig { pub yield_variant: YieldVariant, // variant of yield config diff --git a/programs/m_ext/src/utils/conversion.rs b/programs/m_ext/src/utils/conversion.rs index c28059b..cdca357 100644 --- a/programs/m_ext/src/utils/conversion.rs +++ b/programs/m_ext/src/utils/conversion.rs @@ -187,6 +187,56 @@ pub fn index_to_multiplier(index: u64) -> Result { Ok(index as f64 / INDEX_SCALE_F64) } +/// Convert an amount from its native decimals to 6 decimals (M's precision) +/// Used by JMI for tracking total_assets +#[cfg(feature = "jmi")] +pub fn convert_to_6_decimals(amount: u64, from_decimals: u8) -> Result { + const TARGET_DECIMALS: u8 = 6; + + if from_decimals == TARGET_DECIMALS { + return Ok(amount); + } + + if from_decimals > TARGET_DECIMALS { + // Scale down (e.g., 18 decimals to 6) + let divisor = 10u64 + .checked_pow((from_decimals - TARGET_DECIMALS) as u32) + .ok_or(ExtError::MathOverflow)?; + amount.checked_div(divisor).ok_or(ExtError::MathUnderflow.into()) + } else { + // Scale up (e.g., 2 decimals to 6) + let multiplier = 10u64 + .checked_pow((TARGET_DECIMALS - from_decimals) as u32) + .ok_or(ExtError::MathOverflow)?; + amount.checked_mul(multiplier).ok_or(ExtError::MathOverflow.into()) + } +} + +/// Convert an amount from 6 decimals (M's precision) to target decimals +/// Used by JMI for converting ext amounts to asset decimals +#[cfg(feature = "jmi")] +pub fn convert_from_6_decimals(amount: u64, to_decimals: u8) -> Result { + const FROM_DECIMALS: u8 = 6; + + if to_decimals == FROM_DECIMALS { + return Ok(amount); + } + + if to_decimals > FROM_DECIMALS { + // Scale up (e.g., 6 decimals to 18) + let multiplier = 10u64 + .checked_pow((to_decimals - FROM_DECIMALS) as u32) + .ok_or(ExtError::MathOverflow)?; + amount.checked_mul(multiplier).ok_or(ExtError::MathOverflow.into()) + } else { + // Scale down (e.g., 6 decimals to 2) + let divisor = 10u64 + .checked_pow((FROM_DECIMALS - to_decimals) as u32) + .ok_or(ExtError::MathOverflow)?; + amount.checked_div(divisor).ok_or(ExtError::MathUnderflow.into()) + } +} + pub fn get_mint_extensions<'info>( mint: &InterfaceAccount<'info, Mint>, ) -> Result> { diff --git a/programs/m_ext/src/utils/token.rs b/programs/m_ext/src/utils/token.rs index 1ce6849..e97ba4c 100644 --- a/programs/m_ext/src/utils/token.rs +++ b/programs/m_ext/src/utils/token.rs @@ -56,6 +56,59 @@ pub fn transfer_tokens<'info>( Ok(()) } +/// Transfer tokens using the generic TokenInterface (supports both Token and Token2022) +/// Used by JMI for multi-asset support +pub fn transfer_tokens_interface<'info>( + from: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: u64, + mint: &InterfaceAccount<'info, Mint>, + authority: &AccountInfo<'info>, + token_program: &Interface<'info, TokenInterface>, +) -> Result<()> { + // Build the arguments for the transfer instruction + let transfer_options = TransferChecked { + from: from.to_account_info(), + to: to.to_account_info(), + mint: mint.to_account_info(), + authority: authority.clone(), + }; + let cpi_context = CpiContext::new(token_program.to_account_info(), transfer_options); + + // Call the transfer instruction + transfer_checked(cpi_context, amount, mint.decimals)?; + + Ok(()) +} + +/// Transfer tokens from a program-owned account using PDA signer with TokenInterface +/// Supports both SPL Token and Token2022 +pub fn transfer_tokens_from_program_interface<'info>( + from: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: u64, + mint: &InterfaceAccount<'info, Mint>, + authority: &AccountInfo<'info>, + authority_seeds: &[&[&[u8]]], + token_program: &Interface<'info, TokenInterface>, +) -> Result<()> { + let transfer_options = TransferChecked { + from: from.to_account_info(), + to: to.to_account_info(), + mint: mint.to_account_info(), + authority: authority.clone(), + }; + let cpi_context = CpiContext::new_with_signer( + token_program.to_account_info(), + transfer_options, + authority_seeds, + ); + + transfer_checked(cpi_context, amount, mint.decimals)?; + + Ok(()) +} + // Convenience functions to mint and burn tokens from a program using a PDA signer pub fn mint_tokens<'info>( From 2403720e6a3347e32234270bdc7f58d1ca72eed5 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Mon, 12 Jan 2026 13:19:36 -0600 Subject: [PATCH 04/27] removed hive --- .hive/issues.jsonl | 11 ----------- .hive/memories.jsonl | 43 ------------------------------------------- 2 files changed, 54 deletions(-) delete mode 100644 .hive/issues.jsonl delete mode 100644 .hive/memories.jsonl diff --git a/.hive/issues.jsonl b/.hive/issues.jsonl deleted file mode 100644 index 9069a4a..0000000 --- a/.hive/issues.jsonl +++ /dev/null @@ -1,11 +0,0 @@ -{"id":"cell-3rwh3f-mk0ju2wieyj","title":"Comparative Research: Solana vs EVM M-Extensions","description":"Research and analyze both Solana M-Extensions (current repo) and EVM M-Extensions (github.com/m0-foundation/evm-m-extensions) with focus on architectural similarities, differences, and cross-chain compatibility considerations","status":"open","priority":1,"issue_type":"epic","created_at":"2026-01-05T02:36:12.978Z","updated_at":"2026-01-05T02:36:12.978Z","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk0ju2wmj30","title":"Research Solana M-Extensions Architecture","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.982Z","updated_at":"2026-01-05T02:49:09.019Z","closed_at":"2026-01-05T02:49:09.019Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk0ju2wo0kc","title":"Research EVM M-Extensions Implementation","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.984Z","updated_at":"2026-01-05T02:49:10.021Z","closed_at":"2026-01-05T02:49:10.021Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk0ju2wps8w","title":"Analyze Audit Reports for Security Patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T02:36:12.985Z","updated_at":"2026-01-05T02:49:11.316Z","closed_at":"2026-01-05T02:49:11.316Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk0ju2wrukx","title":"Synthesize Comparative Analysis","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-05T02:36:12.987Z","updated_at":"2026-01-05T02:49:12.317Z","closed_at":"2026-01-05T02:49:12.317Z","parent_id":"cell-3rwh3f-mk0ju2wieyj","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk15j9bxlm2","title":"Understand solana-m-extensions architecture","description":"High-level overview of program purposes, extension interactions, and key state structures for planning new extension additions","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-05T12:43:39.645Z","updated_at":"2026-01-05T13:05:20.340Z","closed_at":"2026-01-05T13:05:20.340Z","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk15j9c2kyn","title":"Analyze m_ext program structure and purpose","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.650Z","updated_at":"2026-01-05T12:52:55.188Z","closed_at":"2026-01-05T12:52:55.188Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk15j9c4frj","title":"Analyze ext_swap program structure and purpose","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.652Z","updated_at":"2026-01-05T12:52:57.497Z","closed_at":"2026-01-05T12:52:57.497Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk15j9c6d3d","title":"Analyze test suite and integration patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.654Z","updated_at":"2026-01-05T12:57:29.068Z","closed_at":"2026-01-05T12:57:29.068Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk15j9c8s76","title":"Review audit reports for security patterns","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.656Z","updated_at":"2026-01-05T12:52:59.085Z","closed_at":"2026-01-05T12:52:59.085Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} -{"id":"cell-3rwh3f-mk15j9c97n5","title":"Synthesize architectural overview document","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T12:43:39.657Z","updated_at":"2026-01-05T13:05:18.419Z","closed_at":"2026-01-05T13:05:18.419Z","parent_id":"cell-3rwh3f-mk15j9bxlm2","dependencies":[],"labels":[],"comments":[]} diff --git a/.hive/memories.jsonl b/.hive/memories.jsonl deleted file mode 100644 index cf901e7..0000000 --- a/.hive/memories.jsonl +++ /dev/null @@ -1,43 +0,0 @@ -{"id":"mem-07b9b4409ecdff33","information":"M-Extensions Crank System Security (V2 Audits)\n\n**Key Vulnerabilities in Earn/Crank Architecture**:\n\n1. **Instruction Type Enforcement** (Halborn V2 HIGH): InboxItem destination type not enforced - wrong release function locks funds permanently. Must validate mint_type matches instruction.\n\n2. **Sync-Before-Remove Pattern** (Adevar V2 L03): Removing earner without sync loses pending yield. Always sync before removing/modifying yield participants.\n\n3. **Active Status Checks** (Adevar V2 L02): Inactive earn manager can redirect yield. Validate authority AND active status in yield paths.\n\n4. **Frozen Account Abuse** (Adevar V2 L04): Earn manager sets frozen token account to block earner yield (DoS). Check account.state == Initialized before CPI.\n\n5. **Migration Handling** (Adevar V2 L05): Donations to old vault cause migration failure. Handle unexpected balances gracefully.\n\n6. **Scalability Limit** (Adevar): Jito bundles support ~12 extensions max (5 tx × 35 accounts ÷ 7 per op). Beyond this, arbitrage possible. Mitigation: Execute highest→lowest yield order.\n\n**Access Hierarchy**: Admin → Wrap Authority → Earn Authority → Earn Manager → Earner","created_at":"2026-01-05T12:51:51.938Z","tags":"solana,m-extensions,crank,security,v2-audit"} -{"id":"mem-1112b12b6c4c7c76","information":"Solana M-Extensions - Part 2: State Accounts\n\nExtGlobalV2 structure:\n- admin (Pubkey): Config authority\n- pending_admin (Option): Two-step transfer\n- ext_mint, m_mint, m_earn_global_account (Pubkeys)\n- bump, m_vault_bump, ext_mint_authority_bump (u8)\n- yield_config (YieldConfig): Variant-specific state\n- wrap_authorities (Vec): Whitelist for wrap/unwrap\n\nYieldConfig variants:\n- NoYield: 1 byte (just variant tag)\n- ScaledUi: 25 bytes (variant + fee_bps + last_m_index + last_ext_index)\n- Crank: 57 bytes (variant + earn_authority + last_m_index + last_ext_index + timestamp)\n\nEarner (crank): Tracks per-user yield with last_claim_index, last_claim_timestamp, user, user_token_account, earn_manager, optional recipient_token_account.\n\nEarnManager (crank): Manages earner groups with is_active, fee_bps (0-10000), fee_token_account.\n\nAccount size formula: 8 + 32 + 33 + 96 + 3 + YieldConfig::space() + 4 + 32*wrap_authorities.len()","created_at":"2026-01-05T02:42:29.339Z","tags":"solana,m-extensions,state-management,accounts"} -{"id":"mem-1828176cd0619fb8","information":"JMIExtension - wrap() Implementation Details\n\n**Access**: onlySwapFacility modifier (msg.sender must be swapFacility immutable address)\n\n**Flow**:\n1. Validate asset (not 0x0, not mToken itself) - reverts InvalidAsset\n2. Validate recipient (not 0x0) - reverts InvalidRecipient \n3. Validate amount > 0 - reverts InsufficientAmount\n4. _beforeWrap checks: isAllowedToWrap (cap check), not paused, account/recipient not frozen\n5. Record balanceBefore = IERC20(asset).balanceOf(this)\n6. safeTransferFrom(swapFacility, this, amount) in asset decimals\n7. **Fee-on-Transfer Guard**: Compare balanceAfter - balanceBefore == amount, revert InsufficientAssetReceived if mismatch\n8. Convert to extension decimals: jmiAmount = amount / 10^(assetDecimals - 6) for high-decimal assets\n9. Validate jmiAmount > 0 (prevents truncation to zero)\n10. Update: assets[asset].balance += safe240(amount), totalAssets += jmiAmount\n11. Mint jmiAmount to recipient\n\n**Key**: Amount parameter is in asset's native decimals. Balance stored in asset decimals. totalAssets in extension decimals (6).","created_at":"2026-01-05T02:42:07.149Z","tags":"jmi,wrap,implementation,fee-on-transfer,decimal-conversion"} -{"id":"mem-1c8087e9416dd2c6","information":"Solana M-Extensions - Part 9: Gotchas and Edge Cases\n\n1. ScaledUi REQUIRES Token2022: Will fail InvalidTokenProgram if wrong program\n2. Vault must be thawed: Initialize fails if vault frozen (not yet approved earner by M0)\n3. Index sync is idempotent: Multiple txs can sync, last wins (no race issues)\n4. Fee precision loss: ScaledUi uses f64.powf(), loses ~10^-16 precision (acceptable)\n5. EarnManager fee opt-out: If fee_token_account closed, fee silently skipped (no revert)\n6. Double-claim prevention: Earner can't claim twice in same cycle (last_claim_index check)\n7. Shared wrap authorities: Same authorities for both wrap AND unwrap (not separate)\n8. M vault MUST be ATA: vault_m_token_account must be associated_token of m_vault PDA\n9. Swap whitelist required: ext_swap only works with whitelisted extensions\n10. Remaining accounts split: Swap requires correct split_idx or fails InvalidIndex\n\nRounding strategy: ALL conversions round DOWN in favor of protocol (prevents over-minting).\n\nOptional signers: wrap_authority and unwrap_authority can be None (falls back to token_authority).\n\nOrphaned earner cleanup: remove_orphaned_earner instruction handles stuck accounts.","created_at":"2026-01-05T02:43:32.241Z","tags":"solana,m-extensions,gotchas,edge-cases,best-practices"} -{"id":"mem-1cf41cafac0f7917","information":"Solana M-Extensions - Part 5: Crank Yield Distribution\n\nClaimFor instruction (earn_authority only):\n1. Validate earner.last_claim_index < global.last_ext_index (prevent double-claim)\n2. Calculate rewards: (snapshot_balance * global_index / last_claim_index) - snapshot_balance\n3. Validate collateralization: ext_supply + rewards <= principal_to_amount_down(vault_m_amount, m_index)\n4. Calculate EarnManager fee if active: fee = (rewards * fee_bps) / 10000 (rounded down)\n5. Mint fee to earn_manager_token_account (if exists, else skip)\n6. Mint (rewards - fee) to recipient_token_account or user_token_account\n7. Update earner.last_claim_index and last_claim_timestamp\n8. Emit RewardsClaim event\n\nEarnManager operations:\n- add_earner: Creates Earner account with current global index\n- remove_earner: Closes Earner account\n- transfer_earner: Moves to different manager\n- configure_earn_manager: Updates fee_bps\n\nDoS prevention: If fee_token_account closed, fee silently skipped (doesn't revert transaction).","created_at":"2026-01-05T02:42:52.399Z","tags":"solana,m-extensions,crank,yield,claim,earn-manager"} -{"id":"mem-1edb78877570ff8b","information":"M-Extensions Security Patterns - Complete Checklist\n\nACCESS CONTROL:\n- Two-step admin transfer: transfer_admin() sets pending_admin → accept_admin() atomic swap\n- Role hierarchy (crank): Admin > EarnAuthority (claim_for) > EarnManager (add/remove earners) > Earner (set_recipient)\n- Explicit validation: ALWAYS use has_one constraints, NEVER rely on implicit Anchor checks\n\nSYNC-BEFORE-MODIFY:\n- CRITICAL: Call sync_index() before config changes (fee_bps, wrap_authorities) to prevent retroactive fee application\n- Adevar Finding #2: Changing fee without sync applies new fee to historical yield\n\nFLOATING POINT:\n- Use integer math with basis points: amount * fee_bps / 10_000\n- Conversion utils: multiplier_to_index (f64→u64), principal_to_amount_down, amount_to_principal_down\n- ALWAYS round down in protocol favor\n\nTOKEN VALIDATION:\n- Validate mint::token_program in all accounts\n- Fee-on-transfer protection: measure actual balance changes, not calculated estimates\n- Pattern: let actual = balance_after - balance_before\n\nCRANK SECURITY (Halborn V2):\n- Validate InboxItem instruction type discriminator\n- Timestamp checks prevent replay: clock.unix_timestamp > last_claim_timestamp\n- Apply earn_manager fee BEFORE earner distribution\n- Cleanup: remove_orphaned_earner() for inactive managers","created_at":"2026-01-05T13:03:39.762Z","tags":"solana,m-extensions,security,access-control,sync-pattern,floating-point,crank,audits"} -{"id":"mem-1f9158e131072f9d","information":"M-Extensions Audit Security Patterns - Sync-Before-Modify Pattern\n\n**CRITICAL PATTERN: Always Sync Multiplier Before Config Changes**\n\nAdevar audit Finding #2 identified retroactive fee application vulnerability:\n\n```rust\n// VULNERABLE - Fee change affects past yield\npub fn set_fee(ctx: Context, new_fee_bps: u64) -> Result<()> {\n ctx.accounts.ext_global.fee_bps = new_fee_bps; // ← Applied retroactively!\n Ok(())\n}\n\n// SECURE - Sync first, then update\npub fn set_fee(ctx: Context, new_fee_bps: u64) -> Result<()> {\n sync_multiplier(&ctx)?; // ← Lock in old fee rate for past yield\n ctx.accounts.ext_global.fee_bps = new_fee_bps; // ← Only affects future yield\n Ok(())\n}\n```\n\n**Why this matters**: Without syncing first, the new fee retroactively affects ALL accumulated yield since last sync. This breaks economic guarantees for users.\n\n**Core Invariants Protected by Sync**:\n1. `ext_supply + rewards <= vault_m_amount` (collateralization)\n2. `new_m_index >= last_m_index >= last_ext_index >= 1e12` (monotonicity)\n3. Fee boundaries: `fee_bps <= 10000` (100%)\n\n**General Pattern**: Before ANY state change that affects yield calculation (fee, mint, authority), call sync to checkpoint current state with old parameters.\n\n**Related**: Adevar V2 L03 - Earners lose pending yield when removed because removal doesn't sync first. Same root cause.","created_at":"2026-01-05T12:50:54.025Z","tags":"solana,m-extensions,security,yield,sync-pattern,audits,adevar"} -{"id":"mem-2870afd93a575921","information":"JMIExtension Spec - Invariants & Edge Cases\n\n**Mandatory Invariants (from spec)**\n1. totalAssets ≤ totalSupply (always)\n - Maintained by paired state updates on wrap/replace\n2. totalAssets == Σ(asset balances in extension decimals)\n - Conversion functions ensure consistency\n\n**Implicit Invariants**\n1. mBalanceOf(this) ≥ mBacking (for unwrap to work)\n - Can break if replaceAssetWithM depletes $M too fast\n - Protected by isAllowedToUnwrap() check\n2. Cached balance ≥ Actual balance (for non-M assets)\n - Breaks on direct transfers (by design)\n\n**Critical Edge Cases**\n1. Truncation on high-decimal wraps\n - Wrapping 1 wei DAI → 0 JMI → reverts (InsufficientAmount)\n - Minimum wrap DAI: 1e12 (0.000001 DAI)\n\n2. Overflow on low-decimal scale-up\n - 4-decimal asset * 100 can overflow\n - Solidity 0.8.26 reverts on overflow\n\n3. Cap checked before conversion\n - Asset cap in asset's decimals, not extension decimals\n - Example: DAI cap of 1M checked as 1_000_000e18\n\n4. M backing exhaustion\n - Cannot unwrap if totalAssets == totalSupply (no M backing)\n - Requires solvers to replace assets with M\n\n5. Yield recipient change\n - Auto-claims pending yield for old recipient first\n - Prevents yield loss on recipient change\n\n**Solver Backend Requirements** (from spec)\n- Monitor AssetReplacedWithM events\n- Trigger when totalAssets high / M backing low\n- Acquire M, call replaceAssetWithM, receive collateral\n- Purpose: Convert non-M collateral → M for yield generation","created_at":"2026-01-04T21:48:40.688Z","tags":"m0,jmi,invariants,edge-cases,solver-integration"} -{"id":"mem-2cd05921967db163","information":"JMIExtension - setAssetCap() & Yield Management\n\n**setAssetCap(address asset, uint256 cap)**:\n- Access: ASSET_CAP_MANAGER_ROLE only\n- Validates asset != 0x0 and asset != mToken (M has no cap)\n- Cap in asset's native decimals (e.g., 1_000_000e18 for 1M DAI)\n- **Gas Optimization**: If assets[asset].decimals == 0, fetches IERC20(asset).decimals() and caches it. Subsequent calls skip this fetch.\n- Early return if cap unchanged\n- Emits AssetCapSet(asset, cap)\n\n**isAllowedToWrap(address asset, uint256 amount)**:\n- Returns false if amount == 0\n- M (primary asset): Always returns true (no cap)\n- Non-M assets: Returns assetCap(asset) >= (assetBalanceOf(asset) + amount)\n- Cap checked in asset's decimals BEFORE conversion to extension decimals\n\n**claimYield()** (inherited from MYieldToOne):\n- Calculates yield = mBalanceOf(this) - _mBacking() where _mBacking() = totalSupply - totalAssets\n- If yield > 0, mints yield to yieldRecipient\n- After claim: totalSupply increases, mBacking increases by same amount, yield resets to 0\n- Yield accrues automatically from M's rebasing nature, no manual sync needed\n\n**setYieldRecipient(address account)**:\n- Access: YIELD_RECIPIENT_MANAGER_ROLE only\n- CRITICAL: Calls claimYield() FIRST to claim pending yield for old recipient before switch\n- Prevents yield loss on recipient change\n- Reverts ZeroYieldRecipient if account == 0x0\n- Emits YieldRecipientSet(account)","created_at":"2026-01-05T02:42:58.806Z","tags":"jmi,setAssetCap,yield,claimYield,gas-optimization"} -{"id":"mem-2ea0fdb7e4a97c8a","information":"M_EXT Program Instruction Organization Pattern:\n\nThe m_ext program uses a hierarchical feature-based instruction organization that's critical for understanding code flow:\n\n1. **Root level** (programs/m_ext/src/instructions/): Core instructions available across all variants (wrap, unwrap, initialize, transfer_admin, claim_fees, manage_wrap_authority)\n\n2. **Variant-specific subdirectories**:\n - scaled_ui/ - ScaledUi variant instructions (set_fee, sync)\n - crank/ - Crank variant with role-based hierarchy:\n - admin/ (set_earn_authority, add/remove_earn_manager)\n - earn_authority/ (claim_for, sync)\n - earn_manager/ (add/remove/transfer_earner, configure)\n - earner/ (set_recipient)\n - remove_orphaned_earner.rs (open instruction)\n\n3. **Feature flag coordination**: lib.rs uses cfg_if! to conditionally compile instruction modules based on features. Instructions are feature-gated at both module inclusion (mod.rs) and entrypoint (lib.rs #[program]) levels.\n\nWHY this matters: When tracing instruction execution, you must check BOTH the Cargo.toml features AND the instruction's module path to understand which variant-specific code is active. The same instruction name (e.g., \"sync\") has different implementations across variants.","created_at":"2026-01-05T12:47:38.855Z","tags":"solana,m-extensions,architecture,instruction-organization,feature-flags,code-structure"} -{"id":"mem-306ee6b2a1887e89","information":"Analyzed liquidity-delivery/svm Solana Anchor project dependencies:\n\n**Core Dependencies (from Cargo.lock):**\n- anchor-lang: 0.31.1\n- anchor-spl: 0.31.1\n- solana-program: 2.2.1\n- agave packages (feature-set, precompiles, etc.): 3.0.8\n\n**Required Toolchain Versions:**\n- Rust: 1.88.0 (as specified in README)\n- Solana CLI: 2.2.1 (matches solana-program version in Cargo.lock)\n- Anchor CLI: 0.31.1 (must match anchor-lang version)\n\n**Key Finding:** The README already specifies correct versions, but the agave version (3.0.8) is implicitly tied to Solana 2.2.1. Users must have EXACT versions:\n- Rust 1.88.0\n- Solana/Agave 2.2.1\n- Anchor 0.31.1\n\n**Optional Dependencies:**\n- Node: 24.10.0 (mentioned in README, not currently used)\n- pnpm: 9.15.4 (package_manager in Anchor.toml, no package.json exists)\n\n**Current README Status:** Already comprehensive and accurate. Specifies all pinned versions correctly. Only minor improvement needed: clarify that agave 3.0.8 is bundled with Solana 2.2.1.","created_at":"2026-01-04T17:53:25.446Z","tags":"solana,anchor,rust,dependencies,version-pinning,build-requirements"} -{"id":"mem-33e2828bfb4def9e","information":"JMI Extension - Integration & Deployment\n\n## SwapFacility Integration\n- **Exclusive Gateway**: Only SwapFacility can call wrap/unwrap/replaceAssetWithM\n- Uses ISwapFacility.msgSender() to track original caller for hooks\n- User flow: User → SwapFacility → JMIExtension\n- SwapFacility handles M token approvals\n\n## M Token Integration \n- Implements IMTokenLike interface\n- Can toggle earning: enableEarning() / disableEarning()\n- Earning status affects yield accrual\n- Yield = mBalanceOf(this) - mBacking\n\n## Deployment Pattern\n- TransparentUpgradeableProxy\n- Constructor: sets immutables (mToken, swapFacility), disables initializers\n- Initialize: sets name, symbol, yieldRecipient, grants roles, sets initial caps\n\n## Testing Insights (from unit tests)\n- Fuzz tests: decimal conversions, cap boundaries, overflow scenarios\n- Mock assets: USDC (6 decimals), DAI (18), 4-decimal asset\n- Fee-on-transfer rejection verified\n- Inflation attack prevention tested\n- Safe240 overflow handling\n\n## Audits Available\n- Multiple audits in /audits/JMI/\n- Certora formal verification\n- ChainSecurity review","created_at":"2026-01-04T21:43:47.247Z","tags":"m0,jmi,deployment,testing,integration"} -{"id":"mem-35770db254617e4c","information":"Solana vs EVM M-Extensions - Architecture Comparison\n\n**Conceptual Equivalents:**\n- Program/Contract: Solana uses two programs (m_ext + ext_swap); EVM uses inheritance (JMIExtension → MYieldToOne → MExtension)\n- Global State: Solana uses ExtGlobalV2 PDA at [global] seed; EVM uses ERC-7201 namespaced storage at deterministic slots\n- Access Control: Solana uses has_one = admin constraints + wrap_authorities Vec; EVM uses 5-role OpenZeppelin AccessControl\n- Upgradeability: Solana uses anchor upgrade; EVM uses TransparentUpgradeableProxy\n- Yield Variants: Solana uses compile-time features (no-yield, scaled-ui, crank); EVM uses runtime inheritance\n\n**Platform Constraint Differences:**\n- Solana externalizes state to PDAs with explicit seeds; EVM uses contract storage\n- Solana requires rent-exemption (~1-2 SOL); EVM pays gas per operation\n- Solana composability via CPI; EVM via function calls\n- Solana two-program pattern (ext_swap delegates via CPI); EVM single contract with SwapFacility msgSender() delegation","created_at":"2026-01-05T02:47:43.108Z","tags":"solana,evm,m-extensions,architecture,comparison,cross-chain"} -{"id":"mem-3a9be4569b6e53da","information":"M-Extensions Integration Patterns - Token-2022 and CPI\n\nTOKEN-2022 EXTENSIONS:\nScaledUiAmountConfig (scaled-ui variant):\n- Purpose: Rebasing token (UI amount = principal × multiplier)\n- Integration: sync_index() CPI to spl_token_2022::extension::scaled_ui_amount::instruction::update_multiplier()\n- Authority: ext_mint_authority PDA has update permission\n- CRITICAL: Sync before wrap authority/fee changes\n\nPermanentDelegate: Extension mint authority for admin ops (fee collection). Validate delegate authority = expected PDA.\n\nDefaultAccountState: New accounts start frozen/initialized for compliance.\n\nCPI PATTERNS:\nm_ext wrap: sync_index() → transfer_tokens(m) → mint_tokens(ext)\next_swap (atomic two-phase):\n Phase 1: CPI from_ext_program.unwrap() → measure M = swap_m_account.amount - initial_balance\n Phase 2: CPI to_ext_program.wrap(measured_M)\n \nCross-program PDA validation:\n#[account(seeds = [EXT_GLOBAL_SEED], seeds::program = from_ext_program.key(), bump)]\n\nDYNAMIC CPI (ext_swap):\n- remaining_accounts split at idx: [from_accounts..., to_accounts...]\n- Build instruction dynamically for whitelisted programs\n- invoke_signed with swap authority seeds","created_at":"2026-01-05T13:03:54.653Z","tags":"solana,m-extensions,token-2022,cpi,scaled-ui,permanent-delegate,cross-program"} -{"id":"mem-40f6ec85ac0655a2","information":"Solana vs EVM M-Extensions - Wrap/Unwrap Mechanism Comparison\n\n**Solana Wrap Flow:**\n1. Validate signer in wrap_authorities whitelist\n2. sync_index() updates multiplier (ScaledUi: Token2022 extension; Crank: global state)\n3. Transfer M from user → m_vault\n4. Calculate ext_principal = m_amount * 1e12 / index (round DOWN)\n5. Mint ext_principal to user\n6. Verify: ext_supply + rewards <= vault_m_amount\n\n**EVM Wrap Flow:**\n1. Check cached balance: require(assetBalanceOf == assets[asset].balance)\n2. balanceBefore = mToken.balanceOf(address(this))\n3. safeTransferFrom(msg.sender, this, mAssetAmount)\n4. balanceAfter = mToken.balanceOf(address(this))\n5. Revert if balanceBefore + amount != balanceAfter (fee-on-transfer protection)\n6. Mint extension tokens (1:1 after decimal conversion)\n\n**Key Difference:** Solana uses index-based conversion with round-down; EVM uses balance validation with fee-on-transfer protection. Solana applies fee via ext_increase = m_increase^(1-fee); EVM doesn't have fee-on-transfer in M token.","created_at":"2026-01-05T02:47:50.808Z","tags":"solana,evm,m-extensions,wrap,unwrap,conversion,comparison"} -{"id":"mem-44324b6d5d81c4a4","information":"Cross-Chain Bridging for Solana-EVM M-Extensions\n\n**Fundamental Challenges:**\n1. Account model vs contract storage (explicit vs implicit context)\n2. Rent vs gas economics\n3. Index precision differences (u128 * 1e12 vs uint256 decimal conversion)\n4. Yield distribution (compile-time vs runtime)\n\n**Potential Bridging Points:**\n1. Canonical M Token Mapping: m_mint (Solana) ↔ mToken (EVM) with decimal normalization\n2. Extension Token Representation: ext_mint ↔ JMIExtension contract address\n3. State Synchronization: Index/multiplier sync, yield accumulation coordination\n4. Collateralization Verification: Cross-chain proof of reserves\n\n**Recommended Architecture:**\n- Lock-and-Mint Pattern: Lock ext tokens on source → Emit event → Relayer submits proof → Mint wrapped tokens on destination\n- Index Synchronization: Periodic oracle updates push Solana index → EVM state\n- Security: Rate limiting, emergency pause, validator set security critical\n- Invariant: sum(ext_supply_all_chains) <= sum(m_backing_all_chains)\n\n**Bridge Options:** Wormhole or LayerZero for message passing between Solana and EVM chains","created_at":"2026-01-05T02:48:06.190Z","tags":"cross-chain,bridging,solana,evm,m-extensions,wormhole,layerzero"} -{"id":"mem-5147e997f161d3ff","information":"M-Extensions New Extension Integration Guide\n\nADDING NEW YIELD VARIANT (requires fork):\n1. Add mutually-exclusive feature flag in Cargo.toml\n2. Extend YieldVariant enum in state/mod.rs\n3. Implement YieldConfig struct with cfg_if! block, add space() method\n4. Add variant-specific instructions (sync, claim, config)\n5. Update utils/conversion.rs sync_index() for new variant\n6. MAINTAIN INVARIANTS: ext_mint.supply ≤ vault_m_account.amount, sync before config changes, use measured amounts\n\nADDING NEW TOKEN-2022 EXTENSION:\n1. Declare in Initialize: ExtensionType::YourExtension\n2. Calculate mint size: ExtensionType::get_account_len::(&[extensions])\n3. If mutable config: Assign PDA authority (ext_mint_authority), implement sync instruction with CPI\n4. Update test harness create_mint_with_extensions()\n5. Validate authority: has_one constraints for extension PDAs\n\nEXAMPLE - TransferFee Extension:\n```rust\n// Initialize.rs\nlet extensions = vec![ExtensionType::ScaledUiAmountConfig, ExtensionType::TransferFeeConfig];\n// YieldConfig\npub struct YieldConfig { /*...*/ transfer_fee_bps: u64 }\n// Sync instruction\npub fn sync_transfer_fee(ctx: Context) -> Result<()> {\n let ix = spl_token_2022::extension::transfer_fee::instruction::set_transfer_fee(...);\n invoke_signed(&ix, accounts, &[authority_seeds])?;\n}\n```\n\nWHITELISTING IN EXT_SWAP:\n1. Deploy m_ext variant with unique program_id\n2. Admin calls whitelist_extension(program_id, mint, token_program)\n3. Swap validates whitelist, uses remaining_accounts for dynamic CPI","created_at":"2026-01-05T13:04:11.665Z","tags":"solana,m-extensions,integration,new-extensions,token-2022,yield-variant,whitelist"} -{"id":"mem-59acaa84cadb234d","information":"M-Extensions Detailed State Relationships\n\nExtGlobalV2 (PDA seeds=[b\"global\"]):\n- admin: Pubkey (config authority)\n- pending_admin: Option (two-step transfer pattern)\n- ext_mint: Pubkey (Token-2022 mint)\n- m_mint: Pubkey (M token reference)\n- m_earn_global_account: Pubkey\n- yield_config: YieldConfig (variant enum: NoYield | ScaledUi{fee_bps, last_m_index, last_ext_index} | Crank{earn_authority, last_m/ext_index, timestamp})\n- wrap_authorities: Vec\n\nCrank Hierarchy (crank variant only):\nEarnManager (seeds=[b\"earn_manager\", manager_pubkey]) → Earner (seeds=[b\"earner\", user, manager])\n- Manager: earn_manager authority, is_active, fee_bps, fee_token_account\n- Earner: user, user_token_account, earn_manager, recipient_token_account (optional), last_claim_index, last_claim_timestamp\n\nSwapGlobal (seeds=[b\"global\"], ext_swap):\n- admin, whitelisted_unwrappers: Vec, whitelisted_extensions: Vec<{program_id, mint, token_program}>\n\nKey PDAs: ext_mint_authority (mints/burns), m_vault (holds collateral), swap_m_account (intermediate buffer).","created_at":"2026-01-05T13:03:19.025Z","tags":"solana,m-extensions,state-accounts,pda-patterns,earn-manager,earner"} -{"id":"mem-71905a721f735005","information":"JMIExtension Specification - Core Design Patterns\n\n**Multi-Asset Collateral Model**\n- totalSupply = $M backing + totalAssets (non-M collateral)\n- $M backing calculated as: totalSupply - totalAssets \n- Yield = mBalance - $M backing\n\n**Decimal Conversion Rules** (Critical for correctness)\n- Always truncates down (rounds in protocol's favor)\n- DAI (18d) → JMI (6d): divides by 1e12 (loses up to 1e12-1 wei)\n- 4-decimal → JMI (6d): multiplies by 100 (can overflow)\n- USDC (6d) → JMI (6d): 1:1 exact\n\n**State Management**\n- Asset struct: cap (uint256), balance (uint240), decimals (uint8)\n- uint240 limit aligns with $M max supply\n- Decimals cached on first setAssetCap for gas efficiency\n- totalAssets tracks aggregate in extension decimals (6)\n\n**SwapFacility Trust Model**\n- Immutable address set in constructor\n- Only SwapFacility can call wrap/unwrap/replaceAssetWithM\n- JMI trusts SwapFacility for reentrancy, validation, user approvals\n- Single point of trust architecture\n\n**Yield Mechanism**\n- $M is rebasing token with continuous accrual\n- Yield auto-accrues without manual updates\n- claimYield() mints NEW JMI tokens to yieldRecipient\n- After claim: totalSupply increases, yield() resets to 0","created_at":"2026-01-04T21:48:22.933Z","tags":"m0,jmi,specification,design-patterns,decimal-conversion"} -{"id":"mem-729d932423b302b5","information":"JMI Extension - Security & Patterns\n\n## Key Security Features\n1. **Fee-on-Transfer Guard**: Checks balanceBefore vs balanceAfter, reverts if mismatch\n2. **Safe240 Casting**: Asset balances capped at uint240 max (aligns with M supply)\n3. **Inflation Protection**: replaceAssetWithM uses cached balance not actual\n4. **Reentrancy**: SwapFacility enforces via ReentrancyLock\n5. **Decimal Truncation**: Always rounds down to prevent excess minting\n6. **SwapFacility Exclusive**: ONLY SwapFacility can call wrap/unwrap/replace\n\n## Access Control Roles\n- ASSET_CAP_MANAGER_ROLE: setAssetCap(asset, cap)\n- YIELD_RECIPIENT_MANAGER_ROLE: setYieldRecipient(account) \n- FREEZE_MANAGER_ROLE: freeze/unfreeze accounts\n- PAUSER_ROLE: pause/unpause all user actions\n- DEFAULT_ADMIN_ROLE: grant/revoke roles\n\n## Critical Invariants\n1. totalSupply == mBacking + totalAssets\n2. yield = mBalance - mBacking (excess M)\n3. assetBalanceOf(asset) + amount <= assetCap(asset)\n\n## Common Gotchas\n- Truncation: 1 wei DAI wraps to 0 JMI (reverts)\n- Asset cap checked before conversion (in asset decimals)\n- Cannot unwrap if all backing is non-M assets\n- Direct asset transfers bypass accounting (use cached balance)","created_at":"2026-01-04T21:43:40.000Z","tags":"m0,jmi,security,solidity,access-control"} -{"id":"mem-75957c04ec1d3974","information":"PR Review Agent Structure: Use mode:subagent, temperature:0.1, write:false, edit:false, but ENABLE bash:true (needed for cargo clippy, cargo fmt --check, cargo test, anchor build). Review format: 1-Summary 2-Critical Issues (security MUST FIX) 3-Major Issues (logic bugs SHOULD FIX) 4-Minor Issues (quality improvements) 5-Positive Feedback 6-Tool Output. Project uses Anchor 0.31.1 with anchor-litesvm for tests, patterns: instructions/, state/, error.rs with #[error_code], constants.rs for magic numbers.","created_at":"2026-01-04T18:35:12.683Z","tags":"code-review,agent-config,pr-review,solana,anchor"} -{"id":"mem-77812921332c4dd0","information":"M_EXT Integration with SPL Token-2022 ScaledUiAmount Extension:\n\nThe scaled-ui variant uses a critical integration with Token-2022's ScaledUiAmount extension that requires specific CPI patterns:\n\n**Key Integration Points:**\n\n1. **Multiplier Updates (sync_index function)**:\n - Uses invoke_signed (not anchor CpiContext) to call spl_token_2022::extension::scaled_ui_amount::instruction::update_multiplier()\n - Requires ext_token_program.key() == spl_token_2022::ID (safety check before CPI)\n - After invoke_signed, MUST call ext_mint.reload() to reflect new multiplier in account data\n\n2. **Index Conversion Logic**:\n - M index → Ext index: Apply fee_bps calculation\n - Index → Multiplier: index_to_multiplier(ext_index) = (ext_index as f64) / INDEX_SCALE_F64\n - Multiplier → Index: multiplier_to_index(multiplier) = (multiplier * INDEX_SCALE_F64) as u64\n - INDEX_SCALE = 1e12 (1 trillion) for precision\n\n3. **Vault State Check**:\n - Only updates multiplier if vault_m_token_account.state == AccountState::Initialized (not frozen)\n - If frozen, updates last_m_index but returns current ext_index without rebasing\n - This prevents yield distribution when vault is not earning from M mint\n\nWHY this matters: The ScaledUiAmount extension automatically rebases all token balances when multiplier changes, so sync() effectively distributes yield to ALL holders atomically. The invoke_signed + reload pattern is critical - forgetting reload() causes stale multiplier in subsequent calculations. The vault state check ensures the program doesn't distribute yield it hasn't earned.","created_at":"2026-01-05T12:48:14.985Z","tags":"solana,m-extensions,scaled-ui,spl-token-2022,scaled-ui-amount,cpi,invoke-signed,multiplier,rebasing"} -{"id":"mem-77ddec869efa7b6c","information":"JMIExtension Storage Architecture (ERC-7201)\n\n**JMIExtensionStorageStruct** (slot 0x4717d46f2e033163981fa31651301a35281b6b08316965d315fd1577bad94b00):\n- mapping(address => Asset) assets with struct Asset { uint256 cap, uint240 balance, uint8 decimals }\n- uint256 totalAssets (aggregate non-M in extension decimals)\n\n**MYieldToOneStorageStruct** (slot 0xee2f6fc7e2e5879b17985791e0d12536cba689bda43c77b8911497248f4af100):\n- uint256 totalSupply\n- address yieldRecipient \n- mapping(address => uint256) balanceOf\n\n**Inheritance**: JMIExtension → MYieldToOne → MExtension → ERC20ExtendedUpgradeable + Freezable + Pausable\n\n**Immutables** (set in constructor, cannot change): mToken, swapFacility\n\nConstructor disables initializers on implementation contract. Deployed via TransparentUpgradeableProxy pattern.","created_at":"2026-01-05T02:41:55.108Z","tags":"jmi,erc7201,storage,architecture,upgradeable"} -{"id":"mem-7a5e732d21d67c9f","information":"Code Review Agent for Solana/Anchor: Available tools are CASS (session search), cargo clippy v0.1.88, rustfmt v1.8.0, Rust v1.88.0, Anchor v0.31.1. Agent should have bash:true to run linters and tests. Key focus: Solana security (account validation, signer checks, PDA validation, overflow protection), Anchor patterns (account constraints, space calc, CPI safety), Rust best practices (no unwrap, checked math, proper error handling). Common vulnerabilities: missing signer validation, integer overflow, unvalidated ownership, improper PDA seeds, missing status checks.","created_at":"2026-01-04T18:35:04.653Z","tags":"code-review,solana,anchor,rust,security,pr-review"} -{"id":"mem-7b3a8fb4267c764f","information":"Solana M-Extensions Program Architecture - Part 1: Core Overview\n\nM-Extensions implements wrapper tokens backed 1:1 by M0 $M stablecoin using Anchor 0.31.1 on Solana 2.1.0.\n\nTwo programs: m_ext (3C865D264L4NkAm78zfnDzQJJvXuU3fMjRUvRxyPi5da) and ext_swap (MSwapi3WhNKMUGm9YrxGhypgUEt7wYQH3ZgG32XoWzH).\n\nThree yield variants (compile-time features):\n- NoYield: All yield to admin\n- ScaledUi: Automatic rebasing via Token2022 ScaledUiAmount extension\n- Crank: Manual distribution via earn_authority with EarnManager/Earner hierarchy\n\nPDA patterns:\n- ExtGlobalV2: seeds=[b\"global\"] - main state\n- Mint Authority: seeds=[b\"mint_authority\"] - mints extension tokens\n- M Vault: seeds=[b\"m_vault\"] - holds collateral\n- Earner: seeds=[b\"earner\", user_token_account] - yield tracking (crank only)\n- EarnManager: seeds=[b\"earn_manager\", manager_pubkey] - manager state (crank only)\n\nDependencies: spl-token-2022 v7.0.0, earn program from m0-foundation/solana-m.","created_at":"2026-01-05T02:42:20.759Z","tags":"solana,m-extensions,architecture,pda,anchor"} -{"id":"mem-8073133a37f39fa6","information":"M-Extensions Audit Security Patterns - Cross-Chain Bridge Considerations\n\n**Portal/Bridge Security Patterns from V2 Audits**\n\n**Inbound Rate Limit Bypass** (Adevar V2 M01 - MEDIUM)\n- Multi-transceiver portal configurations can bypass rate limits\n- Issue: Rate limit checked using WRONG amount variable\n- **Pattern**: When aggregating messages from multiple sources (transceivers), validate EACH source independently AND aggregated total\n\n**Mint Validation in Cross-Chain Context** (Halborn V2)\n- Insufficient M-token mint validation during earn program initialization\n- Bridge must validate: mint address, authority, decimals, extensions\n- **Why critical**: Wrong mint allows fake tokens to be accepted as collateral\n\n**Release Instruction Mapping** (Halborn V2 - HIGH)\n```rust\n// InboxItem specifies destination: M-token or Extension-token\n// MUST enforce correct release instruction\n\nstruct InboxItem {\n destination_mint: Pubkey,\n mint_type: MintType, // M or Extension\n amount: u64,\n}\n\n// Release instructions must validate mint_type matches\npub fn release_inbound_mint(inbox_item) {\n require!(inbox_item.mint_type == MintType::M, WrongReleaseInstruction);\n}\n\npub fn release_inbound_mint_extension(inbox_item) {\n require!(inbox_item.mint_type == MintType::Extension, WrongReleaseInstruction);\n}\n```\n\n**Why this matters**: Permissionless release means attacker can call wrong instruction, causing M-tokens to be minted but locked in portal (not transferred to recipient). Funds permanently lost.\n\n**Token Account Ownership Validation**:\n- Verify token accounts owned by correct program (Token vs Token2022)\n- Check token account authority matches expected PDA\n- Validate mint matches expected mint for that account\n\n**General Bridge Pattern**: \n1. Validate message source/transceiver authenticity\n2. Check rate limits per-source AND aggregated\n3. Validate destination mint configuration\n4. Enforce correct instruction for mint type\n5. Verify token account ownership/authority","created_at":"2026-01-05T12:51:40.342Z","tags":"solana,m-extensions,bridge,portal,cross-chain,security,audits,v2"} -{"id":"mem-88fda62c93c6365f","information":"M-Extensions Bridge/Portal Security (V2 Audits)\n\n**Critical Portal Patterns**:\n\n1. **Rate Limit Bypass** (Adevar V2 M01): Multi-transceiver configs bypass limits due to wrong amount variable. Validate EACH source independently AND aggregated total.\n\n2. **Mint Validation** (Halborn V2): Insufficient validation allows fake tokens as collateral. Must check: address, authority, decimals, extensions.\n\n3. **Release Instruction Mapping** (Halborn V2 HIGH): Permissionless release + wrong instruction = funds locked. InboxItem.mint_type (M vs Extension) MUST match release function called.\n\n**Pattern**: \n- Validate message source authenticity\n- Check rate limits per-source AND total\n- Validate mint configuration fully\n- Enforce mint_type → instruction mapping\n- Verify token account ownership/authority\n\n**Why critical**: Wrong release locks M-tokens in portal instead of delivering to recipient. Permanent fund loss.","created_at":"2026-01-05T12:51:56.696Z","tags":"solana,m-extensions,bridge,portal,cross-chain,security,v2-audit"} -{"id":"mem-94392126876527a1","information":"JustMintIt (JMI) Extension Research - M0 Foundation\n\n**Repository**: https://github.com/m0-foundation/evm-m-extensions\n**Path**: src/projects/jmi/JMIExtension.sol\n\n## What JMI Solves\nJMI wraps yield-bearing $M token into non-rebasing ERC-20 with multi-asset collateral backing. Unlike other M extensions that only accept $M, JMI allows minting with approved stablecoins (USDC, DAI, etc.) assuming 1:1 peg. All yield flows to single recipient.\n\n## Architecture\nInheritance: JMIExtension → MYieldToOne → MExtension (base) + Freezable + Pausable\n\n**Storage (ERC-7201)**:\n- JMIExtensionStorageStruct: per-asset caps/balances/decimals + totalAssets\n- MYieldToOneStorageStruct: totalSupply, yieldRecipient, balanceOf mapping\n\n**Immutables**: mToken, swapFacility (set in constructor)\n\n## Core Minting Mechanism\n```solidity\nfunction wrap(address asset, address recipient, uint256 amount)\n```\n\nFlow:\n1. Check asset allowed via cap (isAllowedToWrap checks cap not reached)\n2. Transfer asset from SwapFacility to JMI contract\n3. Verify actual received == expected (prevents fee-on-transfer)\n4. Convert asset decimals → extension decimals (6) - always truncates down\n5. Update storage: assets[asset].balance += amount, totalAssets += jmiAmount\n6. Mint jmiAmount to recipient (1:1 in extension decimals)\n\n**Decimal Conversion**: DAI (18) → JMI (6) divides by 10^12. USDC (6) → JMI (6) is 1:1.\n\n## Asset Replacement\n```solidity\nfunction replaceAssetWithM(address asset, address recipient, uint256 amount)\n```\nM holders swap M for held collateral. Reduces totalAssets, increases M backing. Uses cached assetBalanceOf to prevent inflation attacks from direct transfers.","created_at":"2026-01-04T21:43:31.840Z","tags":"m0,jmi,solidity,evm,minting,collateral"} -{"id":"mem-99f901d3659c8895","information":"SwapFacility Integration - JMI Specifics\n\n**SwapFacility as Exclusive Gateway**:\n- Only SwapFacility contract can call wrap/unwrap/replaceAssetWithM on JMI\n- SwapFacility set as immutable in constructor, cannot be changed post-deployment\n- SwapFacility exposes msgSender() function to track original caller (user → SwapFacility → JMI)\n- JMI passes msgSender() to hooks (_beforeWrap, _beforeUnwrap) for freeze/pause checks on actual user\n\n**User Flow Examples**:\n1. Wrap USDC → JMI: User calls SwapFacility.swap(USDC, JMI, amount, recipient) → SwapFacility calls JMI.wrap(USDC, recipient, amount)\n2. Unwrap JMI → M: User calls SwapFacility.swapOutM(JMI, amount, recipient) → SwapFacility calls JMI.unwrap(recipient, amount)\n3. Replace DAI with M: Solver calls SwapFacility.replaceAssetWithM(DAI, MExtension, JMI, amount, recipient) → SwapFacility unwraps M from MExtension, calls JMI.replaceAssetWithM(DAI, recipient, amount)\n\n**SwapFacility Functions for JMI**:\n- swap(tokenIn, tokenOut, amount, recipient): General swap, supports asset → JMI or JMI → M paths\n- swapInM(extensionOut, amount, recipient): M → JMI (also works for wrapping M directly)\n- swapOutM(extensionIn, amount, recipient): JMI → M\n- replaceAssetWithM(asset, extensionIn, extensionOut, amount, recipient): Complex flow for solver-driven collateral replacement\n- All have *WithPermit variants for gasless approvals (EIP-2612)\n\n**Trust Model**: JMI fully trusts SwapFacility for reentrancy protection, user approvals, validation. Single point of trust architecture.","created_at":"2026-01-05T02:42:42.750Z","tags":"jmi,swapfacility,integration,user-flow,trust-model"} -{"id":"mem-9bb4b14961516a2e","information":"M-Extensions Audit Security Patterns - Access Control & Initialization\n\n**CRITICAL: Explicit Authority Validation Required**\n\nSolana's account-based model requires EXPLICIT authority checks via Anchor constraints. Multiple audits (OtterSec ADV-00, Adevar #1, Halborn) found CRITICAL vulnerability in ext_swap whitelist operations:\n\n```rust\n// VULNERABLE - Missing admin check\npub fn whitelist_extension(ctx: Context, ext_program: Pubkey) -> Result<()> {\n // ANY user can call this!\n}\n\n// SECURE - Explicit has_one constraint\n#[derive(Accounts)]\npub struct WhitelistExt<'info> {\n #[account(mut, has_one = admin)] // ← MANDATORY\n pub swap_global: Account<'info, SwapGlobal>,\n pub admin: Signer<'info>,\n}\n```\n\n**Why this matters**: Without `has_one = admin`, ANY user can manipulate whitelists, add rogue extensions, or grant themselves privileges.\n\n**Front-Running During Initialization**\n- Initialization instructions are often permissionless (no authority required)\n- Malicious actors can front-run legitimate deployment with incorrect parameters\n- M0 accepted this risk - controls via deployment process, not on-chain enforcement\n- Alternative: Add initialization authority parameter and check\n\n**Pattern**: For privileged operations, ALWAYS add `has_one = authority` or explicit signer checks. Don't assume implicit authorization.","created_at":"2026-01-05T12:50:45.876Z","tags":"solana,m-extensions,security,access-control,audits,critical-vulnerability"} -{"id":"mem-adcd85dd16e398d5","information":"JMIExtension - replaceAssetWithM() Implementation\n\n**Access**: onlySwapFacility only\n**Parameters**: amount is in M decimals (6), NOT asset decimals\n\n**Flow**:\n1. Check not paused\n2. Validate asset (not 0x0, not mToken), recipient, amount > 0\n3. Convert M amount → asset amount: assetAmount = amount * 10^(assetDecimals - 6) for high-decimal\n4. Validate assetAmount > 0 (prevents truncation)\n5. Check cached balance: assets[asset].balance >= assetAmount (NOT IERC20(asset).balanceOf(this))\n6. Update: assets[asset].balance -= assetAmount, totalAssets -= amount\n7. Transfer amount of $M from swapFacility to this contract\n8. Transfer assetAmount of asset to recipient\n9. Emit AssetReplacedWithM(asset, assetAmount, recipient, amount)\n\n**Why Cached Balance**: Direct asset transfers bypass accounting. Cached balance prevents inflation attack: attacker sends asset directly, then calls replaceAssetWithM to extract excess.\n\n**Solver Use Case**: When totalAssets high / M backing low, solver acquires M, calls replaceAssetWithM via SwapFacility, receives collateral (USDC/DAI), JMI backing shifts from non-M → M for better yield.","created_at":"2026-01-05T02:42:18.507Z","tags":"jmi,replaceAssetWithM,solver,cached-balance,inflation-protection"} -{"id":"mem-bd02892ecccd0e6f","information":"M-Extensions Audit Security Patterns - Floating Point Precision Gotchas\n\n**CRITICAL: f64 Multiplier Calculation Can Cause Insolvency**\n\nAdevar audit Finding #3 identified rounding issues in `calculate_new_multiplier`:\n\n**Problem**: Using `f64.powf()` for yield calculation can round UP instead of down, creating slight over-distribution that compounds over time → eventual insolvency.\n\n```rust\nfn calculate_new_multiplier(\n last_ext_multiplier: f64,\n last_m_multiplier: f64,\n new_m_multiplier: f64,\n fee_bps: u64,\n) -> Result {\n // f64 arithmetic can round up, breaking collateralization!\n // Users claim slightly more than they should\n}\n```\n\n**Why f64 is unavoidable**: Token2022 ScaledUi extension CPI interface REQUIRES f64 multiplier. Can't switch to pure integer math.\n\n**Recommended Solutions**:\n1. Replace `powf` with deterministic approximations (linear interpolation, Taylor series)\n2. Redesign fee model to use purely linear functions (avoid exponentiation)\n3. Always round DOWN in favor of protocol (conservative rounding)\n4. Add periodic collateralization checks to detect drift\n\n**Related Gotchas**:\n- **Rounding in wrap/unwrap**: Small amounts can round to zero or lose precision\n- **Same-token swaps** (Adevar #4): Unwrap + wrap cycle loses value due to double rounding - MUST forbid\n- **Sanity checks** (Adevar Enhancement #5): Enforce minimum amounts to prevent dust issues\n\n**Pattern**: When f64 math is required by external interfaces, use conservative rounding (always favor protocol), add sanity checks, and monitor collateralization invariants.","created_at":"2026-01-05T12:51:03.295Z","tags":"solana,m-extensions,security,floating-point,precision,rounding,insolvency,audits"} -{"id":"mem-cafb415402214246","information":"JMIExtension - Access Control & Roles\n\n**Roles** (OpenZeppelin AccessControl):\n- DEFAULT_ADMIN_ROLE: Grant/revoke other roles\n- ASSET_CAP_MANAGER_ROLE = keccak256(\"ASSET_CAP_MANAGER_ROLE\"): setAssetCap(asset, cap)\n- YIELD_RECIPIENT_MANAGER_ROLE = keccak256(\"YIELD_RECIPIENT_MANAGER_ROLE\"): setYieldRecipient(account)\n- FREEZE_MANAGER_ROLE (inherited Freezable): freeze/unfreeze accounts\n- PAUSER_ROLE (inherited Pausable): pause/unpause all user actions\n\n**Initialization**:\ninitialize() parameters: name, symbol, yieldRecipient, admin, assetCapManager, freezeManager, pauser, yieldRecipientManager\n- Grants DEFAULT_ADMIN_ROLE to admin\n- Grants ASSET_CAP_MANAGER_ROLE to assetCapManager (reverts ZeroAssetCapManager if 0x0)\n- Grants YIELD_RECIPIENT_MANAGER_ROLE to yieldRecipientManager (reverts ZeroYieldRecipientManager if 0x0)\n- Grants FREEZE_MANAGER_ROLE to freezeManager\n- Grants PAUSER_ROLE to pauser\n\n**onlySwapFacility Modifier**: All wrap/unwrap/replaceAssetWithM functions check msg.sender == swapFacility immutable. SwapFacility uses msgSender() to track original caller for hooks.","created_at":"2026-01-05T02:42:29.511Z","tags":"jmi,access-control,roles,openzeppelin,initialization"} -{"id":"mem-cc4fdf6e3f1f237f","information":"Solana M-Extensions - Part 7: Security Model\n\nAccess control hierarchy:\n1. Admin: transfer_admin, add/remove_wrap_authority, claim_fees, set_fee, set_earn_authority, add/remove_earn_manager\n2. Wrap Authority: wrap, unwrap\n3. Earn Authority (crank): sync, claim_for\n4. Earn Manager (crank): add/remove/transfer_earner, configure_earn_manager\n5. Earner (crank): set_recipient\n\nCritical validations:\n- Collateralization: ext_supply + rewards <= vault_m_amount (prevents over-minting)\n- Vault freeze: vault_m_token_account.state == Initialized (ensures earner approval)\n- Index monotonicity: new_m_index >= last_m_index >= last_ext_index >= 1e12\n- Fee bounds: fee_bps <= 10000 (100%)\n- Authority checks: wrap_authorities.contains(signer), earn_authority == signer\n\nTwo-step admin transfer: Prevents accidental admin loss via pending_admin.\n\nAuditors: Asymmetric Research, Adevar Labs, OtterSec, Halborn (5 audit reports in /audits).","created_at":"2026-01-05T02:43:09.020Z","tags":"solana,m-extensions,security,access-control,audits"} -{"id":"mem-ce10817154ce1f74","information":"Solana M-Extensions - Part 3: Wrap/Unwrap Mechanism\n\nWrap instruction (mint extension tokens):\n1. Validate signer in wrap_authorities\n2. sync_index() updates ext multiplier if needed\n3. Get current m_index and ext_index\n4. Convert: m_principal → m_amount (m_index) → ext_amount → ext_principal (ext_index)\n5. Transfer M tokens from user to vault (transfer_checked CPI)\n6. Mint Ext tokens to user (mint_to CPI with PDA signer)\n\nFormula: ext_principal = amount_to_principal_down(principal_to_amount_down(m_principal, m_index), ext_index)\n\nUnwrap instruction (burn extension tokens):\n1. Same auth and sync\n2. Convert: ext_principal → ext_amount → m_amount → m_principal\n3. Burn Ext tokens from user\n4. Transfer M tokens from vault to user (PDA signer)\n\nKey: All conversions round DOWN to prevent over-minting. Tokens stored as principal (rebasing-resistant), converted to amount for calculations.","created_at":"2026-01-05T02:42:36.332Z","tags":"solana,m-extensions,wrap,unwrap,conversion"} -{"id":"mem-cfe1512d7a2e4aba","information":"JMIExtension Spec - Security Model & Attack Mitigations\n\n**Fee-on-Transfer Protection**\n```solidity\nuint256 balanceBefore = asset.balanceOf(this);\nasset.transferFrom(swapFacility, this, amount);\nuint256 received = asset.balanceOf(this) - balanceBefore;\nif (received < amount) revert InsufficientAssetReceived(...);\n```\nPrevents accounting discrepancy from deflationary tokens.\n\n**Inflation Attack Mitigation**\n- Uses cached assets[].balance not actual balance\n- Direct transfers bypass accounting → stuck forever\n- replaceAssetWithM can't drain more than tracked balance\n- Spec explicitly warns: \"Assets sent directly are stuck\"\n\n**Safe240 Casting**\n- Asset balances capped at uint240 max\n- Aligns with $M ecosystem supply limit\n- Prevents overflow beyond M protocol constraints\n\n**Asset Cap Enforcement**\n- Checked on every wrap operation\n- Cap in asset's native decimals (before conversion)\n- Can be dynamically adjusted by ASSET_CAP_MANAGER_ROLE\n- Protects against over-concentration in single collateral\n\n**Pausability Scope**\n- Blocks: wrap, unwrap, transfer, replaceAssetWithM\n- Does NOT block: role management, view functions, yield calculations\n- Emergency stop for exploit scenarios\n\n**Freezing Mechanism**\n- Per-account sanctions/compliance tool\n- Frozen accounts cannot send, receive, wrap, unwrap\n- Independent from pausability (different scopes)","created_at":"2026-01-04T21:48:30.908Z","tags":"m0,jmi,security,attack-mitigation,access-control"} -{"id":"mem-d010955d4796a4cd","information":"Solana M-Extensions - Part 8: Token Extension Requirements\n\nFor Extension Mint:\n- MUST have freeze_authority (validated in Initialize)\n- ScaledUi variant: MUST use Token2022 with ScaledUiAmount extension\n- NoYield/Crank: Can use Token2022 OR legacy Token Program\n- CANNOT have transfer hooks or transfer tax (per README)\n- Mint authority MUST be PDA seeds=[b\"mint_authority\"]\n- ScaledUiAmount authority MUST match mint_authority PDA (if present)\n\nFor M Mint:\n- MUST use Token2022 (hardcoded checks)\n- Must have ScaledUiAmount extension (for index tracking)\n- Must have freeze authority (for earner permissioning)\n\nInitialize validation:\n- Checks ext_mint.supply == 0\n- Validates ext_mint decimals == m_mint decimals\n- For ScaledUi: Validates ext_token_program == Token2022 ID\n- For ScaledUi: Checks ScaledUiAmount extension exists\n- Validates vault_m_token_account is thawed (approved earner)\n- Validates wrap_authorities uniqueness (no duplicates)\n\nInitial indices: m_index from earn program, ext_index = 1e12 (1.0).","created_at":"2026-01-05T02:43:16.972Z","tags":"solana,m-extensions,token2022,extensions,validation"} -{"id":"mem-d13521c089c3a6d0","information":"Solana M-Extensions Architecture - Complete Synthesis\n\nPROGRAMS: (1) m_ext - 3 variants (no-yield/scaled-ui/crank) for wrapped M tokens with configurable yield; (2) ext_swap - atomic cross-extension swaps via two-phase unwrap→measure→wrap pattern.\n\nSTATE: ExtGlobalV2 (admin, ext_mint, m_mint, yield_config, wrap_authorities), EarnManager/Earner PDAs (crank-only), SwapGlobal (whitelists).\n\nINTEGRATION: Token-2022 ScaledUiAmountConfig via sync_index() CPI, PermanentDelegate for admin ops, DefaultAccountState for compliance. PDA patterns: [b\"global\"], [b\"mint_authority\"], [b\"m_vault\"], [b\"earn_manager\", key], [b\"earner\", user, manager].\n\nSECURITY: Two-step admin transfer, sync-before-modify pattern (prevent retroactive fees), integer math only (no f64), measured amounts (fee-on-transfer protection), explicit authority validation (has_one constraints), crank instruction type enforcement.\n\nNEW EXTENSIONS: (1) Add feature flag; (2) Extend YieldConfig; (3) Implement sync if mutable config; (4) Calculate mint size with ExtensionType::get_account_len; (5) Whitelist in ext_swap if needed.\n\nINVARIANTS: ext_mint.supply ≤ vault_m_account.amount, sync before config changes, round down conversions, measured actual balances.","created_at":"2026-01-05T13:03:05.401Z","tags":"solana,m-extensions,architecture,security,integration,overview"} -{"id":"mem-d698798b29e557b1","information":"Solana M-Extensions - Part 6: EXT_SWAP Program\n\nTwo-phase atomic swap (unwrap from_ext → wrap to_ext):\n\nPhase 1 - Unwrap:\n- Burns from_ext principal from user\n- CPI to from_ext_program.unwrap()\n- Transfers M from from_vault to swap_m_account\n- Records m_delta (actual amount received)\n\nPhase 2 - Wrap:\n- Uses exact m_delta from Phase 1\n- CPI to to_ext_program.wrap()\n- Transfers M from swap_m_account to to_vault\n- Mints to_ext principal to user\n\nKey insight: M amount is intermediate, NOT user-specified. User specifies ext_principal IN, receives calculated ext_principal OUT based on index ratios.\n\nAuthority handling:\n- If swap_program in wrap_authorities: Uses swap_global PDA as authority\n- Else: Requires explicit wrap_authority/unwrap_authority signers\n\nSwapGlobal state: Maintains whitelisted_extensions (program_id + mint + token_program) and whitelisted_unwrappers.\n\nRemaining accounts: Supports variable split via remaining_accounts_split_idx for extensibility.","created_at":"2026-01-05T02:43:01.047Z","tags":"solana,m-extensions,ext-swap,swap,cpi"} -{"id":"mem-de66ba3c435ef4d3","information":"Solana M-Extensions - Part 4: Index/Multiplier System\n\nIndex represents multiplier * 1e12. Constants: INDEX_SCALE_U64 = 1_000_000_000_000.\n\nKey functions:\n- multiplier_to_index(f64) → u64: Truncates multiplier * 1e12\n- principal_to_amount_down(principal, index): (index * principal) / 1e12 (rounds down)\n- amount_to_principal_down(amount, index): (amount * 1e12) / index (rounds down)\n- principal_to_amount_up: Adds (index - 1) before division for ceiling\n\nScaledUi sync_index():\n1. Calculate m_increase_factor = new_m_index / last_m_index\n2. Apply fee: ext_increase_factor = m_increase_factor^(1 - fee_on_yield)\n3. Calculate: new_ext_index = last_ext_index * ext_increase_factor\n4. CPI to update_multiplier on Token2022 mint\n\nCrank sync():\n- Only updates global_account indices (no Token2022 interaction)\n- new_ext_index = (last_ext_index * current_m_index) / last_m_index\n- Requires earn_authority signer\n\nPrecision: Uses f64.powf() with ~10^-16 error (acceptable for 10^-12 target).","created_at":"2026-01-05T02:42:45.059Z","tags":"solana,m-extensions,index,multiplier,conversion,math"} -{"id":"mem-e0922cd876067080","information":"Solana vs EVM M-Extensions - Security Model Comparison\n\n**Common Security Principles:**\n- Two-step admin transfer (pending_admin pattern)\n- Collateralization invariants (supply <= backing)\n- Authority whitelisting (wrap_authorities vs SwapFacility exclusivity)\n- Freeze validation before operations\n\n**Solana-Specific Security (from 5 audits):**\n- Explicit account validation via has_one constraints\n- Token2022 extension whitelist for supported features\n- Down-rounding in all conversions prevents over-minting\n- CPI safety: verify program IDs before cross-program calls\n- Fuzzing: 3M+ executions verified vault solvency, index monotonicity, fee idempotency\n\n**EVM-Specific Security:**\n- Fee-on-transfer guard (balance before/after check)\n- Cached balance strategy prevents inflation attacks\n- Safe240 casts prevent overflow\n- Role-based permissions for 5 distinct operations (DEFAULT_ADMIN, ASSET_CAP_MANAGER, YIELD_RECIPIENT_MANAGER, FREEZE_MANAGER, PAUSER)\n- Auto-claim on yieldRecipient change prevents yield loss","created_at":"2026-01-05T02:47:57.984Z","tags":"solana,evm,m-extensions,security,audits,comparison"} -{"id":"mem-e18e37cd56a01c06","information":"Solana M-Extensions - Part 10: Build and Deployment\n\nFeature flags (Cargo.toml):\n- default = [\"no-yield\"]\n- scaled-ui, no-yield, crank (mutually exclusive)\n- migrate (for V1 upgrades)\n- wm = [\"crank\", \"migrate\"] (wM-specific)\n\nConstraint: Only ONE yield feature can be enabled (compile-time check in lib.rs lines 27-38).\n\nBuild optimization (release profile):\n- lto = \"fat\": Link-time optimization\n- codegen-units = 1: Single compilation unit\n- overflow-checks = true: Runtime overflow detection\n\nDeployment flow:\n1. Get extension approved as earner through M0 governance\n2. Extension added to merkle root, bridged to Solana\n3. Earn program thaws vault_m_token_account\n4. Deploy extension program with chosen variant\n5. Create ext_mint with correct properties\n6. Call initialize() with wrap_authorities\n7. (Optional) Get whitelisted on ext_swap\n\nProduction addresses:\n- Earn: mz2vDzjbQDUDXBH6FPF5s4odCJ4y8YLE5QWaZ8XdZ9Z\n- Portal: mzp1q2j5Hr1QuLC3KFBCAUz5aUckT6qyuZKZ3WJnMmY\n- wM: wMXX1K1nca5W4pZr1piETe78gcAVVrEFi9f4g46uXko\n\nTesting: Jest 29.0.3 with anchor-litesvm 0.1.2, covers all 5 variant combinations.","created_at":"2026-01-05T02:43:47.517Z","tags":"solana,m-extensions,build,deployment,configuration"} -{"id":"mem-eed27d435d854e4e","information":"M_EXT Crank Variant Yield Distribution Flow:\n\nThe crank variant implements a three-tier hierarchy for manual yield distribution that differs fundamentally from scaled-ui's automatic rebasing:\n\n**Roles:**\n1. **Admin**: Designates earn_authority, adds/removes EarnManagers\n2. **Earn Authority**: Calls sync() to update indices from M mint, then claim_for() to distribute yield to individual Earners\n3. **Earn Manager**: Manages groups of Earners, collects fees (0-10000 bps) from distributed yield\n4. **Earner**: Individual yield recipients, can set alternate recipient_token_account\n\n**Critical Flow (claim_for instruction)**:\n1. Earn authority calls claim_for(snapshot_balance) for specific Earner\n2. Program calculates: principal = amount_to_principal_down(snapshot_balance, last_claim_index)\n3. Calculates rewards: principal_to_amount_down(principal, current_index) - snapshot_balance\n4. Mints manager fee: (rewards * earn_manager.fee_bps) / 10000 to earn_manager.fee_token_account\n5. Mints net rewards to earner's recipient (or user_token_account if no recipient set)\n6. Updates earner.last_claim_index and last_claim_timestamp\n\nWHY this matters: Unlike scaled-ui where yield accrues automatically via multiplier updates, crank requires explicit claim_for calls for each earner. This enables flexible fee structures but requires off-chain coordination to ensure all earners get claimed. The snapshot_balance parameter allows earn_authority to batch-process claims based on off-chain indexer state.","created_at":"2026-01-05T12:47:54.516Z","tags":"solana,m-extensions,crank,yield-distribution,earn-system,claim-for,manual-distribution"} \ No newline at end of file From d1fa412c02e9ad8a84e4d538ca04b292ddbe2af2 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Mon, 12 Jan 2026 22:14:55 -0600 Subject: [PATCH 05/27] split apart wrap into wrap_asset --- programs/ext_swap/src/instructions/mod.rs | 2 + programs/ext_swap/src/instructions/swap.rs | 18 +- programs/ext_swap/src/instructions/wrap.rs | 46 ++--- .../ext_swap/src/instructions/wrap_asset.rs | 156 ++++++++++++++++ programs/ext_swap/src/lib.rs | 11 +- programs/m_ext/src/instructions/initialize.rs | 7 +- programs/m_ext/src/instructions/jmi/mod.rs | 2 + .../m_ext/src/instructions/jmi/wrap_asset.rs | 174 ++++++++++++++++++ programs/m_ext/src/instructions/wrap.rs | 159 +++++----------- programs/m_ext/src/lib.rs | 9 +- programs/m_ext/src/state/mod.rs | 16 +- 11 files changed, 423 insertions(+), 177 deletions(-) create mode 100644 programs/ext_swap/src/instructions/wrap_asset.rs create mode 100644 programs/m_ext/src/instructions/jmi/wrap_asset.rs diff --git a/programs/ext_swap/src/instructions/mod.rs b/programs/ext_swap/src/instructions/mod.rs index 8e579da..312cf6e 100644 --- a/programs/ext_swap/src/instructions/mod.rs +++ b/programs/ext_swap/src/instructions/mod.rs @@ -4,6 +4,7 @@ pub mod swap; pub mod unwrap; pub mod whitelist; pub mod wrap; +pub mod wrap_asset; pub use initialize::*; pub use replace_asset_with_m::*; @@ -11,3 +12,4 @@ pub use swap::*; pub use unwrap::*; pub use whitelist::*; pub use wrap::*; +pub use wrap_asset::*; diff --git a/programs/ext_swap/src/instructions/swap.rs b/programs/ext_swap/src/instructions/swap.rs index c905c01..704dee6 100644 --- a/programs/ext_swap/src/instructions/swap.rs +++ b/programs/ext_swap/src/instructions/swap.rs @@ -126,9 +126,6 @@ pub struct Swap<'info> { )] pub to_m_vault: Box>, - /// CHECK: validated within the destination wrap CPI if provided - pub asset_config: Option>, - /* * Token Programs */ @@ -230,21 +227,16 @@ impl<'info> Swap<'info> { Wrap { token_authority: ctx.accounts.swap_global.to_account_info(), wrap_authority: Some(wrap_authority), - source_mint: ctx.accounts.m_mint.to_account_info(), + m_mint: ctx.accounts.m_mint.to_account_info(), ext_mint: ctx.accounts.to_mint.to_account_info(), global_account: ctx.accounts.to_global.to_account_info(), - source_vault: ctx.accounts.to_m_vault_auth.to_account_info(), + m_vault: ctx.accounts.to_m_vault_auth.to_account_info(), ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), - from_source_token_account: ctx.accounts.swap_m_account.to_account_info(), - vault_source_token_account: ctx.accounts.to_m_vault.to_account_info(), + from_m_token_account: ctx.accounts.swap_m_account.to_account_info(), + vault_m_token_account: ctx.accounts.to_m_vault.to_account_info(), to_ext_token_account: ctx.accounts.to_token_account.to_account_info(), - source_token_program: ctx.accounts.m_token_program.to_account_info(), + m_token_program: ctx.accounts.m_token_program.to_account_info(), ext_token_program: ctx.accounts.to_token_program.to_account_info(), - asset_config: ctx - .accounts - .asset_config - .as_ref() - .map(|a| a.to_account_info()), }, &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], ) diff --git a/programs/ext_swap/src/instructions/wrap.rs b/programs/ext_swap/src/instructions/wrap.rs index 0dc2ce1..110d29c 100644 --- a/programs/ext_swap/src/instructions/wrap.rs +++ b/programs/ext_swap/src/instructions/wrap.rs @@ -36,18 +36,18 @@ pub struct Wrap<'info> { #[account(mut)] /// Validated by wrap on the extension program pub to_mint: Box>, - #[account(mint::token_program = source_token_program)] - pub source_mint: Box>, + #[account(mint::token_program = m_token_program)] + pub m_mint: Box>, /* * Token Accounts */ #[account( mut, - token::mint = source_mint, - token::token_program = source_token_program, + token::mint = m_mint, + token::token_program = m_token_program, )] - pub source_token_account: Box>, + pub from_m_token_account: Box>, #[account( mut, token::mint = to_mint, @@ -78,20 +78,17 @@ pub struct Wrap<'info> { */ #[account( mut, - associated_token::mint = source_mint, + associated_token::mint = m_mint, associated_token::authority = to_vault_auth, - associated_token::token_program = source_token_program, + associated_token::token_program = m_token_program, )] - pub to_source_vault: Box>, - - /// CHECK: validated within the destination wrap CPI if provided - pub asset_config: Option>, + pub to_m_vault: Box>, /* * Token Programs */ pub to_token_program: Interface<'info, TokenInterface>, - pub source_token_program: Interface<'info, TokenInterface>, + pub m_token_program: Interface<'info, TokenInterface>, /* * Programs @@ -102,7 +99,7 @@ pub struct Wrap<'info> { } impl<'info> Wrap<'info> { - fn validate(&self, amount: u64) -> Result<()> { + fn validate(&self, m_principal: u64) -> Result<()> { if !self .swap_global .is_extension_whitelisted(self.to_ext_program.key) @@ -110,15 +107,15 @@ impl<'info> Wrap<'info> { return err!(SwapError::InvalidExtension); } - if amount == 0 { + if m_principal == 0 { return err!(SwapError::InvalidAmount); } Ok(()) } - #[access_control(ctx.accounts.validate(amount))] - pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, amount: u64) -> Result<()> { + #[access_control(ctx.accounts.validate(m_principal))] + pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, m_principal: u64) -> Result<()> { // Set swap program as authority if none provided let wrap_authority = match &ctx.accounts.wrap_authority { Some(auth) => auth.to_account_info(), @@ -131,26 +128,21 @@ impl<'info> Wrap<'info> { ExtWrap { token_authority: ctx.accounts.signer.to_account_info(), wrap_authority: Some(wrap_authority), - source_mint: ctx.accounts.source_mint.to_account_info(), + m_mint: ctx.accounts.m_mint.to_account_info(), ext_mint: ctx.accounts.to_mint.to_account_info(), global_account: ctx.accounts.to_global.to_account_info(), - source_vault: ctx.accounts.to_vault_auth.to_account_info(), + m_vault: ctx.accounts.to_vault_auth.to_account_info(), ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), - from_source_token_account: ctx.accounts.source_token_account.to_account_info(), - vault_source_token_account: ctx.accounts.to_source_vault.to_account_info(), + from_m_token_account: ctx.accounts.from_m_token_account.to_account_info(), + vault_m_token_account: ctx.accounts.to_m_vault.to_account_info(), to_ext_token_account: ctx.accounts.to_token_account.to_account_info(), - source_token_program: ctx.accounts.source_token_program.to_account_info(), + m_token_program: ctx.accounts.m_token_program.to_account_info(), ext_token_program: ctx.accounts.to_token_program.to_account_info(), - asset_config: ctx - .accounts - .asset_config - .as_ref() - .map(|a| a.to_account_info()), }, &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], ) .with_remaining_accounts(ctx.remaining_accounts.to_vec()), - amount, + m_principal, ) } } diff --git a/programs/ext_swap/src/instructions/wrap_asset.rs b/programs/ext_swap/src/instructions/wrap_asset.rs new file mode 100644 index 0000000..e2fb3ce --- /dev/null +++ b/programs/ext_swap/src/instructions/wrap_asset.rs @@ -0,0 +1,156 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use m_ext::cpi::accounts::WrapAsset as ExtWrapAsset; +use m_ext::state::{EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}; + +use crate::errors::SwapError; +use crate::state::{SwapGlobal, GLOBAL_SEED}; + +#[derive(Accounts)] +pub struct WrapAsset<'info> { + pub signer: Signer<'info>, + + // Required if the swap program is not whitelisted on the extension + pub wrap_authority: Option>, + + /* + * Program globals + */ + #[account( + seeds = [GLOBAL_SEED], + bump = swap_global.bump, + )] + pub swap_global: Box>, + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + seeds::program = to_ext_program.key(), + bump, + )] + /// CHECK: CPI will validate the global account + pub to_global: AccountInfo<'info>, + + /* + * Mints + */ + #[account(mut)] + /// Validated by wrap_asset on the extension program + pub to_mint: Box>, + #[account(mint::token_program = asset_token_program)] + pub asset_mint: Box>, + + /* + * Asset config - required for wrap_asset + */ + #[account(mut)] + /// CHECK: CPI will validate the asset config + pub asset_config: AccountInfo<'info>, + + /* + * Token Accounts + */ + #[account( + mut, + token::mint = asset_mint, + token::token_program = asset_token_program, + )] + pub asset_token_account: Box>, + #[account( + mut, + token::mint = to_mint, + token::token_program = to_token_program, + )] + pub to_token_account: Box>, + + /* + * Authorities + */ + #[account( + seeds = [M_VAULT_SEED], + seeds::program = to_ext_program.key(), + bump, + )] + /// CHECK: account does not hold data + pub to_vault_auth: AccountInfo<'info>, + #[account( + seeds = [MINT_AUTHORITY_SEED], + seeds::program = to_ext_program.key(), + bump, + )] + /// CHECK: account does not hold data + pub to_mint_authority: AccountInfo<'info>, + + /* + * Vaults + */ + #[account( + mut, + associated_token::mint = asset_mint, + associated_token::authority = to_vault_auth, + associated_token::token_program = asset_token_program, + )] + pub to_asset_vault: Box>, + + /* + * Token Programs + */ + pub to_token_program: Interface<'info, TokenInterface>, + pub asset_token_program: Interface<'info, TokenInterface>, + + /* + * Programs + */ + /// CHECK: checked against whitelisted extensions + pub to_ext_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, +} + +impl<'info> WrapAsset<'info> { + fn validate(&self, amount: u64) -> Result<()> { + if !self + .swap_global + .is_extension_whitelisted(self.to_ext_program.key) + { + return err!(SwapError::InvalidExtension); + } + + if amount == 0 { + return err!(SwapError::InvalidAmount); + } + + Ok(()) + } + + #[access_control(ctx.accounts.validate(amount))] + pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, amount: u64) -> Result<()> { + // Set swap program as authority if none provided + let wrap_authority = match &ctx.accounts.wrap_authority { + Some(auth) => auth.to_account_info(), + None => ctx.accounts.swap_global.to_account_info(), + }; + + m_ext::cpi::wrap_asset( + CpiContext::new_with_signer( + ctx.accounts.to_ext_program.to_account_info(), + ExtWrapAsset { + token_authority: ctx.accounts.signer.to_account_info(), + wrap_authority: Some(wrap_authority), + asset_mint: ctx.accounts.asset_mint.to_account_info(), + ext_mint: ctx.accounts.to_mint.to_account_info(), + global_account: ctx.accounts.to_global.to_account_info(), + asset_config: ctx.accounts.asset_config.to_account_info(), + asset_vault: ctx.accounts.to_vault_auth.to_account_info(), + ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), + from_asset_token_account: ctx.accounts.asset_token_account.to_account_info(), + vault_asset_token_account: ctx.accounts.to_asset_vault.to_account_info(), + to_ext_token_account: ctx.accounts.to_token_account.to_account_info(), + asset_token_program: ctx.accounts.asset_token_program.to_account_info(), + ext_token_program: ctx.accounts.to_token_program.to_account_info(), + }, + &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], + ) + .with_remaining_accounts(ctx.remaining_accounts.to_vec()), + amount, + ) + } +} diff --git a/programs/ext_swap/src/lib.rs b/programs/ext_swap/src/lib.rs index 35be669..bba33c4 100644 --- a/programs/ext_swap/src/lib.rs +++ b/programs/ext_swap/src/lib.rs @@ -66,8 +66,8 @@ pub mod ext_swap { Swap::handler(ctx, amount, remaining_accounts_split_idx as usize) } - pub fn wrap<'info>(ctx: Context<'_, '_, '_, 'info, Wrap<'info>>, amount: u64) -> Result<()> { - Wrap::handler(ctx, amount) + pub fn wrap<'info>(ctx: Context<'_, '_, '_, 'info, Wrap<'info>>, m_principal: u64) -> Result<()> { + Wrap::handler(ctx, m_principal) } pub fn unwrap<'info>( @@ -83,4 +83,11 @@ pub mod ext_swap { ) -> Result<()> { ReplaceAssetWithM::handler(ctx, amount) } + + pub fn wrap_asset<'info>( + ctx: Context<'_, '_, '_, 'info, WrapAsset<'info>>, + amount: u64, + ) -> Result<()> { + WrapAsset::handler(ctx, amount) + } } diff --git a/programs/m_ext/src/instructions/initialize.rs b/programs/m_ext/src/instructions/initialize.rs index 3a1d610..211438e 100644 --- a/programs/m_ext/src/instructions/initialize.rs +++ b/programs/m_ext/src/instructions/initialize.rs @@ -202,18 +202,13 @@ impl Initialize<'_> { last_ext_index: INDEX_SCALE_U64, // we set the extension index to 1.0 initially timestamp: timestamp as u64, }; - } else if #[cfg(feature = "jmi")] { + } else { // JMI extends no-yield with additional fields yield_config = YieldConfig { yield_variant: YieldVariant::NoYield, total_assets: 0, is_paused: false, }; - } else { - // Base no-yield without JMI - yield_config = YieldConfig { - yield_variant: YieldVariant::NoYield, - }; } } diff --git a/programs/m_ext/src/instructions/jmi/mod.rs b/programs/m_ext/src/instructions/jmi/mod.rs index 83bdeb4..c3339e6 100644 --- a/programs/m_ext/src/instructions/jmi/mod.rs +++ b/programs/m_ext/src/instructions/jmi/mod.rs @@ -2,8 +2,10 @@ pub mod pause; pub mod replace_asset_with_m; pub mod set_asset_cap; pub mod unpause; +pub mod wrap_asset; pub use pause::*; pub use replace_asset_with_m::*; pub use set_asset_cap::*; pub use unpause::*; +pub use wrap_asset::*; diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs new file mode 100644 index 0000000..92c5d58 --- /dev/null +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -0,0 +1,174 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::{ + errors::ExtError, + state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}, + utils::{ + conversion::convert_to_6_decimals, + token::{mint_tokens, transfer_tokens_interface}, + }, +}; + +#[derive(Accounts)] +pub struct WrapAsset<'info> { + pub token_authority: Signer<'info>, + + /// Will be set if a whitelisted authority is signing for a user + pub wrap_authority: Option>, + + /// Non-M asset mint (USDC, USDT, etc.) - CANNOT be M + #[account(mint::token_program = asset_token_program)] + pub asset_mint: InterfaceAccount<'info, Mint>, + + /// Extension token mint + #[account(mut, mint::token_program = ext_token_program)] + pub ext_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [EXT_GLOBAL_SEED], + bump = global_account.bump, + has_one = ext_mint @ ExtError::InvalidAccount, + )] + pub global_account: Account<'info, ExtGlobalV2>, + + /// Asset configuration - REQUIRED for non-M assets + #[account( + mut, + seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], + bump = asset_config.bump, + )] + pub asset_config: Account<'info, AssetConfig>, + + /// CHECK: Validated by seed, used as vault authority + #[account( + seeds = [M_VAULT_SEED], + bump = global_account.m_vault_bump, + )] + pub asset_vault: AccountInfo<'info>, + + /// CHECK: Validated by seed, mint authority for ext tokens + #[account( + seeds = [MINT_AUTHORITY_SEED], + bump = global_account.ext_mint_authority_bump, + )] + pub ext_mint_authority: AccountInfo<'info>, + + /// User's asset token account (source of assets) + #[account( + mut, + token::mint = asset_mint, + token::token_program = asset_token_program, + )] + pub from_asset_token_account: InterfaceAccount<'info, TokenAccount>, + + /// Vault's asset token account (destination for assets) + #[account( + mut, + associated_token::mint = asset_mint, + associated_token::authority = asset_vault, + associated_token::token_program = asset_token_program, + )] + pub vault_asset_token_account: InterfaceAccount<'info, TokenAccount>, + + /// User's ext token account (receives minted ext tokens) + #[account( + mut, + token::mint = ext_mint, + token::token_program = ext_token_program, + )] + pub to_ext_token_account: InterfaceAccount<'info, TokenAccount>, + + pub asset_token_program: Interface<'info, TokenInterface>, + pub ext_token_program: Interface<'info, TokenInterface>, +} + +impl WrapAsset<'_> { + pub fn validate(&self, amount: u64) -> Result<()> { + let auth = match &self.wrap_authority { + Some(auth) => auth.key, + None => self.token_authority.key, + }; + + // Ensure the caller is authorized + if !self.global_account.wrap_authorities.contains(auth) { + return err!(ExtError::NotAuthorized); + } + + if amount == 0 { + return err!(ExtError::InvalidAmount); + } + + // Validate contract is not paused + if self.global_account.yield_config.is_paused { + return err!(ExtError::Paused); + } + + // Validate asset is NOT M (must be non-M asset) + if self.asset_mint.key() == self.global_account.m_mint { + return err!(ExtError::AssetNotAllowed); + } + + // Validate asset cap is set and > 0 + if self.asset_config.cap == 0 { + return err!(ExtError::AssetNotAllowed); + } + + Ok(()) + } + + #[access_control(ctx.accounts.validate(amount))] + pub fn handler(ctx: Context, amount: u64) -> Result<()> { + let authority_seeds: &[&[&[u8]]] = &[&[ + MINT_AUTHORITY_SEED, + &[ctx.accounts.global_account.ext_mint_authority_bump], + ]]; + + // 1. Validate cap not exceeded + let new_balance = ctx + .accounts + .asset_config + .balance + .checked_add(amount) + .ok_or(ExtError::MathOverflow)?; + if new_balance > ctx.accounts.asset_config.cap { + return err!(ExtError::AssetCapExceeded); + } + + // 2. Convert asset amount to 6 decimals for ext minting and total_assets tracking + let amount_in_6_decimals = convert_to_6_decimals(amount, ctx.accounts.asset_config.decimals)?; + + // 3. Transfer assets from user to vault + transfer_tokens_interface( + &ctx.accounts.from_asset_token_account, + &ctx.accounts.vault_asset_token_account, + amount, + &ctx.accounts.asset_mint, + &ctx.accounts.token_authority.to_account_info(), + &ctx.accounts.asset_token_program, + )?; + + // 4. Mint ext tokens (1:1 with 6-decimal amount) + mint_tokens( + &ctx.accounts.to_ext_token_account, + amount_in_6_decimals, + &ctx.accounts.ext_mint, + &ctx.accounts.ext_mint_authority, + authority_seeds, + &ctx.accounts.ext_token_program, + )?; + + // 5. Update tracking state + ctx.accounts.asset_config.balance = new_balance; + ctx.accounts.global_account.yield_config.total_assets = ctx + .accounts + .global_account + .yield_config + .total_assets + .checked_add(amount_in_6_decimals) + .ok_or(ExtError::MathOverflow)?; + + Ok(()) + } +} diff --git a/programs/m_ext/src/instructions/wrap.rs b/programs/m_ext/src/instructions/wrap.rs index e06936e..fcc194f 100644 --- a/programs/m_ext/src/instructions/wrap.rs +++ b/programs/m_ext/src/instructions/wrap.rs @@ -7,29 +7,19 @@ use crate::{ utils::token::{mint_tokens, transfer_tokens_interface}, }; -#[cfg(feature = "jmi")] -use crate::state::{AssetConfig, ASSET_CONFIG_SEED}; - use crate::utils::conversion::{ amount_to_principal_down, multiplier_to_index, principal_to_amount_down, sync_index, }; -#[cfg(feature = "jmi")] -use crate::utils::conversion::convert_to_6_decimals; - -/// Unified Wrap accounts struct -/// - Non-JMI: source_mint must be M -/// - JMI: source_mint can be M or approved asset #[derive(Accounts)] pub struct Wrap<'info> { pub token_authority: Signer<'info>, - /// Will be set if a whitelisted authority is signing for a user + // Will be set if a whitelisted authority is signing for a user pub wrap_authority: Option>, - /// Source token mint (M for non-JMI; M or approved asset for JMI) - #[account(mint::token_program = source_token_program)] - pub source_mint: InterfaceAccount<'info, Mint>, + #[account(mint::token_program = m_token_program)] + pub m_mint: InterfaceAccount<'info, Mint>, #[account(mut, mint::token_program = ext_token_program)] pub ext_mint: InterfaceAccount<'info, Mint>, @@ -47,7 +37,7 @@ pub struct Wrap<'info> { seeds = [M_VAULT_SEED], bump = global_account.m_vault_bump )] - pub source_vault: AccountInfo<'info>, + pub m_vault: AccountInfo<'info>, /// CHECK: This account is validated by the seed, it stores no data #[account( @@ -58,43 +48,37 @@ pub struct Wrap<'info> { #[account( mut, - token::mint = source_mint, - token::token_program = source_token_program, + token::mint = m_mint, + // signer must be authority of the from token account or delegated by the owner + // this is checked by the token program + token::token_program = m_token_program, )] - pub from_source_token_account: InterfaceAccount<'info, TokenAccount>, + pub from_m_token_account: InterfaceAccount<'info, TokenAccount>, #[account( mut, - associated_token::mint = source_mint, - associated_token::authority = source_vault, - associated_token::token_program = source_token_program, + associated_token::mint = m_mint, + associated_token::authority = m_vault, + associated_token::token_program = m_token_program, )] - pub vault_source_token_account: InterfaceAccount<'info, TokenAccount>, + pub vault_m_token_account: InterfaceAccount<'info, TokenAccount>, #[account( mut, token::mint = ext_mint, + // signer is arbitrary to allow wrapping to another user's account token::token_program = ext_token_program, )] pub to_ext_token_account: InterfaceAccount<'info, TokenAccount>, - #[cfg(feature = "jmi")] - /// AssetConfig for non-M assets (JMI only) - /// - JMI + M path: must be None - /// - JMI + asset path: must be Some with cap > 0 - #[account( - mut, - seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), source_mint.key().as_ref()], - bump = asset_config.bump, - )] - pub asset_config: Option>, - - pub source_token_program: Interface<'info, TokenInterface>, + // we have duplicate entries for the token2022 program since the interface needs to be consistent + // but we want to leave open the possibility that either may not have to be token2022 in the future + pub m_token_program: Interface<'info, TokenInterface>, pub ext_token_program: Interface<'info, TokenInterface>, } impl Wrap<'_> { - pub fn validate(&self, amount: u64) -> Result<()> { + pub fn validate(&self, m_principal: u64) -> Result<()> { let auth = match &self.wrap_authority { Some(auth) => auth.key, None => self.token_authority.key, @@ -105,116 +89,65 @@ impl Wrap<'_> { return err!(ExtError::NotAuthorized); } - if amount == 0 { + if m_principal == 0 { return err!(ExtError::InvalidAmount); } - // Non-JMI: source_mint MUST be m_mint (replaces has_one constraint) - #[cfg(not(feature = "jmi"))] - { - if self.source_mint.key() != self.global_account.m_mint { - return err!(ExtError::InvalidAccount); - } - } - - // JMI: validate asset is either M or has an AssetConfig with cap > 0 - #[cfg(feature = "jmi")] - { - let is_m = self.source_mint.key() == self.global_account.m_mint; - if !is_m { - match &self.asset_config { - Some(config) => { - if config.cap == 0 { - return err!(ExtError::AssetNotAllowed); - } - } - None => { - return err!(ExtError::AssetNotAllowed); - } - } - } + if self.m_mint.key() != self.global_account.m_mint { + return err!(ExtError::InvalidAccount); } Ok(()) } // Single unified handler for all feature combinations - #[access_control(ctx.accounts.validate(amount))] - pub fn handler(ctx: Context, amount: u64) -> Result<()> { + #[access_control(ctx.accounts.validate(m_principal))] + pub fn handler(ctx: Context, m_principal: u64) -> Result<()> { let authority_seeds: &[&[&[u8]]] = &[&[ MINT_AUTHORITY_SEED, &[ctx.accounts.global_account.ext_mint_authority_bump], ]]; - let mut ext_amount = { + // If necessary, sync the index between M and Ext tokens + // Return the current value to use for conversions + let ext_m_principal = { let ext_index: u64 = sync_index( &mut ctx.accounts.ext_mint, &mut ctx.accounts.global_account, - &ctx.accounts.source_mint, - &ctx.accounts.vault_source_token_account, + &ctx.accounts.m_mint, + &ctx.accounts.vault_m_token_account, &ctx.accounts.ext_mint_authority, authority_seeds, &ctx.accounts.ext_token_program, )?; let m_scaled_ui_config = - earn::utils::conversion::get_scaled_ui_config(&ctx.accounts.source_mint)?; + earn::utils::conversion::get_scaled_ui_config(&ctx.accounts.m_mint)?; let m_index = multiplier_to_index(m_scaled_ui_config.new_multiplier.into())?; - amount_to_principal_down(principal_to_amount_down(amount, m_index)?, ext_index)? + // Calculate the principal amount of ext tokens to mint + // based on the principal amount of m tokens to wrap + amount_to_principal_down(principal_to_amount_down(m_principal, m_index)?, ext_index)? }; - // JMI: cap tracking for non-M assets (only with no-yield) - #[cfg(feature = "jmi")] - { - let is_m = ctx.accounts.source_mint.key() == ctx.accounts.global_account.m_mint; - if !is_m { - let asset_config = ctx - .accounts - .asset_config - .as_mut() - .ok_or(ExtError::AssetNotAllowed)?; - - let new_balance = asset_config - .balance - .checked_add(amount) - .ok_or(ExtError::MathOverflow)?; - if new_balance > asset_config.cap { - return err!(ExtError::AssetCapExceeded); - } - asset_config.balance = new_balance; - - let amount_in_6_decimals = convert_to_6_decimals(amount, asset_config.decimals)?; - ctx.accounts.global_account.yield_config.total_assets = ctx - .accounts - .global_account - .yield_config - .total_assets - .checked_add(amount_in_6_decimals) - .ok_or(ExtError::MathOverflow)?; - - ext_amount = amount_in_6_decimals; - } - } - - // Transfer source tokens from user to vault + // Transfer M tokens from user to vault transfer_tokens_interface( - &ctx.accounts.from_source_token_account, - &ctx.accounts.vault_source_token_account, - amount, - &ctx.accounts.source_mint, - &ctx.accounts.token_authority.to_account_info(), - &ctx.accounts.source_token_program, + &ctx.accounts.from_m_token_account, // from + &ctx.accounts.vault_m_token_account, // to + m_principal, // m_principal + &ctx.accounts.m_mint, // mint + &ctx.accounts.token_authority.to_account_info(), // authority + &ctx.accounts.m_token_program, // token program )?; - // Mint ext tokens to user + // Mint the m_principal of ext tokens to the user mint_tokens( - &ctx.accounts.to_ext_token_account, - ext_amount, - &ctx.accounts.ext_mint, - &ctx.accounts.ext_mint_authority, - authority_seeds, - &ctx.accounts.ext_token_program, + &ctx.accounts.to_ext_token_account, // to + ext_m_principal, // m_principal + &ctx.accounts.ext_mint, // mint + &ctx.accounts.ext_mint_authority, // authority + authority_seeds, // authority seeds + &ctx.accounts.ext_token_program, // token program )?; Ok(()) diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index 3477dc2..a991be5 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -136,6 +136,11 @@ pub mod m_ext { ReplaceAssetWithM::handler(ctx, m_amount) } + #[cfg(feature = "jmi")] + pub fn wrap_asset(ctx: Context, amount: u64) -> Result<()> { + WrapAsset::handler(ctx, amount) + } + #[cfg(feature = "crank")] pub fn set_earn_authority( ctx: Context, @@ -165,8 +170,8 @@ pub mod m_ext { // Wrap authority instructions - pub fn wrap(ctx: Context, amount: u64) -> Result<()> { - Wrap::handler(ctx, amount) + pub fn wrap(ctx: Context, m_principal: u64) -> Result<()> { + Wrap::handler(ctx, m_principal) } pub fn unwrap(ctx: Context, amount: u64) -> Result<()> { diff --git a/programs/m_ext/src/state/mod.rs b/programs/m_ext/src/state/mod.rs index a54e36f..2a5db19 100644 --- a/programs/m_ext/src/state/mod.rs +++ b/programs/m_ext/src/state/mod.rs @@ -96,8 +96,8 @@ cfg_if! { pub use earner::*; pub use earn_manager::*; - } else if #[cfg(feature = "jmi")] { - // JMI extends no-yield with additional fields + } else { + // no-yield contains fields JMI fields #[derive(AnchorSerialize, AnchorDeserialize, Clone)] pub struct YieldConfig { pub yield_variant: YieldVariant, // 1 byte @@ -115,17 +115,5 @@ cfg_if! { pub mod asset_config; pub use asset_config::*; - } else { - // Base no-yield without JMI - #[derive(AnchorSerialize, AnchorDeserialize, Clone)] - pub struct YieldConfig { - pub yield_variant: YieldVariant, // variant of yield config - } - - impl YieldConfig { - pub fn space() -> usize { - 1 // yield_variant - } - } } } From 28554985c02e58686eb342d079b1f8ce3ea1caa5 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Wed, 14 Jan 2026 09:35:06 -0600 Subject: [PATCH 06/27] fix: remove balance tracking, rename replace -> unwrap_asset --- programs/ext_swap/src/instructions/mod.rs | 4 +- ...eplace_asset_with_m.rs => unwrap_asset.rs} | 40 +++++++-------- programs/ext_swap/src/lib.rs | 6 +-- programs/ext_swap/src/state.rs | 3 ++ programs/m_ext/src/errors.rs | 2 + programs/m_ext/src/instructions/jmi/mod.rs | 4 +- .../src/instructions/jmi/set_asset_cap.rs | 9 ++-- ...eplace_asset_with_m.rs => unwrap_asset.rs} | 25 ++++------ .../m_ext/src/instructions/jmi/wrap_asset.rs | 24 +++------ programs/m_ext/src/instructions/migrate.rs | 2 + programs/m_ext/src/instructions/wrap.rs | 5 +- programs/m_ext/src/lib.rs | 4 +- programs/m_ext/src/state/asset_config.rs | 9 ++-- programs/m_ext/src/utils/conversion.rs | 50 ------------------- 14 files changed, 64 insertions(+), 123 deletions(-) rename programs/ext_swap/src/instructions/{replace_asset_with_m.rs => unwrap_asset.rs} (88%) rename programs/m_ext/src/instructions/jmi/{replace_asset_with_m.rs => unwrap_asset.rs} (88%) diff --git a/programs/ext_swap/src/instructions/mod.rs b/programs/ext_swap/src/instructions/mod.rs index 312cf6e..611e837 100644 --- a/programs/ext_swap/src/instructions/mod.rs +++ b/programs/ext_swap/src/instructions/mod.rs @@ -1,5 +1,5 @@ pub mod initialize; -pub mod replace_asset_with_m; +pub mod unwrap_asset; pub mod swap; pub mod unwrap; pub mod whitelist; @@ -7,7 +7,7 @@ pub mod wrap; pub mod wrap_asset; pub use initialize::*; -pub use replace_asset_with_m::*; +pub use unwrap_asset::*; pub use swap::*; pub use unwrap::*; pub use whitelist::*; diff --git a/programs/ext_swap/src/instructions/replace_asset_with_m.rs b/programs/ext_swap/src/instructions/unwrap_asset.rs similarity index 88% rename from programs/ext_swap/src/instructions/replace_asset_with_m.rs rename to programs/ext_swap/src/instructions/unwrap_asset.rs index 1fa2b64..a007e24 100644 --- a/programs/ext_swap/src/instructions/replace_asset_with_m.rs +++ b/programs/ext_swap/src/instructions/unwrap_asset.rs @@ -1,20 +1,19 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; -use m_ext::cpi::accounts::{ReplaceAssetWithM as ExtReplaceAssetWithM, Unwrap}; +use m_ext::cpi::accounts::{UnwrapAsset as ExtUnwrapAsset, Unwrap}; use m_ext::state::{EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}; use crate::{ errors::SwapError, - state::{SwapGlobal, GLOBAL_SEED}, + state::{SwapGlobal, GLOBAL_SEED, REPLACE_AUTHORITY_SEED}, }; #[derive(Accounts)] -pub struct ReplaceAssetWithM<'info> { +pub struct UnwrapAsset<'info> { pub signer: Signer<'info>, // Required if the swap program is not whitelisted on the extension pub unwrap_authority: Option>, - pub replace_authority: Option>, /* * Program globals @@ -25,6 +24,13 @@ pub struct ReplaceAssetWithM<'info> { )] pub swap_global: Box>, + /// CHECK: PDA used as replace authority for JMI extensions + #[account( + seeds = [REPLACE_AUTHORITY_SEED], + bump, + )] + pub replace_authority_pda: AccountInfo<'info>, + /// Source extension global (for unwrap) #[account( mut, @@ -35,7 +41,7 @@ pub struct ReplaceAssetWithM<'info> { /// CHECK: CPI will validate the global account pub from_global: AccountInfo<'info>, - /// JMI extension global (for replace_asset_with_m) + /// JMI extension global (for unwrap_asset) #[account( mut, seeds = [EXT_GLOBAL_SEED], @@ -81,7 +87,7 @@ pub struct ReplaceAssetWithM<'info> { #[account( mut, associated_token::mint = m_mint, - associated_token::authority = swap_global, + associated_token::authority = replace_authority_pda, associated_token::token_program = m_token_program, )] pub swap_m_account: Box>, @@ -112,7 +118,7 @@ pub struct ReplaceAssetWithM<'info> { pub from_m_vault: Box>, /* - * Vaults for JMI extension (replace_asset_with_m) + * Vaults for JMI extension (unwrap_asset) */ #[account( seeds = [M_VAULT_SEED], @@ -153,7 +159,7 @@ pub struct ReplaceAssetWithM<'info> { pub system_program: Program<'info, System>, } -impl<'info> ReplaceAssetWithM<'info> { +impl<'info> UnwrapAsset<'info> { fn validate(&self, from_principal: u64) -> Result<()> { // Validate both extensions are whitelisted for ext_program in [&self.from_ext_program, &self.jmi_ext_program] { @@ -206,19 +212,13 @@ impl<'info> ReplaceAssetWithM<'info> { ctx.accounts.swap_m_account.reload()?; let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; - // Set swap program as authority if none provided - let replace_authority = match &ctx.accounts.replace_authority { - Some(auth) => auth.to_account_info(), - None => ctx.accounts.swap_global.to_account_info(), - }; - - // 3. Call JMI replace_asset_with_m - m_ext::cpi::replace_asset_with_m( + // 3. Call JMI unwrap_asset (signed by replace_authority_pda) + m_ext::cpi::unwrap_asset( CpiContext::new_with_signer( ctx.accounts.jmi_ext_program.to_account_info(), - ExtReplaceAssetWithM { - token_authority: ctx.accounts.swap_global.to_account_info(), - replace_authority: Some(replace_authority), + ExtUnwrapAsset { + token_authority: ctx.accounts.replace_authority_pda.to_account_info(), + replace_authority: None, m_mint: ctx.accounts.m_mint.to_account_info(), asset_mint: ctx.accounts.asset_mint.to_account_info(), global_account: ctx.accounts.jmi_global.to_account_info(), @@ -231,7 +231,7 @@ impl<'info> ReplaceAssetWithM<'info> { m_token_program: ctx.accounts.m_token_program.to_account_info(), asset_token_program: ctx.accounts.asset_token_program.to_account_info(), }, - &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], + &[&[REPLACE_AUTHORITY_SEED, &[ctx.bumps.replace_authority_pda]]], ), m_amount, )?; diff --git a/programs/ext_swap/src/lib.rs b/programs/ext_swap/src/lib.rs index bba33c4..6a1cf33 100644 --- a/programs/ext_swap/src/lib.rs +++ b/programs/ext_swap/src/lib.rs @@ -77,11 +77,11 @@ pub mod ext_swap { Unwrap::handler(ctx, amount) } - pub fn replace_asset_with_m<'info>( - ctx: Context<'_, '_, '_, 'info, ReplaceAssetWithM<'info>>, + pub fn unwrap_asset<'info>( + ctx: Context<'_, '_, '_, 'info, UnwrapAsset<'info>>, amount: u64, ) -> Result<()> { - ReplaceAssetWithM::handler(ctx, amount) + UnwrapAsset::handler(ctx, amount) } pub fn wrap_asset<'info>( diff --git a/programs/ext_swap/src/state.rs b/programs/ext_swap/src/state.rs index 0cd82f6..9e0bf73 100644 --- a/programs/ext_swap/src/state.rs +++ b/programs/ext_swap/src/state.rs @@ -3,6 +3,9 @@ use anchor_lang::prelude::*; #[constant] pub const GLOBAL_SEED: &[u8] = b"global"; +#[constant] +pub const REPLACE_AUTHORITY_SEED: &[u8] = b"replace_authority"; + #[account] pub struct SwapGlobal { pub bump: u8, diff --git a/programs/m_ext/src/errors.rs b/programs/m_ext/src/errors.rs index 81e2f84..9de0b67 100644 --- a/programs/m_ext/src/errors.rs +++ b/programs/m_ext/src/errors.rs @@ -47,4 +47,6 @@ pub enum ExtError { CannotCapMToken, #[msg("Insufficient asset backing for replacement.")] InsufficientAssetBacking, + #[msg("Asset must have 6 decimals.")] + InvalidDecimals, } diff --git a/programs/m_ext/src/instructions/jmi/mod.rs b/programs/m_ext/src/instructions/jmi/mod.rs index c3339e6..a027e4a 100644 --- a/programs/m_ext/src/instructions/jmi/mod.rs +++ b/programs/m_ext/src/instructions/jmi/mod.rs @@ -1,11 +1,11 @@ pub mod pause; -pub mod replace_asset_with_m; +pub mod unwrap_asset; pub mod set_asset_cap; pub mod unpause; pub mod wrap_asset; pub use pause::*; -pub use replace_asset_with_m::*; +pub use unwrap_asset::*; pub use set_asset_cap::*; pub use unpause::*; pub use wrap_asset::*; diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index 8559f1c..6fbb25d 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -62,6 +62,10 @@ impl SetAssetCap<'_> { if self.asset_mint.key() == self.global_account.m_mint { return err!(ExtError::CannotCapMToken); } + // Only accept assets with 6 decimals + if self.asset_mint.decimals != 6 { + return err!(ExtError::InvalidDecimals); + } Ok(()) } @@ -69,9 +73,8 @@ impl SetAssetCap<'_> { pub fn handler(ctx: Context, cap: u64) -> Result<()> { let asset_config = &mut ctx.accounts.asset_config; - // If first initialization (all fields are zero), set decimals and bump - if asset_config.decimals == 0 && asset_config.cap == 0 && asset_config.balance == 0 { - asset_config.decimals = ctx.accounts.asset_mint.decimals; + // If first initialization (all fields are zero), set bump + if asset_config.cap == 0 && asset_config.bump == 0 { asset_config.bump = ctx.bumps.asset_config; } diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/unwrap_asset.rs similarity index 88% rename from programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs rename to programs/m_ext/src/instructions/jmi/unwrap_asset.rs index 153eb6f..b9ddbab 100644 --- a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs +++ b/programs/m_ext/src/instructions/jmi/unwrap_asset.rs @@ -5,13 +5,14 @@ use crate::{ errors::ExtError, state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, M_VAULT_SEED}, utils::{ - conversion::convert_from_6_decimals, + conversion::{multiplier_to_index, principal_to_amount_down}, token::{transfer_tokens, transfer_tokens_from_program_interface}, }, }; +use earn::utils::conversion::get_scaled_ui_config; #[derive(Accounts)] -pub struct ReplaceAssetWithM<'info> { +pub struct UnwrapAsset<'info> { pub token_authority: Signer<'info>, /// Will be set if a whitelisted authority is signing for a user @@ -32,7 +33,6 @@ pub struct ReplaceAssetWithM<'info> { pub global_account: Account<'info, ExtGlobalV2>, #[account( - mut, seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], bump = asset_config.bump, )] @@ -79,7 +79,7 @@ pub struct ReplaceAssetWithM<'info> { pub asset_token_program: Interface<'info, TokenInterface>, } -impl ReplaceAssetWithM<'_> { +impl UnwrapAsset<'_> { pub fn validate(&self, m_amount: u64) -> Result<()> { let auth = match &self.replace_authority { Some(auth) => auth.key, @@ -105,11 +105,13 @@ impl ReplaceAssetWithM<'_> { #[access_control(ctx.accounts.validate(m_amount))] pub fn handler(ctx: Context, m_amount: u64) -> Result<()> { - // Convert M amount (6 decimals) to asset amount (asset decimals) - let asset_amount = convert_from_6_decimals(m_amount, ctx.accounts.asset_config.decimals)?; + // Get M index and convert principal to economic value + let m_scaled_ui_config = get_scaled_ui_config(&ctx.accounts.m_mint)?; + let m_index: u64 = multiplier_to_index(m_scaled_ui_config.new_multiplier.into())?; + let asset_amount: u64 = principal_to_amount_down(m_amount, m_index)?; // Validate sufficient asset backing - if asset_amount > ctx.accounts.asset_config.balance { + if asset_amount > ctx.accounts.vault_asset_token_account.amount { return err!(ExtError::InsufficientAssetBacking); } @@ -135,19 +137,12 @@ impl ReplaceAssetWithM<'_> { )?; // Update tracking - ctx.accounts.asset_config.balance = ctx - .accounts - .asset_config - .balance - .checked_sub(asset_amount) - .ok_or(ExtError::MathUnderflow)?; - ctx.accounts.global_account.yield_config.total_assets = ctx .accounts .global_account .yield_config .total_assets - .checked_sub(m_amount) + .checked_sub(asset_amount) .ok_or(ExtError::MathUnderflow)?; Ok(()) diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index 92c5d58..795d213 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -4,10 +4,7 @@ use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}, - utils::{ - conversion::convert_to_6_decimals, - token::{mint_tokens, transfer_tokens_interface}, - }, + utils::token::{mint_tokens, transfer_tokens_interface}, }; #[derive(Accounts)] @@ -35,7 +32,6 @@ pub struct WrapAsset<'info> { /// Asset configuration - REQUIRED for non-M assets #[account( - mut, seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], bump = asset_config.bump, )] @@ -128,18 +124,15 @@ impl WrapAsset<'_> { // 1. Validate cap not exceeded let new_balance = ctx .accounts - .asset_config - .balance + .vault_asset_token_account + .amount .checked_add(amount) .ok_or(ExtError::MathOverflow)?; if new_balance > ctx.accounts.asset_config.cap { return err!(ExtError::AssetCapExceeded); } - // 2. Convert asset amount to 6 decimals for ext minting and total_assets tracking - let amount_in_6_decimals = convert_to_6_decimals(amount, ctx.accounts.asset_config.decimals)?; - - // 3. Transfer assets from user to vault + // 2. Transfer assets from user to vault transfer_tokens_interface( &ctx.accounts.from_asset_token_account, &ctx.accounts.vault_asset_token_account, @@ -149,24 +142,23 @@ impl WrapAsset<'_> { &ctx.accounts.asset_token_program, )?; - // 4. Mint ext tokens (1:1 with 6-decimal amount) + // 3. Mint ext tokens (1:1 since all assets have 6 decimals) mint_tokens( &ctx.accounts.to_ext_token_account, - amount_in_6_decimals, + amount, &ctx.accounts.ext_mint, &ctx.accounts.ext_mint_authority, authority_seeds, &ctx.accounts.ext_token_program, )?; - // 5. Update tracking state - ctx.accounts.asset_config.balance = new_balance; + // 4. Update tracking state ctx.accounts.global_account.yield_config.total_assets = ctx .accounts .global_account .yield_config .total_assets - .checked_add(amount_in_6_decimals) + .checked_add(amount) .ok_or(ExtError::MathOverflow)?; Ok(()) diff --git a/programs/m_ext/src/instructions/migrate.rs b/programs/m_ext/src/instructions/migrate.rs index 64bb3e5..39cad4d 100644 --- a/programs/m_ext/src/instructions/migrate.rs +++ b/programs/m_ext/src/instructions/migrate.rs @@ -174,6 +174,8 @@ impl MigrateM<'_> { } else if #[cfg(feature = "no-yield")] { yield_config = YieldConfig { yield_variant: YieldVariant::NoYield, + total_assets: 0, + is_paused: false, }; } }; diff --git a/programs/m_ext/src/instructions/wrap.rs b/programs/m_ext/src/instructions/wrap.rs index fcc194f..86beae2 100644 --- a/programs/m_ext/src/instructions/wrap.rs +++ b/programs/m_ext/src/instructions/wrap.rs @@ -28,6 +28,7 @@ pub struct Wrap<'info> { mut, seeds = [EXT_GLOBAL_SEED], bump = global_account.bump, + has_one = m_mint @ ExtError::InvalidAccount, has_one = ext_mint @ ExtError::InvalidAccount, )] pub global_account: Account<'info, ExtGlobalV2>, @@ -93,10 +94,6 @@ impl Wrap<'_> { return err!(ExtError::InvalidAmount); } - if self.m_mint.key() != self.global_account.m_mint { - return err!(ExtError::InvalidAccount); - } - Ok(()) } diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index a991be5..3991264 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -132,8 +132,8 @@ pub mod m_ext { } #[cfg(feature = "jmi")] - pub fn replace_asset_with_m(ctx: Context, m_amount: u64) -> Result<()> { - ReplaceAssetWithM::handler(ctx, m_amount) + pub fn unwrap_asset(ctx: Context, m_amount: u64) -> Result<()> { + UnwrapAsset::handler(ctx, m_amount) } #[cfg(feature = "jmi")] diff --git a/programs/m_ext/src/state/asset_config.rs b/programs/m_ext/src/state/asset_config.rs index 726f174..f978ad9 100644 --- a/programs/m_ext/src/state/asset_config.rs +++ b/programs/m_ext/src/state/asset_config.rs @@ -2,16 +2,13 @@ use anchor_lang::prelude::*; /// Per-asset configuration for JMI multi-asset backing /// PDA seeds: [ASSET_CONFIG_SEED, global_account, asset_mint] +/// Note: Only assets with 6 decimals are accepted (validated in set_asset_cap) #[account] #[derive(InitSpace)] pub struct AssetConfig { - /// Maximum balance allowed for this asset (in asset decimals, 0 = disabled) + /// Maximum balance allowed for this asset (in 6 decimals, 0 = disabled) pub cap: u64, - /// Current tracked balance (in asset decimals) - pub balance: u64, - /// Asset decimals (cached from mint) - pub decimals: u8, /// PDA bump seed pub bump: u8, } -// Size: 8 (discriminator) + 8 + 8 + 1 + 1 = 26 bytes +// Size: 8 (discriminator) + 8 + 1 = 17 bytes diff --git a/programs/m_ext/src/utils/conversion.rs b/programs/m_ext/src/utils/conversion.rs index cdca357..c28059b 100644 --- a/programs/m_ext/src/utils/conversion.rs +++ b/programs/m_ext/src/utils/conversion.rs @@ -187,56 +187,6 @@ pub fn index_to_multiplier(index: u64) -> Result { Ok(index as f64 / INDEX_SCALE_F64) } -/// Convert an amount from its native decimals to 6 decimals (M's precision) -/// Used by JMI for tracking total_assets -#[cfg(feature = "jmi")] -pub fn convert_to_6_decimals(amount: u64, from_decimals: u8) -> Result { - const TARGET_DECIMALS: u8 = 6; - - if from_decimals == TARGET_DECIMALS { - return Ok(amount); - } - - if from_decimals > TARGET_DECIMALS { - // Scale down (e.g., 18 decimals to 6) - let divisor = 10u64 - .checked_pow((from_decimals - TARGET_DECIMALS) as u32) - .ok_or(ExtError::MathOverflow)?; - amount.checked_div(divisor).ok_or(ExtError::MathUnderflow.into()) - } else { - // Scale up (e.g., 2 decimals to 6) - let multiplier = 10u64 - .checked_pow((TARGET_DECIMALS - from_decimals) as u32) - .ok_or(ExtError::MathOverflow)?; - amount.checked_mul(multiplier).ok_or(ExtError::MathOverflow.into()) - } -} - -/// Convert an amount from 6 decimals (M's precision) to target decimals -/// Used by JMI for converting ext amounts to asset decimals -#[cfg(feature = "jmi")] -pub fn convert_from_6_decimals(amount: u64, to_decimals: u8) -> Result { - const FROM_DECIMALS: u8 = 6; - - if to_decimals == FROM_DECIMALS { - return Ok(amount); - } - - if to_decimals > FROM_DECIMALS { - // Scale up (e.g., 6 decimals to 18) - let multiplier = 10u64 - .checked_pow((to_decimals - FROM_DECIMALS) as u32) - .ok_or(ExtError::MathOverflow)?; - amount.checked_mul(multiplier).ok_or(ExtError::MathOverflow.into()) - } else { - // Scale down (e.g., 6 decimals to 2) - let divisor = 10u64 - .checked_pow((FROM_DECIMALS - to_decimals) as u32) - .ok_or(ExtError::MathOverflow)?; - amount.checked_div(divisor).ok_or(ExtError::MathUnderflow.into()) - } -} - pub fn get_mint_extensions<'info>( mint: &InterfaceAccount<'info, Mint>, ) -> Result> { From cd647efdea01b2f6f119ba6c4a41e90b9f983ed2 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Wed, 14 Jan 2026 17:53:06 -0600 Subject: [PATCH 07/27] fix: original tests running --- programs/ext_swap/src/instructions/mod.rs | 4 +-- .../ext_swap/src/instructions/unwrap_asset.rs | 34 +++++++++++------- programs/ext_swap/src/instructions/wrap.rs | 4 +-- programs/ext_swap/src/lib.rs | 5 ++- programs/m_ext/src/instructions/initialize.rs | 6 +--- programs/m_ext/src/instructions/jmi/mod.rs | 4 +-- .../m_ext/src/instructions/jmi/wrap_asset.rs | 5 ++- programs/m_ext/src/instructions/wrap.rs | 22 ++++++------ tests/programs/ext_a.so | Bin 395600 -> 398616 bytes tests/programs/ext_b.so | Bin 457528 -> 459744 bytes tests/programs/ext_c.so | Bin 395872 -> 398896 bytes tests/unit/ext_test_harness.ts | 26 ++++++++++++-- tests/unit/m_ext.test.ts | 4 ++- 13 files changed, 74 insertions(+), 40 deletions(-) diff --git a/programs/ext_swap/src/instructions/mod.rs b/programs/ext_swap/src/instructions/mod.rs index 611e837..dcc8760 100644 --- a/programs/ext_swap/src/instructions/mod.rs +++ b/programs/ext_swap/src/instructions/mod.rs @@ -1,15 +1,15 @@ pub mod initialize; -pub mod unwrap_asset; pub mod swap; pub mod unwrap; +pub mod unwrap_asset; pub mod whitelist; pub mod wrap; pub mod wrap_asset; pub use initialize::*; -pub use unwrap_asset::*; pub use swap::*; pub use unwrap::*; +pub use unwrap_asset::*; pub use whitelist::*; pub use wrap::*; pub use wrap_asset::*; diff --git a/programs/ext_swap/src/instructions/unwrap_asset.rs b/programs/ext_swap/src/instructions/unwrap_asset.rs index a007e24..0566d87 100644 --- a/programs/ext_swap/src/instructions/unwrap_asset.rs +++ b/programs/ext_swap/src/instructions/unwrap_asset.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; -use m_ext::cpi::accounts::{UnwrapAsset as ExtUnwrapAsset, Unwrap}; +use m_ext::cpi::accounts::{Unwrap, UnwrapAsset as ExtUnwrapAsset}; use m_ext::state::{EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}; use crate::{ @@ -14,6 +14,14 @@ pub struct UnwrapAsset<'info> { // Required if the swap program is not whitelisted on the extension pub unwrap_authority: Option>, + pub replace_authority: Option>, + + /// CHECK: PDA used as replace authority for JMI extensions + #[account( + seeds = [REPLACE_AUTHORITY_SEED], + bump, + )] + pub fallback_replace_authority: AccountInfo<'info>, /* * Program globals @@ -24,13 +32,6 @@ pub struct UnwrapAsset<'info> { )] pub swap_global: Box>, - /// CHECK: PDA used as replace authority for JMI extensions - #[account( - seeds = [REPLACE_AUTHORITY_SEED], - bump, - )] - pub replace_authority_pda: AccountInfo<'info>, - /// Source extension global (for unwrap) #[account( mut, @@ -87,7 +88,7 @@ pub struct UnwrapAsset<'info> { #[account( mut, associated_token::mint = m_mint, - associated_token::authority = replace_authority_pda, + associated_token::authority = swap_global, associated_token::token_program = m_token_program, )] pub swap_m_account: Box>, @@ -212,13 +213,19 @@ impl<'info> UnwrapAsset<'info> { ctx.accounts.swap_m_account.reload()?; let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; + // Set replace authority as authority if none provided + let replace_authority = match &ctx.accounts.replace_authority { + Some(auth) => auth.to_account_info(), + None => ctx.accounts.fallback_replace_authority.to_account_info(), + }; + // 3. Call JMI unwrap_asset (signed by replace_authority_pda) m_ext::cpi::unwrap_asset( CpiContext::new_with_signer( ctx.accounts.jmi_ext_program.to_account_info(), ExtUnwrapAsset { - token_authority: ctx.accounts.replace_authority_pda.to_account_info(), - replace_authority: None, + token_authority: ctx.accounts.fallback_replace_authority.to_account_info(), + replace_authority: Some(replace_authority), m_mint: ctx.accounts.m_mint.to_account_info(), asset_mint: ctx.accounts.asset_mint.to_account_info(), global_account: ctx.accounts.jmi_global.to_account_info(), @@ -231,7 +238,10 @@ impl<'info> UnwrapAsset<'info> { m_token_program: ctx.accounts.m_token_program.to_account_info(), asset_token_program: ctx.accounts.asset_token_program.to_account_info(), }, - &[&[REPLACE_AUTHORITY_SEED, &[ctx.bumps.replace_authority_pda]]], + &[&[ + REPLACE_AUTHORITY_SEED, + &[ctx.bumps.fallback_replace_authority], + ]], ), m_amount, )?; diff --git a/programs/ext_swap/src/instructions/wrap.rs b/programs/ext_swap/src/instructions/wrap.rs index 110d29c..d5344c9 100644 --- a/programs/ext_swap/src/instructions/wrap.rs +++ b/programs/ext_swap/src/instructions/wrap.rs @@ -47,7 +47,7 @@ pub struct Wrap<'info> { token::mint = m_mint, token::token_program = m_token_program, )] - pub from_m_token_account: Box>, + pub m_token_account: Box>, #[account( mut, token::mint = to_mint, @@ -133,7 +133,7 @@ impl<'info> Wrap<'info> { global_account: ctx.accounts.to_global.to_account_info(), m_vault: ctx.accounts.to_vault_auth.to_account_info(), ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), - from_m_token_account: ctx.accounts.from_m_token_account.to_account_info(), + from_m_token_account: ctx.accounts.m_token_account.to_account_info(), vault_m_token_account: ctx.accounts.to_m_vault.to_account_info(), to_ext_token_account: ctx.accounts.to_token_account.to_account_info(), m_token_program: ctx.accounts.m_token_program.to_account_info(), diff --git a/programs/ext_swap/src/lib.rs b/programs/ext_swap/src/lib.rs index 6a1cf33..1bf2c27 100644 --- a/programs/ext_swap/src/lib.rs +++ b/programs/ext_swap/src/lib.rs @@ -66,7 +66,10 @@ pub mod ext_swap { Swap::handler(ctx, amount, remaining_accounts_split_idx as usize) } - pub fn wrap<'info>(ctx: Context<'_, '_, '_, 'info, Wrap<'info>>, m_principal: u64) -> Result<()> { + pub fn wrap<'info>( + ctx: Context<'_, '_, '_, 'info, Wrap<'info>>, + m_principal: u64, + ) -> Result<()> { Wrap::handler(ctx, m_principal) } diff --git a/programs/m_ext/src/instructions/initialize.rs b/programs/m_ext/src/instructions/initialize.rs index 211438e..a3d6e9f 100644 --- a/programs/m_ext/src/instructions/initialize.rs +++ b/programs/m_ext/src/instructions/initialize.rs @@ -114,11 +114,7 @@ impl Initialize<'_> { // The wrap authorities are validated and stored in the global account. // The fee_bps is used by the scaled-ui variant. It is validated to be within the allowed range. // The earn_authority is only required for the crank variant. - fn validate( - &self, - _fee_bps: Option, - _earn_authority: Option, - ) -> Result<()> { + fn validate(&self, _fee_bps: Option, _earn_authority: Option) -> Result<()> { // Validate the ext_mint_authority PDA is the mint authority for the ext mint let ext_mint_authority = self.ext_mint_authority.key(); if self.ext_mint.mint_authority.unwrap_or_default() != ext_mint_authority { diff --git a/programs/m_ext/src/instructions/jmi/mod.rs b/programs/m_ext/src/instructions/jmi/mod.rs index a027e4a..40bf998 100644 --- a/programs/m_ext/src/instructions/jmi/mod.rs +++ b/programs/m_ext/src/instructions/jmi/mod.rs @@ -1,11 +1,11 @@ pub mod pause; -pub mod unwrap_asset; pub mod set_asset_cap; pub mod unpause; +pub mod unwrap_asset; pub mod wrap_asset; pub use pause::*; -pub use unwrap_asset::*; pub use set_asset_cap::*; pub use unpause::*; +pub use unwrap_asset::*; pub use wrap_asset::*; diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index 795d213..d435ff6 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -3,7 +3,10 @@ use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, - state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}, + state::{ + AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, + M_VAULT_SEED, + }, utils::token::{mint_tokens, transfer_tokens_interface}, }; diff --git a/programs/m_ext/src/instructions/wrap.rs b/programs/m_ext/src/instructions/wrap.rs index 86beae2..aa31708 100644 --- a/programs/m_ext/src/instructions/wrap.rs +++ b/programs/m_ext/src/instructions/wrap.rs @@ -1,10 +1,10 @@ use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; +use anchor_spl::token_interface::{Mint, Token2022, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, state::{ExtGlobalV2, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}, - utils::token::{mint_tokens, transfer_tokens_interface}, + utils::token::{mint_tokens, transfer_tokens}, }; use crate::utils::conversion::{ @@ -74,7 +74,7 @@ pub struct Wrap<'info> { // we have duplicate entries for the token2022 program since the interface needs to be consistent // but we want to leave open the possibility that either may not have to be token2022 in the future - pub m_token_program: Interface<'info, TokenInterface>, + pub m_token_program: Program<'info, Token2022>, pub ext_token_program: Interface<'info, TokenInterface>, } @@ -128,19 +128,19 @@ impl Wrap<'_> { }; // Transfer M tokens from user to vault - transfer_tokens_interface( - &ctx.accounts.from_m_token_account, // from - &ctx.accounts.vault_m_token_account, // to - m_principal, // m_principal - &ctx.accounts.m_mint, // mint - &ctx.accounts.token_authority.to_account_info(), // authority - &ctx.accounts.m_token_program, // token program + transfer_tokens( + &ctx.accounts.from_m_token_account, // from + &ctx.accounts.vault_m_token_account, // to + m_principal, // m_principal + &ctx.accounts.m_mint, // mint + &ctx.accounts.token_authority.to_account_info(), // authority + &ctx.accounts.m_token_program, // token program )?; // Mint the m_principal of ext tokens to the user mint_tokens( &ctx.accounts.to_ext_token_account, // to - ext_m_principal, // m_principal + ext_m_principal, // m_principal &ctx.accounts.ext_mint, // mint &ctx.accounts.ext_mint_authority, // authority authority_seeds, // authority seeds diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index f4361e97c2f5993d88d21bef4f8719cf1382614f..485f22d302959a8b44d94712dabcca208d7cbc30 100755 GIT binary patch delta 85618 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 delta 43932 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%0Da} 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 ZJxrZR$X%T6d=0 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 Qsgu+lC%v$CO5wEs0v>i=3jhEB diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index 3624011..a84ea7f 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -36,6 +36,7 @@ import { getExtensionData, createApproveCheckedInstruction, createFreezeAccountInstruction, + pause, } from "@solana/spl-token"; import { ZERO_WORD, @@ -88,6 +89,8 @@ export type YieldConfig = V extends Variant.ScaledUi } : { yieldVariant?: YieldVariant; + totalAssets?: BN; + isPaused?: boolean; }; export type ExtGlobal = { @@ -1326,9 +1329,10 @@ export class ExtensionTest< if (expected.yieldConfig) { switch (this.variant) { case Variant.NoYield: - expect(state.yieldConfig).toEqual({ - yieldVariant: { noYield: {} }, - }); + this.expectNoYieldYieldConfig( + state.yieldConfig, + expected.yieldConfig + ); break; case Variant.ScaledUi: this.expectScaledUiYieldConfig( @@ -1399,6 +1403,22 @@ export class ExtensionTest< } } + private expectNoYieldYieldConfig( + actual: YieldConfig, + expected: YieldConfig + ) { + expect(actual.yieldVariant!).toEqual({ noYield: {} }); + + if (expected.totalAssets) { + expect(actual.totalAssets!.toString()).toEqual( + expected.totalAssets.toString() + ); + } + if (expected.isPaused !== undefined) { + expect(actual.isPaused).toEqual(expected.isPaused); + } + } + public async expectEarnManagerState( earnManagerAccount: PublicKey, expected: EarnManager diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index 09d753f..d522b3a 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -359,12 +359,14 @@ for (const [variant, tokenProgramId] of VARIANTS) { extMintAuthorityBump, yieldConfig: { yieldVariant: { noYield: {} }, + totalAssets: new BN(0), + isPaused: false, }, wrapAuthorities, }); // Confirm the size of the global account based on the number of wrap authorities - const expectedSize = 176 + 1 + wrapAuthorities.length * 32; // 176 bytes base size + 1 for yield config discriminator + 4 bytes for vector length + 32 bytes per wrap authority + const expectedSize = 176 + 10 + wrapAuthorities.length * 32; // 176 bytes base size + 10 for yield config + 4 bytes for vector length + 32 bytes per wrap authority const extGlobalSize = await $.provider.connection .getAccountInfo(globalAccount) .then((info) => info?.data.length || 0); From e2977e212188a0d83ad470eb48e76ad8ff3d8808 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Thu, 15 Jan 2026 09:52:31 -0600 Subject: [PATCH 08/27] depreciating no-yield but still allowing for migration to jmi, tests still in progress --- Makefile | 10 +- .../ext_swap/src/instructions/unwrap_asset.rs | 22 +- programs/m_ext/Cargo.toml | 6 +- programs/m_ext/src/instructions/claim_fees.rs | 15 +- programs/m_ext/src/lib.rs | 4 +- tests/unit/ext_test_harness.ts | 335 ++++++- tests/unit/m_ext.test.ts | 876 +++++++++++++++++- 7 files changed, 1211 insertions(+), 57 deletions(-) diff --git a/Makefile b/Makefile index 13af695..1725001 100644 --- a/Makefile +++ b/Makefile @@ -4,15 +4,15 @@ build-programs: @mv target/deploy/m_ext.so target/deploy/scaled_ui.so @mv target/idl/m_ext.json target/idl/scaled_ui.json @mv target/types/m_ext.ts target/types/scaled_ui.ts - anchor build -p m_ext -- --features no-yield --no-default-features - @mv target/deploy/m_ext.so target/deploy/no_yield.so - @mv target/idl/m_ext.json target/idl/no_yield.json - @mv target/types/m_ext.ts target/types/no_yield.ts + anchor build -p m_ext -- --features jmi --no-default-features + @mv target/deploy/m_ext.so target/deploy/jmi.so + @mv target/idl/m_ext.json target/idl/jmi.json + @mv target/types/m_ext.ts target/types/jmi.ts anchor build -p m_ext -- --features crank --no-default-features @mv target/deploy/m_ext.so target/deploy/crank.so @mv target/idl/m_ext.json target/idl/crank.json @mv target/types/m_ext.ts target/types/crank.ts - anchor build -p m_ext -- --features no-yield,migrate --no-default-features + anchor build -p m_ext -- --features no-yield,jmi,migrate --no-default-features @mv target/idl/m_ext.json target/idl/migrate.json @mv target/types/m_ext.ts target/types/migrate.ts diff --git a/programs/ext_swap/src/instructions/unwrap_asset.rs b/programs/ext_swap/src/instructions/unwrap_asset.rs index 0566d87..2b9c963 100644 --- a/programs/ext_swap/src/instructions/unwrap_asset.rs +++ b/programs/ext_swap/src/instructions/unwrap_asset.rs @@ -12,8 +12,7 @@ use crate::{ pub struct UnwrapAsset<'info> { pub signer: Signer<'info>, - // Required if the swap program is not whitelisted on the extension - pub unwrap_authority: Option>, + // Required if the fallback_replace_authority is not whitelisted on the extension pub replace_authority: Option>, /// CHECK: PDA used as replace authority for JMI extensions @@ -180,10 +179,10 @@ impl<'info> UnwrapAsset<'info> { pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, from_principal: u64) -> Result<()> { let m_pre_balance = ctx.accounts.swap_m_account.amount; - // Set swap program as authority if none provided - let unwrap_authority = match &ctx.accounts.unwrap_authority { + // Set replace authority as authority if none provided + let replace_authority = match &ctx.accounts.replace_authority { Some(auth) => auth.to_account_info(), - None => ctx.accounts.swap_global.to_account_info(), + None => ctx.accounts.fallback_replace_authority.to_account_info(), }; // 1. Unwrap source extension → M (to swap_m_account) @@ -192,7 +191,7 @@ impl<'info> UnwrapAsset<'info> { ctx.accounts.from_ext_program.to_account_info(), Unwrap { token_authority: ctx.accounts.signer.to_account_info(), - unwrap_authority: Some(unwrap_authority), + unwrap_authority: Some(replace_authority.clone()), m_mint: ctx.accounts.m_mint.to_account_info(), ext_mint: ctx.accounts.from_mint.to_account_info(), global_account: ctx.accounts.from_global.to_account_info(), @@ -204,7 +203,10 @@ impl<'info> UnwrapAsset<'info> { m_token_program: ctx.accounts.m_token_program.to_account_info(), ext_token_program: ctx.accounts.from_token_program.to_account_info(), }, - &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], + &[&[ + REPLACE_AUTHORITY_SEED, + &[ctx.bumps.fallback_replace_authority], + ]], ), from_principal, )?; @@ -213,12 +215,6 @@ impl<'info> UnwrapAsset<'info> { ctx.accounts.swap_m_account.reload()?; let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; - // Set replace authority as authority if none provided - let replace_authority = match &ctx.accounts.replace_authority { - Some(auth) => auth.to_account_info(), - None => ctx.accounts.fallback_replace_authority.to_account_info(), - }; - // 3. Call JMI unwrap_asset (signed by replace_authority_pda) m_ext::cpi::unwrap_asset( CpiContext::new_with_signer( diff --git a/programs/m_ext/Cargo.toml b/programs/m_ext/Cargo.toml index 71e9655..e72de02 100644 --- a/programs/m_ext/Cargo.toml +++ b/programs/m_ext/Cargo.toml @@ -13,21 +13,19 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] cpi = ["no-entrypoint"] -default = ["no-yield"] +default = ["jmi"] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] # yield features scaled-ui = [] no-yield = [] +jmi = [] crank = [] # Migration feature flag migrate = [] wm = ["crank", "migrate"] -# JMI modifier (works WITH no-yield only) -jmi = [] - [dependencies] anchor-lang.workspace = true anchor-spl.workspace = true diff --git a/programs/m_ext/src/instructions/claim_fees.rs b/programs/m_ext/src/instructions/claim_fees.rs index 5530c18..3353a35 100644 --- a/programs/m_ext/src/instructions/claim_fees.rs +++ b/programs/m_ext/src/instructions/claim_fees.rs @@ -93,10 +93,21 @@ impl ClaimFees<'_> { &ctx.accounts.ext_token_program, )?; - // Calculate the required collateral, rounding down to be conservative // This amount will always be greater than what is required in the check_solvency function // since it allows a rounding error of up to 2e-6 - let required_m = principal_to_amount_up(ctx.accounts.ext_mint.supply, ext_index)?; + // + // Convert ext supply from principal to amount units first + let ext_supply_amount = principal_to_amount_up(ctx.accounts.ext_mint.supply, ext_index)?; + + // For JMI: subtract total_assets (non-M backing) to get M-backed portion + // total_assets is already in amount units (6 decimals) + #[cfg(feature = "jmi")] + let required_m = ext_supply_amount + .checked_sub(ctx.accounts.global_account.yield_config.total_assets) + .ok_or(ExtError::MathUnderflow)?; + + #[cfg(not(feature = "jmi"))] + let required_m = ext_supply_amount; // Get the scaled UI config for the M mint to convert principal in the vault to M units let m_config = get_scaled_ui_config(&ctx.accounts.m_mint)?; diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index 3991264..0d87a30 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -27,7 +27,7 @@ declare_id!("3C865D264L4NkAm78zfnDzQJJvXuU3fMjRUvRxyPi5da"); const _: () = { let yield_features = { cfg!(feature = "scaled-ui") as u32 - + cfg!(feature = "no-yield") as u32 + + cfg!(feature = "jmi") as u32 + cfg!(feature = "crank") as u32 }; @@ -98,7 +98,7 @@ pub mod m_ext { RemoveWrapAuthority::handler(ctx, wrap_authority) } - #[cfg(any(feature = "scaled-ui", feature = "no-yield"))] + #[cfg(any(feature = "scaled-ui", feature = "no-yield", feature = "jmi"))] pub fn claim_fees(ctx: Context) -> Result<()> { ClaimFees::handler(ctx) } diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index a84ea7f..8c2dc20 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -47,8 +47,8 @@ import { ProofElement, } from "../test-utils"; import { MExt as ScaledUIExt } from "../../target/types/scaled_ui"; -import { MExt as NoYieldExt } from "../../target/types/no_yield"; import { MExt as CrankExt } from "../../target/types/crank"; +import { MExt as JmiExt } from "../../target/types/jmi"; import { Earn } from "../programs/earn"; import { ExtSwap } from "../../target/types/ext_swap"; @@ -63,12 +63,12 @@ export enum Comparison { // Type definitions for accounts to make it easier to do comparisons export enum Variant { - NoYield = "no_yield", ScaledUi = "scaled_ui", Crank = "crank", + Jmi = "jmi", } -type MExt = NoYieldExt | ScaledUIExt | CrankExt; +type MExt = ScaledUIExt | CrankExt | JmiExt; type YieldVariant = { noYield: {} } | { scaledUi: {} } | { crank: {} }; @@ -114,6 +114,11 @@ export type EarnManager = { bump?: number; }; +export type AssetConfig = { + cap?: BN; + bump?: number; +}; + export type Earner = { lastClaimIndex?: BN; lastClaimTimestamp?: BN; @@ -1163,7 +1168,7 @@ export class ExtensionTest< // Create the Ext token mint switch (this.variant) { - case Variant.NoYield: + case Variant.Jmi: await this.createMint( this.extMint, this.getExtMintAuthority(), @@ -1271,7 +1276,7 @@ export class ExtensionTest< } public async getCurrentExtIndex(): Promise { - if (this.variant === Variant.NoYield) { + if (this.variant === Variant.Jmi) { return new BN(1e12); } else if (this.variant === Variant.ScaledUi) { const yieldConfig: YieldConfig = ( @@ -1289,7 +1294,7 @@ export class ExtensionTest< } public async getNewExtIndex(newMIndex: BN): Promise { - if (this.variant === Variant.NoYield) { + if (this.variant === Variant.Jmi) { return new BN(1e12); } else if (this.variant === Variant.ScaledUi) { const yieldConfig: YieldConfig = ( @@ -1328,8 +1333,8 @@ export class ExtensionTest< if (expected.yieldConfig) { switch (this.variant) { - case Variant.NoYield: - this.expectNoYieldYieldConfig( + case Variant.Jmi: + this.expectJmiYieldConfig( state.yieldConfig, expected.yieldConfig ); @@ -1403,7 +1408,7 @@ export class ExtensionTest< } } - private expectNoYieldYieldConfig( + private expectJmiYieldConfig( actual: YieldConfig, expected: YieldConfig ) { @@ -1546,7 +1551,7 @@ export class ExtensionTest< .signers([this.admin]) .rpc(); break; - case Variant.NoYield: + case Variant.Jmi: // Send the transaction await this.ext.methods .initialize(wrapAuthorities) @@ -1719,10 +1724,308 @@ export class ExtensionTest< return { vaultMTokenAccount, toMTokenAccount, fromExtTokenAccount }; } + // ============================================ + // JMI-specific helper methods + // ============================================ + + public getAssetConfigAccount(assetMint: PublicKey): PublicKey { + const [assetConfig] = PublicKey.findProgramAddressSync( + [ + Buffer.from("asset_config"), + this.getExtGlobalAccount().toBuffer(), + assetMint.toBuffer(), + ], + this.ext.programId + ); + return assetConfig; + } + + public async createAssetMint( + decimals: number = 6, + useToken2022: boolean = false + ): Promise { + const assetMint = new Keypair(); + await this.createMint( + assetMint, + this.admin.publicKey, + this.admin.publicKey, + useToken2022, + decimals + ); + return assetMint; + } + + public async mintAssetTokens( + assetMint: Keypair, + to: PublicKey, + amount: BN, + useToken2022: boolean = false + ): Promise { + const tokenAccount = await this.getATA( + assetMint.publicKey, + to, + useToken2022 + ); + + // Create mint-to instruction + const mintToIx = createMintToCheckedInstruction( + assetMint.publicKey, + tokenAccount, + this.admin.publicKey, + BigInt(amount.toString()), + 6, + [], + useToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID + ); + + const tx = new Transaction().add(mintToIx); + await this.provider.sendAndConfirm!(tx, [this.admin]); + + return tokenAccount; + } + + public async setAssetCap( + assetMint: PublicKey, + cap: BN, + admin?: Keypair, + useToken2022ForAsset: boolean = false + ): Promise { + if (this.variant !== Variant.Jmi) { + throw new Error("setAssetCap is only available for JMI variant"); + } + + const signer = admin ?? this.admin; + const assetTokenProgram = useToken2022ForAsset + ? TOKEN_2022_PROGRAM_ID + : TOKEN_PROGRAM_ID; + + await this.ext.methods + .setAssetCap(cap) + .accountsPartial({ + admin: signer.publicKey, + assetMint: assetMint, + assetTokenProgram: assetTokenProgram, + }) + .signers([signer]) + .rpc(); + } + + public async pause(admin?: Keypair): Promise { + if (this.variant !== Variant.Jmi) { + throw new Error("pause is only available for JMI variant"); + } + + const signer = admin ?? this.admin; + + await this.ext.methods + .pause() + .accounts({ + admin: signer.publicKey, + }) + .signers([signer]) + .rpc(); + } + + public async unpause(admin?: Keypair): Promise { + if (this.variant !== Variant.Jmi) { + throw new Error("unpause is only available for JMI variant"); + } + + const signer = admin ?? this.admin; + + await this.ext.methods + .unpause() + .accounts({ + admin: signer.publicKey, + }) + .signers([signer]) + .rpc(); + } + + public async wrapAsset( + assetMint: PublicKey, + amount: BN, + tokenAuthority: Keypair, + wrapAuthority?: Keypair | null, + useToken2022ForAsset: boolean = false + ): Promise<{ + fromAssetTokenAccount: PublicKey; + toExtTokenAccount: PublicKey; + vaultAssetTokenAccount: PublicKey; + }> { + if (this.variant !== Variant.Jmi) { + throw new Error("wrapAsset is only available for JMI variant"); + } + + const mVault = this.getMVault(); + const assetTokenProgram = useToken2022ForAsset + ? TOKEN_2022_PROGRAM_ID + : TOKEN_PROGRAM_ID; + + const fromAssetTokenAccount = await this.getATA( + assetMint, + tokenAuthority.publicKey, + useToken2022ForAsset + ); + const toExtTokenAccount = await this.getATA( + this.extMint.publicKey, + tokenAuthority.publicKey, + this.useToken2022ForExt + ); + const vaultAssetTokenAccount = await this.getATA( + assetMint, + mVault, + useToken2022ForAsset + ); + + await this.ext.methods + .wrapAsset(amount) + .accountsPartial({ + tokenAuthority: tokenAuthority.publicKey, + wrapAuthority: wrapAuthority + ? wrapAuthority.publicKey + : this.ext.programId, + assetMint: assetMint, + assetConfig: this.getAssetConfigAccount(assetMint), + fromAssetTokenAccount, + toExtTokenAccount, + vaultAssetTokenAccount, + assetTokenProgram, + extTokenProgram: this.extTokenProgram, + }) + .signers( + wrapAuthority ? [tokenAuthority, wrapAuthority] : [tokenAuthority] + ) + .rpc(); + + return { fromAssetTokenAccount, toExtTokenAccount, vaultAssetTokenAccount }; + } + + public async unwrapAsset( + assetMint: PublicKey, + mAmount: BN, + tokenAuthority: Keypair, + replaceAuthority?: Keypair | null, + useToken2022ForAsset: boolean = false + ): Promise<{ + fromMTokenAccount: PublicKey; + toAssetTokenAccount: PublicKey; + vaultMTokenAccount: PublicKey; + vaultAssetTokenAccount: PublicKey; + }> { + if (this.variant !== Variant.Jmi) { + throw new Error("unwrapAsset is only available for JMI variant"); + } + + const mVault = this.getMVault(); + const assetTokenProgram = useToken2022ForAsset + ? TOKEN_2022_PROGRAM_ID + : TOKEN_PROGRAM_ID; + + const fromMTokenAccount = await this.getATA( + this.mMint.publicKey, + tokenAuthority.publicKey + ); + const toAssetTokenAccount = await this.getATA( + assetMint, + tokenAuthority.publicKey, + useToken2022ForAsset + ); + const vaultMTokenAccount = await this.getATA(this.mMint.publicKey, mVault); + const vaultAssetTokenAccount = await this.getATA( + assetMint, + mVault, + useToken2022ForAsset + ); + + await this.ext.methods + .unwrapAsset(mAmount) + .accountsPartial({ + tokenAuthority: tokenAuthority.publicKey, + replaceAuthority: replaceAuthority + ? replaceAuthority.publicKey + : this.ext.programId, // effectively a no-op if not replacing + mMint: this.mMint.publicKey, + assetMint: assetMint, + assetConfig: this.getAssetConfigAccount(assetMint), + fromMTokenAccount, + toAssetTokenAccount, + vaultMTokenAccount, + vaultAssetTokenAccount, + assetTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers( + replaceAuthority + ? [tokenAuthority, replaceAuthority] + : [tokenAuthority] + ) + .rpc(); + + return { + fromMTokenAccount, + toAssetTokenAccount, + vaultMTokenAccount, + vaultAssetTokenAccount, + }; + } + + public async setupJmiAsset( + cap: BN, + decimals: number = 6, + useToken2022ForAsset: boolean = false + ): Promise<{ assetMint: Keypair; vaultAssetTokenAccount: PublicKey }> { + if (this.variant !== Variant.Jmi) { + throw new Error("setupJmiAsset is only available for JMI variant"); + } + + // Create asset mint + const assetMint = await this.createAssetMint(decimals, useToken2022ForAsset); + + // Set asset cap (this also creates the vault ATA) + await this.setAssetCap(assetMint.publicKey, cap, undefined, useToken2022ForAsset); + + // Get the vault ATA + const vaultAssetTokenAccount = await this.getATA( + assetMint.publicKey, + this.getMVault(), + useToken2022ForAsset + ); + + return { assetMint, vaultAssetTokenAccount }; + } + + public async expectAssetConfigState( + assetMint: PublicKey, + expected: AssetConfig + ): Promise { + if (this.variant !== Variant.Jmi) { + throw new Error( + "expectAssetConfigState is only available for JMI variant" + ); + } + + const assetConfigAccount = this.getAssetConfigAccount(assetMint); + const assetConfig = await this.ext.account.assetConfig.fetch( + assetConfigAccount + ); + + if (expected.cap !== undefined) { + expect(assetConfig.cap.toString()).toBe(expected.cap.toString()); + } + if (expected.bump !== undefined) { + expect(assetConfig.bump).toBe(expected.bump); + } + } + + // ============================================ + // End JMI-specific helper methods + // ============================================ + public async sync(): Promise { switch (this.variant) { - case Variant.NoYield: - throw new Error("sync is not supported for No Yield variant"); + case Variant.Jmi: + throw new Error("sync is not supported for JMI variant"); break; case Variant.ScaledUi: // Sync is open to any address @@ -2042,7 +2345,7 @@ export class ExtensionSwapTest extends ExtensionTestBase { super(addresses); // Load and add extension programs - const NO_YIELD_IDL = require("../../target/idl/no_yield.json"); + const JMI_IDL = require("../../target/idl/jmi.json"); const SCALED_UI_IDL = require("../../target/idl/scaled_ui.json"); // Add the test extension programs to SVM @@ -2059,9 +2362,9 @@ export class ExtensionSwapTest extends ExtensionTestBase { "tests/programs/ext_c.so" ); - // Create program instances + // Create program instances (using JMI IDL for no-yield variants since JMI is a superset) this.extensionPrograms.extA = new Program( - { ...NO_YIELD_IDL, address: ExtensionSwapTest.EXT_PROGRAM_IDS.extA }, + { ...JMI_IDL, address: ExtensionSwapTest.EXT_PROGRAM_IDS.extA }, this.provider ); this.extensionPrograms.extB = new Program( @@ -2069,7 +2372,7 @@ export class ExtensionSwapTest extends ExtensionTestBase { this.provider ); this.extensionPrograms.extC = new Program( - { ...NO_YIELD_IDL, address: ExtensionSwapTest.EXT_PROGRAM_IDS.extC }, + { ...JMI_IDL, address: ExtensionSwapTest.EXT_PROGRAM_IDS.extC }, this.provider ); diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index d522b3a..b991ad1 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -24,11 +24,11 @@ const initialIndex = new BN(1_100_000_000_000); // 1.1 with 12 decimals const ONE = new BN(1_000_000_000_000); // 1.0 with 12 decimals const VARIANTS = [ - [Variant.NoYield, TOKEN_2022_PROGRAM_ID], - [Variant.NoYield, TOKEN_PROGRAM_ID], [Variant.ScaledUi, TOKEN_2022_PROGRAM_ID], [Variant.Crank, TOKEN_PROGRAM_ID], [Variant.Crank, TOKEN_2022_PROGRAM_ID], + [Variant.Jmi, TOKEN_2022_PROGRAM_ID], + [Variant.Jmi, TOKEN_PROGRAM_ID], ]; // Implement test cases for all variants @@ -90,7 +90,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send the transaction await $.expectSystemError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize([]) : variant === Variant.ScaledUi ? $.ext.methods.initialize([], new BN(0)) @@ -122,7 +122,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send the transaction await $.expectAnchorError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize([]) : variant === Variant.ScaledUi ? $.ext.methods.initialize([], new BN(0)) @@ -155,7 +155,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send the transaction await $.expectAnchorError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize([]) : variant === Variant.ScaledUi ? $.ext.methods.initialize([], new BN(0)) @@ -183,7 +183,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send transaction // Expect error (could be one of several "SeedsConstraint", "AccountOwnedByWrongProgram", "AccountNotInitialized") await $.expectSystemError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize([]) : variant === Variant.ScaledUi ? $.ext.methods.initialize([], new BN(0)) @@ -211,7 +211,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send transaction // Expect error (could be one of several "SeedsConstraint", "AccountOwnedByWrongProgram", "AccountNotInitialized") await $.expectSystemError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize([]) : variant === Variant.ScaledUi ? $.ext.methods.initialize([], new BN(0)) @@ -244,7 +244,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send the transaction await $.expectAnchorError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize([]) : variant === Variant.ScaledUi ? $.ext.methods.initialize([], new BN(0)) @@ -271,7 +271,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Attempt to send transaction await $.expectAnchorError( - (variant === Variant.NoYield + (variant === Variant.Jmi ? $.ext.methods.initialize(wrapAuthorities) : variant === Variant.ScaledUi ? $.ext.methods.initialize(wrapAuthorities, new BN(0)) @@ -302,7 +302,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // [X] the bumps are set correctly // [X] the wrap authorities are set correctly - if (variant === Variant.NoYield) { + if (variant === Variant.Jmi) { // given accounts and params are correct // it creates the global account // it sets the admin to the signer @@ -542,7 +542,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthorities = [$.admin.publicKey, $.wrapAuthority.publicKey]; const feeBps = - variant === Variant.NoYield ? new BN(0) : new BN(randomInt(10000)); + variant === Variant.Jmi ? new BN(0) : new BN(randomInt(10000)); // Initialize the extension program await $.initializeExt(wrapAuthorities, feeBps); @@ -725,7 +725,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthorities = [$.admin.publicKey, $.wrapAuthority.publicKey]; const feeBps = - variant === Variant.NoYield ? new BN(0) : new BN(randomInt(10000)); + variant === Variant.Jmi ? new BN(0) : new BN(randomInt(10000)); // Initialize the extension program await $.initializeExt(wrapAuthorities, feeBps); }); @@ -813,7 +813,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthorities = [$.admin.publicKey, $.wrapAuthority.publicKey]; const feeBps = - variant === Variant.NoYield ? new BN(0) : new BN(randomInt(10000)); + variant === Variant.Jmi ? new BN(0) : new BN(randomInt(10000)); // Initialize the extension program await $.initializeExt(wrapAuthorities, feeBps); }); @@ -1378,7 +1378,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { // [X] it transfers the excess collateral to the recipient token account // [X] given the m vault does not have excess collateral // [X] it completes but doesn't transfer any tokens - if (variant === Variant.NoYield) { + if (variant === Variant.Jmi) { // given all accounts are correct // given the m vault has excess collateral // it transfers the excess collateral to the recipient token account @@ -7735,5 +7735,851 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); }); } - }); + + // JMI-specific tests (JMI variant only) + if (variant === Variant.Jmi) { + describe("JMI instruction tests", () => { + let wrapAuthorities: PublicKey[]; + + beforeEach(async () => { + wrapAuthorities = [$.admin.publicKey, $.wrapAuthority.publicKey]; + await $.initializeExt(wrapAuthorities); + }); + + describe("set_asset_cap unit tests", () => { + // set_asset_cap test cases + // [ ] given the admin does not sign the transaction + // [ ] it reverts with a NotAuthorized error + // [ ] given the admin signs the transaction + // [ ] given the global account is not the global PDA + // [ ] it reverts with a ConstraintSeeds error + // [ ] given the vault authority is not the m_vault PDA + // [ ] it reverts with a ConstraintSeeds error + // [ ] given the asset mint is the M token + // [ ] it reverts with a CannotCapMToken error + // [ ] given the asset mint does not have 6 decimals + // [ ] it reverts with an InvalidDecimals error + // [ ] given valid inputs + // [ ] it creates the asset_config account if it doesn't exist + // [ ] it creates the vault asset ATA if it doesn't exist + // [ ] it sets the cap on the asset_config + // [ ] it can update an existing cap to a new value + // [ ] it can set the cap to 0 to disable the asset + + let assetMint: Keypair; + + beforeEach(async () => { + assetMint = await $.createAssetMint(6); + }); + + // given the admin does not sign the transaction + // it reverts with a NotAuthorized error + test("Non-admin tries to set asset cap - reverts", async () => { + await $.expectAnchorError( + $.ext.methods + .setAssetCap(new BN(1_000_000_000)) + .accountsPartial({ + admin: $.nonAdmin.publicKey, + assetMint: assetMint.publicKey, + assetTokenProgram: TOKEN_PROGRAM_ID, + }) + .signers([$.nonAdmin]) + .rpc(), + "NotAuthorized" + ); + }); + + // given the asset mint is the M token + // it reverts with a CannotCapMToken error + test("Asset mint is M token - reverts", async () => { + await $.expectAnchorError( + $.ext.methods + .setAssetCap(new BN(1_000_000_000)) + .accountsPartial({ + admin: $.admin.publicKey, + assetMint: $.mMint.publicKey, + assetTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.admin]) + .rpc(), + "CannotCapMToken" + ); + }); + + // given the asset mint does not have 6 decimals + // it reverts with an InvalidDecimals error + test("Asset mint with wrong decimals - reverts", async () => { + const wrongDecimalsMint = await $.createAssetMint(9); + + await $.expectAnchorError( + $.ext.methods + .setAssetCap(new BN(1_000_000_000)) + .accountsPartial({ + admin: $.admin.publicKey, + assetMint: wrongDecimalsMint.publicKey, + assetTokenProgram: TOKEN_PROGRAM_ID, + }) + .signers([$.admin]) + .rpc(), + "InvalidDecimals" + ); + }); + + // given valid inputs + // it creates the asset_config account and sets the cap + test("Set asset cap - success", async () => { + const cap = new BN(1_000_000_000); + await $.setAssetCap(assetMint.publicKey, cap); + + await $.expectAssetConfigState(assetMint.publicKey, { + cap: cap, + }); + }); + + // it can update an existing cap to a new value + test("Update existing asset cap - success", async () => { + const initialCap = new BN(1_000_000_000); + await $.setAssetCap(assetMint.publicKey, initialCap); + + const newCap = new BN(2_000_000_000); + await $.setAssetCap(assetMint.publicKey, newCap); + + await $.expectAssetConfigState(assetMint.publicKey, { + cap: newCap, + }); + }); + + // it can set the cap to 0 to disable the asset + test("Set cap to zero to disable asset - success", async () => { + const cap = new BN(1_000_000_000); + await $.setAssetCap(assetMint.publicKey, cap); + + await $.setAssetCap(assetMint.publicKey, new BN(0)); + + await $.expectAssetConfigState(assetMint.publicKey, { + cap: new BN(0), + }); + }); + }); + + describe("pause unit tests", () => { + // pause test cases + // [ ] given the admin does not sign the transaction + // [ ] it reverts with a NotAuthorized error + // [ ] given the admin signs the transaction + // [ ] given the global account is not the global PDA + // [ ] it reverts with a ConstraintSeeds error + // [ ] given valid inputs + // [ ] it sets is_paused to true on the global account + + // given the admin does not sign the transaction + // it reverts with a NotAuthorized error + test("Non-admin tries to pause - reverts", async () => { + await $.expectAnchorError( + $.ext.methods + .pause() + .accounts({ + admin: $.nonAdmin.publicKey, + }) + .signers([$.nonAdmin]) + .rpc(), + "NotAuthorized" + ); + }); + + // given valid inputs + // it sets is_paused to true on the global account + test("Admin pauses contract - success", async () => { + await $.pause(); + + await $.expectExtGlobalState({ + yieldConfig: { + isPaused: true, + }, + }); + }); + }); + + describe("unpause unit tests", () => { + // unpause test cases + // [ ] given the admin does not sign the transaction + // [ ] it reverts with a NotAuthorized error + // [ ] given the admin signs the transaction + // [ ] given the global account is not the global PDA + // [ ] it reverts with a ConstraintSeeds error + // [ ] given valid inputs + // [ ] it sets is_paused to false on the global account + // [ ] it can be called when already unpaused (idempotent) + + // given the admin does not sign the transaction + // it reverts with a NotAuthorized error + test("Non-admin tries to unpause - reverts", async () => { + await $.expectAnchorError( + $.ext.methods + .unpause() + .accounts({ + admin: $.nonAdmin.publicKey, + }) + .signers([$.nonAdmin]) + .rpc(), + "NotAuthorized" + ); + }); + + // given valid inputs + // it sets is_paused to false on the global account + test("Admin unpauses contract - success", async () => { + await $.pause(); + + await $.expectExtGlobalState({ + yieldConfig: { + isPaused: true, + }, + }); + + await $.unpause(); + + await $.expectExtGlobalState({ + yieldConfig: { + isPaused: false, + }, + }); + }); + + // it can be called when already unpaused (idempotent) + test("Unpause when already unpaused - success (idempotent)", async () => { + await $.unpause(); + + await $.expectExtGlobalState({ + yieldConfig: { + isPaused: false, + }, + }); + }); + }); + + describe("wrap_asset unit tests", () => { + // wrap_asset test cases + // [ ] given the caller is not authorized (not in wrap_authorities) + // [ ] it reverts with a NotAuthorized error + // [ ] given an authorized caller signs the transaction + // [ ] given the amount is 0 + // [ ] it reverts with an InvalidAmount error + // [ ] given the contract is paused + // [ ] it reverts with a Paused error + // [ ] given the asset mint is the M token + // [ ] it reverts with an AssetNotAllowed error + // [ ] given the asset config cap is 0 (disabled) + // [ ] it reverts with an AssetNotAllowed error + // [ ] given the asset config does not exist for this asset + // [ ] it reverts with a ConstraintSeeds error + // [ ] given the wrap would exceed the asset cap + // [ ] it reverts with an AssetCapExceeded error + // [ ] given valid inputs + // [ ] it transfers assets from user to vault + // [ ] it mints ext tokens 1:1 to the user + // [ ] it increments total_assets on the global account + + let assetMint: Keypair; + let fromAssetTokenAccount: PublicKey; + let toExtTokenAccount: PublicKey; + + const assetCap = new BN(1_000_000_000); // 1000 tokens + const mintAmount = new BN(100_000_000); // 100 tokens + + beforeEach(async () => { + // Setup asset with cap + const setup = await $.setupJmiAsset(assetCap); + assetMint = setup.assetMint; + + // Mint assets to wrap authority + await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, mintAmount); + + // fromAssetTokenAccount = await $.getATA( + // assetMint.publicKey, + // $.wrapAuthority.publicKey, + // false + // ); + + // toExtTokenAccount = await $.getATA( + // $.extMint.publicKey, + // $.wrapAuthority.publicKey, + // $.useToken2022ForExt + // ); + + fromAssetTokenAccount = await $.getATA( + assetMint.publicKey, + $.nonWrapAuthority.publicKey, + false + ); + + toExtTokenAccount = await $.getATA( + $.extMint.publicKey, + $.nonWrapAuthority.publicKey, + $.useToken2022ForExt + ); + + }); + + // given the caller is not authorized (not in wrap_authorities) + // it reverts with a NotAuthorized error + test("Non-authorized caller tries to wrap asset - reverts", async () => { + + + // Mint some assets to the non-wrap authority + await $.mintAssetTokens(assetMint, $.nonWrapAuthority.publicKey, mintAmount); + + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.nonWrapAuthority.publicKey, + wrapAuthority: $.ext.programId, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromAssetTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.nonWrapAuthority]) + .rpc(), + "NotAuthorized" + ); + }); + + // given the amount is 0 + // it reverts with an InvalidAmount error + test("Wrap asset with zero amount - reverts", async () => { + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(0)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + wrapAuthority: $.ext.programId, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromAssetTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "InvalidAmount" + ); + }); + + // given the contract is paused + // it reverts with a Paused error + test("Wrap asset when paused - reverts", async () => { + await $.pause(); + + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + wrapAuthority: $.ext.programId, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromAssetTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "Paused" + ); + }); + + // given the asset config cap is 0 (disabled) + // it reverts with an AssetNotAllowed error + test("Wrap asset with zero cap - reverts", async () => { + // Disable the asset + await $.setAssetCap(assetMint.publicKey, new BN(0)); + + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + wrapAuthority: $.ext.programId, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromAssetTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "AssetNotAllowed" + ); + }); + + // given the wrap would exceed the asset cap + // it reverts with an AssetCapExceeded error + test("Wrap asset exceeding cap - reverts", async () => { + // Set a small cap + await $.setAssetCap(assetMint.publicKey, new BN(10_000_000)); + + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(20_000_000)) // Exceeds cap + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + wrapAuthority: $.ext.programId, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromAssetTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "AssetCapExceeded" + ); + }); + + // given valid inputs + // it transfers assets from user to vault and mints ext tokens 1:1 + test("Wrap asset - success", async () => { + const wrapAmount = new BN(10_000_000); + + // Get initial balances + const userAssetAccount = await $.getATA( + assetMint.publicKey, + $.wrapAuthority.publicKey, + false + ); + const userExtAccount = await $.getATA( + $.extMint.publicKey, + $.wrapAuthority.publicKey, + $.useToken2022ForExt + ); + const vaultAssetAccount = await $.getATA( + assetMint.publicKey, + $.getMVault(), + false + ); + + const initialUserAssetBalance = await $.getTokenBalance(userAssetAccount, false); + const initialUserExtBalance = await $.getTokenBalance(userExtAccount, $.useToken2022ForExt); + const initialVaultAssetBalance = await $.getTokenBalance(vaultAssetAccount, false); + + // Wrap assets + await $.wrapAsset(assetMint.publicKey, wrapAmount, $.wrapAuthority); + + // Verify balances + await $.expectTokenBalance( + userAssetAccount, + initialUserAssetBalance.sub(wrapAmount), + Comparison.Equal, + undefined, + false + ); + await $.expectTokenBalance( + userExtAccount, + initialUserExtBalance.add(wrapAmount), + Comparison.Equal, + undefined, + $.useToken2022ForExt + ); + await $.expectTokenBalance( + vaultAssetAccount, + initialVaultAssetBalance.add(wrapAmount), + Comparison.Equal, + undefined, + false + ); + + // Verify total_assets updated + await $.expectExtGlobalState({ + yieldConfig: { + totalAssets: wrapAmount, + }, + }); + }); + + // Multiple wraps accumulate total_assets + test("Multiple wrap assets - success", async () => { + const wrapAmount1 = new BN(10_000_000); + const wrapAmount2 = new BN(20_000_000); + + await $.wrapAsset(assetMint.publicKey, wrapAmount1, $.wrapAuthority); + await $.wrapAsset(assetMint.publicKey, wrapAmount2, $.wrapAuthority); + + await $.expectExtGlobalState({ + yieldConfig: { + totalAssets: wrapAmount1.add(wrapAmount2), + }, + }); + }); + }); + + describe("unwrap_asset unit tests", () => { + // unwrap_asset test cases + // [ ] given the caller is not authorized (not in wrap_authorities) + // [ ] it reverts with a NotAuthorized error + // [ ] given an authorized caller signs the transaction + // [ ] given the m_amount is 0 + // [ ] it reverts with an InvalidAmount error + // [ ] given the contract is paused + // [ ] it reverts with a Paused error + // [ ] given the vault has insufficient asset backing for the conversion + // [ ] it reverts with an InsufficientAssetBacking error + // [ ] given valid inputs + // [ ] it converts M amount to asset amount using M index (rounds down) + // [ ] it transfers M from user to vault + // [ ] it transfers asset from vault to user + // [ ] it decrements total_assets on the global account + + let assetMint: Keypair; + const assetCap = new BN(1_000_000_000); // 1000 tokens + const mintAmount = new BN(100_000_000); // 100 tokens + const wrapAmount = new BN(50_000_000); // 50 tokens + + beforeEach(async () => { + // Setup asset with cap + const setup = await $.setupJmiAsset(assetCap); + assetMint = setup.assetMint; + + // Add the wrap authority and as M earners to have thawed token accounts + await $.addMEarner($.wrapAuthority.publicKey); + await $.addMEarner($.nonWrapAuthority.publicKey); + + // Mint assets and wrap some to create initial state + await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, mintAmount); + await $.wrapAsset(assetMint.publicKey, wrapAmount, $.wrapAuthority); + + // Mint M to wrap authority for unwrap_asset + await $.mintM($.wrapAuthority.publicKey, mintAmount); + }); + + // given the caller is not authorized (not in wrap_authorities) + // it reverts with a NotAuthorized error + test("Non-authorized caller tries to unwrap asset - reverts", async () => { + // Mint M to non-wrap authority + await $.mintM($.nonWrapAuthority.publicKey, mintAmount); + + // Create asset token account for non-wrap authority + await $.getATA(assetMint.publicKey, $.nonWrapAuthority.publicKey, false); + + let fromMTokenAccount = await $.getATA( + $.mMint.publicKey, + $.nonWrapAuthority.publicKey, + ); + + let toAssetTokenAccount = await $.getATA( + assetMint.publicKey, + $.nonWrapAuthority.publicKey, + false + ); + + + await $.expectAnchorError( + $.ext.methods + .unwrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.nonWrapAuthority.publicKey, + replaceAuthority: $.ext.programId, + mMint: $.mMint.publicKey, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromMTokenAccount, + toAssetTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.nonWrapAuthority]) + .rpc(), + "NotAuthorized" + ); + }); + + // given the m_amount is 0 + // it reverts with an InvalidAmount error + test("Unwrap asset with zero M amount - reverts", async () => { + + let fromMTokenAccount = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey, + ); + + let toAssetTokenAccount = await $.getATA( + assetMint.publicKey, + $.wrapAuthority.publicKey, + false + ); + + await $.expectAnchorError( + $.ext.methods + .unwrapAsset(new BN(0)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + replaceAuthority: $.ext.programId, + mMint: $.mMint.publicKey, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromMTokenAccount, + toAssetTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.wrapAuthority]) + .rpc(), + "InvalidAmount" + ); + }); + + // given the contract is paused + // it reverts with a Paused error + test("Unwrap asset when paused - reverts", async () => { + let fromMTokenAccount = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey, + ); + + let toAssetTokenAccount = await $.getATA( + assetMint.publicKey, + $.wrapAuthority.publicKey, + false + ); + + await $.pause(); + + await $.expectAnchorError( + $.ext.methods + .unwrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + replaceAuthority: $.ext.programId, + mMint: $.mMint.publicKey, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromMTokenAccount, + toAssetTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.wrapAuthority]) + .rpc(), + "Paused" + ); + }); + + // given the vault has insufficient asset backing for the conversion + // it reverts with an InsufficientAssetBacking error + test("Unwrap asset with insufficient backing - reverts", async () => { + // Try to unwrap more than the vault has + const largeAmount = wrapAmount.mul(new BN(10)); // Way more than vault has + + let fromMTokenAccount = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey, + ); + + let toAssetTokenAccount = await $.getATA( + assetMint.publicKey, + $.wrapAuthority.publicKey, + false + ); + + await $.expectAnchorError( + $.ext.methods + .unwrapAsset(largeAmount) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + replaceAuthority: $.ext.programId, + mMint: $.mMint.publicKey, + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount(assetMint.publicKey), + fromMTokenAccount, + toAssetTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.wrapAuthority]) + .rpc(), + "InsufficientAssetBacking" + ); + }); + + // given valid inputs - success + test("Unwrap asset - success", async () => { + // Use a smaller amount that fits within the vault's backing + // M index is ~1.1, so mAmount of 10M should give ~9M assets + const mAmount = new BN(10_000_000); + + // Get initial balances + const userMAccount = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey + ); + const userAssetAccount = await $.getATA( + assetMint.publicKey, + $.wrapAuthority.publicKey, + false + ); + const vaultMAccount = await $.getATA($.mMint.publicKey, $.getMVault()); + const vaultAssetAccount = await $.getATA( + assetMint.publicKey, + $.getMVault(), + false + ); + + const initialUserMBalance = await $.getTokenBalance(userMAccount); + const initialUserAssetBalance = await $.getTokenBalance(userAssetAccount, false); + const initialVaultMBalance = await $.getTokenBalance(vaultMAccount); + const initialVaultAssetBalance = await $.getTokenBalance(vaultAssetAccount, false); + const globalAccount = await $.ext.account.extGlobalV2.fetch($.getExtGlobalAccount()); + const initialTotalAssets = (globalAccount.yieldConfig as any).totalAssets as BN; + + // Unwrap assets + await $.unwrapAsset(assetMint.publicKey, mAmount, $.wrapAuthority); + + // Verify M transferred to vault + await $.expectTokenBalance( + userMAccount, + initialUserMBalance.sub(mAmount) + ); + await $.expectTokenBalance( + vaultMAccount, + initialVaultMBalance.add(mAmount) + ); + + // Verify assets transferred from vault (amount depends on M index) + const userAssetBalanceAfter = await $.getTokenBalance(userAssetAccount, false); + const vaultAssetBalanceAfter = await $.getTokenBalance(vaultAssetAccount, false); + const assetTransferred = initialVaultAssetBalance.sub(vaultAssetBalanceAfter); + + expect(assetTransferred.gt(new BN(0))).toBe(true); + expect(userAssetBalanceAfter.sub(initialUserAssetBalance).toString()).toBe( + assetTransferred.toString() + ); + + // Verify total_assets decremented + await $.expectExtGlobalState({ + yieldConfig: { + totalAssets: initialTotalAssets.sub(assetTransferred), + }, + }); + }); + + // describe("unwrap with JMI backing tests", () => { + // // unwrap test cases (JMI-specific additions) + // // [ ] given the JMI feature is enabled + // // [ ] given ext_principal exceeds M backing (ext_supply - total_assets) + // // [ ] it reverts with an InsufficientMBacking error + // // [ ] given ext_principal equals available M backing + // // [ ] it succeeds and unwraps the full M backing + // // [ ] given ext_principal is less than M backing + // // [ ] it succeeds normally + + // let assetMint: Keypair; + // const assetCap = new BN(1_000_000_000); + // const mWrapAmount = new BN(50_000_000); // 50 tokens wrapped via M + // const assetWrapAmount = new BN(30_000_000); // 30 tokens wrapped via asset + + // let fromExtTokenAccount: PublicKey; + // let toMTokenAccount: PublicKey; + + // beforeEach(async () => { + // // Setup: wrap both M and assets to create mixed backing + + // // First wrap M tokens + + // const feeBps = new BN(randomInt(10000)) + + // // Initialize the extension program + // await $.initializeExt(wrapAuthorities, feeBps); + + // // Add the wrap authority and non-wrap authority as M earners to have thawed token accounts + // await $.addMEarner($.wrapAuthority.publicKey); + // await $.addMEarner($.nonWrapAuthority.publicKey); + + // await $.mintM($.wrapAuthority.publicKey, mWrapAmount.mul(new BN(2))); + // await $.wrap($.wrapAuthority, mWrapAmount); + + // // Then setup and wrap assets + // const setup = await $.setupJmiAsset(assetCap); + // assetMint = setup.assetMint; + // await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, assetWrapAmount.mul(new BN(2))); + // await $.wrapAsset(assetMint.publicKey, assetWrapAmount, $.wrapAuthority); + + // // Now we have: + // // - ext_supply = mWrapAmount + assetWrapAmount (approx, depends on index) + // // - total_assets = assetWrapAmount + // // - M backing = ext_supply - total_assets = mWrapAmount (approx) + + // fromExtTokenAccount = await $.getATA( + // $.extMint.publicKey, + // $.wrapAuthority.publicKey, + // $.useToken2022ForExt + // ); + + // toMTokenAccount = await $.getATA( + // $.mMint.publicKey, + // $.wrapAuthority.publicKey + // ); + + // }); + + // // given ext_principal exceeds M backing + // // it reverts with an InsufficientMBacking error + // test("Unwrap exceeding M backing - reverts", async () => { + // // Get current ext balance (should have mWrapAmount + assetWrapAmount worth) + // const userExtAccount = await $.getATA( + // $.extMint.publicKey, + // $.wrapAuthority.publicKey, + // $.useToken2022ForExt + // ); + // const userExtBalance = await $.getTokenBalance(userExtAccount, $.useToken2022ForExt); + + // // Try to unwrap entire ext balance - but only mWrapAmount is backed by M + // // This should fail because some of the ext is backed by assets, not M + // await $.expectAnchorError( + // $.ext.methods + // .unwrap(userExtBalance) + // .accounts({ + // tokenAuthority: $.wrapAuthority.publicKey, + // unwrapAuthority: $.ext.programId, + // fromExtTokenAccount, + // toMTokenAccount, + // extTokenProgram: $.extTokenProgram, + // }) + // .signers([$.wrapAuthority]) + // .rpc(), + // "InsufficientMBacking" + // ); + // }); + + // // given ext_principal is less than M backing + // // it succeeds normally + // test("Unwrap within M backing - success", async () => { + // // Unwrap a small amount that's definitely within M backing + // const smallUnwrapAmount = mWrapAmount.div(new BN(2)); + + // const userMAccountBefore = await $.getATA( + // $.mMint.publicKey, + // $.wrapAuthority.publicKey + // ); + // const mBalanceBefore = await $.getTokenBalance(userMAccountBefore); + + // // This should succeed + // await $.unwrap($.wrapAuthority, smallUnwrapAmount); + + // // Verify M was received + // const mBalanceAfter = await $.getTokenBalance(userMAccountBefore); + // expect(mBalanceAfter.gt(mBalanceBefore)).toBe(true); + // }); + // }); + }); + }); + }; +}); } + From 68e4a300bfd0136f84ef3bd347d18255bd02a8d7 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Thu, 15 Jan 2026 14:09:29 -0600 Subject: [PATCH 09/27] ext_swap wrap n unwrap asset now both have whitelist protection --- .../ext_swap/src/instructions/wrap_asset.rs | 26 ++- .../src/instructions/jmi/set_asset_cap.rs | 9 +- .../m_ext/src/instructions/jmi/wrap_asset.rs | 4 +- tests/unit/ext_test_harness.ts | 2 +- tests/unit/m_ext.test.ts | 218 +++++++++--------- 5 files changed, 130 insertions(+), 129 deletions(-) diff --git a/programs/ext_swap/src/instructions/wrap_asset.rs b/programs/ext_swap/src/instructions/wrap_asset.rs index e2fb3ce..d619ef5 100644 --- a/programs/ext_swap/src/instructions/wrap_asset.rs +++ b/programs/ext_swap/src/instructions/wrap_asset.rs @@ -4,14 +4,21 @@ use m_ext::cpi::accounts::WrapAsset as ExtWrapAsset; use m_ext::state::{EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}; use crate::errors::SwapError; -use crate::state::{SwapGlobal, GLOBAL_SEED}; +use crate::state::{SwapGlobal, GLOBAL_SEED, REPLACE_AUTHORITY_SEED}; #[derive(Accounts)] pub struct WrapAsset<'info> { pub signer: Signer<'info>, - // Required if the swap program is not whitelisted on the extension - pub wrap_authority: Option>, + // Required if the fallback_replace_authority is not whitelisted on the extension + pub replace_authority: Option>, + + /// CHECK: PDA used as replace authority for extensions + #[account( + seeds = [REPLACE_AUTHORITY_SEED], + bump, + )] + pub fallback_replace_authority: AccountInfo<'info>, /* * Program globals @@ -123,10 +130,10 @@ impl<'info> WrapAsset<'info> { #[access_control(ctx.accounts.validate(amount))] pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, amount: u64) -> Result<()> { - // Set swap program as authority if none provided - let wrap_authority = match &ctx.accounts.wrap_authority { + // Set replace authority PDA as authority if none provided + let replace_authority = match &ctx.accounts.replace_authority { Some(auth) => auth.to_account_info(), - None => ctx.accounts.swap_global.to_account_info(), + None => ctx.accounts.fallback_replace_authority.to_account_info(), }; m_ext::cpi::wrap_asset( @@ -134,7 +141,7 @@ impl<'info> WrapAsset<'info> { ctx.accounts.to_ext_program.to_account_info(), ExtWrapAsset { token_authority: ctx.accounts.signer.to_account_info(), - wrap_authority: Some(wrap_authority), + replace_authority: Some(replace_authority), asset_mint: ctx.accounts.asset_mint.to_account_info(), ext_mint: ctx.accounts.to_mint.to_account_info(), global_account: ctx.accounts.to_global.to_account_info(), @@ -147,9 +154,8 @@ impl<'info> WrapAsset<'info> { asset_token_program: ctx.accounts.asset_token_program.to_account_info(), ext_token_program: ctx.accounts.to_token_program.to_account_info(), }, - &[&[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]]], - ) - .with_remaining_accounts(ctx.remaining_accounts.to_vec()), + &[&[REPLACE_AUTHORITY_SEED, &[ctx.bumps.fallback_replace_authority]]], + ), amount, ) } diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index 6fbb25d..c2c6292 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -75,11 +75,14 @@ impl SetAssetCap<'_> { // If first initialization (all fields are zero), set bump if asset_config.cap == 0 && asset_config.bump == 0 { - asset_config.bump = ctx.bumps.asset_config; + ctx.accounts.asset_config.set_inner(AssetConfig { + cap: cap, + bump: ctx.bumps.asset_config, + }); + } else { + asset_config.cap = cap; } - asset_config.cap = cap; - Ok(()) } } diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index d435ff6..f4700d5 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -15,7 +15,7 @@ pub struct WrapAsset<'info> { pub token_authority: Signer<'info>, /// Will be set if a whitelisted authority is signing for a user - pub wrap_authority: Option>, + pub replace_authority: Option>, /// Non-M asset mint (USDC, USDT, etc.) - CANNOT be M #[account(mint::token_program = asset_token_program)] @@ -85,7 +85,7 @@ pub struct WrapAsset<'info> { impl WrapAsset<'_> { pub fn validate(&self, amount: u64) -> Result<()> { - let auth = match &self.wrap_authority { + let auth = match &self.replace_authority { Some(auth) => auth.key, None => self.token_authority.key, }; diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index 8c2dc20..e438a58 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -1882,7 +1882,7 @@ export class ExtensionTest< .wrapAsset(amount) .accountsPartial({ tokenAuthority: tokenAuthority.publicKey, - wrapAuthority: wrapAuthority + replaceAuthority: wrapAuthority ? wrapAuthority.publicKey : this.ext.programId, assetMint: assetMint, diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index b991ad1..cd84959 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -8034,7 +8034,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { .wrapAsset(new BN(10_000_000)) .accountsPartial({ tokenAuthority: $.nonWrapAuthority.publicKey, - wrapAuthority: $.ext.programId, + replaceAuthority: $.ext.programId, assetMint: assetMint.publicKey, assetConfig: $.getAssetConfigAccount(assetMint.publicKey), fromAssetTokenAccount, @@ -8056,7 +8056,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { .wrapAsset(new BN(0)) .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, - wrapAuthority: $.ext.programId, + replaceAuthority: $.ext.programId, assetMint: assetMint.publicKey, assetConfig: $.getAssetConfigAccount(assetMint.publicKey), fromAssetTokenAccount, @@ -8080,7 +8080,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { .wrapAsset(new BN(10_000_000)) .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, - wrapAuthority: $.ext.programId, + replaceAuthority: $.ext.programId, assetMint: assetMint.publicKey, assetConfig: $.getAssetConfigAccount(assetMint.publicKey), fromAssetTokenAccount, @@ -8105,7 +8105,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { .wrapAsset(new BN(10_000_000)) .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, - wrapAuthority: $.ext.programId, + replaceAuthority: $.ext.programId, assetMint: assetMint.publicKey, assetConfig: $.getAssetConfigAccount(assetMint.publicKey), fromAssetTokenAccount, @@ -8130,7 +8130,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { .wrapAsset(new BN(20_000_000)) // Exceeds cap .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, - wrapAuthority: $.ext.programId, + replaceAuthority: $.ext.programId, assetMint: assetMint.publicKey, assetConfig: $.getAssetConfigAccount(assetMint.publicKey), fromAssetTokenAccount, @@ -8469,114 +8469,106 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); }); - // describe("unwrap with JMI backing tests", () => { - // // unwrap test cases (JMI-specific additions) - // // [ ] given the JMI feature is enabled - // // [ ] given ext_principal exceeds M backing (ext_supply - total_assets) - // // [ ] it reverts with an InsufficientMBacking error - // // [ ] given ext_principal equals available M backing - // // [ ] it succeeds and unwraps the full M backing - // // [ ] given ext_principal is less than M backing - // // [ ] it succeeds normally - - // let assetMint: Keypair; - // const assetCap = new BN(1_000_000_000); - // const mWrapAmount = new BN(50_000_000); // 50 tokens wrapped via M - // const assetWrapAmount = new BN(30_000_000); // 30 tokens wrapped via asset - - // let fromExtTokenAccount: PublicKey; - // let toMTokenAccount: PublicKey; - - // beforeEach(async () => { - // // Setup: wrap both M and assets to create mixed backing - - // // First wrap M tokens - - // const feeBps = new BN(randomInt(10000)) - - // // Initialize the extension program - // await $.initializeExt(wrapAuthorities, feeBps); - - // // Add the wrap authority and non-wrap authority as M earners to have thawed token accounts - // await $.addMEarner($.wrapAuthority.publicKey); - // await $.addMEarner($.nonWrapAuthority.publicKey); - - // await $.mintM($.wrapAuthority.publicKey, mWrapAmount.mul(new BN(2))); - // await $.wrap($.wrapAuthority, mWrapAmount); - - // // Then setup and wrap assets - // const setup = await $.setupJmiAsset(assetCap); - // assetMint = setup.assetMint; - // await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, assetWrapAmount.mul(new BN(2))); - // await $.wrapAsset(assetMint.publicKey, assetWrapAmount, $.wrapAuthority); - - // // Now we have: - // // - ext_supply = mWrapAmount + assetWrapAmount (approx, depends on index) - // // - total_assets = assetWrapAmount - // // - M backing = ext_supply - total_assets = mWrapAmount (approx) - - // fromExtTokenAccount = await $.getATA( - // $.extMint.publicKey, - // $.wrapAuthority.publicKey, - // $.useToken2022ForExt - // ); - - // toMTokenAccount = await $.getATA( - // $.mMint.publicKey, - // $.wrapAuthority.publicKey - // ); - - // }); - - // // given ext_principal exceeds M backing - // // it reverts with an InsufficientMBacking error - // test("Unwrap exceeding M backing - reverts", async () => { - // // Get current ext balance (should have mWrapAmount + assetWrapAmount worth) - // const userExtAccount = await $.getATA( - // $.extMint.publicKey, - // $.wrapAuthority.publicKey, - // $.useToken2022ForExt - // ); - // const userExtBalance = await $.getTokenBalance(userExtAccount, $.useToken2022ForExt); - - // // Try to unwrap entire ext balance - but only mWrapAmount is backed by M - // // This should fail because some of the ext is backed by assets, not M - // await $.expectAnchorError( - // $.ext.methods - // .unwrap(userExtBalance) - // .accounts({ - // tokenAuthority: $.wrapAuthority.publicKey, - // unwrapAuthority: $.ext.programId, - // fromExtTokenAccount, - // toMTokenAccount, - // extTokenProgram: $.extTokenProgram, - // }) - // .signers([$.wrapAuthority]) - // .rpc(), - // "InsufficientMBacking" - // ); - // }); - - // // given ext_principal is less than M backing - // // it succeeds normally - // test("Unwrap within M backing - success", async () => { - // // Unwrap a small amount that's definitely within M backing - // const smallUnwrapAmount = mWrapAmount.div(new BN(2)); - - // const userMAccountBefore = await $.getATA( - // $.mMint.publicKey, - // $.wrapAuthority.publicKey - // ); - // const mBalanceBefore = await $.getTokenBalance(userMAccountBefore); - - // // This should succeed - // await $.unwrap($.wrapAuthority, smallUnwrapAmount); - - // // Verify M was received - // const mBalanceAfter = await $.getTokenBalance(userMAccountBefore); - // expect(mBalanceAfter.gt(mBalanceBefore)).toBe(true); - // }); - // }); + describe("unwrap with JMI backing tests", () => { + // unwrap test cases (JMI-specific additions) + // [ ] given the JMI feature is enabled + // [ ] given ext_principal exceeds M backing (ext_supply - total_assets) + // [ ] it reverts with an InsufficientMBacking error + // [ ] given ext_principal equals available M backing + // [ ] it succeeds and unwraps the full M backing + // [ ] given ext_principal is less than M backing + // [ ] it succeeds normally + + let assetMint: Keypair; + const assetCap = new BN(1_000_000_000); + const mWrapAmount = new BN(50_000_000); // 50 tokens wrapped via M + const assetWrapAmount = new BN(30_000_000); // 30 tokens wrapped via asset + + let fromExtTokenAccount: PublicKey; + let toMTokenAccount: PublicKey; + + beforeEach(async () => { + // Setup asset with cap + const setup = await $.setupJmiAsset(assetCap); + assetMint = setup.assetMint; + + // Then setup and wrap assets + await $.expectAssetConfigState(assetMint.publicKey, { + cap: assetCap, + }); + + // First wrap M tokens + const feeBps = new BN(randomInt(10000)) + + await $.mintM($.wrapAuthority.publicKey, mWrapAmount); + await $.wrap($.wrapAuthority, mWrapAmount); + + + await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, assetWrapAmount.mul(new BN(2))); + await $.wrapAsset(assetMint.publicKey, assetWrapAmount, $.wrapAuthority); + + fromExtTokenAccount = await $.getATA( + $.extMint.publicKey, + $.wrapAuthority.publicKey, + $.useToken2022ForExt + ); + + toMTokenAccount = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey + ); + + }); + + // given ext_principal exceeds M backing + // it reverts with an InsufficientMBacking error + test("Unwrap exceeding M backing - reverts", async () => { + // Get current ext balance (should have mWrapAmount + assetWrapAmount worth) + const userExtAccount = await $.getATA( + $.extMint.publicKey, + $.wrapAuthority.publicKey, + $.useToken2022ForExt + ); + const userExtBalance = await $.getTokenBalance(userExtAccount, $.useToken2022ForExt); + + // Try to unwrap entire ext balance - but only mWrapAmount is backed by M + // This should fail because some of the ext is backed by assets, not M + await $.expectAnchorError( + $.ext.methods + .unwrap(userExtBalance) + .accounts({ + tokenAuthority: $.wrapAuthority.publicKey, + unwrapAuthority: $.ext.programId, + fromExtTokenAccount, + toMTokenAccount, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "InsufficientMBacking" + ); + }); + + // given ext_principal is less than M backing + // it succeeds normally + test("Unwrap within M backing - success", async () => { + // Unwrap a small amount that's definitely within M backing + const smallUnwrapAmount = mWrapAmount.div(new BN(2)); + + const userMAccountBefore = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey + ); + const mBalanceBefore = await $.getTokenBalance(userMAccountBefore); + + // This should succeed + await $.unwrap($.wrapAuthority, smallUnwrapAmount); + + // Verify M was received + const mBalanceAfter = await $.getTokenBalance(userMAccountBefore); + expect(mBalanceAfter.gt(mBalanceBefore)).toBe(true); + }); + }); }); }); }; From aab8a56c0887dfdd3bb8123df982457d4efa7480 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Fri, 16 Jan 2026 17:19:31 -0600 Subject: [PATCH 10/27] chore: added tests --- Makefile | 2 +- .../ext_swap/src/instructions/unwrap_asset.rs | 15 +- .../ext_swap/src/instructions/wrap_asset.rs | 5 +- tests/programs/ext_a.so | Bin 398616 -> 484112 bytes tests/programs/ext_c.so | Bin 398896 -> 484392 bytes tests/unit/ext_swap.test.ts | 659 ++++++++++++++++++ tests/unit/ext_test_harness.ts | 274 ++++++++ tests/unit/m_ext.test.ts | 417 ++++++++--- 8 files changed, 1262 insertions(+), 110 deletions(-) diff --git a/Makefile b/Makefile index 1725001..0029bd4 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ endef build-test-programs: $(call update-program-id,3joDhmLtHLrSBGfeAe1xQiv3gjikes3x8S4N3o6Ld8zB) - anchor build -p m_ext + anchor build -p m_ext -- --features jmi --no-default-features @mv target/deploy/m_ext.so tests/programs/ext_a.so $(call update-program-id,HSMnbWEkB7sEQAGSzBPeACNUCXC9FgNeeESLnHtKfoy3) anchor build -p m_ext -- --features scaled-ui --no-default-features diff --git a/programs/ext_swap/src/instructions/unwrap_asset.rs b/programs/ext_swap/src/instructions/unwrap_asset.rs index 2b9c963..6a32557 100644 --- a/programs/ext_swap/src/instructions/unwrap_asset.rs +++ b/programs/ext_swap/src/instructions/unwrap_asset.rs @@ -215,12 +215,12 @@ impl<'info> UnwrapAsset<'info> { ctx.accounts.swap_m_account.reload()?; let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; - // 3. Call JMI unwrap_asset (signed by replace_authority_pda) + // 3. Call JMI unwrap_asset (swap_global signs for token transfer, replace_authority for authorization) m_ext::cpi::unwrap_asset( CpiContext::new_with_signer( ctx.accounts.jmi_ext_program.to_account_info(), ExtUnwrapAsset { - token_authority: ctx.accounts.fallback_replace_authority.to_account_info(), + token_authority: ctx.accounts.swap_global.to_account_info(), replace_authority: Some(replace_authority), m_mint: ctx.accounts.m_mint.to_account_info(), asset_mint: ctx.accounts.asset_mint.to_account_info(), @@ -234,10 +234,13 @@ impl<'info> UnwrapAsset<'info> { m_token_program: ctx.accounts.m_token_program.to_account_info(), asset_token_program: ctx.accounts.asset_token_program.to_account_info(), }, - &[&[ - REPLACE_AUTHORITY_SEED, - &[ctx.bumps.fallback_replace_authority], - ]], + &[ + &[ + REPLACE_AUTHORITY_SEED, + &[ctx.bumps.fallback_replace_authority], + ], + &[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]], + ], ), m_amount, )?; diff --git a/programs/ext_swap/src/instructions/wrap_asset.rs b/programs/ext_swap/src/instructions/wrap_asset.rs index d619ef5..f06865f 100644 --- a/programs/ext_swap/src/instructions/wrap_asset.rs +++ b/programs/ext_swap/src/instructions/wrap_asset.rs @@ -154,7 +154,10 @@ impl<'info> WrapAsset<'info> { asset_token_program: ctx.accounts.asset_token_program.to_account_info(), ext_token_program: ctx.accounts.to_token_program.to_account_info(), }, - &[&[REPLACE_AUTHORITY_SEED, &[ctx.bumps.fallback_replace_authority]]], + &[&[ + REPLACE_AUTHORITY_SEED, + &[ctx.bumps.fallback_replace_authority], + ]], ), amount, ) diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index 485f22d302959a8b44d94712dabcca208d7cbc30..532eeb417dce80be838ca37da334fa2ee9f5a30f 100755 GIT binary patch delta 112962 zcmce<3tW^%7dX7nJb>f{5n;hq5WJwGBHjpZh?YpENT!G;gg3-e#57{tUKY)eOc8s` zgO`v6Lo7pzWYG*L3rQ2nj4X@jrgkIWE@o-?ow+=_4~tgs|Nnj8{*>9dojK>snKNf* z&dlb$=#yLPo9olPpogrZp9uC>r)x;;ux;>Y^R;a*EI|!*?mS<@fadrpJl`>ldVrTx zLv1}L%yR#U*K-WhSMz!z?1v?J0>OY*No?U2HK8I)^N8nuB|%CelU$XYO_8LvSaBm& z7wU6h-5c=d7rh{K{S_&DoyA)5G8*zVOTCEqF9 zR(tD7CEB@`q@7gsF8SnxljRjIE)tn^QmN{YPx4PH39e}b%QU(cvnu90;>nfcO4A+x zzQMbyl;AsfgS7UUx|}aY|Og$HbD^hm_Jjf#jP)r3zyg_9(%9zfyMgUMNK=*LzR$FS~j3rWGZzx|2>v z1!RArPG>Btyh#PfSXg!w&Y7jV<9u*%3@q*7PgAr0II_!RXl5m7dikI4n`nCA(-DJA zhRe3}FZN}l03yUGr6W6}YBzT)XKyvKppM95Ist z=GQqH;M||Y9manmyLOFZB<6~0dCIuHLxa5tVVYnra{n4OGl%rz=wh>Vjcw8Wxg4TL z%6j-TP;<7KB13i#=6Q-{v!5)-yoz6?*08G=8Z^E&Wa=! zX$R*PwRA#S9U9<{Q^mI zsnXalO%B`XqRi~?MF#9vT7yO@yZX-}-|bdf`bUy3yOq$uVENrV7iHA|FXFUY$q39M zwHC!?K$4t}%8aIdwM)qw5K2DXrBq??;V$JW2KBp?;DMp!#4aTXgPL7RJ_bj2DUBGs zx=V2z6im9!P{J{|r=yZGsF6(AtwaU|lA)zaN>G~YBT!nq3sK4ygQRVG6n?~8SULxvg=7o0MP zVYQBP)?_GS`RxZ67b8rc;4r$*+bXmjUG~wa9bJ%E?c~$9dLM7D15Q$Ov{P{(xSNWx zT^@UeZ5u%Iv_mc9Wh_%7NU+#6g7SU9o%da1c$k8&uuwZ-7!(vt`ssj@eMPkR$5Ps& z4GOF0MS8Px#=;tVY60ZU!B_x(~+NIQnl#+zE zm9*i3WZv6K{_tZcT(ijOy-aPpqST_=PB_Ta_Q)knZGZm~Q`=AMWorA8olI^2F}$3F z?`4yOaVMK3&b-7XiQ`dhl9>Mzn;Rm;9!P*U#YY#&?}o4xRXE7B3lqn{#&Iq zEeIvwRVn)T9CE%&DUPooUsaVSB)E{E$9CB9p_BD!#GTG+ItM)cUM!3kX}{FjwNZNOI5ks(qf6+TdGtfWy!sFxF{2sd3j_z;C9z5O42gFARjHu zu}y!`W`RTTv9FYuE~}8p`Zuu6&C1Wq4P@mTw7drsZqkHVm@v~cTK2$%RaNp(iXrT!U#ysNrb_NFFUBHWpXe`-!i3({ z@)Vh1g82zAk3TGlh7s-N(chtkHdqJ$NHszykUV#2Wh^p_`N!o(U(D5j7w z;b~0RN)zfa;S45}V#4P%!4(sFXH1a4!0^EgFON)zHa*KB6_Zy63l>Hgb z+O5$N3E!^hx8;+}9HnAgDCxUhY1w8_nm3OkJuqWSO6Sece=ByrF1p{-|5b9g^y~ck z1ouHS!851JlS<7N&(59Zci%}9KDp_>L22I7tFu#%={!xi@a?sEifhgS@{^(@<;2d` zg3=nwT8LUhSqoTeD7S%+hB67tQNp)|lGBQkwl$g@SIYHUkg}b$)kbn|3(fR?Orf)! zZDto!V|ls!>>!CK`;}lNm~7c!o}dIv=t$uF$kjV(UB@wqBay?N~sEMyr?3Q@MVu zhq_n|bJq;*TP;?@_9F&a+_*As%w)5|gk=MC@I*)1rw^T}Y11#F@on6n-AcQ{cp#I7 z&bkE{Q=;EUQa-gt=o>WHnhe)i5z|9T$EqNoifmf@vZ&oGYLC|`<0}UC*qx@+t+rfY ziE|`>1c`+U18(Y+85Q2WH>1KZ9^koNcSvkfa@O@?rA&{fD&-Xeq~6Mfis9tm*AzEv zFUd_AY#npw+lOh3HKL`?9O!->w@VIiX*5sT_34CttQRT(gU2IEtnsGG|}OF9cptA*XOjn{dO2RbW)q;qX`08j88@CU=Q zdIOJBn=(#PVvmH&F=$xBk<-$T%F?4Cr7M3Oo!Hy3gU;qhIBEM!SX0$KcvWXzh4R4b zA9p*b=^NUeG0M=xGx=`A;Tax|xgH&r*6M%1S1_#@WuRCN+J#E3asoNKu{^X2CnQIx zKe;Huhs7qv;Ti2vdPVuGy0)SQ^+}}4l_kU`3 zD{uDTaesM{AlG}N;`Vk@yJn;QzS)ldQ?rv_P;%ZWwl#S&OG&F8XYN;nf`MWlaGr%; z5*xd^YERzx#{OK~i~-o;_*sV8bg#g8H;dxx^*`)ObqtTwHLXAXH%{eoV;m3T)7{t? z<5U4Jj)&&>bW}I^F;3+T7~^;tpUw+d`6^jwj1t;q4iDp>V)(M9e=}VVu^kN5Tpg&j zMUni02{WxvNpjZx$>Lrz-vKZNFgSPXjQxbV^5i6Gmq>N3e9ML6Kqa1zJ)@<856Hqg z7CP$+mECm)cZb38q4L=YJ~(F9NBcQs0>bfPXi>x#D5p*ykQEe#LudL+mCExcy@w@c z(U!RCF&1();;h4!8Gd?;zM=Ld9r6=KEkX=>$Qy86pE(iFM&z)%8QvIY<>?=a{an`S zJ<6%m0rC~}>|jexz!f%KmR)m5 z_j?)q>Yen;vG?6QhF75WrJ^R-?e&V%^nM`e|El70HjsRaYmBpjaxzjf_pF`oG~VHZ z(ei5;PW)gF?K{|dgv?+Gmp=ISr1im##dF0n+3lkIer^gmut5p`Fx2o1Zo*abfz)Ob z?ffAn=fhy~Sea7wVH2x#2#J4mLwQqUtSiZTv^@0lKv$xyEl;?V;X*!ITi*0znhW`T ztrGidD=FWt#Qs)Fp5I;Wa+NM&aM$Mde6nzN`NiME3F)z03H&pMbl6>9@h7e}{DTz&tQL$={&P-_k`;|>u9D|eM=-E_kxz^=nPBn$`bqKj8Q>)Voatpnpl^&Qfq z|5_*$_CQKUsg(TqAMooWrOChVb^+)lO^|=t;{qRbl19tR@JrXu_+`)YE-GvqB;^5$iPfARuU^^`*8CotisS(s3B!Rpov8z8U_V*RvrS6zS|eo_@V zZL-GpmeM3U)czOXqQ6u@Hkcqk0QoUs9W(}LtKR&?s_!EuX{wz01a|brD#0debUz6X zT5Kq8`~({NW6s6LtvP{`pF~zAOmW9=I=TpX+|@y5pxI0UKd`8Zr0B2}<1+dC9t zrf!9nyNMro221Ybc{2nCV>MfcKKijWDVPFWV}`V0+MIhohKgYb@PN^p7D7u5H(RrY zQ#v}Dp=tycwaL+!=b?23l03<1tr#gqN<_C7T1QDaq$~q+Mr%uEpNIOYYgGf(!@_!wj1wjXDo0VNxp@l>sSZu)xp^C>|pfll6rVJr;TP zL?L9*Fs%?u$Ks$!E(E`Eh(j#K$6 z#7@NVb=PCiGEoX7BR4_DBq5SpS9i>AGhG84IfelO(DM9oyU7fK^hVSI2A!edZBSocD4 zj1*0bmmvH;R8)rhq&~#&9F0Vhx3CaReDOZXKwjJcwfA8S-$x;M7SeSVxyH2FFXteQ zCfIbtcjusrCfIbt7w5p`eoVN8RhS|@f6f|xzmy}%?jO6blaQsG;OcB-LGk0zGzX>6 zHmWnufnO|2&8KUvO|i&4av&e{^Q1@*|F6(`6{|UFrsZcr$~=^8A9#MA)SJAV1y%Eq zu9hdQZu9BT_}vKkvygQ*?SAG1*zo{DyljN}2eeJrd;o3>qy+Ne8fyxM5-GtF@!ArZ zA6VTIq$-IdW6pyJW1$gT60wABE*bLyL?)t8=B=@|CQ=xBBP1+BRcjNzOJ|{R5mwb1 z!EG^CwPl9o&{;1)Gk_!wO50MOPmIwi~(P>q>P6t;c($6kWQ?c=7SmlLBtUHpajv1P6EnZG_j7vH+J%rG0g4Far z_&to2OnAiF_%LPUjTPXx5+&>4V^F$MTXMtu(6SOsezh8kQ>1z}t30+!>Q9dnVDBpF zDH6010#i{K=RO9psaVw}Lc`vN9jVA2TdV%>TisUUh$Oy`LEt0WqQ5mj(j(Z)?A746 z1|@&iZm3^_@o~E$Yb~NRXgBB|#n5{P-R4BSDUR@jW~WN($+iwBlRaFXbmKorNDMZ?Gtcoqc$F()GW1-?=r0UnJ9=J zn;jMsC2QJlA+;-z_$cJ8m;U|Yf94jrxLzuj|H5f(>yy$1@=*%ZKZ(2;u*#aXLCSI> z@sC*Do|a+>BWu|+((@A8nrd~~f*V<^d*+lcfMsYlaL3d*X`~;Imf)fK`FcEDJU*MPCtkf zUkNIwCoe$g0WHVfPD1_xluMhEA}68s0M0t5?U3~%>ZBc5^F^u2u1Ra(wKlyZxe>B& z6|}sJ1I1SLiFYBm6dQeR6(p5nhOJvyz6-^rI0#&g&{&EJ-LxFS4`Dd>JQUOL1}c~` z)cy@7h%G|^M@^7ZCWT8Q;B*;k)>0F+lu5BtU+a`tq-7FGGePOA*v(5!5MGX8n?8b+ za-3m4`3Q2#(cbVk@;R4y%J5l{ow- zCxgoo$H&jxG$5h-6Hf3Ae^ z*R>d&Jpmc7qy0WC*&2CF%FvjtStp?B4IH!IEQ1|Y$nETvP+z63ns@@-s?py1aGSNF znkwK0X!X@#|Exos?jxxuEPPWMY46?6C!q9Alqn$xdZ`xlZ=nRGZ-e}|a4>I2I}hWG zYv$v~wb!12#^cy&PsxucM<3y?A3q|U0@{`d!RuuM zBsNREq^IFO%@P`w@J_R|im_{X+7R2EySlq*Y{J4g`LQx|d45 z`Ah7-|Kc$I5~benA#nLh%loUxt&v~RIrNw1knpuO=hSh?{~D!n;1X-nH&mn!EQivI z+7j!IL(4_%of+Ri@g;4>qT_J!5(?i}TOjx{hMUeo${-R+mMw>>%QzT=_KF4K_~YOf zL~5mY`0QJ0m>h?T_^#if(Qh~oeuGJpGyt}ICrz|lOyoE;4JH}ni7k*YgrtzxH=%wA z(X6dMehY$szzKiG7HIkb`_%UwME|H&o+WQVDK0}u-!0bQ7Mxy)&vB>^K@c`eX&!>O zf?}~E8FGfBEoif^?|uvFhm%s0_$FkGz#0UppbK)TFMRf2X+O!^3>hOyFnM+}l#V2k z(s20eXGGp+uKfC@HF^}OkjT`{e0@F%E70}%xXn=YEh@v$Yar)0RP3Gzcx!j!MJ#VZ z%WtUAdvE6J^B!2?DozO(KA`LKNRn9tZei#SxnUX9hY^i&{lJ^xcMV6S&A6WRrZr&< z!6n`FWsox#sj|(p{g8!YNhueVabym;k_JtGB38c3!0o!WSAWA}{_8jh-IiH1#v^^? zn-P7i#Er;zSTrGEAyomvAa5u}2gNqjDtgpx;+AYl^X zW1D!U)mZZ3tq0eJCMTlAZ`ncM-9ImJ!|4kJ1%%F!^&S_)Wp$w(dGx zZB3X$&}?m33MrA=oRVr>-XPmt5+P+O!lEnuVI2_G1CK&R6vE103Z+q4!zL4n)z+3M zgyocg+r-e2iUis6LaQNs8baItptW@xI;E1Hh)E|T&2uS4Pe&-KoRA-?AZI#hB|j{& z=FA{25;?WRn%{+lN@U*>sGo^NZL;!26}ZJ9mo6k&>$_5J?3xE|vq%n^wuG-xY$f|t zLDMWOxh?_nJxDF_SON*N5tL1czIy}mXCpfD622_7)x7YA)z1?L8L3|k8L?R6#A2xO zBE_UvHYCi&QPw#dn&u)qT(ZF}4ntiwgva5i`*|aj#vv}v8zFoirhl>#S5+9E+i1<7 zN8Ds`X#tcjAc5qgRnXKE3;w(SQhK3$+HAu&YoIiqB-nfX$T0}^B|FFq3!o|iYoa~U z;!Be3V!G`Zr1+5pQoI1_{csSbEa0pEgjJBAh)oz5K=49jLjbmAQnsZJnMtB?Vcds=li%+FzrILub0g&RC0XS8 zjiB#`oH9HO(fufA7C=TnRBQ)6v)1+_jS}hf3FHToS|)|d29V##&yCiEfhalB!?1D? znM$G-wpD?WFLVhaCrJ2v(DW^i*o8Ru+3NTDQKkZk>ru%04t1t&)%ev>t^?zr;yUp2 zBMv(7=uxf%gP-C$u=SLK4t)A3*MUw?2_5*yQ3oA37C}%QI3v-n1FM%IcTNu{hsdNO zTmg(7Y0P2@g2B2?hO4O|8G!5UNr_S(Qz zU`-`gfiqOl>yL01sN29*;Ga)&6?p6vSAh#Fxe8qRpo0n=f26Gnltx)d!9f8wR&oXSQ-V-{wFwRiFdwm@3h;WIP=Mn zERHF_`xDwKKxwe``AK9dYS)kL`j1J(pH>JaDB|^%<72q!q za0O@+p;L#s0{r>`2L*WSuuy=99^eYFY#|1xt0_@kLCz)NPX0KYJE1^9uPE5J7~ zP8HwlX08Aan}q_bo6QwqP3OovmyngDb`lgXL6vx@9`s8wTxEu=r6iVI&V;6= zs4~yqZ}m$eICHx;SlyE8vb;5^L5^yi96e_Nu$o9 zPge7Z>FTL*y8<0Qq)uCP{XDZBY7Ta+=~&>$b6B&izSqCr(dfS#k7tvl4fMFU??gm@ zv4N9E$r*)l)gy>5Sy%0)=j9XJUY><)Dimk(7Uj<~k4RYzz+L|aK*NNtTNnUw5^XsT zgF8unW<6HMkFj4eu9`6n$YbIE?jEs*R@eQn?h$6A@Q?Wa-#sFN;_Jz-WN--zpb0uJ zxtcl|cx@auMz1h6(P2+xAhb za`1$|CprmWasHtz(ZyO+&}*Q(Lw;nsRgxo8k;on0 zZ%K~onEn($VNv~sqsvM~8X1>B)VQjML#fdWp zaOGs|$CcJHEJcObIEUwZIbCL7j4`6THxGU3WdQtG@jq1_Hf0qf;Cb^fzJt(J<`~|9 z(VK_y9fY!?Q1D}%%eAP{hlla$Tv^duJN}qYUDK!wk6lW*>yDS4LaXam2XGObBMoD5 zV?bLiZ8rYDrly}~4N!H1|IoQRBQ?Ex)qO*<* zLc8g*d*W?o%XpT4``L1ym@QS#@i@AEDMfYN+V$lfTB@mMm1AF?!l}?p$2_ar>5d=H zv=xMQ1xo2W`oBz*7gMm4vzV&5WtSo^^Qb>oPzvK^0XId8@>pn6@6Ci_x8R5Sk20xQ z$5ir4O#C<9#r)I^(^(TjhZR+_CY*JjA$v6-ANf}xCwLEGz=VP;Qr+v`fSwPLg&xNo z23YBAttV)^?4(!-f0+FHBd9qk5FH}>kq)s?@i3{9zY?CAjWcm|DF@0O3h^cum@gF5~JU&~Fmcwe=OWc7kw!&KcDAGipodLD!Xvc1v0WL-i z*Ux}RBgv6tIEbD=TF78BO~=7ZasYGmFl0TByJ_hku?Bm>&qfl&S~Z)9S36{1SqjA_ zvSQL)hKJFgYkwc~iPYXFjZeK_~H@H}%B$Eyr&9rm{N^Z4j(j_)sRzf4sJ2xo>I#{c3Jg;NFReV`%Dv z+WZr~sr%{IHuEoAn8 zyS$@s>M<F@`z5&OTapQYH=M3UX_TLZs4AM_}4aQ}V z0Fr+{BxK;$S~Ff4z0Z%h#XwUA3H5J42i@uyC;&b}sAH{hKcB+z@^LGSGLta>W`|Of z(O2Gflc1!z6*gn30aqMKjYQ!x?!U&hX9-`RIqMo=oS6*ot)ni-nud#6VOKV-7)x|8 zE|ZKI;OKs0%<-ldDvkTYL{5mP zyN}m>o7Vk{m5350B4GDAtlKLS>#pof>&A(k7*RKe*Ii3X>|rI6MF~EuI_sW<-I-*P z_bHZ{E;3U^^>kjn-#V-w)`d2ZElOmH5-Z`}by)o!mYF9qb4BJNUi}=cJ_}{YxW7b{ zC=ey)!u54zE}4!OI~5;Tv7Weke@&MG`|Cu(8c}eH^_lhL70IxF89$0j?I{xGu@P%kbLGJn1G?9s^(hkAP7Qi4fzT}6UVUH|RN?(+ z((N(G+DMv6!cj=d#>1M6cqDN`<7SaqB%U4FWfzu7+}J(k9|U$cUrX zl+AQ6zR3epcA&Rb!4~2qvHj=X+i}D4(jlnI!Chf_A0FZ4V8V!(z-24$Ki}6K^0(q{ zM*gF4bt}my_msnqToUYbS2@m1xo%FLB+oe#l|=d{SqeG!_T z!@ZrNu9Ub6`?mT=r4SAXG~JB?jV8}Ccp0pKIgj{~mr5Z&kAxak|gq87i;t`;zs1ZiiBhAh69kc2T#RpEHxg0 z`aQUFWGnH|0c+&**gNemmVSt5KzngVuMvIzhLw^YP_UQ0P3jULseq)(zhLU;1&I8n z1ZXY5;|X&d6k8C7pQFI75I5t$i-yQTJQ7HagR6yjWSD+W3o8JcWEV z57ID!d^`_!l;Y9LyYoPQ2zM4w#X{sE?CNu|(0B+(!k`%tU51qSPqpTkkx(Z>=0W3Y zDEco?1N~vlcxWCZ9Y$2sBBA9l@w?Zt<-c&rK(}}dg?0&`mmR3dN-xtomcJp&#}uLm z%Q5Vm)C%G$ui&wsP*_18k+U)8ZNUH|M!OIs3p{LhJ!~*g!~4w{->j40y#DXf?r25 zy0QRJZJKw z@)7(p;0-c`?);~`L1NpXSiT$@-#`*Z#(`VaE%2Ukxc{{6A5H{FkQCRX`sY_$KirqxV7h zn`l4VM$$hqFKjUczJ(g=Eb?gXTO^(=J`5Fakw((19&(POmhf8zSC5m6^fnHZ zl^o6=qL9sj;L2&2fve8G3r%F zI7xQ2)tzhYy7R^T;C2f4(QPN$`-`jzr$~;}Zn_)y0JOe`gL%U}*0j?&$lEEzlZjAq z20`U1F4mvUkkOL#4y=5a424VkUx%m>KNA@4x&Ib=ttm5_4|HIwlOxP3?> zo&G$DGh$*R@wcXbNJbI4SCNbL&_`r~qLsJWw8 z(5EE-wme9F0sKA_tyT9&XBP{kd`4pBIJ}>N?Ck-~pOL$rwhl(LT|Y&%-+LIcny|;i zjzVn{iM}n|z!xC+a{>3vB?dR+b8;_yaf0;dnfWIb4LXjai`uGMANcEY;u}4MiH>oh z?h5^)9*dX^>8v8PB&ZFx#!$`Trd@SB+*HFt?Nz$!Kd~!P1Bs_c@?U5=7csy(dRedL zPiVP7yzlbE21?TZVht6i^6)@13n_-0Po{5=$tnh;&cvyL8VXN5jQd@i znmI}jofjxJuyAz=M_CJ@1R+!x@^64i_AYRWjrQM5IVitE5^Y@AN2NeGXbf{~Q}xdK==4=tI0!ogaU z`7#l=BLltWqwi!3JQFYVmc9ei1v02xl7kd^z~KvIrc(pbL8UfG>J1}5CBr?sV9%&# z=o-U9Tw+mS9=qc+;&fXqhn78g%R3xf{@@|rGG*ew zZ5j2wZD_KVN3fPh!keFyfS&2UQdpGHn;mfAV`%zhny)jq8$+qAqG?kl4|kQZP%9sa zR6aB#rR-NaQuIErc+sv(6eK=b)u+lp~I?P!!z`od;2CL*gmCv~RSya*_*mJZv{4@)%5GaV`rX@k=u8Zw5rs zTs9ywu_^6<_yLulu_Rl7%H*LX{Z~F9N<`d_igrMd@9-_J&q-jHy5A@}sC4Y(lT{CJ zZ6-mZYFN5ylj~KQZ`!3}p_aX_*V}f!?kekiZzElem-w)KA!D&S4-dG4(o6=K2VQO4 z_x=ck_I)#+TTqr8Sl|2eMj!GKjk~iD*~;Sve-6~bkun*0V_M|gu^p3vH*R{|m6gYQ zx*d(@IY{jleELJHODQ$RB2G2yd%9UseC0P-@dfdp-Rw}Bg4g!?4G-GunWERZLN&JQ z^~;Q>#^PocLdbk+5xn{ZUR=ZepWV)w=*fG%0h`wL`V!Xb=LM(+9$M;tgC{;9y}OC1 z9TVE=X}p!x6J#~K`#I?=AH}Zz>2tD$y!RDkG~?vIemOKXg6WHlHKrhdmjC=u=+Qc@Zc3Rq@16Jv@2+p zdEEt9uiy%_1vA*y%OCexL;p)+CGzED$oUy_Y%q@Qf%>0uaob}8Wc`ARhGUbV>KAQ+ z?R%`PzaSRmp~(<^Rhu(;k2U8i1$yUXxcEEf*zoAO2Li7luz`~y;TmSx@X+nC=3m2Z zBK^lf>z`;W+3C%!)f?#v~2LiAw)^+ z>k2V9$q;fk0=bDK*fuhH?Y36kBpG;#VJU=5axh6nhf+!QBP*6d4vpW4fGP>kF>E!? z?SfWGt{@}FK?RXB$ms|Om9c;g;TLv6nk-{SM?kGCCy~0BAlL~Z4VnfCP8i=a7HXa3 zPAm3STzXCj&04^?aI9V|kB3LdoD=5ZOUaAuW5L zq5~G(yF`ihGJw0QJj%oC0IGy-OusNqrc8%eS2@_J3#LQjB&ioEoDRjVawPfs9&3xM zoFLiZp4bUV9c8>2FcI=QY8$NF2~8d41af+eHN2CIGGm#@xnx7hxDy&X%V}iOM2PO9 z<<6p=kkbWQ`)V;X((wHk!Osl~nsDFC4OfblZgM~JEsI>WGhM$ETDr;_spzs3LftXJ zcA?N|CyEE+>N^oC+_6DhfBlvRSKZ}Waw8n7x@j}c9?hhqA3?mpnR@dx612UJomNA@0h-ZLVZR7_|5xvYo>DAhi|$3anW@ zWH%?WZUUFbC(x;@+E@0%O(bihuZ+IZmrE#%@q$Ee`7JVT0@U_KM7rQEY1cq3<^ka5 zk77G;0wnk&8*jHJ1X<;jh(5G(EBP9|NQYv7FCGV3 z!E$N4lh4y*pekDC8&X|o$}`#(cxoKpq?P~uj?~)w`O#<~)(erF*sjRT;qnCX-%(ss zbw$n%yAOH)$#%SbAg8t4`{_3iVn@gq+f8?mOsD6df#jXBkTz0&7E&YeRkP+`xksNq ze59+BJXMrqQhzU|slP{T_V&GNK73zA4BZ?yg9bRz?(KML{P|e=@=BY>t<3-QxK%x# zI%tibGSuAEWH^F047Fu45vI*$LA=#sa(JfF{tV3sMw$A+rpXWn7ak_YzAl)&*x<^J zH0aW3AjVC?{f(NBJ&?zY>C*+%Ct(6RkRH9APY?cPXLgiI{Z{Va@6}>G`d+P<)Pd!w z9zm=7AlCSCd`nY(YX={SWuNDGz|2?2Rpj^gB2(}Tm3{&{^d!<0#N7wz*&@1wvO4sSDTpJn#_$t6(4#EIBFN&J$t*$J!SvZ5 ze3XcwGAZG~(tEl=`tl$LKPErq!P_iPrIisgC+oQm%or zC0hU#+ea2IqKE+BU{Hsd!Cl1DMfrj45OCz&$u^uDtqwXI4EXsw)G08xW>l*H~z0o!GCiv5s$n*jdN7MzpM>yMlkiI$e)8oQva} zFxyy{C|IMij&B1RZLAZUlj@_D2ELV~MZl4D-xg7UZ!26zA%s3c8$jFv$wTp&;L#~g z@Jl_&a$n2%6({(WcohyFKsWvdrpZl)63(}vG9HetWT6(F%G>bc6)sA;pBB(f{%?gO z@O`1xmhVKIZ}Y9Td@tgBqidnr@`Fey;2kF3Ak{YP$cK`@;e(gNk6ulNY(Y@EASjoI zyYg75!XM3CtQ{1ej%p|68Y!YSRXm#O#Woy6ik#Vt z)D9D);DCA!*WH_uoGnPsy$TEPF(EU@Kz-d24~hioQ9K-*?7)INL4nGF0v5M(poGQk z9LQyHI|sIl`ho*yL*hTOU?}P}I}11m7K(>3?K1>db6Oe56C8+hkO4Y}Qxo9|!tIP& zLvW;^4M&VcoN{L!a}mT{@)*t$Lr6P>YjA(r6conOH8Vm875*{U8h+@^P=FzAI0=Wd z7SSa)H0scdGvzrkmGl!860rj6Th_p0L*flgMuaK_D|y5CGZ8GV1?)JyZ|43pC&6bF z@eC;uyi0Z9T@QiLTeMFsC4zNjoORu}FsZCVQx#tNMG7ZHi7bTGzv5By)3*`+z2DqkWD{?ie?F6m! zqTMi5Q=!bE0<|q^zeOQH+HYO)GV@5{7vtDHcR2K?Bimp88@3~peuF*Hl7FX4!E*H? zqInhLai!pK4GW!h8A3<7b8*w4ABSh#rXU}l?jVMyv92s#D~3Nl&{hm@(6e!SJ##xT zyo43-NSFayY`7*mfCDxeVnm!HU^4I{=)V)kxwqhp7hZ3{zCx8|_QwF_e5{~IL#ZQ! zqyH8VhhwyGI7V*5>x{OaW8o_@qwVKdgc;Ch9XDM~25u7?*E4)@G0s(x(J~O8`CS@g z&J%|EMO+6^F`0#@kf>I;y;oSkLTBBic5_svFsQdXjIr+64uvy__rHKsBjAKN!s)Cl z5rEXkEGGK%(J5+{iJHS$P4$O*jQcoQ@sqz4>DVNGjQc`h_ZZS!3WL|j5MQ%tEbnlm zIFVc3Z4fKxC3WNFg+LfRSQKw7at7n(5*yj-yyY8YJ%y$0DhL=MNXgksjmHg*-J1V!sWg#Ab@#OlP5%*ksZD zsyW*AO-5|8sE`T|T$g(IXA7vRlzu{?TCzo<+&^HCw=~p@+KA%qtgB<4ryB8#4cA3H zfQ2~vS-4uL-!4yHgZnIEFblyE>^B7o z!4chL3KHW{2%Jq|#C2ug5qt}V$_w^{&WntqB(<4w;~ZH03S)61XNF&4Tss~|Iq=y0 zG*dY-f_+guwB#}Fsjf;!Pcan4W|7g83zTV^pvY5bm}!C{KBDOARB(rL83jwk`Q{J` zo>?UDJzG@1BF=Y}OoliX*GfqkQlR~fC#plKmbn;0qGhuQSh`T>W)!8)%-5t)xn(lYXHe=znt2ESdu7FDh@S=?k0hLMGflF86pl;a{~G7J#$Y_1Y+Yv_y-Iz=6k?JS)u4jnH>W}y%C z^us4H0y7VhRy)E@E0)twciX6Vq}ORxvZ(z#I2?R4FK^ zVWG3`l+aeZL1Q7GI^#XgiB94T8w>fMi1&D(rBfNFA57=vio)R3RD3-1R>mCKT}UaH z20AM7#WYr#{y~k5nx3|9d2(T}jYgjpx;W2?TXO_vZOvFQY_m~W;ctT++7xDkmhPSIS ze|Y^K^s&u$Aba*`{&u{L>>*4#GX>e{JlrQ*zrA$wzW+zz{|{VR@>T)xAUW*Ev)XM~MnCg4#h2Qu-vL z&Mu{yEZ$y9_i`?@TO)u-SEY2Lh==fQF&Vb`dFp!7)1eX8T(#+Xtm*#B71zZFOVas)t<~&iLy)^qE=5}3c zmu4R(%|3zve-=9HE{Po--e7xa&K2Dea64Vg5iz2!eE_9>Q3JE-S9_?oz9-YF#v)-4 zjqqV{+)3qxjS!QPy8auXT3TE_j3Zca`+iK(`RnlMz37DQD*CfYETH$&{f8l& zZ!_w&V(;^N+g*k{CI|k)QuSe>w!ABrr^CcygL%1*5<;z`R5ol}1ps#z;@XO{Rm@zt zjltLw-}f8APR>oVXhk~TpRrr6f<61LT!$Z~6W?*`9r(81fp6;___p58HyA%$3Y&RN z(EW|zS1RMzHG#HH@as8_cDv0I{+^C@v*dgHK|9>p=rmCByK9|5PPH@~ciGlC7#bSn zD4IBx{l<~JEReh;ketboyeyEsB6z#@{{YF}<`7m({V8DF*c0(G-Xj)&5ib#O9}zF$ z@ggyA*#!7JPqzthgNUmgQ77V}BS=sU^z17QGM^VTelBPn$ON!i(0HDOS^=yR0(iS! zdL7eC4WfP>55=!5+iX7zrxN$))J+9Wrn=rRir-wf+kQ0+eY-;9}|`?FiuTjGZ(QEAz~j35vw1GjTDs$ zMwhTq+e3N(AY#Q^=+svr>gVy$w!#vs%EFPU*jN|^&-6nrhbLSZ^x&Ok z-x}vjM584c2G1q|}tX;39i+ZX(axbfwF6w29da0bL?dI1Xxg>hHbNz&NCS3PoYlohCM2h;3 z(4CoAkXUMS6wKA>mRqxO!@{9 z=Lgi7j~ieVIW&NL$RH1T3axEy{#^PbE?#OC=~05B+4#^frkgj5^nM~enjsg$HW5vF z{@S8?2y4<)KS|n{4-;{dp1OY0IN!lD>CcOJy2$75!FcW?;&mebnuyn!MM4BiSff8G z;)$X_fruxIc%F#!#g0jzE8=mY{w5L66y;MzJVwNmMVy;ZCcQaPB>1xei}i`v>x`YE zLW5v$h=^B;_&^b-{=2k1-~UGm72R`QKCVeG z-hWgtEb1@Q_OL;B(M8Q7?!)4X^`DBkzlc-OrseYl0u3Twz~W05>)#UzH7sF`o;#nT z)g$63MSg>bzboREEN;?sy9O@>h`7)jmJ$|s)?N4mZahHB$l@XV4d(kN@;8`MhO~Wy znM}an3{fAUr$413ZRT$<2MpnFFn62i@CI|2&HN4KK128$%-;>>Z!mun&fj4EZ7_d> z`531A<8v|x@wO0sgZac@hc}p?e}=umY;agv*%nsHGwexb!|mp+r=OuOH1{#%6=A-X z4CGAE&Xvu$%~-vN@s24@myhWj+sw+(kvcIigz9BHzXMuJwBNM#*^^z5*z2$9L3doP zu=-vSYcCQn%j&rLwp?Qw&N?Pdn0}cfR>%=Fsf#qRx%?c5i~E)0XT)bMD5mJC;8iCH zA65>JQ5ZBI3f%pLb2O2PWpy6?hVPzv^kShFeSDuRX(>La(`zpK(eY07N5_4hi$lpQ zsS&8&!73R`uC>CArNl=$Sm`=Eb1*GY$&nX7w`+I85}U9KudqQol;Q)v9};h6$T3&X zI)^(0n_t8$0nO_qc4>h99DKVX(JwpP8W{Lbw+6Cs5n)`Ij8{SKl}3XxiF9-0mjvkC zhz9pfCFYGK(o^)Bz&&e_KJB#^oR)EamvF1@R1p3 z(gkNy1rIZC!jJ&j7Y6+#^;i_g5>3+*dFaof&ygi26=-}iSy6vD%XS+<2q}FQ;yj{d zKUR+6jd^lFrfKMLKV%usAr5yB=KBa4jN^wz~%%MZBXbvjR_X*sop!F^M|~ zS{Bg3fN-u*imH7Va>A%TBfa=yW#xV<*aZwVyCmJs3K$C$ zTa_V^<2}`ZN_mit!euOqX@!HoNaN?MUdZ*Kc4bw9{j5HlPUl`6y|!o5=?$7T8~Wn; z^fiVO#wB`EK;W+zQE1;j;^*nZNzzc1>kRb+@RkK#&Z(4DYx2Vw#ex-@^f&~J(#7E| z792uk=!Bf8Kz!yaF5zVrAK&f6ej-xy@E(dyOx*JmW%8yvkMIo z2$RB6FEqFZGFaRN0#|r{z>vWtbZIu5HnlzENY}`x>6L{D#ud8+t5+7pAT8vrYvJVL z^?!&XG?Y zZ^hclK}>$za>ytoPTa83 zL2@wZ*QreKO7)&_e~s~q+k(cz%HQBvFbOofvL;PI?mWDOk7by{odi{S)OF@C*;?4?aneRyZfZ~B=w=~z3C@P}&EQUo1!cD2N$VzuQV7P8^Y?ZP zS5mcr=u<0H;i*5Z;y#y=+$>1G{2RNIa2LnGSvQn+B|aB)p7*JtvK?mhi5XK6e?Ca7 z>SAE!&yqK(zaLs=;!T`iaU!C2KtBXWHDBHRRP%9giw!k=FJzMs3yl^I4ySe&*W&Le zn#aX&+2Qk{O2->f4+BGo;sIInYL;e!rzH#o4oM6g`t z>pX|@2iug#1&$+Q?{}!+$k^XEY6q-MPGNVn6wryjcSHx}TX@Hc{;1-jql|xiJHuGW zw=wYMsF1+)cI2lc`KF*up02SsVvsD;*i@EI#il@rP1yYq{Dj!W=l`hmBD)((qnyTOs_U)jXLXMHp`89e*-0)I22Lze{tag7{10@`^C_Gthy zIJm{i5I6Q!N7CP(tqXQoPQm5_5eW<#ehKXXm+D*3p!Un$G9fXGw4m96I zdh}8ErSV!fMZ5jAff#;mAdX!dSfF;idP;A<77)if)^_|RX7+%#>@Wp!L9ky7P}vg4 z4}{^pha}gjDqEH@w&(;~xC5%QZVkm$XS?wr769=h9FMGHfE`)K(IabLSJfX9LSB|V zCls({UNYkx&7oTYCPN~N(@lc5p8jzx9Z!&%S{I)F=eFX*Gt*sN;a7v?-oYcB?h{2& z_plzYAQB(jni$M~d``95%-*c`ny)eJ3oo|X<_yT6E+1=vvL|i?V%oTC< z_%d6>n+0N-+}s#N$w5MGUh%0s-{uw1Q6*nQJ*Ni>N)hz^iWYlu{fM zc;{l04i2VD{sdn=uTRzVt3Ow!d4j>YqF=AE_NlUj*@;r<9ULrGiPM zMb`$;d!xWudmbznBPZ!*C51K?~ov zNAD+LNC@w>Le7!)j^~1Pw{<)htp5Mr@tiL!>AfuGcs|+`l*l_TfOS4Zv=`cAeqnQE2(8vzC@!%}goDjPwnip6aPKB6qw7;0+_ z+?P#TFAis*tpTKqKka{NN1(0J#s|I61gcQuxDPsX?nGQ|PSi75m!}I+NoAoHb|QL; zQQJpLzSaSK0F!`3Q9oIT+Wkz_7FrgtaIs;Wi1QzET5Jg8M69-?vkbcf`dk)An}&tB zry|0cB3%qJ!$cA1qGU2m74a*)|Aa!l{ggUfsK0h|YMg@rh&i<|j5$KW<}MoE^<}(^ z6ST*)<6Xo*@a}pRGde~62p;Ye7}%U5h2pk3pvQ!8ftb|R957B&WmYuz$+Zz}{BZ@bo>;{JF&#M|3sy}ZG?{vFA zZ-Wp^AJ)mL60zSLy|p+S0~};R_2;GUj%nHR3S*C}pjO91EqksAFBltpo@SzZ?RN?v z@15{)pTP3=qWdo;R~_|Sb>dmPkmO{c3T^(psUjgy6yUm2i+M9*ek)186iBDYWFdo>QcLi-lQ6k;Zc~|gaUkr2J4IClj&x+Mykf{Hx zP=7&!H_zI6!`xwE`fTDlRdqy~$aqpCcv2^L!XF{|A67r#&maTF3WVA%R~_`R1|c>| zaMz6c>6Qs+C)H2akKtA(aH|x!1#wYS7nQ0Z{kJQ#-sapJv@N@zZnlV*aly6xKdgNV zd{o8t|J{3cW5fp`7}$i@0s;{Qf(k@b2)>9fh_yhBA_)jAu|h%sv#fQ4&(xpAXsS0- zl_UtncdU<%t&(V~#1};CBR+{*YqVAJYpbL_$p3rh%TVRlHYl;19~RK7Z=>%KD3PVJ`->FzsL|JCf+ z?(1pbtCKaZ;d|oLt<-Pg)U9mr1}<}AHz0B7R*iRUqAZvZ%TCN?Qxh%p2pM0dPVsW( z)C|kpHL4EcH6{wL!ROH;jn%TL{vTqx*b$!Z>1|3sXTibYc#R= z4@<19t5{;GaWyjj=w^yaFT2aFGQER0r|InNRC-wJeL`GF_+I9sv$txB@MVa+OB;_z z18Q%YFdM%Ik~P{l{^T-g*XrQx-SoJBOQme(GI94RxfuL3wN(4PbJq&9P^SfprCG2- z5<^}CD@4t=v8yi>k~E7#iSyiZS7O?eJo#EF?7~}uf`c^k8)K-B1+wIY;vTSWlFi)B zEg+XS2OfOo0xnE{o%me$Xx~6znK%Tyn6;KX1k3yXk;cmZ-RM3_wxJph8mh7Xo9)Xz zxyH_AUV>cl_xt^C^A>96rp@4>d&9bwPek~_rr|9dyLLR9Zx_&MnZ5ANpD z4r2d{h5e_=f(OMtUNRY&DFRSAZ0YO(FTYF*p z%YsggKv$$ujyPLd1byM?o#IYU8R-gGJ9+7db1z1xVLy?a5_30HAJtVGlF2DC`-%T~ z=S!C!)HApKA34y>5UH*DKnEJKq_rsr`XWBlfwS3C!PY+a`@O#4@`G7h!*w*M_R2on z!}r8OS`DhKmH!j(*#)ohuSN(yIK5ki_F7~y@Byv|kH!AKdWI8QLF#I#m(fkKl(&mgdR;(`A@&*}woaz25qB?t zmGq?tYo;QRZ$RVOB3vfUCBu>W*rP{S__NL$@fCwgV_g#k4Qub1>* z?uA$}(}nd5`;L2?IR1ba2IPqKW5rCqFdz$(@WFZf!a$qUu9~NxPugv0liF>U%DL!( zR_T!G)SBlkk*-6g>y+t!!b&}0z&hZCfdYPEpwJaB4A8+2+D20cIetBdb{6=+M#Z4r zLPaGFe4t}V;_xw_Du@m$3vv+T97tayz2Do=k$CHtKS)qAz_{9Kvx=zeT zOZr?8Z6h^D~VGpfkK4{+LCNtto*j*i0kA zDVXhg5?J)u+FRh0M1iZt9v2EM4XI2F6?kz#;wp*h;3!q7SK?TeBy>qarNliFmq}b8 zGYCuEF5)W&Eta@j^5;w3DRG{}yhw!UNL(Z0@nS$O>PIDFPmOnBgo@#1rGOfV>m;Ug zs>I*K0upaBw8?n&CPRzF>P?1biPf77ypJDCzRHlJYA9w6>Q%w$pkj&hMEsJ(n+*99 z7s_~k2$X!2p;*f6rt+e|VTrpWE+ZVXlCLsUN`cgODS;&ubVwW$xMI*t63eHdgVdV} zLCMdX9@vPKm{)OlRa;=JNklJh%_TAJwi$SgL_d(YdxkG#z(uq(FQ-%U>;R7JzB&}Y z|2TcPot6B7$)8;7&Y$T!(Ji{v&UdHJ@@3gGM)Mm96Q{aY&%%!<-JItO4nBJ{D$&SO zvgC99Tiy2-*>~ClWD1{1v2pNF!Cc4lw#3H@SGwnh@MBN!ouj;5hDt z3rF+w=6Swhtd9s=j`tU3{xpiq^~MzOrbPB$tbQNtMEK7Y^id#Gz&y3g_9SLVo1RDiPmW&T`2cKZ*S3SHZ*$QRZ=C}_mwnrvr9)sO$Xy#GClAH3yJz$;TzIVEB zq@y<12LDoU@hmyg)Fip4yT_gZF11k0yjF14NLkgAE2qzLe|frZ#6edk5s|D+CgV9_ zz#1!XYav&%b(*{n;(K&Fk8s|}4xP*K{x(DteY|)}Gfy5Gn=TZAdG=94n~`7ek#Bry z^MG?>rl8mc92k}duQO8ByBwJ)3H_eT@WTq^e!V>KI;cPEw3mt+X)Nq@UrF-?59`4| zPCE>Z_uzxwzvhzIb#+8OdeWRPy`8k%mB=A8R=rh{C{UC8 zUKf6~@wQd|bocO&d}%|9p%--!(R&n=p4igwi^hZkilv_TaUG6*3mhHIy&^i0y-aio zX_MAmVkbj8$kud_dbfd}>RnIuzNuc;TfQ4vTJv3u1V+j^gACsag6O8=hVN8_d7=jg zLKnT>k%N0wS>ixJPX3a@G%3efE+Sez@o0y>sElttTBh?`gRNqOqqCV1$<7slNLB6n zJ>y1=q0A7=QmuI@{MHH82h#c?$K=)i`m+hKXc4zx^qg$g+o2*^fDg^d@e|1{O#enu1=`U4@X799rgzgwg5E2g->VKBxRY64Y{_AjqMny=XEl zP`;-X&FU0me+|{9%b~(NRg44_G2&= zcbr*rzw2jbUans5_ygJilXGEM7~aG^AbvYXZ(7kO{RSbN6j&w_b;v}W-?Ec$Q>ozM==WdKmJ7Bv$=3d@ z_-^ZA_i`{B<;N9OkFN$$rGR6JPYQ;Gvoz0;MFw)hh&-sJ;)9rbd(UJ< zi`XF5*^For4_fLyDf*!v+QN?($w6$Z$lp4TB8o*syRc{y5TcS5Ns}+?kfzViRdB$G z@$@pjkFON>$i3Eg?o}J@P~s3Yytin!kEfDJ%Vk$qs@PG$X<~85>s}J8UEyA-U$raT zBXD^`Sn%QVxy;|lV|InqJEr8SJ;V@`IMNs$F9+{L191KE*-D`RoQ>z=%Z9|ZGvh|i zc-Y7s!I#`6o-VN0*y~||$*1Wk(J0Xwo1_KSf9u}-6JIdL+gz%d$gIDuB9F@F)bN8m zoC@`EAODl@xLE6QkstjWtEgeLl-nt?jWrc5<@SkeV@*a&JGlbeSkuwcE`e3WqWxGQ z$`GRGumZdlszQb2&R$IXrVu%AD(ZaU!m4D&Tkr(L4-KLvdXn{%=YaF>Z}=dO}*$W=no<>kkSdxr1l;*JmV3U>|HB<`(Ef@~dv z!Jj@R;fBWhkBU8r&keS2;23J@@h8Bc^Yp-Ky-%jVL`Mwcw=(w5{O_go4U!M~BA22j zq9pGm$ct^YZT{K5; zD3ETtP}~FJgdIBd$(~-CXH+Ujw)j6sP>bhD0r`Aa)4gN(y*O;sv#QjG>k_>vhgG?) z-TmEz_Q*LM&=l=*Rzq{7u{r1HbH(eBsaLa?U}@sr70m~Kv@|Hpq`br(e~~ZiJTgtS zI~3W*ajlD~Z8(oseAi9IQ=X^7s#@W`=<+&1atm(FA~?V}rSPamIIwFt1xYv$68??3U@e#NEr^Ay*Lx zd$?6B^6fZA3h0y>%VUiP>svWFh8e29wN{v6jx@tu%?yt_%%jBvMgi(@{dNo27qDjZ zxp#H@f|;s&og-?QEyaeuwcIbq+k+3fSvE>kDowHn#XVr1EtH9QCr{fOdBv+<#)*s$ zil&QB=S~t)dn?nWpBc^W4l7)?fKe80Zo$yU^H>v+3xo*vG~BD^;b%q?Pq8?~!sF#$ zrgEfPSn|T-dqv4;LP}RckeW43mV2!>?~162Egp~`Fj7>Zci`ZSpvQ<20|5?~@sL9E zJpI)k9#YC1_;FoDRuxwb3j->M*N((2!sAS-J5!gZGE-;!@I-pz#+u0Ri492ivlQpZ z0rc<*OzK$gVPo8sV$Zu1u}`ih&nI6eZ{(*;>O&6R0$9@Hs<)%Qhcd8BFWWd(wy`5L zsrCbxWSuT5RMK#txG#}EI#J%xE^tLw9iJ?#$XdiTPk6{0fumUqB%PZO$JQn0ri*6r zub^Rm#4}_$^hHc#Il!2du}zlNHi{JPF{UkfBBOut!yoR&r`VY%D1E*|YS_XL?;?%- zP|vHjHu*A~cmZUHZ_r>;_m+0?5F*mp#&?vSmM#uulGV2Nx`&dei|w-N6No z+{@ZN*iU!Fl)ujKog$h8M-W9%P$v%Y!77Q%xIhhU5{D&jk+@i59tYGOfI7H}O$E_K z)fZ-?<3*P}7K>nM7~{EbtAsc##|iN97%JJYbhq>w-zfL#?|rF<6M_0*K|O}Xj_-X( zi>F1cW3YKFTDwjvvqrXdr4XUkK-jyIxJ8zk>w@E55_6VnIf`#KilShnMaFYo)FLdo zQP8=+KNSs~Lni2QANavH@^Uq^|HE*K74iXUm@YA;NeFRaP^j))us7pDK7y)>Mts8yqEp)HmB z-JiAkh6;B}k^jmsZ{MHv%jA|ZZPeVd{_ccw%SFPeRAg=ElKy+QJT$Qa@cQL`?3ek? z%N53KeTWBrA8iluhKQae*co=H!-L}KMh*(j2pv|7aDWhX9c!jV=9 zjL-E;IvW)}*DrAke_tM->z9Nw=}F~q`@h}|!nc2h4)pD55SR~#EAl3w)sT1fGt9%UHdH8{jw(>aGew2CpwVCrq)`RABGF*A z#4)aEG*~4GxuRy#V5P))5|;@atqk)$TrA^5B7R9QRbpOpAw7yg8D`7$>V$<{)d#7V zSYA)I_*IxzxfzJh&~V2bNzo7xl=ok7AaZMMQQC;ut*L@M&-cCXmg*A$^L*dx-t#t2 zHP7BB=o!9OMLKUs?1f&v`$*zR=(b*A))^`Mjwuk#cVz;EpyL@dVV^ZH_^JWZaS}OfJ%BiMuKx z6|fUE`**tm`9G&QaVHnNu}j>e#-^>>V@+<>_QA$tFwF)oA!QUM(?t7!BDX0Pjz-P4 zlu5y1)`W+@@J9+Zg$lM^4t)3VGQ+FMm*zs1-U5hKzg$bVR&c@MeoLsj70)f`q9#~# z71fx>y-1^+9Bt|R-n}c+IXV`wx==S1T|S16+{RXx*oZEN2#UXr@4ON1*@s>&ZM2r} zY9G3_P9(D;_puda_;4r@m$wGFKlH_f4&RVEoGf&hCv}*6fDW^NM2Clx4!7jU^x1sh zzy*VUW22GBUEtq<(WsFPTw^?akqlgNe8Q0hlq($Mc&Vwx*T~|J?b~iakE-XLi-jVPu1GXgbW;ZprOLCiB1J=uqTVg{BQKGrBa9pgOStJ1Hm(|4*?6OT4J2J0 z7WTXb0^g0R^(>iBqC`U8$rkBc+1iP)wK3qQ6mk5~eL{^$4;B2G1%aQg5x2RoSNSH6 zYQ2mxSsGof*o~qqlE(#(*lyMa--seqn679@+^l)Nv&1_P0gLMy*(Nn5>*+04CUpU+ z*@)DOTKh#ZQfuFPXM)>xuJ6#1GHYe@)P1n|+80q@NM2k!{!inwup3R6;=<=G*(R<_ zb%$hNoqr?8N7vVjwksdZy&$@tr&;BLxpzd@^E9h`F!!41`W9~M!66|ay1q@ey=vKZ zfuopW)0NEsBhLRu)`T05`i>cYP8~DL3C27eJS6=Fthc2BE5i!9k41fB=_}q8uO1%K zFhZ9)Y*T)NtVC(CkXwF(tVC&8Vp)k&xx%<1B-2-l_{a^i5~Wp)@erJ@Xlb>;G4)(y zo?jJohbU;YUjZjLQMU6ePDq}B3LM8CoK|pPx>^hP9^F(Z(nn>-QKy&!)^Au5lSRRB ziYP0eGnyO{De<&R;PT0`W?8usbIr?7V2wn!N=?q^bdhBpB7J0;xLJ`EvgVuQvBVWz zk?1Bqo)}p{b{>N&HdS$nWWs2vd_X*(3lLdWco4zOoGu}lPe-y~l3Q=ctz$etN60Iu z{9^d?t}|L;_R&o}g3(K_6Z9@YkE2V4kS@BZTVRYK2k=)4{*DAcZKp&xwF?|XdiBUA z209|x2UV1|assp^*p`1wFEj zjkuz8lf>beXxoa?J0*dwxT3U9Vzy%R28r2k8i@-8j`quEdOi1=XumvxE2dB9d)7%D-;m4s zsE1XthCCLeeu}bzdxM(NMAeWzJ}3oLOMV`1Xl6ootcDlrmUKl+Qw2Yoh6l_Gas@q- zA#RBg+|7yk{O;3rc3P|#134b*3-M|;OP;u71O|nMN+Bl0mt)g75^1aw80W^su!22n zE?y&>*uwNfghgNlDCum93)B56k-*gJzD+oossHyfWR z&kFJ6SeRs1J!eG9!4ufR!VK`iDAAvcfwp}Qo1SX^^vvvTL&FR zDxv2KTYi;N+jnTjs2}^L`Lidv54ZS^k3n6WTjJw*RT76(D@vR#FtuU;s$P;+lfb0c z3i-)7il-jDM9!oMV+#ze&g!Kyu1bCb{fLA)L~p{3?x%G)4MkO<);xO%T5n4|8%1Ls z-xKp@*&2y?wQRk_yj!+%VqPwds{~~c#gRsunDfZ$mZV8voW=E3AHl{`d-vo|eIsY9 z(%ng=Yp9l`tKmCVOhUSP+@Q_{Un?@j(E2W_k923Jx!-NEXQn;JI=+FMK2qXl{l*>_ zlicd?Y5D1LV3lV?%TJdBt32yjemZ;q=ydiBk<&vWJ3L7frHPy&t0bNZ(HVU;em>0E z%O7`(j1)vYXZ|2f$^h=OmCD;J3dF^ z`tQYPA03}92~DDe72`)q+$=GENCFr3FeMI2+$L~zd{E*ViPIz&D#nxBRDq+LEJN_Ee@*Pak7zg~8XB5sB9>t)9% z;#MfXUUrNkZiUG8A<`x6nTsE}Q3}3YkU{6xO-z3i?qMJo?{;bb7YKfL+E)As%6i$N zrP6fz!DJ{8Ic6ta%pok}R@oV|xIrSfhJ-MDu1usWzg3nwtCDezG<|v{8CPU`m!L=1 zg#?ZzrqGK8wjyI?2BkG@N@Kaun0`r|Dj1`sRouek%UIx8PM?@buj7IwX3_`9Z>IDy zWT-M|GBT)_8H9}t>X>g`j>xfG3ieJwTg3#lNAP*+Vn$usCFo?TA?lsc(r!V(>D2=g zh$(exM4tbKm9ibwNXRtWs zB2-_In8|WSs8BQ6hISE;Azh}I#w>^Y=yW+3Xplyom>NlA&r0Jda?+hxLQv9;DDT0O zj_7#Kuwr~`pZn8??2+!>FX30&2cQn*OZE(4+^SD zXB@3T*8x5TZvqit!1@)>Od8vyZ@QcLuT69Rc%5(Np}*j0b}kcR37^1KPx_iBp|Yf} zVU;I+4XZrqYgpyV*Bt0u)^fgb!#FYZ=!jzKp+;!=7EiRF)VrE`1l0Ux1q(?ymnu=n zNKHu8vE1dpTz;!`CU;6_vQ_r|`G(J!&s{o}a2oSbu+%5_Wx?0_O-=z>fp-B3KP0}Z1u}`R29~M0*+7CVe`J+E@TPB=wEcP^(!s(4-Gw15NsXYSEOmm|aSBN;&~)d1ka`B;qf&7P(EM>f3Ai68^{-VeTEC^EpWkBK`TaC2`| zYaq4uSt7(+>Rn0cVXRg)@@9n!SwIOhCLV06c}h7w*vyp+yTpS{x$ryS!KQrFlz6b| z-g=BZ5WmK(tLmur^z%AhhN`1NSNNVU*Q7B=+`TF>dKvh7mT^ zO>MBNSDzvw<=oxhuJ?^Ql--mSO><9M@0&gAoHQXO;X4yQ>GiefV+U+gD}_(b=j=~# z$G?Vc+ww7LzSu1+pnMGH6D?wkC?CUaGFsHj7BVIz8X{U`v7AxTO^#1xEa!NUM$RXC zykPe%q(0#C@rSeB!Fzqj=H_x$j+U&6s{B!~wo0RjTq7Os_&k}l``dGU<6^(yWYJB0 zx~n`>)@T!-{wmLuHQL0d!^$&djW+S=u}Ee}2*B1A_cq$S3o`f8YwH5mBaJ_Zq}n%>8~#kFgeWD za1$k_^mP)eCaUKGUmp?$!PH%1S)rn4#$!Y@ruNm0w{o_L>ABQ@R>0!#skYAM1d%ba zq8A8@yzpMxZkwuvoM=%c-=zs8Hvw+qc05#yDG7-{B%_e;7pUrI zS|5^F)@yyXz>x*AUh8uh&r>a#%NPSIT~WCTOfIbEaDj@_B%dgWJ87$(8Hj90DcujQ z_l=32F3r&rT-a)5?vflKHQ|V)d8$W;^z}lrYnsr~Jp)@8bg2n$xg%>iy;Gd~Eq7!s zr*}y#YkAT1Zb67RAt4|-y+>kM&FQ_2M~i4HI*aegM=-~71vYgs-_f$w&Z@P$$BnvA z_Ok7T+~}9d)F?C+IAD#a{jPF&>=-Ux`6w=R#rWIA5LmJ4R=%&V5%P3*C9t<_`(@AC-(>YHNGqI{WCY$>l$VxPpt67zzH&-%w`b|kl7<&Qw)=N@^8ZK#wP@I!H&qT`m#;-MKE ztTMh+^4G`=UYEE|;@2dumzcL=Fq`_0x3aQ$uLcL#q(EK|MH<+I@ZzBqz#|V1-%8vf z`FUD~S9oLwjWWJn;s%L3B(9gZlfU2)&8m}xE-A1^V)iJ}tZIqnsG3zJajw)zrNrGb zgVhrENL(&)uf$~%Tm0Y(Upth9R4K4n;xvg1CC--xEReWL;(URVi{3iX<}l6#oq9(! zt6tLc1U;H%=ltLf4f;Z25=QgfYY(MP6k_p>+;=0}*-=Mu&XL4q_^#hilO{NH7Vq%8 z4v~AAf60l>#Ad14QS|6kfdkec;j6rpHu>%Z><||nXrbAl_bBA?r_tmrMA3NrLylSO zp>Xm?x+--7JaIIL>z6zk#CnKq5MrQ*99h8*p^stdKVkPn3Zx=t_~^L^CJ)=hO+2!s z7r(qEPosjO!0MxIj}1csw*;l&v>)87p8Ypp)BLY1Y11-Qa$9^)?mA1%9u+=EV%DQ- z)<_ALE>WFC^`v=hNM*gMw_YL%{S>png#Ot6yw&T$Y}$L$Nxe+>1-8uLG=*K_Wh`;W zFWHKc;L}trw~_aH7p70l!kzOaE# znZASX;vt%F%TgtYr)bg$5>L^juFFM5`!X#)w3dTfBqh9=VD zb>(|G1Dbd!BiJsCpiP#%UEBlKt%5OW1iiAYO&hR8+aKHpQt=zgWCXKvSl|FIfO3zhc^?|H)1CYb7%Yx%eI59Fax4N zo1|Lm`7UR-Yxz>0`;0H1) zYvJ+y8%b)DG+;5t0~=v2iGy8oLlHkTCj=+YELTe`)i=I|abn%b`*zB4;IjxEUy_zB zYKT{HBthw$_uiAvw9P&CMBiB_C)D>px31dbMumKB?w4uyh)Jr;9El1=m!Xdse-UD{ZH<9C-_F3)+J!F4Hot(o#Ua zT#C~kg3s%6X`_>lg{t3l>VJjMk8I+mHuvOV_L$oIk?Fp#YA+r+!uLgObmX{W8E?$N8A{5w->=Z?uZ`{Oaq`8CcL#vjwarBBh$G zL{=BV71MidywIc}hzJ2|B=eP**|kGo4BFj&?uS{vL8Hj9snD0BQ1h%j!K9ogO|dHN z+N-mN$1W4mC$S9n-NNaUY_+C6uneLo$XlAo2I(hO7mEm32-iu@G$O0{C6k5ee9Do^ zP8Viwc^s(Vw@wxggq6A)Jt&zs+edOo;l+JUaFj5aqHT>Jl0qdv8 z$i4J!-&Ff=H@J7uJ@ZC)*W121$q!-PyVjlB34(fs-geiz_jLL$wKMYE{hhvb4qkP3 zuYAXMzP;#J_l0-xiL9H4xZk|vdH2}9Y;An%yS_m_yJUzv=RI%CNo(DW@A-DvZbp30 z`@WSv`>i|N9Upi({<6m1|AFsG`hKIc9b5Xe-OvyhvzINiFa}udn z<+}T)I3L;%z7_v)s&k~B-tulTJ@Ma>8{ePntn;N;8xc!$<2Ouq=J<}UHzJ1RVnMK& zi$G4xjGvMlPdUYz>azng;xkTlX87z6PIa%I;oM>GeAB(B-5G>gjgw|CnCQ-!>5R4W zXSmDge#e{c#+fMT=2P93dCtS>sK2VG=*8SpSof0ioofHfi8y9MM#6|GCcj2QX|M?5>>a{O3*ot4Z#h9A~(F7SiQ76VLoR}iSN3=`Ou%1qHLgz@wPI=uu@)GA#``g#tm6tfn>@Qzq z{LyRfJ&SC$l{*~mvQR3)p?y_Q}Un%ionf^kFXUp`{C7vkL zkCZq=rcY&@_B}@7$np+hbdi#F{CePdPNBWGLzFh{6A>#09IV58W$arVYroXtPAq{| zp6GBt{Ec&#{a}YXe6h1K^&X@OSnv1Met+Ds^tHLdg-6!VBmge6qRGAZODA(cC9SVE z2%50;HSWSMoDp`{es}mM&LF!v*WK|Yem6Lc+%EcC4mhdj-cS8-H7BFttO-G{Tg@~0 z?=|?T6kh%^ga00#{{#zPY}FEoallicIz54v>vMOZ;78pCdZe7kH#HEt#rN4m{q3mv z9e;6#W>Z(EI_<+yLI<*GkP0HZEZpT)6=`hW?;f|-3C6;tutug+%}ETUK8ju~NxZ6F z%oFMRK%9($wQ96MQqP_LOnM;th+P3ZFeZ*Bx{j zEP6n$d-Y}LYlr8$+vt8suDgrwcCP!)W#~!EhPWF)afZ69mpaGW*B;?+TMCogvD^J> zsWW!`Q@iytkr_}K_R`};IVuzW%YJvpGGw-Ww)me3a>$u;gga+By5Y5we&ud= zY#4l{5?_jZ2wx!anY-O5R{-ZSPCt(F_vBN;`S^!{?uP#1%ZjI8?v(oM0n^;8e};7a zY3`+KoUy(>_lPT;arU=U-G|qpj+bV+N3M0|*wMq?OV^@UPwsLju7nOA-R16D>kLZY zMEf!&qG?2%ee#2Q^-74_yo;+-yUX3N4(ZN1+}*ee)rm^_s$K4fSAuV`#PcDy9QbU; z>8I|}<*t@;C+>=`Tz&&bicQm*Xn~H;}}aD};?XOE&(%WV5t zkzkqa4!z6i_TecLrK&ShT{V$YT{kkm?rv1xUfdqvzuCFRu_xrXAKu}dHNM$MaUcCK zsQkjW_ejH|A$M1yGd#WB;7=JJpK-6V!yeFOL_8QjV!QL1W1luD{>}Z+m_0trUH6c4 zj@xpkKkaaQkz355@%&-G```o4(%O>HOnjc0cad-|r$@M>#CBCD&$mm^rE&cS%X;Qd zEbDtER_S{r<^@eOtDA5@94&S)+2$YWc0K6)s_0{^!6FTl1TW6bbDD-}5~oQ#Q{te+ zvn39RJ1t~ifpE2uBd=8a0$JDa7|{t&8bSHUx(|?_8qborf#pOqr-PgLIG<=HKkml| z_BlWKEFP~(^qynCPGEh%p&v+30#RI@>~uS=p{jqo_#;x zPx=ktkNGX%GoKT8^^{iaU3i;(#0!0W^DG`^RlJ)s%kPhoTE);coEn!Ky@CrOW(WR_ z(M}To-sim+;jE7s$D`@_B1f7%99A^&P6F@trCk?I&r8sMcWRp0;yh~O5!Xi3a})HN z-7&Wim~-?m{yUnU6B7|pJH+?J+43&iM!sN9MW*SCdU;ko*1uhFgI>fvmR7WMMT^*q z)wwgO;5>}cil5{S1z+5DUwX*tXMgv+`_@D7r`^xHD<5{|JHhu;;yWL9hWVVb_fy=@ z9&yh1zxX_+QNQ$`Vn6%5yRI1?<I!za0#`XrYCP{fp;$wz}qd zo~>T~yqK-p3!iuIcnluv*yr8(k2~v}zidm1?|$6*+OhBcgZn}YT=m0$a0fl*OtgRb zhxl1fIafQ*@!L~s_e9QgQkzoT{?9n4I!)WL-k`wMpxp9|GsSt6Sk_N*;vn=9;R+Du zMyEIvKv=cInc(znOK~?-;B`=T?{LOASA(VhRb!mFAdF~r&UA)>5W6bF=|!Dmt>6fN z(0bJ{Cm;7c;2a9hy%bRc!la*%aTbCwvkio2DJcl|f^Z8FJ_lhp2rq)LhX|uV7;*Kf z&iA-4x;n$@L?(-#MMMz@o39?@4A`C$f8<$bSilK>0F}JpobPiwYf-dz=jV3gbF`}c zv%UE__l6gt^jn{Ezj+bE>^0B1D_;U$^PKzPOU^{6_yefuWhY}u{s&|)d{OJqM01n5 z=73@5%gz(_G$C=gJ9L+m>JELy3EN{J>tU>%?|Q|labCF-i?>%%yy{;=*AMy6bP7HX zxSL;fmfBxGEBN9_+2yl4o^|){MoFH1)?L@(%&?z&)_tFRUxS`2QHBw(I}h3Go^^MTu`ebDRcXth-oc-I-`p7BSgT8P;FM=9d7 zKS~jU-$1DfzVy2@-*C=%f*(TRZ#Z8H=GdE(dC%qkVeaE^I%y))oo^yVJ&LjSO~}Yb z(h+YVX$y+6>MiF@Ckz>}51lFQRc|8&iN57+=WhQ?Z7}GZx1FP$N@CdKOdy8C-KtLK zSN?}6GVL`i(T{(}Io_!TN8cJd!@cSqCr{+n`VR8y{HNdD`;N2K{&|~w$Ggdzj&a|A z7g@>bu645asO0adgl}wh&-xfU7gx2q_k4^MdSz>T$H&f*KKqnbch@Iaq|Rz}kL-pZ;CucA!IL2H zQ%t!>L(r!%m!l+3ZH>?PGiK)Yi#sUcSoh}7oGN?Q4o(fCNd5E~Jsr3-X@3!=1Pnc>_=UtFzJ0mE6beh!6h~b5HxzXQ(%gbszi+ zd42JW;P!v|47Aemn(rw0XM3GW`;X6XmOGzuk!X|~?r~0WK7@U4?|})gdkEIl0}u4p zBj_jp4W&0ejCv31dVF zLf|75cm#nx6u6km^ECn|JPKz(fhovq6$S1=U^4}-h2-57coqWtDA0sVCw&9S8Hidy zf%6a*qrkh!Yx_6OFsBAlJ1JnJJfBhE6HpG>hd?WpkOE(k5-89D=e8VyA*VMdeO17^ zKsYUWTl8C$b2D-FN0L?wtVCcB1@4B}J_-zl*b%)5{0)?u6zB$J5e5869;3h}l0$(y zD7lpaLs0QOy>J%UpzI?`2kJ8Tp9r);&NK>K2005Tun?3hDX2FY(z z;1~qlp+GyBN7xiVh6^ari&VEzARAFTDUc6J9|bBQXPSdR9Vn|P&<@IW3gkob9tw0L zFxXE#2+XBGF7mpO0!)qIOfDlX9m(DxxN( z_{TWepe&$3AyUOCPzlO*3N(STTks(FeH3U%V8kKBgTQPG1W}$<6sU$kmjay#v{E1! zaz3L#7;^fj5)UZTD9{4RA`0X}&W#l4MBov@gTUJq$cE%T3Zx>{xI>8*++qHP(~b%KoG^4O@U4XR#BiA0ha(AYtUMK8*5Ch)-zokyCBEn=|JNDL{vF_W%9k-P z|4+K%hoP<5c>m9x7EFHn#{18A>JZqo)<4Kb%<^OX&pUaaqDsg4Glsm_noNt2^YoC@ zq6ZZrFf2L_NuOv%V}R4y(TchBasJzVw*N`@(uw|U_TDGllu7>KDSvqa8!8*zev|xJ z{?8D0)6R5$Wxx3Z?`1sj1n*_IuT1tgImbfWq!S^|LI$@S55rss%Fg4F(<7}ZV%l1d zLQXmXc6k9}7M%cH)F5!<37ESbgTU?+kh%*zpAlsSC_-KpD6>xl^PQlqIuY_NL!gzi zYD3i9L?PXco8lkV&wlkW_p3Ag!{e9D^cVB=bZ4G_o_*V6@!_-lJA8K0WAP79^AG2! zzSI3v?6V(pr=H=TZy)_weB&AZBROXCnf~+b-rvL_YoeUx&IYCZH}1;W{XzW=8vp#8Vz`0)AuvHl^we@?a}&6FqOStiYt(>{Y1i_p}a zpXv<9N`@Y431Ub!B#e;^p+7^B#E@$+jF1ckVAx9xVS^!4GE{+K#KmB!GZ+R+hGsC# zC5Co`;Rwml1%?%QQ#=5&gCdr9kOsQ_n+xL-G`}v_vQY}oO;B~{TY~!_MIL1Cv9Q+s?v(hxwf-Y~&KhKL$dxe0>~7SRoXH)3 zNLrZJnWTb2IFoCTL^zZG`U9j~>Bj?u8pQQq4<*z?@PhUJuYFD!B)Gowok|2YU*+HG zv>_cWOX8RO++S=v4?GVB@_ebECo`lWKl^iNA_mnqp}K>s{BMesd#n6kIxUd3X9H^6 zhNwfX0Z%6a)2;!f2Z2S`pa==M9o@Rz9+YkOHU239`-%JAlxqJScH{l-J=OmCPBC)a zSM5L5f8YIZeD#kxCGk6d;UD6&BVdGcwAbDrf9ody4BwCzPg$vd?!yPosDE~Ro)VvQ zGZboP-yfgxOaJ_Uz2rWcunfnRuD{v|e}OTp)<0&*zUPyL!tZLZtA>D7FvM#8XAb#q z4+HH^5j!1hsUq)R>%YROq(=M|tbvl;_$$=-uh8Ufq7aX0Uy2%WyMLJTDWYalARm-P zx1*gu0i~~hAj5s-c7MqEnM%8Ey#2`1>OPW zZ3?^z=0koBO{_s+90EhqJOvI|^AiO=1q_Rb^LwZ&MuAEQ*-U{s2((h*DFpUVpb^Y{ z6nGwi5qBX_g}_V-q>vm6aL?$mAmvxMx}HkfG}MDE?@NB90q(&9z;{!2=H@OC%`d&Rc+ zvitpWe9mDnq8bnQmpYFlFycY~L(Y>3?0yhN^DF}WA3~t)FQ^7>{nULCaA!X3Kh=HX zA(XXBkqf^F#6f=EKDPbWdWK%yf2n9@i(a?~-JSF(4OgB7{VOE{jsX+HA}}}z#IJnR z|AV8;Mz7S80@FpirId8@6F(w*HyDKM&z|sa^*K3TrNnQE`_J?_-=orRxA@mO<6c6g zpMtJxP|eLxp*3k=rSB~Hg}|N{{I@&jBXH$T|1(YqIZbOvaVaX^j(Qgm^NaouoC^`?{}QVE69gXl$e-yJ zzvN#tWS%#ZLuDpVKV`D_B}|RyBM^TX0w9~p>puR9zeb52>4snRzv4Uw#R-uGyZk?O z3RMPeyZmQRviKpp{a2)GC5VIlOP@%%`4i|+rHQBg$^Q?(Q-yjQ@;MqQA1%53bN{Kf z6Na4afAQb#6SUc1`ZIh^9oV4xg-YL;;(IBZ_d*k$9!fmc<6mn#x4(?h_HX{cVb1NZ zpm~1)S1-6?`yq*1bI0?vOIQU3C~9vXG>E7t#s#MMoR%-K`0xcDvYlKo z_4fyuX_Y^K5d{0H+x-FT1swwuqyUn|4+#Wrx1A1fZ$2b|bq)eMRbcNSfxDfb>_Tp- zfm5BSucF_k1~P_hd^KqX0qcl_8C>@o%1)d|b-+y?8pv=i>%f%Z(7;yP$%9Gu9TvF4 zDL`P=;RqDNSL`{Q3SEGz4n7j3HE1U>e%*Csphu8z>Cfai$e7U(Xa50`6dRyOx1_7Y z>46^vQ{O;IS#^}8tjdtd_GAR6*qmojC8II(u3(_qS%(tL&4jWjaARiRmm)AYE3lLT z@mLnsxD^{*qRI+wWc-86^Ya*64$Z{XPI527`y#h(^o(C}ZSX@%E6laUA3s+sS6wq?t zzc>&&d;mfrTsSIeJ$Xss5?{P{VPLl3oqS0kG@$f~6_YBKLUINDUs6)$PP`;AI*rI{ zS6;cgq>N((RWK)M6IWNnx0eKd>MXi&>6%%T{`8WvvsYHES-p12niZ>7P7f87tgTq8 zQRb~I`xi8lDFkS|3l!D;>axHhD(=8o#hQ{eODD;~u3EWl#d4H_^A^Y(vuyRMD`dUa zth#*Z%0(qhmaJO4a?QGuwLeo8)*?8uh~^;2maSg3e09kcMEdEPMbr+fmzMpkWXaNG zbF5kQZ!%JC1_7&)AGs@#aai8R{IEY{t)Ad5v01_osnal#JC&~pysY{c)OBGk)> zcagFW1Sf*PW{5Zz0oj8s>pr9+)1qtA?I{-Cgh^b#y&YZ%35FnG$${2-4Bi>%o5V#7 z{p$>dN8qWi*WhGgT=s24* zU{cA0fuqJt%1d=A7M{2#uFnmegK=&0{J^jwpKMApjsm+X5$NvRI|CW#(vJuweI9;z z1k+0#&q`eMYZjPPB(Cug$WLM|i@Na`83Vfe2n0H+WkzRLag;a36(F%!#g7~!MITZO z@iNeN#ZTpQf??7ow4}EZR2D2e#Fbv3V*Qr_pghw6H6wwOCk^z7!fTi_7kc-(A3^UY zH}T_QEA!qIi=PzpYDLNE1D$*oU6+D*A_pzd-8~RK#LMsmBGuWqfm@~RW|#X#_ZU*R zhUZq*<$Uig<9i4U!gvd1#8M;`#!II_Z}~Mc`Fd-L`1T=XJ{5oRC30)lHk!(V0Rf?Z zV%UdXcq|2Q5yM_$xDX77Gfk5KI%fP(QVX7CX}wqx4(P?b@?cECe{=cEnQ{%FZYcDr!h%gQ-PI*5N#Up zU=@k`93y@%u(ul-@?+MIWl#w374l^8BLaU^-a-^8+0W4jmVn^x*lU5wL#WFr@sDQU zBK;th825jx5$c2g(+nO$240`{|DzG%15SN3#Tx4=@e<&pJ@`i8X&$@-c!~%A9eA<_ zAN`vY>o^ZC0G{c=w*X6TBJ#I>4}y0j>H;3=NzhxX+ko#eoj=#Gk>Q9}E{(*T1?<(> zQegJioWFGw2z(}sbNxetf$`_S<2fk)4}4q~cs#JzW`1hmb--SYZUPnskojA!AWZON z@K<1dtBHw2o=CCAdE!q4_SUEb*qeSMu(yeR5A1D{y}+{|PvvjrJgK)~3Gm6D4DSM- z>A~*-tKpBx194*NG*A3I;IlmV*T8B7A@XkE8J_&DBU)0dGd&4@0(^`IM}gIVNaPk^ z8W7a=6|lE}6Q0s5bSbd6LU#h6ldL~pL;=BTbpGG!ZI%t}EzkwPY(!jyb--R5sW;O9 z!QlTK_@spXA!F3<^bF1g_O@Xau(yB>z#~-kac=|8@!(*s-fMag@72(xr&FvLPO2rY z^Fi=tuoBoCe>1SR4cmadD*X=FYqaB^(JQbB*y~5`cqV1BW+d-}f!}N6GG**Yu}(=8 z&$2E6p6$VPz+Mf+fxR{ozC3_Ibi;jtqmEt`5b6E_j($?Y2e_*~Q!F@XK6+SnDYJs) zF4`Ixba*&{A#4DI9lpX#p+raIYD|>lflP<>dL;MV8yM72CVCwY$u@7rXx)VefvR+u zpmca&OG*TW1XSAPc#NVZP94Yr?|Fy|bhnRk@G`vODI+mVYQhYz=5aDUVJ`^L#S~#L zX^)wt(_18IGjjIMsGbB?MsY2q&|-tG^?1_Y9d*Iy?m@=Gya|rO;wvQBIr}uR<~poH zmWa|!x({>Uy2tSt4D-&>^~sn-uE#=%%BkgrfH7H?gp183Z{FuT&FX%EtD3r#?`pEF z=$53vh59IsKLUj+;|JaCe}5ojO!G?t@u5Vj4$p|WVtJs`)q*>(ZH_2@lSyqL1>IR& z(H$jI6Yi{pBf4K?CL-}vdrF$*N^4IM^J&h&vW^2@EWv!-)#M`d0m=74{`hVdmi;;3 zd*0`JEmC^t&-Y?qebNKac<=+(_>uz1pzH78q`halB6hObroX6{Wj^poW)uIfH1KX< zWh2D!5%x)29|#N^jh$v~>TcqEY#x#g3=4h1C8{(AkQ1?Oo9;gQKw!u~Z1swFo>V#V zke1d^L-K#%w1qaee*NKmzX+Rcw>$`jI+Q|nre)~ZYSjq3+X{x*jF~JyImN7eBZDR+fITLz`+${k67g~1v58n12Lz^i z@Vkg-B{1>d%ftB9g#_LjmJ7p}>s~2abu={Wlj~SyazTu7q-^YORQ0GG0Y7n`KQ^h12$ONGVKN zI9mxGFZOV}@^C#YUX{q5^hn^O6S9ZH1L5kFk+h&pN1N1VGQCAM58m-WXLGF7cT?iO zek8EfiPewgB&t2?8s=Pxzz3LO_4I8>&`=NdTd#mL{P z@)Cfn*XjZ~4BTzt=5;!MGYQ3|YTRYuUJn+*{3^kpNKkCxwrlkG)N6H|Z{TVJw;8xM ziMc2_*XaVo2Cg%3yMcQQ9K2qaS8U+Q1eU6(PY^g^n}NFxoOXkrL9T&|4P0&DW`$+` zR;MDcT+6yq&mhmhg$AxNaFc=CZ`I}H-p2SOWh7I@wQ4n3#G7q}Z*0wZQs8sw_q z>uh;1=(ww0$9e9fPX$KA+FsPjod)hUaQ#ad*y-Uej@vfjbOry{_{I4V>-8WQAQ`0&vS4hJZJ9 z95!&yTY7wpfrD@B@nH`Zy`bJh5Ug@AQx;la;3@;x8Mw*7#qa0^D0?@7xfk}lmmr8h z!TUO{H*lwcb7{SdOBJ}Piq;P~C@oR|4zy=s4V^<0=E^eWb_N8@NYd znZK3&v7VsHz#Rs*KGFGu2F^Bcmw~H4<@7OC!zMawhD+g4rjBzBoNwT&ESJr|Y=-6dmWDs^jVzI_{X2 z!1F0TtNx4xLE!eYbeuO^$1UgUID3wc>)dBsVcWU1Erv_=!TJR{t}N7X>P0&4rCl>m z`ld^C+`Lf7`6U{TSv5Mr>NId@v6jGUU!vn4+LiMZAY7{BE))OE8;`aPuJRIK%jG%_ zt=4gBg^ojObX>Dm$4%>W+!OI&vaPnOJOtq4t94v$;IMeHI@x4h2F~4}rw`q%e6fh%uI$P@Wn1)CBC%FoK%tmB+|9S0k9Ty5a& zEqZ)6?V93JMxMV_Vb0&GOArK~RlH3xFzzsL&UQV%%D~MAZZ~kJ!ZLrWrb!o=bH9%3 zp3rfxf%Bi#CkXvf$6*6^ z8My6DoxkaA9d~vDQ~Rp|w0&wY7`Vs4sejh_Lk7+@@n<@JJ+QDpRe-8)ogwFQ9an#$ z6S z7hyU%r|E1x{1d?mQz<-4kFTDs;gT$@+Ug( zou}jWLLFBZ>Dap1i_vs-OS}Z^z+R@~f~7j{;Lp}3G!$B)$Cnv6w^WZ0m3uImPL-Dc z++pC<)t&^14;#3}z}*J6D)jVe9!&XL?H+=_YxD%g>vY^^;Iu3C_)Y`oSL*RiNi6cW zdXogo-^!r}YPgjDsWEVufz#IO{MiQ1HE>S?bN*IOR2N`ft>a)-|A2VQEzBqgD#-T!1>qc@xg0#TxsBT16$WIe`0=BED1{G%?9o=aIb+=uh$FE zX5fw+^!Sb&1y0Vds;hN|ZUg83LXQs{xXQpa2ClkEPv0#t^sj1M{a-pm+HE>ct<`b9 zfxBEiKD$oGd3Wl#nlQD$DnPx#&~&e!pn0o~dktK@O^gNQ^@NVIpVV=6T*qB4I?jDc$5l_+Z2zhNZBOeA!Dn<_W8mgiJ-*w(dC%(cZNJyC zwae(2xw~|R0s|KtxW>R`Z|Ui)4P0;FmY6~4HgM(Jy1hZBM zgHUbYIs+HHrwa(auj4!e7aBOM;}||Uq6_FWaJPZeKG6BA4V?X<9^Yc%ZVki!!h7@t z?FJ5Z>GAmnE;ewPfwMo-(-(Z~!DRnoF9EpHz%2$2cY6eYzwj?QZZdGemwJ3^PZEp% zSKuK)p4IZVBm?2pzw0>9z&ZcWv=?tmg>p1*_j$7OTuVe07 z*{74+4O}3<`lsAWv;5Ys!XdvSvR61KpyMh7_vje9!%qy;r34fhxZS{M{dE57!*pD5 zq>l6P5i_s+w1HlX{8RB!5HCZ=U>)bllNhRi)dnsL>HIAQt{kbyr;YYtvYou6Jp|y6 zu{sWC>$uCnHFQ`FmnvWtz7^-i?FLSpn2Z;;TkRoG!oo>O1|ca&$9c!=xa9;L7vfW0 zbg2RrOx1Dqv;-FUTTRmw1d%XwvW|nN>bS$eIeB_~rGeWFoI6YLbN*J|X^J57w`xw; zasC-PE}X67CIj~vxH4boZ$DdNnZFgBqcao~=(x+kg%{}Y!Jp{3X`YV5^L1RdfN^5( zT5z$>P;cOxMS6UXf%A&>_%Z`m8@P^fa_-txq6I)c&dfsh8^vxdtvUaIt~Qex|3dFVk^z zxsJG9T$I?ky!Gx&whP;--xd;UwuRln46&PE+q-J;{PTXozPGYDz5Iz#d8I_|2| zar3WrTz0pPyA9m7O^=V|Zr2HwO*-ybTCp)+2g+v4NX)jB`3V!Rj?|YO^jd z_^6KCAJcLDlR9pW>$t4Ni(!8)Pk9L#j(?})uBUaJ{fvQk=(wg;$4$@bIPLcyO!lAm zyoUf>ZQ#nCdVF@fj;mhOaqtx#=fA4s%3Vn;`d`!TB!R}i)Yo)e_qvYr|ES}-H+0k>Nxj<1m^xA_?K^}{^`;M@^9 zt_$h7d9;p;$LlzIf{v>V-08u>2vaBO2|@tqm+o$R2i%-#U%?urP&P-tL1l8vy z2&5^ievXb?3Uu6kp^mM2I<7Qu*L*#`>mr3Yf2*TN5k&r0+r>K0zC_2tg*t9CaBz_x zUtOZ(mc@Nbrm{qRF78|(cYCXQk zz1*C1zalL_SZqVa9s&yRRt>cuJzfTE zvdCBPmDj2MQjaf_Z}hA9@V9z=vw?fOn2aFjJ3T?z!1V_1G;rGYdip#Aml?RugM|^c zc?i@AQh(3|h76o<;IM&f4BTSit|aD8kh)*bFvq}!2Cg!2lYzSpZ1w5#vlDn4clv?^ zfpM8XAOfmQ+X6anb_aYDm=x>ir;~dPoOhTWpVME*`39~uaGQZ^(zNt3t6e8pWdk$@ ztJ=UV2JSL&PP(2xG*HL68b;%VH3CjA8o15CX-DY-yA7O^VZ<9ab+9L%jHlR30Io4` zA$`gYmukrx1E*%{@x=zNF>t#F3*)WK(gk!II5b3$FEnsys2(3SaA=qwpFc5yx%1Q{ z38JPQ22P!nNFd_#3|wj8W&?K{IGCg4asF0*f*|Bul?HAyaHoM&Co6%RKG(ou1J@}m z^T&w^T|lpaL&xj!1qQA%aI=BC44ifX%S&t{J&Z0Yy;;RxL9E5U)8wEV5m26n}NFwY)#b*5HfI{fr|-K`zH!u zFw_~i#lW2g?lo|5nqHt>0~Z1d`%?v|G#Kg(++yG^16#Rzh9Lvz8Mrt%!1k{SP-QUG z8@SEDT?V#JG74beJOdY>6w?z_84UFXZZmL~forDg@={OMamc_qF@w;4ik={Ns*Z~d z++^Tx182|B(}xWlYcdF31`f{D1r!*#+Q4lF?lo{uo+dA5g>`~eZ{SV?r_Is?SosF7 zGH{E5do&FD%RWsPSZv@r19uoW^>jUbo`K5@T<^tX{~cb!|Lf}RLLRxw0FIxfyV=?9 zg6Zy7f>t&~s8h8iBCP{ej32Gj){ksO9qLCTUO0+K^lJ3Nq*P@pg7GRNh>W5#>V*MY zI$cnsh>YMx){ouPcHOA8PPe*7O6#<0@yujSCeOb&+23=XbDlGknaoSyH|J;eXA_sz(Y8M=kN+vx5@GC#@qXU&;+XIX8^}=25;cb+hoB$?C-p- zuco^|RbQp>8n#?npa*;K1Wt_W`f6zc+xn`2ySK}NE0vQtg&&dJed!_sLNiRMxoqs{PA4+>6 zp8uQsWrFo3Y4~|oqt0PqrNTe!Xcc&YIdO2I`ta=J93y9Uczejv$EUZyRzE^&fsWv_HgUefqZtA zrC*%c>GCC&c2Km_#fo!}In{$zgu{WsS?l}_LltQLFufPv8w~|E3wR>_37Nc+t43ufL)% z2T;G2_TVX;z&WgbC&ydvysfYDU7(!5{zLxX%MNpR1Ka0h{t%Af%($+v3KQ7YSN3^1 zpa+L=3g>WVCC77X?|xzlkdVL`oWtr7S)dE|;o;WJPb?E8#P9-M!|D&10NjU%mG${I z&+7>iVt4_s-~#SEDktQ?Ug`4vHxmeu5WyRG@R%$R!v*YJkoi;X>iRPiSR(j;Jnj{;!vv0>lkMH-r3<+KAK4zkg|vSD|5tX%-~wJ8XjPw) z=Azxy%gq_5SIG7yJUO`EuCM>jq5Xhf00Q<}vV95956ku(4lLO|-FJEac}HY|bER|+ zua3%g_n347cTUOn!Je!8zkjVvh~VTp*>1f;+Pz*nf2Fi~we+xYRbQ=}K=t1CZ;%}p zaQ8;p9`&T-Tco?Mm!9mrt*^iFC=+^bkeK0T zTjc;gJcWC=$@~!<*4{n;V1nRa`XJ}y+bC%@cf;!z56cd z-atC0Ps{f9U8VK;Hy<4BcgutcoW4i4+wYa$!1nuOdkS|w-Cn-`W&+vWvcu&4((MmO zFX8qFWxE5Lok&bQ|D0Y0y1d>@V59^44&f;r!7-e`b2vTM+Ft)=0t+N$@ER^)bzUBT z1-D`Q{8)DAA;E=*Z~%vJ45#pNj6e>nm7HJ)?!hiRfQRrnKwtt#a177k1-ym}X}#dn zBk~Bla1ZXo9z23Wcq*)~zeEJ|8a40=-oSdvQE}IF;2!MmyS)Af`vGkq9>F0T!zsLk z^F43xzenW}Sa2Kez&+T32e99GTYu67s#6)kb2x+7u-UD}e6F+~lLy$@d0Sugc7dwC za^ODf!UNcYhp=y4*Vlh@CTAGJQ#gWSIE5GRs`l>rzd=F)w=c*EcHkcD!b3RNx_SPG zNQmGBPT>q*!8u%1*5}_`B-S5sgs=@eunT*z4+o{o_uot)L_!27a0+Me3eMp|ySo0& z1gwiV1F#J{unT*z4+j_V{11^3!3mtg8N7mXxVSi$N31uvuRZ|G8R@__?7%MU!9E;} z5eVT3PT&;I;1!(1;{pNePdEdx4Lh(4d$2D(R)Gwt5RTvkPT>q*!MU)${tFS%x8t92 z24EX@U>Ejaf8XW(7wiYLLpXvHIE6EK1?PLN?*C#hP+tDlUvLIs8+Kq9_F%tpRbK^7 zpscS#ID!*6g)?{s=R0rft6~?Z>MQGUoB`N|9oU73uy0(~R}&N1)>jc6!zsLgSMVAx zYVV%^>aRFrxC=XQANJrO9Bkb@|EEYu;03&bH?Z}DJfJS@RMzL;eAW+;;KLI*g6D7s zui>I}`Tm;;wEre&Y{PxngGX=(M{uHDU4Lc*3nZ-I4Q%Cd!d=*g`>>ni`9DO04+roR zj^Pwu!g-G8{{{)xlQ=@yhRx15=8Sr1AHu;Hfe9SKQ#gWSIDzNzI7MIy=dijY&xi$g zVH@sC>pfRwKn-CZp1>g-!E-nh*4O`11oZ#^hu821ww{t_qzl`y-YmQNkgu+h^8VAC zW;X%-FTHoR@Ccs3F+7JC@M_Q1{lDG|l$AGd`|ol>dXIH6K?m-`F042DHvOym`Wscd zK-Hl4V>b!aYXm273TN;N&UfC{SH&(+)l=3#n-2KgmPGKTwb;Bp8tAFbJ3v(yYQ<1W%QN0SGkbryH(M>((V(| z$>qx9U5DkfGGXvPY3JqJ^-9ZvWr6%|>HhuF%b!cPFTl@~*5}_0=)7vX1dy?Hvvl+c zY3~=()1~yFyZ!RA8PC67x__s3`Tm=PqFyP(cvOGo-`IIh4iH?o{SupL_xsY$XQZ?G z@BK{vTEB(W^=AV4-g{bgT{K5j{*pGSmnbXqOE2pc#*9_H!kF(!!+yY=Ev#{C!M0r{$4_`)PO2b)t|9--BeULTf@ zk4g{Q(%q}2H}#@Prk*=)Z-4u30tvi^)8jHfIw_r8Ej@j)bh{%x9wCsx{g=oN%a=;8 zuaVAP2Jc-{WlQHH+s~Qufc3xh&;JLT4u^Gc@S!H5^de~5%SWd7#l}apM_+GT4w`?f zak=$a@Zn~>($j~U_G9HPtDT3NK)G9-ccyW<-B_MAEXLd%%j}Gh4QvEu6`b6udqh_l#{W^Q?$<|F* ynZ41>>t=TPhlftgzI?KE&2h6Yn|a-Qa(3oq>*gcjusmJ*&k47=zy86YWB&)vyxEoj delta 53825 zcmbTf30xIr+dqEho-;>sK}1DdSlkddz*JC^#SL*o(nQ=4EpbVaTo6+MpAxMMsVOcj z1vEvgN3MWrOOeXd7Lhiir-J|Yo;l}mW_;e?+xwqSIoJ1E@AaB{?lUuF zmV0Es<(}!@KI}VY;zyYJugO&HYI&*u(A22MB$Z)1n_M)xfRhFPC(h91#<*9ORjn7p9jpy zlKmdi0&?pvy9#f$Owfv-`p^jZrPf_pd4^oj`k#9o;^e6!dK5M| zpB2QZ@sfPTWhlG+oZRT*!{Rr|KJ7wO?&5Y+)U#qew{V@uLN>|qt_AG-=VZ6`>Fl%R za!&gUW?3iubx2}yd*u8Mer)!h!m19D&5rv%C&#+^uwxtLbhrQRcyXtB?B$Jed8Yyv z@|>LHp3e3xmmA$P*z6=ZqjMHJl2_={B}ZVc8)fIPDmEoa&goXb-qLxe(9`oja<|(oc**~ZtUkLc8Acve@Av_wH)3*oxSz6T-iTfynx}xxo1|(kplu* z*=ji*r=zRo5}e*$E#JrK?bWj1z(BTdwH%Mr?$vS*PFbtvs)2s&&IH-w=f_SzBnSFc zvF>YRXMZ2oZmS&VpCl$)ixUI;enaH{_)lY9*T|6p;VfjeoQ2cS)pAWh4*PYzoHFQC zo0)v5o7^#dd!olz25w;=ub1x!MvELy4O+o0YvhukEH*z~jvki6&OR;*x<>=wjZ1rlnV0Zy5-z~?E@L?bBmeWTZmyd-`V?)=gJ(GySqi4#us6BHiT-vue*wPgZ+o!YcI4*K+L` zvpOzskC~^Q$B)&I)7xX`v8Hu$__!oi`-faIE|%R~CwqoZlAjy@20OXE&@aMSU~g=f zLnef~mSr{P0Y2~NJTJ$F7qQJ;+C>f+KeB^SBj|aPiK3n|cM$(T=T4p2k@b_Q?nkp9 zTl5O0{Ai9GG5vLuNivCQdvl*vJ2~cg(`4e<{F=%1s)|ge_3bo*^MA^aQznM@2r!s0 zF_^!)lj;)9Zm!5|RwtU<+?NWSCs{16OS1L+b{T~}kEUD1eKRq9XLe+6FDofenSF%9 zA7e5Fc5dBe3>KCxXT%q=N!f+ri!Dq%AA>ep+R-)2;3EBn!lb1k0=rIf z zeqN4D^b`}(H!Bl6y4D-Sd!H}NN-PrC_gRRW&n{;b-d~j=Ft@FR>1!;)12vtLDd(&W z?03Kr+}9f1$xy4`kVDr7vPoHTU{Z?fFoV=5Q!Y=6X9Kbd{no`YR{LsU#`{xG^aW{@JZ;m@?8_|*7;b_*H`SLFZsF3N@|&rxMDr|3R#FFc?LDixEhLk6^>)Xp zGvrOF9<0@ivS*r~I0$fRT1VG3LpkQWC?};QF=eS-mlnbfFD>-joF#}WXGyg3Kjv}b zxY?52_L*SuTW*f?2f#a?87jKYhQgobq2jM#G=cFJEN*bdGB8#?J5ViOF3xR{na)4k zTl@eDxqq2^i`${#wPl<*8;rJpn>)H5F%+qIyPUDbO+*D~>fdG$aSMo*f5UPXEbndU zEuI6TlrvrfBQ(9Y*vMTqg7Fm?JHYTk@#b@e1<`MS5eJRKjpkr+I3)KP5%q#0>c;JI z!d5qtpy=NOOSG$ecq?Ye_QLY5mX@yWhQZSzO|E$<_5rpfO^$pyg-v`$_7p-`c!Ihd znYCD3jszsgC2|sb;x{?)m2l>sAg8>N!jAnaHv%=SP-T{1<&>-tb_XbHwj8$WS5~q@ zcFvwAZ`=JW`(v>j`+6YTwL;E%J(9h=qOc?@QeaECLJoUtv0RWH*lEfNB$7RuO*|c} z-nE@+FBRU(3v_3JDYEC$Mz$xT(DPWGC|oRT zQ{pAMkKY6jd9_v#4eGhn&190tei-0dHm7;m@qG0|3%T)AZOJnA?37MM@u8L`Q%BRo z@*^iZ+m>Cv|J$<5c{Ac~O%vp6ANh8kHqB&uYEOM5uhtA9jGs`w?oB57?nj-x7Gm_tgA0brUaB2{nh;`GcZi1iu>8asuKiUDa17)gH$uvOz z^5mPMc`o|>T=4LOgB^Dqy_m!A{%%N@^<5Fj5q6YBNnN`5Iirq$%YK{Zrq zXU&CVQsh<@S6%NIy4gwB&FzfhPvk>qy=)!)zpktMr^$^U=Zmpgi?hN7g||Mj2oE?t zApia8RCOthk@bLd>HjI@C#eXTE^j~QZ4Wzbfn0a4@&Uh7{-06X{-2^IYEkE2@D{VI zm2HTVOD@De5Y^-u^?}wu=_D7N{pXARo~d%kXZiM!Z^y|#mmVp+`bAek{1M}!v}&H( zs$Q3;bO6>m9{=*`JQE|1T-LK*;t^;bxMI_cWPmfP2ma$eemzAlsm>SApxU`L!K`PT zTvL-Hcc}8#ST};12-b~$g%`f)r4{SRZKzs^8`o@nwGcb5|MNopx(S6y zmp9gUi}lumY@CmRlxPrzm+DREsZ?9bsjU|B zf?Qea!y>oK_i=K4LH7L0M|_V@y{~L#pQ7U5zZxpmgYWtX^*^uJ zq)l?jH~C`VJW0O&%{ca1tn7C)kac^WVxN=TnDD%ua?_9HJuesBtWlM6QPrH-!pd)> zo!E+~LZ3PxC$?m2VdVW33;Xxf!pgsrEbQ!53KxY&c5N+%n*}W3*DCkT0+wevYbnqo z7vgA>$M7$|1WkZ3U{Y9Jy`q;q9XjEs}$_pXA6I0~Xp-9T&s z5yXi?5HmSphVnX2>;yram<&SU#C;G~II$GUzjMNy`|$wrGWWxY3hsv!uG|kNin$+7 zJjwlVq8*BH#Y33EX51q`zK+;%j}knEBzAu@-SQL?*uWZ!_7XzG&!O0Mme7$o-Jk+5 z!B6}GjC&UZH=%~^dkN9vJmC3{iX6v#3t6miGc|g{!S~lGp*tKT&q0HChlA5KRNh@k zVb5UiF$KY91Fbb;nQB?K?)r~@xmrYmlM+@NsyBtY%V~`)N#!$*wN6q*z zsAMcOU8XBZ;{-o}y@H9Jfi|)G>iz}Y3P(-1#E|EBnA*pY>lYL|9(inD48=x3Av%V# zB7}VQ_C^YsfHvE|krMbhcO&IYz?67tBRNk*8B&2Kg1>$vRr2%djY{K0)JqJ0933_V zGtf@#- zp;o^C6O<5zSQ8(m#wb*;-J?|WDD;IVsOC}dyFE$?(=cl7l{rvNMbj{9?eleaHCd*E zVQ&YynnIScE=uBb;R%6#@+4I~Cd3L~(a;&fR`&QEDw!dqv#D1oJR0Tr^=Y~vjXL+g zLh&;l(}1O#N@k(}^P?#;#+pxVc%jZeT%oKOwBpogs*G{WJXf!f&n)2 zun}-E2O9Pvv*8N4%|)>48B{ZyISkT8SEzh0O0&6&lIFp}UYD^~sB#`k(c)=}jYSs- zPg6!LlG9J?DQ5<9#>U&^Hyq5{sa=ZDfNy3ZM2Fi|IeQI!(15LY=dZYQqb z*wD*(f^I#ICOH2XRX%|s$Y-{yIk$?O7h&i~QG(ufq-j7j1Co~;T?`n4(x=iWI;IZ9fRIK(Y-=BVr$49ir(oK5IyF88Q@fz(a|&4nL6_;2v`WYl6Rk~@zmR-Z z3svm9Y1FtH2KGdi1cNnbBCjdbxCRDkR)ZM}sbH;8WzNQZAJs=-A# zwDB{gF%|iMg+EGeo2{Da#q-i<6ulWiHccYue_`BjSW6}U0)ApGB|U>uOzA6G3p}S%7w%}^M0+Q$UIn=JVp6=SQpxJchF~A?w+>C zn!DAB`f;U}yua8ZENjsejx7e$UHafrp*y=bixT#tPg;(r#=Xb__L2T-r4s&zkS~a} zxESBtC#Va2nz~<@qH=Qg3#ZlEc_~6~+MX}CvuDC7KOZi*!IgZY!PWyJC_&PYrPVAOZx3D^&-DNTGd3BJN8b*U}5$Av(+J(Egws<3dY;2`IM!g&AqQtm4YNS_8R#V zJGT9gpHfCKMyNem)qYBK#kl(HOQ58q$W5=p@~BYLoKg3Es#G2moEbYefohIp%Ggb3 ze@dPw5VT|hMW2Ac-ocYTrK}T}4uhss`3WTUePhV41ZVfFl*P}zk(o+x75HNYg_pv? zH!~=u6n8Pd(1}uH*ekdel?u_qO=W1AuvlQZGbranbn}Zd$nPZF=2lbeNnB}Oucnlf zSa`RbK=)5N#-~px@FT2~qgIgHDP*HzE2!!euHb`bP~$1V&Gn$+j&WKXMP6oZH1ae$ z>dSD7K8@A*ju}*U8c}CoqLgw>VZNFzEyo&cdJMUp;mIa~!p}H{ZSx7GpFuWwax~pP zBY3)I8p6z2CP$jx#2auFS|M~CQRX0b$GxqwSo`9%j9}!iid8ZygdBnOj3B>H97}NI zV@mi0>-m_`O5mqLio*)`iI1uBET*vYXi7haCVyuO=vm!3y>W)_SEJ6k%P8lnP$bM(W_%%(itKq@t9+$y z%EL9n2!U-3RT6ICcEMcyC@y!I8_iwl=UQPEI}u6oUtu%{gi_^K==KwlO32r!cB*ls z;)D4Ap4oR<`Lzz?fG;=>SosYGewLN*`vzl+9irREmy=-6y3I**D^tfG)P z=0Nro)^c<3V>zFwUQW0?mQxMK_Ev6PPT_OSvF!2^-jhA3Vy^iywHv+WnWr$X$0%W* z*^f;gOF8q*4)gu$X{BZ!Zs%C{v2;JyQBrW40_U4c*vt^+{(N(Sz*c;VC7q*2+-b^R zU@l@ULnwA3%6MoDWi5167;&1a7Mk^OI(JK0Y4362 zKFzo-Ozk{yL30BsAlsltczb+DCvFQX*^$NMcL(?1d`54*gYo(IG^)9S8QpITIe+Ik zwvT)8+lqRP>{x#^_UY|3{3zfSXis*D5&Q zghoF_b$2nZ?!{AJ9W4E5Q=KrLtsYG!{wzdXh@}g^7Z&~|k9)!yh80y!0Q2jdIZt0F zR7b7Tmo%_mSj_I6q>Mo@x2+R}kLYf_kjl2jQ^HReoTVqJ<|kw^`z7+VkH~K@D`2zY zsb(-sU>{zh$RW((D!ue0D)|N3)jwYG8_MzptbecnCWJPx4!giZ5Q}HYqbTP-Drmo_ zkUpZC`&dGCN11*{%n_)Px({&^g&4;2*}g@T(SY{OSwtlbXo{adq{iVWJYS}TPDgv6 zRAT?Yd}PxXY5NjW7HRtu;}=nE9WsC3hmR*sUT zWmM7%59zoLr z?=+@-kAIC;KV*q4wX_)JJ!e=f|VRsW)avG5Rb7yJP;F1 zH65U8U(pAbl4nQM_I8j`8O_^c+FalGlx<^A4Imd#@ENGZV3x)?vv`{ zd=JB6Q={@YWh`YO^tmr{Ve3DqTfQuWeb9@1`l9L|U8bzQESN1pxAWIhWix*u<% zp_JYa6LR}CrLrHZ5?Ea|R?^%+pe#-#jf9`p(l*;pU@S zD%@gq%*GtkQeo?PS}L^Q%v0eTpJ=JD$5Aa6J~d3A3i$;ml=(OBt^9h_nhA#w(`Q0f zew1pOu+?cxh1bVxsj%fRLn@@BS}OcA$eId23o@j_`A4->*y3SpD)hQ)OogsTwN!X~ zkd_MP2N_b~kHywhSW(@a3fumI3{$LS!bO7&nebS+mI-eM8ZzOUVrwQm5opMS6N|M> z_)CBx6GntS}MFc z)S3#5L8z(lB}{EyD)dyeR9N9}O@)K|YpE~@lbi2Q*+BC6|zERf)@<-(>RS}wE? zqU}XmF03D7$c3AVthw-mAzChcZ-|x)AHuyj&xL=)Xu0qgZ29tBcsEANg*RffTzC$c z=fE@AP3GqhW30LG^MP6}JcUa%&xJPz>T@Cc1U=A$#Wv5%Iqz%9@a2J8GW=JVAsG&S zUrUBE6nHY6Gf+#0lftxQ7(Y-;h64v`$u@;Ua;cX}31q=GonlXZBQ z%AaE;Vki7oiRUZWH~pz@0XFgvAgSDYo^>>DE^KO|yhlWD*?WvHMZLgAx`r9(u(QD1T+oOkr4Xkr;+p5~$}v24~)%o}CW{6rf3>@B9O zY*rvv;8#pUw5s#4J9e^;4-~d!6cz1c%SVk-3$or@d&t8bk1iMf=i&y=^m#6<@4UoN ztDG;#aTf;pSNpc9EA<28&Mlgk_y|4z8tapa41i;XDM&pl_?J5z=rTaX>!Z|@YJT|e z3NMb@WWRpbBQg8|`S(j6$5SY1qff^6_eh-bfc%S*N8jhn#L$u19*K`>@>GWa)BgN! z7w5JfQv8WW;v7xELEi7@(aSjVX3LekJQDGg3=YQvCiWYM`%RN+&HHWM@de)QAVJUqH@=cL?J+>ws&Vot2WpUQW! zUP1-^u#0tPrT*l+8_Ol3A0_N&p3Hv$W$b2wv@w^txWu84)*tZIp20cj-9$Hcvtjf( z7q!CEJ?jq)vx)+mXk-pV1M-+lr@vHDgjE!#o+Z--`e8R4M9)H_?Mn4Aq8O`26#bCH zhSN1}dqb5hu}b2sw#PKv$z~SeGeSGs7kh3C23X% z`!okPq0zQn)yTGLWYVNO*pA!_+v%;j*Mn9`p4B!(vwdYR^AVn*5B9R|oksd|#R{up znN@M4^2=WKj?kqEQ-<$r8lTBK7)B-g*nM@rD*M?umN$wT_p@l%8!#wcz`IGC@q-nL z&u2alOv&ZAA{=WYx#U5ekxFTvig3H+8BJz8Oxv_VPl<;?0kl`j;>H)zJTbmvY|2m7;H3a(*9|lxReHpQSe|q`gax?>m<5 zi2@2Q!WDC08}14}eHO9TRCVj6oo5}qR3;|131@8DLTfSk=M~+ z>O&7N9l~xg?&<9CfCl_L;6cgSlh%!Dw>(skY<0t4}pI(&pDejAU6jI5jxKDBKMV7Nz zDSeLB-C1;3d0UD-he3F)C*3;7JYAO*+0__+Mwm8Rk0JbyD%SArKN-=UX4jzl!}RJar^{T~?pKdO&BlubgxJpRabdW7+ow%NOUNDl@-i!K_0MD)13| zQ1O?n1N-|RRes4LAE-cHsBYK3hjG{5*rL<0+k6dsQ}z*%_P>mP(P7khjk$@zTEljw zhp)5Q;w+#Y*O4aQ8A4UpktU6CT7^?c4aWQnLnx^R%Pph)k8xC4^IsaiEgByBtn*|F zzkxJ++|cm-d?@9H*6?)x2AlGL!q`iuy{d|?ezr{q@ zbyZ3KmL=f_N*|^17Q?eW&pjb2EAOyHf^eH&{D}=D_B}G<2NS98C)S0czGp+2ZwaM; z5949)Q~CESOHGLLe?UU?e4CPfK!&t$_PuvNDgS|G2oGGX$HQ+? z)z6OQsK_UuU(nmetM27Mtr*9DK`}ggQ{^v6i}`$PwGum1)URwTn{$S;enqgy@iW@5 z$Tfd{KuN!0fb>15l>CMnDjr9Jb!uS2g1PbrZUbWeU~}205mfXC^2;B`$?_kT(FG;L zg-tuw?<@P8Q+)Xz^d=Sj$FZR2_EY13{!2l>Koa>A8Lek8%KsB(tU?*v{)G_YedH$K2Cm3 z807W_eeED+H93|uU_aezVw0$^i`Y}FLt&=6h%d5E-{FZ!F_v8&Pa*BZbT+=8%G-(I zY~nq|*;T}QDaQ8yVu;rM+uMsStY=Rpr@e?F*u*Q>5&q(8HGiY5{xWZC{^VQ#gTK*^ z{$A*z#JY=k2BdfZm2?*4*_fZnr;C`tCI={4UBnE==7y7xhgiqn2q!mB(N8R!hrrgm zpZ>xq%J38;**RQn_<4OH`FV*+?6E@1_Y(0s5w7LxV}f1YpbT$VcLt->TkOc%y+L?L zIE5|mPSM?QpV)(6_4xyQf9zGVx{J{Q8{VDjdO%|LQNEY_dWuCXu`Au`DF(9k-O00; zqe9+ZCAJqz!9MinS=qrfa<5Y7!<}Y$Q@AfA_HuOHOX%B^&FZzjX z>`bx!F-Yv?DB42>{l#cj^A1@Cpa;*rLmB*>{|>ng6cd`4C&_y#XCNwVU%;%~L$^4? z9zA{!`S~IGCtj4`C3v<9Yiw$A$K(C>70%2(l<$XbIO3(|aPCi4?ShgCPH|3$6 zX-CbyXxC6Nj_vGEjYGu;FGbyhDLzmPVIR3uexO*w-twgQAOyD6mj&ffeh|jxfA-=T zNhsbQEk}0jLW#q~A+F{E{o_{O_oJd=qM!M%Lx>#}C3Itd^drk~OtMFOmB`^3?#+HL zn_fw4M5Enw@j_jP6EHj~4$$XM2h+)Ow8Q#6EJP$O$Oz!fx7Rwd>#8t=yU*I-6N_ zS8ZHYV3W)%66s{oZY3~M#Fl@@0^Y3MXyH`xBzw6l)%_-V(%2}`MI40;voadGp1bjM zCdP1TS1O4@ojN_4>7L;peQd-yhMC6I0{ zGS`@Q-*0M?(^}0^x-T{t3a<4Ii*IgK6R6x;VonlV%M5};fl9(MbENQawL!25dv~SU zHkkGvt3kdgP^o*;94N3UBNd+&<`9AP9!c>D<}6nH8#N}FeOT@Q@>z*<=1A=9;=J`Y zN?K{IVYeTl=tOgYE2>~!IcaOA67<9;QXrfB8=maM14B-D@0-65TsoM)4_w69laJt4 z;3WF@8gl@PeuTddT)EBhKHpCC^RZAOD3aH<@GEkzdF!#T@^@KpfgZ z8;HCMrk?#D2IAe0wt@IhJN6oO-}$C=Mn|elHCKvl;_>`j8lFFy)m9sbox$J(kp^rw zC%bMlwBGi?O3`Kv1Xm}6V2+PA3=29?Wx6?^ZT*>&wwgWJGe0X?ThUOic?N@%598rY zGk&K1{U<8fj)wRF=L~Z^tFhwGej?8oflpiU(Vytni|B*5tT@N2|B@ANvFayV@$#Q2 zG86Xmt$6xRRC5m{3;Bssvds7{z)w_JZ%%OP^HWokWV+U*Tzk!&Ca_gO6uS#%i-NG1 ziSZN{M0NZ;Cy3m3;~X7CA-hrBV_hg`w>gqsX-##z;qHTa3e17LsGeeT@Lu|#Sg$xf z=sdrP(sRu5=6&_J@_J{P=d$d2ip+)O-qw_rYfdt!*(Gc0DIpKKi|w2_@V*C}NIPeA zJvDO9P#dRRUr>$_FVmJB^J3PeUI}@_oGu89DEQyNG5A?-KVE#FPUrq@?juCfrv2vm z?A^{(vmezt--`V5QK-UuRCfr~DY%DyK~yLIZ#Z|@N1WM6k#8aVu6wrXWZt8U1Lkny zHJWnRyw03#7c9R=1qY!z-_Ds1=SRQ^w{hBy0OjcZ7EO5zW$ll*fZjDvQiQk7j|eOY z+b{n{*DS@|3~Ioh!1l|(ah^YvQud=uutHMnP}@?g!>Ky04yAQ!9oi{>>4Pj$gP0H1 z*{ZOoPOSoayCp>)Mvpvamu#xj>X2yXJOSst4l`{W*GZrp>+t(uY7?=MbqXrsBQSXg zMHgZOKRbjf3sH}CLn!b)a{^mBg!11rr?Yzxk>C5~cwrK~`o4Lk5UfZ=I0!*8B0Y5*9Eew8Mc$XTB%_(frLzHq93G#!%P%vUvy6xm||cpB6k?s~ys zc444qR_(2nTt-{4`QItw)#eW-qHShRSJN(iqMzMYNxx<; zVeQ-v0+TZ1hWWP0viy{gZ_r>Yr8AX$Yo17H6=pLn|H16S_T8qGAJB#`-NsI!p`{oo;Ok0fg8vjT^^b$$^NWp#B@sAXo1?C?q=(z+6{F?;QQe5xB_y88_M+!DT zgMXwT1Qz@w1>R8LA1OEs1@$8ZyP?28Qt%`g{38Woz;229@NW)G2S@!ZK^6%0vjoea z%Rfs{1BUupg15oopCxFE`08f~eg=bomLLcW^|J(>5RZSB;3=4>pCy&(&=d<`fX8_$xoiA}mmegh;QT5gfbSOh=| zDS?f+NjWW~B-Z~Xxj6xQ+@y3T$**hnZvFUp-$UD+O+(!CPEtp435eTH()+CT8_Ib| z%3zh>-~k3HUo_!S{VOe{-s%m0Q%h-_c<^mAh5jH7rH!qm0G9KOQqW4eFR=CBP<|VP zUiJ-nI!hsJ;WrfPELC-_UxXW1>#?DW_QMh1LGkW}7HumH6l0Eyl-d@KkDv@^+DeC* z*Ef{pB6*6%OVM!dQg1r$BDshsfX=%}`wbqoZywk@?r3NASlSL{K6qH9^PMFRGP_Cv zVpI;Ehj*3k8XRc9N7)>NwzoQ1*&YrWy5c2G&Pju(`CX;HRNr3eCDx;)ojORD#XPvY z*MT<*C2mrrSO!MhPSOn3>*7xE8i1-(Cuu+P z`IAfxx@xu4%3c_0W z)3)LcrMcbEpuEg0yP?e6@sOad%mcYXYl`!bUSTW0qWd0FJX`n`#d=CUY~ELt?uq`L z@fDSOO5tqsSLEy^WwGI3VQ&XG;47;0lA>GphSSnjTE}M*>tOEAA4TjXjii0v(gpTy zEjjnb@ZHs2N@L&Gl4lS22D7F&VpZ2tK@TaGorO|QjHwe={7x;U^pSch5A~8ntX5PP z`D~rl8d$YnWYwNkOZh&qo@m7(wF<1$1@_AgZR!l@i`Wf#hqkZeWB!HjK$g`C9q7lt zQZoArY+i)RH>hr))I+(`Pa2DTBGodV$(j+zjRP=SHd?h4Rqa@Dz%mSOKa7i0D=>ik zq+qdEBIc1FI%C6==u3YPiSzKA6DNi)N6&HM5_A+!M6Sfp@kcj%K-nt*L=AMNa>6AR z%AD|j3Q2?$Z$tS8Cw3rc+d&{cgjFafHY6ZfapFG^<#J*N{G8{+W6)_Dgdx5JCG7Js zIPr)+lM{b~*vg4Fd3iXo8L@72;u*y1G#JE>AjWgzB0R6-L|b@1z=`_^dSx&?KMqk7 zCtgFWK0`qGLNs-VeBbIv>zV=*U=gV@T6AK>`_CziqU8BT=3^KDK9!gGs25YynN4=3(`7|)3d=!?Z5 zx-NaHIZ;X`A9eWhpZ?>Zkjpha;kJ|$&TxB!6Yql4#EG{N+A9deHHbnv;ROHlIZ*;4 zl@seg@^Z?O^6R(08&xtqCZi_k51tGR_VmU$_;KX=v z&TwKouO=r>fYV|)h(EyT!-*VJd^{(90kN19o46lN9O8aBaS0*LaAFFG+ry

V+O} z<1nBt9k9K9TpV)=D7jOfuKjEEo|3yrQ{I_Z%LFP5uG0?O%c8KqCJ8! z38LOWSWeXEp_79#8=^qm<3!pXbZH2Pdg!d=#1U8>4#6bIgU)SET!4;ODCaxS~9Rng0I^)M+64as*)^WlGq63@=gXqc_ zba)&uDkm}_>N6I^5pbq*q86NWoQUHgIAKEcGpY_a_c##+PN#7o%HS}R6D|-f=0qa= z?BGNm{3xmpI5#*^4^E44t^;L%PPo9&Oiq-6lgf!Wa1L-H3|8kkkqE2bIgtsD*LVAuKUUT$4dq-4&6xe@k!8}9 zu3}oVrUDH-Xzfun{q|F z%X#dI(zpVAaXm`zm53n25F{uO1M?I(D-%)Dzd@)=+iH~bN+JekE;ucoLSxi`z*S{j z*LA7-5+VPoU&wTaw;fOrw?k9)&#QZn+ujDJ(<;>FU4yNw)wThesZdbc_xvi!qa{na ztki9kQnWSg$`ok^d*m|3es6YDuBAu^1twlr($ge7Jj2(#2R2JX+0S@oWwR8`&V8=x z(d2(g4XSkfGtv~c=W~KTd{pEa$;G-*eirPftjYtnNM&4Exwi$Ox*l=pAijU+X7QJlgcqe6L5w>fDN}b~ z;l@fo*(Spm3Ng6dM%WtO^&PaDyw{F(|lL6-=l_ z+nrEwH`Jn~RiPHcClm@|1BjVBrQg^m7nR7@BL zN$*M}YC;MsbWBKT2PGx9P--KHClToId(w=qaR-|Rkz;DQ2?aGZg&jmmcxt-vY_q0g zYP$L?oW3u0WMTzW6$NFjMw})^`b`k?z(P(PP65aGT@cXtW72-nc?H@TT4;-28a%qLdS)N;T&HOEy_>? zyI&`RU*9)z_gp3om00XqDmaadIq9snxA8=|G)&A!*xYg{m`yvY)RZG3u^v$43D)zh zl2Rds2x2`{Nf3PE+MN70%!guC>Pt5y&*b$2{S-v-r{p4&+VU3$mdd4SGYk=)(+mOc(Pc{ z?r|`^_c;<~IutKUv0@yY=3Yi|Yq9uMF2m`Bttjqg#Cs2fe-()1D8XV*ShhjA3jMMg zqVt@10iq^O+y~)*1;llT=5t~mh#j2R3!;=0%b;^l)dAsE4Ng6RPUS=&=%jL@Cqf*q zM*UBMbDk4RP{MoFDB<(qw73e+M40#CL^+7@oY)0oF(+C;XDcV_K^)*jdpJD9iAr#8 zbK)`X=L-;7Ao_4(4)?=}OWY494uaUqiO$>)h_2alnp;#dbyb^|-!ue6;Re@S0-}i% z@4(jUOAzZpgmU705c4_lCv;Ld;mKR_OZ094h~K}I=80wKndTXF0qDRr$nSt?x+aZd zTRzr)&bbDI`Pb1I?r%F9_`WSEx35coGxmE0-Kxd)v&F|0@)hp0Z&ctRDO|9Axv02( zEtLx_8?QWnBZaH3``naP^ml%)xoZ5ItAqJq!Qv$B?Pk6@brGZVCK3;Gtx%lrNRfg# z>p7I>J82Q#dPXm`v~;H0@1$2mGtj#4F_>@(C500QQCf9pss7*U&eA-w*v2`cae|dz zKT6wJdsD1FDlnDS;gaJhXq&E$ZFl}4JQVIdpuk5w4qWiLg5q^g`difd=37=U_5a1_ zJB{1G^ndg{)2hG=3g0_^k@gGXk^)Hy`b`=qh!aui)cev}aV?17@1wygP}lLlqnG)1 z&4J(1d&$@tyYV|Zcmi~S8lbcJc}dyYAYu0v6dm{jOV0+F_4yA{B!BRx=|9LE+-&@x zFmwMm2GF1I$hX*<{*<>CDedxF3i+x`dT&L&BVwGx9n$P zGKQ&|x@sp_hKSp2C~6{5whfg{wEQJ*L(7&J#wm*9TerrJ|1PcqiP>`)R8@4nw8yYx&vF;HQnOPv|`M#^8KSRI8R~V{T_`j z;DrB73}8-_&a^DzgwiL5*K@3lNj2N@zDjJJ1EmUZI?crd;i4;ZE!gxxlXsejwjYM! z7dp@K&`9SMOB2@2U$Az~l9j8Lu31kDcUpS1may<&xM207=_^+(qP(3JZ?iWJ+3OhtSU~B z@FNT{y}q<`Y*lO(JUo+M@Gy8T!pYPtmX7^FsNYZE>TlwI{G6{ITW3lp{5)YlTx0lR z!P2oS2-6}fyAanRexu9}u25=JIE=dY)a0tdJ)=Us^;VnfyothjRikjjQ0%F9EN+reRjVZ@hb3Y4BI8mj`FUFW6`rX@;pUQtpH{tBF})MMh2 zBe}v3DDd{=$5o`f{u*flA4@fZ!b(fC!XB#!4-obc1nc%z4=zVU!)yiTzt7eH>(1-J zLakmE*0XK4+W2Kwew5Ww*D{{Oan!%3ovROP=LjgM4N_(m+(c=4gGga0m35d$S(Tev zt!fK2`-hjJN3WyyW0p40WV{4spUL3UR4Al6D)0uj4WcL*_T)vg9!D@Ckp1k(YRKE! zk;(Kdu&r}AdkZi&W$ec;gM2qI=1Zzw;r|-o2y&FS-P&ZbI<#~CnZM@vrngZdj1T+q z4zP7Os`5Sp=BdDT{IdWyZIkI+*kilJeyAfaXfE~xoUIRXr3Wj5o-T`(jK%2FaX`n-Z5x{s8(|#-k?qf$LQzo!u0S+7NuK_!D zQEIy+eV+sak8*IB0_@m_hk+k)kbe*C*oA%9HDBkr+5%u)MC`{Kz~Od;`Trdlj(zTt zESc~X8T&B@c$^*K+5z0x0e=i^OIn<5SudFa9poc{9SgVtxVb{9Cey#caIDd7;E4_n z20g7Gbkl$xyDSOVu|T=Nj$L>P*l~>1Iocz>$#sL?AP9K4Lje+j9RutHcI?ASV8>Z; z57^7W-g%>>{y`QSD{)41=H&5BAy5dlNpao;?CF4C2X+i_+#vq~*s%+pH|bk+0gv-&PR zo>C3`-qN<^AhT*b8o!jRyorl!F_&v=$=U&$%z<^V-vg|){tvJ+by|b42yOkKQWOI5 zquG1UYO9@hTJwVPXQGO*j9j(Vd!|pmY!*DP#)oZzHQGVfUt+Xh$7e)N?hRv z6g(UijzYnko8!2XWFKg0Ae&j;ui++ft(`;uxbx{^)wqjjj!P@^7L15HSnpSCaZGLa zQ&zyXQSk(8j>-*6VIcAFF4PV;i{000u^deXU@d9OJM~HA`K86JRfDw*+=c&laN+Wt z*}6)8$a-t)@*LHDVR3ulmNxlKZ2*SBf**0#vu%-VSne;Xg=rH3k$T|lLIPU1wbjT3juY|r?qcP{;#(fw zG;Q_Yr}?h$_m++<8E*-pW}~a$(wwEet(_xswewdnbX-sU?BIwGI$OaLbG61iXtf)K z?O6XGEFH&fdrlvDA8>bvlAJbRkLR0jez=-Ha2NGUlq+)$~V4?thrb2pimLfQC#Es?W_`JuZuM z#8?-_@rybRo5Q#`720vK0S{ZOmq!_JngM4UaNcqUd%iBa@I8y_<^9;Dcfa?v|J;fT&7C*+u(D)|nrv6Ibr`kq+g+ZagfL)684!jN6y;v{LJgUb5$MrZRTf)*2LC zPUsDM4S1LV*BkJ#QoVh)0pC&aq~>|=UZyt)FyJr)ZZKdc8veV*E4BEf-pw5YHhrX* zyBKhV0Vkf)>t8Tn@6$SYswqm(FfB3QWCIQ;*Euj%oY7<73O!CX;3GPWHNDHndV@IH z$s6XNfn99CiJ$1r5XnkGvFfzd`FK{O%auP2iXQ(VZgNpTyMY!&+Gjiyr9R) z7acKXdZvzHGDUsnsDLkO7_jM*UOvo#GYz=bfL%U!ut$88uOkC^m;u)taCVi01CYh| z3zPh?C5?cVdK_WEF%Fo=H)Xcc8(c78r`CFTm;ommaGn8QFkn*~yFWF)$-9}s%VP>N z;5Y+LGvGV}E;Ha-12#F^3ZTU|dD|Ikd{dYK#~E;%0p}TTnE}@taGr~`0M_`XJ2r+E z-xSl%Rzi(Y?5f9!ZhCyjfR}XA%bhyw@xd+{?ra-0F2cIBM~v>N z2ytX!c82Ql!7+N=V89V$_3|STdc19d9=lI;z!G}jX$o~|vUqkci*yixA2Usl^Jqd7 zdMseNo?ZQz9-E@|IC+j9*BkLXz1%lWkBb-TaH=WbaUH|t{)8R}EYjn=cs(xWTWP%B z>c9BsNj<)>LXQ*q&KeF)A3c_>W0*|IiH-{RxzT_lR_Wyde51|o5O>3=dYo;*6`LL8 zd_w#F%Ygx$Y`_N%xXger81S}d^#0udqppA zcvX*Mvh?_%0Vk4OuEsajHZyp9Q&_fLLB*K{TxP)427JeW^LFa}g}rXWT71*Nd>ccJ zXL35A$1w)%dr&V=dsB~V4Y=%Wz1*e1immZY+iVOizRCAJy@7X;9#<%OoLsEO-hAT} zhpo>e3^>k;?Y9nz28C?~9QT3VVc7{it}oH!%n$Xr!GM!LQsvFJ4gsh12FV6oZ@?GI z_4>sXdVJ?&J-$$-$9GhW_O~^W>55*#-GBoOIKqJ4tM&G22Ap_RFL(a}nD@V}0Eu7f z6>6{RvC9oT4){usvkf@;YrWj}8$C|DDQJ%r*a~prmR_OawjMX!(PO9Y^|-=-U4GQd zv+wG$OT9p!N-f%?7T4i^Q? z7+P;>;g#ybm~K{Oi+UVk*5hnRk9}L{akT;aKBSi?x6xC-5oIot9K7a2EI9Dz;S)_^7_7dZ0fJaWd`gtP%qE)bHLQmsYUzL zBZC}R=#Jut^*CUN9#;hFalZ5l<<$4(e5 zPGj`!%&~eLHcpQ-!}ZuZLXR&Pu=hm0JaMuPr<&@g>KLZ7X?mRYm>xG6aOOO{+$mO% zBj)RI#X?7n!Q%e7BLiRdHQ)gLJDWqpB`?$CY6JFtQZJ7&;6z8vGi#b712}QH-a)ki zC$G@UO>6YH!GMRY)ypreZ^k^n$^GeO2FC##^f=joGYvTGS-pP57Cp{1VDEIhT#avv zdd|+^@lAOddVI%#Ghf!r-Cxn;| z-L02LmN`_8~pKV8C|_xWRyZ3-tC*MH;rRth}uZTY4B~z)=RA zX234|eH9!w`>0|)PBUQNqpG}lWwlLX*d0_Gu+uTULvI5PFyK1|eB=YYeYJ|w{;mFnejrSyE;7M`iK27ZG9JC*6} z$_)6zFX232t91I|jGvGT0eB^7r{=u7ioOrt# z^Z2IPyUh%aee3ktrCyI?4A}iAz5K|}dR+U99w*+n;~*Z-*a}U z^!P$sJ$84|<2XG|HC5{wrrLITgMjvWe8+$r-1PE@PI{ba!0!Ar2RO7WhOw}uvm*lw zPY*q=_tN7uZ#`}>;NtFjc?7-((HszgeH<_!i!OZ}7{K-Y^f;`)9tZgAai#&+8n8=% zUfA*K0AC=`o^!ZV zIEF&xoPr@KVnR_5R(TmU#0o@}%$GqpJz0xBhU%S$KB0$lRW$FP6<-p8T5zw}uts7{s z$Xjyn_t<_zw*G*5w{||iTGjzQpK||*9U`*(9OlCmy(RZw#=Kp*m|q1|AfI1t$n95f z0E_I9L-K~K{!xxs&aVb0P|UAv@`4p{AxmW$pLvqj>#Fh`&zjG|K)wH;}6}w=I`DwKTNr=n{^e-n3H>NV%{OI z$a2*}K9Kq0%p!Z}nTjwVmk8qkL$X8OAt&VSp*Y?cEGJ_Q0r}yIoRJ4_!2ze_kQ|dc zhc)`^%`j>P#2$G?PRael8v{yzn;ekW4dmPvwj>#@LB(KRSx!bD7FWyhE z>VTeKP00)Ls^y=nH*dRL4V3pAkSAo1yhGlQGjeYi%qM^PhXLh~19C*(k~_O$0yQMt zV7+-EAiva+W3t+V6ZFYrvP%w|)|+SD42V;5_eh-3B2UQ+@`{`^oNwOtQ8>YXJlTu+ z@jKB|vP;g$qtmPY`TWYR1NkQGzpHAH+agcMJLHJ$yc@@xS1#sPQ5DGNQ=RuIHz#+c}Djm*uWa0gLBbK^5}fb z+vM;9%v%@cKCgOfVp0SuJLEYzB(E;?51uS9Xj_V_i*VvDc|abKZL&*VpyjF=45+q^ z3z(3tiz$C8IwU9L-shX`WkXFMAb;6Qj>s9gKWz>uh`PSbir$IXDa_XQjmPjyyE)`}d3CD!K`kbyWK~{aYT8f8 z4qD!7!GMa%DY<H&3skGv+UZ&vN|`Bk?L=>BR* zo{*R1Em>V#O^}agktdal`BmSi4&;>F4zT@*?2%XG)VQ2q^{&GK$7GMZBq!v~K^)H_ zJEg1djUhGIkk$1#V2^B(CuEl#6s|w(Ur~dYoRPaX;DUza3E3qFx#jqqSE>~?h{+kb zdm}DjKpvAF@ITt_q*sVS$z-l z9rE&a%y;iNtl0l%0qZ-kLHkbhh`b=DoN48 zybXhS7KLQ>Yi#fQsdoPS+i3*!_sihVbp!2`te(fbO%7kcy!ChV@LK<=iPcgg81n9p8EyKfkm$1HxsKX|JAVl{u$B=ULHmfTbNLZ$j8dvXZ6eHeO5 z4#^wzhveoVI6%-sN8~Me?mvHO>x@~}#%{x1=rK9lgZb%^=$PC&8uK1neyTqP8)W46 zTQTpF=f`3`V;_h4>E5P4EAI`ytr?JKIl0rtyhk3LKzVZKM1Oa`wa<6^tlVfs9ZU=Y-dgNil`HR@N5zsFYQ?f@6$RT-2UXwSqkI?g}t^er* z@(aDX4j0}b56C03O?Jp0d4ZPqhA^Naa!gLh8M$*1A5focf#qDt-DUCvVxB!yvPTZc zA$dhM<)zK|aWk*?f+M3j*&(}Rk36qj%&!(zAfHDC z3vJJB3cDJ%*T1ULG( z9cb-4Gotv0oRCxhUj4Gtxe15skq2apETunTIX2lLd+3>3U_gcBB{?E*$O$jYA?wfIJ{u z}l#9vnfN?2tX< za(=Zifnt6Yl9%L&ydfv#l&rp8EVz1~P>TD(Bj}N(<{#uOvef&7yiIn;b%1LVkJD(9$BhPLf#^e$u`*`d+3=8FrY&6io7AmG&98t&DL@# zZ)z2qywoU!{-#u+$!{ocDixM_*~MjLLers3mO_j$fvLx6+S`SU>E2hF4=A9&*LdS7e*nJ$GrazGCK)1=!WYybW7WhPbi zU{F&y&ph7V_c1Sp^q{>d;Ah%TC@%&5puM>}Z`odctfB@1c}ZT8Bl4QOA;(~OMkNr? zzs6p!4@~BwOSO*(SSW4=pb>7*HX3MUKc)Bo2=JmaJ~ad>bs!lnw;srH9-n zn}TrFR-n91mcmf5Kq(DXTYtZi>QHq+{%?o8BFE${IU{%O!122c>-kl`5zroyr4E@6 zSKk;NvP<^JQt%4;ODQtre10Y6%1j{tDs{=g30Z2BL0;X7milCn?~$b*S(z{9S5_6s z<7!N{$x@FDCh*7$a!6hpm-DO01d939hMbU7vQ#^R1xe8}uoU6~ONFl7r<+|Yh5Mj^ z6pjNAZaU1r`l8lJv!$EI^E;vIH}NM=qgT(NlfR(t7ty1=#f?<-oz?Yt*?H*k72ugl zeh2~8`xUzV5_)iIaXG7*Kn>7~OVMe0`M+u3UpDh{!qS(T0eM=yicU@}{zlsjF#agI z_le@e50f93pC21r?S(=vj127KA{qp_*CLfho#~Tmz)$sDq zcv@a$Zrm-eG1s2u+hT(qlJc5w(;+Ia`8Hma*KixhgH}U7k?gNVb75hZZNtWxuRQO<5|mKm&hsSP0XxfGFKj#gE>xJV@Ns9f8nh`e=FPH;^lSf<&vj8!prjVHa{m0P<0 z`vxDbl|#Dn25Id}N2<2pX(k(|>vkF0O33N%cYcpIGwyF1ct-26^Cp*(dB>DO$eiJISxIy}jLv!dTZ` zqoFd=P@>ToOKaMx3>ix*+u@X1ni8kS@sS*oWu>WS7WU0G8CqEhn*Po+$7!;r<%5p~ zm<$(e=_h};2GjIchc~;J3|DOFhkiXjkfzTIxc{W=zIC{_^a3_zDHctZv(Q;HS{~>B z9Q-udxko>W*W3eGsQd&kWN8$I>*Zm6e5djuW%O{RU^Rou08JMRt%w^<(W4?rKVu&m z6xxw`q*x418oyGZ(aeEuMB8U#s$j^wf+1@uLoBJH!E}LLHw3KFm^N~ROa_jSDYzcq zxJmqB`DNnTYt1fNGgs8im&Xkp5#mJ%(*SdkF5|KUeSw|#$zXonk5S?$P zz~~Ku(PE0xo@@?xUnZDFYe#xeigAQX9E53FayvZr1R3<8aZfTUXo})oGUahDQSQ)> zNykHHri~DAZyr~;xw1E}w@N4K2lD!+G>v>_ps&;{-yC?5^x7p?3<@Oe6>{^SG;L^s zi#&6%7l|sA+k!{S1%vM=U3bZs21k+Mg>qP6i1zKBF7jhTyvV>pIU_KOd~cCmh9qfI zQH{}5QYdE)2_rWP`7#sawsgVX|9H@t|9w8+)N z-^GDA*<9=}DtcIuGo|ICD}|`8)iYKpoo`$#IAo~j<<<&L8N_H>%QceV~PtC zrcZDfRHtnfIu0uPAnY)xir@4cl8Y47?cptU!5NBqvj|2yux!B8;;UtwV#@`Zl7pfoWkD4Hye;(bN5s86CT+Muv{Uc{G` zGnUlL-9v|X4q!3$hzx!O)t#=>XndoX0!w8;j3wzTbk-=Nk)v!93^xT=!W*)7sQbYJ zS}9Xh%5LA$UpvB3!V9ko6uqYFAlKx2yZnctkz^M$<$46=4V7!(SEzE8ddkNJEG2vP zGu=9-nCaGGSORtH`gf~*!gLb3zMEzaqOp}-GW}1B0PNvEG zj(Al2MVX7dVZ^f}akuOi63e1XLspO%cFN5mdF0y5a>~dI^701x(#Tly%*%3AXdv<2 zEvJOWl5RWYhR_NUe?(5ZEs(?=k&AAd--QYooe0~<#>K!805%^t7Lu^T#_V%JZs``k8}t9gwt8h#A*^QiX=vk?^NVc zrR+8-CP4R&M&qpE1{oEwo%J-1=;4RP->;WjB14Gh8*)XYPP=o53mo{s$%`C2EN4v8 zk@7fy;pojv?M?^vMm zwW^5dEEnyRJZ!g^wp&xx5)&v%&r~_j+A0xay_|Pn8ChIk6>)!v6VcRHrNjmj5>hFL z%-voUJa4SlOmRTWFCC1QCC+uSVw z@`!5sEgEzdSaEUmxpPmA_A9}dwJA5K-^y`>sEvj@|GO4BE#c~ zL+;sXxn)HX`S#7KsFVak;LWPC)L1R4-CvdPgieyC!qd-chmgGeRc))nBzbjO5Lvcg zE=mj0?!o4cr;X6Qhhck~m-aA*-fISscdF#DH6g(tt9gvP?M3OOMzRBsJzkS@)})b? zT-hZ(f+XcuMWyFS+FtoC@>j;Ywclen##qa>e&zlBoAH@7#PYu=%$M_vj-L3r{ku^W%H7wZyo5!lC%ts-v zXt4ORK%++qp~TfaH9$LPAa$Vk$3-IkOdn_=))N_Whl=l&z-ZW+|$jS22UX@X}?&u8TNEuKBP&+oI7CVbKEzFuzK z(!YmOj_EW_IP=4ed9rKH0#YL*0(H-EU8BPAXg;M67C)3F; zS4?*KVuq}$(mp>_BCqb1L*x*$e{WTS93qh>YgNwnFg-Ej`ec6_x%gUD!z-7x(xR$E z2Yt2r+){*8+$tc5iQkakCjazWsK@dGyC6^jh;W6LwGvzF!N_&e3~$E*8nj-$G@kO! zH~T6JR`WkCSm*9V46?YHW!#X-CX5M7hfua^)TT#f8(+lGDV!qn5*h@?z1eNFoN-?! z3!OC!Xw+tkm<-|agKy1~zqCf`8db!Y3^!PL(=xeRZLt2+Yzpdv0M#l$jn~NItAqN! zo~F^Pv|M3{b0j|s9v4mi?HYMTwYTqP93RGgJlCtMq`_f}W4S*oWqLAIuBsj)`O0Ui zZzIcIlijTSB{zAP_0BuKJw#iq7cJ2NM&laZq5C*;&KeJquEgEt!kWI}A2Muf1h$nd zv^U+A*C|P5>AnxMsAj^DZW`#}q}9uR)VR){!C03sAmsAUlFmZYN?{{y<285iKx0L~ zlsH8}4H)tp!?tccFF@_jI7yB@9HEUyI~)!llYW+$ybe;j{O9WveecYpd^yYs+*{6? zs_V9k2o}wyCn|I@Nmra=q9(-{d=dvBV}^TTV>jSLezyd z6UcuyRE5>zwB`u)vWpyYNO&_2&FF;ELHW-*Uq!V4(HG-N+su-`toO6Eo4Y}dc)O`n zv$!hyyJqM9Pt8`m$eP`M#7{e4kQ=r^c6&FeQ?t>3-)y)4so8}u$~o_q*_!+zOHOMT zXC73Kf`P*Af0~6}61NEJJbB+62Xk>V`eTRVXDMdmgsm}7VNqP{KFz+=&Ej#o1op%K z#;H7RjN@T^x*PjqoGReO@z5NfjyefHM#X~=#~X@I=LM`3BF&E$DrgQ5r-#NkNa!@rDX^)xwy!U3kcu}Q zXhzEkKKe=;S?H`Okqa9QxRRx9un#TzseJZ*J`!d&#rQa60>bfPI8ZDW$R8fvr`?48 ze&G0EsYZU`sP{;77Hx@Z8)FIA9L}0047{)C2x^kj@jYSm!-zp&?Nd02kG~(!hTq7> z8QvJ@_~2iP(p=W+J@SXg{Iv_PthLcrmc^HTFydd2lWlwCrVq+&NS9Njd-Y{VbMW0g zVZ@^nDyBQ>$n^tq&Zi+H4;`1Ewy;76kksw#t6G|4U5WLHs<5vDUCFDfs}jyrT|gJHKGt_7=|&ey zKGb!Up7_@y`1CGF=_XZ>9vR@%T}snl-sJ+&U7Dc%@dX$7th+Qu`w)KV)dRn5FLHsY zJ){xZ(Csd;hJGo+tiAM06lQ%!zx;t;y7ZI=XeG=VLciRNU#8M8tMJQG`sH2xvVne? zhlTgjFFo+f`}9jSemPIS48<~C-0({);xmMPxu3$JU$QA2`sE~rL%*a`IP}Xf3Wt9A zn8I+YSj9yY2`Drg)>m{X-nO{PZyA+|_zS{+Sr%7HU_$<`AOCj0< zOt|ch3I1onrMDET9e@cB^~QugXCbY(lt=dM1vd`_(c??V@IVmy0%W-d7C8SUGqP#I<7-l@?jT!fS30dA!1NpiPV)Rl7Ia3B1H2ky-e0oVfWIk&rLOT^J^y-Th z27C#DeQ|^3a2e$E#e!93P}^6EBCq}oP1mIU5MYpk$sb=pj6q7!dSk5v2ISSx+rXtC zmNu+|uzuLSjq*>-43e&E}gvrG|3Ki@EJJgCsmVD6BPL)Kcdz`v%k7(`xjPSfRx0mJT@8khQ5Hj zfmmaP$r>|A!o3z7h8w*K0+dTqdZruvkMj*^L%@7!ZHEdn^#OKze5DM#gGo+1F=iK`_RF6bhjYex)C@nF| zY|Xljk}%W^wWF}8O@h8T4Q->4+C-zZ`gSQwBEGAkZM2j_j%Ps57`tkSSV|yf zERt4O0vR;iQ34fXaX4%!0iSV*!xI=Ehv|=%Kno2YDY3eZN4m5nB`$D00)-_3J3c}^ zvgUpUu@iA*J-h}kO_T!3{Tm@;l9UFUBPBgqu?ET_Q9+FnnS)to4vAa?Zj+I;E^DA+ zGFH0&99)`=?R%_&jJr@+ZG?Q#3=Maou-YV`t{HSwFoE)O;(sNb)C>^;#9+;wA}y9k z{Wdsvx0E3H!QD~P22ye!nxdpEvhq`ior-8&EC!coBzMNAkQS{T{Xxyp6piiAc?uHl zQ7e+3%}{m^GVt!FpyeL5%DMR|giVvqkqyOGpL?YWi7Y@6)3Jn2T3+}R0%u@jO(tmR zLsX)<;Ztayf!LIuf~**N;lLCm(DH@3)`tv;TrTZiU`CvUX+=n&BKLH{4BV9+4YfO** z_Y|bj1e;d4cnWH1f=w%YeF|J2z=W@`3R9t{Pg!Fgka8rg{tLbvvVJ36n~f}Z?@4Hx zgVJXk&>5$|Cl;mV=4xw8EHaNY7J+V_6y@RfEt;faiAIftx3VB*9!j^W zb{^8zbG_AVJ{=mmCn5GhglyC6$3KC*2N7bIC!vXE*qW^W1l$%#3FPW3YYK)EdEW?4 z@#+$ppIF@zq*{q=z?_E=My3&560wAB7P<2ih)P7Ew63zYB~ln;jF9j!Dp{NGoj(c9 z4`WqdBe*TXsNCn07LX1E(6Ymt%zg7Cdfkev~q@-wNRGlEb4R`BpJU30v}fw{q+PSJ&vuc zS_wX@Q1Vw6LenaY&o6|m)reMfA?TjKFszWOA0K%43CW#=7DDqAIDP^OAu0_K=wE0} zOOv9sq-q`18j;y8X6rR0jvtD&^^T{d!Gzqi3KGmxU?=0X5dPYDeF~t$EL|d9&DNq! z6hx2p4hx3&S9NqAbt+(f0&><#|9(ZEvIWkqlghNe;taO+8EFE!mI6)BATOdGvu3TA zvYg0Mk6YcIlVS-YYw0HG1&LIoT3xoF3yXEn+*~Q1yqpTvxoB?uavZMZVvcPf=#D|c zHmv;`K=n2>32ln|mlF{6yjpSp_z_e;FBNt9bvf=ZYkr0gCrke1doyIn*b|x+;I`1unSQ48<#^hAP8FFJUCW> zd^9-!?eUP8H$q#!U>a-Sqn+5m?aQs_c1kf)pY`absawR?9(0M)_&Hjeh0-zUQLEQ3 z>9~^=4Br<^6Uhf>t$`LP%UO&56F5*NQ0lc8X`m?&?UjxxG)y25FN2hFl(OV!p{yJ^ z{SZ!k<*1yVIRjz))Esv^3Pt-+E^SJR9EG-hIO`N_hpd-SC;fyqUy@qvnzZ2qYs<@$ z8zDy?gG;aAK(SSQ>H`R=z(!wt43a7^!`7`UK7g_c90Ws*&|HBEz2FguIDp~Y(@;jk zeyEWuQTtyuL2M-g_}m0Jl~RN>3XWBxW<6$tOO;ZrG|+nYL20Q(c9@{zRqWh=#eLey($7DvetcnFnHhz#cr;lw@E1a8%m&Lh!b zRT!NGEr*B>rdMM}eY_l!s?kJv)&yt(k5@k4OX}J zDBUkFhl&O@jKvLbsR29s>m+N%`#9U!@f^|s&5cO+i%F340RoN2-t8c(h`7s9qoVwVW z^gR`+#z&yyoVvu?BXH>)_Rfs&q3pam<3^$%awv#B5^$65nz`+<$ zEY^qPkAPb+X^`UK><`jN?JQiw_qvFdzu^e@3?oxu*+nTp8UkA`N)v6ilSJVAi;|fX zZh?g1WIDY1BU+?wZ$r~?5(Yhfl3eW*$>;At$WLekEZ+hxKVc6KI0Z33tMzI5J5c>I z>Y&M6tRa_h#v%G6&=gAHTtPTC3u+$1xq_0i35VYmB-CbiPk9HLuV4d-Z$ri?toG)A zu-fm)bh=KL2Ey6@NPCHOGi2OOLde0*Q2h%s@;3PM7o^8#%Upfi8v9?AU6Qn!FWVEb z0$sMx-wd@spr-t)9&&y~t=|LLwzUuOB9^z|(yyrPBR2D8dpK6OhVw<(Cv@2!MKbGY z7y#kdrCp?SDKuZl5o$BPAAB2pZeW7V{J#HfYZ4|%NoB=pDK!0|7Kyj&!R=3!raKo} zoBu?E*XhA;+S|c>i8RPQ+EeQxtsUj*QsRyf5=OQq?ZCll&z@F)sEkn9-=HH)WcZ%O zAuxgvD}h8fhi(PdH@mfD4*BT`xTZz6_f3L8CoFF3w3Bt#BqxGK?d2tq=B&;suY+o5 zJYhOG5zr%7&6fTnyCAG5pMb0`2y5>WsP2L_Y?6^!XT8=1VL3gG&SE%`isUGHQW)Ib zmDG`{hpaB$kVRzd67-xQUAHfR*zO2KkrVP$E#!44ZKV4WYhDlHB9V)WtwlXam_&{& zhGsV`YLk_xYC+eFRFmHmtWCWrGY-!KU2l>@9$CznFG@-5{qK7tTZ$8)$b&SH+ZIC- zT^ZVB=;B*Y)(5c(Sj?Aushm`&##AZQCZ^NPfI2Isq2Z3k z%cTJ%$tJO6+nbQ$LlVe)3!uq|RFEwTxU1ml$GEGYzaP<)`~?u^hg^IJGyO;)naMJz zz+S_Rhuc~tHV@ds=Sh~zYc*TkYh8RrOI+T1cVUOs~=L08O8Og%|d+c zb*MlKiVS=fP;KHYJCbaa$ZxMx-5FsY0ApeBZDc7~o(MU&q3F>8Sho}zcI-BCfJ{0} zRc3_tHblQ}6e=~R*Qt^n4;x3LEf;hP)^3J=PGo}ddLeSG353S zA>1mHMj^R6->c0rFAL=s>hQMC+Q(nC;1Pnwd3nG5I6xP>6Zj+ z!UPh7^Kk-HL?ARv$D zQBhRMR>h+~3_;m)mRlijDk|9@=0a?=P_n)5K_wfp0+Q}QSdYd--aS~urbq`_KfQzJAUfwBgj$+mtGWA-wQUa7u?HW7q`6q)r3ayCF6!8J zGuN?~&0NR+fNNx%j{Vlmb?m2Ru49j2oa)xM&_zr`D>{Pb6CZ7t#@Q+zTeFnw*iUA6 z)Uo858mR715}5q-nt<$kjqBJfT3e-K)0R5u*au$YI(EZsu48A;<~nxbQk9OKKbz}V zf6Syhwl~WZI(GPMu48SS`WBB*`jaqwhkaf}eXZR0%Djljs~}@B4$$^v(6kt_rf&I> zOUMe+FbRs5phC-SLiZMik0HyFNG!RK3C&5UkxxEg)h#7xG5m1c>hcKf^7l_b#4_@o zITTlCxGk!j_3p#>wM}EiDU&{Ef#b(C_6Fa9?!))PO=GX{xTuH6lz4n#GAlpeHo8m9 zPu|l8l!LiO|5TQ4Eamm%7xcNwPkZ>I0}emNQr=K}AAZV6Ih<}Bn91|^aKz$AU*#L= zk{?T_kCHPQ^e zvZ+Lz2(ZY%AAelRVgT;?Hvmpd=(U9b5c}Yk(=e>N*(i=;{QrLvBa-6l$u5a-3G$~28ZT`fJ>uZG-9ZZ0e%w)h0vrq6g;HQY zX)zB$u};opeY6;(>Q25Lr=5Iag8Q(JebgrJf8Wm&k0@Yq{-I0bDQZ;k%t9ZB zd>2KM@#uw8j~x~mqOORi8ay2f{P4;DD9Mqj^q51Rza&RFVbZJdJ}SB5go&j_zIoho ziy9Mpm9w&nls7UVmG?FDHecy@Ldc5~X7uNZ$vB8Btfg3r3b1hw&-Ze=z`ht~iSph& z9MDB5DvVOaVN+DI1UzpZ#&;2V$~=oVVD#o;d>5gpI6RGUF4v$&JrCp4xuT-?BK)un zJpo5g3fU!upAhoWrZ5OA{kizfkw&t((Z8dHHXHx1sc5`xg&(SF@E@L`+RNj3a*6W9 z7;u7fn$TRz8E5)M-reZsS>qs2TTXNw6TXfGW}-ZKX?ie7&YHg-Sg8&`It{E*42XhF z2}Oo#Pd>1cF{&O|w_#j8u+H#-r#8s$X$Fuy^AU zJW}=CKKFiu+vNCvnY*5OC_H=OZj<6XAKvGPE%!{#9Pdi@htt;Gvz!nQ!1R} zaXd9Emp1n9)Rz~JckD}V$G+Up$Yy7{I_ZsL4wX9<*h=Tn|7D6imx7&~C2v0A-sdm7 z6nU9XPl5%fFkTi5UgopVq+I0*!*0P3Kc>p0W-U|4D=_ijbQe1zXPC~K5c;dMhBe`= zIg9L7fqeX5ft;Wp&VUI8SE?NBd#fEj8mSG3>5q~ikJlWAS;cJi`A=`h?4($F#ILvd zT=hR5KAn>SIm?L;=@JVS%So;Fj5rF~JQFuANuZ&J#XfUbQK3@5ES-9a58yr~$?~}I zg*~69cUf)CN+BUGBn90_t4UO+lm4Yi^eST@xrV0k6WCxm?j0R}lJoMUUO2b}ik>3NrMb}kY2qtA z0K;f76YhPQ4Cy;vR|1~{KHxpM<^Z>+~(c939moxA4A#Ssv*-XOx zPT-0Cx)&*QE?M-Ts&Ow@%y`YW4Tfiu@Ss+QQj_tZx$Q81Ik#nG0!P zGD#oalY-9{nVBqf)~pafR<9%O-tVy@`JxEFVdAWL7z)>6{rlZ${c@36Eb7k{^#?se z0@1N{?=!^T`#Wmn?rjt$>qW`Ct?UFR;HMo{V0z0W7&&3e30o{@h-VfCq&}GpZ4?$&<7Bca5NO%rCdgs!h z8AFd*4)@U}r9#3+^t8mKfzKw?I+37d!uA?FWUleSRTON)m!BZv4%%!j*sD?0QV z4?y)+bc4CRh#tN?Oz876v~4AMOt0EFy7UqDcADB6KegSORh zX$Q%&7x=jXa`M!;g}(&NdFbRR?L|TLhjl;-SaEg|t)>FP@)2IT8-<6y#C$S}yug44 zLjRp4jul#T-HV)3;2MsTv^TSr+-hI}HBJ77w*Ev5;g4kkoIh{e4 zn2X6->McyLkTmTLO!&-#h;B@PYZi1lnd6|S1e^aQ8eB@z6?HKNB1+K@oEit0O3}4W zE6m-4{<#@*trdGnn=@&i0~IeJ;u9*N?IoN*E9ZmH%gCL}9+2}g_HWZv2;7hJT%Ssa z*^e_){Zz=?kAAYJ=0nUY*j?}S#-j)*gzKk5S_Sd(@N;;VAmuSUfPlCwTkQdHssePY z-Lb+OOTgs-og7OUv3()(02xls&Vv+8C7;iOoCE0j{$L)STR<`UFcu;zv8zwTLQ^Hm z{LmQ?br8w%n`+HFNWz>5nFmdWP{?1Ih6fHXW7#}Ns78F#qTpOL@#*K-{GVv~(mB%? zoA z#rZeL1oGzH;Ij>Pfu_8P8!I30frK|nOeX@O7j-y05#V@s!jYrDF9Nr>NR(Xy!v8@6 zE-r$cw}?(#!Wr8S-g%46*Vbapw-(jpyf{dzMK$TzPSqoLjsj)=_Be2R2;!Als}I_*1M<* zd~jFoU2=}>`3#!h!+{X>4u7&ii{+RTaNZA>RR{~kSf})f| zKK&BhK0#ed^)ka^cNrvoqQ+uZ2~>ZAo$Wa3K0RNK7`_x{oFctQLo_6uLZ#S!4_+WR zg{w;d$TBdEz(&nI>}R$XqBOk#Z3i`Jlt5%LiM%Ry5I32K`K51;gS3& z8nvYy61{|0|2xDSCAuluKG;%uI%BJ`ER~1*l37UcQ++ZA^qtJ2>J~207AjXsp5{#S z4$+Qz>QVHtY;5H?Ejul6Ji)@1@=*c31MN*AH<6!Gon$`&%T*B;$tA2hTT z4|wHEGSle^GGm00L5Ef)+k!9XCc0K!{cI9qq|SUd24Fy>aiV@fwyjYGLd0{ z`FAjUsROy#0TD`$v6Pcd5n1VpWRw-N2E1Ir@L$O=JJ+EOZA3i^p2chEMvE&axkSUm zfp!-0QIOAI8q0E72%+<($^T*ul+I;iAQPKZkAa_1@fpjr1;|VuTGFrbF;Fhzc9hg( zpxZ^ZOsqp+7wp2pVEC1yN+o5VgLLYk=Lf_adVEcMM%S}arj4%GXlYY{hJ|Y0yWZ?5 z8JcTMGQ5p+sa&pS{uN`HI}i7{!ltkBs!`Cjj)LKbK&W7}qUW6Uhk*%(A8&M-UNr8` zLgYD*8~iv>3rEUi;Ekz~bH{c}2Hv>oNmo`L^Ql9WzqoV-U%gQ4R!WVrlvB+FgL)Op zuKWs%zaf6JTOCSM@M@9x!-I-MrVt6PV2zzb;sWETv8{EqlR<2U5HPN+Q-3$@>(;qcKEYuIvv?+hP47C?=k@)L<){r039wW}lQ2R5vM5ZT0#U->xGx6{zdPDElrg9JF zP?&WY-DqiXkaihurAI5E;W7e_s(^?qq)GcNBFZj3Ufum{FfAvz7rthD%#a= zPKN5MSl`yt6T7U}t|BUA*<`ln>E4LGHa*I_t;E1x)~xHag*zrg%MGk+L+VN)`22=I zgC;|hH#TiU>gz&l-fzffGI$(ZyNTA64cI2UjPeJXkSF#-(I40Yb^9UkPYm<-L&cvY z#qI={Q3zpeY7fJdLdc*Aw${fLLPHz2zG@P*wINzI|H1G=h-k;&m^X>}yzLntg*)7| zNo2~T9chTI%>nUe!J%qxhD6eq$O*%IU^daZlhh@UM6^C+`4Y$?+7R+bB;@o|S2|Px z*NC>7+&&H}wAu`EED}PTuz(G{tO7`J(#DWCBB9m^Tiy3E1Ue(6q0=DN8RNUgLannl z%wFOC0&sKDX5j;mkmsW9yskT%0BtVX2(o-EM0C;Ck_RH8tqZnjqq|1|M7U~GNW?Cv zaK(bV7sDl2ZH&jYa#RP~m~LTOOr8!gU9}-jmoOa?CrSND$#f{{s*NJw-D5r1RhuB$ zVV3WNgznlf(mD~3bE+HLxf7bZYZIJ~p(A;RyEfFC+(SDE-;$ch`D8sZApr zCqk5)nm>2#ge*5~^V>zxM8mZ&;VDooxZowo>4kB>muVOPH+pGL+575xKAdycs-)mj zK7{nf1lu*c@AL7dGGaVnB2@Io25sHkoDY|JYa7TP5m4=+&N!40*F0!f-U$_bw6Wx5 z1h{yrQQedeQJ#p}8xc_3A!Btuw0UaF$bo%O=7mD=+&+pko*mR_@$BHd2tF)qBH@t_ zZhGu;8%nPEkf2vn(+*IkN8-ms@WE^=c?sxXt|rUFAtXi{2t5qiP|`hu4@g_7cfp!r z(7HL1wG+5BuEqmJW`C_084Ff)h~UvR-+j>Ht8F3UCP1wpHtm6axyyc7;=g&|;;)Ty z4Vr+H1#YCu!>xYWY^DC!d64I?O|Y~1WFEK$Aj#4ME`{9@4pUvP=UJNqP`*jbbO;-) zJx8{V2cJM>rwy0rJV*#ccBYSq=0G(Hp?Tml1bZlUJe(VXHEgZ-%7efl6#30z)^kCK zJo#cAGz`NMwAGnT=&IcTF2j+t_=E;b9IjnLf)b%@ID&d{9HflEK6Ofjh7sB}^4&ww z5Q2PMG!8OGYAZTz$sM~BB0{zNv7@b_+8Lb+JUb39g=+u3Z)x=dd_yj99JI{R21D*` z+Si!7`hTvFdEg@dt)JGwDx(ZjB)A;pO4h)2L|x*uT1+?!{3>Dy^N+_kKF7%;I8=^x&NE` zPV^3OU`VH3%CE-KUCIuxKmFq_Wz+po1mcdt4*=Gk2{&GqAcXzlWD&YD-b;T#Sx1&{!9Io%?|tpxg^EM0|H z5sVgo1YwRem>;HF`60_!Tb7rxo++4b&rw4TH+wXuV7`q_pQDRbc>ztq9E(+k%WTC; zxsFAU>-A=qptfZ5 zbnC3IeDTc4!Skb8>!xY5csP_HubHFuXVlRhOgx}~u2X59eAenKZIE9%;;W_SVSH-_ zOUd$pT5oec9^5jD*T9UHWI;|MXM=E=P?tz0vY_q>-ar=|4X5#|B1P1va~k`@=*dq$ znWjZDI7UxDR>3qaoW)nV(~(CPs~ppny@SmxVU@waM0C}(zC7%vXQ9!;E8+@B#5rJ- z7|ghw6X}8zhAW&C1w3xtCpc4ZgQctcmF^Uq3})9W6a(d~0bOd-B^)-$(oOTZhfZBF zA1f-G$I9zww6A|UfPx`2dhAZ5l48yYOFl=8ZKmS^V=a?vjj^9h9UCZJ7^jkGx|7F^ zd!pOmyHnEmd+9k$*=pLJ;pHf8M=Pn&=L%Y~SvW^>=N`Mqd9N!kzuAVU2SpQyC?ZThb2;KV&77{B zc#}7;$dm)b-;})N1);9q%0T<+HQHvTXfvIi1B9-#I5HDHc z$FU>bICg7c<4|JoJN+9U#&3y<2 z&st~{Eu0W7M6wpBSTgC*3u!@t2*n&z5X)w-aMEw4v7yYfpzcyfY))-!Z(nHPOtQ;X zcl6HV$50EI)# z!lf1w;9d=7BpTdBJYAFz>V$wJ>t61_x-rVQL%5GuueEhY^>vc7dz{?KSs?u>Zkl0)@k~7;9MN%gxSWrM8O(` zb=)y&w6RXOOO+=f4cvdFM!=DEM@#7#-~<^<#8?ngs22(X;`T`%vd09E?s0-&$`+aX z9LBFW!LP(?uzw$(TtC5-zsXR}`4(Ks!?86iRHIXK3w|8rqNKTu7wcA9eh`wtolz?- z7e&00!CPthQN+1-ZK2unlSn9L1(bI_)eSrH;pE@&!As&tlTC(fPDpS%569;6uppm> z3Vbs=S?r(-zowjW(1j~4(-@-m;ogUdtOAI_NvEDbmFCO2h4t&tdLo_ngc%iQChHPs zO#$l)HNa%ihxa)ELa!>bqx1|=vgp!O0cV@&(m26^R2JIpfOO$8jYNXXRLx|vghwpV zjKW6^*(|=$axaT7GNiKjO3O?ZUu9S=04QTCvja>2ilbJFs9k+CIElXfmTW;`?lo9|ul$&KgUa)YxO*iijppIlWCx1#1;UhKN^miY+X*gb zaXZ1eEN&-wyQnV+2LCY9$LuJUZWL7q8W&nluqN$N!xf#nlk)}5@eZ9#Cw4kBf6Q2r zFIZ5_LR_xFq6efQf)mD4PO-Blgc68$%`DCdLnsT?&DEoG+Y}tm(^WG=C>;cMvg&Lu zEXJ?2`6L|H>iUcSP^m>TPNJv8lrl(ENW=;_Ww8bp84~}XAWa1|f`zN3l2Wvz`?!(qf*Afa>2n$E=0Y#5GkxfGZ$X|uM|N_6Ilq825Ik* zL!%6m27U~}gQb56+419?4G!YrSWc*Ybn%^3`}9;ENYt?7+UlC571!0~GPG zf+7{Ajtn08w}3btqlLpUa>HI@wEa8^U&q;h9z|FJ0k+>q5hlSph7T_P{g}uaEkUs9 zx^$;GUzqRbaCJb%5MSFysd?m#!bk7gkXfRt;_W{D3>QL|Fi9LZ`bKb&LS!^w)D{EbM*Ch=q3!|9Ko{1r=AycovboN>lI zoL}*i&aiyiVe~`KIn&TI*4@k`#3;57SN0xC({VcL%|bd$JaNl6zH*(^x^A&ioqDdZuYh3fLjLVy&TwpR%wJy}#pg$Hj+ef_cpR7K9epinK@ zqEPN{u*+K-VMcvM@p0BPvQeU}1Qr=?inu=uQGc*-rBL9j#7|VMGI%qF*cCrNfo(GM z66rz;4DGDGeM0EM^36E%xcG5t(-=Lt+~VBKD~KL41q<;KJ!uN&fEBT{iIuqfJ75$Z zD8UaEDJt<^WHgJb`55s%-mj&MOpBnzE2hj<^B2-ldf>f#6T+bzZtGjCW~jl~b-%P5-;Diyvq zMF)-khyk?gARafCa2Z$`AXE<-&-%((qG9HdDfos!i5 zTZ$rI5hhN7U6=%=hG-!>oD(QZN&;uqUkQ`zErh9%36rZp+??$HG;HY!TkULZd~I>r56m8HBxM;i6@=!!$fi;-EPhkicz>Sg?$QWvwry9UO)RzdsePP}XU z2i}<}?@CXI`i(r?BQThxr(J9|Z;VEOgdQ@;YAlTu z)P{FrPmqc|y@pFVGv!Wcs3;%A!#x7Y|JSn4xoB76*^CKxQO|8Rb7iNP;T#bm>po`73AR{R>7gtlJej7( z$DsIpJ4(;uwuR*=G21B%%TbC6$K}H~iWRr}k4jH7_yY!VICj%NfEC1tCwrJ(MOU|o zmHckn)fQJlxx1kJT}HWjMCh+~bbjPB5%Ck&v7UwM@~&8(jvxnTxmiPTqZZkHY(%*V z0PZZr^&DrpvT0V@$|#B-_`Skvu6{}{h;;61vRljHJb%v>o+GzC@wZ9gGj9lfd@uNz%J_IgkfRZN+`-A|25 zr-#vZDdLs9r!0OVUM}K#5ijQPQZW$?sId&z+$+bI3I6IW3j+%fPB*3o2aMh>Sp%3An6562x^LiHIMib*Zx*a+H zN;snN9-s2KMew<#63%#_d$9(F;R~;3W$C9#;w)a;W=chixFU&>A})GInVRfrVB^)O{Q=f-@{AMH>MQYeNd%Rxu-d{SN?2{I)S}yNi49pIqC%Vwk2^m zr>3Npi&(i3vCoBwHQkPllvWBxm$OjaL;3$8VjGx<6^r`$JhZL$gbK58Bvm5Dv9yaA z$I>ohtqg0sh+PnI#U#8U;>t96L&Q5zli9ZtF=r-X*#h%i7CLKA{lVBS96Ltg>adF# zZ`fE84Vwm`mc#u!4EplUvODwna@A-_hTHoP|8a4G>58{Kk1;(_G#$r6HPfR7(`~z5 zGbxuX(W1gEfom1RRb4UMp`i_|p-53Lyi-F#qM=(UkVw{UkXZl-6%Fs{enHMnWmS3>!c2ChKm+Fh}n_0}wxui$Uip zG@Iv(7bxctFV>K;)Rhmiep!ZY0TapFaQU%-Abn35kQBSd8 z?q&7TMZHW>FO{>q)6Dxb=Yoej*Ia0|!c8x>tkgg}l=O>#Vu-Nm=||3*3OE z)F|nhbJ-KKQ|VzdnjR_2KZ#TtEjO6|%cKiuJ_y`xQEoZ>^F)NdASdiqgbRz3yNmXrSIhWm^X{`K_WedAs5PAohBWBWKr2aH0kKkQOXHD6LFJ{ zo{pt)?q@XVPK$WD$mhqdamz}?8%6#N5wACkgh-aKO82^mCyD~aBAzVb`6AAjP9|Nh zh{uWg8$~=*lus4$St6b+;@r40>CA~D!H*SKq)WtJrxb;Y3MT}6Lq)ts#Dhefo`k05 z`7Q-YsOX;4B0pKgTSYuk#4oV;BC~FRNVviiba5iiz0D?_c=l1bC91nX+rtLkMHjV- zxSquq>An z4|8~qIb#!hj@jU_P_wPmR&QdjGaGI--7VV$IrOFl-stA5lR(ZP^%UERp3=I98Dp7N zb@`l5&8@8b9H~1ypHa7z=XXIPi*~BIK6~iwaeMt$eW`Ef3ajrWvG$_y`m%=WcFPTx z;jCezhUphLVkI0wld`rG{_!0gF1lRB@0j~dD5K~p;FaSedR7j1g7B?2d^g3jKZ~o; z#8=!BFo*P?%YNOwJNspE3!C*g2->JyRR~#;31pU(`j4WJZ z7#Aix!}z5n%8g&QpmQUd;_dRRw-!s!(hC>&tU}V%7msjSMjtHi6FqhXzWK|Dr+<_u zOHIo-m(^TMrB^ljYZ*t<1xHc^`!ZP%L+(;C${feiOw$s1=*NN2(Mqh}(JEzSl^^i3 zUF#5H*!ddAEZ&wU2V|NS&EhM)f*4@cH4YYEWp=#AF<&plk5{x`1bWsvdCTt}_VLsst~l6LwB$NN(-5L#OFxAsb$&Rb zRowef)uS^D${UBbh>^!`n$Rgw&BR=)j9%pV>MJd-Y}Dr}eA0_kV|AIDwKpZg_Hy?yvCA9FbyR`{bq?H0?JL2RiRWi__-5f$t-b`B#~~jKf^)kk=@Eo z68E7Ssq87oRg!;${=uZYQ_It6%cb^~*`1L{gh^r1J0l0eiLMs|#m{}R4~7aVBw%FlS3FC!qu5>$?Z*e`&j zGenFQF}4kfBF+Kh+{oe!EmK&7CPQi`#B(VROBi140tmZ`hhr%cldyZtn(Wz#u^7h) zfNxfdtBm-Vl89G|1~NswM#RObD%-7w%uWb6a_+}$HRn2A0J$~miUsSGyEE<$jCI^1 z!(Xrem0tjfW*C?@&SIgRb)h1zur8d%?W~Jradlr^`FqxB=5^rQ3C!@oGc8t!oALlGWj89Nd=u+Y+-siQ@PP`0pJY2gPHRvAW%cvqH>4kp&l zN()zCCbPkhB^b-ySphZc9Vz$t8_MlhKKSlFUVFVtic#k?#j8lG|>=8>ci$7{`Wh?!KmPc89k%1p4TWNWW#a9`w ziu#J;xxgB5WTBdaPvE$=Yui3tH7-<}yZnj=eLjb3K;?&Z+`}1#t%AY}zp^VHcku?D zH6s|yO&d@1zBJTyLWDjWWD4f*MX5F2ELic27|`u{~#v58S*gc_`yj`4u1c?u_;;g7zDn z_HLYZWBKW;(ElpFUlz`9AdD8{sGPGRxRQrsISuyCFaCq_%&z(JMO={u!72+a#cv?Q zIb0}67QBkYe9EgW$g4W|y0_Gi-F&BPj22lNXqF1pPuLskUT|dlT8HwEBi-e1*ohpG zuChxAW{o%{cdO-NBLySe3&s*xwyJm5@O^HRAy;rPUvRLPg?0`mip>p0`r|}g;b69z zRZ!Ed?|3OeeDlAWVG=5Xq||D;O(IK!{X|0aHKl4pflBU+ZJtO z9F=}%+78YX0&$fbI|6$0FW9F7#NeO@mmzNK%c2_NHf}L1+ik{eIF|5Z+m727z)f%4 zex0zJO~Jf>5a6${`MMMywNpQ3~oquzLvoU&8@Fx#Ia7rYZ?6f zm3oFC+M)~sT^W}{pzDdI;tZnxuO@^rgBj&8RPh_|0BO=X0s#k82N%M8gZ zotEQQED~9qIyE|8v4~^oxEIdmiB)*oP6Kb{;%$xTuCBmN+j&G#&s8KnZPynTJL6lo z6GQkfliH3E-=G3)X}v*dF_v6lp|j>LMw(&;+YggYVx5E|kTtzh*b(;256W3m-Y57Z z2`gtmOR8Aez5?}Git1DjlX9D^^PZ~cWZRyq=w#cTDhF)8{2)5FR1X8clZL{s6_RT= z}0(iF7fp1|DT` z`^H)*&)>t*jUUZVfZKeM%z^bF7D#0!5GxKi41^gS~Ay~Toy5%%e!*dfKrM>0xz;m(!l;y z$&cWp_D!j(e)Z$ZIbSe1SM=)*4jzwn!|X&UtSbj=G9*IxQ0%AHuB88?N*CQ2Lc1ta zK*(mHv!;SUP!HTtoG2+m%Jy*~+NXFBi`f^r2g*Wqc|S3++J@n5HVpYT10MYnhKV@2 zSHd~c`82;^-7Qb^3s(Psf0|$DP!DmMe~c+Ok$0Xy@BLe!=H~;ID!U%=%4oDCm03{D zu2!ZOxvro^{Sc}$dn!8t>hfk*K9!9iyS`25Bg%4vp|;AvCmMCVICNHT^(Q?C)BdM+ z3EDm#4)zC3pbC{sjMt9)w4TtjJF%ZmpUJvCU5HC63)S!w@i-i{r*5^Xb7fMHDC#E* zaeIJ?+d|6%7A`W36LJ2NQ;Q7YoRF24be3U1**}-X(N1C^Ug#I$Opz`Inqi`db8#{m zri%C#-iO$$^mFSO_coydJ59N94niQba!EKl2nw5f5?9;F{(+2laf0?)op=}d54`&_ zilZ7+Texf;Aqzk>?>7@QFn(sv2qV}Wu|A)0Vfvc)o`^Wd$ z`y52AL=;3!JQ>TtY!d2b z(WErWZBUx2TgrXACAUHU-)B8*@3YtTdWZM--=7cc^?lZ}o;5w|S@S*@at*r^c`kg#8pz2)1Z926O*Ls&RGUo zLzPvVqynU=qS+(sB0lP{4>;SS4%Xj8M;*#csxOAcM;-P7XM5CPA8^iPEr=g*Zc%!g zMs@61mVY;-3=NX(;J5Xf4>%{&x9Z%*^Z0T6`@T;0i>0o1?x*m$!NczjDiw#<)&Edc zxtO4;%HCBd)h$xEGEEWKKw>vr;c{`|MdqMIw*G!I9I2~qQ>kp1?|^Z?CKYSr636wo zQVPRry`p<>ns8)FeQ`=TQ!b?(dP-UK{?5T4)pDJaODx~swFr+?!>$ulo!C>Q^;uGW z|9^2xS=>6yOq#!hbhx%f<+fGjmPcW3UC#A%^^2tL=c%qf_mHkWTXpsJ!d5|0>VCEg zkfXYKUU9RFGqgTiCOduyBCF!rko&9ndv|mA2@2n(4Bbc-{w`(b?BcpB zUR?4Jueb)4izZbT&8jT;yD$IUd}qKJ|8}zLvAnJn$>xDIH$Gn6piW}h$BPHZ zL^h~IZdHjK$?EBx#8T?{FDGRKBb9P3EPlMWLg5Bh=Gv&j^$M3OT*G+1YPycHwldvO z))s~B(r;E+mA-wvSiIHCOzdW#E#7~u*xd`?RJNA|BMmoF7gw!vT*+_eu&}Ce=diG< z@mfx^vzFkT6}Ee}CYhGFx!|e4YS~5=#^KKj%LL3$7M~}ZY4(v}WgZ6ECcA`7)L8{6QrOn60)i94E}Rkw_q;;R$sLwqBXOO#&Q=Y8+T zfg1XWdAr)D&y>|}A5|<+)y^5VN5MGCC^Kk}p0UKQu(FG4(2BlFoVx@A7#zS;42M=@ z?qRC&{b7`cT%~_`sv2)m)!5D@tR^dmp2y_`&Q5-p_=Fhh>*XtvXLILqsl?Cbs_%@} zmH*$m<-w|s>@J|T0;|IrzN}M9Jf{0%I`y%>Tv_6hLriypGTnAfOiHGjs4Y+dij?V| z%>{6X$?<+t1M5Keq=q_4GW&SGWHQ5?Ad`!7m15#Hh(ADsPa<)-svmE`C)pIvQvCm| z4Lad4Mrb4(g8qYWI|+|HZ%XlP3Dt21LhHHYW)FEy`qQo>J%Nb9 zgixJ5)&74ph5u!9>+RH)YZ&}rnZ&+9Dz*xjNi=Z>;@k_(kpn#@@pXK=1V_PD0UP_p zZ~J^{iw>uN*GUEJRIRjw-_9i1?k3qB#TD@X!Ctn(PW&^QZ%Bn|QweET=HeMScEG0_ zRQ+?r|DnD7_#!iyCQB@CE_r^Ak`%pWn1d&HjNF~F?6#^zG|0DGn`@Mjv-fx+Q>plB zYgB-GmFl%J)$V|mo`|lK5ml>jm4`$WRS_Mo+D?)2Mk7i7MepSHifJ%Cn9#7{*-+2^humaPz1hFZK>Q}d zAu}4$ZgerFXBExx9?6pm*)S6YPUHqH4{CG2MihXV2Y{}K4xLOt01zfg=^jyxh z1(mg2zO|4i z4{=o=Goy%32f3wPA*Jytp!od+J_HoMpTLKJ;`bBy5K#Pn0`J|&?@(J$ z7Zi>vOs7;SL!AmoqKeR_2;~ZQC|sg&u8N>Y;b!SymO4-2cEz8gaI3=E3iD(Ts-tkF z^vCUlEaZ<;#9baPZyyJqvKIQ#2`m`#Qx|h3)GU4GP=WDR^~0 z62DK8Y3ERmCF1up3KY(k{_~yd6gdjhp;t-}Z|%gdQxqt9?c@#rB8A%&E+HH-;`b@a zl|X8{6u?jcS`-dST$cKV!fJ~%)xIu~rucbv11pIN^UxMI%q0#Ox5!r9m_=g5ris`b zqF?5tUtaDxf!5m9AZvyhz$xLkk2Xh%2?NaZ`0t0Fc)gf8$#;^N*Wb($6DIr8&51+! z4#enjd(Av8V$E^?p3s+rIbH9Mjo;14*oUc5sIJ@- z)wwL>TKO_U%L@GB65QNK=j%MPlhxI|YgOScEAfl_khYV{rTWh9#fgcbtf}vtVHWd1 zW@S|R+u!>qll%PRE*?OK>gyHP1aa({;Ie0JeJ_<yHs z`E6(T1|D`ElP`mns9;4Z*l_u7%;Umq9IxJ~{0@)gZq7YUq9Z)^&pA+`++0QTqXr%= z)YV@o9W%_{vNS_C^HFnr@Ki4J{VPEQ*W$>mI_;g3Xdhnbi3JvI|SQLv?wb;;kfKTK5ig=d>xc4yQu*CE*L|CrCE#e{lij7dk*YHnNU4Fv7(-GJIj} zBQoJwP+)lvsT^(ED(UWoXLt^OHL2aTBBX;#p3AGhKBMNjc-n{QCR0+fnJcUiY}GW%sy@8NeopJEIb^9pWggOrnRgr}+{ z+;wW{_7+~U4Q;R!##eSzERN9Ly$Vm@p%z_p!SLo_xDV%)Zbeig31Lwfwt5}%LqD;o z)~2~_Z(^O9VNRD#J3OJDtFBgN#h@s>3T&)7R8G7@nJxo{Cp1Lp3D{p-idU1~hoijJINJM-ja>NJb*K=6Z32_vIdKpQLilm<3Huq#C6OTJbZOU#Q?zmjOjJ-|e ztX;f$fv;~S{XR1p+wVOeO-_SwDvtAIpcWOV^%pkLO)8ZA`+7+^lC4RxHUA>NUEBR3 z)^+?M^>1`S_%!-hd0(^ZL2=1Y>uCI_R)G7mTCS~ddW)(xuFY_Iv%*~6*hf{kfZysw z(;C;swsB)+d&Tf{cb5lFd*8ua3TA$63>J_VMBakTryL^z+- z%>E`~IG?*7`F0@!>5Fqzm9v}GG6DQ;k8{K5k!j!oeEH0uu}n?|M(|_Ih%I5Vkw!kQ^yhaACxKO z#aDhONbFYn8fapCYa1yVOs!^pz0$;*U&O5!_|h`n)n!)`srSdyPVz}I{OA#fLVmaz?Vy>sqCN8OPG1pIM6PIMTxRo=oiAy?M+{X2!G8XQ}1!5~gcq$iw zJ3~=qNUhyP9Xf;Kx@ zo!+Zes-S*mZ+0@B-aDNa-AP2q{^j)boMQU}uFmSO!N>R9IWaKa5J}6;-u^!5xkUB? zt9OLfNYKt@sknJ7C7nyxP2UQujCOwrKmGJEb|wy?H%WdjWw)FnNw4?e1|pgX+AEjo zShN!?lqt35W)RxU>Yvi(Dp`1?rN_v3itlRq#y5tgDaPSv`EIP2WTOi@=A7Tfw0Eu4 z$Zh!gVdJ$-r@9+?B1|=R+(zR=iXTG|+1=jB*gYh_k;2z1KGZ20344r4@=k`l(0Voo zXx_3I(l8=O=O9`1iq0OiTtc@XDj)aHX@xT(NOhwjd<3aqzHeo>czKBX@_pAtxK+Ew z*yYz%23Ja*p2_9t^vYQZbM;|ht}wUq8NTaf@~}}M>9}~M{5c%H?8A6`Eepo)MoEH} z5LvI~htNrHL|b2z9<7h0C~^F1*J3WSIv&d5thMwHD+`OSw=2xb zmgc)i^4tHSVP&%e#!ilK98!cQtUg;1FkU~jO{rmxeU>z5xOk?EIegyXY^slJYWx_n zOb~u;QOXUepC1g5EaCVkuoBz5{q7Ph`9yj0Shg59ZRDEQ410r=N;u1_G-0PS*;13t`skhQXG4f(xdW6)~Ue5__V!y_D zoDqtn1|KlA{Ry9T0^)>8qsMI$Wjj!&&>g;-!n+Denz-vYJmlpWe}KS$VdIDsCT@xh z;T9xsINjw4GH%EA@xL>1eRCy0*6HLx(B8_L;k!gUU+nAK%~pLeOzbYkqMf}oF(Fs# zL5I|FEKMj~zZ;#WUIT5OHdHZ8%$$NYbhy2z$x?2MlH01}s`G;XMH|ZGHk7tPs#~T~ zw=7NFj_dxfiia9jx1G}L1&oOY#eMC*w7zyTnmUZ?C_{-2{$hw9Mw)#NyMkrOTqP;? zH2Dq~=g88+D3S-^b@e<%8O&7}QU~S26Sy&i>=lm*%AyQmQ-@h7H;Tc^=7vYIO^siq zVS$I;X>)d+SkUYf)ViZ>Ti0`hvrp)h38qmeJ&t^PXmor;t&W7R5mBnARMOF`_1Q9_|Kz7kTGYij zyNLfnC9|Hl-9mM|9p^5|Ch*g|9IJrn{R(^fdZpb(m9V~9?jVHfn)r=8(OhM8gp(4V zq2zGcI5U)7g<=lzS)QTLKD1Om5SiJC? zFYyRUDmBOBYcO7I`OP=f+3Ja$Evvg)m1d=??s6%^o)TeOSYa+b7*T~Al4_r!G8L3>H-A!G?FD@stRN^YPm&6drXpIXr9PxSZ8bYt-62y89QI&ycJiOu zVv~i!gPPzPSzmrYT;AwAI`Xef^yUM)iN*+0Gtv6R1=~dDD-*q$Q|dL*x`iJ6Pfc_; zWuhs`e7EQKOMN}e@k7N?3t*h>RmDih)nuFtR1p=aA{r+njvLwe3fo4O6(eqBE2KXz zA#s8o8yl54oW4@gS+Vdd1PX8EPvYZe2o#}28ClgWk5roYU#|h-Ye7d3@MWBmt5nFg zoJUF(%2V0Rm2bBS*f| zyW@+3;-1{pW8#8zp61MkhEN8trR*R>U_JsP9d`hl9l2*i{lPDiUhwyh(D4GwYG0WJ zPFgsv65%OJob+&7g~FV*a9UL1ESZ&XTDii!Tog_#kvLpl#P6a4<)n(L?8ry??yKc9jK7<_Z3QLXvm`!d`T2T^E*PgC!k*%7+4DnDsp~Qjj zjSZOCc>mhLimw*q!|Cl3+cik_@gt^mDTdD=mVm+e4XI_cP@T&5;4GQI5Y~g~u{SI| zi^>rQP>kynrH+N_4EeTGNGj8coY83PaLWP5Tummpl@ngqCf{Mt+AQ@k^u*U>527_i zpo_KaK@k;^E~5UwQ0o-4halzaOO)UuE(sTZ-oHs$DkW^Q>h2!md4{_r-4^_d8t0>3Z+lA`XkZ67DZ(>clH56MrZO9vvu6B(>cd?c^ z>&>MQLH>8~o7bCN%gxJ_j#ly8UT$uzmcfkBL##z9J{%*&K)zbV7-D68u;Rrm~kU&{%DL1U#+hf`qCfKjQTYdOc*WKj&9a(w!c1(e!2 zjr~w@y_!e;6YM{M~no`~hWiR2MPwT7P;Z5uVik>;;Y;gOS7a zNvZ@B<=b8Koml<-SB7D=Y$ly-i0cd)K465U3B@;7m0T_-EaF0O@Zc!6^a$JgX!9f) zmMULXO?X`k_m;LT<)V{SGnm@5T82yMI#$WEtCFie)SKmnrl_~0TUFQHJ}wfvNs$X} zl~X!is5D3FIFeb&HSegnUC*|P*QpB}$?|ls>jDQ%H=f3`RXn<;og%;HZmZf!P_<#; zrw}px(R);-43F~ongyZ4=oxsIcsJ@BJ-G2w#-wQUG-8#Co=~<@Ra2y2>l=8!%6>Q~ zeT^Buv*lfefT4e4=}_Tg1LkSguN%^|#s2U4Yd zxS51kZDn2S!|_o|JuW3UhBX!~;lT7X z=JGqdE>DIJtA=BrG71<^a6ud|6GkTrayX*ngEA!cyd*9?Uga!3OJUA=>4{t-p^d5} zXL7jE!WJ1mv{1f`&|;PIb?VgMV$Mi-9iJWyEhf#5peWWwIYla9xL9rc&g2Ay7UmsB za07>P1oPoV7EE$$JaVfU&&-taN-4ew{@gQ(MksuEU58|J)2k)DP10j%L_vfLuWOeW zoyH;j<&wX};ipxT@VaJ+(-7Vsl|?{@2V0%8;zkaDx+Fae7nexfxQVzh69B!51Q!=M ze53>6;!cUf#r3iyaq|~R{u)USZDJ)ZD_*B?5ubu8E51h&Sc}Vws}*J~Mr%-*wHVqf zad=f!(W_b6ipv$QQMg3mdWp-5`LmCqO>6?niX)2^!&b#mq;QiGP@r(L!g&f;Dx52E zxLXd>Yq-^fyJbsUHemw4(@$pq+ANO8-kyroX0sssmo;m-HP~aAu-!+GOj80X6hC(` zG!!8{wmTGRmh^;+6D2>YhC9sjvm`x~B45tvPh>`XesSr;zN83s^4Qpy;_cxp+2F!~ z)V-EVF)6-GlX{L&T~uP6@{%117OXjWb*y5uleH7PSrum|`&n~HZKNE|29|YM zr7(Dx47NSQ@L6K_0D^RzcJ6QRe9AmM$fIGYlJq4lJTWR9JmFjFB@W+GU3J+D$5`#V z5~?Ck_xDwcM>DN4$zDJ|`dVYGPgQ;B0)Q>ZgKegcbYUoTDD_y8{E?!FG^7zNnk95=_ zd<%wff4B#yoa`aoIsH(3>uXpk>Zx)v_}XSISk0w8-QrC3QwQ zD!YYA$`;!{y6Oy*GQ}xh`36m~Q+E%guC_v@u9DxFB1!4?UW0vZ_j(yAy4H`7eS|wF zN&L9MoRsu3m+?(p^`SyBb)z{VqPXqDp`~Z2j#ZuLEImVYtP|KYl%B!XKRkggL+Fg4 zj1GHhGBu$yRhCjE8As^t{_`=8Uj05?Xb}60oSS@uBKgXUOtsBNHD^t2uf&HIby7&< z3J#2YB#u-KNkS^p(0rB0s3Vxt6Z-t;Rsg;rR4Cc za)ni{S49~w;)uhmlv&~x3nM<7xLIZ-yiVFh^!E9ADj@g9A*D+HF6GX^aic0hdwk^# zTdv|_cQh-9zU3uKeTc7P06mVUm%ToPsJxe9Yh zVA!HCmjs3_665y)nO>)=c4Vf)HNVN;K0Go*5$ZXjk%JX(P#8Zdfd{LU3I`Q#k~lmv zP2oy~lN6Rkj3b+g5{K6riq0jDkH8&>kl?an{9y*7{~Cje44$1E}>k z%T}M_Gv&rBHu@wE7&+X^qayuAOjzt0SD5w4)&5T8R9-Khd&11lP~Q^qHXt=~53NxR zXmZuV-wltH-l&>KKG#L*jjDO%b6u3)sG3JU*G1^YAeAVznllkv&CMgUR+2&II(7!Z zj*;laiCn8%!TFNEYRh+nBdb)k7AyVf2ECyuRL32+GhJB3owjM^S_$15l(O)pFd44& zPL<^Ja>kWP|LIOKp3vqtNe^8alsMvyqvuI%godjKiYr;4hI5)R22+@eFkBqvY93j_ z0*7;WXE=Q&C&U>}A0oej!bcFH9YMV(f*KV;ktc#`=DRXe##pKZyGNmoaunJj`P_6l ztS)Yobkf%#HPLW!yCmRf>LCH-xVpH-2_VPS#my3@L4ZB3rj&$>n;gFXXgJ*kQ>q9B zT-7N9!s^O8cBh!f(-Pk|Qh|*?3U=;W2ZNxc?3O(tJu! z_nJg;#zu2=#4!n+^|-02mqivgHC*IzQ^Q3bH#J=3wy8PPw5;HG)iSX&{%8qf{9$*~ z>Z(n+n<{sE{1LDRF^gG-KQRLT|J#6& z9JioxmF36h*rZ1G+?h_;OCynA!YSX#B|`Td z_pu>Fpf2^`Yl1QY{2ZBlV;`GaqdgI_CqVP1c*DNXs4R@pX!pG7!8{gF$c)Z*raeq4 zrR~ftHM?`RGu7mbly7&D z7pM|C-0@CRmQaBz5jGD2HDg0^uN&#m%}=*niw2q%ftSNWz)o|+`Z zIJVPSQT|D`vH0q=DmS~pC**MSCyJ5pVC}Yam_1x21f?_>=b z7L)?R`3B1wtjy%dM8;~27pmiU!Y6S2@!8a;oId_;wdk|YcWhP`XJx2jb+YoFWNlPR z5xPzp+>zNTYVq8;z7dg|IaqidpX4g-t8%oCPkNR1RXJM6C&5blsvNE3lVYL1K`8)B zkeov`LB+R%8QaTSgS^RmUM9~B$zl3{K;y+=5I@}D8!l^*DI{5BENz0Fivndzk=~bj@B85t8z{c z82p9O#wi>iG>p5t(D_pHF5IB%XI)gv3FnvdTUB*@#(xXfS63ybFen|NlstZ)Z)ZOP zhZk4jqE%^7RaLiKDX}!Ds;XO_!Yaqz3M38%Sz@?b5o1UBN*L$Lh%oQWkR@tw41_jt z3CB|^J1ENtT}U&mG3Rv4mf^$ea`wy$pQQL?dIlIF zo{Pz2FJ!c63ya>N%}Bra^hV#X;2BCo4H*(ktt_E1lOn>QM)BM)_(mLN0~9U=D-`tD zL)cPFWpF~PJlk7psSHkNQ&?qiLc7EvD=5Q>b(dBrN7mt=4PO$p=~PpFnv z2$u?#0Pb7xxkH7wDt;b#;ckwKpicQWD_pB^i^4SuxBiO!QwdZnLYop;sW6+AaC(Kp zs^3hHDx9TCq+H>46~QuvI}|QexKrU0g$>@H!WRk^AyEk|P&i59JcV;q0&^9PDx4#6 zd|F#A>m17I&^ea$;dC?ecX4!@FDQpuG?Kl(D~)7>EWVE0ZfG-`=nxJpl9&|V zjR$C01XIr9ExyDM+Q9ttPii1G!yf;Hhq4I{7^%`$xrb%yQiQAr=Qfu6OydcsBcj3} z$-})4)myQN!igSbtL*dK&XFI^U;M-mmqX}UDFzjusWR9i%cFnt1#Et(04a$nKHC1k zxPFs-$(>2M(dABg5(cJZyzS4YJ=q@#T%V={C;cw2ddZh|*n2mZucWofM8$3JJHEKA zFk4jE9EG_Y?P?7ba_XGyIN4L`acv@(t9_j%>C9YS=H-6eyrUYM!V!3s#vRr2;M|hZMUns>%K;_YLkU~&-(}NKy2VCFI{zKl9 z{`O)?z+h}2Be8${)Y+&wT**cL)1s^EP?~TUMcB*D2u;r9czSZex(9 z*_CbkbLvBNtiH1c?Ua=pHwboFbFOh&;CHG^WA+LBBSvw{z!>{FQmgDMKK4upsDMRKE_i_}$F7IZAr8mmANgR8U@9a~Y;!~#0 zDc*nCV5PQI9XB}WYZ5;snFGhzZR;qkp@!6l*>OBV#@RoaH)`V=7!=_beSMF3wL33R zzjiccy)`fTh8|YsqNH-Tc|nN})s@RPb-%D@#v%Q=>c{PV-ChvFNREr3j>~p-@;8jt zcjiNNm5GutJNZlT>xsUBr?*KMuS3S}8vryez||)wJ*`L&DPI!QI$->OORp1s8Qojx zs0LE&e6erlDg>+J8k%7y7-rS)1N)CXigM>1b_^IiSHqzYnGAP(rKM1H$4_2%>M>20 zkE-JOCUHuCb68c*pk&|Psy_}I==-iJJZQu*>NDLw9Q4E!3h^}p`-TQ3dnPJshHLqa&sXM_w%@z>l(N?F(amG3mEfdNPDysT9)S{LjPpWw>{$w7=xIvw8X4B z`t>xk{h-*L?n{-wEJ%sI42hayWJ@OdQy6rXxZJF|CSyS4Qt5p%%U~Pt%xdlF@S$mt zNkJNwid?Jg#IgeE0S)0isgX)(8Q(UUoy>M1>GOhSuf*OMNwa=;=TxPF=v-=ocZ2O;%<8Xa+BDx%Qwxr>S*4$ zLX2w#!M;{+mah;GwEE_lDcRyctM5t+*PzA9zxd8G=N>Cw{R_U8b!$KI^Iu#yl+CkN z#KwK(OZAzB{lv77-9G6n#O)vZwwWR&HtiGN5}z5nTWtH(&GFW9ao|(mGv?G3@yu?d z?}v1;cek5i({eF-k8hJXVUqZ8k8fE5>8pQC)sF5bRgLU=fz|Ob&R=z%ZB}Mg?e03j zI&l*punK;HRTK5lC!?}mm?V60Le=Q5)11&tv&7Hitlj=cK0J7^D%$u&S455!T~)^KyyXfcl7ITOVkdf)wlxGCG(Z9aIKSUA~wEExr0 zXH?qFD^C;$Zu5`x|M3H4r6Iew)wl`2VqfD=F;|X_-F~|DjA;%zO`Ls}waGl{G_m(A z>oN2F_r(KeTUVM7zaJZY1F~oSVN~q)97@d4QL!E8STlWQ<4`gDT*Uf$Pm%BkYo@uY zrcJs&g!~^uczo!^I4fHqP6T7EbbIiu~#Kh^=!sMsc>8bo7MNG`J zWCe&jGOhCtVc6J5?9H_P^9o%vM%;e6Ilw%-kJz1S?XX^XQANkeplR-XALm# zdN;Ny59O3x;t{v%q}b0FTSr-D!niy2QHJ+}9!#+v5xADd)?Wp?9+9hwN#-(IQ4ai86T_c%F5(`ACZx@RYSA z@c{%17@r)h`t7*>r>)46wmGz%dUx2pvU+|m%aL#QH%rQC(sivQOMPD6Oxo|%ScCk{$h8RWvyRT7c0&2tkN$xU zXj5mDhN#l^heG$pNGN_my?{r|4;Asdj+azZOw8!; zj6k@-cw<9X`ctV=b&;IuRP}YdG@D|=L-O&W6ZpnEj8nnrF1|LEkgq9$YDPi=uR^hg z%EhVypIdC>q?CuR3)^|JXhAtumiEAPZNmp}{?~#FYzR_m0RC574_y zmUxxkW|r8y04-@D`kaNspyu}V>4x|(1e1~$@PVrbVC|Nco z`8c@TF&1)+X8)bBy_Z=x`OKc<#opz}nt#05eFc(w5FdkHVGZ~FB1SE-=9+WT#qCRw zqwo=8_Y$P*nH}PRE5Y{o4l!-1mD+P1E!Y&ws*rW`h4_7$waEYA4m(3tJH*5i1U&l) zabP7f6n1=;?htcIk=S_-WhR7&Ksm>z^gInNxAU*jwDo z{`#isW$zzab)f74app}{lUYjcA>x?T*0JW@Z^mY>w(joY`#ko;?baB}JZea6z+FhE z+3|Ypv2}2W@9(zS&F#mF1NU2JCs%knpUGpy=xQs~cTTMTUDh2w@%}wlt9h&pI?XZ- z4%M^96Y454s@m#f-Y_V(HnV5D$K#P$px*k%GEW~9+xsV!lQ}Y7EP2eDdbGXs$zN#4s`5xf z4r8%TaX@T%#9B~Q7@UN!3G=EFPUv(**sd%U&pm2Ak^ea+S)tl7k_qSMnYnhn!bu8GQaDZFDGCSWo96RxL8?7dBLh|N zD(TgL2+;|T8A$P{O!rh@1W#AEmgR)|P5?LYaXjI^yyK6L;d6XyJ09046efcY{yHw= z&>#t&&CSptdqG*^$ert{)A zfnv`$sq-5Od?S5Sr)4yXNa5xU$=`LkHK!XZx^>$`3Hy_wpdwK@Y94?;})yG&no{kLF{S3!2b2^V)WzIMDwNX zV#(vMBad$vdmo1tU%y??dX+j$CdGx%tLx*T$8fO^?>IY2dML;h1RP{(c;)1J1j zv^qBPJSq0c(^i{h-v5f&_AJc&W3Py#p0h@qx4jaZ_?&f(WsR>-sM-@c%R2I*gsKs% zPO}~bUWE7cz?)Z%wLT($yk7wB6CP_V1D=le3BaqvqpY7cCsf7o-Ua+kc$jrP{CiwA z%(@78{8eXJgMlMgrC7#p%)6VcVOBQ~8n5baorm`xFb)D^m#c?aYk|k$Jr8&m-mg+X zydMJIjQ3vPop|p6-j8<%@W5+MvwXmFuSv1mP?ED=Mg()=@!&PXtkn91*yfk5{sAkv zJ0bSkYu0%_t7T1s=<~XDwORMFxMrU{q!#X&GX-f90B@Zpu#(558-SvO0h9i=FR6a1?3i^PcsndF4yu)%P&hT>3CH z;A3l;IO2UP$yyFH@O^8eMlXt*wfc*TKCm*a;GP7r`UC3+ zkANC!fo%bIe5eF8eh2~8NaQy}2}07A-PSQ8dzUrTYC=jE?Xo_wN+5DlD-{a-SGQXC z``^GqrYP8B^|qqq_ZRDJ^U)@8)JK?GSAsD2BWs3~8v6)RTafi{KC(8NS2tl@CZ6N5 zc4qqv|0h-D-u^Vio3tC2KdWKc;{$2JZPEJMGr zjYBtV6F+~8(6tJ$-4;V=jPs{%<0f;}_lSEse80Db`=@S0`dZ%c^%kf8V3nI$D$sG; z#KgZ@gJW5HtuuY*S1(e?P3Ctm%0Pstb)c2J2TTcm?M33AV|@V~eeiG4hwx)ioWEJ8 zSsyo`{roQ~;eBdYiPKP8Bz~qvYcL-q$2>5P`8ynEgLy7F$|3L$a-6UwK{S%%ad_>MJdiW+Cs4YBXZlZ2?SV+) zN}}|Kz|G`%3XWamD4_KG3`f=zunOdufVdWsV?7*#92JoK8aZBt!2RTS6p@bD56S89 znof@M;kA++dl1)y`>p=gT6i^*qYKirhaByo93;mpl)_FpexyPmM*~dVTyo?fJ&{gW zse^C`qVxt&j2vZf>>@`U^8@6i$1iYfhuAUXSPZe#$uSR?6kxIC}hwG8qP*@xOv{BOJ5H@fQ@}N^<-G6hV%BP-5hG2YR)O97CwI$#DRb zKEJ_n1}Njnu^h>mMUDngR+3`|id~T7VK`#sI0-zv$Z;vjA;&FOq@W{6V{SV8Mj^p3b8+pGT5cmdG@ZZkTo)d#E_%^#nS9d*z;%4b!!C9ECjKhNs; zJYnrp|5;Y>%Y?Ntyqi8tSbNZanic#E_3DEo_j6PyIhwwNHjpFw1(d+&A8VC>XS@kV z4S1H4qXayg$&vIGG=>~4VD4j)16FZ5ISeqbCPyZ`8p)9hIs3^Gh1VEA95tXUB1a1- z50WDnl6R4#1CAa6;(=odIkFK~gd7bJ7$b)PuYJ-1IU^E4$%LG_RYG5~F zMyM&|C;(+CIVwRB$glDdT)9dPU- zM+qDU$Z@QZ}ln4|ooO!M_;V{?-HKl`nsuM=XkQv5%qSXL7f z@~khVSMFE3zLy|7E06VGZ8cy(wEtM>c_kbN*ZNbe3V6*u&cD51&e!oU;R%@?WJPF` zVF!dx8U@abuTdkT{O9$1t|`t*GaRfd8npZQ=OzrRNBP(KO#d@t<{1AbbKleAz!?7k z^RG{f0hxGz^E4Lf{db!mJk6^Ye|kDL?Re0wOhmHuL`0H^NLHT+#SDYecp_5zR8xW+ z!PX<8BTj-|&V2(kwZ))}^V%I&1F2>Spii^d`| zi#=hnUoOKogL5YsWbqCh=kMRmeEZ4R#BBdHJdACe?4M!Y^`rnLHFn(T{(7I8|77gL zGyDVCfB%{OvF15XiqU8JXPQHqPuzEwzf%r^#o7Mz%+4n$^njRuia$w>jdMV5mgH1% zRgS-jm}8U9K~(*suKJ--FkOJ8abGp6f6KWj^+Py1aNf3NgxG@@_-9yV>fQ@&9BF zYKT2B+m8*lU$(?Poa0~UGr!p)CKmXIo1bqH3k&=YSUD(~E`?B=0yt(B`oFTuQKXaR z`BMVcjF&)K1a*A%&&d5EbRBswLqW;0=M@;RBB=d$pv)r2!0m{<2|Bn7)gX#HF87}$j_B?` zLR5cf^%j4>+@EW01jCdoz?u9?LTu?3{uIBt?a|mxrT&S2^XNy#t1JB5q(NGJrQ0Co zewz^6ccuSGpA|w(2Uq%M^vnDm;dV8GHZJH{#Lufg+Ev;&> zb_t_k>JiWMu>U8YRRR)h>d7K{wI4GdAaS*SqqQAjCSBuSVOkBZqQ0*8rzU?FmrnL2 z^E(ty6s6sO66kTQ{{spmzPZ-_gVh8nyRJjto8fivI`Fi?G3I(uI^mdgJyJkorMYf( z<&WfcB5AK(?;jg5pMF>zsDQz&dzhCmp1RqeWfdXXeK-40Gaq_5Hu@GABr^myva>55 zj_vp#|3shF1ePARL3LZdONfoQ4W;SNcofj@)NNR)E)7Q5E?udqtsn6egiPCSvd;Q1SPULy+e$R35f`rPgB zZ+!=^@#M$_W!BxWD(#?bxf{%v+RPnD=)t?u0<_?>1dQhw_2PEnzq=pAz$WuUb&9i; z(n4oK>ZEEI%um5s?Vn>A5W24#$*sY-x63^cYBVFc_aMH@;E0f;>@_GhIbH;1-#w_8 zk#G!L2gm8~nof>K;fRo94ZOCHqc>|fzFz+YF8*ucw zAC4R07*CGwB!?X5!LgDY$s~syw~!oi%q2PGXn|ut9R0Ff`{w}zTZ2@h=rsQhhA|I- zb0DNmCr1$|OUaQ5#~tLTg<}gjo&e8Ia(n>Cz6Vgd-@q~DLH}&45;YTVP&GjNAB6u_ zIHuS5&+>n=S)C@RdL6=QP#f)9h|a$z#Kzb9e>cr(o5i>d=s@Re7PoKkFEqz(7C&!5 zk9A5*Y~e=#t3GqzCNX-m|7E9niS<`Mq_>sdG^?eO;%nUDI{SkD8!_9(RJRXDmlM!NbvGD53Km4B71 zNwcjAo07|v(_+iF_$$m_P50@s0*f9`pwDr8^tegZfRTnpW@4Ch2m`4+9$F{`Lu~02 z{@*QKHgZToBhPqcM=2nJ9#-}&#Q?iQviCgW-{`Zl_9ettZ}p$$vwUx&nxFNru#SUc z%5x~NYUEWshiaxJn*GnA_R{`{`hFfYY=CF=^We#PGaA%g&hhyiPO7u5xBCre4nHC$Tfi4FVwNp>L)6QAt!=UGkv-0y`B z__h60zu0|$^XHn@y0?&uAN_&u*1ES*g$Gbz#$Ht6K_rK2Zr4H7Gb(KDhyYsr-h{QQ z@rK9RZvtb99vkQjj73kh7qb&H@Th5JBXpMlGf^!M6SoEeNme;lWFHI!uqZPUrA!VA zd@vALYg(-cA`%0b2*J^4JHAN_+;7d=303PFIIZ6)JK{}@x`*RP+tD1VcEDzL4Ww8% zzl-D(XWw^pPTGGU&c*LQt-1v^npO@JQ5vqyBLgQ{c{ZvcRAi&1qXNHKc__LbJpxx) zAyihRMqDT4$wp(Fn-IR1x0XZV+f!m~`N58-Va>Q2lqkMM0hZZ#;@U(R78UUuN z-p3GdVBkeb84(O%#bX~RL6m(WbnlK}pzEpWCztHsv_JdSK36PWvV3mgiseO1mn~i% zGK^IG0`?_=!AH{_OS-)tz*JyfVc7zjOI^71iUoj%c>j_>FsUb8K|DB0X(WIw8fOQB zv7=`PvV5_;If09?rVB#P;wu)9DO-Rz%IN?6!V>Yq?7)yDBClAoa#>*s`$(!}j?+dj zD~mlcFL04H_re9sCsX({3QNveQnq~AiuubIFI_Srm|M7_Y=K6Zv83dm&`72fpz+SK zsp7{4fw`i`oIu}*O6Jlf3l}d!{2Z%9Zl8tAmR_N9w0!Ah3zp0+oIii*iY3dhEL?H9 zomI_)150mqvTw<5l|byD9p+YcV#d4y5!e zg}@_~oLaocDL3e%5e&zUxI4kX=8^L}0lYw=Ef_4&N(Mcki-RQ5%`gVNFc$$cjJe0d zun)FmC<~Ah=7ORBIf!DhB3_IrGL<`sf=v{qDA=P_w%SC3`&^d69FL1YuOn;D;ZSkX zu}Lb_%l9N0*wc5O&pbE-{bT8Ef&SLV_o6pj7f3l54ktt(gtIeEzfcr6kocK9j1u_> zJPW6v$4~la(D4H^$4T9ziuCP6n8ZGS z0{Z2lxGm@o!PMi>13D%$fs}}wfr|Jv>5b{-!wJR^<)&8&hVayZ+0RJ$Q#WQmrvTg4 zL$p(Ysae_2g&zNlfYGd!_JQlajUX3RE@(@~TM2Y1|Czja{Kh<_$ldUZfZYv!74Tq3 z{C}U|`w$*WYR)4|#1;SlF$a!3;|WACFb@ACdGc#qb{KCRo{kN*;kGBMe%6g~vuF0x`UxclHcfcX>{$NIX*e=qPzSAx=>*5!={cI(W=9vqH< z;4ab!f!zss1$dMzg1-UtMJXl*pGh!AxcsL8yEC*9*d4wK*j+`DW)NtuU_XBco@@iW z$Ks5YyABrupW^bb1$I|q8?fCA5?k8V1p3`&=g9{?+d*jmH6Xa_{C(hwaRwv#*#zS( z7oG)tj0;DBZKFlx7lG{&58)qy-3dJ5Id_I4xRD8hJ4X)yPo=syX){qV0QvH0S~lOkN0+9d%Q*D zq&4wYL-89wfngFk)N|5{2?ox_InM>a?g+{}{&xbqt8hE8yF`s`y3&pTRvD1-8<&FM zHYE1~yOhNE4A@;F>5U1-sZR26K@fO~3*QgyE`b+--8xcmc|d->3^T81M4(5vl7I~S zk46j%HlmZwBY)Y+c8^}hejtf~4+K(=SnOcC9}X5DLdx`V^*-VdrtTds(bFFaqz+br zb~VLEod1i2*(1}huvyo*37t9|ayUeZrjwl1Z_~364Eu-y4u^QQFFsx;hJl+s46{58 z)4dFZ9)^gQVUdSnipybKS6!5%8g?ZPY5C4)9>KI?gDTJ`5oZuLZn=WJ#f+?dhIDa?W=N zGM8=OkWVwe?Lo3l?^OODzlxM1l74VFMZ5(isDc~yZwADeKLt{b%zBea4S4gc=E%Gc znY0z8H1XLzn71pY8oW8*-P_(^CXi&grz@5eteqdtX_Wtu$MXChL=;HdP14S%%zev2 zgWvJH{ZoEdBdB{+{E$l&DIaq|O?Imy&4EaIIuXaxM*=BlO?pF*{ExtcBn$t$%7fnr zw&#V!@ilO|oZ5*~X9cktQ1b)Bef{DRFfUB=2MdNOt5U_QGnh zygo&K^kk8MKLt`xIKbg^Ew1M3Bl$fC{PwJHG5Brmy&vntTOP#(1P+H`E=-+0Tsq?| zJ!3O~Z9j^*;68mq;`Lt%e)n+uHelO8Q1}Pm_Dn#k*Coi0e3B15&(v|H2e)}}L5|KJr9KFc6X8@HcWM|zqonh7hWc4L&RO8W)WY!C5fpfEutfLI z^57yjrlDEXO#rS~p$lm7;C2sgxKihDAfb5d1h#o_rwdDGPE_(c0SY|0={ns%@p>KS zcyNUWH+gVp9CK1KZ_ou6d2qD{H+yi02dCYr%Pa8UatEuTsBs7!u*rklJviwmJ%TI` zF7V(A4{orrir;9p2`twzR_hUDdvKlyM?JXSgPZTv zE2I;Q4iBz>TNk)>hmO;B>bS^*t39|u!_a~zjeswhwCDnZ@8~${!7UzaysPu4d2ogs zlNPqQ3BX(5_Xzkv$3-5T`JwK=)q~S^>HbA7EL%a1iy&E5XJ%_?t_MdwxY~p3J-Fa6 zdICy5axk~Tj*lIJbmV@b;~Ecc_28^eb^Zzu-s-_E4(9lcHiy81s(0%GtM}-*s7=RF z56=Ef_pkBb4jZfZjf~Ir08tNa@nGW%oj=WkGd#G>gDbw`@DaO?>*)*z9vcVy>Nv}T zb38bjuJbo}aHj`n_LKZ0od^q<;NVIRZW7;agS|>RT8}5wgL6H&#Dgn6xWR*4Jh(&0 z5hJO;CjlOu>%k=+T^=JL0?)m0(S6%ZU%hCVvvpthUvJ~gY$;#{+%Oq zTz!lSlfLGRbP<3nJ-E$-i$>}ETgT|QJyXX;C+N8Tq&SxCrE`3oKswu$rQ?#5b=)~Y z#}%jQIO{YWS4`A#%VYBi5;NUzhfYCf(#~qjIxTsji zZC-r2+aGn9MoVV#6dCoUIu0(=ablT{gUfYXxkAVFSL(PUr zl^~fH?kkpab}H<(`t2G;lUZ}b^rDaI?mZ>V~*dbb_gZf(w>A^YA=>BOj9ha!Nzg?v*3Ojvn!*hB7<3$~p zdvMyHb^oO8I^O!Kj*DK?aZ-;K3apocOiQAN1fXFaAd7 zuK}Jz`fVp5+O9KXeyih(?{wVyy^dRc(6O;kOnogdAkxyI)6@P}$2C9dIPGU0H+gXL ze%(L&A3ARRRl|dg!~+_^$o1eR(Y2ZSLZ3;+;gma3m9#D9;!j+lQZw|Q`<2PZCf1j_JDUc5s0 z&s%9@j^Eho5M+2GvD{{0+~UF6A>F^mgF8GpW0lTdVPh4)(P|SoJ|i)#2MBs_rU$os z@l|^G&TDj>7h&uSNa_{ARkLUZ=(xm# zn>@JFgY$0G!`FLotHdaOJI5U!2ID4Oz*Y}#Uak8#SLir;vyR(5IP(_xQ~lcsC?J9h zmwRx92bcek&fn(2(OY%@#3~&dYfKrxlYndx+zDu{)^YG29cQi6anysWJ-BA0&R@UD zWc{~GpktHH5Z$cfhKF@*H0U_TgFBwo{mY-$aqBZ4Ef2A1qTO-yLPn60fz_sDu#$6H^~apw*lXYSN-jtA#?aD|T14e!zgL_N6LgBv`! z&4Wu?b$Jbc(Q%uGp#~Kn=?v{2ob|EpU*y4253cm!oKN)dNuRnfsbQ9z0G#W=1s=TB zgIhef&4UwnyCQ`As0+(x5Zt3PG|#cyP&J-9K@t8zcTKeC@y;Ve<$b7aXJGRu8T?PWLY#t>Y#SP8{R% zABLEtZUS&_ri%f%GgG|r0jjFuB%Pi+PRBXpbsWvoam^_@PCHe{NfUM4tmBB0F$OvLoHSj>Ip^!R)q`^{ zaQTy=NxINQ0Ir#-zdT`A=J$&MP z9anpB<)x0ljNjP0z#&k2jI@P1F7n`N4{q?_CJ%02q|3`JvN6YRG&=+tzhM;H42*Lx z({Y0b8<*?;nI4?u!Fe`T@f$@~=mM%sbzHwp$3Co%a>mYlD;Uxl z@>c1%IjrM?Yjj*0)p4r_=Uu1!2d|enKHq9#f@7j9Z`1>HuGVqJ%{tDzMaLEYqvQ5l zbzFWsVU)k!2V~sgVW`w`;$1r4>cNR?bpO1&b=-Q7j_dCOruw%NQ1pP#(B{EgH|zeH z^*SzjNXH$I=s5dP9ajR&yM=ZFI=AQyc?~+QZx9dfLZ8v$p&O6ud`VB}xalb!SJSn5 zSH|nN>bU4x9XC9u;WLb^7c_#=`l615+dQ~Y#}!Rt)nAa2#8-5B)~h;>dT>dz?jL+z z$K`M6IO%O2XYbH(#3FLSq>fMG(L zj+;Kyam$xFuKZfZiQnkBb+3+d_PMYhIuI10PXhx_Z~Dna2RZ3y9VhPBajpk9b&77E z1qPT&2gFFc2iF|X`7_mlV_Ve|P4UYY(16x%l!$m6EI3NXtsdN*r28i&>$u5-b9?Ll z4XGN&nX^6`!DyflM7R^wSH}(MI<6k5@u3 zaPwl_Kld^nH;9w}ihZ$8b$i@yJ9*1=wu*?3+dVids{0ptaMXhQgEqugi(g{XUvc_OUJ-ESxTRk|VmmWT?w~jM43>7KR z2v|P#;H@5!(XdJ6gxN9-P)+_b=!#-snWXl08PJS9ox<2OF6>f0hTAcyPT3x9J$? zO8>vE?k(1pstn-xg1CEn&cQGzaBzsiDf&PIUWy71$YtOlR1WHhMysM$<3qj0sxQTt zR^z3>%jipsMw!HD`rtz!#59oTXkx5B6}&JY;9!K5i!u+06(qRU%&g9Q|NU^ff8Y9M zeKXUU>&n^Iak*^x+{K!5dh;RnFIe`@;Ik3`Icy7Xi*-_ieI37aqY2IH}tlOwG5; z2|aiK&*3$k!S1DUe!pf@U-fGN;|UzWF`UBcGFh+%dzJJ0s#gU}eKmsT@Cr`g9qhhC zu8_BPQD61;fxNyN!6CeaH*f|!o?L;Bby;5pHc-@8LpX$&a02gO_j0)cUg`ahWO_&# z!E<;8C-4q-ufPfvu6`ubL&6B2!z(y}r|*;n)s@n2ZoU8Q)whj=_$s-8bG392j^Gq- zT_cz88=L3fu0Vu@1a^EmK^LCDD>#GO*B;1^!23F2zU&Ik;SJopPUidY2wuY5>kf+J z-xh40loR&g5MIOTdbzv@58(OrW4XW@2^s9ZOXmCV01n|5oQ@G_-XIHf;2u1I7w`t& z!Qq_0-ziz31NYzwynr|G?v`r){QS!XRUkkAKP&CRb9f7@&&lQ2a9X)I z|94fu)K}fl%L)3h^JO{ShWqdmUhiGhSG#>6udiBPkp%|u1YW}_-2AGXuV-D>S3?^p z>Z=&;QO!TP5%ZwI$#Pnle|*>GlE{m&)gLN2g^Q@A<1{BYyMX}#HP`eC*@tmjG0KRfeJ z`-onh(d?-sdZ>N0acul^Ir#_<;piTjzk{7$$niEjg2y2Oib4&^7;(wiGcnI8XW$vzJUG>+doLJ;pBcft{#wf z>o#X_zaG#Y!CScXM>*jDj^GuX)SSP9>}mn?3KIND7MQ{joWeVJ{bxB}TDf=y3;!Y$ z7Vs8sJt*^ga0th6ws%oqwGugD08ij0oWjmSay}m(T9@@zWCLdZ>#rD2;T`NgEDL&Y z4<41?zk{12VFf4f4tD>F6@Yv2sBrZTZjOW%yn!>=c|@*22M*w2ZoU8QH7i8I7Veg} zbF%q!ID>=7PogaU81-3}&JS!In;RKGJ zlle<{4X4lH9o!BHP9`UGo|kUH9vr{}c=9~{W7K{@78w3VdJB6yIX;IsaQnY9e>6s5 z{-R89Uy{yX?|*VUgfn>bvdkaH2xRc;^hW-Iv_D45TX|V8UnR%a@aRB}I}PEn+Q@(k z4v7S{h8Imap2EY!a(oI0N9yDH`0pI82lN{%cyopv_g^g?!A?t#cVX}KwQ+O)h4p}T zbYU&Q?EJR0f01;0vGneZ(!DoHCpG8izxQUDu!7yU$no$J>G_q??p4wwcwITKui973 z1*UKe@2-*gi|eGDC#8LOxOY)sMf-r+-}+P28{`CicnY^~l=%aA0?)0>`YN%3qQ1)D z`AxDw^OW=mUfwLnTknx>zqfF8{VxOdyk5LdF5m{z?e|O1>09J@^8@e)b63~@Q4!c* z4VNF13$#8gy@gvnIlhG5kI3=(W5#;_+btg5DifL?mtMooPss5OY+F9q`G*h6{E@MF z{%t~tggG3+3wQ~y;22(O=f|I2fejM2uu9|>G+_sJ;STI2`c~iO%dS9xgaJH(LwEtl zZ~|w^7+ds^bPM+20Pev9cmhwy2t@D#Ucqa43#*6a2D$LKjerMt;XXWqLwF7^rN?S5 z11g1gu)YH%#RZowYx!##Ki zPixN4zo-^4`*sCy;4N%hUD(sueYCcPdcGFyRW8ndzY3W8stX5j5AMSQcnFX7F6ygr zAIR&gIUK>ZX|~iXY8LI?KY0Pe#>cmjvH_5QcdQG|pg9K#zpg)>;C*aODq`L`?3LP7`j z;Q;Q#LwEv*+WGNkS0F;d5{}^woWdEb9>*Sd9M}IA5<0N%i7rm70M?z&#rP1Oz~SR# zxj=-3B^<*WIE6D<{aw~`#t7)n=VA*wunz}tA0EOJcpM@S!Am%XH*gAPux{jD-$4Bv zTr!|^7x#LC>cBp%+rNwaK0Jgc!ut3RML@s(hL>;*Z{QTpVD*pM3Y+uKsRy)Ma0m9` z0Pe#>cv5qI{)e@I*_RQ#gkyLEr*HKfCump)~)XII?dws zPjB%)kjK>mj^Q<&!dqB9X$uzfH?529*IR4@#kgw2KHP=-@Bp5`^V0k4zi#MW?vi2+ z)^G~j?)CQCp}W?L|I}7|8>)PF@fz}ZzqT_Zd=#eaow_BEN?s4+i|s( z<8E%f|7}7C3A$aqn6M9zVBJk#gf7N)_j7suPm!>LbtiW*K^yMCT{wUT+WGNk z_rMSdy4|}dIENRoZtO1d6F7r+PvQFSJS`_^!@8-wC}7)%*bV4od;m}2>C?FWhe(*i z5xjtx@CuIMWQ;%tH=mJPtQ*LSJC(`<_ z%49%o;T>$7mD}gM{j4n5fpy0-qvl-zg<0` z?fz4)knWK!R?vsLZ~*Im%wl=nCVTJv{MW6t_W|=w1TWzj-oPoG!Mazrt(VtVP8G-p zT5t!}?Xv9z`C|b0;UPTPyQr_ieITDtMeq`iVcm>dtWXB)KG9-aH;^uTQBhCnrt%^| zH#HaDJaRBQb!Owd@%-z>5=Zod`7@*LlhTWSNpD_|4qle_-ca0d($2U2sI-5(u>QR6 zHzJ^%N8x`FsLe~BAUO?78^ z`F97^1c!92`^jqDcy(JfZZ4(4cPby&9{jMfnKS)y?pyN)a;6j1@YB_V#?w``z!}=k zy_HRit>C`OrrlHe`^sl(FZzwy56)`bb2$56F|o=U(apYacH``GO?OK3WgkzT%&A*7 znx@CIpP3x{d7FK7T#@sv&N(_LUsm-4^*rwNUVE*z*PhlM z&N-A*+T+AKuKQd&1pLGd{1>eJYcSMxFzp}cmlQf%QW)0M;H2gYNKE+u@(49wp9aiT z<*cc_o)KBoPN;hNH1cs(&yw~rSQWW-IW zWOihQY+6!Y8FLZDfON@x&$y6vecc>lbQ6D@Bbl38cIve}T{XtbbOpJ~4(~usqsg3M z46|wfdBhwhm9Uy4W*1Wi8}oWzzR4u8w~v?$TVybY*UeE5@eDE*4q1vyQp<&G-fQNn zmjAxMV`*mZmTG}qd&Fybw_3%j?kBYzY2M$a8~Y*EoZIH#TbyZcQMGV3H7~cVr@$_5 zLzDH&YjC_Eh_jYS=5tPd?Dyx)jZU6y$2PNP`#^=eto>9al`Uxt=Y?$HHgk+~E^E2l z?9w5H-Ct$S=#a|#ZZdm!jAu!Q%~>72+2+G}6&=Hx4TnBwj&kv2SGSr|T>iV^Wt|tY zcek2LI_I*5&za+0Q&{mTbE9i2+Z=CB?UKeWX6AWzog$cja-YG5Y&8dZRIpXZ8J^2d z?=lAlBns`!Cj*wTsk_X%y*ydf7IWB$2=?_xvv==AHaOFq+xv|9r;#&Q<`#3{s0#M& zMsr5@TsCBvIjlz_>%7EV)+2%y?lfnN@nqr9b&FsVH=5l7zcXL;I>3J0V2+2(Z`ed?lk-R#EZ)lCy1I8XN4W^=^22=?N7bMClY_QOGQ)Ob%;bI_bJe%_1z@3UE(m44Z~ zUg?(~cJO{-7edU10WmCYhte^^W~E~utW!E>+Cf{#e43ziOyfGGV`lA8I_9e=rDJY9 zt8~n|1f^q^uS3V&G}nwbDkJmu_=QS3X@Yj7-kz|Kxh0rGCdRXxKh1>`qnMarb_=Ox zH}>Q?PI463={;t*&=BWRYK{VY)<3n|93Ps`GWVFhAB}h@H)1!XejvGs_tB%_lRL3T z%@kN`^k&b#WKMfDtk=2&27_b}l{V(a{&8Okh*kfsV-kYKrYkD~^b#sKs zJX5Ilq%p&MCNW(YZ$7!TAN$V^IrdMZiy(AU;8#1iKyUM#Nv*}d(VlYB;BGzUH8+Q3 zP#0=fB<<&69ZTxL2E1T)OZFD~1BNGea^9tL<*66U@yYS5VuiUjIgpjD$n)NwCWy-* zeeUUr;+Xl8x!p5k#OqueX&&(2XZ*xgNY5et1!)t~Bgh~Ate?09c+Ine73U5iZGrG} z@!7s&9`YX`eHQudJ0=d8Vdu1rzT>O6E9z08^X|$XbLtKkk=G@AM-Oou(sMidiqm1{ z9@4YGom2XXF9HW4tp{F)^eXUPq;5!Mq>V_ckwzlF#m+GUhRknnGhTcfOYxPu;t%XG z$L@3y_d;#w&b}g=+I)N`CeEI`lARSTh1KSR`+b}}bOY;=WOLR2sE62nlg(i-CbAXJ znB9axwlr4Rk|Zosw34HtS|Do? zn^%|?Ca~+P&5r36%yqfhF~gsIyxQ#cN*H^0bzbZ%$lSTwT=;4R`)rvx>VSXeRjUn# z&4>3jp^k>lN79v4GJKRbKcm0Ec5OGO9P(yQZ_mp=m6U}ZPHnQT> zJhzW(Md8c5wuSDZYs@xS$gHtgXi(B37lXk(;gqj)!Gh*C<-zRd7UstD>UJgk!qm?C z>|?DAhE9f|=254+ShrkW|7*)Ncst79nJk#Eed^V2?F@rq?cuscUai?eFg>3u_HtS*`J$_U2wN{>;K$IPfj*BewHOhEL0kteYH66 z*5@YSA*0#mf6j+1n`exthjLf^pNjl32}P!u_k7`DD|YQ-bL|&p580ji|17oL|Ebiy zYN-p#J;YQ?Wjil67na97RI0(g)Q4LCw1YYK!oT0?31IHz*( zzwYjj63vB`Sz-}d;84{VHZIy+Rh4V*Q{kkts>iTiU{w#G$ZgCy@8&nos&5azwU#(l z@iqIJpW;dNH7j57WbgHV?@0&lNt$_2m6LeK;?03Y@TO3O@MH^Mb?ShCSG8@iW2d@F zo~Gl+?4-grCKvNNHBQc(_ZbXD>fTOizlG16%W6E?>OJOqBtxDzyWQ{<-{JG|hP47y z75w0apLhp+pPRFJXVATG*i?ma<>tSy+RAO_!0)m|?Fh@q2GpwA-BfeU+kg2$eq>l~?vdgag|%Ezh&o(}C>_&kL(hG_mvH zd1Zgco7m6c6e0?Z?5~X!Vid6B-ze7`1#IO`ZX|z`kip*EC|8)U*s;YM$)%-`%EC9w zSx5!eW25ZfniD^7pprJoxw?TO+9Ex-fo}2igAH=Lqu?ko^9DJk9VgaqpeiT9O@7}= zXlS7{%yCy?qMcoZF=Fp%iOzKu{6qq$i4zyV8Qx78 zEbfYsXc;FekVTwGII$Qq4>;ipqH_-ryFm=+L@|gtoM;8%O`JHv?Qr68Zif>s;l`C7!fZDC9(nV9 z#g=;%>n6mrPEXSsP2o5Ae7h_uAW*z{+`Hq92tu|k>OKC z@t#5nYqgyM`w8C6xSe8o+L%m^Zh{*NP|67ulc3Pl4+?)>Cl@avhTTl2L@x+lOQu{e zA%xAZCAWWs?®7{I={MuGi>C@~ybhx((bTvkzie@KsCK%N6ozOCl(UZPAP+hLe?ol4)GS^g=VAT zb*k_Y^4W#il(#Mo&ZyGAKPp%Fh@4tzww4Uf&irPrur z7;?O4%ZYx1o50?mCujHz{sMbp9#ss7Ra+@2(d9EBE%&ReDF6EAe zsBI7xe?zrnQRC-k%30%t5P|(3Mz!M+9~vSlae}>M%r{gx0g^s5<@kw$x4`luDJ#TY zqUSesD+CpNBa+-EA;UI|oWG%{Nr+=xBPl8r0vjVKEmX*2pKqnWN6}ciS8T|CERL0X6x5|x^Q7>`a6A~3o#dvxB8dXfSOs=5Yf{SpKLc%b& zo}W%tVS*>y@&v_B6XI!WxZujtrc+utB2<(mGfc@$WhPl1wwfur;T-lA?}@UFEo$!V?1f@ky$fB}54~$Zxi= zlRbWi3TF!`Ec^Qf08=Fu&Vd7o5fm0_2_@C;sP4~KC@m5V z7#l%lk@i97>J{>wE8Joyo{}Bs3Aq9r2@~@nVH+)5u8_+D6!u^?1%4~q4bP=lsAK`W z*}M|n2l($^)`7gLU3r>OlgaRFt!ai z8d0iMw9t$FeVKz0cFMwhHCpJ(evP91XlN`AC%46@7h7TpWnWfM3}@H^Lum!&a)vE1 z6je|?XLN>&5=HYXORwN4@-`iH+34B4j�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 diff --git a/tests/unit/ext_swap.test.ts b/tests/unit/ext_swap.test.ts index dd6c823..1444b32 100644 --- a/tests/unit/ext_swap.test.ts +++ b/tests/unit/ext_swap.test.ts @@ -2,6 +2,7 @@ import { BN } from "@coral-xyz/anchor"; import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; import { TOKEN_2022_PROGRAM_ID, + TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, } from "@solana/spl-token"; import { ExtensionSwapTest } from "./ext_test_harness"; @@ -279,6 +280,13 @@ describe("extension swap tests (new)", () => { }); describe("error cases", () => { + // [x] given extension is not whitelisted + // [x] it reverts + // [x] given swap amount is 0 + // [x] it reverts + // [x] given swapping to same extension + // [x] it reverts with constraint violation + it("should fail when extension is not whitelisted", async () => { // Remove extension C from whitelist first await $.swapProgram.methods @@ -336,6 +344,32 @@ describe("extension swap tests (new)", () => { .rpc() ).rejects.toThrow(); }); + + it("should fail when swapping to same extension", async () => { + const accounts = await getTokenAccounts(); + + await expect( + $.swapProgram.methods + .swap(new BN(100), 0) + .accounts({ + signer: $.swapperKeypair.publicKey, + unwrapAuthority: $.swapProgram.programId, + wrapAuthority: $.swapProgram.programId, + mMint: $.mMint.publicKey, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + fromExtProgram: $.getExtensionProgramId("extA"), + toExtProgram: $.getExtensionProgramId("extA"), // Same as from + fromMint: $.getExtensionMint("mintA"), + toMint: $.getExtensionMint("mintA"), + fromTokenAccount: accounts.ataA, + toTokenAccount: accounts.ataA, + toTokenProgram: TOKEN_2022_PROGRAM_ID, + fromTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.swapperKeypair]) + .rpc() + ).rejects.toThrow(); // Anchor constraint violation + }); }); describe("remaining accounts tests", () => { @@ -590,6 +624,10 @@ describe("extension swap tests (new)", () => { .rpc(), "NotAuthorized" ); + + // re-add swap program as wrap authority for later tests + $.svm.expireBlockhash(); + await $.addWrapAuthorityToExtension("extA", swapGlobal); }); it("should fail to wrap with invalid external ext wrap authority co-signer", async () => { @@ -641,6 +679,16 @@ describe("extension swap tests (new)", () => { it("should fail swap with mismatched authorities", async () => { const accounts = await getTokenAccounts(); + // Remove swap program as wrap authority from extension A + const swapGlobal = $.getSwapGlobalAccount(); + await $.extensionPrograms.extA.methods + .removeWrapAuthority(swapGlobal) + .accounts({ + admin: $.admin.publicKey, + }) + .signers([$.admin]) + .rpc(); + await expect( $.swapProgram.methods .swap(new BN(15), 0) @@ -662,6 +710,10 @@ describe("extension swap tests (new)", () => { .signers([$.swapperKeypair, $.admin]) .rpc() ).rejects.toThrow(); + + // re-add swap program as wrap authority for later tests + $.svm.expireBlockhash(); + await $.addWrapAuthorityToExtension("extA", swapGlobal); }); it("should swap with valid wrap authority", async () => { @@ -812,4 +864,611 @@ describe("extension swap tests (new)", () => { .rpc(); }); }); + + // ========================================================================== + // JMI (Just Mint It) Test Cases + // ========================================================================== + + describe("wrap_asset operations", () => { + // ext_swap level validation + // [x] given the extension is not whitelisted + // [x] it reverts with an InvalidExtension error + // [x] given amount is 0 + // [x] it reverts with an InvalidAmount error + // [x] given the caller is not authorized (not in wrap_authorities) + // [x] it reverts with a NotAuthorized error + // [x] given the contract is paused + // [x] it reverts with a Paused error + // [x] given the asset is M (not a stablecoin) + // [x] it reverts with an AssetNotAllowed error + // [x] given the asset_config.cap is 0 (asset not whitelisted) + // [x] it reverts with an AccountNotInitialized error + // [x] given new_balance would exceed asset_config.cap + // [x] it reverts with an AssetCapExceeded error + // [x] given replace_authority is not provided (None) + // [x] it uses the fallback_replace_authority PDA + // [x] it transfers asset from user to vault + // [x] it mints ext tokens 1:1 to user + // [x] it increments total_assets on the global account + // [x] given replace_authority is provided (Some) + // [x] it uses the external replace_authority signer + // [x] given external replace_authority is provided but does not sign + // [x] it reverts with Signer constraint violation + + let assetMint: Keypair; + const wrapAssetCap = new BN(1_000_000_000); + const wrapAssetAmount = new BN(100_000); + + beforeAll(async () => { + // Create asset mint (stablecoin) + assetMint = await $.createAssetMint(); + + // Set asset cap on JMI extension (extA) + await $.setAssetCapOnExtension("extA", assetMint.publicKey, wrapAssetCap); + + // Whitelist replace authority PDA on extension + await $.addWrapAuthorityToExtension("extA", $.getReplaceAuthorityPda()); + + // Mint asset tokens to swapper + await $.mintAssetTokensTo( + assetMint, + $.swapperKeypair.publicKey, + wrapAssetAmount.mul(new BN(10)) + ); + }); + + it("should fail when extension is not whitelisted", async () => { + // Create a new asset mint that's not whitelisted on ext_swap + const newAssetMint = await $.createAssetMint(); + await $.setAssetCapOnExtension("extA", newAssetMint.publicKey, wrapAssetCap); + await $.mintAssetTokensTo(newAssetMint, $.swapperKeypair.publicKey, wrapAssetAmount); + + // Remove extA from swap whitelist + await $.swapProgram.methods + .removeWhitelistedExtension($.getExtensionProgramId("extA")) + .accounts({ admin: $.admin.publicKey }) + .signers([$.admin]) + .rpc(); + + await $.expectAnchorError( + $.wrapAssetViaSwap("extA", newAssetMint.publicKey, wrapAssetAmount, $.swapperKeypair), + "InvalidExtension" + ); + + // Re-add for later tests + $.svm.expireBlockhash(); + await $.whitelistExtension($.getExtensionProgramId("extA"), $.getExtensionMint("mintA")); + }); + + it("should fail when amount is zero", async () => { + await $.expectAnchorError( + $.wrapAssetViaSwap("extA", assetMint.publicKey, new BN(0), $.swapperKeypair), + "InvalidAmount" + ); + }); + + it("should fail when fallback_replace_authority is not authorized", async () => { + // Remove fallback_replace_authority PDA from extA's wrap_authorities + await $.extensionPrograms.extA.methods + .removeWrapAuthority($.getReplaceAuthorityPda()) + .accounts({ admin: $.admin.publicKey }) + .signers([$.admin]) + .rpc(); + + await $.expectAnchorError( + $.wrapAssetViaSwap("extA", assetMint.publicKey, wrapAssetAmount, $.swapperKeypair), + "NotAuthorized" + ); + + // Re-add for later tests + $.svm.expireBlockhash(); + await $.addWrapAuthorityToExtension("extA", $.getReplaceAuthorityPda()); + }); + + it("should fail when contract is paused", async () => { + await $.pauseExtension("extA"); + + await $.expectAnchorError( + $.wrapAssetViaSwap("extA", assetMint.publicKey, wrapAssetAmount, $.swapperKeypair), + "Paused" + ); + + // Unpause for later tests + $.svm.expireBlockhash(); + await $.unpauseExtension("extA"); + }); + + it("should fail when asset is M token", async () => { + // Attempt to use M mint as asset - this should fail because M is not a valid asset + // The CPI to wrap_asset will fail with AssetNotAllowed since asset_config doesn't exist for M + await $.expectSystemError( + $.wrapAssetViaSwap("extA", $.mMint.publicKey, wrapAssetAmount, $.swapperKeypair) + ); + }); + + it("should fail when asset cap is zero", async () => { + // Create new asset without setting cap (or set cap to 0) + const uncappedAsset = await $.createAssetMint(); + await $.mintAssetTokensTo(uncappedAsset, $.swapperKeypair.publicKey, wrapAssetAmount); + + // Asset config doesn't exist, so this should fail + await $.expectAnchorError( + $.wrapAssetViaSwap("extA", uncappedAsset.publicKey, wrapAssetAmount, $.swapperKeypair), + "AccountNotInitialized" + ); + + }); + + it("should fail when asset cap would be exceeded", async () => { + // Create asset with low cap + const lowCapAsset = await $.createAssetMint(); + await $.setAssetCapOnExtension("extA", lowCapAsset.publicKey, new BN(1000)); + await $.mintAssetTokensTo(lowCapAsset, $.swapperKeypair.publicKey, new BN(2000)); + + await $.expectAnchorError( + $.wrapAssetViaSwap("extA", lowCapAsset.publicKey, new BN(1500), $.swapperKeypair), + "AssetCapExceeded" + ); + }); + + it("should wrap asset with fallback replace authority", async () => { + const userAssetAta = await $.getATA(assetMint.publicKey, $.swapperKeypair.publicKey, false); + const userExtAta = await $.getATA($.getExtensionMint("mintA"), $.swapperKeypair.publicKey); + const mVault = $.getMVaultForExtension($.getExtensionProgramId("extA")); + const vaultAssetAta = await $.getATA(assetMint.publicKey, mVault, false); + + const initialUserAssetBalance = await $.getTokenBalance(userAssetAta, false); + const initialVaultAssetBalance = await $.getTokenBalance(vaultAssetAta, false); + + await $.wrapAssetViaSwap("extA", assetMint.publicKey, wrapAssetAmount, $.swapperKeypair); + + // Verify asset transferred from user to vault + await $.expectTokenBalance(userAssetAta, initialUserAssetBalance.sub(wrapAssetAmount), undefined, undefined, false); + await $.expectTokenBalance(vaultAssetAta, initialVaultAssetBalance.add(wrapAssetAmount), undefined, undefined, false); + + // Verify ext tokens minted to user (1:1) + const userExtBalance = await $.getTokenBalance(userExtAta); + expect(userExtBalance.gte(wrapAssetAmount)).toBe(true); + }); + + it("should wrap asset with external replace authority", async () => { + const userAssetAta = await $.getATA(assetMint.publicKey, $.swapperKeypair.publicKey, false); + const initialUserAssetBalance = await $.getTokenBalance(userAssetAta, false); + + await $.wrapAssetViaSwap( + "extA", + assetMint.publicKey, + wrapAssetAmount, + $.swapperKeypair, + $.admin // external replace authority + ); + + // Verify wrap succeeded + await $.expectTokenBalance(userAssetAta, initialUserAssetBalance.sub(wrapAssetAmount), undefined, undefined, false); + }); + + it("should increment total_assets on wrap_asset", async () => { + // Fetch initial total_assets from extA global account + const jmiGlobalPda = $.getExtGlobalAccountFor("extA"); + const initialGlobal = await $.extensionPrograms.extA.account.extGlobalV2.fetch(jmiGlobalPda); + const initialTotalAssets = (initialGlobal.yieldConfig as any).totalAssets as BN; + + // Wrap asset + const wrapAmount = new BN(5_000); + await $.wrapAssetViaSwap("extA", assetMint.publicKey, wrapAmount, $.swapperKeypair); + + // Verify total_assets incremented by exact amount + const finalGlobal = await $.extensionPrograms.extA.account.extGlobalV2.fetch(jmiGlobalPda); + const finalTotalAssets = (finalGlobal.yieldConfig as any).totalAssets as BN; + expect(finalTotalAssets.eq(initialTotalAssets.add(wrapAmount))).toBe(true); + }); + + it("should fail when external replace_authority does not sign", async () => { + const userAssetAta = await $.getATA(assetMint.publicKey, $.swapperKeypair.publicKey, false); + const userExtAta = await $.getATA($.getExtensionMint("mintA"), $.swapperKeypair.publicKey); + const mVault = $.getMVaultForExtension($.getExtensionProgramId("extA")); + const vaultAssetAta = await $.getATA(assetMint.publicKey, mVault, false); + const toMintAuthority = PublicKey.findProgramAddressSync( + [Buffer.from("mint_authority")], + $.getExtensionProgramId("extA") + )[0]; + + // Try to use admin as replace_authority but don't include them as signer + await expect( + $.swapProgram.methods + .wrapAsset(wrapAssetAmount) + .accountsPartial({ + signer: $.swapperKeypair.publicKey, + replaceAuthority: $.admin.publicKey, // External authority provided + fallbackReplaceAuthority: $.getReplaceAuthorityPda(), + swapGlobal: $.getSwapGlobalAccount(), + toGlobal: $.getExtGlobalAccountFor("extA"), + toMint: $.getExtensionMint("mintA"), + assetMint: assetMint.publicKey, + assetConfig: $.getAssetConfigAccount("extA", assetMint.publicKey), + assetTokenAccount: userAssetAta, + toTokenAccount: userExtAta, + toVaultAuth: mVault, + toMintAuthority: toMintAuthority, + toAssetVault: vaultAssetAta, + toTokenProgram: TOKEN_2022_PROGRAM_ID, + assetTokenProgram: TOKEN_PROGRAM_ID, + toExtProgram: $.getExtensionProgramId("extA"), + }) + .signers([$.swapperKeypair]) // Note: $.admin NOT included as signer + .rpc() + ).rejects.toThrow(); // Anchor Signer constraint violation + }); + }); + + describe("unwrap_asset operations", () => { + // ext_swap level validation + // [x] given the source extension (from_ext) is not whitelisted + // [x] it reverts with an InvalidExtension error + // [x] given the JMI extension (jmi_ext) is not whitelisted + // [x] it reverts with an InvalidExtension error + // [x] given from_principal is 0 + // [x] it reverts with an InvalidAmount error + // [x] given the caller is not authorized on source extension + // [x] it reverts with a NotAuthorized error + // [x] given the caller is not authorized (not in wrap_authorities) + // [x] it reverts with a NotAuthorized error + // [x] given the contract is paused + // [x] it reverts with a Paused error + // [x] given the vault has insufficient asset backing for the conversion + // [x] it reverts with an InsufficientAssetBacking error + // [x] given valid inputs + // [x] it burns ext tokens from user (via unwrap) + // [x] it converts M amount to asset amount using M index (rounds down) + // [x] it transfers M from swap_m_account to JMI M vault + // [x] it transfers asset from JMI asset vault to user + // [x] it decrements total_assets on the JMI global account + + let unwrapAssetMint: Keypair; + const unwrapAssetCap = new BN(1_000_000_000); + const unwrapAssetAmount = new BN(50_000); + + beforeAll(async () => { + // Setup for unwrap_asset tests: + // 1. Create and configure asset on JMI extension (extA) + unwrapAssetMint = await $.createAssetMint(); + await $.setAssetCapOnExtension("extA", unwrapAssetMint.publicKey, unwrapAssetCap); + + // 2. Mint assets and wrap them to populate JMI vault + await $.mintAssetTokensTo(unwrapAssetMint, $.swapperKeypair.publicKey, unwrapAssetAmount.mul(new BN(5))); + await $.wrapAssetViaSwap("extA", unwrapAssetMint.publicKey, unwrapAssetAmount.mul(new BN(3)), $.swapperKeypair); + + // 3. Give swapper some extB tokens (wrap M to extB) + const accounts = await getTokenAccounts(); + await $.swapProgram.methods + .wrap(unwrapAssetAmount) + .accounts({ + signer: $.swapperKeypair.publicKey, + wrapAuthority: $.swapProgram.programId, + mMint: $.mMint.publicKey, + mTokenAccount: accounts.ataM, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + toExtProgram: $.getExtensionProgramId("extB"), + toMint: $.getExtensionMint("mintB"), + toTokenAccount: accounts.ataB, + toTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.swapperKeypair]) + .rpc(); + + // 4. Add replace authority to extB for unwrap_asset tests + await $.addWrapAuthorityToExtension("extB", $.getReplaceAuthorityPda()); + }); + + it("should fail when source extension is not whitelisted", async () => { + // Remove source extension from whitelist + await $.swapProgram.methods + .removeWhitelistedExtension($.getExtensionProgramId("extB")) + .accounts({ admin: $.admin.publicKey }) + .signers([$.admin]) + .rpc(); + + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + "InvalidExtension" + ); + + // Re-add for later tests + $.svm.expireBlockhash(); + await $.whitelistExtension($.getExtensionProgramId("extB"), $.getExtensionMint("mintB")); + }); + + it("should fail when JMI extension is not whitelisted", async () => { + // Remove JMI extension from whitelist + await $.swapProgram.methods + .removeWhitelistedExtension($.getExtensionProgramId("extA")) + .accounts({ admin: $.admin.publicKey }) + .signers([$.admin]) + .rpc(); + + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + "InvalidExtension" + ); + + // Re-add for later tests + $.svm.expireBlockhash(); + await $.whitelistExtension($.getExtensionProgramId("extA"), $.getExtensionMint("mintA")); + }); + + it("should fail when from_principal is zero", async () => { + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, new BN(0), $.swapperKeypair), + "InvalidAmount" + ); + }); + + it("should fail when fallback_replace_authority not authorized on source extension", async () => { + // Remove fallback_replace_authority PDA from source extension's wrap_authorities + await $.extensionPrograms.extB.methods + .removeWrapAuthority($.getReplaceAuthorityPda()) + .accounts({ admin: $.admin.publicKey }) + .signers([$.admin]) + .rpc(); + + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + "NotAuthorized" + ); + + // Re-add for later tests + $.svm.expireBlockhash(); + await $.addWrapAuthorityToExtension("extB", $.getReplaceAuthorityPda()); + }); + + it("should fail when fallback_replace_authority not authorized on JMI extension", async () => { + // Remove fallback_replace_authority PDA from JMI extension's wrap_authorities + await $.extensionPrograms.extA.methods + .removeWrapAuthority($.getReplaceAuthorityPda()) + .accounts({ admin: $.admin.publicKey }) + .signers([$.admin]) + .rpc(); + + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + "NotAuthorized" + ); + + // Re-add for later tests + $.svm.expireBlockhash(); + await $.addWrapAuthorityToExtension("extA", $.getReplaceAuthorityPda()); + }); + + it("should fail when JMI contract is paused", async () => { + await $.pauseExtension("extA"); + + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + "Paused" + ); + + // Unpause for later tests + $.svm.expireBlockhash(); + await $.unpauseExtension("extA"); + }); + + it("should fail when insufficient asset backing", async () => { + // Create a new asset with minimal backing in vault + const lowBackingAsset = await $.createAssetMint(); + await $.setAssetCapOnExtension("extA", lowBackingAsset.publicKey, unwrapAssetCap); + await $.mintAssetTokensTo(lowBackingAsset, $.swapperKeypair.publicKey, new BN(100)); + // Wrap only a small amount + await $.wrapAssetViaSwap("extA", lowBackingAsset.publicKey, new BN(50), $.swapperKeypair); + + // Try to unwrap more than what's backed (vault only has 50 assets) + await $.expectAnchorError( + $.unwrapAssetViaSwap("extB", "extA", lowBackingAsset.publicKey, unwrapAssetAmount, $.swapperKeypair), + "InsufficientAssetBacking" + ); + }); + + it("should unwrap asset successfully", async () => { + const userAssetAta = await $.getATA(unwrapAssetMint.publicKey, $.swapperKeypair.publicKey, false); + const userExtBAta = await $.getATA($.getExtensionMint("mintB"), $.swapperKeypair.publicKey); + const jmiMVault = $.getMVaultForExtension($.getExtensionProgramId("extA")); + const jmiAssetVault = await $.getATA(unwrapAssetMint.publicKey, jmiMVault, false); + + const initialUserAssetBalance = await $.getTokenBalance(userAssetAta, false); + const initialUserExtBBalance = await $.getTokenBalance(userExtBAta); + const initialVaultAssetBalance = await $.getTokenBalance(jmiAssetVault, false); + + const unwrapAmount = new BN(1_000); + await $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAmount, $.swapperKeypair); + + // Verify ext tokens burned from user + const finalUserExtBBalance = await $.getTokenBalance(userExtBAta); + expect(finalUserExtBBalance.lt(initialUserExtBBalance)).toBe(true); + + // Verify asset transferred to user + const finalUserAssetBalance = await $.getTokenBalance(userAssetAta, false); + expect(finalUserAssetBalance.gt(initialUserAssetBalance)).toBe(true); + + // Verify asset removed from vault + const finalVaultAssetBalance = await $.getTokenBalance(jmiAssetVault, false); + expect(finalVaultAssetBalance.lt(initialVaultAssetBalance)).toBe(true); + }); + + it("should transfer M to JMI M vault", async () => { + // Get JMI M vault token account + const jmiMVaultAuth = $.getMVaultForExtension($.getExtensionProgramId("extA")); + const jmiMVaultAta = await $.getATA($.mMint.publicKey, jmiMVaultAuth); + + // Get initial balance + const initialJmiMVaultBalance = await $.getTokenBalance(jmiMVaultAta); + + // Perform unwrap_asset (extB → asset via extA's JMI) + const unwrapAmount = new BN(500); + await $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAmount, $.swapperKeypair); + + // Verify M transferred to JMI vault + const finalJmiMVaultBalance = await $.getTokenBalance(jmiMVaultAta); + expect(finalJmiMVaultBalance.gt(initialJmiMVaultBalance)).toBe(true); + }); + }); + + describe("wrap_asset and unwrap_asset integration", () => { + // [x] given M backing is insufficient on source extension + // [x] it reverts with an InsufficientMBacking error + // [x] given valid signer and inputs and sufficent backing + // [x] users m_ext bal less than before + // [x] users asset bal greater than before + // [x] should correctly track total_assets through multiple operations + // [x] verifies vault balance decreases correctly + // [x] verifies total_assets decreases by exact asset amount transferred + // [x] confirms total_assets stays consistent with actual vault holdings + + let integrationAssetMint: Keypair; + const integrationCap = new BN(10_000_000); + const integrationAmount = new BN(100_000); + + beforeAll(async () => { + // Setup for integration tests + integrationAssetMint = await $.createAssetMint(); + await $.setAssetCapOnExtension("extA", integrationAssetMint.publicKey, integrationCap); + // await $.addWrapAuthorityToExtension("extA", $.getReplaceAuthorityPda()); + // await $.addWrapAuthorityToExtension("extB", $.getReplaceAuthorityPda()); + await $.mintAssetTokensTo(integrationAssetMint, $.swapperKeypair.publicKey, integrationAmount.mul(new BN(10))); + }); + + it("should revert unwrap_asset when M backing is insufficient (same-extension)", async () => { + const userAssetAta = await $.getATA(integrationAssetMint.publicKey, $.swapperKeypair.publicKey, false); + const userExtAAta = await $.getATA($.getExtensionMint("mintA"), $.swapperKeypair.publicKey); + + // Wrap asset to get extA tokens (these are asset-backed, no M in vault) + await $.wrapAssetViaSwap("extA", integrationAssetMint.publicKey, integrationAmount, $.swapperKeypair); + + // Verify ext tokens received + const extABalance = await $.getTokenBalance(userExtAAta); + expect(extABalance.gte(integrationAmount)).toBe(true); + + // Attempt to unwrap_asset with same extension (extA → extA) + // Should fail because asset-backed tokens have no M backing + // This matches EVM behavior where totalAssets == totalSupply means M backing = 0 + const unwrapAmount = integrationAmount.div(new BN(2)); + + await $.expectAnchorError( + $.unwrapAssetViaSwap( + "extA", // from extension + "extA", // JMI extension (same) + integrationAssetMint.publicKey, + unwrapAmount, + $.swapperKeypair + ), + "InsufficientMBacking" + ); + }); + + it("should unwrap_asset when source extension has sufficient M backing", async () => { + // Setup: Give swapper M-backed extB tokens (wrap M → extB) + const accounts = await getTokenAccounts(); + const wrapMAmount = new BN(50_000); + + await $.swapProgram.methods + .wrap(wrapMAmount) + .accounts({ + signer: $.swapperKeypair.publicKey, + wrapAuthority: $.swapProgram.programId, + mMint: $.mMint.publicKey, + mTokenAccount: accounts.ataM, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + toExtProgram: $.getExtensionProgramId("extB"), + toMint: $.getExtensionMint("mintB"), + toTokenAccount: accounts.ataB, + toTokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .signers([$.swapperKeypair]) + .rpc(); + + // Now extB has M backing. Unwrap extB → get assets from extA's JMI vault + const userAssetAta = await $.getATA(integrationAssetMint.publicKey, $.swapperKeypair.publicKey, false); + const initialAssetBalance = await $.getTokenBalance(userAssetAta, false); + const userExtBBalance = await $.getTokenBalance(accounts.ataB); + + const unwrapAmount = wrapMAmount.div(new BN(2)); + + await $.unwrapAssetViaSwap( + "extB", // from extension (has M backing) + "extA", // JMI extension (has assets in vault from previous wrap_asset) + integrationAssetMint.publicKey, + unwrapAmount, + $.swapperKeypair + ); + + // Verify: extB tokens burned, assets received + const finalExtBBalance = await $.getTokenBalance(accounts.ataB); + expect(finalExtBBalance.lt(userExtBBalance)).toBe(true); + + const finalAssetBalance = await $.getTokenBalance(userAssetAta, false); + expect(finalAssetBalance.gt(initialAssetBalance)).toBe(true); + }); + + it("should correctly track total_assets through multiple operations", async () => { + // Create a fresh asset for clean tracking + const trackingAsset = await $.createAssetMint(); + await $.setAssetCapOnExtension("extA", trackingAsset.publicKey, integrationCap); + await $.mintAssetTokensTo(trackingAsset, $.swapperKeypair.publicKey, integrationAmount.mul(new BN(5))); + + const jmiMVault = $.getMVaultForExtension($.getExtensionProgramId("extA")); + const vaultAssetAta = await $.getATA(trackingAsset.publicKey, jmiMVault, false); + const jmiGlobalPda = $.getExtGlobalAccountFor("extA"); + + // Get initial vault balance and total_assets + const initialVaultBalance = await $.getTokenBalance(vaultAssetAta, false); + const initialGlobalAccount = await $.extensionPrograms.extA.account.extGlobalV2.fetch(jmiGlobalPda); + const initialTotalAssets = (initialGlobalAccount.yieldConfig as any).totalAssets as BN; + + // Wrap multiple times + const wrapAmount1 = new BN(10_000); + const wrapAmount2 = new BN(20_000); + + await $.wrapAssetViaSwap("extA", trackingAsset.publicKey, wrapAmount1, $.swapperKeypair); + $.svm.expireBlockhash(); + await $.wrapAssetViaSwap("extA", trackingAsset.publicKey, wrapAmount2, $.swapperKeypair); + + // Verify vault balance increased correctly + const afterWrapsBalance = await $.getTokenBalance(vaultAssetAta, false); + const expectedAfterWraps = initialVaultBalance.add(wrapAmount1).add(wrapAmount2); + expect(afterWrapsBalance.eq(expectedAfterWraps)).toBe(true); + + // Verify total_assets increased correctly + const afterWrapsGlobalAccount = await $.extensionPrograms.extA.account.extGlobalV2.fetch(jmiGlobalPda); + const afterWrapsTotalAssets = (afterWrapsGlobalAccount.yieldConfig as any).totalAssets as BN; + expect(afterWrapsTotalAssets.eq(initialTotalAssets.add(wrapAmount1).add(wrapAmount2))).toBe(true); + + // Confirm total_assets increase matches vault balance increase + const vaultBalanceIncrease = afterWrapsBalance.sub(initialVaultBalance); + const totalAssetsIncrease = afterWrapsTotalAssets.sub(initialTotalAssets); + expect(totalAssetsIncrease.eq(vaultBalanceIncrease)).toBe(true); + + // Now unwrap some via unwrap_asset (need extB tokens first) + const accounts = await getTokenAccounts(); + const userExtBAta = accounts.ataB; + const extBBalance = await $.getTokenBalance(userExtBAta); + + if (extBBalance.gt(new BN(0))) { + const unwrapAmount = BN.min(extBBalance, new BN(5_000)); + await $.unwrapAssetViaSwap("extB", "extA", trackingAsset.publicKey, unwrapAmount, $.swapperKeypair); + + // Verify vault balance decreased + const finalVaultBalance = await $.getTokenBalance(vaultAssetAta, false); + expect(finalVaultBalance.lt(afterWrapsBalance)).toBe(true); + + // Verify total_assets decreases by exact asset amount transferred + const finalGlobalAccount = await $.extensionPrograms.extA.account.extGlobalV2.fetch(jmiGlobalPda); + const finalTotalAssets = (finalGlobalAccount.yieldConfig as any).totalAssets as BN; + const assetsTransferred = afterWrapsBalance.sub(finalVaultBalance); + expect(finalTotalAssets.eq(afterWrapsTotalAssets.sub(assetsTransferred))).toBe(true); + + // Confirm total_assets decrease matches vault balance decrease + const vaultBalanceDecrease = afterWrapsBalance.sub(finalVaultBalance); + const totalAssetsDecrease = afterWrapsTotalAssets.sub(finalTotalAssets); + expect(totalAssetsDecrease.eq(vaultBalanceDecrease)).toBe(true); + } + }); + }); }); diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index e438a58..b71d604 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -2598,4 +2598,278 @@ export class ExtensionSwapTest extends ExtensionTestBase { await this.addMEarner(vault); } } + + // ============================================ + // JMI-specific helper methods for ExtensionSwapTest + // ============================================ + + public getReplaceAuthorityPda(): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("replace_authority")], + this.swapProgram.programId + )[0]; + } + + public getExtGlobalAccountFor(extKey: string): PublicKey { + const program = this.extensionPrograms[extKey]; + if (!program) throw new Error(`Extension ${extKey} not found`); + return PublicKey.findProgramAddressSync( + [Buffer.from("global")], + program.programId + )[0]; + } + + public getAssetConfigAccount(extKey: string, assetMint: PublicKey): PublicKey { + const program = this.extensionPrograms[extKey]; + if (!program) throw new Error(`Extension ${extKey} not found`); + const globalAccount = this.getExtGlobalAccountFor(extKey); + return PublicKey.findProgramAddressSync( + [ + Buffer.from("asset_config"), + globalAccount.toBuffer(), + assetMint.toBuffer(), + ], + program.programId + )[0]; + } + + public async createAssetMint( + decimals: number = 6, + useToken2022: boolean = false + ): Promise { + const assetMint = new Keypair(); + await this.createMint( + assetMint, + this.admin.publicKey, + this.admin.publicKey, + useToken2022, + decimals + ); + return assetMint; + } + + public async mintAssetTokensTo( + assetMint: Keypair, + to: PublicKey, + amount: BN, + useToken2022: boolean = false + ): Promise { + const tokenAccount = await this.getATA( + assetMint.publicKey, + to, + useToken2022 + ); + + const mintToIx = createMintToCheckedInstruction( + assetMint.publicKey, + tokenAccount, + this.admin.publicKey, + BigInt(amount.toString()), + 6, + [], + useToken2022 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID + ); + + const tx = new Transaction().add(mintToIx); + await this.provider.sendAndConfirm!(tx, [this.admin]); + + return tokenAccount; + } + + public async setAssetCapOnExtension( + extKey: string, + assetMint: PublicKey, + cap: BN, + useToken2022ForAsset: boolean = false + ): Promise { + const program = this.extensionPrograms[extKey]; + if (!program) throw new Error(`Extension ${extKey} not found`); + + const assetTokenProgram = useToken2022ForAsset + ? TOKEN_2022_PROGRAM_ID + : TOKEN_PROGRAM_ID; + + await program.methods + .setAssetCap(cap) + .accountsPartial({ + admin: this.admin.publicKey, + assetMint: assetMint, + assetTokenProgram: assetTokenProgram, + }) + .signers([this.admin]) + .rpc(); + } + + public async pauseExtension(extKey: string): Promise { + const program = this.extensionPrograms[extKey]; + if (!program) throw new Error(`Extension ${extKey} not found`); + + await program.methods + .pause() + .accounts({ + admin: this.admin.publicKey, + }) + .signers([this.admin]) + .rpc(); + } + + public async unpauseExtension(extKey: string): Promise { + const program = this.extensionPrograms[extKey]; + if (!program) throw new Error(`Extension ${extKey} not found`); + + await program.methods + .unpause() + .accounts({ + admin: this.admin.publicKey, + }) + .signers([this.admin]) + .rpc(); + } + + public async wrapAssetViaSwap( + extKey: string, + assetMint: PublicKey, + amount: BN, + signer: Keypair, + replaceAuthority?: Keypair, + useToken2022ForAsset: boolean = false + ): Promise { + const program = this.extensionPrograms[extKey]; + if (!program) throw new Error(`Extension ${extKey} not found`); + + const extMint = this.extensionMints[extKey.replace("ext", "mint")]; + if (!extMint) throw new Error(`Extension mint for ${extKey} not found`); + + const mVault = this.getMVaultForExtension(program.programId); + const assetTokenProgram = useToken2022ForAsset + ? TOKEN_2022_PROGRAM_ID + : TOKEN_PROGRAM_ID; + + const userAssetAccount = await this.getATA( + assetMint, + signer.publicKey, + useToken2022ForAsset + ); + const userExtAccount = await this.getATA( + extMint.publicKey, + signer.publicKey, + true + ); + const vaultAssetAccount = await this.getATA( + assetMint, + mVault, + useToken2022ForAsset + ); + + const signers = replaceAuthority + ? [signer, replaceAuthority] + : [signer]; + + return this.swapProgram.methods + .wrapAsset(amount) + .accountsPartial({ + signer: signer.publicKey, + replaceAuthority: replaceAuthority + ? replaceAuthority.publicKey + : null, + fallbackReplaceAuthority: this.getReplaceAuthorityPda(), + swapGlobal: this.getSwapGlobalAccount(), + toGlobal: this.getExtGlobalAccountFor(extKey), + toMint: extMint.publicKey, + assetMint: assetMint, + assetConfig: this.getAssetConfigAccount(extKey, assetMint), + assetTokenAccount: userAssetAccount, + toTokenAccount: userExtAccount, + toVaultAuth: mVault, + toMintAuthority: PublicKey.findProgramAddressSync( + [Buffer.from("mint_authority")], + program.programId + )[0], + toAssetVault: vaultAssetAccount, + toTokenProgram: TOKEN_2022_PROGRAM_ID, + assetTokenProgram: assetTokenProgram, + toExtProgram: program.programId, + }) + .signers(signers) + .rpc(); + } + + public async unwrapAssetViaSwap( + fromExtKey: string, + jmiExtKey: string, + assetMint: PublicKey, + fromPrincipal: BN, + signer: Keypair, + replaceAuthority?: Keypair, + useToken2022ForAsset: boolean = false + ): Promise { + const fromProgram = this.extensionPrograms[fromExtKey]; + const jmiProgram = this.extensionPrograms[jmiExtKey]; + if (!fromProgram) throw new Error(`Extension ${fromExtKey} not found`); + if (!jmiProgram) throw new Error(`Extension ${jmiExtKey} not found`); + + const fromMint = this.extensionMints[fromExtKey.replace("ext", "mint")]; + if (!fromMint) throw new Error(`Extension mint for ${fromExtKey} not found`); + + const fromMVault = this.getMVaultForExtension(fromProgram.programId); + const jmiMVault = this.getMVaultForExtension(jmiProgram.programId); + const assetTokenProgram = useToken2022ForAsset + ? TOKEN_2022_PROGRAM_ID + : TOKEN_PROGRAM_ID; + + const userFromAccount = await this.getATA( + fromMint.publicKey, + signer.publicKey, + true + ); + const userAssetAccount = await this.getATA( + assetMint, + signer.publicKey, + useToken2022ForAsset + ); + const swapMAccount = await this.getATA( + this.mMint.publicKey, + this.getSwapGlobalAccount(), + true + ); + + const signers = replaceAuthority + ? [signer, replaceAuthority] + : [signer]; + + return this.swapProgram.methods + .unwrapAsset(fromPrincipal) + .accountsPartial({ + signer: signer.publicKey, + replaceAuthority: replaceAuthority + ? replaceAuthority.publicKey + : null, + swapGlobal: this.getSwapGlobalAccount(), + fromGlobal: this.getExtGlobalAccountFor(fromExtKey), + jmiGlobal: this.getExtGlobalAccountFor(jmiExtKey), + fromMint: fromMint.publicKey, + mMint: this.mMint.publicKey, + assetMint: assetMint, + assetConfig: this.getAssetConfigAccount(jmiExtKey, assetMint), + fromTokenAccount: userFromAccount, + toAssetTokenAccount: userAssetAccount, + swapMAccount: swapMAccount, + fromMVaultAuth: fromMVault, + fromMintAuthority: PublicKey.findProgramAddressSync( + [Buffer.from("mint_authority")], + fromProgram.programId + )[0], + fromMVault: await this.getATA(this.mMint.publicKey, fromMVault, true), + jmiMVaultAuth: jmiMVault, + jmiMVault: await this.getATA(this.mMint.publicKey, jmiMVault, true), + jmiAssetVault: await this.getATA(assetMint, jmiMVault, useToken2022ForAsset), + fromTokenProgram: TOKEN_2022_PROGRAM_ID, + assetTokenProgram: assetTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, + fromExtProgram: fromProgram.programId, + jmiExtProgram: jmiProgram.programId, + }) + .signers(signers) + .rpc(); + } } diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index cd84959..ac81556 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -901,15 +901,15 @@ for (const [variant, tokenProgramId] of VARIANTS) { // [X] it reverts with a NotAuthorized error // [X] given the admin signs the transaction // [X] given the m vault is not the m vault PDA - // [X] it reverts with a ConstraintSeeds error + // [X] it reverts with a AccountNotInitialized error // [X] given the m vault token account is not the m vault PDA's ATA // [X] it reverts with a ConstraintAssociated error // [X] given the ext mint does not match the one on the global account // [X] it reverts with an InvalidMint error // [X] given the ext mint authority is not the ext mint authority PDA - // [X] it reverts with a ConstraintSeeds error + // [X] it reverts with a AccountNotInitialized error // [X] given the m earn global account does not match the derived PDA - // [X] it reverts with a ConstraintSeeds error + // [X] it reverts with a AccountNotInitialized error // [X] given the recipient token account is not a token account for the m mint // [X] it reverts with a ConstraintTokenMint error // [X] given the vault m token account is frozen (i.e. extension is not approved as an earner) @@ -7748,23 +7748,20 @@ for (const [variant, tokenProgramId] of VARIANTS) { describe("set_asset_cap unit tests", () => { // set_asset_cap test cases - // [ ] given the admin does not sign the transaction - // [ ] it reverts with a NotAuthorized error - // [ ] given the admin signs the transaction - // [ ] given the global account is not the global PDA - // [ ] it reverts with a ConstraintSeeds error - // [ ] given the vault authority is not the m_vault PDA - // [ ] it reverts with a ConstraintSeeds error - // [ ] given the asset mint is the M token - // [ ] it reverts with a CannotCapMToken error - // [ ] given the asset mint does not have 6 decimals - // [ ] it reverts with an InvalidDecimals error - // [ ] given valid inputs - // [ ] it creates the asset_config account if it doesn't exist - // [ ] it creates the vault asset ATA if it doesn't exist - // [ ] it sets the cap on the asset_config - // [ ] it can update an existing cap to a new value - // [ ] it can set the cap to 0 to disable the asset + // [x] given the admin does not sign the transaction + // [x] it reverts with a NotAuthorized error + // [x] given the asset mint is the M token + // [x] it reverts with a CannotCapMToken error + // [x] given the asset mint does not have 6 decimals + // [x] it reverts with an InvalidDecimals error + // [x] given valid inputs and admin signs + // [x] new assetConfig asset cap is set successfully + // [x] existing assetConfig asset cap is updated successfully + // [x] it can set the cap to 0 to disable the asset + // [x] given the global account is not the global PDA + // [x] it reverts with a ConstraintSeeds error + // [x] given the vault authority is not the m_vault PDA + // [x] it reverts with a ConstraintSeeds error let assetMint: Keypair; @@ -7834,6 +7831,21 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.expectAssetConfigState(assetMint.publicKey, { cap: cap, }); + + // Verify the vault asset ATA was created + const vaultAssetATA = await $.getATA( + assetMint.publicKey, + $.getMVault(), + false + ); + // Verify it has zero balance (just created) + await $.expectTokenBalance( + vaultAssetATA, + new BN(0), + Comparison.Equal, + undefined, + false + ); }); // it can update an existing cap to a new value @@ -7841,6 +7853,10 @@ for (const [variant, tokenProgramId] of VARIANTS) { const initialCap = new BN(1_000_000_000); await $.setAssetCap(assetMint.publicKey, initialCap); + await $.expectAssetConfigState(assetMint.publicKey, { + cap: initialCap, + }); + const newCap = new BN(2_000_000_000); await $.setAssetCap(assetMint.publicKey, newCap); @@ -7853,24 +7869,72 @@ for (const [variant, tokenProgramId] of VARIANTS) { test("Set cap to zero to disable asset - success", async () => { const cap = new BN(1_000_000_000); await $.setAssetCap(assetMint.publicKey, cap); + await $.expectAssetConfigState(assetMint.publicKey, { + cap: cap, + }); await $.setAssetCap(assetMint.publicKey, new BN(0)); - await $.expectAssetConfigState(assetMint.publicKey, { cap: new BN(0), }); }); + + // given the global account is not the global PDA + // it reverts with a ConstraintSeeds error + test("Global account is not the global PDA - reverts", async () => { + const fakeGlobal = PublicKey.unique(); + if (fakeGlobal === $.getExtGlobalAccount()) return; + + // Copy the real global account data to the fake address so it deserializes properly + const realGlobalInfo = $.svm.getAccount($.getExtGlobalAccount()); + if (realGlobalInfo) { + $.svm.setAccount(fakeGlobal, realGlobalInfo); + } + + await $.expectAnchorError( + $.ext.methods + .setAssetCap(new BN(1_000_000_000)) + .accountsPartial({ + admin: $.admin.publicKey, + assetMint: assetMint.publicKey, + globalAccount: fakeGlobal, + assetTokenProgram: TOKEN_PROGRAM_ID, + }) + .signers([$.admin]) + .rpc(), + "ConstraintSeeds" + ); + }); + + // given the vault authority is not the m_vault PDA + // it reverts with a ConstraintSeeds error + test("Vault authority is not the m_vault PDA - reverts", async () => { + const fakeVault = PublicKey.unique(); + + await $.expectAnchorError( + $.ext.methods + .setAssetCap(new BN(1_000_000_000)) + .accountsPartial({ + admin: $.admin.publicKey, + assetMint: assetMint.publicKey, + vaultAuthority: fakeVault, + assetTokenProgram: TOKEN_PROGRAM_ID, + }) + .signers([$.admin]) + .rpc(), + "ConstraintSeeds" + ); + }); }); describe("pause unit tests", () => { // pause test cases - // [ ] given the admin does not sign the transaction - // [ ] it reverts with a NotAuthorized error - // [ ] given the admin signs the transaction - // [ ] given the global account is not the global PDA - // [ ] it reverts with a ConstraintSeeds error - // [ ] given valid inputs - // [ ] it sets is_paused to true on the global account + // [x] given the admin does not sign the transaction + // [x] it reverts with a NotAuthorized error + // [x] given the admin signs & valid inputs + // [x] it sets is_paused to true on the global account + // [x] given the global account is not the global PDA + // [x] it reverts with a ConstraintSeeds error // given the admin does not sign the transaction // it reverts with a NotAuthorized error @@ -7898,18 +7962,41 @@ for (const [variant, tokenProgramId] of VARIANTS) { }, }); }); + + // given the global account is not the global PDA + // it reverts with a ConstraintSeeds error + test("Global account is not the global PDA - reverts", async () => { + const fakeGlobal = PublicKey.unique(); + + // Copy the real global account data to the fake address so it deserializes properly + const realGlobalInfo = $.svm.getAccount($.getExtGlobalAccount()); + if (realGlobalInfo) { + $.svm.setAccount(fakeGlobal, realGlobalInfo); + } + + await $.expectAnchorError( + $.ext.methods + .pause() + .accountsPartial({ + admin: $.admin.publicKey, + globalAccount: fakeGlobal, + }) + .signers([$.admin]) + .rpc(), + "ConstraintSeeds" + ); + }); }); describe("unpause unit tests", () => { // unpause test cases - // [ ] given the admin does not sign the transaction - // [ ] it reverts with a NotAuthorized error - // [ ] given the admin signs the transaction - // [ ] given the global account is not the global PDA - // [ ] it reverts with a ConstraintSeeds error - // [ ] given valid inputs - // [ ] it sets is_paused to false on the global account - // [ ] it can be called when already unpaused (idempotent) + // [x] given the admin does not sign the transaction + // [x] it reverts with a NotAuthorized error + // [x] given the admin signs & valid inputs + // [x] it sets is_paused to false on the global account + // [x] it can be called when already unpaused (idempotent) + // [x] given the global account is not the global PDA + // [x] it reverts with a ConstraintSeeds error // given the admin does not sign the transaction // it reverts with a NotAuthorized error @@ -7948,6 +8035,12 @@ for (const [variant, tokenProgramId] of VARIANTS) { // it can be called when already unpaused (idempotent) test("Unpause when already unpaused - success (idempotent)", async () => { + await $.expectExtGlobalState({ + yieldConfig: { + isPaused: false, + }, + }); + await $.unpause(); await $.expectExtGlobalState({ @@ -7956,29 +8049,54 @@ for (const [variant, tokenProgramId] of VARIANTS) { }, }); }); + + // given the global account is not the global PDA + // it reverts with a ConstraintSeeds error + test("Global account is not the global PDA - reverts", async () => { + const fakeGlobal = PublicKey.unique(); + // if (fakeGlobal === $.getExtGlobalAccount()) return; + + // Copy the real global account data to the fake address so it deserializes properly + const realGlobalInfo = $.svm.getAccount($.getExtGlobalAccount()); + if (realGlobalInfo) { + $.svm.setAccount(fakeGlobal, realGlobalInfo); + } + + await $.expectAnchorError( + $.ext.methods + .unpause() + .accountsPartial({ + admin: $.admin.publicKey, + globalAccount: fakeGlobal, + }) + .signers([$.admin]) + .rpc(), + "ConstraintSeeds" + ); + }); }); describe("wrap_asset unit tests", () => { // wrap_asset test cases - // [ ] given the caller is not authorized (not in wrap_authorities) - // [ ] it reverts with a NotAuthorized error - // [ ] given an authorized caller signs the transaction - // [ ] given the amount is 0 - // [ ] it reverts with an InvalidAmount error - // [ ] given the contract is paused - // [ ] it reverts with a Paused error - // [ ] given the asset mint is the M token - // [ ] it reverts with an AssetNotAllowed error - // [ ] given the asset config cap is 0 (disabled) - // [ ] it reverts with an AssetNotAllowed error - // [ ] given the asset config does not exist for this asset - // [ ] it reverts with a ConstraintSeeds error - // [ ] given the wrap would exceed the asset cap - // [ ] it reverts with an AssetCapExceeded error - // [ ] given valid inputs - // [ ] it transfers assets from user to vault - // [ ] it mints ext tokens 1:1 to the user - // [ ] it increments total_assets on the global account + // [x] given the caller is not authorized (not in wrap_authorities) + // [x] it reverts with a NotAuthorized error + // [x] given an authorized caller signs + // [x] given the amount is 0 + // [x] it reverts with an InvalidAmount error + // [x] given the contract is paused + // [x] it reverts with a Paused error + // [x] given the asset config cap is 0 (disabled) + // [x] it reverts with an AssetNotAllowed error + // [x] given the wrap would exceed the asset cap + // [x] it reverts with an AssetCapExceeded error + // [x] given an authorized caller signs & valid inputs + // [x] it transfers assets from user to vault + // [x] it increments total_assets on the global account + // [x] wraps multiple assets correctly + // [x] given the asset mint is the M token + // [x] it reverts with a ConstraintSeeds error (no asset config can exist for M) + // [x] given the asset config does not exist for this asset + // [x] it reverts with an AccountNotInitialized error let assetMint: Keypair; let fromAssetTokenAccount: PublicKey; @@ -7995,27 +8113,15 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Mint assets to wrap authority await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, mintAmount); - // fromAssetTokenAccount = await $.getATA( - // assetMint.publicKey, - // $.wrapAuthority.publicKey, - // false - // ); - - // toExtTokenAccount = await $.getATA( - // $.extMint.publicKey, - // $.wrapAuthority.publicKey, - // $.useToken2022ForExt - // ); - fromAssetTokenAccount = await $.getATA( assetMint.publicKey, - $.nonWrapAuthority.publicKey, + $.wrapAuthority.publicKey, false ); toExtTokenAccount = await $.getATA( $.extMint.publicKey, - $.nonWrapAuthority.publicKey, + $.wrapAuthority.publicKey, $.useToken2022ForExt ); @@ -8025,10 +8131,21 @@ for (const [variant, tokenProgramId] of VARIANTS) { // it reverts with a NotAuthorized error test("Non-authorized caller tries to wrap asset - reverts", async () => { - // Mint some assets to the non-wrap authority await $.mintAssetTokens(assetMint, $.nonWrapAuthority.publicKey, mintAmount); + fromAssetTokenAccount = await $.getATA( + assetMint.publicKey, + $.nonWrapAuthority.publicKey, + false + ); + + toExtTokenAccount = await $.getATA( + $.extMint.publicKey, + $.nonWrapAuthority.publicKey, + $.useToken2022ForExt + ); + await $.expectAnchorError( $.ext.methods .wrapAsset(new BN(10_000_000)) @@ -8218,24 +8335,101 @@ for (const [variant, tokenProgramId] of VARIANTS) { }, }); }); + + // given the asset mint is the M token + // it reverts with a ConstraintSeeds error (asset config PDA doesn't match) + test("Wrap asset with M token as asset - reverts", async () => { + // Add wrap authority as M earner to unfreeze the ATA (M token has frozen default state) + await $.addMEarner($.wrapAuthority.publicKey); + // Mint M tokens to wrap authority + await $.mintM($.wrapAuthority.publicKey, mintAmount); + + const fromMTokenAccount = await $.getATA( + $.mMint.publicKey, + $.wrapAuthority.publicKey, + true // M uses Token2022 + ); + + // Create a fake AssetConfig account at wrong address to trigger ConstraintSeeds + const fakeAssetConfig = PublicKey.unique(); + + // Copy real AssetConfig data to the fake address so it deserializes properly + const realAssetConfigInfo = $.svm.getAccount( + $.getAssetConfigAccount(assetMint.publicKey) + ); + if (realAssetConfigInfo) { + $.svm.setAccount(fakeAssetConfig, realAssetConfigInfo); + } + + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + replaceAuthority: $.ext.programId, + assetMint: $.mMint.publicKey, + assetConfig: fakeAssetConfig, // Use fake account instead of PDA + fromAssetTokenAccount: fromMTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_2022_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "ConstraintSeeds" + ); + }); + + // given the asset config does not exist for this asset + // it reverts with a AccountNotInitialized error + test("Wrap asset with non-existent asset config - reverts", async () => { + // Create asset mint WITHOUT setting up asset config + const noConfigMint = await $.createAssetMint(); + + // Mint tokens to wrap authority + await $.mintAssetTokens(noConfigMint, $.wrapAuthority.publicKey, mintAmount); + + const fromAssetTokenAccount = await $.getATA( + noConfigMint.publicKey, + $.wrapAuthority.publicKey, + false + ); + + await $.expectAnchorError( + $.ext.methods + .wrapAsset(new BN(10_000_000)) + .accountsPartial({ + tokenAuthority: $.wrapAuthority.publicKey, + replaceAuthority: $.ext.programId, + assetMint: noConfigMint.publicKey, + assetConfig: $.getAssetConfigAccount(noConfigMint.publicKey), + fromAssetTokenAccount, + toExtTokenAccount, + assetTokenProgram: TOKEN_PROGRAM_ID, + extTokenProgram: $.extTokenProgram, + }) + .signers([$.wrapAuthority]) + .rpc(), + "AccountNotInitialized" + ); + }); }); describe("unwrap_asset unit tests", () => { // unwrap_asset test cases - // [ ] given the caller is not authorized (not in wrap_authorities) - // [ ] it reverts with a NotAuthorized error - // [ ] given an authorized caller signs the transaction - // [ ] given the m_amount is 0 - // [ ] it reverts with an InvalidAmount error - // [ ] given the contract is paused - // [ ] it reverts with a Paused error - // [ ] given the vault has insufficient asset backing for the conversion - // [ ] it reverts with an InsufficientAssetBacking error - // [ ] given valid inputs - // [ ] it converts M amount to asset amount using M index (rounds down) - // [ ] it transfers M from user to vault - // [ ] it transfers asset from vault to user - // [ ] it decrements total_assets on the global account + // [x] given the caller is not authorized (not in wrap_authorities) + // [x] it reverts with a NotAuthorized error + // [x] given an authorized caller signs the transaction + // [x] given the m_amount is 0 + // [x] it reverts with an InvalidAmount error + // [x] given the contract is paused + // [x] it reverts with a Paused error + // [x] given the vault has insufficient asset backing for the conversion + // [x] it reverts with an InsufficientAssetBacking error + // [x] given valid inputs + // [x] it transfers M from user to vault + // [x] it transfers asset from vault to user + // [x] it decrements total_assets on the global account let assetMint: Keypair; const assetCap = new BN(1_000_000_000); // 1000 tokens @@ -8279,7 +8473,6 @@ for (const [variant, tokenProgramId] of VARIANTS) { false ); - await $.expectAnchorError( $.ext.methods .unwrapAsset(new BN(10_000_000)) @@ -8469,15 +8662,38 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); }); + // given valid inputs + // it converts M amount to asset amount using M index (rounds down) + test("M amount converts to asset amount using M index (rounds down)", async () => { + // Get M index from M token's ScaledUiAmountConfig (not ext's multiplier) + const mScaledUiConfig = await $.getScaledUiAmountConfig($.mMint.publicKey); + const mIndex = new BN(Math.floor(mScaledUiConfig.newMultiplier * 1e12)); + const INDEX_SCALE = new BN("1000000000000"); // 1e12 + + // Get user's asset token account + const userAssetAta = await $.getATA(assetMint.publicKey, $.wrapAuthority.publicKey, false); + const initialAssetBalance = await $.getTokenBalance(userAssetAta, false); + + // Perform unwrap_asset with known M amount + const mAmount = new BN(5_000_000); // 5 tokens (6 decimals) + await $.unwrapAsset(assetMint.publicKey, mAmount, $.wrapAuthority); + + // Calculate expected asset amount (rounding down) + const expectedAssetAmount = mAmount.mul(mIndex).div(INDEX_SCALE); + + // Verify asset received matches expected (with index conversion) + const finalAssetBalance = await $.getTokenBalance(userAssetAta, false); + const assetReceived = finalAssetBalance.sub(initialAssetBalance); + expect(assetReceived.eq(expectedAssetAmount)).toBe(true); + }); + describe("unwrap with JMI backing tests", () => { // unwrap test cases (JMI-specific additions) - // [ ] given the JMI feature is enabled - // [ ] given ext_principal exceeds M backing (ext_supply - total_assets) - // [ ] it reverts with an InsufficientMBacking error - // [ ] given ext_principal equals available M backing - // [ ] it succeeds and unwraps the full M backing - // [ ] given ext_principal is less than M backing - // [ ] it succeeds normally + // [x] given the JMI feature is enabled + // [x] given ext_principal exceeds M backing (ext_supply - total_assets) + // [x] it reverts with an InsufficientMBacking error + // [x] given ext_principal equals available M backing + // [x] it succeeds and unwraps the full M backing let assetMint: Keypair; const assetCap = new BN(1_000_000_000); @@ -8502,8 +8718,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.mintM($.wrapAuthority.publicKey, mWrapAmount); await $.wrap($.wrapAuthority, mWrapAmount); - - + await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, assetWrapAmount.mul(new BN(2))); await $.wrapAsset(assetMint.publicKey, assetWrapAmount, $.wrapAuthority); @@ -8549,20 +8764,18 @@ for (const [variant, tokenProgramId] of VARIANTS) { ); }); - // given ext_principal is less than M backing - // it succeeds normally - test("Unwrap within M backing - success", async () => { - // Unwrap a small amount that's definitely within M backing - const smallUnwrapAmount = mWrapAmount.div(new BN(2)); - + // given ext_principal equals available M backing + // it succeeds and unwraps the full M backing + test("Unwrap exactly M backing - success", async () => { + // Unwrap exactly the M backing amount (mWrapAmount) const userMAccountBefore = await $.getATA( $.mMint.publicKey, $.wrapAuthority.publicKey ); const mBalanceBefore = await $.getTokenBalance(userMAccountBefore); - // This should succeed - await $.unwrap($.wrapAuthority, smallUnwrapAmount); + // Unwrap exactly mWrapAmount (the full M backing) + await $.unwrap($.wrapAuthority, mWrapAmount); // Verify M was received const mBalanceAfter = await $.getTokenBalance(userMAccountBefore); From 786ba8a33e22ede58c9e8a1cfff925269c6e2d25 Mon Sep 17 00:00:00 2001 From: eloqjava Date: Mon, 19 Jan 2026 14:14:20 -0600 Subject: [PATCH 11/27] chore: assert on rounding test to confirm rounding works --- tests/unit/m_ext.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index ac81556..db4ff87 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -8665,10 +8665,12 @@ for (const [variant, tokenProgramId] of VARIANTS) { // given valid inputs // it converts M amount to asset amount using M index (rounds down) test("M amount converts to asset amount using M index (rounds down)", async () => { + // Get M index from M token's ScaledUiAmountConfig (not ext's multiplier) const mScaledUiConfig = await $.getScaledUiAmountConfig($.mMint.publicKey); const mIndex = new BN(Math.floor(mScaledUiConfig.newMultiplier * 1e12)); - const INDEX_SCALE = new BN("1000000000000"); // 1e12 + expect(mIndex.toString()).toBe(new BN("1100000000000").toString()); // Sanity check mIndex not 1 + const INDEX_SCALE = new BN("1000000000000"); // 1e12 -> taken from constants // Get user's asset token account const userAssetAta = await $.getATA(assetMint.publicKey, $.wrapAuthority.publicKey, false); From 6dc06e27e978d44aa22cce5f9a4b6c64bd149174 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:03:30 -0600 Subject: [PATCH 12/27] fix: underflow error semantic --- programs/m_ext/src/instructions/unwrap.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/m_ext/src/instructions/unwrap.rs b/programs/m_ext/src/instructions/unwrap.rs index 6590134..f299798 100644 --- a/programs/m_ext/src/instructions/unwrap.rs +++ b/programs/m_ext/src/instructions/unwrap.rs @@ -102,7 +102,7 @@ impl Unwrap<'_> { .ext_mint .supply .checked_sub(self.global_account.yield_config.total_assets) - .ok_or(ExtError::MathOverflow)?; + .ok_or(ExtError::MathUnderflow)?; if ext_principal > m_backing { return err!(ExtError::InsufficientMBacking); } From 3af8f6419a9ab6738e8f1baca3b58223e4419197 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Wed, 21 Jan 2026 15:00:53 -0600 Subject: [PATCH 13/27] fix: reverted back to replace_asset_with_m to match EVM imp --- programs/ext_swap/src/instructions/mod.rs | 4 +- ...nwrap_asset.rs => replace_asset_with_m.rs} | 16 +++---- programs/ext_swap/src/lib.rs | 6 +-- programs/m_ext/src/instructions/jmi/mod.rs | 4 +- ...nwrap_asset.rs => replace_asset_with_m.rs} | 4 +- programs/m_ext/src/lib.rs | 4 +- tests/programs/ext_a.so | Bin 484112 -> 484128 bytes tests/programs/ext_c.so | Bin 484392 -> 484408 bytes tests/unit/ext_swap.test.ts | 42 +++++++++--------- tests/unit/ext_test_harness.ts | 10 ++--- tests/unit/m_ext.test.ts | 20 ++++----- 11 files changed, 55 insertions(+), 55 deletions(-) rename programs/ext_swap/src/instructions/{unwrap_asset.rs => replace_asset_with_m.rs} (94%) rename programs/m_ext/src/instructions/jmi/{unwrap_asset.rs => replace_asset_with_m.rs} (98%) diff --git a/programs/ext_swap/src/instructions/mod.rs b/programs/ext_swap/src/instructions/mod.rs index dcc8760..312cf6e 100644 --- a/programs/ext_swap/src/instructions/mod.rs +++ b/programs/ext_swap/src/instructions/mod.rs @@ -1,15 +1,15 @@ pub mod initialize; +pub mod replace_asset_with_m; pub mod swap; pub mod unwrap; -pub mod unwrap_asset; pub mod whitelist; pub mod wrap; pub mod wrap_asset; pub use initialize::*; +pub use replace_asset_with_m::*; pub use swap::*; pub use unwrap::*; -pub use unwrap_asset::*; pub use whitelist::*; pub use wrap::*; pub use wrap_asset::*; diff --git a/programs/ext_swap/src/instructions/unwrap_asset.rs b/programs/ext_swap/src/instructions/replace_asset_with_m.rs similarity index 94% rename from programs/ext_swap/src/instructions/unwrap_asset.rs rename to programs/ext_swap/src/instructions/replace_asset_with_m.rs index 6a32557..67272fd 100644 --- a/programs/ext_swap/src/instructions/unwrap_asset.rs +++ b/programs/ext_swap/src/instructions/replace_asset_with_m.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; -use m_ext::cpi::accounts::{Unwrap, UnwrapAsset as ExtUnwrapAsset}; +use m_ext::cpi::accounts::{ReplaceAssetWithM as ExtReplaceAssetWithM, Unwrap}; use m_ext::state::{EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED}; use crate::{ @@ -9,7 +9,7 @@ use crate::{ }; #[derive(Accounts)] -pub struct UnwrapAsset<'info> { +pub struct ReplaceAssetWithM<'info> { pub signer: Signer<'info>, // Required if the fallback_replace_authority is not whitelisted on the extension @@ -41,7 +41,7 @@ pub struct UnwrapAsset<'info> { /// CHECK: CPI will validate the global account pub from_global: AccountInfo<'info>, - /// JMI extension global (for unwrap_asset) + /// JMI extension global (for replace_asset_with_m) #[account( mut, seeds = [EXT_GLOBAL_SEED], @@ -118,7 +118,7 @@ pub struct UnwrapAsset<'info> { pub from_m_vault: Box>, /* - * Vaults for JMI extension (unwrap_asset) + * Vaults for JMI extension (replace_asset_with_m) */ #[account( seeds = [M_VAULT_SEED], @@ -159,7 +159,7 @@ pub struct UnwrapAsset<'info> { pub system_program: Program<'info, System>, } -impl<'info> UnwrapAsset<'info> { +impl<'info> ReplaceAssetWithM<'info> { fn validate(&self, from_principal: u64) -> Result<()> { // Validate both extensions are whitelisted for ext_program in [&self.from_ext_program, &self.jmi_ext_program] { @@ -215,11 +215,11 @@ impl<'info> UnwrapAsset<'info> { ctx.accounts.swap_m_account.reload()?; let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; - // 3. Call JMI unwrap_asset (swap_global signs for token transfer, replace_authority for authorization) - m_ext::cpi::unwrap_asset( + // 3. Call JMI replace_asset_with_m (swap_global signs for token transfer, replace_authority for authorization) + m_ext::cpi::replace_asset_with_m( CpiContext::new_with_signer( ctx.accounts.jmi_ext_program.to_account_info(), - ExtUnwrapAsset { + ExtReplaceAssetWithM { token_authority: ctx.accounts.swap_global.to_account_info(), replace_authority: Some(replace_authority), m_mint: ctx.accounts.m_mint.to_account_info(), diff --git a/programs/ext_swap/src/lib.rs b/programs/ext_swap/src/lib.rs index 1bf2c27..814c538 100644 --- a/programs/ext_swap/src/lib.rs +++ b/programs/ext_swap/src/lib.rs @@ -80,11 +80,11 @@ pub mod ext_swap { Unwrap::handler(ctx, amount) } - pub fn unwrap_asset<'info>( - ctx: Context<'_, '_, '_, 'info, UnwrapAsset<'info>>, + pub fn replace_asset_with_m<'info>( + ctx: Context<'_, '_, '_, 'info, ReplaceAssetWithM<'info>>, amount: u64, ) -> Result<()> { - UnwrapAsset::handler(ctx, amount) + ReplaceAssetWithM::handler(ctx, amount) } pub fn wrap_asset<'info>( diff --git a/programs/m_ext/src/instructions/jmi/mod.rs b/programs/m_ext/src/instructions/jmi/mod.rs index 40bf998..c3339e6 100644 --- a/programs/m_ext/src/instructions/jmi/mod.rs +++ b/programs/m_ext/src/instructions/jmi/mod.rs @@ -1,11 +1,11 @@ pub mod pause; +pub mod replace_asset_with_m; pub mod set_asset_cap; pub mod unpause; -pub mod unwrap_asset; pub mod wrap_asset; pub use pause::*; +pub use replace_asset_with_m::*; pub use set_asset_cap::*; pub use unpause::*; -pub use unwrap_asset::*; pub use wrap_asset::*; diff --git a/programs/m_ext/src/instructions/jmi/unwrap_asset.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs similarity index 98% rename from programs/m_ext/src/instructions/jmi/unwrap_asset.rs rename to programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs index b9ddbab..bac25c7 100644 --- a/programs/m_ext/src/instructions/jmi/unwrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -12,7 +12,7 @@ use crate::{ use earn::utils::conversion::get_scaled_ui_config; #[derive(Accounts)] -pub struct UnwrapAsset<'info> { +pub struct ReplaceAssetWithM<'info> { pub token_authority: Signer<'info>, /// Will be set if a whitelisted authority is signing for a user @@ -79,7 +79,7 @@ pub struct UnwrapAsset<'info> { pub asset_token_program: Interface<'info, TokenInterface>, } -impl UnwrapAsset<'_> { +impl ReplaceAssetWithM<'_> { pub fn validate(&self, m_amount: u64) -> Result<()> { let auth = match &self.replace_authority { Some(auth) => auth.key, diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index 0d87a30..01ee0d2 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -132,8 +132,8 @@ pub mod m_ext { } #[cfg(feature = "jmi")] - pub fn unwrap_asset(ctx: Context, m_amount: u64) -> Result<()> { - UnwrapAsset::handler(ctx, m_amount) + pub fn replace_asset_with_m(ctx: Context, m_amount: u64) -> Result<()> { + ReplaceAssetWithM::handler(ctx, m_amount) } #[cfg(feature = "jmi")] diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index 532eeb417dce80be838ca37da334fa2ee9f5a30f..978be558425aaf88bc990feac46a9f6948584697 100755 GIT binary patch delta 17810 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 diff --git a/tests/programs/ext_c.so b/tests/programs/ext_c.so index daf4cf460e4daeb491916353ed0039229303aff1..802aaffbac2efea557a24984739783ac4a0b77d6 100755 GIT binary patch delta 17668 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 delta 17720 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 diff --git a/tests/unit/ext_swap.test.ts b/tests/unit/ext_swap.test.ts index 1444b32..af337cd 100644 --- a/tests/unit/ext_swap.test.ts +++ b/tests/unit/ext_swap.test.ts @@ -1101,7 +1101,7 @@ describe("extension swap tests (new)", () => { }); }); - describe("unwrap_asset operations", () => { + describe("replace_asset_with_m operations", () => { // ext_swap level validation // [x] given the source extension (from_ext) is not whitelisted // [x] it reverts with an InvalidExtension error @@ -1129,7 +1129,7 @@ describe("extension swap tests (new)", () => { const unwrapAssetAmount = new BN(50_000); beforeAll(async () => { - // Setup for unwrap_asset tests: + // Setup for replace_asset_with_m tests: // 1. Create and configure asset on JMI extension (extA) unwrapAssetMint = await $.createAssetMint(); await $.setAssetCapOnExtension("extA", unwrapAssetMint.publicKey, unwrapAssetCap); @@ -1156,7 +1156,7 @@ describe("extension swap tests (new)", () => { .signers([$.swapperKeypair]) .rpc(); - // 4. Add replace authority to extB for unwrap_asset tests + // 4. Add replace authority to extB for replace_asset_with_m tests await $.addWrapAuthorityToExtension("extB", $.getReplaceAuthorityPda()); }); @@ -1169,7 +1169,7 @@ describe("extension swap tests (new)", () => { .rpc(); await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), "InvalidExtension" ); @@ -1187,7 +1187,7 @@ describe("extension swap tests (new)", () => { .rpc(); await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), "InvalidExtension" ); @@ -1198,7 +1198,7 @@ describe("extension swap tests (new)", () => { it("should fail when from_principal is zero", async () => { await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, new BN(0), $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, new BN(0), $.swapperKeypair), "InvalidAmount" ); }); @@ -1212,7 +1212,7 @@ describe("extension swap tests (new)", () => { .rpc(); await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), "NotAuthorized" ); @@ -1230,7 +1230,7 @@ describe("extension swap tests (new)", () => { .rpc(); await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), "NotAuthorized" ); @@ -1243,7 +1243,7 @@ describe("extension swap tests (new)", () => { await $.pauseExtension("extA"); await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), "Paused" ); @@ -1262,7 +1262,7 @@ describe("extension swap tests (new)", () => { // Try to unwrap more than what's backed (vault only has 50 assets) await $.expectAnchorError( - $.unwrapAssetViaSwap("extB", "extA", lowBackingAsset.publicKey, unwrapAssetAmount, $.swapperKeypair), + $.replaceAssetWithMViaSwap("extB", "extA", lowBackingAsset.publicKey, unwrapAssetAmount, $.swapperKeypair), "InsufficientAssetBacking" ); }); @@ -1278,7 +1278,7 @@ describe("extension swap tests (new)", () => { const initialVaultAssetBalance = await $.getTokenBalance(jmiAssetVault, false); const unwrapAmount = new BN(1_000); - await $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAmount, $.swapperKeypair); + await $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAmount, $.swapperKeypair); // Verify ext tokens burned from user const finalUserExtBBalance = await $.getTokenBalance(userExtBAta); @@ -1301,9 +1301,9 @@ describe("extension swap tests (new)", () => { // Get initial balance const initialJmiMVaultBalance = await $.getTokenBalance(jmiMVaultAta); - // Perform unwrap_asset (extB → asset via extA's JMI) + // Perform replace_asset_with_m (extB → asset via extA's JMI) const unwrapAmount = new BN(500); - await $.unwrapAssetViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAmount, $.swapperKeypair); + await $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAmount, $.swapperKeypair); // Verify M transferred to JMI vault const finalJmiMVaultBalance = await $.getTokenBalance(jmiMVaultAta); @@ -1311,7 +1311,7 @@ describe("extension swap tests (new)", () => { }); }); - describe("wrap_asset and unwrap_asset integration", () => { + describe("wrap_asset and replace_asset_with_m integration", () => { // [x] given M backing is insufficient on source extension // [x] it reverts with an InsufficientMBacking error // [x] given valid signer and inputs and sufficent backing @@ -1335,7 +1335,7 @@ describe("extension swap tests (new)", () => { await $.mintAssetTokensTo(integrationAssetMint, $.swapperKeypair.publicKey, integrationAmount.mul(new BN(10))); }); - it("should revert unwrap_asset when M backing is insufficient (same-extension)", async () => { + it("should revert replace_asset_with_m when M backing is insufficient (same-extension)", async () => { const userAssetAta = await $.getATA(integrationAssetMint.publicKey, $.swapperKeypair.publicKey, false); const userExtAAta = await $.getATA($.getExtensionMint("mintA"), $.swapperKeypair.publicKey); @@ -1346,13 +1346,13 @@ describe("extension swap tests (new)", () => { const extABalance = await $.getTokenBalance(userExtAAta); expect(extABalance.gte(integrationAmount)).toBe(true); - // Attempt to unwrap_asset with same extension (extA → extA) + // Attempt to replace_asset_with_m with same extension (extA → extA) // Should fail because asset-backed tokens have no M backing // This matches EVM behavior where totalAssets == totalSupply means M backing = 0 const unwrapAmount = integrationAmount.div(new BN(2)); await $.expectAnchorError( - $.unwrapAssetViaSwap( + $.replaceAssetWithMViaSwap( "extA", // from extension "extA", // JMI extension (same) integrationAssetMint.publicKey, @@ -1363,7 +1363,7 @@ describe("extension swap tests (new)", () => { ); }); - it("should unwrap_asset when source extension has sufficient M backing", async () => { + it("should replace_asset_with_m when source extension has sufficient M backing", async () => { // Setup: Give swapper M-backed extB tokens (wrap M → extB) const accounts = await getTokenAccounts(); const wrapMAmount = new BN(50_000); @@ -1391,7 +1391,7 @@ describe("extension swap tests (new)", () => { const unwrapAmount = wrapMAmount.div(new BN(2)); - await $.unwrapAssetViaSwap( + await $.replaceAssetWithMViaSwap( "extB", // from extension (has M backing) "extA", // JMI extension (has assets in vault from previous wrap_asset) integrationAssetMint.publicKey, @@ -1445,14 +1445,14 @@ describe("extension swap tests (new)", () => { const totalAssetsIncrease = afterWrapsTotalAssets.sub(initialTotalAssets); expect(totalAssetsIncrease.eq(vaultBalanceIncrease)).toBe(true); - // Now unwrap some via unwrap_asset (need extB tokens first) + // Now unwrap some via replace_asset_with_m (need extB tokens first) const accounts = await getTokenAccounts(); const userExtBAta = accounts.ataB; const extBBalance = await $.getTokenBalance(userExtBAta); if (extBBalance.gt(new BN(0))) { const unwrapAmount = BN.min(extBBalance, new BN(5_000)); - await $.unwrapAssetViaSwap("extB", "extA", trackingAsset.publicKey, unwrapAmount, $.swapperKeypair); + await $.replaceAssetWithMViaSwap("extB", "extA", trackingAsset.publicKey, unwrapAmount, $.swapperKeypair); // Verify vault balance decreased const finalVaultBalance = await $.getTokenBalance(vaultAssetAta, false); diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index b71d604..9c2e399 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -1901,7 +1901,7 @@ export class ExtensionTest< return { fromAssetTokenAccount, toExtTokenAccount, vaultAssetTokenAccount }; } - public async unwrapAsset( + public async replaceAssetWithM( assetMint: PublicKey, mAmount: BN, tokenAuthority: Keypair, @@ -1914,7 +1914,7 @@ export class ExtensionTest< vaultAssetTokenAccount: PublicKey; }> { if (this.variant !== Variant.Jmi) { - throw new Error("unwrapAsset is only available for JMI variant"); + throw new Error("replaceAssetWithM is only available for JMI variant"); } const mVault = this.getMVault(); @@ -1939,7 +1939,7 @@ export class ExtensionTest< ); await this.ext.methods - .unwrapAsset(mAmount) + .replaceAssetWithM(mAmount) .accountsPartial({ tokenAuthority: tokenAuthority.publicKey, replaceAuthority: replaceAuthority @@ -2794,7 +2794,7 @@ export class ExtensionSwapTest extends ExtensionTestBase { .rpc(); } - public async unwrapAssetViaSwap( + public async replaceAssetWithMViaSwap( fromExtKey: string, jmiExtKey: string, assetMint: PublicKey, @@ -2838,7 +2838,7 @@ export class ExtensionSwapTest extends ExtensionTestBase { : [signer]; return this.swapProgram.methods - .unwrapAsset(fromPrincipal) + .replaceAssetWithM(fromPrincipal) .accountsPartial({ signer: signer.publicKey, replaceAuthority: replaceAuthority diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index db4ff87..96f4e19 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -8415,8 +8415,8 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); }); - describe("unwrap_asset unit tests", () => { - // unwrap_asset test cases + describe("replace_asset_with_m unit tests", () => { + // replace_asset_with_m test cases // [x] given the caller is not authorized (not in wrap_authorities) // [x] it reverts with a NotAuthorized error // [x] given an authorized caller signs the transaction @@ -8449,7 +8449,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.mintAssetTokens(assetMint, $.wrapAuthority.publicKey, mintAmount); await $.wrapAsset(assetMint.publicKey, wrapAmount, $.wrapAuthority); - // Mint M to wrap authority for unwrap_asset + // Mint M to wrap authority for replace_asset_with_m await $.mintM($.wrapAuthority.publicKey, mintAmount); }); @@ -8475,7 +8475,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.expectAnchorError( $.ext.methods - .unwrapAsset(new BN(10_000_000)) + .replaceAssetWithM(new BN(10_000_000)) .accountsPartial({ tokenAuthority: $.nonWrapAuthority.publicKey, replaceAuthority: $.ext.programId, @@ -8510,7 +8510,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.expectAnchorError( $.ext.methods - .unwrapAsset(new BN(0)) + .replaceAssetWithM(new BN(0)) .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, replaceAuthority: $.ext.programId, @@ -8546,7 +8546,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.expectAnchorError( $.ext.methods - .unwrapAsset(new BN(10_000_000)) + .replaceAssetWithM(new BN(10_000_000)) .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, replaceAuthority: $.ext.programId, @@ -8583,7 +8583,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { await $.expectAnchorError( $.ext.methods - .unwrapAsset(largeAmount) + .replaceAssetWithM(largeAmount) .accountsPartial({ tokenAuthority: $.wrapAuthority.publicKey, replaceAuthority: $.ext.programId, @@ -8632,7 +8632,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { const initialTotalAssets = (globalAccount.yieldConfig as any).totalAssets as BN; // Unwrap assets - await $.unwrapAsset(assetMint.publicKey, mAmount, $.wrapAuthority); + await $.replaceAssetWithM(assetMint.publicKey, mAmount, $.wrapAuthority); // Verify M transferred to vault await $.expectTokenBalance( @@ -8676,9 +8676,9 @@ for (const [variant, tokenProgramId] of VARIANTS) { const userAssetAta = await $.getATA(assetMint.publicKey, $.wrapAuthority.publicKey, false); const initialAssetBalance = await $.getTokenBalance(userAssetAta, false); - // Perform unwrap_asset with known M amount + // Perform replace_asset_with_m with known M amount const mAmount = new BN(5_000_000); // 5 tokens (6 decimals) - await $.unwrapAsset(assetMint.publicKey, mAmount, $.wrapAuthority); + await $.replaceAssetWithM(assetMint.publicKey, mAmount, $.wrapAuthority); // Calculate expected asset amount (rounding down) const expectedAssetAmount = mAmount.mul(mIndex).div(INDEX_SCALE); From 86518ff566ff11a5904a53c7695f68bc6ce2ade5 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Wed, 21 Jan 2026 18:26:09 -0600 Subject: [PATCH 14/27] fix: removed global_account seed requirement from asset_config --- .../instructions/jmi/replace_asset_with_m.rs | 2 +- .../src/instructions/jmi/set_asset_cap.rs | 2 +- .../m_ext/src/instructions/jmi/wrap_asset.rs | 3 +-- programs/m_ext/src/state/asset_config.rs | 2 +- tests/programs/ext_a.so | Bin 484128 -> 483472 bytes tests/programs/ext_c.so | Bin 484408 -> 483752 bytes tests/unit/ext_test_harness.ts | 13 ++----------- 7 files changed, 6 insertions(+), 16 deletions(-) diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs index bac25c7..74060a9 100644 --- a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -33,7 +33,7 @@ pub struct ReplaceAssetWithM<'info> { pub global_account: Account<'info, ExtGlobalV2>, #[account( - seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], + seeds = [ASSET_CONFIG_SEED, asset_mint.key().as_ref()], bump = asset_config.bump, )] pub asset_config: Account<'info, AssetConfig>, diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index c2c6292..4a0d0c5 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -29,7 +29,7 @@ pub struct SetAssetCap<'info> { init_if_needed, payer = admin, space = 8 + AssetConfig::INIT_SPACE, - seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], + seeds = [ASSET_CONFIG_SEED, asset_mint.key().as_ref()], bump, )] pub asset_config: Account<'info, AssetConfig>, diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index f4700d5..b5583f3 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -33,9 +33,8 @@ pub struct WrapAsset<'info> { )] pub global_account: Account<'info, ExtGlobalV2>, - /// Asset configuration - REQUIRED for non-M assets #[account( - seeds = [ASSET_CONFIG_SEED, global_account.key().as_ref(), asset_mint.key().as_ref()], + seeds = [ASSET_CONFIG_SEED, asset_mint.key().as_ref()], bump = asset_config.bump, )] pub asset_config: Account<'info, AssetConfig>, diff --git a/programs/m_ext/src/state/asset_config.rs b/programs/m_ext/src/state/asset_config.rs index f978ad9..cd9d049 100644 --- a/programs/m_ext/src/state/asset_config.rs +++ b/programs/m_ext/src/state/asset_config.rs @@ -1,7 +1,7 @@ use anchor_lang::prelude::*; /// Per-asset configuration for JMI multi-asset backing -/// PDA seeds: [ASSET_CONFIG_SEED, global_account, asset_mint] +/// PDA seeds: [ASSET_CONFIG_SEED, asset_mint] /// Note: Only assets with 6 decimals are accepted (validated in set_asset_cap) #[account] #[derive(InitSpace)] diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index 978be558425aaf88bc990feac46a9f6948584697..360fc7f77d71694fdfa18edb70f86470613d8644 100755 GIT binary patch delta 54829 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 AKmY&$ delta 55051 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 Ybek(D-d$m<8R5FOFjpz~465h+50lzhzW@LL delta 55327 zcmbTf30#)d@;LsU^E?mY4kU}Of~bjzisXX0;f`pET8T@dn2AV=7>T~V%1b3^ri4D~ z5DK!$;!O!7ee9+{C1#~ai)39z%Oxu%yEnaNivKyw3xxN6Z~x!>DTg^{&N(x4X6DQ} z&sOx2=aG}1X}N82CQYg>B#)p4FH)BRiWaj-3^E4|ukIcGSr4COA30QO;ou92UUAWgd0O*P~pD zNty2Y*amV>&wT6+@~z&t!zw!P6TP5=KlT5lw5CH?Lx&Ia2)CXjRZn&s`DlMp?(;~L zUg`cebvdXfc%+a|^ambqQ2#7Fwc}2*zO;vV524rc^x$DNv}=~0)w!6g(x-TSP1O=T zYlIJ~eu~#j`g&%mSMWHZ|J3CvGE*Pn{WaZ|sizJurq|!rgM$+FaowUxynditPpanW zVMD@^>%QG>j}Ml$U{A| z*D4y2p%?daqanL=f4>yka<_iiFNF5lrPurU(+}R%{d>F7?z{Am-YMj&e!BN!UEScM z5AW?r=`KC2Paye2Pwq3A{H7nne{bry@!xBD-@b#%MST(edrr^9e?Kohi~o|jdfR?I z>EvQPuwMdo;=>YM@9Q^6zt`_660T1Pm_RK04*WMxzYws8_RA?vd;;B~O^&{^e+`|m zOOG8;jB4>5_%-!Afa-SR!oIJ24w^|0maZH$lF*IWda!p5`AFX~_-)$p0BZXh-Me2e z?&d=WWiwUN-Wj@o_e8q>xL(}-xc<}7r^vtc5yQTw{WI8X(vAD|Fi)JJ5woc4em14F zV2>W=6;5`SdInD=^m>6FJ2C~m>h{Q)3<(<*i!2=*1>}xCW3-LDrJo%=lf0_;9n+I` z*rSJ!38$^z)QiUylL$RxY)>*vPaZp;+1<6V^B4#j*VLS^jhjaf>*L3NO?K&?A-@ny zY1;|y37MmNhE8zV`1PNSfLUnhVH#Ab`%esaZeClb@0d8Xo7;yblV(yH4CT!VhOL)H z-dR>aNQ|Dje1o$)G|FL6lPLfWd_&#IbNZCHF4Sp<9vkQ8e54tVvrBix8HD8MQ(i12 zn@exM_y$3VlV55<9ubEcde+LoUK5&);)@gIf%8}0tmpmugO!6RJ*EdHBs!a#Np?Z6 zOjt}Vm-byXpAsnDVwtJXvi(Nw9o3EK_t*K-o%>TXHq}tt2}ubgR==4vl0=pEeHk#| zr0XYM387ch^>(iY)8uqL48gN+>Zz{=(s!^9!S*-xdIXcw^}zLk%w=NN`!ja35WM}S zUbWtbKAW!JLD1(--77hy*S#h@8mJ&PIc$Mk-He~*`j%vOikufDd(j>^Sh5fOJzcLu zuq<77OYxyY-_(NgYCEi zMyXDzCX-&VV;uQGKc<&sO0aHwIWhDRJ3b~^Sh7lAyK@xTPycXN_vWzS`F;$%^FO0>Yi_QDviu~oRD|)(uA-rk&P&ZtwJes(gVy;)_Dr zANjGg$Cv1zMabk=yg#qAVGN5sdxE~c3u+T+FwXhPnhA6*lGHSiAQt;|Af20`7ku4N zh*O7>!=_%a5BooL`cs}>c5bJ>xz>rk%f=2SFX|U+%Q=F>KBZr{_=exzX5Kva0LB(v zG@ZU}^nR9hjW_`QtsLC+{g<3vrX9wVOf0NCB^!89ue#(z$GxN9LEv~$_xjF3+;ez7J;}RQD|nV`$Cye_5WHlngNTmgZQ3Rg z+L^J{FS{Ydj3M;rOgLdCfpmT*)HAp}3j#Y4e;TkIq8QA|gq;kAWWfmr?`OfCPQ(i{ zZgA_2aC{~NG8mr;;S3(ngaig>XTeSe+hoCE1`lUJ4THTh;SPhBc7vNI!l$r3gB!6u zgI{2K23KQy276D_drz$wprVQ1d$>*)PwY-&tcOZB%GwfARk0~?}2$f zq?UXKBYKj4C4da3Auq#;0N$Zd7l5O4`u?PfPO%!n14t|{C?1Ffn$<`gM7#)j-N+0ixQTck z&JM-_P!IKk$q8mZCxS>gbxZ@VAvl+Vk|1md_AGSZ2AhW;|-{9NxeWFL7d1@a2>(bX9SNRK7?$8MZrRyslh1PNn_DS zX2H{JM#3l(NN6t`6pzNv?Nf4NG&w>djr=iW0-;@Ag1WKj9cN(OIPAnub95XzLLDqd z!g%6O$R@}SX{Zb%R`8sFsF)(R!nqR&Ax}d@C@OGrBJ2z$1tbSXOvGv11p7~0iya3Kr_d1@1cJ*}paWw2u^ z`uZSI+G7*MPD9@wwF>H|p`Kc-g2U5M7ypI})5#muWfjCeg-S;bv!24WA19@b!Tx)U z;HS|@NriFt8PbK4pWt?QgYmk-(U~NT%z!Dg(6-Rd6K7$Y@oS-K7CNtRf_k#SXgi1e zLfF*QKTA?b6(r9^KA+oT6wf6Nq(OtHBCxLq5HSyB{5NcwM{MK=Xgi;5AT`F0`J@XW zpTMC=vX~BE30@13*-z1-7Bn^D1?X+Uh(qW_?rmiaF*{*v`@bs_nIRKn@! zkptn7ZqQ~CsUUwCrx)RLkdvTAlbPfgL`0LRZ3^rp>AuS*q!} z++2=L=pYM(tswJwa9Dx;cdY7-SBt zd=(8fbQd_RM>`JO1zD4b7reV3&qM-t!HMB;ypcu~UGya@Cd<>`4&`f0J z{7AJ8)@?=S5$AyaGp&n-vs+0ay`2Gx+ek3E1IM-zgN7_O5_FQHlC{PIATucwCOm^= z5mId2-bJP|=^$henMdA&{5_~CyLC^_CbP)9ke^Lfv5?`FBSJ=M4msT7_EJ1-GTnst zr<1PaDlE&zcBW-epNmTL$T0l#NExBKF&6Aan?&it^3f&{&&tPujSPAj#0NGP;Oto- zzW`$Z*3}gJnKq>mJNt{GzXdl7h3LHJqeaAn4p?f`6p=9EvVJG#Knq1K#8S9(-xz^^ zBT=~3MTQQELF*48gNTP6Mk^Ey24i51FwhF3VTVC3Ht1#Z5nScO+Uy25j*yKc!&vzq zrbP{*mzc9hUnmSoRm?2 z9cqqac`qx}A17`uan178&=l~gL{t16W>gX&$#An0M@ADUJAtd;#6)oWSoqt=g3s8G zG4d{e+aHrIF0-2T^<?MU!rZe~Ie>t^=`OqWSy)$G*fmIgQ5s zFG)5*SIIovq`~>K7@@y2GHX~g#2G368pBXNtUHGbL+DZnKPIHAJ%?_w!^r%GtWs&x zYMAGzbvF9flA(mWXe_%(786>$3KG9nhJw>~|WyOOr(Z=R|oc?n$hp5}0xgqZ5}(o=H_-)YDg@SHL{C|Qi6srD-LgeW+W8l9mrlb( z{1&={$R*HEZ;>RHBmF9J5U+n?99p^sY6sBC(EnfL#fGkr{)?=pW43_*Allh@>NoN! zVTq*I9W=q$A@dG0Ba&%1IDd!SqW3WQ{x{C50bA~3`f(7B-6b0u)~C6@n~jwFXqlKNUwD9lQ6$SCy& zqN1MCS~_HbQLE6DMt@nW(Icb|cX)I#*$T@XXhXtd?02AXoY2dWR-rH5bfgB;M?p&( zj$4=qEond6F$y=t*uPYhv9uL+A{f%vwZ@L@x;xsMR?r@ikl2PEW(j;?TkK#BY-vmT zF`sUWq%wUs?zhGE>bgZH6I9s9x@i2>Hp#e+-3Uk+}noV9!80yQ0ANjI*v3)9d%Z)1AISmcRk`CL}l9 zkt7@PJ?O{uiRU4|H$s^wO~pVo#S2yNJFH{iU&aA1+Fqd!5m43@ zN4&EfvI>+`>Kp<7g^IsS%UfpRiIS!}0Bj@ifhvFh7ikZl~$7uqsoC~S@ zlw!JNF4Tr${=NNW{{deJ+$Kl1dWgXxghAl#2hHP=Y-qt_@-vk}`D>B(X^){l-v*EH(;QQUn+ zp^rX+mpjodtDc}c>Dpw7{gq6Hcly)k8mzg`09rz)Bs1qMV`60uq^Y!fvVksnje8@{ zQ~M02(PSy?7>vT=cx8iehUpX8P_+a@(D@)*MAO$p>RnvSw!xtxlsjecP+CV9t{3hY zv7WmlnF(8l(ZzJUY}#fxDs$L+;f;gV8(G6C=1Kq~f>9ypjj_SB!5iUJFb$xyQMzDM zF%6gx38QhIQ0G~r=?ND6xMzF?$Hrh|G9T*3V6{Dp^%+Zp$UlumW9d{L>BgZXSXVoa z){+OtvGH_6qf^eEfCl&uxQ3!l;kGGMkg{NCYz~!9Sw9h-@>$&L38&;fRRR~D#Gx-l zh{W9Pl#?ejr!0ktDO`K(bifUEPeG6R5hB8{J^G~ERE#FU%OG|t^=AQRDw5ir^88e6 zPe(^U-82+PmO`KD*ug5}=5%yPQV-hG$n3vi#M9VNPE6t2rzs(4jCIdYye?gAB+oz+ zx?!%^tk@m$emDwSW*nNy9C95zm_^^9ebIhr<5+f@Q?rrgc}Si^KPIVto%Z^*PT#un)$?uFnXkbY9GzlJ-HoCo&`C!~_0p@QM*$85@J<#^UG; zG?tuz{1@m&-1R3fr8CKOxUiItBwrYw%VMa%iO<(P3<$9_4ut3(3yzYC9zmTXHV%Vmu?g$SCDvNBe6L0CKn+2RWxrL#BF^eJ)$Sp3ys$|DMpPKC;xScuf?LqQ}neL zonZ3IsP)U)P?mzn`LXaIg}#jkJ(6=i7j*J8Xtxn#-HY~OrXt!0OJAc2F7IaidFNXE zj9&j4zZnFtySO*6jS9!xQcTYJun#-_)h*l%$lQc_Y!MD+n=tPGLtK@qfn%?u8+XWo z+Eof3le|thx;Qqw6QadS#?H+&!9iR~%L7lH_Qc)qcpazq$Tv`%PCG-l?X(*;&4G~Z zm}p!uGPl!y3N8$%0bOGgv`t6w3QS4InTX~svgqg~koYDtl6H>u5aMK-)2IN=^yNcn zQ;DhTLE}IMF3~J$$;4=t1zHxJPcKc;edc)4cGHZMEE=YfE5_M8j8n95F|?~BZgkr7 za5$gdVPh2+pvpJEltMaK+^5mudDvNq`Pj4IS%le!^D5(75%P=yZN%T`DwoJ+7lB8| z!HK`oGBV3Zev8^vmJ=i%!WFP{39d|T`9@d?%Y3qo83*Ye+I4la)@NQcnGD<#vx^oi zqd#Z3zDpMq*-H%u@rd_mPgr{x!x{Emdl=U~w|u}(@qi3h2~LTJiMV(i!PuY4$ZeeR zJzPAnMd05>i^RXv6L=Cj{(ZWNQm1?dT-}kh z>^KfNWv1a)N$WLI1FoOZ<)p+&{){a}Rj}n0q80Gq6gBXund*l&@)*NzKQ5fM*@- zoTF!6qs6kj6#{XR*?k1f>F-PWh&*UlOU+RIHSItx9O(@79DR}Q$b*D)Xs_CAi2a6! zJfe^VQ2EV&(9kXS7qIdYS2SKC?+w3RqTOAZlWclYFFs{g_WwL+w7|OWFo{Av`+ScZ zZ!#XrUZ>q)hPD6SC0g`!l*Eiz)sNxDqVAfx9l5NgGFR&@>{#=dfpSb4?S-dgE*zW->0#Z$0`n z61<3FhJasbXPUO%2>X@pBy{OA@c$Wu%fINm4I`ZTSK|oK`8Vn<)|YiKLV$FX}Mj4|l_fbOMEOQB9fywI;jKJlZ@*)+(xAB==ao46EFbYOSq&Oh=99Is zh$`iDd{>B7m2MEKD9;PY-+*I^vWlF8L8|ftjo%Ainlg`6!#YiwPuso#wVDzp2jOxi zIw-L;c`wvCAlXh%h6ip3S}0Q)RecMjW)tYBB+xha!U;zu6_cqMEs+J>v9(k-P~WZ) z+)4?d!+SwhYhN)^5D0_~izQFJ@y ziqLkanM~UWb^j-*YR_e$r#vm8vYhgclyz1Ejdp>3C=)h=d_kx2P()?uH zc59&d87_DzcyH-ABfKMuhR36a%vgEb*wRUPgHkOTyu6e;IyoBJb-`_V(ryUuqUy_fRXr8FfI4^#1oy(m_Hows z!io1C1OB0W9HX`uYM%BO2H|~_K-O1kAC#1>&WZlWo_%#b@2>>NKElwNBl_XMNW-sF z@9w9h(b=P!|NAr)E)7tk>A2BQ6M*Aj3Q`|{!sBAKqrcJ**W=3mN*CO?Uqy`G9|d(I zI28mBK=}p?gLVUzL~ZcGfSQ&|fW)4=$*#*>~rZNO6C1ejw8G?qV!+{~nRFVr1hA0y-Z5uxn z3mXJGI!p;7m*Dm=(b{XclAxX*f(KJ^0ZM>za=3!GOy$7M5luSp6RfOe7j=V$G*!W9 zFPDwJBbA4EO)ww)M>ny9&7)D#c|APApJr$)|97u`-hWI#4)OH}tfH zO6nt7%;U46c%gDlM79?vL%U?vhhLvoetCqUp8q$$7hzr0U+1^#DZCK?qt=Zm#gSc& zj#9p+ee$7du@X!tOQxU67u&VT(Mpn7J1}HMqxyq~g2NJ}9*-&vhZrS{(9IbT{sLN^ zynhc-hoxvVfAL76(^C+;6m_;ikEmu_aEM)|1e0{*z%u1+g}KMP704ByK4z^@@bvL` zJ`}&Gl+nNELu|Z)SGOa;;Uzp1^}ua)SKPy#dPymv9U~xdB@*G%6r6zG^owyiL1~Xy zGr3G5bUu3R>nQ*5)yj4I$(J$QqIeVf0vhfby~*>RcvCaN|{sUg!qvmHWM1 zL}F_7^R8!qS@Q03=-Jrab%|dRc%JDFqqhuX{~{dg!J&2N zG*LemH_7<34jmIJ3&c%!)}f;~Zk=S}j9JEVIwTC@<(~Zq^MXdrjyA#McNGsfwE?FT z=cs-I+Q=?Ay%86+;6QMA4JQ_h{a;fC*m6bZmOR0AME4V7@Lb76o{%o0`$xRIQJs?O zy+Rui1Iu}RqdEm{agkE`ofG}KNGbiQIo`?QBBk^@DF~dUbmj_p|21U+a|*9bihn@G z!-o&8W-+jX7KfUt zJv{rm(y!x2E=Rn1u#hK5D9UP1g1pz24=}r5w7Ib>+`;B=R?6M)_hTl1MD|!Ad;AQn zTa+AjY0E1Woo_m{v$ban@J zC<36H`*c3I z=FLJ($h-Ctmp7b8HeB9dt0`VW?z;~+hTZyzs~kV|7FRjG4Hj29ZujO_IdHK$@D}Q9 zf3Ud7@p12_7dhNWA{^L{5m8zec?ljc)INbRFy(;Kxzj9WXc!X)OXwz`)z9|UaH z`@XpwXDzQpM3mej4rkB~{J9p(YmT=Vy>+Ogpf<;CdiZcbk)U#QB%De!bwnDL(t5R; zcK6{!w$s8q0&_Drrzc-$HX(e>k~`}z9PL6pTHU%Qs4{TJ--Wn2jp0;c{juP>1ow}S zLAHz_?f}*p;i?OA_H*W}=25)dvQIKyaDJbYN5D@1L9D`-Xi!-woKm}o3w zVe#u3C{&EMSP(NjIJD%5eixcMa9mxu$w^54L_X6|kr<|NSfK@Wg4N`g$-i4(<5HH&oJP0=xt?0jqR)Jmf zJ5QKso3f>7=>o>22@zL_#mbc|;fz@DjGO(ee$n?CEbq?#HJMtVssa#N7ue0_F<#Cq za7B7(9V|Oi7W0boCiST5hWhfyWjho&692SL5V*xRi2q?p(qrm+cI&|g!&=d)X@&!7 zICf{FS$d7qU%%7WW}PEu$U4baSVl|UtbtxL{U+9|$3sPblLCZVeWr1IMUPnmK0aGO z?>QXCx60t+$4`1wz&Yt0T4T~UwCv^m%r#jjZ4?z5Ndj(KEeY(5#c|wK5d&KCB%?#K zc{y9}A29W}3rU%2rXdT~o+j9}MCt1L@oSGdqoqLD{|q{nyPI`r(S6~%PMMEVvjm2v zjGAdGm(4n~L{Qs~{0B#Wl==u~^iKwd6Uq#0$xs%Qh0j^d=Y-%n!YQogOA@b;K6+i^ zGF0F}(3ho(vu_D{epAOhcVBdV9{Mb*!EWej4Dn{ zYVPX0aN}`I6VFehj;-t@rvt==_p=y)@UX}u1p}5PCrLKhC?IpM%{uX?V;;h8yiwNM z-ueh1AX`!w{h7LRSFX{fy166+ncRf5kKvLLZ46fNM;IA`&P-)asmdvVn}|2Flu6=8R5LBRib)cog2W?7LB7$a7* zBZropSrRu%e451XO09)T{1(SoubHxG{FSUsoja|zV**K;~wF*5ns#PvE z4Vw=kr=?+UA@qo;`+eBkSM~MIM&n_QQqw|+)1TRKUXe7O?0c|w0p9kD>3`}6in}`x zGU>81O+e%gj{ZdY*vdsjH(3gVRMr@wbW4Gd+8QI2Z7C31vBsPex-Ae|v&LK!IyVa@ zt*wM`_DQu)62dffqaO<56>NG~%!%S*AxW~j@gDR!tn@)MUoFjCPDHL4 zBEsdgESD3OEA$xQ@+mK8+bj07F!~*=eU79+OUQNNnA`0=9v-~hCGA3%16aKk(XP|zOr7lvzomnF8Z~a zJvffc_uviL>R-fXceTBup`2L-RQr++DzhI*)6@>r;y7*OBeag(!e%{EUc%{x5j53U zHZKo-ps)SL+s0;?Y2qP<<;K-qq$!ph>9S^#H!aAS#r*~);}*mG1E&acizPx6xgs;M z%SWf+^)56ar& z|Ad zqn;x}TKym9(`E??r)l-Db}8|iy!jEYjg*1+tmK#<6y!zAfECGM)47<2^ep?A68U|; zkx4X7($C^hGht`=YuawqJ(x#SH;dNRJm-Mrc-WuZpuYag?oy-i&9tbQ2 z9(-=fpJQ@}&P$-No((o-7!HO3g#DU^AQn&{dzaQBpoq0-9ztFbEm#k8v4^H11ZP|E z?c%}s*w#pu74(0{hs{e!V#{fq9?x*#_2WucIBFq|4Mte#FK!T(n^liUK4rJ05#E(X zxbqnK8FI!vlwA3dY>GANA;HH{Chxs3*@?_UV1k1P^{8?sfrek8uHf}-l8^`UO%`=Mm~$}Cq1X#E-MSHY zK#$Q@AMWDea_jd$CvTnn;Z7_bdCC(4+gBS{jJWhWW7(2>okPvkimRZhf0$$}x+Y^$ z8-8|Yk~8KgXH4Pk?1w1}&0{&I3v%{xxX?U`!xcFvIgB@_+vFefIcy9rX&kqjXUcLh zH&*imiQ9wDREf(ihCLZ>KJ|~7hTU|Ykhas@Hu40gk6xG=2ru9hQ~m9^@Q;0&U7wTc ztLCt&+A2`}O%G&pnY!~%O8N=`b0T?q>~9l;HYUZPLJJK^@id8_6H*tRK zCCHadiW_rc8yb%ncm5K|;1LcrQ@I#0S1@Eh(QCZCBp9>UU8TFYe$n76d4f^PUZL%X z|8jZBw!#@#ApE%!OyKZm$*Jb9Z#AzL4CI`Yc$~y5BpxmCBNC64xFg5ydz;2Rk#M!f zJrVcC9=K_ehT$ii*51%6ebAB{Sr6w=DZU-DrC%{NnbVElhbzlDN*{0VtZ+Wn=~9zv za;k+O_8cA08#tp@^AX9g5X5ROk+=}VDyJ5&EbyR#du>@S1i`(y#6?iSy+bQ|2MG0 zaRo$51w=~)1oF-s9X)b3fNpSVpxVoB9`ml6>B#M+gXalX34&(X1l=v3Uw2S zn=L@njb(H>B8Re?o$j)p(PFr{~!9?{(S@Wum)$8o&rcu82&G@&mN zX^E|22QYvM_%a(71w`UDC{)u1Y)8;^2hg_(y*=q>^|P=o6TBA}NHA*kNWFSe%(Jsc(OVQ-IYumR=v)FV>j z0kWR4iQCyHOaXiivfq?!^%KXXmaeQCJMfV3HSvdKt3Jo6i*2h&UT2W|!pgRy!1$X% z?)}-iwux3V=)ZZnD>=>Sn#Sb2Y}4`zFXnoSV;6-A?sBVkbr2Um0XFD4P&v2*yIZxWY&@lRGE0Y!&pDTq$<9AW@F4#(wszM4nxl zoi?P+uGoPj%yZ->XUR3y!{#5vNh7-xsQnNYO>)i&wsJ2){6CbQlOLjipjqXxe}$Pv zGqb|EyNvOlak;Dyj+z%In?(yLn$XWe`X;;RCw$m2g>uQ+C)U@dQh$qlHXSb%lFunU zJr*T1?!N)^X_| zv;ov6`&pvl?}MnnpEW~Ffn|XxxB3b=LlGAsHPa?uU|FJn`_riBUKYr6LMqEbZ;r2c zUbI@VNMyz9<@!;CQz6>Ku_e+K)ev42^NyavhzC9or2a$>*o=LKXI!toyP)CHyA#0jF< z>Mh_5_J#)hQzZt?*%j`>4y|iMLb1YK*r#=kNGMjg3%j+hIU;7l z-J5q{T~i@v#_qi*Ic|Mi^xruCcVhevf=igSiS+WDlrD(H(qfu{m!pLuzLxf7p9l}g z+k|hr`QWH&cz-M8fKAiqa&{|3#;u1oM$xnauN`513R#K(v`JaH;*CR~8ozayyp^xVD*awZ;-gKVzge4 zTh}DX@^oQrF{>q>E%7*s7jZm3CPw1I;p1bLNc@Pbj~2MCph9*KDG5$We3r!1BtDJf z)>fgSJX?5;wbdw&#}6GUpm~U>&k@EPkGHcjP2q(L(T}_h7IQC-KaH2tIDyr^MEZHi z1{-Aqu{^MapP8F|Ik3B-HO5i2kCB` z7+w+4-Nd0ig5Y|>@umwkGh=oQwE3&h{9w@){!j%zrHJ=5UQq&Env;C*hfgWGwPK>O z!|A{Hkih3-AnRk&--cS?%-|(UsrMv_drN$y#Kkn6;B-hB^m(6Hx&vvJk2)&cW(SA%u$XCUvn(12S9^fp=q&o+SpB2j`8!I#QI!REU0J zN;s5}5C-3%u7M@&Tq94+9NWEJ?8zMMBzG`ZLV2{YVyooOyjtLCg8vm;WfoZ|rA!d*Yz=ATb7DY?j~pN-O&F1n&>^NE5_jZ; z)|ezQhkkKFZ9bwsPbcwDOM+meA)9=p{}R^TX0kL4P}FRIY&k%5vjNftT|xjKafR%- zX%be>ldxNyu4y^XDq}A3a%PO)Eb+C*T;~ON8`~odcv=}#-Ozxil`$td?tvZrDXomD zXrRL!<9}z9EpSI+V}xt&@`lzmtA!gBaKU)`DbmR}ULJ22*<5@pnZ@OZIgU3+OA8h@ zfETkRE^Ng9w2*bqG+u6<6e{bB?z8c6?Hwfxgwe;FMHYuQRdLnFH)L}a5)YE}Cpq45 zTS<;IW_vO>RIa8u*^0c-cq{sPZ2t{+9L$s@XkVrX4=l1TXHL8 zWXTlGn??-s8vJ}q8M#16wIW%r&eGKzLx#|1W5^KNYz!GfoA!|LXoy$|`mf61p>h`G zt?1TPQhD};ShMeBmk7=qB1F=Cxc{rt!K_w(-V7u~1qH&v6NxZjM;W-SiSkAv?vC zmq;x8syV$YJ~+aDn(3Cfsi4V)3098%iPVvu>suV9Bc*Lg?m&T7#Sk$8!4 zue@{6>9+C-(ctQBd=%aOu$7B3;*K)7HNGTaB~jlXWAJq$Y9YQ%^8i&FAE{dlH>qmi z>ooHf72mv`1eI!&+99B6SZf%^G_0i~e8d}nz{Y zI;!}@dqpZ_nbi=K#5rCWz$W_V-gevD*3zWvIxE2><+%MxGdxUMTQB5yXu7jRT|RSRjE6=J)o!S)wVl9!>f zn+n7oBD$;nh%;>Ij$Lf!M32M0?yA}TW=Zml(f4tj99k0sRo-ZV>wBn9_?DX;J=A{i zJpK)v&8icf%A1;Z`lx;EHi5m4_d&H5!C4<11Lf+8O}_H6H|Z)zThkLqyN`PN10Slq zV#Vhj)p^KYTVHHsg%Q3u1s2%ii~N1G22y?1ZgAIE-Hk7R+tCZRaXq~6#S5?kX9oAyUIM?+;F^^}WT zXYpov9s(_S9?<(I(hE-YMM)#NLe|>GJN59fPfvfG|7~#9U!6QA*PE{ocsB)a8qr-o zosjD*%SD)v=q{g5pu*7cvYn{kI}85!nRwdp8qIB1_2?7*+5Dcq#wYsIC4NhEkSm_; zu=-t>_(oYTa$rkd67ToXC;G*LXAw{IkH?b*vC>(_${b;6B=68VDf&0YSmP7@vv~P` ze4-zpv+}0JyP?e1s4zB*hXd5ZWHc;$0uAd5&9;C~Ps7oUwhCkAY|0jFBxQW^i@!T)FbtNg+Lvi_>Sjpqtx zG1pBOv`cK8B9nEtvU;<@w{iNohLxBtb&Yr3-Q_cZw;yrlnzVx_2dEv1 z3X2A)i|vuXeLB}{XB@G}{8o&!MY?%6xJZTIYuHyR%{QzMU>>Ht8wg)Qu`)Vi% zR!@;DM*K+iNB%t&eAlfztQ@VLCYy}0W7HuHA4ze47Wa9UoJcuJv>YYEcx$XWnlwbP zzMzd)Pg9Qvu=XMGfE(jgFXC*p4pDz?prN1P=Qcud*u!u+RQ<*t$lUc+Y=CSzK#?3^ z2mCw{WtHo;`+824B#Aakq7-A{BnJyvxGZ8oL~f)RI^Fvq+lqtXj}OHQpFM7Z>>k+-zhLsIHBz|kWXYC6xp!3*OSs@`;T0sGRgOThWYOn|*fa@u)FU8v4O zQloAmuG?h4(RY#Bp3>@n7{QCx6hgEAVVsD@<%1si2l&LOUI>j4gbMxmEEKC6z7%Ph z8cB8<7nb45gdIWbay3MK_UyxlJ4>|=^mKtywOsX4=~rJt?0dM>{>@nSlDfe`{nwW) z37M^!4Hv80ji{g5ad>L2I);{isVD9>@Zxo<|NkMBL!w$w zzbIfY4Z;`Q+0?nTwg3`sYATIBZ?sEN>r{IEA5gzut;N?bTu8=LahvfVnQ1%eyb-(s z#Ul<7u?cg%d!OU$VpaV1z~?Y;6YAkRxVZ&Gz*hpLCqIX<&1wRDPvQq8dA20qF32}X z)Cz}Ev30DZeonT2TH+IA>!Fg|U$pKjQCHF0QBvQphT?6=+Ar0dHF~)k5_H6CB>rhN z1aC)!I#dmHb(m)DhrT;756Ut!cc`lFBIZ16D2wV@{80}#NY7Trw&FlJJUqVAS=Dx3%5cG_;$JBmp>8($U;7`?^3Qa$6)SN~}Xm4H;MU7Kmr~!nQ zoHy#f#Mn=sGY-_KKj1sS&%@4d)ew5=yixnDT1DyI^G5LnwOvbmgXOVnI3n$G0{qu$ zZpQiRsw1I)RKm3%)t&TuB_#f&hSPuxM$JzcU+KmRaOY<=O#P%1HShF^Hk^J?2`M+! zM0yav!g^DU#cx5Zys0i%cQ69xlfnmItKe__-0z(I4WnA|aqzjV`jaijjN7VBq2r7AcUe2_z8iuku!4P+(7hu$yZ-(o$# zk9~`k1{UcK8-mU4_x*Vsc679;jX#4X8D0sfKSItKJU& zs+Nc;`T?~fg z8(IrtEwsaAFzc!d^l7CzLLWyhn)djRO*6i-%TY_C$1@t1jQ}2 zD0=$?PGn%SOUTv-(5{V^KtK2ZQrc+2^t}(@L>sM!rtO8SwwfEQm;;B~YW@`89dfNL z_L5c${_V74e6`|*c3Ky@?r%`vP79>3Aav8b;Fgq(!dL70;k zMguNFmXlV;=u(|EH>F~Z1N>5`dBSmL&54avH${g-BvTh7+0-7&A!N9 zu8rU5bJa$%L8@GFkm`F-@2VBxoB#9O8pQH}8*Vs;kS&3Zx+ELA%ZB(8AKuU%6(D3o z1$dz9FUcY9duX#5MR-S~z@btZ6!Q4Nt&ZAmDGW|d9n_dnj>~v**Hn%wdZHZWb;fCX zuN+QvMzy?Kj&I=6f?4SH)Fv=D_0)i*L0d1xHoy!oZ6>}>^?;Ywg{(GCdui z{Sm(ZHU#&_{(RqpC6hg1e{7Q^BGnitJ`3u+j2JpgwYyz>^g4M6w>^1~o5o#70Y zY=;Dd=J11!p+qxHXWJ7KyCb6QJ5bE%x|Ki`gD;mr9dGv*z7!Sle)y?b2DSYV#^4_Z zAeKS*gZTbUga-~nF@tHlp^8EOcc5+{y1w^ra2SO6<^ABp;FoVf2!pE*Koo;K`eu1s80qL7DF+EM~a~eAq*U#Il=wG==CpR4?$Ry z{x<*W}vtADYOr_V<&G%A*@1LrP4)(|a){_A}aiiZ!??$Yc_5I77& znCUX43`468xB^uO;l@a<9dsM6^@mfV@UQ3CUq{E`U%B`ft-b;^!_l_WE`!?$wB4ld zAPgb28IKg(MreLC=?avw8t3hh+5<2QK)UcXUW3k3O z5^K`Fhmet2Q}P`oGI;5GILu(=6{us-bQOF?vHB}8kHKkIVJCwXm!XP5rz_wvn!)cN zn88us*av)2=``g8^4@TZJ(DG88a)3wc2ZeS)z^Iu0ZJ?hyRTkNtIO z82><8Iq;DM(88n<-J9ibX zF&vc^xI*)4h3|}h@Uqs$c*&|o@(izLtrm{^#=h$`{CMIV<7OhR!YuP^m!t)fi7-A1 z7w5-~%p_cuS#j~p*xB88jQW=~e_r7KD$~?EkoYPlI@Q~a@by|arD@loI0c6c^i2FBy7}TX{UFf<~KEr_IXDn+O3U6uW8FEJ$BHjd0nd|bkud@@Rt9tw6hO$ zqPq9^Y#@_JVa=j$Q&h;JVnhqe?JcHKm*C5~qOPIh5~N*&FEn1gJgc|ujrR|BY46pw zFEp){U#gTY)-J297+N7|wKOQO0lYN42=R>utq>M=3Dsh1TfEvQXKpF7V3 zzy18)&Y5%0%$%9bi?d@CUh+Ned#X-gWa)SUegF1zwCo9d zStVSgiL1~nU1*S1&clx0Vyfdu&PJ!>&ds#+Ner5OFVn^+v727<5}i_Vcni(^2?k~P zC0eTFr?*o7PcZoQY^ME+uiQfQPl1=bOf5=wZl$G9p+L_|v{K1$Y@tm`AH!ShpF;k= zBF+4%bC=_Zmr3u3{X3g!nv(Tfs6)vhCjCkdY@vQ7(=X93CB0kel#>3JY2sSQxm&4K z$%|3%wWvq3Nd0S(zYXQA#UT3SX6hV(-M1z6(15dXv}4n=sntJswv4VjkKRf;f2;NY ztJk9?tUW;FXiEQu6Yn^Fcq=vj5(71O)Yug~y|p$b?7ITrQDax|*j8g#uzG7se;&iw zF>sV7ZbVhmM^j5SqEj3_N7c>>MIEJeX=lG<@7BuHJ9Xc$oDqj((>7yQ)x9_9JmL#czC zoHLz{4bR|1r`Ygt?zY9bz!4iFeJdK~>1RIr=+WSU#i^&aI?t_hJP0rB$?CqEdUu<1 zcHM-Wt$J$H`T!4Ts2enkL#dW5+O5u?x@o&}0Y=i(YOXMmw(P>mQ_nGK|DAKngfWA) z%HV!VV}FWh-!XjB#o0Pxw9Q`K*WqXN7`}k}J9K9k_R~3ZGyGTPu#z8bql1cJuk62} zpSBzGn({VkS2A*pmhMI;p4vwBH|qGD-EODPahK_=9izrQ7~8hsrF)Rm4dNrKkc&}2C0`k& z5hXWdsXh;x&(bs{AI(y`lAl7nl8dsmLP;Oul}sRB$$v$>k_QK={x!$|J~j55+8naf zs`%4cTB79FupUab3{t<6&kfQxB{Nw%tmHdrr`OSQe?mLHj`Om#9K_D9z(Ko7rx9xj{C?&GQUH=U;)b?tQ1?{Spsq@VsCXJ|81;|k8p z9gY+I)cQ6?5pu0~8>4IQb~^pGvvIudcx{wcHo@bmDepMjN7dbv`s!il&3Fs$4%&7E zCyj$UXj&1|=j}W2QC4*Nz8y62C}i((?-l8lemuHXgiTw{hqV6&T-~WI{ZG)7p~YzoqxhsF>svL{RzE<%K`PLFv`7) zsPz_zYg)t52x${)ukCDnD0RkY;K=mG?+`!fQ{$7$(Qy`AQN zh_e-3rr9-B$M>y2#17IsOd}t{vv?cL{0j!WcagfkJ@ub|aSn`jy!iNrX*y;bFJjZK z)3;4nw6oT<>ITrt8bfsMq!x$1&arSOjX3m`j>t}WXq3Lm5g4Y{(fTszA8ntDK{Q&A zIPQe6Q$OffvXdt2`b@{&JMk$)eFAmq`d21I?FF1+7J#Nj0jG6+o8z9Hw9SR!z;NX* z{4H)hZYIRJ{u%l!j%_=PY>_ege8;_J>f9Lp8ib@8KcO!jZ!0*3f=B99%(_W>hvlB~ z`SkZkI}*dxc#+=eh@41$?IOL!;piDoZM;}tU8gi1m+1J#Bsr{FwbN|SWsY2p*IkO$ zE>#(yF46HVlYv)K`gC3Ygk#{pss0Lhct&W&707^o8o5GmSD9L7f%|Z&N=fKX&q5<* zZcEMlygn22zLC_@E78)9&? zg7%y8^ws)m$KAL@e+|~_dR#xhMsJ+3W>>9mop_6+)wi?_0!6sK4kE+kipC5837~nu*Q{g=9>YPa^~wv$0OKuZiN+c<*oV( zC8u=gOCVD#I#jjY`)KAueWQ{i3*qqXeYEU0j8$;UBCKcg30k%Y?d3g@>R+U{KR7P% z4yFrOyf@$)kBUwkI^P5 zC*1#-ZnmcuN{?R-M*Irc9oMg<{{3jU0@1lSi#B2 zA27ZC4bm8*ng)Bjv_Am5dDDo7`YnTf{G>Iy_AN|`tYycO)St&@kB@_#R`KKeb#)y<-CC;;(7$-(xU#_BqU=ll zm-r=XX({Z^F;)wH z*r<*z_cOHV4b^hb)HWtH?tJ*C7T8B%?>-0i3k+4||1KQ!G0Uzl0obklN_jolHdM5^ zU^S+#WwEf|0k)56k-uB}xB^1h8~Cj3kROxqWAk;PLbZ*qThqP+=l|0ps(dZ<3tgLHtMS*s7uxu7@Z~n%4gRc+^#k#zRbpVf@jdyMtXy%Y~Ts61>48WmjyopwzufB;7SF|^0hrs;LS(X zQP;$ZPc}ktAu-8!S*%!3fLaM25j%5{a|~SIPet19OSdg*RF=b-iKcS&$1Qx z9C)^kN5IxGN2#Zzb?qvfJqm8M@j9?|+)(Pb!7aA(HQ%pv?OI#F-QY`XyaIfsjdy~r znSoN*{hC)W2)3`#{b2hF{Tw{Ew*H!S3JUw6`{WC}&t`$`6}k&-3?idekAUrCNmWFt^#*Yv;{<< zuoti#Y`6ayZ12OpV0)9+Z{maYO0aze9st|-BTsMAZ)bz#1RU@Npz7lPt*(8(N}6^T z_&OW^3~X?{k`m)p0%d8m=}~+dY4$ z^8JfcjcKlWRf;^L>Ou9W!Pvh`J0@lZyqlpB9O5UuXRF*7Q8|25pt8J|p^1Nh{ckq= z)pfO5?B6ofF73B)`!Z=?#O>>({Vr}lDDC%hd;PnjelggM_o(2568JSh+8^ZcOQroO z*sV!2;#W)iv#?u}7T0FlrR=WFwa)EC%UM%I*iXZLMFZ^i!}5-oYyPUC{{xp>t%-9E z`OmGizS2|sVdS^lU$NB>_GPd;dpA@Ekq>{W#invUZ&$4!($Ah_YJP!o?Gvc&U~7WhG;~C7Jm2nr8Gb49sgkj%!abF_;+U*iAA~GJ$f)=RXJxv5QKD+7 zm3b+0So_W7pi@qZD;hPKT_~o-;UQyIRe(oj$r{p{7F+tVX+MhfvD*7Nw5K)Rk8Y#R zqTYDXz)ol7`6iXinEe`Q1JJ7_30X&LUe(VU7v68E(olJ6H!3&Qbn1gN8ev>vhvB4D z#vJ-HZqw_6?RsVIY!rYygur*0&;e;pCAD;LC+?}Lt7r`-g-n#EhoJ>Vt_AipX2ZLl>!l-v6|sD4PF zctJg`7NJe6i{#*tQK9p_$BYVfiDSieNHCrnhV*mKS%^PT#p)8kN_%PZe*NrEoi>6) zql~Ukj5FkYJL%vMHkqHHcGhOJ1lzN9UidTA@)*uN=DoseeehmyfEN&8Z?+e~*0@v&2fy@vq%8pwb%aOufvK|D%Xox)wXi#m^^g)fBtBC|4Tr(vDoQ*MR&9aO&+QKQIqg}_alyUoxIHI0nB?~4^EOt~$M^=D0-P7@ z+sN%n^*a}qYM1?rb2uaTCC-JdHCE+o;cYdA;#4>T|Dpry&-Lo6q1J8Ou2~j&sT6ZYx3fOzsdK&$;a^ z&dGB)dm1@M1jhvr7>w=TXmKqq9I~I}31bsDhtB65naJ5UiF4G)xzwZ>?Qc~eegSvL zOTLiXgHt$%{hTwGa4ucSIdB>HMq3~Hr*Vh8;O1s-&;AqVGBr(dP3jKMzFHesp-CnY(of9uQm*?3uyigMzyR_i>)A<+wuA{)s1SrbDP_LtLmc)N~1U zNZ!wI?>50PS`N3mJgrwEK!=n_P{UNDEd4W&_0qhluJ3jSW^#2{a7=JQa9VI)a9ObT za#kLG!sH4qEI1}OE;uPTC%7co6R=m{7M$=f1%A*I+$A_JI4L+!hc0zZn&JJNy&T+x zE;uYWMh%x?grv(}}g1ZDK1ZM;n1$)|f{(zm;NQ>AN;9kK= z!Fj>j^}GPT;E>>$jaB(tpG~1SE4U=sJC_$26dV;C7o4tfrF^YWQ>gMa_YJ&&X2D^> zJ%R@W=LDC(VC6T;*Gf@KQ7K<@-^1A}I3c(wSo;?qpA}rN*eqWwTMDCmt?gc(AR^dv zKezh@M+7GYXHBkNeJTqF-vhjWsNf#KS-}Ot?tkO?!Uor_K6MF)jNnK&PmuUJ=fHn* zPX8C@!b6+`k0?g_Tc<0bilWBFZ}I@`TbzS&&V>Z$vS7~-x!tc=^}khtpl}Ea?h@Q9 zxKD6ea87U$Tp52>1+>R`4ZVV!1-A(vSk2?hf(t(u_NSanE92d&K=7yBp+|5=a9MD3 zKaYpA*^0c0sqQXhR1;HMgHw)+d zU9^0bYj#ulHJ;x4I_CgwhId0us1vjs>h8Qymj!#@5ZMHW1;+#@1gAN7YdNmaN`gIa z@(MHy4hilO92Z<;zMrt{>5aoe7x?MI|Tm9 zIWD*)IQBR0pAlRVoOT$uu~bhGisl_k)>e=lZ8%t*6&!PNyGQ4o6C84Jd)DCE3BrJz zI}`+Wox$zBfVj|=X*nAxBOmMP;*}FC00;bT4f_-6b zPYU)fh3NIwe}hh^9pVj+$K08I4U^CnI^Tlny^B1+OR@d zS`2~NC9i_#bhKHM^{(l4 zQEHeA>ZKWTUAN<%z28%W5|wD9%}PY+q!I~gx&b0f^B|haZ}Li74sIg*elnBvgCA#R45^<{g0z{IUl*rK>B}%jyqQUbAp2tVal{zTYAzGuAJev{{K59a17ebqmq8S(>vDRHS(j4P}u4+mx~*0el;x$9eh~ z?N-(VorLJl3Ts|)NpM-PdzfeU3l0blaqiZ_T%kn-M+Nr?P6$p4&Iryi#+<3Z6nHDF zU~Po2p+~S!aI@f`;Eo)&i$y-R8Qst~1Bab0(?!8q|#QR=Tg!Fj>Sv$%i!9L{}>oO?gX+5IWT z-CC3@v_8Rsb6J3vJ&$w#e9oDPf^Dm}uB+ zdbq~w5xVG)YOInLeo|xglt428_3)5~=Rg32b Date: Wed, 21 Jan 2026 18:35:03 -0600 Subject: [PATCH 15/27] chore: added additional check that asset_mint != m_mint in replace_assets_with_m --- .../instructions/jmi/replace_asset_with_m.rs | 5 ++++- tests/programs/ext_a.so | Bin 483472 -> 483880 bytes tests/programs/ext_c.so | Bin 483752 -> 484160 bytes 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs index 74060a9..f381b4a 100644 --- a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -21,7 +21,10 @@ pub struct ReplaceAssetWithM<'info> { #[account(mint::token_program = m_token_program)] pub m_mint: InterfaceAccount<'info, Mint>, - #[account(mint::token_program = asset_token_program)] + #[account( + mint::token_program = asset_token_program, + constraint = asset_mint.key() != m_mint.key() @ ExtError::AssetNotAllowed, + )] pub asset_mint: InterfaceAccount<'info, Mint>, #[account( diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index 360fc7f77d71694fdfa18edb70f86470613d8644..5cfc82485d279cbc6e8abc1838b3283e0f2adaf2 100755 GIT binary patch delta 42711 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 diff --git a/tests/programs/ext_c.so b/tests/programs/ext_c.so index bf91567e80d32af31230118e9299cb5c220fe9e1..801f97789a4dbd7c4ae4b1ecb5bb92f79fe8ff22 100755 GIT binary patch delta 42778 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 delta 42491 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 From 63c0e3c8fc2b963c54e5cfebf369bd38468095f8 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:58:51 -0600 Subject: [PATCH 16/27] fix: undo changes to ext_swap/wrap --- programs/ext_swap/src/instructions/wrap.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/programs/ext_swap/src/instructions/wrap.rs b/programs/ext_swap/src/instructions/wrap.rs index d5344c9..8f06123 100644 --- a/programs/ext_swap/src/instructions/wrap.rs +++ b/programs/ext_swap/src/instructions/wrap.rs @@ -64,7 +64,7 @@ pub struct Wrap<'info> { bump, )] /// CHECK: account does not hold data - pub to_vault_auth: AccountInfo<'info>, + pub to_m_vault_auth: AccountInfo<'info>, #[account( seeds = [MINT_AUTHORITY_SEED], seeds::program = to_ext_program.key(), @@ -79,7 +79,7 @@ pub struct Wrap<'info> { #[account( mut, associated_token::mint = m_mint, - associated_token::authority = to_vault_auth, + associated_token::authority = to_m_vault_auth, associated_token::token_program = m_token_program, )] pub to_m_vault: Box>, @@ -131,7 +131,7 @@ impl<'info> Wrap<'info> { m_mint: ctx.accounts.m_mint.to_account_info(), ext_mint: ctx.accounts.to_mint.to_account_info(), global_account: ctx.accounts.to_global.to_account_info(), - m_vault: ctx.accounts.to_vault_auth.to_account_info(), + m_vault: ctx.accounts.to_m_vault_auth.to_account_info(), ext_mint_authority: ctx.accounts.to_mint_authority.to_account_info(), from_m_token_account: ctx.accounts.m_token_account.to_account_info(), vault_m_token_account: ctx.accounts.to_m_vault.to_account_info(), From a2f7f4f7857f04741f64de031ce3fe8c16de9de0 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:41:39 -0600 Subject: [PATCH 17/27] fix: rename m_amount to m_principal and from_principal to ext_principal in replace_asset_with_m for clarity --- .../src/instructions/replace_asset_with_m.rs | 16 ++++++++-------- programs/ext_swap/src/lib.rs | 4 ++-- .../src/instructions/jmi/replace_asset_with_m.rs | 12 ++++++------ programs/m_ext/src/lib.rs | 4 ++-- tests/unit/ext_test_harness.ts | 8 ++++---- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/programs/ext_swap/src/instructions/replace_asset_with_m.rs b/programs/ext_swap/src/instructions/replace_asset_with_m.rs index 67272fd..9556821 100644 --- a/programs/ext_swap/src/instructions/replace_asset_with_m.rs +++ b/programs/ext_swap/src/instructions/replace_asset_with_m.rs @@ -160,7 +160,7 @@ pub struct ReplaceAssetWithM<'info> { } impl<'info> ReplaceAssetWithM<'info> { - fn validate(&self, from_principal: u64) -> Result<()> { + fn validate(&self, ext_principal: u64) -> Result<()> { // Validate both extensions are whitelisted for ext_program in [&self.from_ext_program, &self.jmi_ext_program] { if !self.swap_global.is_extension_whitelisted(ext_program.key) { @@ -168,15 +168,15 @@ impl<'info> ReplaceAssetWithM<'info> { } } - if from_principal == 0 { + if ext_principal == 0 { return err!(SwapError::InvalidAmount); } Ok(()) } - #[access_control(ctx.accounts.validate(from_principal))] - pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, from_principal: u64) -> Result<()> { + #[access_control(ctx.accounts.validate(ext_principal))] + pub fn handler(ctx: Context<'_, '_, '_, 'info, Self>, ext_principal: u64) -> Result<()> { let m_pre_balance = ctx.accounts.swap_m_account.amount; // Set replace authority as authority if none provided @@ -208,12 +208,12 @@ impl<'info> ReplaceAssetWithM<'info> { &[ctx.bumps.fallback_replace_authority], ]], ), - from_principal, + ext_principal, )?; // 2. Calculate M received ctx.accounts.swap_m_account.reload()?; - let m_amount = ctx.accounts.swap_m_account.amount - m_pre_balance; + let m_principal = ctx.accounts.swap_m_account.amount - m_pre_balance; // 3. Call JMI replace_asset_with_m (swap_global signs for token transfer, replace_authority for authorization) m_ext::cpi::replace_asset_with_m( @@ -242,10 +242,10 @@ impl<'info> ReplaceAssetWithM<'info> { &[GLOBAL_SEED, &[ctx.accounts.swap_global.bump]], ], ), - m_amount, + m_principal, )?; - msg!("{} ext -> {} M -> asset", from_principal, m_amount); + msg!("{} ext_principal -> {} m_principal -> asset", ext_principal, m_principal); Ok(()) } diff --git a/programs/ext_swap/src/lib.rs b/programs/ext_swap/src/lib.rs index 814c538..5550adf 100644 --- a/programs/ext_swap/src/lib.rs +++ b/programs/ext_swap/src/lib.rs @@ -82,9 +82,9 @@ pub mod ext_swap { pub fn replace_asset_with_m<'info>( ctx: Context<'_, '_, '_, 'info, ReplaceAssetWithM<'info>>, - amount: u64, + ext_principal: u64, ) -> Result<()> { - ReplaceAssetWithM::handler(ctx, amount) + ReplaceAssetWithM::handler(ctx, ext_principal) } pub fn wrap_asset<'info>( diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs index f381b4a..05aaf31 100644 --- a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -83,7 +83,7 @@ pub struct ReplaceAssetWithM<'info> { } impl ReplaceAssetWithM<'_> { - pub fn validate(&self, m_amount: u64) -> Result<()> { + pub fn validate(&self, m_principal: u64) -> Result<()> { let auth = match &self.replace_authority { Some(auth) => auth.key, None => self.token_authority.key, @@ -94,7 +94,7 @@ impl ReplaceAssetWithM<'_> { return err!(ExtError::NotAuthorized); } - if m_amount == 0 { + if m_principal == 0 { return err!(ExtError::InvalidAmount); } @@ -106,12 +106,12 @@ impl ReplaceAssetWithM<'_> { Ok(()) } - #[access_control(ctx.accounts.validate(m_amount))] - pub fn handler(ctx: Context, m_amount: u64) -> Result<()> { + #[access_control(ctx.accounts.validate(m_principal))] + pub fn handler(ctx: Context, m_principal: u64) -> Result<()> { // Get M index and convert principal to economic value let m_scaled_ui_config = get_scaled_ui_config(&ctx.accounts.m_mint)?; let m_index: u64 = multiplier_to_index(m_scaled_ui_config.new_multiplier.into())?; - let asset_amount: u64 = principal_to_amount_down(m_amount, m_index)?; + let asset_amount: u64 = principal_to_amount_down(m_principal, m_index)?; // Validate sufficient asset backing if asset_amount > ctx.accounts.vault_asset_token_account.amount { @@ -122,7 +122,7 @@ impl ReplaceAssetWithM<'_> { transfer_tokens( &ctx.accounts.from_m_token_account, &ctx.accounts.vault_m_token_account, - m_amount, + m_principal, &ctx.accounts.m_mint, &ctx.accounts.token_authority.to_account_info(), &ctx.accounts.m_token_program, diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index 01ee0d2..ae6cb25 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -132,8 +132,8 @@ pub mod m_ext { } #[cfg(feature = "jmi")] - pub fn replace_asset_with_m(ctx: Context, m_amount: u64) -> Result<()> { - ReplaceAssetWithM::handler(ctx, m_amount) + pub fn replace_asset_with_m(ctx: Context, m_principal: u64) -> Result<()> { + ReplaceAssetWithM::handler(ctx, m_principal) } #[cfg(feature = "jmi")] diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index 8ed0e27..7d9c5b8 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -1899,7 +1899,7 @@ export class ExtensionTest< public async replaceAssetWithM( assetMint: PublicKey, - mAmount: BN, + mPrincipal: BN, tokenAuthority: Keypair, replaceAuthority?: Keypair | null, useToken2022ForAsset: boolean = false @@ -1935,7 +1935,7 @@ export class ExtensionTest< ); await this.ext.methods - .replaceAssetWithM(mAmount) + .replaceAssetWithM(mPrincipal) .accountsPartial({ tokenAuthority: tokenAuthority.publicKey, replaceAuthority: replaceAuthority @@ -2789,7 +2789,7 @@ export class ExtensionSwapTest extends ExtensionTestBase { fromExtKey: string, jmiExtKey: string, assetMint: PublicKey, - fromPrincipal: BN, + extPrincipal: BN, signer: Keypair, replaceAuthority?: Keypair, useToken2022ForAsset: boolean = false @@ -2829,7 +2829,7 @@ export class ExtensionSwapTest extends ExtensionTestBase { : [signer]; return this.swapProgram.methods - .replaceAssetWithM(fromPrincipal) + .replaceAssetWithM(extPrincipal) .accountsPartial({ signer: signer.publicKey, replaceAuthority: replaceAuthority From d2ab707f885a5b72cef717cb117b145b57b6a904 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:43:11 -0600 Subject: [PATCH 18/27] Update programs/m_ext/src/instructions/jmi/set_asset_cap.rs Co-authored-by: Kurtis Streutker --- programs/m_ext/src/instructions/jmi/set_asset_cap.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index 4a0d0c5..46c1cb8 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -74,14 +74,10 @@ impl SetAssetCap<'_> { let asset_config = &mut ctx.accounts.asset_config; // If first initialization (all fields are zero), set bump - if asset_config.cap == 0 && asset_config.bump == 0 { - ctx.accounts.asset_config.set_inner(AssetConfig { - cap: cap, - bump: ctx.bumps.asset_config, - }); - } else { - asset_config.cap = cap; - } + ctx.accounts.asset_config.set_inner(AssetConfig { + cap: cap, + bump: ctx.bumps.asset_config, + }); Ok(()) } From 4e20932e916c9fbb23d22f7ecb50110be9827440 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 22 Jan 2026 09:28:35 -0600 Subject: [PATCH 19/27] chore: moved asset_mint not m_mint validation to accounts section --- .../src/instructions/jmi/set_asset_cap.rs | 2 -- .../m_ext/src/instructions/jmi/wrap_asset.rs | 18 +++++++----------- tests/programs/ext_a.so | Bin 483880 -> 482808 bytes tests/programs/ext_c.so | Bin 484160 -> 483088 bytes tests/unit/m_ext.test.ts | 6 +++--- 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index 46c1cb8..67ec369 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -71,9 +71,7 @@ impl SetAssetCap<'_> { #[access_control(ctx.accounts.validate())] pub fn handler(ctx: Context, cap: u64) -> Result<()> { - let asset_config = &mut ctx.accounts.asset_config; - // If first initialization (all fields are zero), set bump ctx.accounts.asset_config.set_inner(AssetConfig { cap: cap, bump: ctx.bumps.asset_config, diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index b5583f3..c2cb070 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -18,7 +18,10 @@ pub struct WrapAsset<'info> { pub replace_authority: Option>, /// Non-M asset mint (USDC, USDT, etc.) - CANNOT be M - #[account(mint::token_program = asset_token_program)] + #[account( + mint::token_program = asset_token_program, + constraint = asset_mint.key() != global_account.m_mint @ ExtError::AssetNotAllowed, + )] pub asset_mint: InterfaceAccount<'info, Mint>, /// Extension token mint @@ -103,16 +106,6 @@ impl WrapAsset<'_> { return err!(ExtError::Paused); } - // Validate asset is NOT M (must be non-M asset) - if self.asset_mint.key() == self.global_account.m_mint { - return err!(ExtError::AssetNotAllowed); - } - - // Validate asset cap is set and > 0 - if self.asset_config.cap == 0 { - return err!(ExtError::AssetNotAllowed); - } - Ok(()) } @@ -130,6 +123,9 @@ impl WrapAsset<'_> { .amount .checked_add(amount) .ok_or(ExtError::MathOverflow)?; + + // Uninitialized asset fails at deserialization (no account exists) + // Initialized with cap = 0 caught by new_balance > cap check if new_balance > ctx.accounts.asset_config.cap { return err!(ExtError::AssetCapExceeded); } diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index 5cfc82485d279cbc6e8abc1838b3283e0f2adaf2..6ceb651e1f86c766409427fb3d36e792fbc5563e 100755 GIT binary patch delta 50991 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 C?9Oli delta 51284 zcmbq+3tUyj7WbLidmrC~qz6PfqAB=9G(|K;Dn%as*qZ4v<^& zHL6-!&(_MT(5Nli@KP+6;2QWs@O?^6m7h0j@~ES#L&@XAkE%9n8v7)3kF^ftzDL#U zI%#aKI;QR{QKGPJhA1CbFM@rmo~!3-srBEr)H+)YsONB1b!J|!KUHTruHF;s@`la% z%UPb&LUro)Z-#aVQ*~pLa{+rbZ);hDo?HJ>AHmiB=LHzZP)k=3i_NUsm zaX*n3+1MdKmI16D5$vQo!DAPTQ=2}zh<&c6KDvypRy#MD#eP>eH|fGkGfy>n-bIb= zSI5}=xnq->U<-MeTBK(L_uHiAc{)LKrq?3&Z}pznGFGZCZAQHR;Y>g8G{!SFs&1i$ z?1GxwVi)hZTXp!vu}{?FJ`?%DU25D@e*9k>)d+hyeGy3vV_1hiaP;Ht=4K#d5&3LV@pAbN&4JlN;1hzi{4jts3SZ-nih@gLO`* zJN^B6n+=(T{%H(`FtfcsJD{evpTz@HRA(0(x2{nGIwY_o>Yfe**-iCchc5g}QUf~L z*d=v9$3<+jdc5OAK26n=4yr>s^<-bD3-R}->VEvaQ@xG9Gt|zVd$M)v1pJ+%rsD7A z>Z#6Mc;g|N)&MKxE!L=RUHo`MryA5Hn!D>Qvwx|bJM>Wh>@tko)~JraFy3pmnhX%Q zS}h7pW4~n1?dr+cF?D6P)4a|aHR^FEAG1@ncaLL#sHxpY@asFEMw@!p&z;4pK0QY8 zw^pmsJ<9n{o7AYF1RlCxEe{G8n4@PD++u%EVukAP;CS|ddMbDXAHPEl=;a5?8QyCI zyRPo+wTt&Xq(=1ipBd;;yNq);#a)#H*hMw>nde&M1AT_Z{9CEGvZA0W?em zfl!+lw3$?kqt+j*j%jx8uBuVfY#v){~`GkIDT<{X6B*=RIHL}G zNVdc-U2G(l1o!N3uE!vZJtCcf@*g>^NbbRBoTA8V8ZuCU9F|+fmv7C?Cmzfw7 zF7db>6tGuLQy0w5;lp-l&fjDkQ%A?Q;~n&j$JA}{4fv*&YF2!JcWw>@RPfgc~0td;|GBGtYy ztizu*nAFfYqRYe-JE;~!T{6|gg*Fb}GZxx;TeP;&kN=UZmI6#kR&5D>yf>*K0BOl; zB*44i3m`99%>u|EwFtnHtXda^wErQwhGn49hGwISYc=|tI%Sb3@0qM7Eb`;ID^=$r z-S8LHssGSW{(*XK`Phe2=c+?KjOSl&Q|&B-?_YsAH4;WYQys{*sQcBgdEyGyjr*xP zR;2J~kpPiDE_`nsJ*~t#ZeUOxr#>XbA&Xgd|SEwZ^4pyP=PadTvt@@qi ztBq3rrJh;6fY(b@Bi0159qP(8&$A7BfzY+Tv)Ouq#i9yd^VhT>xW=nU~l1^y2+CsrJt*+4fAI&mXD7hi+5@z6|4&Q`G1$BM^F!eK~Uo z)bC)xKaDgzx2TB+%lY9HHQ}oewo=XgsvmntRSs?89X?f^hr-!LRmpuGga7c{U-+Pu z%&@!+hMDBn*LV1)6t(2AXjgR{a|kT?$UknjeTG_jB!jnJr80Gl`NR%aYx#SNofv$?{CcK(d=L}uy&Y6(wc6Aj#qN#Wvk>PQbFe-M|E?Y{ z_UG~^YI(6AJFNO#@aN-F)UXRxi~}pb5X5(+r~wzlh5I;8afd()FS^9}+x~=mgj~wt zf38wXE`_nhYUiJOHaocsjMN3Q_|*(NHFfUKU3mCz)%kOgsF4PFUtExxe>uD^pEWbn zuhg$De|tuzqdd;avNDg~on>W(G(cka*@rYh#&T$mc3Wm*nq5OdR+h#?*Jy=Sj9;vR zn$}~>Sc$e-0QRZYqk(|)DYqe8#;2{O@J1|=N35n20SB+vqTLuGwGOMbgh#|b>aM0D zcV^cc$$%^JYPO>>8>RaK%~* zYR&?9;D;0`VA>i=7BFlreE}DvzJMoDU%=U@FJMR17x2VdtYf5q_+QrBh#j)&+u25nv^y`m?coU@BGmvp5z* zbK9{le0l~s+p$vanM!HxSvcECx7#E6$9KuOPx8|l>cGPILU3Ctxb1*;XP~`Tm`%Ie zfeqq3`dtd^j8?&WRA*Mmc4z|v*euLgsg&J?<@52elo*JPvA#=rfqFTuG!P8v6}q87 zqgXBEaTcW~IJ>iamaEO}!CEr@+&nEUhy^j;W*!yxL{+GxvM0;K{6KlZVD>Qi^nzr! zX-F^TZ>qsYOM0(c1+bm`Z6qmhs9H5h@sBJ5Y%0)A!2=marbyFIuvZNYqax8RB-jl%_rGj?i-_J zJjKEoJ5RTshI1^Vx&3RD+1H=#WqI1n0brXy8%G&oXuu%g;7`PneIRh7i)>p)4`hr# z8b=X>puUE2lst%K@K-ia$TP6xQ5z^qz~LJx?HQQPzzyW~EWEA<@Mn?UWdr34*nWdn z`7F!kJas)~4>4>kzyaH8J&TGQXwBn&vJaILdFNS_{5<^YHl1@Ye|DLs424r$W>Mu( zmc_oNJue_tqjN7ns*^Nj7_0=0rVT?VfPN_zup3nOFNQ#I-g0tom0D>3d699>w$tr! zSiE7(Hrh9WCGnGpt%&YCkrHC9(Z9CITweXlVqCXIrSzShk2IYb(dXj@Z9x&p0-b-6fw_!1Pi0 z*ef+n`V}~!VbWpzyzYQDtqPGC9g3+?y> z)|0cvq)cKX*jySji9OGj&`tr4YxgFxfs7Z%kkb>qL)fS{m;=h(|3(c$ci&*+Fqn>c zlZ|C;5$&H`ou}QMj7Ipt7|M=<5roE2c@+8#TCz`t>&%+2l}=?5Ot`>XaBiXEx6r_O zy7v}{xHR79ZFoch&3u~?Z)eCfdNKJ;hf%Mid(%75pwu}v%AB18hd4+p=dy3b7!(-?>3-ToiE-%idW*;w4;u-ZMPczsN6$sYW5O`$ zYj@+B7elu;eHR3g8S*Yv^7vciHXr8Qbq!_DXIb1E>KJ4wMXsjelsaKkhTg-UWG_8CMa|kghY#oc> zZ%(6(b&Y6p)Qs@F%*Ljlp9V4LHDhvQ;$q z0EUO9+PMSl0OP}BDeX)2(bKUMaFFFe<+l%lK1kWWV&&YblI;*wUrMJAVbs1x_YN^n zk8!o4+PVqkm&*d!avGise;*J_rMVCqc95M1JE<2(wy%ZzMN!z-2A@%1!!27)qVlhq z-D6NKat)GHhiv2Pz{45t*{epbSkKpP{N)70XKJUnTc9N#X4nn=fjS>GL_$bpqsd3v zVeU3b3;M>49rV;=$1r>xqJ_sX22Y$q*~bk&^}M^s*;WjzoAcRuJ+{yj*A}p$q8myJ z5ZI1bPKhVbosc-{B;pB`a!*3n2k73(8ZGzv4if|>hN$l_vTmXM-&J>{cK18Bp7A#) zQ`)H-EuTGwQ8ZmkEfk|8`owt}YMl^Cac5vdbthMKd(jz8%)^tkv>#Zs%tL2WfWOj0 z>sG{iV|tsQMV-fP0gswRj#*L*`cE-?n@^uXkr$9!LdP$#sX(=mi!4Ekuf33YYsr5f zk%pP+DK&aWEO5q{>AP#C4>r?_Yo$-0XV5=vq&LugN)Vbhj~pe4Cn0sn6&A^FrBcQf zmH-Fne3gw5nohV1O&8F)s~8dQQKM_sn$`wi69f85nsD7nOuUZHsq>l^bwf-bi)qhI zBfaP*Y#c4$`-a1oU1)5v7=s zR{Vv*q+uEr{e^M1@&k%%hs+AVzTBaGf0xx|eEdWzx`$LF91p9C#3xs>K!i#YDeXRZ za!vbZ@3Y;|_{u~c&cBVOq9-|)Kau426haZvKa4xrEo~{n3&sycQvTCMdL`#Y><{gn z#1~cj%^ZdA<<4;wFpvlF7a}RjY7`b-pzW~oX?jt6U7pWJjHA-JJWHr1?O7g<1<$>D zyo>PX`doz9VsV1Wr#^RQ7~SSJs7|DP4R{Wsh`9~9CW8C`2RQFNlM)+&^NABEyAc{S zLly0ABM^}LPC!(W6VKYX(rNG`JcmyotGT&z8{>bzM)qMmi2X)m8lxff5SB`|Eo&Qd z#=g-~J$N0)x4)*Py@)bmlx~7TuK1-zQ^@>zgq9!9VSX{>A_KLj2H$Ek{%7MCkmHsbu#@dWX^E^hX;)K!5HK>I`TH2xY{zgDi#AwmrXtm6T5h z-jn@7!#fC(w1pk`6^@?QqB^56_kYFZrCMbdj(vfb;I3V{?xFczc{1;_P&j84ecz3T zR#|hW$N6sFXrXY^Y#~=#cb>>DX`OrUE3B&XJN4v~c&BkL-_){uax4|PrcoTuvFL0t z-^xcWFr0JP0^yutbhj585i6J8JRhf%3k>Ik#)NZ<-s!_9@&P7=n|+|v^Y7`t$$rr0 z_T?jRRyww(SK6pWKQ2}jnxh}=hBq8r<(1i?JkNAUwwum93FVxlMo*z*TqDllr(iMp z5n3V>CbyZ6KV2iUVSj#@|2R@Bl6VB8?qR&0s233izL!zwfv~A=5iZBn5(n~xYWMB* z46HPGjCIQ)JzMKlKKu4$U+5**`=*3vxCN$dkH z^+gyBe+{oSI`=9Z^%I&ho_7&0m^L2n zGGSrANyEq zJDGP;_=*$?e~VY`TLQJd4TGJSCbkeUj5nGN*|vhz^y)%DOQ&N>7@b0XGpdt;7S4d8 z{^9+JFRAZLbjQRrV=wxdVH7c+r_rHk?yEPC{oD3PdyjXgmuK<+@R5kmXIHldv~o6> zn3qC9G1bXHOJb^+_}leU%W33zhiC8&khdrVkzS8jen7_{{UYiyhj))}nb7SxPM29gS}hK%)ne`ZCJ(eYfu4xwtEw9_jzHq~=?(5S8{BF(XsAA>)il8e7%9`!$2>aD z=<-(BfYH+{%=9rvmmAVqVji1k0`RTWOS)%ql(4A52RaE^>pKhx})BMf<2V~ z%}I3Eywh!(jIO1To8Larj}PTLMaA{!TKv-`d~Otl%;d>6m4<68V+uX}hv;fsZ>lXt zhp{%pHDZHw=`AZQ7WIQuud{d6G1yX{O!wa9Ez!^Vz~a?WCy-+j*sDXua_+vmJtZ>{nNp*JKb9V8A^teeIY`hpNuoYJ>-+X{aGEF`>N#05A33d1fJkgapplEE19m9 zC-49(UwVN2mh!NN4yfnT+@&CMiZ(CBV7K)&g{Zs*%}?a5CCf-FecMd(p+kv0xbeQ% zA3S9W*BUM3EhY9Ab^Z`@$m=vkfLCbehX|5K>U7dPd}~$ud=HhXnC9jcigv=s{vYt}4bqOpvv-Ch@Jx}M(=Vz{OAw8oJr zcHk9*Q?bak(EfDp?@_zfZ{w*v9Z^?rn!AC2&C8-GY$KLZ5!7}Qp9Kz50U8gjb<4w- z+HS_>!=7|`Gw;VKQ}fHqe8%hWhps<;N0%-39Fqp0a&bZ#!~IgIuBcn`FDnsNlZVk<7>FtfE9StDEQ#nmppnvR1Czo&~9#`aNiaG<$2cG0j_+%YvL9d?VZ}Y|JRCtn? z^Pfjj{&yJUYEuZMw%`93ErrwY@8K>HwDWu3ukrd?<2a^{?;)ajUhh#myUk!V?c6`! zn}75*HSts=O)kV*bN_mB7V;3B%ib!)il}T8`JLttkJ?Q8kFU9%>RV%A|8HIR1D!g} z2fBK^cktiz_z~#zfS=(?2h1Q;^hv6&)@c4&I+dKk5;T}P|G-B)q|gs( zANWx2JZk&ne^GZb4gV2#yq;2j z|LqNsk#z1StSO-FgtKt>;{Ie$;H~NES>A;8pnGTeE|<1i{hhWv>GC;@Whc|gR)q0o zJk2cPr&$XcavmOiFN(6x^Ai5mX-X?bLsL#`Ma4Xtv3}a{i*ROsEnOcmwBk#AFyniF zpn%ID@)Rw-40%8Pf{HG~7zU9~38x2#x*63&-S#b%UxF2mxuWD-Hfr`O*#CHFKKG{m zSK*)IwI0{Nu}AGYoZH4x++Xmaq#L{iPx?@E-oRp*=l&#k>O@B+$%7_e#-i&vtne?3 zQSKI>!GAwXg|~Rf|70#Zg91to=G>ago@@ifm2&$-tc|9frC@C{wfzNZvu>coU!aFh zbn6$)<<}>ZqYNwYn9nG`jEBj89>uKX`ycMB1^>#sbKYWu7WEtS#G2C1-}zWf^ zbTjV`@6Y;B?j5l8%bVm^!PA;OFa_11O zMx@^5T`?!*-sJ@p~(Mkcl&T>>huH-}j}c zdx#us2QyJ44Gm4MgoZSlTZt{a$PE;EAAPoqa_>VqH{V$4CprG7SxntTMHMyrV)FWx zMN&AQy@7(56v1ZdMCyI=h7o&MR(6&K{!dyx9;AgiaVM9?@+G+RAW4a=HKj_@Sj3|D zBxw=9=t~K*6vmp9d61cs6DEsJ_?Pn zP`cMdnux8~2~9!#d+k(HX&L7~PozjMsg!l3;mxEjeBNq39H(Q=q@kF#eY~aT`9>#2 zc}vkS>C4{IxBTY~`nElDqvOp{kW;F=J>h09JY zq;ST*q|SE9-&LD`zLuiwQWmf1Lw+r#AWVT{TGq&3u~tiKDLFU-h+D0y)7ev6=ho5) zhRw2tk0IIB_#>42nA8(XpnD?KY@1oMzHML{Or}&nsb^Kw+t*O3A6TkO1N_l9cXm*| zKeVdtpzwB5lq>q*uqP?1C9~HLt-OEV3%ebz*zq~K z+#dQ3ep1XeelDVN*EJZ-ii4y;b=+fhsjP$4i9JR>9l^9KJZ_^bV(8Q4!WrgL>!{ylCmbe6I(`wkC4ogH*4z)(u|6Ot#xVOJN)0WhJ9G?5?v zi1NEg0g(D0P!>xQ0>QqiKzx!xS%FdlYejv#N)ONS+h}uFsUNtw+*LXNm)qP8?YKnk zNSC`wQ+erH3V&P*;c>62j;7wU`*EpzozSvRLWpHID{%6L!&O!?@D`~0xvG} z@h9c!8jRa%$kULyNeBhlYjD~qMR;Ee`n<0+pBlE5+-Y!#R2Tibw7-N8cKT9+Xu>7H zCDQx`NNzG8*Ov+dkTC;?M$f?KU(#kiBjI5C>QV<~E+REdLxDKAMH=GwL|OS>N0?%C0c ziehB3-$McK$c`qpH+)`u0@MGvNa-JMfBoxURJj0)Nrf7X2G59JOGm@O3c4F(O4E&$ zJw>wdA6HP+7%BRp;9H{GW27q&1z#`Ftq94VZK9@QrC%Nr!up^P59Md~R)Y@yH_#<3n1=Q@ZV#F*s*F&dta4CKQzl8MWpYK+i2r4lljn) z@sh@;WBPjylj)!o&GDLKXMF!2ikct=G+9z>A<+u^9UmUkca^aL=TSTR(jJP4lw7j> z?V-S*FHlybRD=%z#}tTtM0`i!M`tHWUTl_jdm_dc){uunGV4{$WrTRJD!z^snP14=pn3qnE z|F)dsrbt2cgUbyPI}Ia!C0{2ITyBUFszb%nPG>CE+t)}>57bo>>s{Bx4ZdQ%-F5tx z^fqR`myToqTK|co3@_S0RcblZAIFX{>GRBD6$Z!Yi%s032gEVyNv>v0+}uC*b~o|a zW`4VJ>hq@L%a1OnyeKJ%=1iCBx=x|pH|r7&GC18Zw4CnlWkFrbZVQ%TS6ApTrb?nS zChn4`SjQm|t%;JFVcSb*zhZPv_D7oRxY!?8i~UKp*q>I5eT%`q=ZTG?j}6_%Y%n;8 zN%y5E_Og~VzdQG!eKR1KxpZ-#p$j(B6l`2Mt=-G)9Sig=*;wzbhJYP*8?g6Y9oFoM zy+Rhxp&vsJ!hrK3(_87+OqCYs#otQ5ZsLbc{Dz6===dw?H%)xKj>l{(tJJ$9^w<9` zi(a}ZGxjfHy%+1XVmr(>VDBUYu1>kFQ?Xivn{1^+I3 z8PZs4-Awk-{Sy=Et(j8W7Gmof`#v=sD8-Z@Vj~4?m2B>1%Z1OUnC-1M+8b}Q7qfAa z*=~SNCwBEvqdo6H9oD3q^Vj|Ru^obq^bLA(i#X#9M8JHYmw}6~{nq23!dwQ>!kJQ+ zcKviuFvyMf9(Pw1j9tC=F9BoH4RW#GyZk{r|} z*=kC%+mNL3gObE-8%iJb#-7c_aXO^NzEU&lc7fSd_aWZga-Zh>$?VPUnpWv+h})r^ z0ec71##so@gXz0jQdj=_D6-DR%Apij3@UJ)Yjlj{&aaN5kT)^g?9^HHmeJyES~7NmdR>EM@1Z7cRE+f=bWc|$f~lP`l23hKp=e8NZ!g0nnL|&mXC%j@d(mU> zNFg5c^-`AD4#r#-lirR#2;se+N--y~k~&7GcI_!xNiipo_2vZf*PM7(Z=}TC zlFh5Vp$oHKj#)4GKCL|>dAaVq_4744*etc%EY(G)9^+vg3dU?Q#=S95T{P1T7l_#u zNFP!ltaT4xvu!I9KZDZD=v3b#3`EZzCYu`rS2o8^eDKOAcuU&; zZ>(F|#7pj8o~hM4=ds?whG^*pw`p)ZB9E)>S;IPO!o>LNyYdEaM*HSUb?XK&|mi%W#q4(1GGiW=L&oQVw8V(>DJXhTIMt>wHO?SO}J6`p%a;$L0nK9R-_AhU!qU>@hpXAm*Bf$9NcLoi3U& z8w@7Lco-9|IE)j&m<{em{f)u&gv?vMY{*<~pnZ&D=@xy6jP*8dfyAU&=s`iOcbVCI znTcOD@vA0YY~UMU!EN5dD#LP{UVBdpZqm*)01Vms`0W1)*6w?EVa@D{7y9UZ;%kcQ z^#|R3PfEf*gV4nz@94UyYi7FB69Zv}bCzR3^a-NG<<;irY17T`s_7nOrhAN{#}`VG z4bs~g=^h9+2an+0pNQ>H@w={}3ip=>mJ1 zg?!C6exp%I(yV$-gaLu&3W{AV4J7a7QipbRO`(d+@%()uRC-;LfV)Yc;2zywg*D83 zSah$3yP5Hw=Nw(6x_1oAbl0I``I0UzmnP7eB-mruQ1-Zg#T~=kFPn{w(i^ETt69uO z(&;Z%ilnaZNP&+&6cYsBrcR+O*#D|Y>WWFKw@&J+Nvh1`V4fhgMOe|k-twg0XUt0H z%}S4oN*jyKN@sLfv*!+@yy!VI_)P_gvB zN1c+T2~TfujWAxi@-f;QLu4y+I`JN4;^uVX9ctowaSSOKGCI8@^(S|d`q!z4NCJ}r zjUp+g_f}J?A55t}dt6Ah+hk;`4r@x4QcJ2&mI{MfZP0u#NOijvn61C7w?59SFj9v#TOVY$ZeB5cs^`XICXP+HR* zWBQ6!QZP5Q?)#=*qMcbHP=|_Tw;sh~u)IxkR!iBuE@I0y((JL5Ol`PqtgqlFeUe#w znpyijy>?B$W}Ed~4iKc*n{C#cXV#lTkFJGn_8P;R$M5|U){Mo5Yi;_$2#e+Q^u_v= z`KE0#>_)Ua&zM4O^GtlUiO<&Yx6)_m_;lMc9e*W#nvRdRePEVPG0Sf?@%1LYJ5Wz} zJ$_)d&Js8O}wr#<=Y0CxI4v0@b+|5lIo6iQ5vCB zGIk(hZF|j<#tuZREyu)-9f(-lVG}oYAYyF=CT^TKB40!g;3SwDj73X_(jdct5#lDb zoqiWcKin%9NSk$%dwegw?Ld9TkF^>1Yh4SOSld-otLDPRR&3%)dJq_EJ7eOrP29MH z3WqT9!)AVkiJSL$(~YI`bld0gW`S{Lf%PUn$;4Ake2|GJnfOQ@pKg2K#ElhZtZkZ! z8!>XMZIX#kGwY8tabr05PN zv0Tv_q)V&xTXXpG-Nv6uqU_eV>1Bqn{K+L0@ER_f9@{7-xz=mE8NSMzz$3KpH%WCR z*LNR$+XqxS31`{nJj&O7Kq0RKH-|pH@&ihIoj0eCw@Od&Lu;vYE4HfFyiY;f5LBDH zp)8t~Zo`QMzCOgwR2!}Y$7b06W7`#GS zc(zo?T!Qg+izzGzoVb*ev{=i|5e3WyHcZ=j5F01rYrvwfB&R95r?&YJ&UIXh;1?EY zL3xN>SUin6Y%B)F*JgahA}#GO&X`;UaXxhX2u=v_Wm&>eP%{<8LbM^@h>dv{-b711 zCXJB!#t*de0vyLz2{eJ4o|NuXp-)rW?{G?G#^J0xrGAIgpy>;#bT4bI7IgQ}I(#p^ z!CeLT$%UG;P_kQ*pyi*H@;P6Cv%m9D0M3Le&*MBBxT6?bL&nz-9uL3qNEyXA72lAi zMO=^^bp;`OpzV;wKPqqG^Z~ai&;5cEJ(DNCem;ei;r#v$>inzJuS&18w1vM))X;_V z3-h#~N}OO-C8W*U;0`Psxg0S#>+}oA=0Rm8<>bt9Z??j_hDO zRDU8+TT)lPiuXT^4L24 zG^{KOl9)KKF+PK@UEn@J9J>()`5Xq0qr95jD zB{abiUD-OVun9`Cwsg6vyvX&HC_g=y5^QoFuSg_^ryRh|0}#GvE+u=)k^JBss`Qjy zZ&TQK>Rbx<0^L<}D6ARMUH&~oOKm2%WPE)hWqYGNmq){(n#<>Tj-KpIzAfbb{M)${ z*+LEzJc`dD8SXN)kh@fA&q|GaC37@4yO6g$mh3Ijy!oXM z|7?yH-BN~Ue~OR7TY6hT)BprKV!A1wlZE2_%N07{AE9v>Vw+Gaj-NcvLqg@Vo#SAEF6+?*e)*yI=l} zmK7+6)o@*{X*U^T2Gp4NI10Md>7xzrF2natod1SrS$fELIL-VlMmmEwXhT6H&xa{XD$xCKvZV@u>DwO>op0%YW<78jn zeUo@U*TeV6>b)6pdo}b&iWmpwl>MM(kCSn$4=<&>BIA;F&JUW~YjOfULHt2Wo`7d~ z`PLt(JW{p;YPN~8T@u4Y98+vG_zig+)3lv$$jd~V6f#*3ljocgqscB@cF)($WwG*Teqs|j=E(S}_D8K~j$A79Ge1!N zyK)h()$N>*0V7j8K40j3+K-ys0*J``sq-RvEN_025*NvlxO1hW{3K<+kKyR{2?|&Q z)m$T=f6KG@k0zQ=OBcx#`IjcThxWe@bgPN3rG*~=U1p;18Fgov=p>`=C=-3&sQZ+O z1{rnR8z}cVL2=8#hr5Z(Cnzil_?-fSuN%~8xx9rJ7EtyL`08=Gw_Kje4ro(81h;G& zU0xykvp1>HN_5;yl)6$L%Z6z8R?1T)eD*wL6*7OMm8;}s{P4Gwwi1HwqlK&G1ALQ- zrqJd!5ak0Cji)JVfxc~`k<=p<=u0L#gzlxvv*eI((W|~saBuCyG}&8Xr)g)p?9Wf; zlVh8VCjrvs**qs-Z;pSOPa)goFlx9FiEGWoq$F$i&EOU1K9jpN z;*F1LZePpE5?}nImT?po$OdbTzDASU+HYk%7_k0FEx!PxCVNkt`<;A6;(LFj$kUiP z3Vzg_r)5MkSAW#vew5wnv3Iqlm(U;&&7;Z~1)uz1mhm1zi#*CIk&}77JaSyYSmyha zmT^V4Gd}w#%DXB%x95`E zatt9WY5xs*AYYP8mCNNQ7DqF0$_LnB>TwIQ{<>Ln-jd5DmQ9;~m7izd((Pa6F3hR5 z{f`_k@!$;ojZ(KQ`WvOr4E>GL1$ce(y&(P*@&NX45pR@I{|<^xeRe@>{`eOCmD2Lf z`YWYpw&<^vF38YdDILB=yi)4@SVr{#R`Zoo%UO!3z(m*}Lw}akfd&@(@zz`PXGxPY z^k+%OZ_%G6{W?QDOG@3lDemgp1TX$ehW;?=w_C)+r1WzaFyp8`9y;$a6x zH{g^QpnA!_=(G-0VN79=3J#Xs}jj=Mj;K=iWy!+I9C@8p!e%3{e)xJQ%>_F zyj@mbvGJUdlu%#6BNr8vRUahgou$h9iW6T`?`)v7#ld~gQB)(PRFsQwQ*2TWzG6GDN%5f-Zi>5TDZ>q=Q}CsT z8*2OBq)Io`$~jApN0dT7?HomTDnT^b9fd(M%3Vp5Z{)yA-Q6*%%tN-95+Jf0(zwRT z3OQfomDN+c$-_hG#*@y8o3u6>?V*HvtkpoViPF9kPQlG3cVMYO&n{gj1;8(Y$$=IA_O$#=|DL)WvwX;dgdl&ctQ@j zmK^zba;S4NWuoYoW{UU-aDOv&5(eyM%0S_w-U{JV;+!|It%zZj5iFJFHdk7*Ra$Cu z1rg;K+Sx+c!e2c=rM`+E(78S!HW;McRs*+TK7$-c@w zeCTw`SMe8VaXv7ebJ>(_S0eD`)VWs5EPl{Hc~&+8UF9+Dht|q?hMA*p8?-qso7~!= zO-v+hm1X=TvnpniwqSu@tfqF7$gw`jy8(-ypBF3L4^QksA>oRlr##%)w2VC#>lQoxFBWbX=C`VoZ)SRY@q z3b-DhI0~4A+s*>E+D+MA;rG6)sZijB+o@c@ylrIb2KdHD6eQqy=wHAU(5rwsPD&Oq zdKYC0*ku3DdDPZ^xiWBgo9XP@U?6Hlq1)PBT0)DWQDg{(_lD&uG6fxVuJJWoLajw_}J0q32k1Oay!lT*(JWdRE=Ql*}Mk^Dk|`(DB|Yrv!n6fIye zI02-|Pot%ip^7)3R!pUOiSuN85+!nqDMY}~ixeqfF?1zh(nZP=Fz^zdSptQ-{XoIv zDNqP4rhuoAGB^||uZonUVu}+fo%$l>6OrOxO!-LR?$D5cyDyUcX~1z8DNI1iC5jSo z{RK)Eut}L0tE>;uZSW9+zmYlxW0&-0v4R7LO^OEZKDS3R*&*U}%0m--7 z)%9=*sZ0ze;)~FBKU2sA)cYcv5>bvH%GNR_D9K_Yr|(3}1@2i?GEuQx8)o5l*}HUo zqT(&r#lICWFpZc#FXMn{*+Y-xQQvmraf-;QbA#MznYM z5@iV-Idm{`y+^kDB>=FH^t@zMh6f2PD0N;x*{7p_#W*VKHsmYu9b;+gB+j>N~kmioiq*#S*4Wl z*(I9aYQ?7T@BEL9(ugP2Rx&sv)57R}{S-wwHSVk8lDH zJV-?Xf9XrSPXPGBR}_*i8qA?c0izF6qDaT5cG>BmpHxED4N5*w{E`YcAb;KgsuYkN zB)^S-kLQp>z%>UcTELHTC{4fyUs0Zb&A+5l0sDSMwoQQE;CmDJSYJZXn?QdM+Svpf z$~Zs)o00$MK`nfoS}Ye}e_mv}>8Crz6CLPo4%buOTI;z4oYqX=*_@uwKK*fp1;1>BHJ$pU6#^G3iz=&2AL zcNKa(twivoYliErzeYu;k-qmD1)WjCg(BomF~r?!JX==V3)47I7ZdmG?E}pI2-i?$@iWRQJH^TKRd! zA+h(h0hg5L8E<@;l7Gh9@bkk|`7`3=eTT_;8NL4XVJa1H_H|?X0bJX!AmaVB1WYY9 z6NiGSD+n+;-5*=9a2&LBSo`8;Q}7Jgl+lpZ7u z?|Go2e#8%BMSWC^EB(I{b|PO8&MU=U0S~^VMU^RGct8CJW&MhULFXeB@E?q5Dc33P zKjwK@X$!qZ^-X;M9cn7!5&<%BUJP|qOQZ&@r^tNvw5othl$uY zFINIZt+;a0>DTezq18b*n@J5R@QxyjO_?-*s~?TNgORfC4a&Zwgh^M8w}9FkMZ8|Z zBMo-##R_Gs%=e{em3Kwxu@AmpspNS(j#TTqDbsH$=>Gb`5puha9vpmxvhOR&{9i{_ zhFi0FyBlO<);J`K|HO)RFzYxTj-uRJ#9ul>rQ90CM;@U>Z>u+jO4b?PqiWKxXVQnN zK|f!z=JC--C|O43b~glwWMQAI1MV~z5t z(XfVwOPQz>*TNd^Dz25au>LOd#W$#=l{JD7y@mgu!5YH(v>RGN8*3U9DSm!d9BHk; zAru^8sx^-1RO4~&Aa-#Tu0^!BMsvRAs8-m~YHh&Rd_zS+C}Fut5j{ZxU6$R`ioL3l zHaj&{Nh7&IetmqW;z>KJq%&7l4zlYuN(?k0WnTc^DGjfsu;YV$MKo znMjNpq$g@fL|lM`(r1i>h-b}&sOQXT&si%)fug|%?iga=4u?@8+X0F7c7~c2^mbmb z?&fpgO2d!~7&*+EC}8<8Yb2l+@h`#l-4kRDw`K{L9gYI?PLg8;Y!$fMNXY4X3;%lo z^i}tk7Cq8BzYlM0(aKj?BbhcX*&1ArHmtJ_um8&Q=@Vv*o$`9r4DHT3>;A5df-fM% zz|ZSB{GrCh)+X)E6j#p3Q-*#A;VzW;O){Z7mf$C#*Ep5zh0s=~lh&d9q)Kro(J61K zR6rnC^(smPJ^W8il<_?n0xSaV-5T_R z%~I0=4Lio?l&i??RIPlxjAg;~bNvVYLXhv_vCeAw0FjjIhfj1PPho7pm#*2OzOu<` zX<}wZpd2o*>OTdCg0=JaAjjLxZ?;MAUCDQvOzTcqn>HUh-Izh<8JEc{Wm65@3kAlW zv^K3j)XaEulWq#)*f9d9QJ^lRpRhjKsO*MO)<}BminU2AGvzwYSIkdFEI99| zGOoY2;CXhTI^??yLKvPe{)iv)oyd=`yVYuW%t+Gzo`%Q*v3b?6Bl2DJMPeV|HEhMw z7q~EL*YCwz`NM(NH0oOP<1K&Jz)%bazAoy3e?#zZ>5T_N)m|5mtFuU`>1MIOTi0l? z7RP_vKq~5ENnQ2(ziI^STmD}g$V3A*2cZ8SjfnOwPw%!`{HpkcMu4}efiDH#vj%<$ zc#j(RAHciTz&m_wwREb1hXe0d178W;97Oc?Ek}@0b4V`%-l|50GW_4kzBTYVpFCJT zu$GOqL4La$~g@B5Ai1@V%z@&l_^cg2*W;k(U zQb#d5qXt0;4omtV5EzC@9hLw^ZUIYR222s02@Lw2Vz>R@iQP@~ zh}hjEZ;Mw*e|CIz?9Xr;ULiiw8Sp#eQyp&;+ZP=Z-sjF~b()jEP<)2tO=A1PVZu*} zPjSXqd)zgxRyhsi>`xu$c!T(4$M=ctseuWKO7(vuK7PFZrH}Z}aez6oyA8iAb|?6K@j?FB zqkkU~CmfsqX*}lmcanG4&@ulqtx5+v70#7_JHVfd-TX~rcN;z=c30`tJ-E{*#O?xo zO6)$5eCwX+b+D7XC>4%(CbZwZ)9NJ0=ZVjBe2ds!1NVyEeI$3)g5VYOkm}V7Mh)MQ zDhq=yo|n=dG}%#A^UAvGm3~b>GJ5$?C#@aMye8 z9JK4n$L^lITyK|;>+SR|lIiUdOm+Kx`d21DaPp^5O-^P9@-h83%Abq*Q#gMi=C9`b zWthK(^Pk52#ILFjuju6r7FkJ#=9*GVV#oV_fca=I_I_dKBA zkZ})i>mMm!F~!Wt@-Tx(M(2Tk2>a{l zy$@+TvOxJ~zG_^Wj*}8MkEWDUdPa`gg-`gA)+51W`$3hul>Qpn&FlDeOen0)7Fixt z+WX<@(b@B;Q~77PcwK-sQreS==+;s1dmr|S-&3sbm;LAb^6S#hJzM_a!}^r%vaTc2 z&Ya_~OKmi(mH?i;4UD;>G9=JbIFPsxW$ zvOdQTcB=1B=z!>}{)7tjVsV0Wut;y&KE2;wACW(0isMI87CNdo{Kxd3`@H8j&P@56 zy|#;AUiyf>G0>`L(Lz-BPJdCm+ANcPxAgM z@csYyCogT=rGdKy+~7UQ+cmgAW@gXf7C)vBd{x%)V)+E?kYFQy=#j;$K>zY zGC31AuP1h_7vx8;lAkB#&96=$UaAlLX^;1%&-$I(=TG~VP%hOQW$M9F+J%k2;s0e< zmfg4g{X-7a-}rg^oHhvN9Lz_b`r7pI%i{;ivyMD^LDIZ$TqN70zK8$GmDqq4%H*`335O0U6|ci; z9kRL}^Eq;p?2(7$@Ry*!l4@f>b-xT1RQCpSrGoC0lQ&{MPcDPyWVZ?drOIEy4*KNE zS1}*C2_61hbeimGCokixc+CljQ(s3{$aQk#yI8;ZJ@k-Vxpk5^!mL$I(f0hMXf;$%Uta{(|vU#Rf*pD=!n|7P(I@K8+J>_0WBC^%*~3 zvfFqN1gulfVh06sg~2R(s-L^sY0IICilp4*YVN1vkMS;9$g{Fe`WHr z{%wQSC@^uKoPPm3?2w}#=F{XHxnTSmnS-4`d>eLCJ{S5HT$SE93Lq8sFa zYx7!COk;!2S?K6F=u8Ifk+XA{kFG{HJ~6QwU**?K0>*{&(3uO-b#nDm%n!(^9OerX zA8N)^l}TXa8o8l2>>>MVeI52w`y{%389MeUbb(wax5yoINp&yB4wF})yX5edn9p8? zZjr;E#(WYi+bRPArE=uLXRw2M0o`1WF8nFF^=IhRUpT%@wvG3fPCy+09Jz?jeIDKY zD|G%^bWJbYOSW`w1BT;YMEA(G>oKoxKqo5b*p2AKSHSXm_f-g}*k7Z&N4*rV}P?cs4imRG(k>!5p& zpi_^b3;%{rJ&qobQ(c?)$5*WO6%`J&n#hi>`R+>`UktIs9^v55`wX8}P?h z8FG#s{WT7de;wW0f%bljj=$}D{0^r#<$r8zPnHHdp~KVYHyu9E9}n)b5(?Gk4eV~6p5(aHVLLvrc>%y$k%=VR!mvDyB1 z0?k>h5Iq>3I0Rig6y1rVBZr|IN1zKw&iB7gwG)UPg%!Ld=;ShVemS~vG&=hsbn6&& z`ndW2{%x4EINKZ zx=8MnDA2k98^kU|M=nCQ$dOAhU(TVMYtf~`CowP}hcCl?lw2ft%zruT?9`bn(ao#C za;Ap?H4J`ZX7`C~0UD^vwdg)M`3219$z`zYe^m&GX`cv}vBMg<@+Hi7Zb0WAM^~P3 zZ1(@yb51~*K@AttAWwRf;x zmmGc<^GR}^TqU>2>OJVMq@oy5DRPcnAveiAvibuIsN!JRG#LoU`$uw}?2(7$*dKAg zG&#SM|Mkmg%b8uHHQxz{8zFR?+#`2(#`DVR@_%j6b$K#rdZ{Vh^C45*sE?QmI~a0=?F6uC%l>e(ZtS!@M1%aW_) zj@~HEW|OC3vpl(W*R~@FB&V;$ z4sztkXE7fq=g3XRW_;Cg0>(pftbhaL$z^hf?2*Ik$Ni1QSJ_FxjIRphHaU0gxPwvs zS{a@EBD!@Q+PmJ`A73SJuz^v3Dnss9Ft2Vzr@n^vZblEu5gp`%@#S3-Hb{}P_3Mamc z)pFz-xkDb3W8cI6(&&;ZVnDUY)myQH7TF_*zmN43YM#F{!=F)E|RO{`t4YMNRHfr`8c`gcyzo}oq#!B8+T#{19HEG`Q+VbkDR>+ z^M#51`xvxDxCd;gAk z)kR0G?JqlXHsJTK|856CgSS(;6i^$saY-c#5*@-#X{E|BZwHrXQ&(egP+4+l(= zv*aSVMsAUNg$dZfX8o5R8k_Y6-voM~#>%@S{kPGB0xlc|97X#Q2 zWoqOBSdQn+R+y2hkbC6lOH`j+CpXENzSG`3pS0Y7IRC0sLEIqs$%)snewExK*I%F1 zA3dKnoq%~h>5x70kQ{kq(xGV|c@rHYCnxrwPcxH%X|M9+GCBSh4p4X--6to1hxyvr z`q2|Ydza$>jrk(EHpG1N_visR`3~l*I&;P-{ zb%$Ks$<50~h|G5b^7A`#W&!3qg41~>>x+3kmIYc zex6(oJbn{aqY6FpfLu%C0O7OHMRN0O%*Q@F^5l0D@sD7I8oBXN%ty~b$3KRyu``$t z&l$`5w@(z|)mWiOZhjo|u}`4;Bqm#qw$|Gs(cN;$*K z>rGOWs#K{#Zj*cD0Xh6M4jLmT(eqSBFIzR5&e~O>rMkH)6w}_SP-IHJ_c%kAE!xBW z;(G3k(U&h9&Ip}4Tcd1~+|k>l_Pk+FFFG@{L>7JSOlh3e>rEkVNKDbtn@!QvJ4_MQ zGifQJde#(4y}}gIz!Vj|$rLTU#T0!#b(R!T(-czE6!N8zDYAO4De`)~DP$m1)bu7( z$atoZshMJ^r_Po_dNGAe&=mQ*Hk=(=y3^q!$`PH!>cGKH&phY2?++}1N0IZV_`G`610 zNbLlLQ+j9uq6bwQcJHF8sL zmTEVz4n=fA{#j;kGi#qL;=jge+1t$8d{%E1F52_e_cH z*lC)aBNxe4a-H1N+hmw2S+gIPLY~2-m`%JwgOW3Pt*I@?fE2p<@la&8K~>u1p5A79 z9#YueFV(J$xSsul^ejiYDdg}rMMZBgMNMxsMMG~gMN8ji3h7sh+3>44;|MvfXV!$4 zF3V6jPcD!vdTxz8hu10GB6rC>vPbTdhh%#X%V4dPRQxquyaYK-&XV)wBDq3tfaSHh z1p#?`NcPBm@{k<;Ph6llIpx}%8>HQUI77~o3*-v9PHvLhj?MV0>jaEF@_?-V3zslL zj*%1O)WoClRb~<}8g@0X}Nt<6?RsH|Zbaayr<4nx|1+>lQ4@0Luj2;G8nArNY zCg!8hgXLS&;3w9$!7%s%vUQ^9{}{}=9eg2W-E)@D)bz-zJy}5WQ9vWOiq^DWU`~*` z!Bwz+K%&7_u+~*_Jh%qb=Ii8ca0R8!mxC)Pt@FX9kt3U(ARS!mXe-2nYaOj)!KI7V zso>H?>%5w*QnQ4~`RMR8+6zsruQ@;Tfl_R*NyPLp2rdD%BcyisKSZ&vlY8Xm4A!si zfv)cfo~Ps$;R1O@$S;Pts*{uZV7{|2y0;&?y+7I6H%un7&Of%ya>-w^F?O0XF!#<& zUp%Q`-1^)kZ(c?+Uz*t5(kK7TiA|^8rislhBnr7nf5w&I`y5kuS91@lNNdu--0>rG z_r&J55#GZSn*+IViC%YM=+1eAs^0ga(2|Ab-dN@lxk<0SD0J*X`=%`Wq`t{GA3Qtc zU)R4hw)eM)zM&Ug96EN!-p|681HJaO={@vkE)MO#$lgoCmg=+m8`5Uy`lV*o$jb8T KZrwh;>;D3t*}`)G diff --git a/tests/programs/ext_c.so b/tests/programs/ext_c.so index 801f97789a4dbd7c4ae4b1ecb5bb92f79fe8ff22..00c6d3bf5254d14645036de4b9c4f7408e3fb28f 100755 GIT binary patch delta 50855 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 z z%sUsOqiJ-7y$bW{5@WglgX3DQ#)3S#_Ib=lE=709ku{jFk)4d>&Gru#pm8~N$X|h0 zYtc=zx)Sp-a`r{c7sUE!=Z4OhQ=?2>?>{%RY)*^9ZM|Sc=&U);P8=tqr&ffP$wv{J zR>&DGCSf!#mxkc`f`(($(Nn_+BdZxNK`&1GEM%$trvur9Uxct-f@w<(cbFdeci*o;2Ycg$sJh zgsT*;=?x~_qOhyCm~fxMVZF_SV{hP+B=imw&QLg~cbjmT!c{%KO2Q2axAf#HIU2%m z;@Azz_r%feYz2K72vQ^GoIADw%C#T541$Bdm75RAa z67zu~l}(cydY6>x$m)=zQ}Wk|k+*RNiz{#By>1w7uPhSH<@bL*QL>| z&xf3eI+e7@9lhUlQF_6p(!}+0)5uY48aZ4|Q_)*ZGp)CormnY}rm1(BM!HKg;q1W$ ziIC%Za!qL2i5Uv#$pvynZ&)J_$u$Z$$u7A=?vi_CwU?G2T~u)ls02Ap&XV)w61hUI zgXO8V2?4pBI=M^kk=3tp4Wr~ZIc3{C)u-)%I77~o3*-v9MsAQ>md*UiwF1Una-SUj zUtHq|IYv&9QzH-NSD8`3%&&6f0=Z1Cl56A!xixfdFrQrL3)iSmcJ^UDMoyA5 zdj1!A1IIRbU$Y9_@IN#P-1gsH3ha{m&Cv>(m+;g6uS!k*EOTPp@_!ZT1?1y>a@qft zXpoQkzm*JJCAa)v8V31-|4YNbS^p=51Dm}q>Hj7$D2V#M2@D+Zf8rN7@e!_3cE;!~ zHES53g;pW78y;DI`|{Ay#mM|o#Ej5gf=)Qzn;*dvRLN~}Z7$ZA=b@{IgJ-Ie-f)FH z^k*XwS5IydGoZK zx@Ba!goVm}cVsiD`!6G#t1INzjm9%B`Jcm>+Jnp$lfv6a9n3{5QV)%6t_0+^Mm|(L zeYO7b+R%^3yWjE#R)ed$=nJn5&6{nm>SS)=+x5mPL#NCRURcQmIqx&h`wt2EeR_{^ v^c}BWF6XfHDsiLdSuX3aQ9QgHL~vOMxg5j~BtG8An!84pRbPKqXvzNrs_NfE diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index 96f4e19..272c1bd 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -8212,7 +8212,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); // given the asset config cap is 0 (disabled) - // it reverts with an AssetNotAllowed error + // it reverts with an AssetCapExceeded error test("Wrap asset with zero cap - reverts", async () => { // Disable the asset await $.setAssetCap(assetMint.publicKey, new BN(0)); @@ -8232,7 +8232,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { }) .signers([$.wrapAuthority]) .rpc(), - "AssetNotAllowed" + "AssetCapExceeded" ); }); @@ -8376,7 +8376,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { }) .signers([$.wrapAuthority]) .rpc(), - "ConstraintSeeds" + "AssetNotAllowed" ); }); From a06d5d4d41c84b8ad0dbeda5a205840611fdb3bf Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:59:25 -0600 Subject: [PATCH 20/27] fix: used generic tokenInterface combining transfer_tokens_from_program methods --- .../instructions/jmi/replace_asset_with_m.rs | 8 +-- .../m_ext/src/instructions/jmi/wrap_asset.rs | 4 +- programs/m_ext/src/instructions/unwrap.rs | 6 +- programs/m_ext/src/instructions/wrap.rs | 6 +- programs/m_ext/src/utils/token.rs | 62 ++----------------- 5 files changed, 14 insertions(+), 72 deletions(-) diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs index 05aaf31..34436bb 100644 --- a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -1,12 +1,12 @@ use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, Token2022, TokenAccount, TokenInterface}; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, M_VAULT_SEED}, utils::{ conversion::{multiplier_to_index, principal_to_amount_down}, - token::{transfer_tokens, transfer_tokens_from_program_interface}, + token::{transfer_tokens, transfer_tokens_from_program}, }, }; use earn::utils::conversion::get_scaled_ui_config; @@ -78,7 +78,7 @@ pub struct ReplaceAssetWithM<'info> { )] pub to_asset_token_account: InterfaceAccount<'info, TokenAccount>, - pub m_token_program: Program<'info, Token2022>, + pub m_token_program: Interface<'info, TokenInterface>, pub asset_token_program: Interface<'info, TokenInterface>, } @@ -129,7 +129,7 @@ impl ReplaceAssetWithM<'_> { )?; // Transfer asset from vault to recipient - transfer_tokens_from_program_interface( + transfer_tokens_from_program( &ctx.accounts.vault_asset_token_account, &ctx.accounts.to_asset_token_account, asset_amount, diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index c2cb070..bb207bb 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -7,7 +7,7 @@ use crate::{ AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, MINT_AUTHORITY_SEED, M_VAULT_SEED, }, - utils::token::{mint_tokens, transfer_tokens_interface}, + utils::token::{mint_tokens, transfer_tokens}, }; #[derive(Accounts)] @@ -131,7 +131,7 @@ impl WrapAsset<'_> { } // 2. Transfer assets from user to vault - transfer_tokens_interface( + transfer_tokens( &ctx.accounts.from_asset_token_account, &ctx.accounts.vault_asset_token_account, amount, diff --git a/programs/m_ext/src/instructions/unwrap.rs b/programs/m_ext/src/instructions/unwrap.rs index f299798..4ed05ea 100644 --- a/programs/m_ext/src/instructions/unwrap.rs +++ b/programs/m_ext/src/instructions/unwrap.rs @@ -1,5 +1,5 @@ use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, Token2022, TokenAccount, TokenInterface}; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, @@ -73,9 +73,7 @@ pub struct Unwrap<'info> { )] pub from_ext_token_account: InterfaceAccount<'info, TokenAccount>, - // we have duplicate entries for the token2022 program since the interface needs to be consistent - // but we want to leave open the possibility that either may not have to be token2022 in the future - pub m_token_program: Program<'info, Token2022>, + pub m_token_program: Interface<'info, TokenInterface>, pub ext_token_program: Interface<'info, TokenInterface>, } diff --git a/programs/m_ext/src/instructions/wrap.rs b/programs/m_ext/src/instructions/wrap.rs index aa31708..57acbbd 100644 --- a/programs/m_ext/src/instructions/wrap.rs +++ b/programs/m_ext/src/instructions/wrap.rs @@ -1,5 +1,5 @@ use anchor_lang::prelude::*; -use anchor_spl::token_interface::{Mint, Token2022, TokenAccount, TokenInterface}; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; use crate::{ errors::ExtError, @@ -72,9 +72,7 @@ pub struct Wrap<'info> { )] pub to_ext_token_account: InterfaceAccount<'info, TokenAccount>, - // we have duplicate entries for the token2022 program since the interface needs to be consistent - // but we want to leave open the possibility that either may not have to be token2022 in the future - pub m_token_program: Program<'info, Token2022>, + pub m_token_program: Interface<'info, TokenInterface>, pub ext_token_program: Interface<'info, TokenInterface>, } diff --git a/programs/m_ext/src/utils/token.rs b/programs/m_ext/src/utils/token.rs index e97ba4c..61126a1 100644 --- a/programs/m_ext/src/utils/token.rs +++ b/programs/m_ext/src/utils/token.rs @@ -1,64 +1,12 @@ // external dependencies use anchor_lang::prelude::*; use anchor_spl::token_interface::{ - burn, mint_to, transfer_checked, Burn, Mint, MintTo, Token2022, TokenAccount, TokenInterface, + burn, mint_to, transfer_checked, Burn, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, }; -pub fn transfer_tokens_from_program<'info>( - from: &InterfaceAccount<'info, TokenAccount>, - to: &InterfaceAccount<'info, TokenAccount>, - amount: u64, - mint: &InterfaceAccount<'info, Mint>, - authority: &AccountInfo<'info>, - authority_seeds: &[&[&[u8]]], - token_program: &Program<'info, Token2022>, -) -> Result<()> { - // Build the arguments for the transfer instruction - let transfer_options = TransferChecked { - from: from.to_account_info(), - to: to.to_account_info(), - mint: mint.to_account_info(), - authority: authority.clone(), - }; - let cpi_context = CpiContext::new_with_signer( - token_program.to_account_info(), - transfer_options, - authority_seeds, - ); - - // Call the transfer instruction - transfer_checked(cpi_context, amount, mint.decimals)?; - - Ok(()) -} - -pub fn transfer_tokens<'info>( - from: &InterfaceAccount<'info, TokenAccount>, - to: &InterfaceAccount<'info, TokenAccount>, - amount: u64, - mint: &InterfaceAccount<'info, Mint>, - authority: &AccountInfo<'info>, - token_program: &Program<'info, Token2022>, -) -> Result<()> { - // Build the arguments for the transfer instruction - let transfer_options = TransferChecked { - from: from.to_account_info(), - to: to.to_account_info(), - mint: mint.to_account_info(), - authority: authority.clone(), - }; - let cpi_context = CpiContext::new(token_program.to_account_info(), transfer_options); - - // Call the transfer instruction - transfer_checked(cpi_context, amount, mint.decimals)?; - - Ok(()) -} - /// Transfer tokens using the generic TokenInterface (supports both Token and Token2022) -/// Used by JMI for multi-asset support -pub fn transfer_tokens_interface<'info>( +pub fn transfer_tokens<'info>( from: &InterfaceAccount<'info, TokenAccount>, to: &InterfaceAccount<'info, TokenAccount>, amount: u64, @@ -66,7 +14,6 @@ pub fn transfer_tokens_interface<'info>( authority: &AccountInfo<'info>, token_program: &Interface<'info, TokenInterface>, ) -> Result<()> { - // Build the arguments for the transfer instruction let transfer_options = TransferChecked { from: from.to_account_info(), to: to.to_account_info(), @@ -75,15 +22,14 @@ pub fn transfer_tokens_interface<'info>( }; let cpi_context = CpiContext::new(token_program.to_account_info(), transfer_options); - // Call the transfer instruction transfer_checked(cpi_context, amount, mint.decimals)?; Ok(()) } -/// Transfer tokens from a program-owned account using PDA signer with TokenInterface +/// Transfer tokens from a program-owned account using PDA signer /// Supports both SPL Token and Token2022 -pub fn transfer_tokens_from_program_interface<'info>( +pub fn transfer_tokens_from_program<'info>( from: &InterfaceAccount<'info, TokenAccount>, to: &InterfaceAccount<'info, TokenAccount>, amount: u64, From 432404bf858c1233ef77b2b3ca58de4efb3fedf6 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:00:16 -0600 Subject: [PATCH 21/27] fix: removed pause since pause functionality already exists in whitelist flows --- programs/m_ext/src/errors.rs | 2 - programs/m_ext/src/instructions/initialize.rs | 1 - programs/m_ext/src/instructions/jmi/mod.rs | 4 - programs/m_ext/src/instructions/jmi/pause.rs | 26 -- .../instructions/jmi/replace_asset_with_m.rs | 5 - .../src/instructions/jmi/set_asset_cap.rs | 1 - .../m_ext/src/instructions/jmi/unpause.rs | 26 -- .../m_ext/src/instructions/jmi/wrap_asset.rs | 5 - programs/m_ext/src/instructions/migrate.rs | 1 - programs/m_ext/src/lib.rs | 10 - programs/m_ext/src/state/mod.rs | 4 +- tests/programs/ext_a.so | Bin 482808 -> 479648 bytes tests/programs/ext_b.so | Bin 459744 -> 459472 bytes tests/programs/ext_c.so | Bin 483088 -> 479928 bytes tests/unit/ext_swap.test.ts | 30 -- tests/unit/ext_test_harness.ts | 64 +---- tests/unit/m_ext.test.ts | 259 +++--------------- 17 files changed, 47 insertions(+), 391 deletions(-) delete mode 100644 programs/m_ext/src/instructions/jmi/pause.rs delete mode 100644 programs/m_ext/src/instructions/jmi/unpause.rs diff --git a/programs/m_ext/src/errors.rs b/programs/m_ext/src/errors.rs index 9de0b67..7c62f32 100644 --- a/programs/m_ext/src/errors.rs +++ b/programs/m_ext/src/errors.rs @@ -35,8 +35,6 @@ pub enum ExtError { #[msg("Vault token account frozen.")] VaultFrozen, - #[msg("Contract is paused.")] - Paused, #[msg("Asset not allowed for wrapping.")] AssetNotAllowed, #[msg("Asset cap would be exceeded.")] diff --git a/programs/m_ext/src/instructions/initialize.rs b/programs/m_ext/src/instructions/initialize.rs index a3d6e9f..3084675 100644 --- a/programs/m_ext/src/instructions/initialize.rs +++ b/programs/m_ext/src/instructions/initialize.rs @@ -203,7 +203,6 @@ impl Initialize<'_> { yield_config = YieldConfig { yield_variant: YieldVariant::NoYield, total_assets: 0, - is_paused: false, }; } } diff --git a/programs/m_ext/src/instructions/jmi/mod.rs b/programs/m_ext/src/instructions/jmi/mod.rs index c3339e6..cd4a461 100644 --- a/programs/m_ext/src/instructions/jmi/mod.rs +++ b/programs/m_ext/src/instructions/jmi/mod.rs @@ -1,11 +1,7 @@ -pub mod pause; pub mod replace_asset_with_m; pub mod set_asset_cap; -pub mod unpause; pub mod wrap_asset; -pub use pause::*; pub use replace_asset_with_m::*; pub use set_asset_cap::*; -pub use unpause::*; pub use wrap_asset::*; diff --git a/programs/m_ext/src/instructions/jmi/pause.rs b/programs/m_ext/src/instructions/jmi/pause.rs deleted file mode 100644 index 649f0fd..0000000 --- a/programs/m_ext/src/instructions/jmi/pause.rs +++ /dev/null @@ -1,26 +0,0 @@ -use anchor_lang::prelude::*; - -use crate::{ - errors::ExtError, - state::{ExtGlobalV2, EXT_GLOBAL_SEED}, -}; - -#[derive(Accounts)] -pub struct Pause<'info> { - pub admin: Signer<'info>, - - #[account( - mut, - seeds = [EXT_GLOBAL_SEED], - bump = global_account.bump, - has_one = admin @ ExtError::NotAuthorized, - )] - pub global_account: Account<'info, ExtGlobalV2>, -} - -impl Pause<'_> { - pub fn handler(ctx: Context) -> Result<()> { - ctx.accounts.global_account.yield_config.is_paused = true; - Ok(()) - } -} diff --git a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs index 34436bb..a28ae1f 100644 --- a/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs +++ b/programs/m_ext/src/instructions/jmi/replace_asset_with_m.rs @@ -98,11 +98,6 @@ impl ReplaceAssetWithM<'_> { return err!(ExtError::InvalidAmount); } - // Validate the contract is not paused - if self.global_account.yield_config.is_paused { - return err!(ExtError::Paused); - } - Ok(()) } diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index 67ec369..d04ce77 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -71,7 +71,6 @@ impl SetAssetCap<'_> { #[access_control(ctx.accounts.validate())] pub fn handler(ctx: Context, cap: u64) -> Result<()> { - ctx.accounts.asset_config.set_inner(AssetConfig { cap: cap, bump: ctx.bumps.asset_config, diff --git a/programs/m_ext/src/instructions/jmi/unpause.rs b/programs/m_ext/src/instructions/jmi/unpause.rs deleted file mode 100644 index 975cd62..0000000 --- a/programs/m_ext/src/instructions/jmi/unpause.rs +++ /dev/null @@ -1,26 +0,0 @@ -use anchor_lang::prelude::*; - -use crate::{ - errors::ExtError, - state::{ExtGlobalV2, EXT_GLOBAL_SEED}, -}; - -#[derive(Accounts)] -pub struct Unpause<'info> { - pub admin: Signer<'info>, - - #[account( - mut, - seeds = [EXT_GLOBAL_SEED], - bump = global_account.bump, - has_one = admin @ ExtError::NotAuthorized, - )] - pub global_account: Account<'info, ExtGlobalV2>, -} - -impl Unpause<'_> { - pub fn handler(ctx: Context) -> Result<()> { - ctx.accounts.global_account.yield_config.is_paused = false; - Ok(()) - } -} diff --git a/programs/m_ext/src/instructions/jmi/wrap_asset.rs b/programs/m_ext/src/instructions/jmi/wrap_asset.rs index bb207bb..365611b 100644 --- a/programs/m_ext/src/instructions/jmi/wrap_asset.rs +++ b/programs/m_ext/src/instructions/jmi/wrap_asset.rs @@ -101,11 +101,6 @@ impl WrapAsset<'_> { return err!(ExtError::InvalidAmount); } - // Validate contract is not paused - if self.global_account.yield_config.is_paused { - return err!(ExtError::Paused); - } - Ok(()) } diff --git a/programs/m_ext/src/instructions/migrate.rs b/programs/m_ext/src/instructions/migrate.rs index 39cad4d..cf07083 100644 --- a/programs/m_ext/src/instructions/migrate.rs +++ b/programs/m_ext/src/instructions/migrate.rs @@ -175,7 +175,6 @@ impl MigrateM<'_> { yield_config = YieldConfig { yield_variant: YieldVariant::NoYield, total_assets: 0, - is_paused: false, }; } }; diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index ae6cb25..062e1b4 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -121,16 +121,6 @@ pub mod m_ext { SetAssetCap::handler(ctx, cap) } - #[cfg(feature = "jmi")] - pub fn pause(ctx: Context) -> Result<()> { - Pause::handler(ctx) - } - - #[cfg(feature = "jmi")] - pub fn unpause(ctx: Context) -> Result<()> { - Unpause::handler(ctx) - } - #[cfg(feature = "jmi")] pub fn replace_asset_with_m(ctx: Context, m_principal: u64) -> Result<()> { ReplaceAssetWithM::handler(ctx, m_principal) diff --git a/programs/m_ext/src/state/mod.rs b/programs/m_ext/src/state/mod.rs index 2a5db19..bb5ea8f 100644 --- a/programs/m_ext/src/state/mod.rs +++ b/programs/m_ext/src/state/mod.rs @@ -102,14 +102,12 @@ cfg_if! { pub struct YieldConfig { pub yield_variant: YieldVariant, // 1 byte pub total_assets: u64, // 8 bytes - sum of non-M assets (6 decimals) - pub is_paused: bool, // 1 byte - global pause state } impl YieldConfig { pub fn space() -> usize { 1 + // yield_variant - 8 + // total_assets - 1 // is_paused + 8 // total_assets } } diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index 6ceb651e1f86c766409427fb3d36e792fbc5563e..ffb46a0bf426b224425cb9610dacad4f596a1d01 100755 GIT binary patch delta 60719 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 delta 62134 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 diff --git a/tests/programs/ext_b.so b/tests/programs/ext_b.so index 503a93293e6bc18a885ac01de8ddcb30c2aa1cda..70f1790071f769b8956b84aceb1198b117363a77 100755 GIT binary patch delta 42230 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 delta 42661 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℘sl8Lpj>lHnG(i+js%!|ZGe7ms?IY8{qj+(#8I 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 UEJtnUc*42{?})+uw3GM$1M}6XD*ylh diff --git a/tests/programs/ext_c.so b/tests/programs/ext_c.so index 00c6d3bf5254d14645036de4b9c4f7408e3fb28f..135171bed56eeb744b4a56d04a34bfc0ad3c4dc3 100755 GIT binary patch delta 60708 zcmb4s34DxK_y0U+W+JwTkP#sxwjdaL?1PfnYS0o(i9PldAw&p@h^4VSl@r^DEtDEd z$fGTZrGg^%&_${((YLL<-Y%(D#s7Ps=NTg2-{;>qpMH9rd(S!d+;h)8cX{r;vnDg( z*sg#zem>rnjRx`8S^dAkFsI+z;E*nJ7JI0;8ydW|YzaW*q%6_$OG3jt8l7S7wko}P z+|!6k!XMt%h}_UEoZP~{(S^T&GD$_wSm*_EC{7K!SgmkUf0bnm@^kzM8fvAC+m#A*C1kEFZG2T8Pk2P{-8{fXBliMq0!?Hxj&9FU8=gQ)ioIjEvt zBt}+r2#}!x51$CCy+e-lanY3nvZYc2m0c%0D<#oSn`K+&7z#Znr&YF5r*rAKl^rjH zdL57>EJ3t&yPRP8FG3@$M9}Q*a&{FL)jlA{_$APnYvm%pB$B5?{GAg0 zu}!wO&!y&@WoLC4CAwrsKs=;C8+hm6|oHlPtx7xc&@{cv%q6y#% z%%vTh-9rLK@&O)NBMgKP^K>wsKoRcfoff1r~Ap(Y*opxPr8Q<&OLR5 z?A0WQhJPf7G>M^wnrb^CEx4upSChABJPK_ZMk`X}WPn8}a$Zv>b>5mD-wcKf*eWMC z&!xc|sI3;f zPqdo!R6fyWJRRMuHd>fdZL|(h0*$u*wCt+=nfznBx5yK$aFed69o%HYUe!%jjZxhs zXs_xf$`;j4_A}fBZd!%qs7?tqeT!V!DO_NV&QauIIkR&zmD($ZcZsLtOXb`y;q<|W zvh9r^s=GxFeSeZXK?&(lYERFYTqNTr^KWLwX0pORG1UF`b7 z>!e%i^D>pcs|R zV2G`#{X;N(oG!=r3aj-b>s7f;OUNA#xl>IRpZXrqPy9(+g)L zNtCxQJz=JY^jbYD9hIH4LV^#MD7(I1_Tv)LPq^fwSs_&EQ#m9i-Y2j`l?#r@*)fsy z+b8L^*%3s0K1olC4L8!2y^1T^WRc{*=hvs*dl^VW-muKvMP3*G3&p7kwdD^Nl%)!Z za>fFif78U5mM|N{fDB6j)Jc?!7Fg*9JbR&yIwZ=Dg%+O)C6uUrSdLj3Lkp7Rf`xXP zos@1{lq}KQM0OUM!l>VJ*=w<#9)lMkd%2vnID`V0v-1yA2t8je7Xdw*$X-u?&RQ-< zEwKruoB;kSqPfS6?%Vq1*FdCQ0_CMjMDJ8U6ct}oKYN0xb9RDX~1ZzHuxFoRb7vafO@*baEo+{bjOKx8-bo zilUB{D5~2bIck}OwkLALQ*bp+lwCmc4yI=>^C zB|CY^7{Vh>HCGu7^2znx=*c=cQ_iG&>*V+kGU@y}*}guT4v54Ud0uj7N?DhlnT(JZ zwNCa*$)yih$zIM7dUKs@-Qb`%)}=>nK&Bt)H#%wPDmh|P2t8XXCvS4luWRMZ`KqrYLn=jqv`pnA%3)GyKMcq zh@Ku!w|?SPineW&ZKuNM&I&o^R0QTpY+WlkeD17x=}#gE{ZNK8M;ZU|RA<62Iq7tW zv`#*II*XdFdt#hJ3lXK56Nard)u`Ym1dIP0LV6Xfu-;ZiGk z|5>JEE7HTVBPHn_dH=ai)awJe;9Mbqthg!z4tATV{t4Q~ya^}@YQAW@;cNsn<4fTts?7H-i+j7PZ*?v9EUBF*U(t~cG zU53c--)utOsLM^Y9P2GdMeh;~vOu1Hi>2YRZ*C3x6;2RCc3QJUj>!$9-&V+(xi1)h zE8%UO|0SMcFmx^6-%^0 zfrsqzT@Y1XDcima7oF02tD$`8yV^dLOZdTckN>5q-oiTJ`!pK8O3wd2jJ|kJw%re* z+AdC7YPOK4OOC&9qunmqbw5wgIAMof@5wn28m12^__Y*WiIyFOEzRQ#GC0un5V5u#W+b0D=!N*AuWBmo-bXYv0q!ZmW~} zarCCaN6nVirL!;jOBH#SDD@Us^N^}m*n?7isi!)C`_e(~>LJaRrtqi8^Z7u{>uxBo zN^lvx3>;ownpthMUdA^_7u=H#o+|vsP+F}~wLLn)3RMYTnrNt`6I5n1DpNXDCkW-m zo+$4DKlPNV(wiGN(j?8KuMPaQN%Et18`x4>nkn7pm8Fqge*=4X0=>c2$^x});OuhJ zT(jBG1wBHDmCkU(a?%1Rhxe5O!Tl5tDGU0uybttzq_h+X-uC5@bvi}m^)MSAK}EGz zJgI`@!(W$|JSjDW3%$VjkSA9Fagr|Q9>3!SbY2R3cq8{Kj`IdODTVXAB`Y8CmV#io zYQEBV=?Z`4Exjw9;;$-7-K7NXEx_9x=L0a4fAW=T@dF>JFAu9CRX3UqQ@D2}sV29q zBvr07rn#`G!JuGLDY}>0uu{wI<|BphjLKl0Qc1E(?Rlj|8YE5Sm6fDW$nX?J*5o4< zr8<@3ipdadXEqGcWSA<0v$FQ@oxW0-)J>ONS+Ys(GzkMNQi#+H!DkFyrPP9U5ex3eo|kx2m47e|8#In+sF}Bv1QY09((yq!xog+JBz>G zS^A@3ZGJiE{g+Wk7)iLd*)UekA4lc&?o(CoJ`RIWSpgIGujzJHY{u$Ic#SLO4iDteEzsS7tje@x#f z69fxH%>wZcv!SQJ(aC)EZrBLjP%A(#Q9w1Mn+;tBxrhgPr)*~^4O|r9QGz}Q>1IPm zK@R$=dLM0LKm`}54E$lqUrU-Q+5 z$VWU81-Ozpxw>Sn^;HQ%UsX`;7lO*J=3LOx+V{B-aKX$H1=mpNtGuA^Q9_;wxn{Ng zTDgr%@C%EZRnOA$KPkblDK0!s%{Lk@L-7D8{RsWr`7~-;tF=vlq_Vr%h@%hcyjGh!fHu*Bz?{&>PdCES6#`UmaXQT zFo<}c=hu~5Q|>~}s4E4Lf`aNIIi7#73sKn%IV1?l3s-YQ5R#*KR*-a#D(qr=J;_F; zcX5<}#$D`XMVOf_3g|?eS94K4P`6{>`qFrMxRc}SgX-Iz?5Zz?(UnJReI`|Bp9WGe zRsD+X4WtN~vYMR@By6&*;lc(W?y-=Af>E-&s*ibGFbwe}>{0~L4|#tu)V=_9M*+R7 zJPVe(6Ww3HVU3G%t>UGPr7ZHFtAyDkha~y(`X*An7ee3QTTLW|uElavQz?XIE@0Ox z`d5laGs!MVSsdED7~9Xhv^m(~VikJ}1XNUeY0F~SJNax&WVeV_;#i-_XGhzYZ9!$fG1LU1}pNmS9l}#NbZ~AdQTRMWr-ID8+fgPm^ z5}lmSk@jNg6L^;$vI=J_k)1?Y@$;3K&O-S?^V!t}gl@-q&X2mFmPxafv^QV`>NA52 zx=Km(Y#zsVD@M1APjmxa%h^gyC`KGQHjmT7isg^w2VrQ*59hJ9JCfbL)1QZTm!8w2 zc^uILb)P$rlY2;MbS0JTJz=8@sT?KXnN)W6l%nWpDtq-p={tb;Li(0e&JmDPm7-o! zCeibCoY@DS634gt6zf4VIn;q3v}P9PIZ*n-M2_kw#qhkon2Kzg#mRj!K8?{c-&Qk| zC~6iL^@E*T&EkyyV5*CKfc_}E^DK^f3uU^ikk3coLe1Q*{WY842CCbSuIIA-L!-Yk z?QLnSL&t=D8 z6zh%=!MuJj%88!KIfJofphpt&%jKXUQa&AZDqce+mn6mViFY8)?GT@^?=b0I`a70w z9k5&B4g_%KVbTHVB+nWSVt3;&=F7uTbVDacM4;%pPELwIr15pKb0A#)F*hE8j&E{u z@(9U6|H)_DNU08&87bAmB&P95bk$Z5wX}^R5sdzLk26L}ku)iqt)n2X#u_y^k@qc* z6u92&snjiY3EbW7i}?3Z2nsFNFqTkNl#ZjN)e`miT-_KyoXGiOP~TtYaL!n?5(0_W zN5(2#ejMDpL9~)H4sJz-o7rQ66z0?M`{&QI)~YdDU8wxDgd--vU0d<{6QmmS*AjM3 zKuy}erxbx)qHc58RfU3H7#$&D5{%wz4rfl%3M=Y~t>tHvq!CnWh7vIuZA-t;=FBNt zt{T3#D9@%ySrQ#ZdK9#A&E~==@pcU7#DdW6 zEKj-oTvTJlG$nhkuwBo|>@^Sl<1-LmPIeA$>$n}FGA9J@gT5=`-zAb3V#*|7vsrr!n*Sqc?;ZBQbY zN`)kS%)=8g@%?royAomka`8%jqGUHhcO_^QN~PJ;*^wj#y|!+?fIayCwr<|Lo}Ecj z0kxj5B&~-3`8+PM9R7Ve=d6Jzy0_3u=I@W@__df8{lib4n^$t~TEx}iD>;50qD7sl zoVgC>m^oF6k);F^?VY9+F$NP+rSOfCQ=+e{79x&alH;}PWZu6E9)`+V6)A{^ zEi`(|Q*u44?4E>=A=~N~iT)qEJy3;aL#Vv+cGcHp9C)RO$|W@zQt?mIMk<@p=sDoOv{z)p<$4_OC3r^82;Dha9{KW;Y z(Q&=z!HF8K^Tqiu)bLSF{||X{O30h0;&ozu+yW<*5I9m7=x5|94NZL(Y&)h_WV%l+ zT_aDGV0x9BDn8vWP=&GEHRHwB)HSzgFt(;%kVS*B8k-?btP}93XbobBOV%t9ogAp9 zXN^*UVL>TWOz>oF*Ahy>BeoSie=e4f^^hbs((9wqW4CFhi?fVW31hcuri-%-)^W{r zah85Mu9+^*(nH6!n#Wlt=(uW`1<-Vwo}k$-&N4^GHQUBn7V3Cs)iQCGL>=#;<7;%h zpN^;K_+TARRq^QLJsM27puw1nfB~Xrn#rRrpQ{<-qa6Oja;=D?4@je=9(?P7)T(N# z+EBtC5AQyIUJ83>fuM?;`vccLD0OOkUd_(xj5Pc;S*QYoB6jTX7uV~Fnjh!?Sc7Hm zXmF^3HyxB}NS^%ZL1_d)wL?-ppL=R%>`sGPh1lIso+$$kNeL3xXkQ(c&SBqgN4nH$ zl&1K2sDf5BjF_$#Wf&-Vs{e>9qlqa69YjinFfBiBsHRKoHcgkTP%S++RnrL@Mp`G^ z^_aUJL6`hii8~^d!tB0?fA%o@z4j5~Ht#>G#mSJy7JvjOzC=I@{@@LK?nBD z02hh=le?yH z*tudF^x>uFFsok^$%W@6tIwPgCC*Kf9VQF?wwmqdB}=%|Jo<&HPBwS?+&mwD+8xRwPf-2j!_<1&?JH>9l+eL0Dpw~BGU z$9HdGGVDE$ow-uJiJm`JHL=Jq*ltn zFVVEp$IAMzv9nDFVz{V|xw_IkPiiO8wlPZ7H}Gb4vu%mqZ`yrie!E0O-Gp6-3|<$j@{|1MsW z|3stL_QyoVH}RZt1(n}@i=zgaLMZJNGnj$Y<;|7`VF~-~5bY2IJ`7U#mnr z*5W6FO#?(DI);D<%P;2;lZ~cN;G7{?twM;^ld4FcVQq^84HPzkgWl27MQc*Q8IF9% zlu7eOD?!6dQIaY80eaQoo5ngX%1=GRxx-Bv)MPZ)ve57Pc+R zSjDaprWxEXUusD!ZgN6CwzSUOFhQl9XD*VP8F0zw_8l2(GhseLRl5Ic0 z2~m#(0c*|XydThQ`;KR?f4y`k`s1|X_!oi`)fvx`KNiclbehwCl(K2aC?)DAv6%WY zk~4lTM)2NgF8mo2_>lYTdQ>cZ%xNxo1WhZib%s&xG}|7-;p(5_sG9gnap^HWqPX`Oj413e_5=2> z;Hdwg+RsmN-hZ${a4%QCJjEfuVDS~dg7aF?o80_YsTPIYU`I;|Uqj6&=vZb2U`M9uYeDup7m5QU98 z$w_~JsqY$fi<9b{;`~1_^S*#n9Z%2(XO?s36Ii7ANzSZ?-HPBpwQW-SBCI1%DiMF8 zYtkH?2oXD;GnQ*RpHr4|L;;pt_p;d49x?jxQ)n;>B|L@KZ9mC{PcfYJTdr+@_FB#f zf5R(QWQh$>xb)vr9a^L!nRIk4=RJdD_g=@alN?k8T;J=Uw@)fjz$KbLmYvU0KesXK z!nn^-zbUKNCs8=noVh-qY~&craG#g%TbRY+5`|Ewu}Tv9heVdKoJ++BGPBrXq-^RP zq2w7ULNayx_WASVnb6SP7Spph-b@)}h~N+ph}toRqdba9=$)mwJRsWi=pH&(VoWhs z|11vi1nY;xxj;a)On3C%&YcmXuXuJ z0f5bxvLk?^sPA8hPB<8M74)<)DENV z#iIRm7H8I?h!?)_$){}FX-uZvA)HeieA!dDV5c$ig;TEkl%sYTBj`5rcNwwGGDO>8 zT|I?eb)m@KA#4wV1*Q+d@)uEd)D*VXL;AcS?5YRF+?J^IDHrT9hP-GDzfZ-kX~+wc zdwt4D9~!Iiq59N<`rhRH`iN!qyK_(j)cV_7oZNsCC}#;oLNJBV zy04X-V9LdToG&=75!wOn7uA>wr6qXrrX}L{NN_4>t$Vy<;LW>fzJfqd$e17UZH4 z?}_jjMO7|}$oO)oT=6kyw4@kn^`3&Dm?qI*AB%Vx!sS|%=L-jK4=JrFlH!MRa%(h^ zyKe=3%(<;0{f%QH9)|GoHegD?j_X7WRAxwO1BcqXNDGQP7jZ^gn5xn-E^3R)xIHoV z7>Bo`T$;5=i-+$n(&FL7MOr+(tB80QMjLgxTaU3<2l!8)MOrBAzKES2P^D!G7jyt! zyb9~^(2g+5EQRAcqHBIQjO})`mpdf(JH`nDcZbC8$2dpeE`5}>A5$!yPzb#-jFaBL z@b5P0j|yjWL6tG=s$nM|v${9HSZNp+yaCg=BiyG7+q%M0Ov9AOuH?Yz`VMDwD@O31 z!iC-7C>6q$%uobLF}t*O*9hznF-|BP(H(C6*+91RfS~d3u%kyY{tAkc)I&suLw7j0 zXR(aD47T(FmfgpFr)C_j^ zf$g3S;0OlJNh>|c+#K#RowB2a8({wq? zMd8rt>f1`jAYp~o4lWvuUf*d5Ck=r}H{ru0nAU+X=50y#n zsPbemXNz<KV75lg@e^OU5KWHr*4{k8b`IYwy_A0PC8H9js;UX73Q(zW=Q(qD^@iDO@l zj|0-R__zW2B0i4luf@myW3~7=rN0&*TlClBW9_k8e6;u1;-lLV_YZ6F(cKtd9)2}G zUOlYE$8D3S1@<6rO`;L%m^m3?<&K@x1YCQWEmHvTtu0{+T;;F%oHqr1{eC~iI+Y4= zM)|Vh^{!~p^H(@*8hu~3?gY#PvG}iQ$^Qe=Win=^;ux&oIC{y>Ox{VcE^Ktt3Usim*fxf=-O1*qao;Xan&bCDq z^jZsKy~_7m{>1D5TMPYb3P-(%4%$Ym)O3g1I=?MOJw*~~)E`M`oe6VIE%7mi>ibkL z(L~qYl8Y{?_or}N_qE*R1K7Eg{_*#aIa4?<4(Gyy2e2gp(XZ<&_2llKeK@KirYRHG zvV9qb$-@WO)zDZ=?pM1$r!J!oKJ`m1gM;xkd>K_Aa!1`2%c`yI*OkH+?UU!vpU1Vk zr>2VqRUon&w{ocjSzTY!)yF^M+Ufjt^>onR5&T2%@t8!aSJ7MD_M2Ey+q0bPUzs;0 zQjJkhw7s}4;tUL=_-kA6)4Pc6VS^#s-&1AtHEa8>#kIQ)>C=0PvPJ2dmRVg?)F3vV z8;ErOJ6vr!)o8m%O&9ylHSw>;Z?9Bwu^+7nC4+VLVwLJC*xTLV=;c(eX6F*hcT@4W zp(iys_auJ`vYt&fw3nX-%LJ-0+P}U|)=Y)7v8CEZNT0h$tNiYh8r-Jy`yb?nE1>jb zRmr%yT6R_|6*ZKCWwB}zmQ~rZ#ECEbiJjO$z_?y_c<~CVw_v1N+C*>N;$_C_S{zf^ zAXdd=cc0Rrw>V}5_A)(mTsx2ySEiqePxr2&=0}$qtm2K|dRwEPo2sc%OudsrJ%6`; z;s_l6gt0pV#s%Nut}CJ6LRHShZn}QGmZ*5#+?4;WUuErNR$Q+MDqU=4?W9*+uW2ei zy>cf}iXpn!92FOvsq6c>b*GmJu+xkT^s}N zZp}_+^~9vM;a2jt;oY&gZD^6_-Sn*TDR$w6$fj_v*blF&8pQ57&-;?-5Z$@J5vwuU zC-!3JY6|aL1-tsiuQ=|=c>dgMxUA|C=RZ=b#@q>-kZq|tJgBAnYY-m}_4JcGd8x6g zsMrE`#oo+%{ycWKRxuE&g2lnVVt)$*Y93e9M{W03;h5lGRDlz>S61=K!G&4@+pntl z^c|imj1K9piizD}Q1Q5sPCEW%fu>=I=HL@|XwhbJ$bOYz)Q-+7!V|Og*p$pJlICe)r9Uq|!)FME1 z$ar1gLR}!*1Ah~DXgzsy$P^WyzC-Jg(ILxJJa)%4UETs6pP=KjReaQf9jUs&L^WaJ z4z15k4#8z2{Kf7_)EQXE*Xa0G6`#IC>toR&yY+m{7otM~b$qaHVLug*3ldv}=mIgG zDqP_Hz!|&kCymfjQ_a9fEgcWi@o6d^ZMmr9Yjpf`9oPC)v_<G-_0Nb4@U3d0UeIctQ0t7*mLwh5ygJVEu8ybZ1xM+)=IwD7Eh@!sJErG5^nA_h z<19^7JUYRqLbD+jmc)RP6{6yXtSTCe4(7ksQLxwX-s0qgHiL|t%k5+eu5lD;I3uF| zW$B-WV{2=s^flV}j7-xh@dC&D8^d_s2Q+xWOgK*Qj%!dmuDDTv@fgEfX~4#GnpE6(XADz72yXBPA|Tqip#rjDPZ_C)D(ZQfttUF{Of-y!6NN&qg;>S)4Fqd zGDbE{rGffkXVKO|U}JAF>Vv(X3Jik%z=5eX1Xey})1!cCZ>br@^M9N$ri@6;`n+4i zfN4Ws%m1>&$45otv`!sT0;Y}B@)r~<;H{_s+ALDbwLJEDz_jriL9zVcU*4D`67QFJ zcXPlr-Fu4VPYZ55ROHV*T7GZ9v{~YxuT)^PeaB>x_SsEaWWcm};-7{E#cSX{SXKp` zpZIO{fN6_Wg5vpKw@%L$iSpikPXeZ`crCwor;%+%;;?MzxqxZfxwqo{hwGO)A@c7p z`eaqWv=o)}6%FGLWP6F!o1x7c1x(W-L~#L~e>*-$Q)BX4cpF0=fMrYRh#tgH2p3h~3>r&uOZ&eZsvrgKd_Y z*+b9l%s&aXn}W@y<_y+z`sr*t`Ke%gsAf*kGe`2K&0yQS+f-nRw3r_{_uJ#!)V-U8m1P88|D;q=(uDSFNtoox=k;{@ARYUUn2GnJnTw);*B zl16jctyHs0U$oPU0ea6#o%sC4>`TIov_b~A3X!hDhg(4<-Y$s>MU&f(>jnZ0N zOg`fI=yt02+WpoAqq$%^_Gq*Fam)^E^~{^a_MMa`ZQy`iG@JV44DK$9@mW*izVk;> zY)!-Z?95EgOC!7FQUZ2UDZ+R9x*y^@pfq0TxR+{RqkJ7l?8EL=EuOWHno#I^jz0`^ zDxcU#OketN_($0BC_R&1ACXg9!hQBr6P#flr**vkFs-IW z6@-xL{6;!$bZ@`olG5+#kR*8tN!9tiBh;KcRdGT5^${8@2t$sdf8@J3{3tfQfF~Wr zLiKAGrya#cmb>Eh_|Z`sftvz-GN>BrbNa_8<+o_!2kzjoKZ^EkE~$8KC3neE3Zk6H|8>j`XA50p9i1a$j-7-yWoTK~sz zj>yEu^ziPSoe5nB_Q6RE?9P4_&aNz^gWhryt#WLj5_OV_%+zH7M`dF>mia_B)u3wl zmXJ+R(j4w{4vpA0jPuXId#7^w^VFRhhH?0L>>WNF%w8AJrVieJftJy~LpkJgvikHZ zu~7eFDo1_}rS&5awGxZviz5&v>4U~{HssI26E9wvAsEvlP(*Z*=gbL(g> z%7vfQkU8x(tW&QWd!^ziuIUc>NewyR4)uLa`Sel653&BcyAIOi+X;B5Vx9Ixg7-t&LCczu7AoOe2sJKUwt z!s79FVeu(lIrA@Cw$cuK56y$ywfum+zQNZKCr|x`ZsVFu=sg-w%crvI z9_7=ww>kM+gzS~dt#4^IK9crO9N(imQ|}Ly%==>Z{?-?q_lO$tTlolcIaAnPK>nPX zPc7-^PdPUqy!+VqA-X=Ioa-T)<-u;weh5puzvFzjL$UloNz!YhO&Y#PY^O-B{v&zQ zzq>28AEEARfvnXCj`|tm{P30ZFY;GT{!G;+`tB>C6+UTB778WdPVMCa1WC6Jf2MKJ zzl-TmxSeDEjn*wWUH)OPrb4;LP@!3OwmwG4oA3cAJch-3@q@>Rv@w%8>_6DsJ;G=I zL)|4mrTi~6h$#L8CGt1a-gF$t8F|m|G>q~lu}2|7;|U&ENUQyyuhUi$>ZE6Q`qCcPfn>Ith@MjS4a3W_u!{?$LHWvZi7s#&XRErafXzXj&eHP9|MW{hoD91df zGrXacu_pgzG?tS#>sH$x| zJN)t0|A$p#U5Wc5gV<8d=)f7tan+2osmcM)t7goh!1dZ~z>|Eoy0Hn>ThESQqXpkS z%Lf=2&>vkmDFA!rO);4eSM|0kmjjH0aC8#s-H@(x)08co)6IxjTEn=Jp0;Oepb@dM z3x@~3B$C3E^?}B|c$ue*ItG+EkKHjpEK=Pn{HD~cEreI?!tr&$=ho#EpQvMOO=Y@p zR99m?Nmu2t(yFd;1W~DWoLmp3xup!_2lXIj8+WX4TqdpIvjR-yJ`IfTx@SFP-ORZS zU>ki>M82DGr~tTLB9+_Bk-?BTuroV@p^1C8^o;KY8&^~N&e|6QB1j%Wsbp?^*%V-;x=yPCnb z>b%Jz&5f@QW*-e_XLF;S9BnzTxiOPkbz*0WV%5CMcU!<(6}I500>~DP;iQ&EhtIhW zU%gi~t2Y<4G}=sANaue2r0TS!H``ko!zjCllF&+csoQX|{44}bc-qb(t&0^jiD$Jo zjxZg-vY!t&G&WT{+Zgc-&0;&-+P);Ch8sDmEu4Rfo%2PyyO}C)-17R37*&q>TK!A5uJ-Ahw_%r#@*6F4($T} z7|M;?8v~T@x)^a5u6;-0;x8&Feb4*5LLIjnU+}Z8#dN>Qq1}w#sY*w!FS@BvrEbv5 z(V88xrXc<()Yz0Bb7Y5;y%lWjW3*7&6eX&c(M!Uezxln5 z-%vmYj(8KU+jl)Dy@{ak8Si@2*w?d62dpV~+$oYTeHKVhG+x|LY1Iea(QU{byuT0P z$M@}pXNf+mUO8T=Om(2EP}AO=+s~L!)7x`qf7I8lKvm|V{%Gi-?K$SHmjx463z=^j zv#CvcPIw#i?n3YJ*|&{Z6xB*e7+}mJI^K>W2O+FafcK4joWJCK*E{1ly^TF~scR-zTF3c<$oxDe#rbZ8&WT z==HO>xHIu=it!w-cb}aKkNkDLcGo?beWQ#cq@6q~%GimLv^JL(@Z~6Uo(99%@h;{L zaeU%kCKzi-qD?}UL5(HdIB6Nw zIMk9emx0dRRzs9$%LLuhmTX=AGMyT);fUoJ%s;iUbp<*P4w2=qfE@2`Y+DIA9b0M- z7PwvDfwE<#5$7T+wbUL;aHoIDk5<9GdfM3aKE&Y6S!5E#II)aOf|!dfxF89|x}79i zX}ns9+17&XYl@}!7M!pSbh_0~%ytb9Qb-zV2)iW^o(QkYNzN=_Q*~pbXq(#I>M`%{g;3G%eGd3pX3nXhb+W zw_v6m8qQHpSfCSd0o#UijuSKQhT&}A3N@+%--`4~ShfgQK3uV-Virct8fxdwYTC8) zW*r*7dfx1-H80Pb1xr=9@lGStzk{{IX5Vyt<**r6%TsqD%sfW6IBRw+SUYRBr=xb( z>`btB)@((vcGhfeNA0ZH`rud2n&IaDqdl;JyA_(P(vF(xrlxwhsPQ3uIGi7Rh_KNZ zR~`1EJL)}(JXdkTUQ`kHI|{BsgDvbO$!+6STb zk|rE<2#Y8^98ler>=byVWHm;SWhGkUIYUfHwH##ZX&Ot}8Nb+dH zmZOmG?p!V&coY-8_6-zkhA~a@nY7{6DX(99&Q;)>qqzJrV+{&w&$eR-TjSd(@yCSx z-&-qb9~+A#YH8Dghgr@%0qTX)F<`Lt~CS^O8Wiuk1QwY=Se?h$){T z7+meZwzDYyStE`(3p#g*+r?YXqIn7$DY<7wh`iW{3$lylM|0zIFt4GWQg{wlkpAR> z7hXn43QFYU3+T8uX6Fz^*PKHG6*J`0H{vy=CLNoUw)TrNxJuZRH?Il;0 z&`TmF6*c7W%f-^uc>QI>q?SP(o&zz>`mxs)us7_-_A6+`n*BKG3f5i~k$x5FW&0`i zt45bZtyXctH4uE+n(f!o)B85mt`oT%?+-421A!@_E@$6BFL5W|;((j5h80@egcj~( z468TcJ1bjr#!XbxoWKP)(UaGB!L9^~JFXtFkda)A! zi!r1uZK}u_&(JQtdU0406uDTJ3yNTI_rL+Sdye*@KqddVuyA5s_K-|3@~P<}#!Z(D z%BrChNhT14*43^)x&=Jq;YL#y#nn)(CR0AH;`p+4n-{=2WlR~Rs#wJlgAcUF6-qT@S6NdM)v~g^9B$FM6~Q{UoM|t3X)n(zZ|X}sE^~Hylbt>*%N}01LpPsid70j&sn~7)tU6N#Q#;D<#r6s) z^;!VOR4_Rz|6F3{dOyxc@zphwn0Bi#z`jN?Xxsld@4nq0Pw|;Dr6uaTdpe(}XsUs; zzTz!dI}Hd>tUjhBiQe1Du1cmnF~LcyY$~8Wn>gOrVR}{D0Uf44muOZ zId$N4pQx}Fx2bE|Oa+0QTNgy`SHISCKoBaf58Z9vmByu${g;T4h>=6v9qXV_OW$tBAnRy%&4DWqAP;mvrR1_SjJy7Ew zs;+aZM(C&`{FS0ca2^`Eg)_xVG{|?g#FXZJn@Pb}ISy+ADIeG1_$E-o%{)pu(Zp0w zolfL8g%*w`Y;OiF;%abIGtjvMSM4~()l3AGzBM?f`O6FmBSs4Zl%-WUrv(BJoFSnl z33)-EW}eR-pCtP;`1WW!5i0ov^ycUXGPm)`(m zQWZ|<3Pqa*D4AV_`9po!D-;F&UY(tx5ag!c!goVK->3>FhnceJM0MQBLAKig$MKf# zCR~83&bcDl%@wZr_CT+u*y_hLNAxl|DZMin^@5%EcV=5}z}-mi zjefkLGw1Y%7R!LYiS$LCvGD~M*O@clgkw+d%wBzfPwvci0mpS#qWYL{Ny#1O2l9iy zrk8VH2M_Fremlumo1_n|U+hJ)S-zasA2Fn(p4nK-Bmnc9|F1`E)CBC3fyTsw6P~pH!;>S_A@@UgN)8{y6E-x%Q zMCm`qlrGWZi;BlMQv$9IT~v}HO%W2^xyS|MaSs2^Ma64^2^Vl4+Dz#{Fm!me*Sf~tUx)pb^IcrpwHCt!#e#g9p7-B<5wYnm5wje`KRmnI6%QaSjXSg z`8(-&3!Ohm$NjH!%o@;_*Kz4O+t->RrQi5bB4YUu*VyZ4bd?*|*tHH#^7%C``Wap0 z_%$U`hT1gs8t1Kt|4q2Y9?7O8Q#kJVaKCk?VbtrIQkZOtGSb&qIdUUNZeQi3jUYLT z8#Efp$5%OilPS}*?M2G^tL)rtiZms@NSO!jEl7FyMar0~Y;z(d{6$Kyt6b=WHtnw} zQCm$RM!I>0t$R`Al`EXH9YvnN-4?CLLsvL+2a4SABIW%noVOF=7QRTC3GV$!8UG^X zohuxbh63Ka!VxZ0Z>8C8(@#VXa@10!dwhAjsR|FqBqhp+OcWb!!2 zQJ2hC9{Yo-4fVUMIDZhid!W|85Emb2v)7N9AAOU}jvo;{u4Hr0k8qk(*=+v_Fg;uA zqPsySoNHaS=3L8>E}Sbao1-3?GO1@a+X_(c#wlw5KVD$EXQWThvhx=da_KA={DOYG z@2q0|)f8`}nJL=OP4vPq+$^@!k16WUO`P1I{@g?ry!j@6ZsJe;?9Sp4I)H_;__>L9 z@k=&KY}6dTFauC|qxiWA9uR;R=e~Y|Gp-+0$BSK!mbRf0De6y7P}3X^7e6A=Jw^SE z32rG!Kl;<;hj--EUzxa`qW#Lm)(z^fOc*z4zcP^zEfO$JZP0#YqU=WXS0={ct!eQq z6ZQ@2uS}444u^=Jlh~Z1{j9{>sP{69viYgW(@gzxj;5J0G!9DOEb7xgVX*?K2XnZv ztl32$;026wW-EQP5mR|o?dNi4Z#uM*i^`ePN(j>qKI+0U%WJ|4%0tzwd0gZR*KFwp z75iP`NH23i31;oIyv`g|L1T7S0CQk(&KCHdJWi@&4(32_a~*n|!(ra$TuMb)s3?q( z$B`AyPSX#k(A7KpnJd#l}&XY$pVe9a+xg*|H@DnD2a zIy(KJqf|mio5;oq)T-tW=supI@Ha=&ZM>f0kIG*^$r=7=zR&Ttg+JLlB%nUl$N zl5?v8-*u9$)y?7MHsZQc)(p|8Snl?dsj?{w`BftmX*n0-_pl8obG&;z1|bRoh%!X&Y!ZO7t*Gh)Bbyh(1|QvB+fyGdkJ8Pmv9;}N*60s6szGBxEM;J1;2p>!Y?m%%W_F(+pS z!&H9T*rOrZ;N8t^7cgZN#|YS93qI2Up4-Ox0=|*T)<$U4iksOX;PovWFJPPZ*(G4@ z?VKmzR=joF7;y0>whMT4GhQtKe0M851uWRaIcokEE)uZEX13X2++j`*w*eozjS~d? z&o<5wa0|*8aMpIVGy$BQiWLmty;P17@a!f|6VSMYa|QfyD|MWI`{?L27Uq0;aOk-yKH4k2qGg!R+k@Kw|Z-HAZ=rHGJfas zOB;yE_>;>V+1i{y6;CJyt<7GTabM-4Hi$-nczvfWoVMRhP8RSnrfhBDy#21RwH+X) zkP!ktzR6Aj58{2Gc5vF%Yiwx`cokDf0aNiJl7O8t0~gS6lM7XN4XZ}rO|NsLfFp0< z0SLf_*Em)L+2ISFzd#47|>n0xrD4`2zO4p?GzNz3Jg6ioK_~ z&_pS@N{GW;=u4dss;|!ZEWGuqkEY(@@UfV@_~C8Zv2e}5aTFs5@!{AlwvRJs`_IXJ zNgvm)>0{Bc#qY6|J;aVf<|%Y z%PX8W0sW}7!bJj_6}C>qkoIeaHi5p7q1YxNou(dS#}p{iCYK|pz_*SaWaktp_#adR zzcog8Zn4Ky)Kxx+r77xu{UAq7HHZ06E};oxkovo$c#=C4`Ls}%iwat!!1vWb4vRt! z(n|38=zLG`3^wwGC5xiW)-v?d5ycv7j#uY>&bgQ#9K-_|`6g_U$C>xw(W)a##ym6T z-k28V&WGaTkFZxf$llP%cwW5uiO7su0I8NE3}IH~{sObNHj`Y4)ckZ+A`e@HndIQ5 ziuFD4`yVXU6k^I4FMzeeyFSKl-OwkKeo(l%Y2sP{_OCh85+727hT z(^rQT=W=r%KAGQ9;#Zo(jnwk6m~L8>pOf&rFZBO9yAyDysT(W;V2M5 zAtHs~072y#Krw=1tcu5p#)+o=6k{E}&{~q-S{t!yY=sr<_t-dL(0&?JNEk}vPz(+j z6(P*2RT{Notct;b-v8P|vfuX(Pw(B&ql@4Bu3^vF*(cd?<3Sh0F_%ZAovuC(e^m~B zz}eXqs2<&QD**{yQ7 z$`@I_)67@4$^na=o$}?k`ndbK&7i2tZUnnLY^M8}`PvpaA9+V}i@bBObHC$^6@`UM zoVWw$Sy5OeaiQaIuE1ZdvBQWJa>i2ULymY=?p=zFm9EN(4?6cca@E4n-#a^D=j9gV#n0hO zJt*&4DJMRH0nfm;Q024F%R5zEES9StLI0&HKHQ9J+*hBIn;u1e-3qy1l~b@!J%;ke zXXOl4Zhc4m6tpx_o{NiN;%+hlyflOk7GV6RXi@mIiq*w0jIq2 zFy|1t`Eh61@!kqKY8h&s|9oNgGG}KWeA}fk?@4EOAIGWq+RM|<_39Kd?-{HR>lBjQ zR@n56df8jGQtr+>=X6E3wRZ^nxum*M4xNW}AKYe~OkQ5uu4g})ys@&dX$9&z%6QD= zb65k_ZG~~qtM@zEZ4xKGQ)Oh8y7u2DZ(D^^jbl||XaU!=j!#w@=f2?fcE9TNIkH`@ zUyT)7tIB<=@pi(oN^V%=+~;U)ldINZQJYn{doA*A^u7-EVgA-(SgSu5>(95nuxy=k zqSNutQ*!qUIH{GMGTxLw@S-!|$ZVIJUc_$j%2R~_FRAl~L@jj+{M}Q9r(bq<j*U#~Y@85(O7+sK^Z=y`@kQ3j; zndZ0x{?4j)1hbwOAI5(Zb8c%lv4TAQST(=mT+%hV&|a@-~p#4wfntcv93m zC_lmjpH%r49;T(r3ySyyEXpNCxlfgI@mjK3cF335mTvL#@sWOfEQRO#yqLnJ&FUl>d>{yL2;h=o6C_A^H z457U$7vVWwsyrXn9pz-Z2bZ&PZ#G~hPvU3;O-JX;4cj4XPMY+P3UDzm& z{y90IhK|tToSJj~7{?mhR>$0*q?Q6N`N5s-xPFxFEbOZ}XZLpe`iVmK`|5_td28go zAE4{~c(PlE)+OD0@!q$&MlRcnoucfbyr3dqnEkQyU~k$n zmJ1E%e##prRWmgFKXrVGnb&8mu>MoLfp$dq6y|;AoYBkCy;eT`Pn@8Bv{sJ#9LGs{ zr@ZZR^_~`=zWp4lJUdGc_yU_^%33+^3*>KITUhmly0o};t=#e@F4~$q<(&OEajBa@ zUt!ar!EIlmfoGT8^c6b7ZJlvVya5U5o~Ef+=h!THu!(~qJF776fOA71$FX-8_J8Lb zhsU4ZEl2&!xxujrj{*D_4vTx%F4i>s82DO!D=n^Qw>$1zD`)r8);oH3$pH>+p~~Is z&~9_!353{^Bc!jlw$8B_m5$aXIvzl)K_jQOTXiyD4PZ3h z=lF7s9N^OCJ04ss7rL~$$QO3QgII@Mh3wJVW_*+fdru$iJ?SCZ>1b2fG(;QVbQE{V z-6POAxu?)QQtNg&vbzckkJBFNr6NN|Yn}L*p}sa|%R79U+gwGXsRHx;!YDdM6T)|^Kr(t_+z)eC` zZ_W#}p3khe?1jR(>Dn@f92>Mw748|@$#UIPi%HOt*=d}08Z)$S9jRS%-`UuPtJW6g zhBOTy<=7?XoudcTYf7j5$2nS41^3Rh1+SlF1m~S=3;yF=t*&ZrInNfnVzv>Saeg~k zc>R3M>(Gb3z=+QMK6bMrj;af>no-WZ5W6ADeHUu;P!{G~gvD|MUd9vhv{kBHbqOl0 zdl{cT$IcCFmtxlm?~yYu#rh5GDa^lA`)pF-_WQMU_$5F!$-rWKw)=s_+So(Y8-=T{ zy7{^bZ@l3;Sy_x(87K<-7Hji*6?!C^7w%uGjn)dg|Datnz7TvO1Y2cZ^Qyv z`Nd}Y#kT$>+8%DU5A4zBx4*SR2ln(49{KS5+7V~6UEOcqEUUa{EJ?#GtzF-W*Ufmm z)zjd;MhnmTMk$a{Q*4j1F6w_XT$TE|a7K}L$*Ehl!~4f~8>x1vpUVu5!grXqVa-f> zuze`uc@eEcY0`suV7%6uu;PAknJw|2jYw=Lm1BwGd{9t;oOEUweG<2h5TE7=0YJACm=G9oyFQ?+swp z#(s(Rcz52K^fh7||NnCdTK$PnF@SXvQqg~BjU@hW+c1Hf;G^38i^t((ZQck^vROQ; ziBoJo1)gB@JXpPIThnhJ)e_8&9iK!nyBpnm+*^W2E%|Ukuwf!7Z?TpIO3OOdw!i zr8{B!4D?#2iSOA47zZ0qh%$m#!lP~ZJ7D_^Jj&WvVEZOYIG>=~WCA?Z*5OZJ`!;+O zKFyZj4cj;2kX-wfOI5oVo@T2r;Tdfw#4ZHv+kD`1O?0;_i1XpIY<>Vf-sV5S)=5i+ zzlJB;^8P334BiO07bqb_76JPb?SN<6Iymkry3@^o?VIe!uziMp2irGc5w`Cm@7dd9 ze4+i3HaG#+pRi=k#I>+}fO}y3HhdAb9~FOt?fZb^zct~vEl}o;_L)k3sl{Q{sUHGS(Y@y1f zJakCzvQ|i*k5|=0NtK89YDXM;d8>xib^L$ndW10hIbuco^6;M+-MX9{u>!x)f*17> z$g3A?HC=)KtbdPPArGqjSX+KZFZDZ2#)SO1_gMZCnxD(_SJC{vJpV(QU(fS5()>Q2 zkJJ3nzp?rIInB@J`6rRLE`PCn3sruiZTZi^q7OEgf8q-HH1em~^Yf6iF86|HXMc%4 z@LYR6t1gz~mbdDEIqv9MW4?v)tqUXM$Gxw04zcG~Bkxs>F}atucC6gv#zwJ)(vR^_ zSHP_GR}5&snrg0;n=sIrb*t%shVf4|*_({T zdm-yg<5`B=0?AuLrp2Ov@VLR zc+!k}3Ua_+tX~iAz*_6~8LU5}H6B8`PIe>TzqHnf1lBo4FL@I#g%7E1Fhap~PI-P6 zhaggF@}V@AxPR1ar9#Hx-IX>&-(RhXWAysQ|K_ij`!G=N>?UJbr-|)GcR90+Z8H2W z8rm&$7<$*YuoR0RJD;ate&~)tb1=+l`GnB)h|yv!?B}K()F}4bblJ$P|qIs5O8 zhQ0ye`R7sJe(b&qTlzU20cCoT zX1=Hx!DDd0%Gmu48~xc{ws?ml(7?U~d@;S3b(6tbsH0z&4}GMK8B}@Cm~HC~b>s%Q{UdGYpp>~Z z)#!tJp79cr+=1cgc3pJ@-Pro*GPihBL zqRN~K(7gLp>g;LM;nS(JQ>g2~mi6&Pae6DD#uqj7vAfp6(W5T#Fj=mgOC3CqI)4GR z_&#;GWn+9%oI@+5)fJ;{KyMGV`*P|MbNLFIk3^_*md)`+!wTrb;!*wTlGHW>wX3OJ z*HR~cMBU{651RMSH$2!{rKK3H5ReBXtkWXPGPa(Y!xRog}_Sh&&14HJZ7~oW7rS7+p%;^AL4N zo^uc@I-8~8;3L%HG3p3&o;m(FtzTyjEhG7a$k2c&GuN0K%(*8>ha$9`I`=%aYo*;d z4thvH2=6L;1tF3J>Kb!tHO;%%QKy)FFWU0zIP|`33&7>SP{%h=dtadrF-MqV%qg4o z^FU-H?XdJ3b>nsF^qbU8=D2#_hRHfM{BKjo+cwTajdnn9SlLV)6t_^--L z4`|-gvN68!w*vb3BE;<3OFKw1$No<9o;r2xL+aYcrp@t%`x9Eh|0#8bIo_ao-)Gdx ze^OVzpe}!DIALw0=6+hi)ub*nyT7LS%s15TgVaUl(!cb)eACgYo0@36UB=0>X_ysM`m~45SVXqRt#n?K_gX%IrJJ zp2waLA8Zfc_Q5gKMvJXqdWjfn{TS5x>w1=;I6DMbz<&sa=;)7nxm`(tOY5)YZAB&GALoZxsY^FeyMJPMrga=g%z$Oz&9p(_r_>qd`cGv)SI5vq@@KSOg<0HA^B!g& zbB+7ww0$T+><~G*z|}D<;ZKsdNHf=%-M^sqear#o2KWCU?Gqw-2MLH8v;S8#A7w5x zd+wz5L(CCk>{l@oz)h21(++$o>IQT8E}G9WSD5Q|tNprZ55VLO0d-tgxF4bU>Z8=&$EfqnwI^ua|KBYe$923NP~!{lidF^Pxo4?e z&r^q)^DAlIRiKWvY>Y2*t$;qBsIQ?7f@`UZ%+){9yn8)$^v~4w7fhSu3*YOsLWDWa zoMJ9AXExLR^2}w^tt%`%++SaG>%8WEmpaQ_+d}j1t<*(kPnG7QhULEw?dY4xuw>=?5xQT?E#!BnByPQyni2coVnJZdH-kBQM=W_((_MR zA+Vpi*rawHpbj$ozoz;0H`Fzo^@BD1Ev=CKj=I4dKS=W>-2YaSb)W?t)X6^7O=ru- z$)eW#eBnFV3h3jDI&*Re&F60{n!}ly!vY>CTorO#u;v%EX(6*g_57TIf2@9 z3U!(}HHqef0qX3jx=(1$QQZi%>_3e*$eku<4#HKY=%(=^b9pMwd!|uGnCr}eGim)) zhGL%hO1#Y^Ki_6>0%mp&!HBVQAe2b%r)jFv+HuwUqX1U zAOVqNc3(;JuDR6yA5f>6Ys~J5z5YmCjgkOvfinl?rAOeEDR{NL9p0>8LtVa>+IJmw zoH@r_Vy;jpL~S1J(DNVE{_Cmh%>MZ-ej8woqvtm_m=KN>y;?*Hm#6nF1<_h%^lR`-PFE4)N$sVZmfT6 ziA$_Pg*jED9aihqzE7ybpHgQU)S>TSwf(Ibi2RFIi1#u+s&D0UeW*)L>VQU_RX?w4 z>p$C%I(0L}iiLeBu|9CMYq!7L7=?cL_jm|NqO2K6!ae=CqVk~YY7Qb&)X z&g&0YXs^LQ7tL3XruH7gJS0H_siD+aFSTm~b>LX)B(rBU&DWUI2_LNx9z&fQOI`gQ zwP!qanb|ji=8Gp%C!#0OK=EX1*CguHsnk7FsN-i)*Mro}>BI?9Jc|T`e+IRfO&wzn zT}1O4<~noWVtajjWw%KJxB{AEuYh~y%vrf~2rit$m(gm~%c%obQuiP^{8M`Xw;xN??pLUDZ%{XwOBI^0@1l0$ zTTHF0fpQg3;kTP?VIoQkiM5M2fk_>^_9n z4>32Hqlen-V-Lxa06t|WmyWLn|zl4a= zfXFbHnVZbM5u`)W!<=F+665%-lK{T;K9Y7AVvaLsnJdiVSlXZ8Zgp;s*aPZR$y{P? zFnf=q1B995%vqb&_@ZnJDA$=?qv!xW<`8p~ImMi7TOVJP+5t7bs4hv20Y9G<{suabH=hcz9?D&V|-C%ZZdn0r!y2_jxZ;gv!+{b zYD=s_jaiJL1A3W*%n{}!bJnoD@7RvPcmng%V{xYToqbCx;J92!U3 zJ48lqJFa8ciN5h9E~3mi=K6R!b5zIBUJ z+N?(|KsA{g-QgZCPNKO0b4>R2;f`;Og+2086;7Q@TbJZ=gnN1AHWb6-r_gMcxh#)A z9vjOukyZ;bN14;iMdli_YZC3>Pn{4wG$4}9Ipzv;li3@f1BRGm#5iy>B!Ej=<~p-` zG94hm9AQo|=k1n%IlklYggBLU>0=Hv$Clyf?Q4%B5SVgSSyf|C743fV#>Y z`x(ur+SbPx-~{z1+k6td^;XTbgtiMYCz*@Pb!M-m{e`LV0X7=I2kU5q3bV-2 ze2Cezl;(rXQDQuMCrtwQyU$YjB-V_>^`Km%)=h7 z{1KG~gl`$CAd<`(<~*}_g0}ZC`L-PT< z&&1B`&eIBF1+|a4hdC(+pWNY1uxNwXQ>48H)>4O=BQMf?iaE=isI!20iFOcU&M`Nb zeJ|7YLFNcGjx`z(Rc7~JXoo)LD07lIyn(il5@S#Dyh1DZnPbd3<{Go7O#2Hl$L&_9 z>YP0QSD9TKX@>#kD07Cn%-pnDf2r`jN(TrrN12n%S>_URjaj_b8c!czc-sLizrdG? zTNQLin3K#|<`Q#_S-fubZ;UUzt$;qB2r~CD$C)$CMdm7V)3VPPPk7$2=Ew-dm@9Ji zDR|Emmmi{#o{1gqfsr?9ldPN^z_qV$3k?UDtJ`TlxP!XE?B7ZAG3FxmNy4*>Hi$6$ zYBV3H$p%AJTjebDmi3 zi67Ah-jAuX%<+HFe2Llf3C+iu#XehJjUTcH;5c*eb6W%CV_#4QzN8K_i~Tg8u~|P7 zd%mI-s?6ag&HE2fN12<A3cUTIfS~#92sin&GALa3K-*y;4s=jmf16c=Dpve z&N7Q}G#@tIx;2<*72M-#gAjAlPxJnhsME}4=BDBH=Usd!(+)}#sq4({Ni?5lZZNw7 zw7yq2*1xrrL|BD5v-dRGL7G{dPV<2&)H&vSH}Y!xTQlH2gEsI7sk6-asWk7M#yp)m z&3&duKkp*Wq74FPQ|FjtA(m$joI~?j=Fqu#c%hoCH6YHT4bsfv*(}doWX`-o>*tw^ zuOw)N3ae0Mt})k{8_Z2+QKsX$5-i|m_Av*UL(F039_AQxBF+M7<{Wd0xysyNc5S3f z?4?eK01b#RbCfyBoMO%}=b4Md*#9adfHwlnb>=3s=T*9de&!H!kKJnjkJqN~Ve6L&t@Bq}ZbP-JtY5{m!e!R1#@u9fZ>4i*{c4@nUr;VM3(FFdtIz6q z1~&)qnxVG$3~cHq{)Zi)@7W#0)K7)YJiDX2SC704M78B-V;yJZ#4N z9dubL@&LjPu~T-<#6Ihm$IrxEp@*494>LP{Ae%Eg{3hNMo@0z9eyi^tF z8AYP9i}qY&ZZM18w7#3!%j{121JB8#++nMGiRCe%q8NHc;i3<_&^&ow$gc6 zU)V~j2+IX11||2<)zI^XTyzO`lbGCiNyqp^c!cphCG`Yi{iD5?QTL>%YcEiHcT&5) zqxPRX9{7=J4Xh~$gZ#ZA5d-|56%)a&Q1#)71Q8AwYp&F>Jn&tx?Ec?s{ zI9M(+hs|djSotz@(|k05mCu=v22f6@0n_GJ`>hHw^PBpX!{#^jEr-l+-dm2EU#z#B zHorJ;IqYb!Q8k`hYdN7Waiw1?pgVmSb!0GgxmSCYtAF_%)Dh-DADZ`Qma+cz4mzxW zVYiDq-Iuz-?CVGKr9-I0{i!1ZOsnm${uw%qRtVX48kNahWE{n6m8yTG%+K#Ds~eHiS&pxvMT==E{8To=DZ$osD7c(`x;mqt?Pk2#m;UfFTPVD*a!YO>02 zrs))Bo!_9&K?PxFsPR>@83CTtYo(I!2`3F#=q7!-rB?6J zzbHhWu*oci$PL}hL1n)GXQkXrC;}S>sTrb;Ibm^z=mRd8mXVbQ0Sv;gi6w#!Oy@<5 zpoeR##IlM3^+#V*IPiJ`bs9}#Is7AP$^w_@5UlR9{^v!jE*GAj69c>)@ZR~XY%ebc zXU>VP3Jz#^UbK0~0MX=oXYdmCiZ+NjDHc}z*R`EHDjF-wwehlpPi7TYik1bpSL`5u zTBQ!KY|&ZeU$dK0j-68en*&+Sss;wXq?3l~XFc+{$e_V2QA~c*3H|no<_J6N?IXG(qTp+%=&WymsZ^?6B#hZ88XMT*aBh~f0eMOb(n!O6 zn6y!JG;)H=DOwGY^^fJh^c3zHVaGI@9MwNLKEx^J8VqoMi&$cagu)G?rE#QRpocrf zW{J+m2Dq>#E59+dD`tZj)6@V_PSMdc1}3c)oh<`kZ>nevOM;mj#OyE&h^b;(m=XS2 zBO03pz$dAqrCAd6*&^mOi-OEma^mDv(c0VuV^hT>0>e{97lA>kVkv>X#H@u0EU97? zfzGL-qlL*QB2}Xqtl9URJAKY9@p0`SaZi{xZ0M8aWh8$-nJW6UG(gr~(bO^qddX6; z$6|}Hw<K@4`{4F5Ch|>%|lTH`j}W;SNYi%d)>gs+*lArnJfjXQ~+8+6ls5QQyYS z62(nzhQOzL$WQ^|U4t*wPZRZRBOx#~E2gcP!Ec*oLxrWvhDzMS4aH)`qY)FK@*dev z8#l{#TD@Mj(=R7QXM=_Go%brn{%93Yj*OOU&xIk6nG$o8tCsG;8trAg>zY@?L4M`E$|ucBG#t)!_YDRv=jGFFdZ%=rl?==Dw#P zU({)M$kk{#Zajw3g@RFtKdjNx}>Sw8Q0dHGGc{%WgQevxGukmLmmJ{6rq0-()7scfuZ zU|GKoUB#d%N3;*ifD1WjixTQ*^%`D9fQdO-k)sR%YxiZ@$K+}KLOmGHIw;yE7$CtV zCQUHIJeQa|!2~m1V%dabu(`zKsBD<*%Cb!K0@$%yv`!B2>+iuK{j;o?$>eiSj*8az zmy6w|20`)BEZbB)z}BOpeR>RtN3%+&XE69`ujrVO6xMI`%Qi_g@Pw1r0!j6^Jalkw zzi6GQhhD41=$Qe24?S{^?axY?na#kPSDOKU9LXwuKbb+By;(_fyx42)oSZE>=92I9_y%5ZnJn4Mq@dR9&voraIWqzMB5SuK_& z=%Hzrs82LPMNzaS2KXg<2oaYh#w5nTjg?|aq8To&%rbtE!l0*!CBFz32wo%lEHcAU zDoa3IBPK60!OxWWt6+kQYs4}_KNQjSfY5Gh#OTFFE|i17k88xd#Rd>X)Rzbb7{5l; ze`JAHA|{uRqwe>RBL8zS`J({%&uYvop-I3qtn8X<9QmL)fe(HOJ$OlL@2E0&xog}ZCT;l(R$J9ch^HYze=L> z;=h*e%675rTn0p@h|Wu97`h~@_&g1)R71%HcMa7&YxqpudokqS&P!+T3X;U-mqOi@ z{GBA0T*~8hxbptbI)?l&b@(fFjJOgC$x1^uC5f&pQM?YrSN~@nmHwAH&Zdjzs~K+o z{gbi`*T^oj#1+?DLJ>9Px?GL^hP8T;he1$Wcmvre(LX-~a#BP`p+OvxPp- zFQ{z(i?UyMlpP{2yxADmtQ9kEx@r8@c+j->799ou+Tf42iLP5oY45?|TobpS}JUD`nD(;JXYkqFDT$1zIi^jo+IfZXXuT*9CxWpJ@Ny z2+#J3&hHC3jf0f%WRaNnL$j=UCC$7+KUcJtw$A$Jhd(Mn?Kxt}gVtFel)mEyBj;r0 zJ&o~#g>%rNWg}{YX#^S>C%^!CM&=LonFdEzU~}2`*i2xx>$ls$bDPME*$FUKQb6R`LL##w<a17ASTBp=4{;hFIU86t+*_H=t#eEzKuYG-&C~Ge z{XxV0@c}8UGM9|cKnKz^cBH`O*8PLyn(_j3mR#V?shC`m&8hqIYZL)0#fnsPR$_Ci z6w4Gk%{YQ`O67ZM3a^IOTlbcnP`;XKl)|eSo{HuwY)<9NYLUTe5q2K8Rb~lwFTGZh z_Zwcasa*a1fbv|q<#}GMRLt`t;cvWFn)?K&&?)uSz3>_ZH!Y|5V?EjgYTlnRg-+9z zv`zypn}gkam|rELkjcJUFIQFNzDjn8li90L<=@IF<;4qB%j{c^KEA9wbK#f1Y=*$4 z&z-BW!m^NBetr+>f>F1R+o4U zRniv+Fbf;5{5{8){DFQ-hhP%E|%MtXgU%eyncQ^3qnu(*f)z8;6@}v3@*kmDFM}|8`XWegirJ zY3FM8LbTRqBNBYnNK!|QB=3?a%AC9Lx|i{ow}eLqoo2F}KLLEy*b=J7mN(Vd5~-=8 zmT$2B)$;Y^@?+HUHI&GbKtW0gEj{JEJU-b+kBWJZB~z*e1Jy{=LX9+iWWjj3iyjr$ zm&;L)qksNTOAR!w@jP2Pv-P?4}o|;qF%$vi9VQzq6GS*qsE^Sc!4&lud1vLrRy{uIK7AN`%^Yqz?0~-`%54Au>gS z7aU5~V@VyRhcWBWr!Lbc1bT4fy3uKBy`cZZBVQ4jYf5SIF^_y6YIU-PmHbK`^3;~| zc}$b@wVM6w(Mf{TALl`+=$5Rm5Nax>Vo6;V$<|D)R1IvP0 zH0y`c^^|v!;;fzpurNHWXD#7sDwbU)v>sLsVMAar#nCZ@*1&}!48eB?286O`sB#yR zA2Aai31!~Ue=WKqSpfWa7Yjp~9e&J^Z1q?nu)Wx+A=NM?73~d)$4p$?ki7}jKE%9+ z%mAsWSV*3XRT~k_^AFJ4h!V%8qN|K(2jGfE>^Gb`ur}gFZ!{ zrpyQ*e1PVrR53Nwx>Z{X7d9m&93`DJC6?#$bW@Ue59x%X$0YwSVg))-Ae*? z6kD{XHg1W-lJ+c{+bN?1@heTnvJS+rK>`{(61m%cbEWAWSv3a#*wNmpT>3kBv=gyu z87JAzyc)?aC3og>ud-uq7b0{!%eScON)0>{E4jK->mg}2dcDPx!DPpjx608i#T#!C z-Sk)~xjUmJ^?w$kt4F!~xA0jHGU2xi(PW`yx3jdtxfb>u4ll%*p49BDh3M?bGQfK) zM)soSz*bD+@aY!J?nVAyvIPxqQ|))RpmPz8yw~4mzL38K^@|A+dJ}SGixkkCxd6W1 zgpM#eKe6G1KIJ;l5FFW;I?%ZowDlu74t1wtgH9`rU>nu+<#KuqKJCW>VMh!G z^e1IU$6#K6DrA#0yJPzStT)8PVA22*(cPkRcxeDN)NS`141SkTw>l3<)8AzY3>trm zB?Fm_g<{`9Yzb`r5zB0>F8)41NmjZ$z?{a3mh1 zhETQcI8hb%4&hxS9*c+2mWvuq;K>a%4`szrvRN{`$DE9fz#GGeo7+D&VT<8x2DFVw z$8c(y>V|9y77SaX)gHpD5TSbY|VD@GCP@Wq%nibcV;IcOTq4ZcB+ zQSirgv~ygI0Pyp5%;mT{1bl;4$54Q%wLuAsx1_;i*h&VYZ^$PLzkG~kW2x26=VS3W zYL+{C+Og4i^7^rJq~h`9ZP3zz`iacq7y8}v=Q*FsQCpsDHcY~piR8tBxP2lEf!0Zw zJCRvo&LVV9q1DjiNo*`Ej6>UG;_Ws7g^9^zfao~P=gICWkD>n*HVTH%mSU!my}?NN zQ_JNiO8(PW4ug_d%%4s&{TPcr(Uk8V4%%VgXzEw`*^<``UVdXNM$M#-dKEX#q$u&-M-Tk3+57av-c%O438mM^Cagy9z&MT!{S&XbUS?^ zHj1M*oSY>U#_<^P;WRYFQ>SY+4~=28$LOY8jDN)w-Q-#5T)^`95Mf_PY(lqU#zK|^ z`;*XUCm$%FK5D0Q)mKyyuSVKW7G;}cx?*;XxaGRwjjPs!R!^R1ZLW$ zjAU}YnnyhL42-jB8tdyL^m(xr=}A#Mhc^2HaL+30lmGId_{MT9Sw#`IX$q!%N`Yf! zH0FOw`q&#SC9h^l0(>`13P2iRc*COCGY13znUc>2X5~#qn}f!3znSQAP}$!vW0`~c ziQD%BaKdH^y>$>>n`tqjMr8Q?3R=^Mqe=$9TtrtIbHIpcXxl=X>yyA^a(6txg~IE^ zX&A7T^zL?O2}f>aEocg`Y%7an)vtT#=rTUruB>0I8O-`x_NRC{oji;hYv0Zc*zrF2 ziqrDFs})V9bEPfeWjqALZEb=VwzGP#6<+-c@0y-f4=Q>7Tudvd`)@Vx_lcN%BMPVO zU|n7aG$M*7Ep_cs(I^YlMHMJQhJ)b>qxrl>qO}dRGIl$@;NeoSMmy zWubN_Yv=dNTH4DRCsWA&=6eIJJK5sux1RAdf5sOeytTLRJ0cI6T1YWaC6C*3Rwj!7 zBu#6Dsk>NXmVn|e>Ty@_!Y;NW;-O3vw?$z*vWBu6i`$~1B|5KQzntH~ zFO&#xdNroApaz`;}z%R4>ktuimLqVQEU^{rC<5$JeR2+UT%V3a*xm4_d0= zEd2lAm*~MSR>s5P{M-y@dN7=%GUTUbBzJZEx*6-4uI>NR`nIwx}FT< zwkxWO8>GtJMS*dH)M~mYFm8}cu8HrWKuKBM6Rxy>YL`$sBX0XKS&aDp3SmOr_Je8y zU+P$AFC25ii__*Q^gg<#rL12;-gi8(o}q?imy}g{wlso#e1pvQW>8eu52F74n0pe ztu1H!o>MZqWXh25F!Fv8x8tB}8lC1jE^@Llw3Pb6$=cS=lvDX$)477@&nwX8V<=I_ z&wq%m_p#3HuE^OrT_}zIwM>+O=7l|aYZPgM9?5j^m5LNN%o}&_V!?{uor9UT{6~Bx zg-r$W37%5TqU6U9Q)G$TqR5idLrITIQ)JRZJ&(Ri6+?G(K z)msD0a6vX}0+$zKMm8;}M&S?H6rVO=TZyW34-Y=LNup_?djbXcOrohUt(B7w(xCF| z9V|Xbt5^3FFIOr!#Hs;=&A^f`X_RmmTYxQ&&Ils* z*<>^yWl?MhZa+%9dbAWgN)x*eX|m;_1*IMvxrjJ29wS{emUoHAWEY9u3NN{cs!cqW zxM&gIKfXco#7ZqfRlK(3_^F_^=gi5jgKO4W;`Rq9K<`6->v-+;Ww-#I?CJy+1n#;TXt4jBHalzoXWyhq@(Jo1c$K!+RG#~C2 zh0YtSn9eHJ=9g=1W4w`1jja-e$v3I$eN$icSBAP<)Yzvh(Rqtyvs%)G+hkvMSlWJv zuNQxuht?onU8!3EYtP{Jc*$N!-VFZp&>o|$i%`VghoCtaQ$)VLVmuZW(Udi4j%59Y zC212p55WSL|MwZ_Kg*Q#qH=z~eNs^AA9p!B3<`49DJh?|VI-^*oOIEjwmSuQxoNl}0BWk}1(==`%B z!3QU?9$h%a~@g(|0 zKrW2Dj)i}dWJ?i!9#IQ|PNKdYbjK-=Sbb=Gg74V9T%ZFne?&`XSb?_o&<8*Nhlt9K zV_thOVU@?_w)JkGK;vUtv0Ph@g^x)gZLjmq#22$|$UK4BPiUIGbGc-E$}$)Pp2R#e z=Tb&o+#5{q5tlM@lHaM*l~E(r#T;}$f%#>`ee`j(ccDT@o>QS#8ejN2) zgsVFO@a}Obif{&3qcEicyjTK5!{eA=0q7!SDkgbDB*esEp*I!W7KJ_)iB1_YYO!Nz ztq3Mq6D1{81agn5QJ7chMScJrJ%&D&$-HT!rTofZW5V!nDKrPpW)0m@2xcC`n5vKs zgGZy$hj=}jfKfi>SoA(7W%v+pLEuHx<|;+?_i3Ga42`~!EtHL-HC|dn+8AfmVFS00 zqdLhva4z58)8oc@G=r$?2i}l40S$h{+HJq9IZ~7#&?-D~0!BBXMYTI4GY7M4&~@VF zqcEl>$woVnMt@@Y%^Zbgxk_59 zREGsF3e3FrX2^ zq$Ox+1kn(?1hX5FAW?)HD1G!2jNx$D5-Gy~v?V@$1eT;}4KQ*B7B(fq*bx{VMg;D) z?(t(-vPDaGqLux7ICKP!%^(Gujli<4RF0-CCCwnpy}X4_k6?6j>JrUIU|w@_+CPUY z`;^~DV_~{B8J-Wv=G+Hw#{j1?vn4vYk&_ul>SkjUj>NZBLBWMmM z+^vzSM=&{@x|;O{7KT$FUidcZ-=GE;_mbanVJ8aj}UzF5oyVjryE z5$Z$0MIIF`O6YWJ{o}*v>#-C3WMPJA|*clLmP!%Nn3u0(A*9&GAPg3&bvX{9S9kJ@t&5aU zxp5JubSL|@zJSIa&=4#2ptdhO$Po+7kzsvY*Ms6_nT>Yb$%5{<*^gSmad+Ib9Ku|V zf2xkRoeoJpJ*g%@8%DoPYH)8c{&WzXZ<87*j><8qLo{ah2BR>^#zWT3a$)fBK{UKW z&hws4vb_UV8fk6l>_e>F_W0l+mh>U#89!9Y?n|K*LcYd;e&q<-9K^_e)X{4XMW6n} z>Bva5^e>n1b5Kg^&m+az+n6^%$taslVN^n&cd6WoA(+b{nNSXPwWce;f29yA4`fKF&r)9DBtZ~&I6bk+=>Uz$OI*D_D@g(XYT|haCS^k0%sWEJYY6VPy(kuK}wngdM&gZqy)~8iAvyX zKj_uKxrkh(eBg}#LJ6D?1}cHGAnMh?Iq(Z5aFz^I0%!I>C2(d$DS`9&KqYW49jFA( z*eE4%iUXCv>DI(|SxVq^8{>A?tAX=!7TVt@pMH*)-iJ~0XgZr>Q;V+X;BZwQ`phAi zPv>oO$W{6!V*VV88SMs20dt{*!B3YZuX)^-XRe?*7QU<8a1yPwXz^Tcolcx~&BSJl z+pg`a-9?@=^Ghv!XJb}_dNS^>%@Lb@6I5gEt82yvS83<*%5}akEYg+3kc%GqKU{zQ z{N?)nJ#pEM$@I2iWMK%Kh^H4o2<+LwFOB)Op?ex}TZ@!M{FYl~Sa&{zzIL~-_^VfH z^Ygs>mr2Jw^TANl^RnN$SIfPYzl@~(U-nPmo{8oKOB;v zUVHQZk6&%P@`|Nj^D7%Q=D+*Z6s)?0{HhMUL?XZ1+yCGA)u>l%d+p+EJ$yDF8o%Z? z-CiyBTE6fX1g_c4AsG=9%p-mRQmUD^7c z8dOEb<3Bm3>|*XXuE4I!#h&<}hf2ro8X_}{4|*iyv${5x@!3JjfrGzpA3j+QAqk3@ z<(t)%i={SecIpn9y?;ez1K+%6R-RrH%3P&*HTe&^V!qlHA)@ft3PfI6Ej*!RI%X z;XK+f=DYs!^Y<&N*l|{YTh#JF2W33x4OwK3+jM+~Jd~1JwE9raplTJmwhCQ^`ee%@ z#WYGrO*Ml|6H0%^_b$Q>$jBeS4F^Gl>`j=Bq z8KVi0Pw1_Bw%T*}K7AUOySL&RakZ2U`&s^0US2bM*jbtJ7_}#i8@5iyC)ZaS5Vldq zUkJWk72L0%Ts}T5QO=L^8zSR%;=`883A6l0$qBQ=R>`=(&;d8BBG*^tYbEE(`rFLq zQ(e~|l-ql={KlyK*C}==r|+?pL;6t=$KQ^r7439 zm4iOHN&LUW;8r9M{Zp>ik|QW?O}Jt=ev0q;Qg(9`y_5~Wy6 zcgpyz^iY-IS(QPcjK^D!skpC-AC&Pi=|k1>y<~iHx)LC!TKcH;T~vC-ljG8Rsd&OD znP66We>q{cWunS3R>sF!CaDaSzCP75O=UP*WiU_0C#iUXjL%A+DdV#(OJsaZ`Z^gO zXIU!alhc*1H#NaRo80s-E!u%536!W6mwr~QxTRcRc9KyosPwtnmU=2a zS}hkU19(R`wm(r5Khq>XRo-Bih-U{Zh~n%R*`^>jHz{x{og9hFX}dGZ{E^|V4Af*saF z2pfpQIp~M+>uLP&Ef*TBc}IraLwPG(_;$fBITbyP;9v|s;b0QhNhL4?J8%$#!#P-p z@fNhZIPyGr=6d{+ zb4$ZJ9PGd+95}Jg1_B4L0|!TNI0q*&ego8lZ3EGyQ6T?vBeZK$!)co!0{`3yzO^#sEG44HWol%z>NKaZ&L-$u zEr7<7xE)ILjmz}KIu2-u>6@t7GC8M-OdgjRsutUa7kIH#a%O~@8IBitv0s-9RdBQe zgj&z!>|Sbi7q#qqjCWAkDby$9b_`WB`(ylODl2TJD%Z<7lhmBiYOzJwY%>)*D`&>4 znKQ9j8WsD37i&xR@Z)wYRdW*6V$<;s6$?BeXRcE-m7uHBjFr_Ej^op)d_NyvK2s%0 zQ_By*Woa-(+vmAP9Qj5qe3}N{wTh@y#_c$(QXW$&dq{P*z-KII+eGDj(sS(YGaie# zLMaaqh1+jCpDPL%1Rx8o&0~*>^nVrqiDJkay9#oi^91&clEVD5Ptze`UZt z_%;TkcR-BaI*+IIon~U`4qCDeioxtmFteYezcQf$um#eyU9>R{cl@yI3kZ_J_kh6o zfr9gM+BF=BefL63u%@AXFQJ*Zb}t}UYoO6d+fAu+G06!ImV=Gl4uO891PxTsxgCe-67|RPMynpTi7jR2|LP zv_t)F7PNxLb1*p@47eu?M!z8Z5F33_PRdI-{R>!0z4X}^Ai2**=wkDw12BWl#ZKAK z57x_k>^#?p?z=+0eQ1=x6!h(;m%%P){7Ylh+J|lPR7{xYWql3h41f7K+ zq>amSQo%u>TO+;Fl-CuHQTHWueo^Q*9Qh^f;<UtHhNUh#RETh3bPfreWW(ef+K-AKil$?9j8M`G9mi?Tzi&p#tp;lvk=XG#YX4IwC8)G>l_%!(m$Mo zo^Yfm8qd>CZtO5DK2MfDfgfFfC6L$?eJ+CDZ<5CXf65FrUnI%ZD<1XJ%H{Jb9-j2l z1auG|=q9(+0=M5ouSFKzquG1tpzF@Bsb}OAEY1Hf zYMVU;4L8X~@iWnW6U=_MJoa%u?u~gjsa5Xhy`K49`}{A@d&9@eH$gkzhA#Bk6|~(J0DjkOzU(?ADxq$e<=j=TRw?VBcJ>D~XL_N>WhC?LK^ zXJB*z82r*a)SmY?W)#S3r*9oJ!+M3#;5C}0cm9_T9?Ttw&O++6r1r>rr1ods`Nmm& zJa`XkvfX&;9_(`~t=|7bX>G<~b`f=rTAQ)Bhz_-GV~=m(CR>fc-@-%)nt@5*LNT&@Yq{0sHl#J44{UrFfKLSF7@w3bn* z8(ji*;p|GuUcwJ8I^5-AHOI%G_2ajvLt)Z%E+B=(hcJgt!R-&B^ZzMb8+!5fu$**n zY(wjR$PGNl;kaRF{|^awq8FC_ha%=Xo9QMGX>=C0&-GZfjD~1Y7B8E9jBTHj%3`Nt%5yp(?1cp!4XL-*tWA1N@5w{CQ$%4$ zruBuJ7PK<$Nv!@D8dTrC`PG2zhdmxcKjCtiB5W87!IO{S4ZkW=U(P0G2aTawE^kA7 zT=fKm|I;n*r=#;pIWzo_hGkFaDpc5Gs8s!^N6j^rn%8>Pe07RaGw%!kx@Mg-riaytUGg1z5KioVnuO85#Lo3CmiiLAi>=1&w~|q zNBoFg>+VvXpO%j2M_bWYQyT?Of5ViT+GzN5faK**>_M1>DYdAz?@Yp^K)QZ%5aksr zJ`L3Nhq*)PHMo|X2shQ%&VxcH1_WvIpeZ$#KP_E?&w{iqAv_I@b+iG@jy>vV6QJf> zm|KS~#?-CephZVJ{)5ZDPL^;#2r*$tER<+7_vm-O0x z0F%3+zFxWXFQt+7I6G4}%&t%A?%J2)U-h+bLgQ{|Y(UBG+T*0@4YZ>G8g{_EMpTWv z_68ViAU2b5u0gwmR?5#f2*-~aYiGD8lkfxGaA`t1Q75QycLTkAC0wl%uF-{yCdBi7 zIyw$z`bu4B9T`Y_0q)7@DfDluT?s?GDn~hLvao9dg*#u9HeBp)_QudKZF6|5D_X-y zYO2ZHU0X|95vHXpqjM*qPjjko#soAs*Xm*F1bQt?_>(S}++3lSmk=}!Z%&$Q)d7=Q zXzg&Z3wjyLX-1DdjHJoKT`f?J=b#H9~Ea@N??(=PA2| zhFB$BI~uz7#prPD>+^$iHp~y#nqg{t40uE9f_J-MR3B|)S|G?zpwrR66)7@*BPO*X zD#v)y>K}wft+Z|Yl6SuPQg3x1G_=+lg(OO+Pe#>+EqySiHF@}VZ%eM$+;`pT?1F9E zl7;Ve#^|=xJa_UNxVJ4?_+mTB$3&f+L|D;W+t{5AzpuxPH?=YFac9&=ywnQZp|4g% zP&MDu#EKxRjSnKo$N$`g&UV`RxU`+NAv=hB+i7XoQI~2f@o4*U{+@)o4usZHUobAj zz8y%sx}7npLpkF_(&Oo1Gs$w; zj49@qBC{%Z!>rxGdg8*)`!5085Z;=cWm4Vjqgz7 zjwyv%98Q0S%;?tU6#U^G3MQIPnEwV*(NkJErXmenhNpiibEd;pT0Ud+O)z=IQ z29q{>t;K*y>MV^%qdk(?q<28e5YmixG&+W8%iz0F=om_u`o?y^$oI6)*G`Quw!?s7 zTJ_kt8NPQ<+n}cB+3{lfpaZU&p#9g+&t?x)PL3OOK=W`eJiUb-LA~u^8ztThOT&_B zr0{{bX@qv(Yg7CNv>+U*Eq-l0n$-vOHd4W<_GqzbOI~Y>;q|t>MpM}SfBB-?CE9iw zP4O+EJw}h#=EL|jr6KRA4Ovc6g`a^t*YGp&`gnhgcEoF9|4gd}I<}cMmWI7f?dg&f znWOS|Xc|X-JaMgLAE(tb`p&|p@!FO(PkF3LQfZfE^+oyi4V~&&_skxFD<)|F^;fQf z-o@exS{M6JoPH^U{vUZozDD7^WWXvDX%84%ONNOQaA5I%DSDFD#MoHeKAA?J#n@sB z^?=Lim^_7i<&Ab&IEBoqUQTC;*mkP+4BLXwrjkcKrHKw7U1>LInsyYMihHMNI|HgF zx1er1^&ZPeOqx!!iEjAUbjo$Vzzn7r$>j9@BhhCD<<7%}GbmWQR~*Hw(Q798`cHHb zb|#6}9=Ffb_M~0k2Lzx{u?2m_pzkaaV+)xoiF_;zH_g)Cq$`|r-=~Vyn{;diU9r;s zNVEO}vnh3N8rpUc?F6hkN4otOuSHC_*eJrW&C%R)BOJ%;JyKb?h!pp0$ zFqTxFD>aJKcBU&_6ixO~9TW}cQ*cx-QnF+`Jzu-BVs)B;@{Kebj*O>)#I4iW(x!OQ zG(0e2*#ZhNg(i$yNd3gE)o?tpP`i&`u8gu%X!y{AE<4Gv&x9p*B2(4N7`8|t#if~~ zs00!L7MjqW_%ff%>Pn;#^Le=%7)z&A-YNF^D*&h(F3DCCO*U3DqqEL`@tUR#>ZN^H5}en`4)#eo%Roxk&i{S#NuVd zhAv(@mJ^#VyJP8cVspO@8dgxXZck}1O<2L%xY}S$a=CP0JdjLm{xnK4EBVN>pbaLi zqGr!+gRWIXr}`9}NtVi1(R3L4w2{14bIPzbQh-Qq1===fT|=a9#~O?)){p|*8zswH zt(n2&CYY2$Q{i2$F#uoE!P6BOi6r_rEzoBj8RY%en7@wlRcE7DF8=GukmFjTb^Xg? z?0~dly_VjX8Czp%DoNV7H5xZ)Gho3G%-=wh=dnXDV|k)j+l@ds;j<-Vo4vvS|^z2>jnx1?V7U<-v0cQ;O5u3WdQ(p(WV5q?j-sF`xzaz``ex+NXI$@kPhZ}#eSOQ7fH z{GPho5|8M~2*0PUsvAm{@q6lZ@S7dl4lEdhGbxDt`3Xj4QomHY7F?$1C7IM#_xr3| z)a}%6h7*G^V<&anrubl|R{nyH&v^R$)yQ2mH`+K@%HKs%ioJ!M_EMi-feZI)`>{57 zi7@EX9(|mYn-hjHPBMZNj!q8uhhwpmj8&DsKEk6X&@MZVV&Q1p#}`>jT!3Fc!F-O_ z-6BUUDEI`e`$;}^ast;sky7?+4RSAYeWrE5cb(DpIjy1^grhZ!_`7@ATwIYwlfR*1 zQsfuf4CeR7`d25vZ9Ae*HaTe%?2%0)%v&8XDx2ch;&xKWQEe55CnRkU__dP?C2bi! zzi6q15;ym47<`y4Zf+{s5A%s~^_I#Pc-;BpF!%^51Dc}k2zl5@x>$RJS}}w!;2zOh z{Ccf>RhT|Bc{xh?UDlx`n}*}z9Wdi4jh>q#xHL3iWf;+vL#7Mg!hc-IR27=?Uo9TYg;lND}7E4X4ZHx5o*mNxi{MBx5cqfZf6sXI_R%c(4TX&QK4&+8C40 zlALo}pzG|*;&5gOmYr2%T=qE?jdcK8E>ZDb12E$@{(n7vBglNo^} zSE-p7Kf*GJ)nBdm!(rF7^TF9x%D+Z~B@B&F-WvMd(0&59n<;N1-ArhvdxQE_^9U(2 zp9j)TZP9j<;#GsTlJS-{PfN8)Wp{`@%x{9GLT!ql=eH|bH^st2Y8Gv&8}DhYujT&| zhROHHum0tCExzuC#rG(1{zz}libxG(8)9A&srmDUQqnit7y*86ES3Gh=e;CZ;eD>y ziUuk9XX=hT#rS|a9Q@G;^Gm3M(VXKq3Os6K;hzsN`ZsL}9Vw4|_;StxS3Z=oA8JjN z;h-OuJR!?WdN}w8j)U1YJWp7KmnnE>3ds_bfLQnXn0owejoO>=#b3K3I41HT| zVSv!`#a!HnzQ8CC4Z|`AOUL z!khHPdJ7hY5ZPZA^a&;Sn+0tF87|Sjb3GzELuZ5>9#_cW zUOeX2qlUL3L(=0>ny@sgPd=Ps!KC^`mS&+{2Eht%CZn~1P#>E#5E`-%ux|tED3$A@ zPeYRGvKywq~ zmQYW5Xz89ZeHD++Cgh+q>q*5;NFC6#p7MDkw=LG=^f2m-3+hOwX5=K$ZWHG7?-;rB zsk1g0Bxqd+?JbB;ekf+QATiw8O{BkC2#w`ggT5unF*O`xT9O>=Lg{;UMCXo9KhKwn zTk^0mEfl@pc$q<;LGAGdX=7^;dbOf1%kAEZ`25`x16mWGhM{O_P2_HWh><>OO->At zLzK5f?({x*qYbeM50X;a(r5TV3PGodyD4b>Mn4)x?aBPyT+)hLnTw5}l>DL%w zs~#geQ-$uwN`J;mDV+r)gE@NT<(fMR(uA-p72F+&uC64gRWFrxBpmgccOng5c9eVx$t!`ru3j}x92s-8$E42K_fl``HDY%jlXR~Lh=!pl!Y`r`^K_0A;$%8YzoQ{@YHs{^pG z9|ekGYI<)uUH!t{gaEV*pv)F(W-txLd>S7SfX;V?>b4$jDhwu6)p1bA7=Hg&xttl7saz$}X$*8z2W>wv z6HHrzDID&mS=bNkmJN(2bKi2<=RisDr) zjivU8SEYbBF2O-+@_gQ~3Rlr=r>dWPh2}&OrGy~Izx@gwcEWF{__?nzDuL=btm00U zev68)Rq271Jv>rRs7i%+AbmbhxE3O z%lG{iOim*F<`pbV5Ju4lvuxi`M998^WlP8`d+9@H-%sC@Q_0Qr>-$V!4cVky6^dNNI5yEo(>`{bk9uMlfmVP3`o}LSy(m5B2M) z#UM6X?x5OqTGt@bm)j2L>(R1<9~qFjj^CoRjP) z$$Zk093h;+m77w@F^YT8Tux8X;+#)(zEZ<8LK?uhvr_Ikp;!x=Tj;z*#tpnBm0l9^ z0K#ucxmN`G)Wn!vDgQRFF*H{yyu(N6r>C*(u8;yhokrJjogTj^5F%jGEvck{=N`L- zKKEzAy|+O&gKwBgp_&Xj_~Ah|O2uo&bO!4T`0L-oF-Rli5h-o;3Do~X%35>+Q~n`*?g{jIEEt3K-+mdn z`8Mx?VC8Dmy4z@dOd&S$Hby9?DXqv1K#dg3@bo|DNBAEytm2>C&0H`5@Y{)-P%ZqD+Ha*qbD z&C}6tU+LO1orOP!w=kU(<{igUrqjcL?O0fm8rBhXzHoRuT0xiL!AiMjtFWTa5y-sg za|AjAB>qIJH1f&CT3t9y`Wmyfx)P7V$_-q#uuD)1mk3n&%3uu85kB-MEUcmn!-;a2`Xmx6TT;zQ$y4T_k5$ z>`m;vOEI9LE(7exXtnvGfhM(WdTdikHxy#;U~(n3P$jicWt~ZFkP`y$&^l8W&6!14 zp>$%N!J#5+t}31h?^Y$Pk&Go(NyhJUUX{_vv#Vf{k8TZ|$-$Uvx+plDgN44iAXJJDa)k$z=BcZGGr z6#=@&Sht2Q5xV7|qlV5vX(MatCPH`)-NVq?pdoRrsiWU)RB%=ip9Sg~N+0{{v<%L> zFgbvfblD}B<+!aDiFeec6#mSGhCnL3RmD?WQdyvmCKm6wlzy-$h-&Unxpi~~;T;zV zcjX?diPP%nVxgT=^?ZrAJRqsoMHanByb=n#TU zGcYfN6mWbeeZ8C%RBsPPhLYxEcVIGylMr(`Y?X;+9A4Rjrg{Y5*^SZl$dW-j(81xI zOj-(Z%dW#R4x8^qV|{{|yV1ts@(fJo(6s|y9LDa#5)S{)Kz#$ApGj*(f&+G-y#X0) z!cNTK__#fo&*9@e=+%&52G!4@eJ_3NfMDWoOyTgS-I&W^UIvzOSS1q;jR^j+3nLp5 zztI_J=MZ;b28WGy(d`j(*E<^-YMbPA08z30B^LHV*e?qMgIc47#yG@HXj{L){)M|H|)e*4j=BsVh-n1`DO%nQF#up>_Q8Ny?0?$Gm3{akkYSN zMB=pOx=`4)Ri1%Ay!BECdt^l1JdKb}22Ent1Xbh*oUblea!_079bGToC4oZQ8_vqFO!J$Ry z^9I4dduWm2U9@x9s{pe(j4i|x4%gj9Lo0%33(&^l{kxdLVPGNVak%atdbK7PQG{j= z@86@VF9eqsp_9W$g;>mCuY0I(!{J?w91bnOfOZ_-Lo2Z9lI(Zb=R0*vOcNg<|i*o)fFq4!-Z<}jiF zeL50cSBNGKClyMzj-+ome@IF;>q-Uq|4KU-Fei#^@z(^>69F-UI>r%(0D|!~1a%=I z4gnN`k1^<7jG|*uz__bJ6lAmNlHgt0xOy?{3KbuV!3P^%g`gJ_msc2Ih%bz~VnAiX zYY3%zjIEVdUSPlb$7ZtwKu(Rf*Drcn!HY3k+EOA zhJIDZN(D>V)L zf_wSGY38;jw!Y>kUUV1lgo)ptov=QAbeef7{2p;FUwAVN>E$)Nr5z5X&)4uaAxmp` zM?0L$cCOJT%`dM>&%Xuqrg`i5vgwe6cQ0Q%9Xi+Mb^PdbDB*YOwCP^C$fw>4m3?|0 zT#`cNKVHXI-fEuMGHp~Wx z&4Gen@fvTR18ze#H~#h-1{k-F0b7PZ# zf32lOd0ODTL{T2cKE6!Y-TScJq1%1?_zqzY68m7?9^J=}3wwgt`|I}1K3JLp?0I5u z)a|8xyj|ECDW6rh+xGKC!tNyYUb?-qmv02S$-0m4{H^(zX>cmN;}J95XZ(IuTKNz2 zEO_v@igzr6zO#Q7U%JS=%oKwk_B;mrExDgBe9YW!%I;5h#LSIm(^KpD!X?n@`fTDm zmcUrPYy@|J1p3i#< zynLI|%bqef_B3sJCB60;b8Ao2fLHjj=gb?$aI*G!Xb?G^#1EvKUl1q3O|UHC3iH&a z(1BXtFpevG;e)-?%%{OO5!7Mjoovm`IIQf9a4NyLip8uj5E_gBr zIE;a#dFoGM`hS3T{Rsx0-kZ}MFT)HKu8Xu`(08yFSDdUv2YKIB(4Lk3ymb{^QS{!- z8&l?^Cd)yttcIFe5Ac@NV0S=t!EPwuYRFc`vy*u4gXv?d%_GgGwJ*U-XK-vj$2V*? z599~ZW|t{-kT++b6TI|Nx;-NXlKa3(jD_=FN*{mS+zR7BH*Z}B)w6e}r>=u$>v{G| zFlqLF*7MBtqwCF1vuVbQ;`)AtDbvkobwYW@!y=%akigf?S9C(T#&q(df>TSlvIUOt zw<~9YYA`O4&^IwK5{$6 zo4AF~+YWJ7Z{aJ2e7%!*3)y2UZ_Yux2e&x9~ke-UutDz5()? zE%0Cy5gT|zzq!B6znV^r$Blkf4_yV5Yh+fh0H^GAzy%t z{|^K>eY*I_ zPe5j&)Z+d|u3OySXgB3`j;h?6e*RN))YPxSab^|HTZ=Hp8}%nGRNI%?;H7J@cl5-<}V;n1=i^M0mFG?ka6Cw^^ifrkJvRQ%oCW%_*=Z~X@x5=*=I)PKM=&*Cm^C)tmgA27wc__AX# z&Ie1p{TnC(825Ywb$Cj38q7l#^Lo=VaIz{RO@9F8w{Z2IfQo*rMQr>Ia##+DzBBI; zK{kF5IcSNGnvTP5$A7}0^;{R<@lPm!u#|2&Ztmzu0yd?~R^=~s!X3iH&-wc)V<1hs z`DCT9*_1Ew7Ms#;iXTZYvMH@5Q>K*O(WES^6Pk|xN+X=b)%IxPe;J@y^+tl<#5OBF zljX2zIb!)-SRDU@CH?k5#S5pR?XV`SqVzTub9~tO%6yaOFkf*#6an^!(xSA9ET*;q z7vMIPkf3iI4((I`;DO zNJ!Rlk+Kx-{vP37BNezDI0C4|{#(oanZx!6wb}8^mV@w|?{Ff*fnG!nW1*CLvk5PUwB}%;YQl-PR zsVlwmQbnl~inXn(LYz$+`IxavMJPwQ4a)UyO}TcQK{;l;QWBoSCK!}2PtcT0FRLlj z{V!MSCN=9xns((RrOUJ#jwuf`G02r3Ws#7rla*N@(<>&6D!Jd~ZC5F4g;cHvhpq4O zrB^E(1y5~*ZWB1dm$pHhdXJp(+<@k zoqJpf4o_daRk^=MkKi6N=i8M5=fwAD_jN%bqO-*N+CKH@Lr_4Ma4C6wJM8Ryk9T1?gMCZd$OIPkjUSq7A-7|Ax{wup z8`$-ef~uPepZS4!CXh?tgaU!w0o*iosiH2UCY<1#O4Y^#`*CWAAzDRn$+Wiol{f zoUG^Y=(8{(0sEt17rk6;-@yKbmrm6U>_>%t+5eJ$89c~+M``R)I;@qjx9qr5F@g4I zkA9ym@`YA~gf2aLkC*zmu6G>K>mL6~OOQLN$<$#@+QC7sdt5i{eO9fz*>MfjgDPK_xBi@D~*I1Fxd4{o$YN`R*5Z#}3hKV3$Xdu-W0C*ucIF?BT1y zK15Tg|0kiNia|ndK|_3@TL5h6C+tCB(V^w`1hGE}Z0yh^ewh8M45Ba;*kyE(|03YO zjF*H0)sDC@V=F;nJjAlVgAEyy693B#_Cb2Mj<0V2XNy4o?Ef``3S=P15|PXQPm75B zSrl%b4-WXT4S{?EGqY#zp~aYm{lqS-@u*?Ee95EWpbo z{VrhRF6#R#-X)`f$3Z-qKf50k#(nrQFuZ?P-3|edtrFb&d#!fD5$bl}@dkSWc%p&3 zf#pd#uoT$1 z58nbd9u=Ph57hEj|L>hqnA5};QheH7BImbbYmZh-wq4( z^68%{rwsbJSxq+6)#kB3 zSJj9t&?3;S3@`?NzkIY|WjO0bWf40hwW*|e$F-Xfn@;cl;-E#)D;c0Ww$ z`Ee27Xn)&KKCrj!QX0+Kl<07xlk|eW#0DBZ8!jRGtg142Y~HS%GEUbVfjo^fsJhLy zGW|P5kdxYNpf?U^b?`$P$a8?v|2(+3wu@|G6J@dT1v`~fPFStw4Jlf7!&Em1WfJqv zA$h%!#t`R12$@Z()2z`*uxH03RzK2My3m zPX!uvXI!B3w5^IdX;wqRf4=~}Rfnk{VOv7cTkh|U7Fkj2^(Y-kYB>x z-A|yUJ&;he^sN!yv2~lG-rW3EzDI6yIp|tYQnFYtNyc*mOKidO)_~Gri^iKf~uI9s7oa2iSYTp3<#>4mn zV0qYzFb8w^q9eaVG4`S`3y}=Ih6KiD`#Z4gk|N-bz{VM}4+6ri*6KDCZg6Q$psD`v zcyLNP7ZMn2Kog7uyKF%-luS;iZ-P5!e}xvl3G74l?8ON~UhV#{gSQI%4?AizU~wXm zd7b$#?*O|AzDhEz^Dfr!wKh74GC-qv&%KAUk{*sNQt&>|j zF;za-?DC{m*22s3@Zm+};tTvuFy_Ek(2e4Hu^;S@!l{}*qwkv2LEpf7FyGGflSO4} zpD9UkBN;ZiE9|FZb`kavjx=HaEMM@2GBE5s1FQXnV}!GW%Y?1{aXcqsFJ`zV#tIfA zoFbejTqbNCKng(Eix}plL8O2w3*i*uJmJ_toMC~m$BymEK?a8WnSZE30bC&L8;0$b zvoOcc#_Txg4~ve$?79?lv=wuH9OlGjm~#^`yC+H3@@JW=r9#c0IodGCuf<#<>=F}D*kp?& zuE!kmVYb|$vz|YzOv4Vzn=q$t#_XAnIYziZ*nTVa&)uf+4YI^#F$Ff%An-HHMap+# zyKOe+Bwzg%3@?^BSZ$w+Id(7RNpZIC`3)YZ{mO{ zaTy1jta0%j%n@-JXt0+E2j0ha`v+Cl#<4(6p#~}v&VE=;pxTokVJ;LfXAfd75H43) z%b!`gaRNJG7v)3PKS4NB!gl9j%+Vt{>-n?7=hz|t1!ndoW@{O9p0Mq2*q-qWIs$W!u=PT0k6(n@Itp`!aMo3`tKHi*x~33^Z}}3;fmX~Z z!WF{taoFEK9w7I&r$yC^}p ztTME}Yyro8I6;(ffw1L%>~AORBwV8W0HhbUL}URX^Krl;VJF}G1B}>#2zJX6wk^PR zFX0qn_8|6m682yYGaptk>%Zdw)?Z^T5OzI;?NP!R!g<87$BIb7SbiZ6==u%j0%89m zZ1+8eIZoL5xWO)t*pN{H99v>=04@+N6Rsq%KYJFlhj78b>WE=kffM-tggHUjvkKeu zDa_7SF^32jUaQ*G{F!r2RRQ&d3wy$O!q(TZe}Hh2Fk6rPT~*fdXR!^~!J5VFeG_w( zaDs4(aFKBKeLbF@KPyOuT7Nic61IGR3*aK0BW(GQ_!BPbTph99J8^;-;Vj_-;S%A* zM>t-ffH|gdZNyFzhYVrsE*!u?*hSb+xIj3xTf~E#v~s|-@H$idz;NbcoR94j%mKo2 z!YRU8!l6%byu=>FVV1!PmLqKWD@wpJ2QViOVXhEP9L9Fv=SGGOnLr9?pf8OM@EdZ% zF~X5D_V@oCbMY8v=Qjox2SmWA0QOZ34#1gjFKWVG1P(`%EK|oMqrL!fH`|1=Hf`qzEPOH7pq(w5G|vzLtqT% z6yXZt;HB6<)QUMb7IVZc7}{U<^4J9IP$cZQ4BJzL*+gvjUV%A!6=vJjz+(Sb3m_B* z_O@XzPQjeG7IX4C%+c#H7YOI3_0amiEP&%CoFGIvNjOV5Pq=t9j^}B|Txjpnf@++< z1v^yyn0@>!3!JkG)3LftnB9u)mfJ7~30r1hyL%?)*et|hR>lhEz8yKRAmJ$CIN@Xf zr!U@#xpJ40q0gi`j0(65G8=R1Zp@W?Fni`;4$Z}!xfiqj7X}u6Hup<|0@(2Y<{)9u zudv-8#_Wh-E)WhpShI`#S?}~tUu<& z0L&%I&Did>V-5_)oDUDd3N{S0hj7t>?a8w-`_92^I}dZP1#>tt94m@W%&`%e%NJmd zT!h*A6U>p3nDZ{gVdfo!6wE#rvwIxo)OgI<%P~hLVXhF)U1PLg$e7D(RKUq+DrP_7 z6d%zKCQjw+v766_*>eNtGGWg&Y|q?`xzvt1=|>!9j_F9j+=RV^Q-s+}oIW}WbLn=> zmVlArz;)hbRKU$g!rA+<-F`pjAmIez4B?!S#lVq!00(sc3Ui)t_CaiC4`GhKg*p2k zW?!Mk>cEvSD8#rD{J7>IIIh1|Cdapo{@R)3g#Lz_*WO*lw6K{!`sEq_+7D%5z)^)1f8OE^S0PB=@rMA-VB9$z+@i@$d&9F0+_ z*NVYXgbRdi-{W#R3Ht~~2q*NHUiD%OX5~8V$Gfsz#h#ce{HsPNC#%P52jL)Le{bv` zBAg^#CYKwj=&Zwhj55+5_6apu!336#{pf01BBy*bA&5| z9WBQAL!kALg0TqU6kjkv^z-4ybd0$P2MH$#=Ls_>j^`lk#cYC~$bTiuk->UaAY37A z8-eq25%v)d5{_Z!*EH8ROvz&A1r8vEta0qjlrLcmP2-{n6Kp){4;T&N$7N>V1hBHbKDd3qH;XGmH#sM9K zy@W%A6Gj%(vYb%?TqbNAhck2&4iJtJ&JZpdSe+JH#^Vf}gnfh~gp-8xge!#Y6RP>C z`7=*VAx^Cu##l(2mvwz~+29>I3oQQ1Rn?Lx-y>vBJ6w@Tcd=tgbRdid7R!!n7xPXHq3AUVg)M_w!e=9 z_z1@c=LlB_J3cVRg9Ffq6!4Q!!WqIP!nVH{1Hx-wghParMiwWaf>8lnA#D2)XW%64 zB^)FiBb+kusgNJb8x(@ee1Y0EcH(@!goA`*gj0m`gv*32AEErN96V>>1QEi)0oa}+To{b)t|6F1LxIKqmj$q$g&mv@ z%rU~&v#~u$xJ=l44))KT2dk5b{w52MAB7#fF3c&y>|$*96V4K@5O!XoX#HOnpm-?` z=x)UvBAg^#ARHWr)5i&C$Az(je>~;{;SAwCVe15(-a$BjIkvmQ6R{#ixHJjdeICsI z$(Zwmi&tQ~_e#uR|5aF#r+hWGyW0p~gE>XGGzHsz*CGxx`*ldce1uDcz5j;&D^oG2 zuE*^5VP-cN8Gh^GMhbXcfUsO%S$5J4Up*G4)&>5a5GB4>2zZn$1ibX&24Ulagz)fj zLiqR;Awv9aA>w>Fh=$w;#$v$ykna^%3vU<)!o|l45#V^v|zJBbW*oQb+l5m!99uFyteDC=B;SG+R*xSv=O@I;wh&sX-fI6HY>I~s5 z;R4|@VarE2cROJhW)t)By36VZ4)S9?lV8J?yCuR0T~@zpP@sUrM+n2CBZ$@zC+Y;> zE7U2X&hW254g0#`^7?^;OT;Qa2PTVP*~KroyuKCo%H7}&dvEdO^}~7o@_J`OX%{Y5 zh1X347w9M;8eF@v6*`Wv2KaO#qI`i6NxmEe&rhtk^0N5PIth9JJiDI+5o{mh2o63D z)KHS?LIn5%A)}wDe$j^xGYzCV7sULgdfnr^Dpv z=_7Xe=`d-J61)6#n6zhzU4A;O`Vv}+ILL2@$pE(f)e@@(l-~}Mb`P=3Z=*?jh}dJ2 zwfe&{LfCo$7uZ4At#kDv&qo}Bgyk2zWQ}6P9w(e4oFSakxOS0O zBo1Z5mV>xPcET>gZo)poL6xEXWsO3_L9VJQ?MY%!5zZ0L6D|-g3KsicW>6vyWx^H0 ztQ)t8g|MBli?A11?SHZWKH?B093mVe94DM2oFSa=CKq`H;!q;Y4&fTx2-^ue2s;V8 z4~20+`OzxbB0-WML^wt`K{!P?OE@1UiZWqV!UePvb`W+Fb`$m!4hM-MN;pP1PB=k0 zLpV>kgc;8NSivlZagA++9fVzkJ%oLP1BjvjhmZo!|Aga&lY}#bbA$_oOGXyQU&W{p zC87hhRFJnR~xt+*wYjTJw8F5QUP{V?Wy zCuZxXg#Urrb*}c#yNquci8u^z1|S7X>T6`k1jVy@ZQ|L;4aF(!WgDuCMGM?RkA=2f^xZ5;FSA4ALR4ue2aJq_4CfIjAq3 zAUUQlj37CqFMJ?5$Z9PtD(KeNF#vm5t+A~qb|}h(ocL-Lu^uBH-R@z zsc&hJx8bC;@*Aeq5AT)I$GOxI{<|slBYVl^vi+a&_kkPa^4LD1zqu_9sf8{{m|m|BL_t diff --git a/tests/unit/ext_swap.test.ts b/tests/unit/ext_swap.test.ts index af337cd..cebda86 100644 --- a/tests/unit/ext_swap.test.ts +++ b/tests/unit/ext_swap.test.ts @@ -877,8 +877,6 @@ describe("extension swap tests (new)", () => { // [x] it reverts with an InvalidAmount error // [x] given the caller is not authorized (not in wrap_authorities) // [x] it reverts with a NotAuthorized error - // [x] given the contract is paused - // [x] it reverts with a Paused error // [x] given the asset is M (not a stablecoin) // [x] it reverts with an AssetNotAllowed error // [x] given the asset_config.cap is 0 (asset not whitelisted) @@ -965,19 +963,6 @@ describe("extension swap tests (new)", () => { await $.addWrapAuthorityToExtension("extA", $.getReplaceAuthorityPda()); }); - it("should fail when contract is paused", async () => { - await $.pauseExtension("extA"); - - await $.expectAnchorError( - $.wrapAssetViaSwap("extA", assetMint.publicKey, wrapAssetAmount, $.swapperKeypair), - "Paused" - ); - - // Unpause for later tests - $.svm.expireBlockhash(); - await $.unpauseExtension("extA"); - }); - it("should fail when asset is M token", async () => { // Attempt to use M mint as asset - this should fail because M is not a valid asset // The CPI to wrap_asset will fail with AssetNotAllowed since asset_config doesn't exist for M @@ -1113,8 +1098,6 @@ describe("extension swap tests (new)", () => { // [x] it reverts with a NotAuthorized error // [x] given the caller is not authorized (not in wrap_authorities) // [x] it reverts with a NotAuthorized error - // [x] given the contract is paused - // [x] it reverts with a Paused error // [x] given the vault has insufficient asset backing for the conversion // [x] it reverts with an InsufficientAssetBacking error // [x] given valid inputs @@ -1239,19 +1222,6 @@ describe("extension swap tests (new)", () => { await $.addWrapAuthorityToExtension("extA", $.getReplaceAuthorityPda()); }); - it("should fail when JMI contract is paused", async () => { - await $.pauseExtension("extA"); - - await $.expectAnchorError( - $.replaceAssetWithMViaSwap("extB", "extA", unwrapAssetMint.publicKey, unwrapAssetAmount, $.swapperKeypair), - "Paused" - ); - - // Unpause for later tests - $.svm.expireBlockhash(); - await $.unpauseExtension("extA"); - }); - it("should fail when insufficient asset backing", async () => { // Create a new asset with minimal backing in vault const lowBackingAsset = await $.createAssetMint(); diff --git a/tests/unit/ext_test_harness.ts b/tests/unit/ext_test_harness.ts index 7d9c5b8..bf07b91 100644 --- a/tests/unit/ext_test_harness.ts +++ b/tests/unit/ext_test_harness.ts @@ -90,7 +90,6 @@ export type YieldConfig = V extends Variant.ScaledUi : { yieldVariant?: YieldVariant; totalAssets?: BN; - isPaused?: boolean; }; export type ExtGlobal = { @@ -1419,9 +1418,6 @@ export class ExtensionTest< expected.totalAssets.toString() ); } - if (expected.isPaused !== undefined) { - expect(actual.isPaused).toEqual(expected.isPaused); - } } public async expectEarnManagerState( @@ -1646,6 +1642,7 @@ export class ExtensionTest< : this.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: this.extTokenProgram, }) .signers( @@ -1714,6 +1711,7 @@ export class ExtensionTest< : this.ext.programId, toMTokenAccount, fromExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: this.extTokenProgram, }) .signers( @@ -1806,38 +1804,6 @@ export class ExtensionTest< .rpc(); } - public async pause(admin?: Keypair): Promise { - if (this.variant !== Variant.Jmi) { - throw new Error("pause is only available for JMI variant"); - } - - const signer = admin ?? this.admin; - - await this.ext.methods - .pause() - .accounts({ - admin: signer.publicKey, - }) - .signers([signer]) - .rpc(); - } - - public async unpause(admin?: Keypair): Promise { - if (this.variant !== Variant.Jmi) { - throw new Error("unpause is only available for JMI variant"); - } - - const signer = admin ?? this.admin; - - await this.ext.methods - .unpause() - .accounts({ - admin: signer.publicKey, - }) - .signers([signer]) - .rpc(); - } - public async wrapAsset( assetMint: PublicKey, amount: BN, @@ -2691,32 +2657,6 @@ export class ExtensionSwapTest extends ExtensionTestBase { .rpc(); } - public async pauseExtension(extKey: string): Promise { - const program = this.extensionPrograms[extKey]; - if (!program) throw new Error(`Extension ${extKey} not found`); - - await program.methods - .pause() - .accounts({ - admin: this.admin.publicKey, - }) - .signers([this.admin]) - .rpc(); - } - - public async unpauseExtension(extKey: string): Promise { - const program = this.extensionPrograms[extKey]; - if (!program) throw new Error(`Extension ${extKey} not found`); - - await program.methods - .unpause() - .accounts({ - admin: this.admin.publicKey, - }) - .signers([this.admin]) - .rpc(); - } - public async wrapAssetViaSwap( extKey: string, assetMint: PublicKey, diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index 272c1bd..9d34825 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -360,13 +360,12 @@ for (const [variant, tokenProgramId] of VARIANTS) { yieldConfig: { yieldVariant: { noYield: {} }, totalAssets: new BN(0), - isPaused: false, }, wrapAuthorities, }); // Confirm the size of the global account based on the number of wrap authorities - const expectedSize = 176 + 10 + wrapAuthorities.length * 32; // 176 bytes base size + 10 for yield config + 4 bytes for vector length + 32 bytes per wrap authority + const expectedSize = 176 + 9 + wrapAuthorities.length * 32; // 176 bytes base size + 9 for yield config + 4 bytes for vector length + 32 bytes per wrap authority const extGlobalSize = await $.provider.connection .getAccountInfo(globalAccount) .then((info) => info?.data.length || 0); @@ -2169,6 +2168,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, vaultMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2206,6 +2206,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { extMint: wrongMint.publicKey, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2233,6 +2234,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2259,6 +2261,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, vaultMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2280,6 +2283,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount: toExtTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2301,6 +2305,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, toExtTokenAccount: fromMTokenAccount, fromMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2333,6 +2338,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.nonWrapAuthority]) @@ -2361,6 +2367,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc() @@ -2377,6 +2384,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(), @@ -2448,6 +2456,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2525,6 +2534,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2609,6 +2619,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -2690,6 +2701,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.nonWrapAuthority.publicKey, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.nonWrapAuthority]) @@ -2718,6 +2730,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID }) .signers([$.nonWrapAuthority, $.wrapAuthority]) .rpc() @@ -2785,6 +2798,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.wrapAuthority.publicKey, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.nonAdmin, $.wrapAuthority]) @@ -2873,6 +2887,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.wrapAuthority.publicKey, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.nonWrapAuthority, $.wrapAuthority]) @@ -3023,6 +3038,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID }) .signers([$.wrapAuthority]) .rpc(); @@ -3106,6 +3122,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3192,6 +3209,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(); @@ -3285,6 +3303,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3383,6 +3402,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromMTokenAccount, toExtTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(); @@ -3479,6 +3499,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { wrapAuthority: $.ext.programId, fromMTokenAccount, toExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3624,6 +3645,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, vaultMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3662,6 +3684,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { extMint: wrongMint.publicKey, fromExtTokenAccount, toMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3691,6 +3714,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc() @@ -3721,6 +3745,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, vaultMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3742,6 +3767,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { unwrapAuthority: $.ext.programId, toMTokenAccount: fromExtTokenAccount, fromExtTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3764,6 +3790,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount: toMTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(), @@ -3793,6 +3820,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { unwrapAuthority: $.ext.programId, fromExtTokenAccount, toMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.nonWrapAuthority]) @@ -3828,6 +3856,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc() @@ -3844,6 +3873,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { unwrapAuthority: $.ext.programId, fromExtTokenAccount, toMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -3911,6 +3941,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(); @@ -3989,6 +4020,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { unwrapAuthority: $.ext.programId, fromExtTokenAccount, toMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -4073,6 +4105,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { unwrapAuthority: $.ext.programId, fromExtTokenAccount, toMTokenAccount, + mTokenProgram: TOKEN_2022_PROGRAM_ID, extTokenProgram: $.extTokenProgram, }) .signers([$.wrapAuthority]) @@ -4133,6 +4166,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.nonWrapAuthority]) .rpc() @@ -4164,6 +4198,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.nonWrapAuthority, $.nonAdmin]) .rpc(), @@ -4210,6 +4245,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.nonWrapAuthority, $.wrapAuthority]) .rpc() @@ -4280,6 +4316,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.nonAdmin, $.wrapAuthority]) .rpc(); @@ -4374,6 +4411,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.nonWrapAuthority, $.wrapAuthority]) .rpc(); @@ -4476,6 +4514,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(); @@ -4576,6 +4615,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(); @@ -4675,6 +4715,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(); @@ -7927,155 +7968,6 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); }); - describe("pause unit tests", () => { - // pause test cases - // [x] given the admin does not sign the transaction - // [x] it reverts with a NotAuthorized error - // [x] given the admin signs & valid inputs - // [x] it sets is_paused to true on the global account - // [x] given the global account is not the global PDA - // [x] it reverts with a ConstraintSeeds error - - // given the admin does not sign the transaction - // it reverts with a NotAuthorized error - test("Non-admin tries to pause - reverts", async () => { - await $.expectAnchorError( - $.ext.methods - .pause() - .accounts({ - admin: $.nonAdmin.publicKey, - }) - .signers([$.nonAdmin]) - .rpc(), - "NotAuthorized" - ); - }); - - // given valid inputs - // it sets is_paused to true on the global account - test("Admin pauses contract - success", async () => { - await $.pause(); - - await $.expectExtGlobalState({ - yieldConfig: { - isPaused: true, - }, - }); - }); - - // given the global account is not the global PDA - // it reverts with a ConstraintSeeds error - test("Global account is not the global PDA - reverts", async () => { - const fakeGlobal = PublicKey.unique(); - - // Copy the real global account data to the fake address so it deserializes properly - const realGlobalInfo = $.svm.getAccount($.getExtGlobalAccount()); - if (realGlobalInfo) { - $.svm.setAccount(fakeGlobal, realGlobalInfo); - } - - await $.expectAnchorError( - $.ext.methods - .pause() - .accountsPartial({ - admin: $.admin.publicKey, - globalAccount: fakeGlobal, - }) - .signers([$.admin]) - .rpc(), - "ConstraintSeeds" - ); - }); - }); - - describe("unpause unit tests", () => { - // unpause test cases - // [x] given the admin does not sign the transaction - // [x] it reverts with a NotAuthorized error - // [x] given the admin signs & valid inputs - // [x] it sets is_paused to false on the global account - // [x] it can be called when already unpaused (idempotent) - // [x] given the global account is not the global PDA - // [x] it reverts with a ConstraintSeeds error - - // given the admin does not sign the transaction - // it reverts with a NotAuthorized error - test("Non-admin tries to unpause - reverts", async () => { - await $.expectAnchorError( - $.ext.methods - .unpause() - .accounts({ - admin: $.nonAdmin.publicKey, - }) - .signers([$.nonAdmin]) - .rpc(), - "NotAuthorized" - ); - }); - - // given valid inputs - // it sets is_paused to false on the global account - test("Admin unpauses contract - success", async () => { - await $.pause(); - - await $.expectExtGlobalState({ - yieldConfig: { - isPaused: true, - }, - }); - - await $.unpause(); - - await $.expectExtGlobalState({ - yieldConfig: { - isPaused: false, - }, - }); - }); - - // it can be called when already unpaused (idempotent) - test("Unpause when already unpaused - success (idempotent)", async () => { - await $.expectExtGlobalState({ - yieldConfig: { - isPaused: false, - }, - }); - - await $.unpause(); - - await $.expectExtGlobalState({ - yieldConfig: { - isPaused: false, - }, - }); - }); - - // given the global account is not the global PDA - // it reverts with a ConstraintSeeds error - test("Global account is not the global PDA - reverts", async () => { - const fakeGlobal = PublicKey.unique(); - // if (fakeGlobal === $.getExtGlobalAccount()) return; - - // Copy the real global account data to the fake address so it deserializes properly - const realGlobalInfo = $.svm.getAccount($.getExtGlobalAccount()); - if (realGlobalInfo) { - $.svm.setAccount(fakeGlobal, realGlobalInfo); - } - - await $.expectAnchorError( - $.ext.methods - .unpause() - .accountsPartial({ - admin: $.admin.publicKey, - globalAccount: fakeGlobal, - }) - .signers([$.admin]) - .rpc(), - "ConstraintSeeds" - ); - }); - }); - describe("wrap_asset unit tests", () => { // wrap_asset test cases // [x] given the caller is not authorized (not in wrap_authorities) @@ -8083,8 +7975,6 @@ for (const [variant, tokenProgramId] of VARIANTS) { // [x] given an authorized caller signs // [x] given the amount is 0 // [x] it reverts with an InvalidAmount error - // [x] given the contract is paused - // [x] it reverts with a Paused error // [x] given the asset config cap is 0 (disabled) // [x] it reverts with an AssetNotAllowed error // [x] given the wrap would exceed the asset cap @@ -8187,30 +8077,6 @@ for (const [variant, tokenProgramId] of VARIANTS) { ); }); - // given the contract is paused - // it reverts with a Paused error - test("Wrap asset when paused - reverts", async () => { - await $.pause(); - - await $.expectAnchorError( - $.ext.methods - .wrapAsset(new BN(10_000_000)) - .accountsPartial({ - tokenAuthority: $.wrapAuthority.publicKey, - replaceAuthority: $.ext.programId, - assetMint: assetMint.publicKey, - assetConfig: $.getAssetConfigAccount(assetMint.publicKey), - fromAssetTokenAccount, - toExtTokenAccount, - assetTokenProgram: TOKEN_PROGRAM_ID, - extTokenProgram: $.extTokenProgram, - }) - .signers([$.wrapAuthority]) - .rpc(), - "Paused" - ); - }); - // given the asset config cap is 0 (disabled) // it reverts with an AssetCapExceeded error test("Wrap asset with zero cap - reverts", async () => { @@ -8422,8 +8288,6 @@ for (const [variant, tokenProgramId] of VARIANTS) { // [x] given an authorized caller signs the transaction // [x] given the m_amount is 0 // [x] it reverts with an InvalidAmount error - // [x] given the contract is paused - // [x] it reverts with a Paused error // [x] given the vault has insufficient asset backing for the conversion // [x] it reverts with an InsufficientAssetBacking error // [x] given valid inputs @@ -8528,42 +8392,6 @@ for (const [variant, tokenProgramId] of VARIANTS) { ); }); - // given the contract is paused - // it reverts with a Paused error - test("Unwrap asset when paused - reverts", async () => { - let fromMTokenAccount = await $.getATA( - $.mMint.publicKey, - $.wrapAuthority.publicKey, - ); - - let toAssetTokenAccount = await $.getATA( - assetMint.publicKey, - $.wrapAuthority.publicKey, - false - ); - - await $.pause(); - - await $.expectAnchorError( - $.ext.methods - .replaceAssetWithM(new BN(10_000_000)) - .accountsPartial({ - tokenAuthority: $.wrapAuthority.publicKey, - replaceAuthority: $.ext.programId, - mMint: $.mMint.publicKey, - assetMint: assetMint.publicKey, - assetConfig: $.getAssetConfigAccount(assetMint.publicKey), - fromMTokenAccount, - toAssetTokenAccount, - assetTokenProgram: TOKEN_PROGRAM_ID, - mTokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .signers([$.wrapAuthority]) - .rpc(), - "Paused" - ); - }); - // given the vault has insufficient asset backing for the conversion // it reverts with an InsufficientAssetBacking error test("Unwrap asset with insufficient backing - reverts", async () => { @@ -8759,6 +8587,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { fromExtTokenAccount, toMTokenAccount, extTokenProgram: $.extTokenProgram, + mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) .rpc(), From 691b18f8b595c0d2fc0e3bd37eb0da2d8c3e62a2 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:43:18 -0600 Subject: [PATCH 22/27] fix: added clearer relationship that JMI always requrires no-yield yet no-yield doesn't require JMI --- Makefile | 4 ++-- programs/m_ext/Cargo.toml | 2 +- programs/m_ext/src/lib.rs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 0029bd4..1faffdc 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ build-programs: @mv target/deploy/m_ext.so target/deploy/scaled_ui.so @mv target/idl/m_ext.json target/idl/scaled_ui.json @mv target/types/m_ext.ts target/types/scaled_ui.ts - anchor build -p m_ext -- --features jmi --no-default-features + anchor build -p m_ext -- --features jmi,no-yield --no-default-features @mv target/deploy/m_ext.so target/deploy/jmi.so @mv target/idl/m_ext.json target/idl/jmi.json @mv target/types/m_ext.ts target/types/jmi.ts @@ -27,7 +27,7 @@ endef build-test-programs: $(call update-program-id,3joDhmLtHLrSBGfeAe1xQiv3gjikes3x8S4N3o6Ld8zB) - anchor build -p m_ext -- --features jmi --no-default-features + anchor build -p m_ext -- --features jmi,no-yield --no-default-features @mv target/deploy/m_ext.so tests/programs/ext_a.so $(call update-program-id,HSMnbWEkB7sEQAGSzBPeACNUCXC9FgNeeESLnHtKfoy3) anchor build -p m_ext -- --features scaled-ui --no-default-features diff --git a/programs/m_ext/Cargo.toml b/programs/m_ext/Cargo.toml index e72de02..85261e0 100644 --- a/programs/m_ext/Cargo.toml +++ b/programs/m_ext/Cargo.toml @@ -13,7 +13,7 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] cpi = ["no-entrypoint"] -default = ["jmi"] +default = ["jmi", "no-yield"] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] # yield features diff --git a/programs/m_ext/src/lib.rs b/programs/m_ext/src/lib.rs index 062e1b4..d37076b 100644 --- a/programs/m_ext/src/lib.rs +++ b/programs/m_ext/src/lib.rs @@ -27,7 +27,7 @@ declare_id!("3C865D264L4NkAm78zfnDzQJJvXuU3fMjRUvRxyPi5da"); const _: () = { let yield_features = { cfg!(feature = "scaled-ui") as u32 - + cfg!(feature = "jmi") as u32 + + cfg!(feature = "no-yield") as u32 + cfg!(feature = "crank") as u32 }; @@ -46,7 +46,7 @@ const _: () = { } // JMI can only be used with no-yield (not scaled-ui or crank) - if cfg!(feature = "jmi") && (cfg!(feature = "scaled-ui") || cfg!(feature = "crank")) { + if cfg!(feature = "jmi") && cfg!(not(feature = "no-yield")) { panic!("JMI feature can only be enabled with no-yield variant"); } }; @@ -98,7 +98,7 @@ pub mod m_ext { RemoveWrapAuthority::handler(ctx, wrap_authority) } - #[cfg(any(feature = "scaled-ui", feature = "no-yield", feature = "jmi"))] + #[cfg(any(feature = "scaled-ui", feature = "no-yield"))] pub fn claim_fees(ctx: Context) -> Result<()> { ClaimFees::handler(ctx) } From b008a84f94d97012f4cb675fe8e74c4fe6a57ae0 Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:34:37 -0600 Subject: [PATCH 23/27] fix: removed token backing assertion, already reverts with insufficient funds --- programs/m_ext/src/instructions/unwrap.rs | 13 ------------- tests/unit/m_ext.test.ts | 14 ++++++++------ 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/programs/m_ext/src/instructions/unwrap.rs b/programs/m_ext/src/instructions/unwrap.rs index 4ed05ea..8cd4ec4 100644 --- a/programs/m_ext/src/instructions/unwrap.rs +++ b/programs/m_ext/src/instructions/unwrap.rs @@ -93,19 +93,6 @@ impl Unwrap<'_> { return err!(ExtError::InvalidAmount); } - // JMI: validate M backing - amount must not exceed (ext_supply - total_assets) - #[cfg(feature = "jmi")] - { - let m_backing = self - .ext_mint - .supply - .checked_sub(self.global_account.yield_config.total_assets) - .ok_or(ExtError::MathUnderflow)?; - if ext_principal > m_backing { - return err!(ExtError::InsufficientMBacking); - } - } - Ok(()) } diff --git a/tests/unit/m_ext.test.ts b/tests/unit/m_ext.test.ts index 9d34825..bd5f4af 100644 --- a/tests/unit/m_ext.test.ts +++ b/tests/unit/m_ext.test.ts @@ -8566,7 +8566,7 @@ for (const [variant, tokenProgramId] of VARIANTS) { }); // given ext_principal exceeds M backing - // it reverts with an InsufficientMBacking error + // it reverts with insufficient funds error from token program test("Unwrap exceeding M backing - reverts", async () => { // Get current ext balance (should have mWrapAmount + assetWrapAmount worth) const userExtAccount = await $.getATA( @@ -8578,8 +8578,8 @@ for (const [variant, tokenProgramId] of VARIANTS) { // Try to unwrap entire ext balance - but only mWrapAmount is backed by M // This should fail because some of the ext is backed by assets, not M - await $.expectAnchorError( - $.ext.methods + try { + await $.ext.methods .unwrap(userExtBalance) .accounts({ tokenAuthority: $.wrapAuthority.publicKey, @@ -8590,9 +8590,11 @@ for (const [variant, tokenProgramId] of VARIANTS) { mTokenProgram: TOKEN_2022_PROGRAM_ID, }) .signers([$.wrapAuthority]) - .rpc(), - "InsufficientMBacking" - ); + .rpc(); + throw new Error("Transaction should have reverted"); + } catch (e) { + expect(String(e)).toContain("insufficient funds"); + } }); // given ext_principal equals available M backing From 5789e43e2d594567934c0b6a550406cb004f51ac Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 29 Jan 2026 09:44:55 -0600 Subject: [PATCH 24/27] fix: removed unused error --- programs/m_ext/src/errors.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/programs/m_ext/src/errors.rs b/programs/m_ext/src/errors.rs index 7c62f32..6386f93 100644 --- a/programs/m_ext/src/errors.rs +++ b/programs/m_ext/src/errors.rs @@ -34,13 +34,10 @@ pub enum ExtError { InvalidTokenProgram, #[msg("Vault token account frozen.")] VaultFrozen, - #[msg("Asset not allowed for wrapping.")] AssetNotAllowed, #[msg("Asset cap would be exceeded.")] AssetCapExceeded, - #[msg("Insufficient M backing for unwrap.")] - InsufficientMBacking, #[msg("Cannot set cap for M token.")] CannotCapMToken, #[msg("Insufficient asset backing for replacement.")] From 8f12e0021e515260c8f2dd4b3209e9f34755697e Mon Sep 17 00:00:00 2001 From: Ian Harvey <16181275+ith-harvey@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:33:44 -0600 Subject: [PATCH 25/27] fix: added additional extension protections to set_cap --- programs/m_ext/src/errors.rs | 2 + .../src/instructions/jmi/set_asset_cap.rs | 13 +++ tests/programs/ext_a.so | Bin 479648 -> 484680 bytes tests/programs/ext_b.so | Bin 459472 -> 459464 bytes tests/programs/ext_c.so | Bin 479928 -> 484952 bytes tests/unit/ext_swap.test.ts | 7 +- tests/unit/ext_test_harness.ts | 82 ++++++++++++++++++ tests/unit/m_ext.test.ts | 81 +++++++++++++++++ 8 files changed, 181 insertions(+), 4 deletions(-) diff --git a/programs/m_ext/src/errors.rs b/programs/m_ext/src/errors.rs index 6386f93..511ac59 100644 --- a/programs/m_ext/src/errors.rs +++ b/programs/m_ext/src/errors.rs @@ -44,4 +44,6 @@ pub enum ExtError { InsufficientAssetBacking, #[msg("Asset must have 6 decimals.")] InvalidDecimals, + #[msg("Asset has unsupported Token 2022 extension.")] + UnsupportedExtension, } diff --git a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs index d04ce77..078b6b0 100644 --- a/programs/m_ext/src/instructions/jmi/set_asset_cap.rs +++ b/programs/m_ext/src/instructions/jmi/set_asset_cap.rs @@ -3,10 +3,12 @@ use anchor_spl::{ associated_token::AssociatedToken, token_interface::{Mint, TokenAccount, TokenInterface}, }; +use spl_token_2022::extension::ExtensionType; use crate::{ errors::ExtError, state::{AssetConfig, ExtGlobalV2, ASSET_CONFIG_SEED, EXT_GLOBAL_SEED, M_VAULT_SEED}, + utils::conversion::get_mint_extensions, }; #[derive(Accounts)] @@ -66,6 +68,17 @@ impl SetAssetCap<'_> { if self.asset_mint.decimals != 6 { return err!(ExtError::InvalidDecimals); } + // Reject assets with problematic Token 2022 extensions + let extensions = get_mint_extensions(&self.asset_mint)?; + if extensions.contains(&ExtensionType::ScaledUiAmount) { + return err!(ExtError::UnsupportedExtension); + } + if extensions.contains(&ExtensionType::TransferFeeConfig) { + return err!(ExtError::UnsupportedExtension); + } + if extensions.contains(&ExtensionType::NonTransferable) { + return err!(ExtError::UnsupportedExtension); + } Ok(()) } diff --git a/tests/programs/ext_a.so b/tests/programs/ext_a.so index ffb46a0bf426b224425cb9610dacad4f596a1d01..abb9d417d6ac840b9377eee35f001282fd2c514c 100755 GIT binary patch delta 64110 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 delta 61018 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 ToeoJJ>QMiGLn>TKheZB=*V@<9 delta 43660 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 diff --git a/tests/programs/ext_c.so b/tests/programs/ext_c.so index 135171bed56eeb744b4a56d04a34bfc0ad3c4dc3..024a2852ecc11aa47b9671fa7ac0da9f3025801d 100755 GIT binary patch delta 65049 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

XP60OX^+d_?IJm-~s{D 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

GF8)<1NCuJ*m-su(4JuCH6R|$ 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