From 3203b3998c33e43257178bada48cc65d1a810a8a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 21 Aug 2026 20:24:14 +0000 Subject: [PATCH 1/3] Keep an Anchor v1 copy of every Anchor example, tested in its own CI job Anchor v1 is expected to stay on long-term support, and many deployed programs will stay with it. Both versions of every Anchor example now ship. Every one of the 55 Anchor projects gains a sibling `anchor-v1/` directory holding the example exactly as it stood before the v2 port, restored from 94abbea, the last commit on main before that merge. 864 files, byte-identical to the baseline. The 17 third-party .so test fixtures are the same blobs already tracked under `anchor/`, so git stores one copy and the tree grows by ~2.3 MB of text rather than 18 MB. .github/workflows/anchor-v1.yml builds and tests them on Anchor 1.1.2 via avm. It is the workflow as it stood at 94abbea with project discovery changed to `find -type d -name "anchor-v1"`. The v2-only IDL workaround (anchor#4947, enum variants emitted as "fields") is deliberately not carried over: that bug does not exist in 1.1.2, so v1 builds generate IDLs normally. The `Anchor` workflow becomes `Anchor v2`, so the two checks read as a pair. Both match a directory name exactly, so neither can ever see the other's projects - which is also why `anchor-example/` in the nft-meta-data-pointer tree stays out of both. The anchor-v1 crates are not root workspace members and cannot be: each carries the same package name as its `anchor/` sibling, and one workspace cannot hold two packages called the same thing. They need no `exclude` entry either, since nothing in the root depends on them by path and each anchor-v1/Cargo.toml declares its own `[workspace]`. The root manifest comment now says so, so the omission does not read as an oversight. A bare `anchor build` was unambiguous while the repository had one Anchor and is not any more, so every Anchor README now names the CLI its commands need: `anchor/` pages say Anchor v2, `anchor-v1/` pages say Anchor v1. README.md and CONTRIBUTING.md, which sit above both, show both. Verified: 55 projects discovered per workflow with no overlap; all 864 restored blobs identical to baseline; all 55 anchor-v1 projects resolve to their own workspace root; no anchor-v1 crate entered the root workspace; cargo fmt and biome clean; and five representative v1 projects (favorites, escrow, token-extensions/basics, cutils, perpetual-futures) compile against anchor-lang 1.1.2. The LiteSVM tests need `anchor build` first and no SBF toolchain was available here, so CI is what proves those. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01BMDApPWRHM1StJwtyDSrEM --- .github/workflows/anchor-v1.yml | 372 + .github/workflows/anchor.yml | 10 +- CHANGELOG.md | 39 + CONTRIBUTING.md | 8 +- Cargo.toml | 9 + README.md | 7 +- basics/account-data/anchor-v1/Anchor.toml | 18 + basics/account-data/anchor-v1/CHANGELOG.md | 5 + basics/account-data/anchor-v1/Cargo.toml | 14 + basics/account-data/anchor-v1/README.md | 40 + .../anchor-program-example/Cargo.toml | 33 + .../anchor-program-example/Xargo.toml | 2 + .../src/instructions/create.rs | 32 + .../src/instructions/mod.rs | 2 + .../anchor-program-example/src/lib.rs | 22 + .../src/state/address_info.rs | 13 + .../anchor-program-example/src/state/mod.rs | 3 + .../tests/test_account_data.rs | 66 + basics/account-data/anchor/README.md | 6 + .../checking-accounts/anchor-v1/Anchor.toml | 16 + .../checking-accounts/anchor-v1/CHANGELOG.md | 5 + basics/checking-accounts/anchor-v1/Cargo.toml | 14 + basics/checking-accounts/anchor-v1/README.md | 40 + .../anchor-program-example/Cargo.toml | 33 + .../anchor-program-example/Xargo.toml | 2 + .../anchor-program-example/src/lib.rs | 30 + .../tests/test_checking_accounts.rs | 61 + basics/checking-accounts/anchor/README.md | 6 + basics/close-account/anchor-v1/Anchor.toml | 18 + basics/close-account/anchor-v1/CHANGELOG.md | 5 + basics/close-account/anchor-v1/Cargo.toml | 14 + basics/close-account/anchor-v1/README.md | 52 + .../programs/close-account/Cargo.toml | 32 + .../programs/close-account/Xargo.toml | 2 + .../src/instructions/close_user.rs | 23 + .../src/instructions/create_user.rs | 33 + .../close-account/src/instructions/mod.rs | 5 + .../programs/close-account/src/lib.rs | 19 + .../programs/close-account/src/state/mod.rs | 2 + .../programs/close-account/src/state/user.rs | 10 + .../close-account/tests/test_close_account.rs | 71 + basics/close-account/anchor/README.md | 6 + basics/counter/anchor-v1/.gitignore | 7 + basics/counter/anchor-v1/.prettierignore | 8 + basics/counter/anchor-v1/Anchor.toml | 18 + basics/counter/anchor-v1/CHANGELOG.md | 5 + basics/counter/anchor-v1/Cargo.toml | 14 + basics/counter/anchor-v1/README.md | 37 + .../programs/counter_anchor/Cargo.toml | 33 + .../programs/counter_anchor/Xargo.toml | 2 + .../src/instructions/increment.rs | 19 + .../src/instructions/initialize_counter.rs | 21 + .../counter_anchor/src/instructions/mod.rs | 5 + .../programs/counter_anchor/src/lib.rs | 31 + .../counter_anchor/tests/test_counter.rs | 143 + basics/counter/anchor/README.md | 6 + basics/create-account/anchor-v1/Anchor.toml | 18 + basics/create-account/anchor-v1/CHANGELOG.md | 5 + basics/create-account/anchor-v1/Cargo.toml | 14 + basics/create-account/anchor-v1/README.md | 40 + .../programs/create-system-account/Cargo.toml | 32 + .../programs/create-system-account/Xargo.toml | 2 + .../programs/create-system-account/src/lib.rs | 47 + .../tests/test_create_account.rs | 46 + basics/create-account/anchor/README.md | 6 + .../anchor-v1/.gitignore | 7 + .../anchor-v1/.prettierignore | 7 + .../anchor-v1/Anchor.toml | 19 + .../anchor-v1/CHANGELOG.md | 5 + .../anchor-v1/Cargo.toml | 14 + .../anchor-v1/README.md | 40 + .../anchor-v1/idls/lever.json | 68 + .../anchor-v1/programs/hand/Cargo.toml | 32 + .../anchor-v1/programs/hand/Xargo.toml | 2 + .../anchor-v1/programs/hand/src/lib.rs | 33 + .../programs/hand/tests/test_hand.rs | 130 + .../anchor-v1/programs/lever/Cargo.toml | 32 + .../anchor-v1/programs/lever/Xargo.toml | 2 + .../lever/src/instructions/initialize.rs | 16 + .../programs/lever/src/instructions/mod.rs | 5 + .../lever/src/instructions/switch_power.rs | 23 + .../anchor-v1/programs/lever/src/lib.rs | 28 + .../programs/lever/tests/test_lever.rs | 124 + .../cross-program-invocation/anchor/README.md | 6 + basics/favorites/anchor-v1/.gitignore | 9 + basics/favorites/anchor-v1/.prettierignore | 8 + basics/favorites/anchor-v1/Anchor.toml | 18 + basics/favorites/anchor-v1/CHANGELOG.md | 5 + basics/favorites/anchor-v1/Cargo.toml | 15 + basics/favorites/anchor-v1/README.md | 34 + .../anchor-v1/programs/favorites/Cargo.toml | 32 + .../anchor-v1/programs/favorites/Xargo.toml | 2 + .../anchor-v1/programs/favorites/src/lib.rs | 68 + .../favorites/tests/test_favorites.rs | 163 + basics/favorites/anchor/README.md | 6 + basics/hello-solana/anchor-v1/Anchor.toml | 18 + basics/hello-solana/anchor-v1/CHANGELOG.md | 5 + basics/hello-solana/anchor-v1/Cargo.toml | 14 + basics/hello-solana/anchor-v1/README.md | 40 + .../programs/hello-solana/Cargo.toml | 32 + .../programs/hello-solana/Xargo.toml | 2 + .../programs/hello-solana/src/lib.rs | 19 + .../programs/hello-solana/tests/test_hello.rs | 42 + basics/hello-solana/anchor/README.md | 6 + basics/pda-rent-payer/anchor-v1/Anchor.toml | 16 + basics/pda-rent-payer/anchor-v1/CHANGELOG.md | 5 + basics/pda-rent-payer/anchor-v1/Cargo.toml | 14 + basics/pda-rent-payer/anchor-v1/README.md | 40 + .../anchor-program-example/Cargo.toml | 32 + .../anchor-program-example/Xargo.toml | 2 + .../src/instructions/create_new_account.rs | 44 + .../src/instructions/init_rent_vault.rs | 37 + .../src/instructions/mod.rs | 5 + .../anchor-program-example/src/lib.rs | 21 + .../tests/test_pda_rent_payer.rs | 112 + basics/pda-rent-payer/anchor/README.md | 6 + .../anchor-v1/Anchor.toml | 16 + .../anchor-v1/CHANGELOG.md | 5 + .../anchor-v1/Cargo.toml | 14 + .../anchor-v1/README.md | 40 + .../processing-instructions/Cargo.toml | 32 + .../processing-instructions/Xargo.toml | 2 + .../processing-instructions/src/lib.rs | 28 + .../tests/test_processing_instructions.rs | 49 + .../processing-instructions/anchor/README.md | 6 + .../anchor-v1/Anchor.toml | 16 + .../anchor-v1/CHANGELOG.md | 5 + .../anchor-v1/Cargo.toml | 14 + .../anchor-v1/README.md | 40 + .../anchor-program-example/Cargo.toml | 33 + .../anchor-program-example/Xargo.toml | 2 + .../src/instructions/create.rs | 32 + .../src/instructions/increment.rs | 27 + .../src/instructions/mod.rs | 5 + .../anchor-program-example/src/lib.rs | 29 + .../anchor-program-example/src/state/mod.rs | 3 + .../src/state/page_visits.rs | 12 + .../tests/test_program_derived_addresses.rs | 100 + .../anchor/README.md | 6 + basics/pyth/anchor-v1/.gitignore | 5 + basics/pyth/anchor-v1/Anchor.toml | 18 + basics/pyth/anchor-v1/CHANGELOG.md | 5 + basics/pyth/anchor-v1/Cargo.toml | 14 + basics/pyth/anchor-v1/README.md | 55 + .../anchor-v1/programs/pythexample/Cargo.toml | 42 + .../anchor-v1/programs/pythexample/Xargo.toml | 2 + .../anchor-v1/programs/pythexample/src/lib.rs | 155 + .../programs/pythexample/tests/test_pyth.rs | 162 + basics/pyth/anchor/README.md | 6 + basics/realloc/anchor-v1/.gitignore | 8 + basics/realloc/anchor-v1/.prettierignore | 8 + basics/realloc/anchor-v1/Anchor.toml | 18 + basics/realloc/anchor-v1/CHANGELOG.md | 5 + basics/realloc/anchor-v1/Cargo.toml | 14 + basics/realloc/anchor-v1/README.md | 40 + .../programs/anchor-realloc/Cargo.toml | 33 + .../programs/anchor-realloc/Xargo.toml | 2 + .../src/instructions/initialize.rs | 23 + .../anchor-realloc/src/instructions/mod.rs | 5 + .../anchor-realloc/src/instructions/update.rs | 24 + .../programs/anchor-realloc/src/lib.rs | 38 + .../anchor-realloc/tests/test_realloc.rs | 177 + basics/realloc/anchor/README.md | 6 + basics/rent/anchor-v1/Anchor.toml | 16 + basics/rent/anchor-v1/CHANGELOG.md | 5 + basics/rent/anchor-v1/Cargo.toml | 14 + basics/rent/anchor-v1/README.md | 40 + .../programs/rent-example/Cargo.toml | 33 + .../programs/rent-example/Xargo.toml | 2 + .../programs/rent-example/src/lib.rs | 60 + .../programs/rent-example/tests/test_rent.rs | 76 + basics/rent/anchor/README.md | 6 + .../repository-layout/anchor-v1/Anchor.toml | 16 + .../repository-layout/anchor-v1/CHANGELOG.md | 5 + basics/repository-layout/anchor-v1/Cargo.toml | 14 + basics/repository-layout/anchor-v1/README.md | 40 + .../anchor-v1/programs/carnival/Cargo.toml | 32 + .../anchor-v1/programs/carnival/Xargo.toml | 2 + .../anchor-v1/programs/carnival/src/error.rs | 17 + .../carnival/src/instructions/eat_food.rs | 38 + .../carnival/src/instructions/get_on_ride.rs | 54 + .../programs/carnival/src/instructions/mod.rs | 3 + .../carnival/src/instructions/play_game.rs | 44 + .../anchor-v1/programs/carnival/src/lib.rs | 63 + .../programs/carnival/src/state/food.rs | 25 + .../programs/carnival/src/state/game.rs | 29 + .../programs/carnival/src/state/mod.rs | 3 + .../programs/carnival/src/state/ride.rs | 28 + .../programs/carnival/tests/test_carnival.rs | 161 + basics/repository-layout/anchor/README.md | 6 + basics/transfer-sol/anchor-v1/Anchor.toml | 16 + basics/transfer-sol/anchor-v1/CHANGELOG.md | 5 + basics/transfer-sol/anchor-v1/Cargo.toml | 14 + basics/transfer-sol/anchor-v1/README.md | 40 + .../programs/transfer-sol/Cargo.toml | 32 + .../programs/transfer-sol/Xargo.toml | 2 + .../transfer-sol/src/instructions/mod.rs | 5 + .../src/instructions/transfer_sol_with_cpi.rs | 26 + .../instructions/transfer_sol_with_program.rs | 44 + .../programs/transfer-sol/src/lib.rs | 25 + .../transfer-sol/tests/test_transfer_sol.rs | 146 + basics/transfer-sol/anchor/README.md | 6 + compression/cnft-burn/anchor-v1/.gitignore | 8 + .../cnft-burn/anchor-v1/.prettierignore | 8 + compression/cnft-burn/anchor-v1/Anchor.toml | 18 + compression/cnft-burn/anchor-v1/CHANGELOG.md | 5 + compression/cnft-burn/anchor-v1/Cargo.toml | 14 + compression/cnft-burn/anchor-v1/README.md | 34 + .../anchor-v1/programs/cnft-burn/Cargo.toml | 42 + .../anchor-v1/programs/cnft-burn/Xargo.toml | 2 + .../cnft-burn/src/instructions/burn_cnft.rs | 127 + .../cnft-burn/src/instructions/mod.rs | 3 + .../anchor-v1/programs/cnft-burn/src/lib.rs | 43 + .../programs/cnft-burn/tests/test_burn.rs | 460 + .../anchor-v1/tests/fixtures/README.md | 24 + .../anchor-v1/tests/fixtures/mpl_bubblegum.so | Bin 0 -> 1329808 bytes .../tests/fixtures/spl_account_compression.so | Bin 0 -> 2349040 bytes .../anchor-v1/tests/fixtures/spl_noop.so | Bin 0 -> 41056 bytes compression/cnft-burn/anchor/README.md | 6 + compression/cnft-vault/anchor-v1/.gitignore | 7 + compression/cnft-vault/anchor-v1/Anchor.toml | 18 + compression/cnft-vault/anchor-v1/CHANGELOG.md | 5 + compression/cnft-vault/anchor-v1/Cargo.toml | 14 + compression/cnft-vault/anchor-v1/README.md | 50 + .../anchor-v1/programs/cnft-vault/Cargo.toml | 42 + .../anchor-v1/programs/cnft-vault/Xargo.toml | 2 + .../programs/cnft-vault/src/error.rs | 9 + .../src/instructions/initialize_vault.rs | 27 + .../cnft-vault/src/instructions/mod.rs | 7 + .../src/instructions/withdraw_cnft.rs | 113 + .../src/instructions/withdraw_two_cnfts.rs | 195 + .../anchor-v1/programs/cnft-vault/src/lib.rs | 137 + .../programs/cnft-vault/src/state/mod.rs | 3 + .../programs/cnft-vault/src/state/vault.rs | 14 + .../programs/cnft-vault/tests/test_vault.rs | 768 ++ .../anchor-v1/tests/fixtures/README.md | 24 + .../anchor-v1/tests/fixtures/mpl_bubblegum.so | Bin 0 -> 1329808 bytes .../tests/fixtures/spl_account_compression.so | Bin 0 -> 2349040 bytes .../anchor-v1/tests/fixtures/spl_noop.so | Bin 0 -> 41056 bytes compression/cnft-vault/anchor/README.md | 6 + compression/cutils/anchor-v1/.gitignore | 8 + compression/cutils/anchor-v1/Anchor.toml | 18 + compression/cutils/anchor-v1/CHANGELOG.md | 5 + compression/cutils/anchor-v1/Cargo.toml | 14 + compression/cutils/anchor-v1/README.md | 44 + .../anchor-v1/programs/cutils/Cargo.toml | 44 + .../anchor-v1/programs/cutils/Xargo.toml | 2 + .../programs/cutils/src/bubblegum_types.rs | 117 + .../programs/cutils/src/instructions/mint.rs | 207 + .../programs/cutils/src/instructions/mod.rs | 5 + .../cutils/src/instructions/verify.rs | 79 + .../anchor-v1/programs/cutils/src/lib.rs | 52 + .../programs/cutils/tests/test_cutils.rs | 740 ++ .../cutils/anchor-v1/tests/fixtures/README.md | 30 + .../anchor-v1/tests/fixtures/mpl_bubblegum.so | Bin 0 -> 1329808 bytes .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../tests/fixtures/spl_account_compression.so | Bin 0 -> 2349040 bytes .../anchor-v1/tests/fixtures/spl_noop.so | Bin 0 -> 41056 bytes compression/cutils/anchor/README.md | 6 + docs/anchor-v2-migration.md | 6 + finance/betting-market/anchor-v1/.gitignore | 7 + finance/betting-market/anchor-v1/Anchor.toml | 18 + finance/betting-market/anchor-v1/CHANGELOG.md | 5 + finance/betting-market/anchor-v1/Cargo.toml | 15 + finance/betting-market/anchor-v1/README.md | 138 + .../programs/betting-market/Cargo.toml | 41 + .../programs/betting-market/Xargo.toml | 2 + .../programs/betting-market/src/error.rs | 37 + .../src/instructions/add_outcome.rs | 63 + .../src/instructions/cancel_event.rs | 33 + .../src/instructions/claim_refund.rs | 88 + .../src/instructions/claim_winnings.rs | 113 + .../src/instructions/close_losing_bet.rs | 51 + .../src/instructions/initialize_config.rs | 45 + .../src/instructions/initialize_event.rs | 78 + .../betting-market/src/instructions/mod.rs | 21 + .../src/instructions/place_bet.rs | 154 + .../src/instructions/settle_event.rs | 113 + .../betting-market/src/instructions/shared.rs | 55 + .../programs/betting-market/src/lib.rs | 73 + .../programs/betting-market/src/state/bet.rs | 17 + .../betting-market/src/state/config.rs | 16 + .../betting-market/src/state/event.rs | 34 + .../programs/betting-market/src/state/mod.rs | 11 + .../betting-market/src/state/outcome.rs | 16 + .../programs/betting-market/src/state/user.rs | 38 + .../tests/test_betting_market.rs | 894 ++ finance/betting-market/anchor/README.md | 6 + finance/escrow/anchor-v1/.gitignore | 7 + finance/escrow/anchor-v1/.prettierignore | 7 + finance/escrow/anchor-v1/Anchor.toml | 18 + finance/escrow/anchor-v1/CHANGELOG.md | 5 + finance/escrow/anchor-v1/Cargo.toml | 15 + finance/escrow/anchor-v1/README.md | 70 + .../anchor-v1/programs/escrow/Cargo.toml | 34 + .../anchor-v1/programs/escrow/Xargo.toml | 2 + .../anchor-v1/programs/escrow/src/error.rs | 7 + .../escrow/src/instructions/cancel_offer.rs | 83 + .../escrow/src/instructions/make_offer.rs | 99 + .../programs/escrow/src/instructions/mod.rs | 11 + .../escrow/src/instructions/shared.rs | 63 + .../escrow/src/instructions/take_offer.rs | 113 + .../anchor-v1/programs/escrow/src/lib.rs | 38 + .../programs/escrow/src/state/mod.rs | 3 + .../programs/escrow/src/state/offer.rs | 12 + .../programs/escrow/tests/test_escrow.rs | 491 + finance/escrow/anchor/README.md | 8 +- finance/lending/anchor-v1/Anchor.toml | 21 + finance/lending/anchor-v1/CHANGELOG.md | 55 + finance/lending/anchor-v1/Cargo.toml | 17 + finance/lending/anchor-v1/README.md | 212 + .../anchor-v1/programs/lending/Cargo.toml | 39 + .../anchor-v1/programs/lending/Xargo.toml | 2 + .../programs/lending/src/constants.rs | 43 + .../anchor-v1/programs/lending/src/errors.rs | 43 + .../admin/collect_protocol_fees.rs | 78 + .../admin/initialize_lending_market.rs | 40 + .../instructions/admin/initialize_reserve.rs | 82 + .../lending/src/instructions/admin/mod.rs | 11 + .../src/instructions/admin/set_price.rs | 50 + .../admin/update_reserve_config.rs | 28 + .../borrow_obligation_liquidity.rs | 121 + .../deposit_obligation_collateral.rs | 78 + .../instructions/deposit_reserve_liquidity.rs | 100 + .../src/instructions/initialize_obligation.rs | 40 + .../src/instructions/liquidate_obligation.rs | 223 + .../programs/lending/src/instructions/mod.rs | 23 + .../instructions/redeem_reserve_collateral.rs | 103 + .../src/instructions/refresh_obligation.rs | 144 + .../src/instructions/refresh_reserve.rs | 16 + .../repay_obligation_liquidity.rs | 100 + .../withdraw_obligation_collateral.rs | 135 + .../anchor-v1/programs/lending/src/lib.rs | 108 + .../anchor-v1/programs/lending/src/math.rs | 101 + .../lending/src/state/lending_market.rs | 22 + .../programs/lending/src/state/mod.rs | 9 + .../programs/lending/src/state/obligation.rs | 124 + .../programs/lending/src/state/price_feed.rs | 65 + .../programs/lending/src/state/reserve.rs | 276 + .../programs/lending/tests/common/mod.rs | 755 ++ .../lending/tests/test_borrow_repay.rs | 152 + .../lending/tests/test_deposit_redeem.rs | 61 + .../programs/lending/tests/test_interest.rs | 109 + .../lending/tests/test_liquidation.rs | 138 + .../programs/lending/tests/test_reserve.rs | 133 + .../programs/lending/tests/test_rounding.rs | 106 + .../programs/lending/tests/test_security.rs | 78 + finance/lending/anchor/README.md | 6 + finance/order-book/anchor-v1/.gitignore | 7 + finance/order-book/anchor-v1/Anchor.toml | 22 + finance/order-book/anchor-v1/CHANGELOG.md | 5 + finance/order-book/anchor-v1/Cargo.toml | 13 + finance/order-book/anchor-v1/README.md | 1635 +++ .../anchor-v1/programs/order-book/Cargo.toml | 41 + .../programs/order-book/src/errors.rs | 73 + .../order-book/src/instructions/admin/mod.rs | 3 + .../src/instructions/admin/withdraw_fees.rs | 77 + .../src/instructions/cancel_order.rs | 98 + .../src/instructions/initialize_market.rs | 124 + .../instructions/initialize_market_user.rs | 34 + .../order-book/src/instructions/mod.rs | 13 + .../src/instructions/place_order.rs | 511 + .../src/instructions/settle_funds.rs | 118 + .../anchor-v1/programs/order-book/src/lib.rs | 80 + .../programs/order-book/src/state/market.rs | 68 + .../order-book/src/state/market_user.rs | 38 + .../programs/order-book/src/state/matching.rs | 95 + .../programs/order-book/src/state/mod.rs | 12 + .../programs/order-book/src/state/order.rs | 45 + .../order-book/src/state/order_book.rs | 258 + .../src/state/slab/LICENSE-OPENBOOK | 26 + .../order-book/src/state/slab/iterator.rs | 88 + .../programs/order-book/src/state/slab/mod.rs | 18 + .../order-book/src/state/slab/nodes.rs | 337 + .../order-book/src/state/slab/ordertree.rs | 346 + .../order-book/tests/test_order_book.rs | 2100 +++ finance/order-book/anchor/README.md | 6 + .../perpetual-futures/anchor-v1/.gitignore | 6 + .../perpetual-futures/anchor-v1/Anchor.toml | 26 + .../perpetual-futures/anchor-v1/CHANGELOG.md | 30 + .../perpetual-futures/anchor-v1/Cargo.toml | 14 + finance/perpetual-futures/anchor-v1/README.md | 241 + .../anchor-v1/TERMINOLOGY.md | 36 + .../programs/mock-switchboard/Cargo.toml | 26 + .../programs/mock-switchboard/src/lib.rs | 105 + .../programs/perpetual-futures/Cargo.toml | 50 + .../perpetual-futures/src/constants.rs | 51 + .../programs/perpetual-futures/src/errors.rs | 61 + .../src/instructions/add_liquidity.rs | 144 + .../src/instructions/close_position.rs | 144 + .../src/instructions/collect_fees.rs | 82 + .../src/instructions/initialize_pool.rs | 162 + .../src/instructions/liquidate_position.rs | 172 + .../perpetual-futures/src/instructions/mod.rs | 18 + .../src/instructions/open_position.rs | 176 + .../src/instructions/remove_liquidity.rs | 148 + .../src/instructions/set_funding_rate.rs | 37 + .../src/instructions/shared.rs | 224 + .../programs/perpetual-futures/src/lib.rs | 91 + .../perpetual-futures/src/state/mod.rs | 6 + .../perpetual-futures/src/state/oracle.rs | 112 + .../perpetual-futures/src/state/pool.rs | 99 + .../perpetual-futures/src/state/position.rs | 52 + .../tests/test_perpetual_futures.rs | 1203 ++ finance/perpetual-futures/anchor/README.md | 6 + finance/prop-amm/anchor-v1/.gitignore | 6 + finance/prop-amm/anchor-v1/Anchor.toml | 26 + finance/prop-amm/anchor-v1/CHANGELOG.md | 25 + finance/prop-amm/anchor-v1/Cargo.toml | 14 + finance/prop-amm/anchor-v1/README.md | 182 + .../programs/mock-switchboard/Cargo.toml | 26 + .../programs/mock-switchboard/src/lib.rs | 105 + .../anchor-v1/programs/prop-amm/Cargo.toml | 47 + .../programs/prop-amm/src/constants.rs | 26 + .../anchor-v1/programs/prop-amm/src/errors.rs | 46 + .../src/instructions/deposit_inventory.rs | 108 + .../src/instructions/initialize_market.rs | 131 + .../programs/prop-amm/src/instructions/mod.rs | 11 + .../prop-amm/src/instructions/set_quote.rs | 44 + .../prop-amm/src/instructions/swap.rs | 251 + .../src/instructions/withdraw_inventory.rs | 137 + .../anchor-v1/programs/prop-amm/src/lib.rs | 83 + .../programs/prop-amm/src/quote_math.rs | 141 + .../programs/prop-amm/src/state/market.rs | 70 + .../programs/prop-amm/src/state/mod.rs | 4 + .../programs/prop-amm/src/state/oracle.rs | 114 + .../programs/prop-amm/tests/test_prop_amm.rs | 758 ++ finance/prop-amm/anchor/README.md | 6 + .../token-fundraiser/anchor-v1/Anchor.toml | 21 + .../token-fundraiser/anchor-v1/CHANGELOG.md | 5 + finance/token-fundraiser/anchor-v1/Cargo.toml | 14 + finance/token-fundraiser/anchor-v1/README.md | 165 + .../anchor-v1/programs/fundraiser/Cargo.toml | 40 + .../anchor-v1/programs/fundraiser/Xargo.toml | 2 + .../programs/fundraiser/src/constants.rs | 4 + .../programs/fundraiser/src/error.rs | 25 + .../fundraiser/src/instructions/checker.rs | 101 + .../fundraiser/src/instructions/close.rs | 131 + .../fundraiser/src/instructions/contribute.rs | 136 + .../src/instructions/initialize_fundraiser.rs | 71 + .../fundraiser/src/instructions/mod.rs | 11 + .../fundraiser/src/instructions/refund.rs | 113 + .../anchor-v1/programs/fundraiser/src/lib.rs | 56 + .../fundraiser/src/state/contributor.rs | 9 + .../fundraiser/src/state/fundraiser.rs | 13 + .../programs/fundraiser/src/state/mod.rs | 5 + .../fundraiser/tests/test_fundraiser.rs | 963 ++ finance/token-fundraiser/anchor/README.md | 6 + finance/token-swap/anchor-v1/Anchor.toml | 23 + finance/token-swap/anchor-v1/CHANGELOG.md | 5 + finance/token-swap/anchor-v1/Cargo.toml | 15 + finance/token-swap/anchor-v1/README.md | 55 + .../anchor-v1/programs/token-swap/Cargo.toml | 37 + .../anchor-v1/programs/token-swap/Xargo.toml | 2 + .../programs/token-swap/src/constants.rs | 20 + .../programs/token-swap/src/errors.rs | 88 + .../instructions/admin/claim_admin_fees.rs | 184 + .../token-swap/src/instructions/admin/mod.rs | 3 + .../src/instructions/deposit_liquidity.rs | 346 + .../src/instructions/initialize_config.rs | 48 + .../src/instructions/initialize_pool.rs | 103 + .../token-swap/src/instructions/mod.rs | 13 + .../src/instructions/swap_tokens.rs | 360 + .../src/instructions/withdraw_liquidity.rs | 244 + .../anchor-v1/programs/token-swap/src/lib.rs | 72 + .../programs/token-swap/src/state/config.rs | 34 + .../programs/token-swap/src/state/mod.rs | 5 + .../token-swap/src/state/pool_config.rs | 42 + .../programs/token-swap/tests/test_swap.rs | 1574 +++ finance/token-swap/anchor/README.md | 6 + finance/vault-strategy/anchor-v1/.gitignore | 6 + finance/vault-strategy/anchor-v1/Anchor.toml | 19 + finance/vault-strategy/anchor-v1/CHANGELOG.md | 27 + finance/vault-strategy/anchor-v1/Cargo.toml | 15 + finance/vault-strategy/anchor-v1/PRODUCT.md | 76 + finance/vault-strategy/anchor-v1/README.md | 174 + .../vault-strategy/anchor-v1/app/.env.example | 20 + .../vault-strategy/anchor-v1/app/.gitignore | 13 + finance/vault-strategy/anchor-v1/app/.npmrc | 5 + .../vault-strategy/anchor-v1/app/README.md | 77 + .../vault-strategy/anchor-v1/app/index.html | 19 + .../vault-strategy/anchor-v1/app/package.json | 37 + .../anchor-v1/app/pnpm-lock.yaml | 10942 ++++++++++++++++ .../anchor-v1/app/pnpm-workspace.yaml | 15 + .../anchor-v1/app/postcss.config.js | 6 + .../vault-strategy/anchor-v1/app/preview.html | 19 + .../anchor-v1/app/scripts/verify-client.mjs | 145 + .../vault-strategy/anchor-v1/app/src/App.tsx | 73 + .../app/src/components/ActionTicket.tsx | 208 + .../app/src/components/Allocation.tsx | 140 + .../anchor-v1/app/src/components/Header.tsx | 29 + .../app/src/components/ManagerView.tsx | 427 + .../anchor-v1/app/src/components/atoms.tsx | 205 + .../anchor-v1/app/src/components/states.tsx | 53 + .../anchor-v1/app/src/hooks/useVault.ts | 186 + .../anchor-v1/app/src/idl/vaultStrategy.ts | 51 + .../anchor-v1/app/src/idl/vault_strategy.json | 1316 ++ .../anchor-v1/app/src/index.css | 87 + .../anchor-v1/app/src/lib/amounts.ts | 70 + .../anchor-v1/app/src/lib/tx.ts | 46 + .../vault-strategy/anchor-v1/app/src/main.tsx | 29 + .../anchor-v1/app/src/preview.tsx | 139 + .../anchor-v1/app/src/solana/config.ts | 37 + .../anchor-v1/app/src/solana/format.ts | 53 + .../anchor-v1/app/src/solana/instructions.ts | 291 + .../anchor-v1/app/src/solana/pdas.ts | 67 + .../anchor-v1/app/src/solana/program.ts | 54 + .../anchor-v1/app/src/solana/pyth.ts | 45 + .../anchor-v1/app/src/solana/strategy.ts | 206 + .../anchor-v1/app/src/views/InvestorView.tsx | 122 + .../anchor-v1/app/src/vite-env.d.ts | 14 + .../anchor-v1/app/tailwind.config.ts | 38 + .../anchor-v1/app/tsconfig.json | 23 + .../anchor-v1/app/tsconfig.node.json | 16 + .../anchor-v1/app/vite.config.ts | 14 + .../programs/mock-swap-router/Cargo.toml | 34 + .../programs/mock-swap-router/Xargo.toml | 2 + .../programs/mock-swap-router/src/error.rs | 17 + .../src/instructions/initialize_router.rs | 43 + .../mock-swap-router/src/instructions/mod.rs | 9 + .../src/instructions/set_rate.rs | 66 + .../src/instructions/swap_asset_for_usdc.rs | 120 + .../src/instructions/swap_usdc_for_asset.rs | 119 + .../programs/mock-swap-router/src/lib.rs | 54 + .../mock-swap-router/src/state/asset_rate.rs | 12 + .../mock-swap-router/src/state/mod.rs | 5 + .../src/state/router_config.rs | 9 + .../programs/vault-strategy/Cargo.toml | 36 + .../programs/vault-strategy/Xargo.toml | 2 + .../programs/vault-strategy/src/error.rs | 57 + .../src/instructions/add_asset.rs | 90 + .../src/instructions/approve_asset.rs | 43 + .../src/instructions/collect_fees.rs | 105 + .../src/instructions/deposit.rs | 271 + .../src/instructions/initialize_registry.rs | 30 + .../src/instructions/initialize_strategy.rs | 101 + .../vault-strategy/src/instructions/mod.rs | 19 + .../src/instructions/rebalance.rs | 217 + .../src/instructions/set_weight.rs | 50 + .../src/instructions/withdraw.rs | 198 + .../programs/vault-strategy/src/lib.rs | 91 + .../programs/vault-strategy/src/oracle.rs | 112 + .../programs/vault-strategy/src/state/mod.rs | 5 + .../vault-strategy/src/state/registry.rs | 32 + .../vault-strategy/src/state/strategy.rs | 81 + .../vault-strategy/tests/vault_strategy.rs | 1405 ++ finance/vault-strategy/anchor/README.md | 6 + tokens/create-token/anchor-v1/Anchor.toml | 21 + tokens/create-token/anchor-v1/CHANGELOG.md | 5 + tokens/create-token/anchor-v1/Cargo.toml | 14 + tokens/create-token/anchor-v1/README.md | 40 + tokens/create-token/anchor-v1/prepare.mjs | 34 + .../programs/create-token/Cargo.toml | 35 + .../programs/create-token/Xargo.toml | 2 + .../programs/create-token/src/lib.rs | 93 + .../create-token/tests/test_create_token.rs | 145 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/create-token/anchor/README.md | 6 + .../anchor-v1/Anchor.toml | 18 + .../anchor-v1/CHANGELOG.md | 5 + .../anchor-v1/Cargo.toml | 12 + .../anchor-v1/README.md | 43 + .../external-delegate-token-master/Cargo.toml | 39 + .../external-delegate-token-master/Xargo.toml | 2 + .../src/instructions/authority_transfer.rs | 54 + .../src/instructions/initialize.rs | 26 + .../src/instructions/mod.rs | 9 + .../src/instructions/set_ethereum_address.rs | 20 + .../src/instructions/transfer_tokens.rs | 80 + .../external-delegate-token-master/src/lib.rs | 106 + .../tests/test_external_delegate.rs | 515 + .../anchor/README.md | 6 + tokens/nft-minter/anchor-v1/Anchor.toml | 22 + tokens/nft-minter/anchor-v1/CHANGELOG.md | 5 + tokens/nft-minter/anchor-v1/Cargo.toml | 13 + tokens/nft-minter/anchor-v1/README.md | 40 + tokens/nft-minter/anchor-v1/prepare.mjs | 34 + .../anchor-v1/programs/nft-minter/Cargo.toml | 34 + .../anchor-v1/programs/nft-minter/Xargo.toml | 2 + .../anchor-v1/programs/nft-minter/src/lib.rs | 146 + .../nft-minter/tests/test_nft_minter.rs | 145 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/nft-minter/anchor/README.md | 6 + tokens/nft-operations/anchor-v1/Anchor.toml | 24 + tokens/nft-operations/anchor-v1/CHANGELOG.md | 5 + tokens/nft-operations/anchor-v1/Cargo.toml | 14 + tokens/nft-operations/anchor-v1/README.md | 401 + tokens/nft-operations/anchor-v1/prepare.mjs | 35 + .../anchor-v1/programs/mint-nft/Cargo.toml | 34 + .../anchor-v1/programs/mint-nft/Xargo.toml | 2 + .../anchor-v1/programs/mint-nft/src/error.rs | 11 + .../src/instructions/create_collection.rs | 152 + .../mint-nft/src/instructions/mint_nft.rs | 157 + .../programs/mint-nft/src/instructions/mod.rs | 27 + .../src/instructions/verify_collection.rs | 77 + .../anchor-v1/programs/mint-nft/src/lib.rs | 50 + .../mint-nft/tests/test_nft_operations.rs | 372 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/nft-operations/anchor/README.md | 6 + .../pda-mint-authority/anchor-v1/Anchor.toml | 20 + .../pda-mint-authority/anchor-v1/CHANGELOG.md | 5 + .../pda-mint-authority/anchor-v1/Cargo.toml | 13 + tokens/pda-mint-authority/anchor-v1/README.md | 41 + .../pda-mint-authority/anchor-v1/prepare.mjs | 34 + .../programs/token-minter/Cargo.toml | 34 + .../programs/token-minter/Xargo.toml | 2 + .../token-minter/src/instructions/create.rs | 92 + .../token-minter/src/instructions/mint.rs | 74 + .../token-minter/src/instructions/mod.rs | 5 + .../programs/token-minter/src/lib.rs | 27 + .../token-minter/tests/test_pda_mint.rs | 161 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/pda-mint-authority/anchor/README.md | 6 + .../basics/anchor-v1/.gitignore | 7 + .../basics/anchor-v1/.prettierignore | 8 + .../basics/anchor-v1/Anchor.toml | 17 + .../basics/anchor-v1/Cargo.toml | 14 + .../basics/anchor-v1/README.md | 40 + .../anchor-v1/programs/basics/Cargo.toml | 34 + .../anchor-v1/programs/basics/Xargo.toml | 2 + .../create_associated_token_account.rs | 25 + .../basics/src/instructions/create_token.rs | 25 + .../src/instructions/create_token_account.rs | 25 + .../basics/src/instructions/mint_token.rs | 26 + .../programs/basics/src/instructions/mod.rs | 11 + .../basics/src/instructions/transfer_token.rs | 38 + .../anchor-v1/programs/basics/src/lib.rs | 34 + .../programs/basics/tests/test_basics.rs | 169 + .../token-extensions/basics/anchor/README.md | 6 + .../cpi-guard/anchor-v1/.gitignore | 7 + .../cpi-guard/anchor-v1/.prettierignore | 7 + .../cpi-guard/anchor-v1/Anchor.toml | 18 + .../cpi-guard/anchor-v1/Cargo.toml | 14 + .../cpi-guard/anchor-v1/README.md | 40 + .../anchor-v1/programs/cpi-guard/Cargo.toml | 34 + .../anchor-v1/programs/cpi-guard/Xargo.toml | 2 + .../anchor-v1/programs/cpi-guard/src/lib.rs | 56 + .../cpi-guard/tests/test_cpi_guard.rs | 205 + .../cpi-guard/anchor/README.md | 6 + .../anchor-v1/.gitignore | 7 + .../anchor-v1/.prettierignore | 7 + .../anchor-v1/Anchor.toml | 18 + .../anchor-v1/Cargo.toml | 14 + .../default-account-state/anchor-v1/README.md | 40 + .../programs/default-account-state/Cargo.toml | 34 + .../programs/default-account-state/Xargo.toml | 2 + .../src/instructions/initialize.rs | 76 + .../src/instructions/mod.rs | 5 + .../src/instructions/update_default_state.rs | 41 + .../programs/default-account-state/src/lib.rs | 43 + .../tests/test_default_account_state.rs | 165 + .../default-account-state/anchor/README.md | 6 + .../group/anchor-v1/.gitignore | 7 + .../group/anchor-v1/.prettierignore | 7 + .../group/anchor-v1/Anchor.toml | 18 + .../group/anchor-v1/Cargo.toml | 14 + .../group/anchor-v1/README.md | 40 + .../group/anchor-v1/programs/group/Cargo.toml | 34 + .../group/anchor-v1/programs/group/Xargo.toml | 2 + .../programs/group/src/instructions/mod.rs | 3 + .../src/instructions/test_initialize_group.rs | 66 + .../group/anchor-v1/programs/group/src/lib.rs | 16 + .../programs/group/tests/test_group.rs | 50 + .../token-extensions/group/anchor/README.md | 6 + .../immutable-owner/anchor-v1/.gitignore | 7 + .../immutable-owner/anchor-v1/.prettierignore | 7 + .../immutable-owner/anchor-v1/Anchor.toml | 18 + .../immutable-owner/anchor-v1/Cargo.toml | 14 + .../immutable-owner/anchor-v1/README.md | 39 + .../programs/immutable-owner/Cargo.toml | 34 + .../programs/immutable-owner/Xargo.toml | 2 + .../programs/immutable-owner/src/lib.rs | 75 + .../tests/test_immutable_owner.rs | 106 + .../immutable-owner/anchor/README.md | 6 + .../interest-bearing/anchor-v1/.gitignore | 7 + .../anchor-v1/.prettierignore | 7 + .../interest-bearing/anchor-v1/Anchor.toml | 18 + .../interest-bearing/anchor-v1/Cargo.toml | 14 + .../interest-bearing/anchor-v1/README.md | 40 + .../programs/interest-bearing/Cargo.toml | 35 + .../programs/interest-bearing/Xargo.toml | 2 + .../src/instructions/initialize.rs | 80 + .../interest-bearing/src/instructions/mod.rs | 5 + .../src/instructions/update_rate.rs | 37 + .../programs/interest-bearing/src/lib.rs | 42 + .../tests/test_interest_bearing.rs | 72 + .../interest-bearing/anchor/README.md | 6 + .../memo-transfer/anchor-v1/.gitignore | 7 + .../memo-transfer/anchor-v1/.prettierignore | 7 + .../memo-transfer/anchor-v1/Anchor.toml | 18 + .../memo-transfer/anchor-v1/Cargo.toml | 14 + .../memo-transfer/anchor-v1/README.md | 40 + .../programs/memo-transfer/Cargo.toml | 34 + .../programs/memo-transfer/Xargo.toml | 2 + .../memo-transfer/src/instructions/disable.rs | 27 + .../src/instructions/initialize.rs | 67 + .../memo-transfer/src/instructions/mod.rs | 5 + .../programs/memo-transfer/src/lib.rs | 19 + .../memo-transfer/tests/test_memo_transfer.rs | 239 + .../anchor-v1/tests/fixtures/spl_memo.so | Bin 0 -> 74800 bytes .../memo-transfer/anchor/README.md | 6 + .../metadata/anchor-v1/.gitignore | 7 + .../metadata/anchor-v1/.prettierignore | 7 + .../metadata/anchor-v1/Anchor.toml | 18 + .../metadata/anchor-v1/Cargo.toml | 14 + .../metadata/anchor-v1/README.md | 39 + .../anchor-v1/programs/metadata/Cargo.toml | 36 + .../anchor-v1/programs/metadata/Xargo.toml | 2 + .../metadata/src/instructions/emit.rs | 28 + .../metadata/src/instructions/initialize.rs | 80 + .../programs/metadata/src/instructions/mod.rs | 10 + .../metadata/src/instructions/remove_key.rs | 38 + .../src/instructions/update_authority.rs | 44 + .../metadata/src/instructions/update_field.rs | 127 + .../anchor-v1/programs/metadata/src/lib.rs | 33 + .../programs/metadata/tests/test_metadata.rs | 174 + .../metadata/anchor/README.md | 6 + .../mint-close-authority/anchor-v1/.gitignore | 7 + .../anchor-v1/.prettierignore | 7 + .../anchor-v1/Anchor.toml | 18 + .../mint-close-authority/anchor-v1/Cargo.toml | 14 + .../mint-close-authority/anchor-v1/README.md | 39 + .../programs/mint-close-authority/Cargo.toml | 28 + .../programs/mint-close-authority/Xargo.toml | 2 + .../src/instructions/close.rs | 32 + .../src/instructions/initialize.rs | 50 + .../src/instructions/mod.rs | 5 + .../programs/mint-close-authority/src/lib.rs | 19 + .../tests/test_mint_close_authority.rs | 127 + .../mint-close-authority/anchor/README.md | 6 + .../anchor-example/anchor-v1/.gitignore | 7 + .../anchor-example/anchor-v1/.prettierignore | 8 + .../anchor-example/anchor-v1/Anchor.toml | 16 + .../anchor-example/anchor-v1/Cargo.toml | 14 + .../anchor-example/anchor-v1/README.md | 21 + .../anchor-example/anchor-v1/package.json | 12 + .../anchor-example/anchor-v1/pnpm-lock.yaml | 9 + .../programs/extension_nft/Cargo.toml | 49 + .../programs/extension_nft/Xargo.toml | 2 + .../programs/extension_nft/src/constants.rs | 10 + .../programs/extension_nft/src/errors.rs | 15 + .../src/instructions/chop_tree.rs | 106 + .../src/instructions/init_player.rs | 45 + .../src/instructions/mint_nft.rs | 214 + .../extension_nft/src/instructions/mod.rs | 8 + .../programs/extension_nft/src/lib.rs | 49 + .../extension_nft/src/state/game_data.rs | 32 + .../programs/extension_nft/src/state/mod.rs | 2 + .../extension_nft/src/state/player_data.rs | 79 + .../extension_nft/tests/test_extension_nft.rs | 225 + .../anchor-example/anchor-v1/rustfmt.toml | 11 + .../anchor-example/anchor/README.md | 6 + .../non-transferable/anchor-v1/.gitignore | 7 + .../anchor-v1/.prettierignore | 7 + .../non-transferable/anchor-v1/Anchor.toml | 18 + .../non-transferable/anchor-v1/Cargo.toml | 14 + .../non-transferable/anchor-v1/README.md | 39 + .../programs/non-transferable/Cargo.toml | 28 + .../programs/non-transferable/Xargo.toml | 2 + .../programs/non-transferable/src/lib.rs | 77 + .../tests/test_non_transferable.rs | 107 + .../non-transferable/anchor/README.md | 6 + .../permanent-delegate/anchor-v1/.gitignore | 7 + .../anchor-v1/.prettierignore | 7 + .../permanent-delegate/anchor-v1/Anchor.toml | 18 + .../permanent-delegate/anchor-v1/Cargo.toml | 14 + .../permanent-delegate/anchor-v1/README.md | 39 + .../programs/permanent-delegate/Cargo.toml | 35 + .../programs/permanent-delegate/Xargo.toml | 2 + .../src/instructions/initialize.rs | 50 + .../src/instructions/mod.rs | 3 + .../programs/permanent-delegate/src/lib.rs | 15 + .../tests/test_permanent_delegate.rs | 134 + .../permanent-delegate/anchor/README.md | 6 + .../transfer-fee/anchor-v1/.gitignore | 7 + .../transfer-fee/anchor-v1/.prettierignore | 7 + .../transfer-fee/anchor-v1/Anchor.toml | 18 + .../transfer-fee/anchor-v1/Cargo.toml | 14 + .../transfer-fee/anchor-v1/README.md | 40 + .../programs/transfer-fee/Cargo.toml | 28 + .../programs/transfer-fee/Xargo.toml | 2 + .../transfer-fee/src/instructions/harvest.rs | 40 + .../src/instructions/initialize.rs | 114 + .../transfer-fee/src/instructions/mod.rs | 10 + .../transfer-fee/src/instructions/transfer.rs | 80 + .../src/instructions/update_fee.rs | 34 + .../transfer-fee/src/instructions/withdraw.rs | 31 + .../programs/transfer-fee/src/lib.rs | 39 + .../transfer-fee/tests/test_transfer_fee.rs | 172 + .../transfer-fee/anchor/README.md | 6 + .../account-data-as-seed/anchor-v1/.gitignore | 8 + .../anchor-v1/.prettierignore | 8 + .../anchor-v1/Anchor.toml | 18 + .../account-data-as-seed/anchor-v1/Cargo.toml | 14 + .../account-data-as-seed/anchor-v1/README.md | 135 + .../programs/transfer-hook/Cargo.toml | 37 + .../programs/transfer-hook/Xargo.toml | 2 + .../initialize_extra_account_meta_list.rs | 51 + .../transfer-hook/src/instructions/mod.rs | 5 + .../src/instructions/transfer_hook.rs | 47 + .../programs/transfer-hook/src/lib.rs | 95 + .../transfer-hook/tests/test_transfer_hook.rs | 154 + .../account-data-as-seed/anchor/README.md | 6 + .../anchor-v1/.gitignore | 13 + .../anchor-v1/.prettierignore | 7 + .../anchor-v1/Anchor.toml | 18 + .../anchor-v1/Cargo.toml | 14 + .../anchor-v1/README.md | 41 + .../anchor-v1/programs/abl-token/Cargo.toml | 43 + .../anchor-v1/programs/abl-token/Xargo.toml | 2 + .../programs/abl-token/src/constants.rs | 3 + .../programs/abl-token/src/errors.rs | 16 + .../src/instructions/attach_to_mint.rs | 59 + .../abl-token/src/instructions/change_mode.rs | 106 + .../abl-token/src/instructions/init_config.rs | 30 + .../abl-token/src/instructions/init_mint.rs | 130 + .../abl-token/src/instructions/init_wallet.rs | 44 + .../abl-token/src/instructions/mod.rs | 15 + .../src/instructions/remove_wallet.rs | 30 + .../abl-token/src/instructions/tx_hook.rs | 119 + .../anchor-v1/programs/abl-token/src/lib.rs | 52 + .../anchor-v1/programs/abl-token/src/state.rs | 52 + .../anchor-v1/programs/abl-token/src/utils.rs | 31 + .../abl-token/tests/test_abl_token.rs | 86 + .../anchor-v1/src/abl-token-exports.ts | 36 + .../anchor-v1/src/index.ts | 1 + .../allow-block-list-token/anchor/README.md | 6 + .../counter/anchor-v1/.gitignore | 8 + .../counter/anchor-v1/.prettierignore | 8 + .../counter/anchor-v1/Anchor.toml | 18 + .../counter/anchor-v1/Cargo.toml | 14 + .../transfer-hook/counter/anchor-v1/README.md | 40 + .../programs/transfer-hook/Cargo.toml | 37 + .../programs/transfer-hook/Xargo.toml | 2 + .../initialize_extra_account_meta_list.rs | 51 + .../transfer-hook/src/instructions/mod.rs | 5 + .../src/instructions/transfer_hook.rs | 47 + .../programs/transfer-hook/src/lib.rs | 84 + .../tests/test_transfer_hook_counter.rs | 154 + .../transfer-hook/counter/anchor/README.md | 6 + .../hello-world/anchor-v1/.gitignore | 8 + .../hello-world/anchor-v1/.prettierignore | 8 + .../hello-world/anchor-v1/Anchor.toml | 23 + .../hello-world/anchor-v1/Cargo.toml | 14 + .../hello-world/anchor-v1/README.md | 40 + .../programs/transfer-hook/Cargo.toml | 37 + .../programs/transfer-hook/Xargo.toml | 2 + .../src/instructions/initialize.rs | 64 + .../initialize_extra_account_meta_list.rs | 46 + .../transfer-hook/src/instructions/mod.rs | 7 + .../src/instructions/transfer_hook.rs | 31 + .../programs/transfer-hook/src/lib.rs | 75 + .../transfer-hook/tests/test_transfer_hook.rs | 154 + .../hello-world/anchor/README.md | 6 + .../transfer-cost/anchor-v1/.gitignore | 8 + .../transfer-cost/anchor-v1/.prettierignore | 8 + .../transfer-cost/anchor-v1/Anchor.toml | 18 + .../transfer-cost/anchor-v1/Cargo.toml | 14 + .../transfer-cost/anchor-v1/README.md | 40 + .../programs/transfer-hook/Cargo.toml | 38 + .../programs/transfer-hook/Xargo.toml | 2 + .../initialize_extra_account_meta_list.rs | 44 + .../transfer-hook/src/instructions/mod.rs | 5 + .../src/instructions/transfer_hook.rs | 103 + .../programs/transfer-hook/src/lib.rs | 149 + .../transfer-hook/tests/test_transfer_hook.rs | 84 + .../transfer-cost/anchor/README.md | 6 + .../transfer-switch/anchor-v1/.gitignore | 8 + .../transfer-switch/anchor-v1/Anchor.toml | 18 + .../transfer-switch/anchor-v1/Cargo.toml | 14 + .../transfer-switch/anchor-v1/README.md | 40 + .../programs/transfer-switch/Cargo.toml | 37 + .../programs/transfer-switch/Xargo.toml | 2 + .../programs/transfer-switch/src/error.rs | 10 + .../src/instructions/configure_admin.rs | 49 + .../initialise_extra_account_metas_list.rs | 82 + .../transfer-switch/src/instructions/mod.rs | 9 + .../src/instructions/switch.rs | 54 + .../src/instructions/transfer_hook.rs | 72 + .../programs/transfer-switch/src/lib.rs | 41 + .../programs/transfer-switch/src/state.rs | 19 + .../tests/test_transfer_switch.rs | 190 + .../transfer-switch/anchor/README.md | 6 + .../whitelist/anchor-v1/.gitignore | 8 + .../whitelist/anchor-v1/.prettierignore | 8 + .../whitelist/anchor-v1/Anchor.toml | 23 + .../whitelist/anchor-v1/Cargo.toml | 14 + .../whitelist/anchor-v1/README.md | 11 + .../programs/transfer-hook/Cargo.toml | 37 + .../programs/transfer-hook/Xargo.toml | 2 + .../src/instructions/add_to_whitelist.rs | 39 + .../initialize_extra_account_meta_list.rs | 46 + .../transfer-hook/src/instructions/mod.rs | 7 + .../src/instructions/transfer_hook.rs | 42 + .../programs/transfer-hook/src/lib.rs | 92 + .../transfer-hook/tests/test_transfer_hook.rs | 138 + .../transfer-hook/whitelist/anchor/README.md | 6 + tokens/token-minter/anchor-v1/Anchor.toml | 20 + tokens/token-minter/anchor-v1/CHANGELOG.md | 5 + tokens/token-minter/anchor-v1/Cargo.toml | 14 + tokens/token-minter/anchor-v1/README.md | 41 + tokens/token-minter/anchor-v1/prepare.mjs | 34 + .../programs/token-minter/Cargo.toml | 34 + .../programs/token-minter/Xargo.toml | 2 + .../token-minter/src/instructions/create.rs | 81 + .../token-minter/src/instructions/mint.rs | 64 + .../token-minter/src/instructions/mod.rs | 5 + .../programs/token-minter/src/lib.rs | 28 + .../token-minter/tests/test_token_minter.rs | 196 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/token-minter/anchor/README.md | 6 + tokens/transfer-tokens/anchor-v1/Anchor.toml | 20 + tokens/transfer-tokens/anchor-v1/CHANGELOG.md | 5 + tokens/transfer-tokens/anchor-v1/Cargo.toml | 14 + tokens/transfer-tokens/anchor-v1/README.md | 42 + tokens/transfer-tokens/anchor-v1/prepare.mjs | 34 + .../programs/transfer-tokens/Cargo.toml | 34 + .../programs/transfer-tokens/Xargo.toml | 2 + .../src/instructions/create.rs | 82 + .../transfer-tokens/src/instructions/mint.rs | 65 + .../transfer-tokens/src/instructions/mod.rs | 7 + .../src/instructions/transfer.rs | 85 + .../programs/transfer-tokens/src/lib.rs | 37 + .../tests/test_transfer_tokens.rs | 197 + .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes tokens/transfer-tokens/anchor/README.md | 6 + 926 files changed, 68122 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/anchor-v1.yml create mode 100644 basics/account-data/anchor-v1/Anchor.toml create mode 100644 basics/account-data/anchor-v1/CHANGELOG.md create mode 100644 basics/account-data/anchor-v1/Cargo.toml create mode 100644 basics/account-data/anchor-v1/README.md create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/Cargo.toml create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/Xargo.toml create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/create.rs create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/src/lib.rs create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/src/state/address_info.rs create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/src/state/mod.rs create mode 100644 basics/account-data/anchor-v1/programs/anchor-program-example/tests/test_account_data.rs create mode 100644 basics/checking-accounts/anchor-v1/Anchor.toml create mode 100644 basics/checking-accounts/anchor-v1/CHANGELOG.md create mode 100644 basics/checking-accounts/anchor-v1/Cargo.toml create mode 100644 basics/checking-accounts/anchor-v1/README.md create mode 100644 basics/checking-accounts/anchor-v1/programs/anchor-program-example/Cargo.toml create mode 100644 basics/checking-accounts/anchor-v1/programs/anchor-program-example/Xargo.toml create mode 100644 basics/checking-accounts/anchor-v1/programs/anchor-program-example/src/lib.rs create mode 100644 basics/checking-accounts/anchor-v1/programs/anchor-program-example/tests/test_checking_accounts.rs create mode 100644 basics/close-account/anchor-v1/Anchor.toml create mode 100644 basics/close-account/anchor-v1/CHANGELOG.md create mode 100644 basics/close-account/anchor-v1/Cargo.toml create mode 100644 basics/close-account/anchor-v1/README.md create mode 100644 basics/close-account/anchor-v1/programs/close-account/Cargo.toml create mode 100644 basics/close-account/anchor-v1/programs/close-account/Xargo.toml create mode 100644 basics/close-account/anchor-v1/programs/close-account/src/instructions/close_user.rs create mode 100644 basics/close-account/anchor-v1/programs/close-account/src/instructions/create_user.rs create mode 100644 basics/close-account/anchor-v1/programs/close-account/src/instructions/mod.rs create mode 100644 basics/close-account/anchor-v1/programs/close-account/src/lib.rs create mode 100644 basics/close-account/anchor-v1/programs/close-account/src/state/mod.rs create mode 100644 basics/close-account/anchor-v1/programs/close-account/src/state/user.rs create mode 100644 basics/close-account/anchor-v1/programs/close-account/tests/test_close_account.rs create mode 100644 basics/counter/anchor-v1/.gitignore create mode 100644 basics/counter/anchor-v1/.prettierignore create mode 100644 basics/counter/anchor-v1/Anchor.toml create mode 100644 basics/counter/anchor-v1/CHANGELOG.md create mode 100644 basics/counter/anchor-v1/Cargo.toml create mode 100644 basics/counter/anchor-v1/README.md create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/Cargo.toml create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/Xargo.toml create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/src/instructions/increment.rs create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/src/instructions/initialize_counter.rs create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/src/instructions/mod.rs create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/src/lib.rs create mode 100644 basics/counter/anchor-v1/programs/counter_anchor/tests/test_counter.rs create mode 100644 basics/create-account/anchor-v1/Anchor.toml create mode 100644 basics/create-account/anchor-v1/CHANGELOG.md create mode 100644 basics/create-account/anchor-v1/Cargo.toml create mode 100644 basics/create-account/anchor-v1/README.md create mode 100644 basics/create-account/anchor-v1/programs/create-system-account/Cargo.toml create mode 100644 basics/create-account/anchor-v1/programs/create-system-account/Xargo.toml create mode 100644 basics/create-account/anchor-v1/programs/create-system-account/src/lib.rs create mode 100644 basics/create-account/anchor-v1/programs/create-system-account/tests/test_create_account.rs create mode 100644 basics/cross-program-invocation/anchor-v1/.gitignore create mode 100644 basics/cross-program-invocation/anchor-v1/.prettierignore create mode 100644 basics/cross-program-invocation/anchor-v1/Anchor.toml create mode 100644 basics/cross-program-invocation/anchor-v1/CHANGELOG.md create mode 100644 basics/cross-program-invocation/anchor-v1/Cargo.toml create mode 100644 basics/cross-program-invocation/anchor-v1/README.md create mode 100644 basics/cross-program-invocation/anchor-v1/idls/lever.json create mode 100644 basics/cross-program-invocation/anchor-v1/programs/hand/Cargo.toml create mode 100644 basics/cross-program-invocation/anchor-v1/programs/hand/Xargo.toml create mode 100644 basics/cross-program-invocation/anchor-v1/programs/hand/src/lib.rs create mode 100644 basics/cross-program-invocation/anchor-v1/programs/hand/tests/test_hand.rs create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/Cargo.toml create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/Xargo.toml create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/initialize.rs create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/mod.rs create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/switch_power.rs create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/src/lib.rs create mode 100644 basics/cross-program-invocation/anchor-v1/programs/lever/tests/test_lever.rs create mode 100644 basics/favorites/anchor-v1/.gitignore create mode 100644 basics/favorites/anchor-v1/.prettierignore create mode 100644 basics/favorites/anchor-v1/Anchor.toml create mode 100644 basics/favorites/anchor-v1/CHANGELOG.md create mode 100644 basics/favorites/anchor-v1/Cargo.toml create mode 100644 basics/favorites/anchor-v1/README.md create mode 100644 basics/favorites/anchor-v1/programs/favorites/Cargo.toml create mode 100644 basics/favorites/anchor-v1/programs/favorites/Xargo.toml create mode 100644 basics/favorites/anchor-v1/programs/favorites/src/lib.rs create mode 100644 basics/favorites/anchor-v1/programs/favorites/tests/test_favorites.rs create mode 100644 basics/hello-solana/anchor-v1/Anchor.toml create mode 100644 basics/hello-solana/anchor-v1/CHANGELOG.md create mode 100644 basics/hello-solana/anchor-v1/Cargo.toml create mode 100644 basics/hello-solana/anchor-v1/README.md create mode 100644 basics/hello-solana/anchor-v1/programs/hello-solana/Cargo.toml create mode 100644 basics/hello-solana/anchor-v1/programs/hello-solana/Xargo.toml create mode 100644 basics/hello-solana/anchor-v1/programs/hello-solana/src/lib.rs create mode 100644 basics/hello-solana/anchor-v1/programs/hello-solana/tests/test_hello.rs create mode 100644 basics/pda-rent-payer/anchor-v1/Anchor.toml create mode 100644 basics/pda-rent-payer/anchor-v1/CHANGELOG.md create mode 100644 basics/pda-rent-payer/anchor-v1/Cargo.toml create mode 100644 basics/pda-rent-payer/anchor-v1/README.md create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Cargo.toml create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Xargo.toml create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/create_new_account.rs create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/init_rent_vault.rs create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/lib.rs create mode 100644 basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/tests/test_pda_rent_payer.rs create mode 100644 basics/processing-instructions/anchor-v1/Anchor.toml create mode 100644 basics/processing-instructions/anchor-v1/CHANGELOG.md create mode 100644 basics/processing-instructions/anchor-v1/Cargo.toml create mode 100644 basics/processing-instructions/anchor-v1/README.md create mode 100644 basics/processing-instructions/anchor-v1/programs/processing-instructions/Cargo.toml create mode 100644 basics/processing-instructions/anchor-v1/programs/processing-instructions/Xargo.toml create mode 100644 basics/processing-instructions/anchor-v1/programs/processing-instructions/src/lib.rs create mode 100644 basics/processing-instructions/anchor-v1/programs/processing-instructions/tests/test_processing_instructions.rs create mode 100644 basics/program-derived-addresses/anchor-v1/Anchor.toml create mode 100644 basics/program-derived-addresses/anchor-v1/CHANGELOG.md create mode 100644 basics/program-derived-addresses/anchor-v1/Cargo.toml create mode 100644 basics/program-derived-addresses/anchor-v1/README.md create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Cargo.toml create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Xargo.toml create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/create.rs create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/increment.rs create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/lib.rs create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/mod.rs create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/page_visits.rs create mode 100644 basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/tests/test_program_derived_addresses.rs create mode 100644 basics/pyth/anchor-v1/.gitignore create mode 100644 basics/pyth/anchor-v1/Anchor.toml create mode 100644 basics/pyth/anchor-v1/CHANGELOG.md create mode 100644 basics/pyth/anchor-v1/Cargo.toml create mode 100644 basics/pyth/anchor-v1/README.md create mode 100644 basics/pyth/anchor-v1/programs/pythexample/Cargo.toml create mode 100644 basics/pyth/anchor-v1/programs/pythexample/Xargo.toml create mode 100644 basics/pyth/anchor-v1/programs/pythexample/src/lib.rs create mode 100644 basics/pyth/anchor-v1/programs/pythexample/tests/test_pyth.rs create mode 100644 basics/realloc/anchor-v1/.gitignore create mode 100644 basics/realloc/anchor-v1/.prettierignore create mode 100644 basics/realloc/anchor-v1/Anchor.toml create mode 100644 basics/realloc/anchor-v1/CHANGELOG.md create mode 100644 basics/realloc/anchor-v1/Cargo.toml create mode 100644 basics/realloc/anchor-v1/README.md create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/Cargo.toml create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/Xargo.toml create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/initialize.rs create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/mod.rs create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/update.rs create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/src/lib.rs create mode 100644 basics/realloc/anchor-v1/programs/anchor-realloc/tests/test_realloc.rs create mode 100644 basics/rent/anchor-v1/Anchor.toml create mode 100644 basics/rent/anchor-v1/CHANGELOG.md create mode 100644 basics/rent/anchor-v1/Cargo.toml create mode 100644 basics/rent/anchor-v1/README.md create mode 100644 basics/rent/anchor-v1/programs/rent-example/Cargo.toml create mode 100644 basics/rent/anchor-v1/programs/rent-example/Xargo.toml create mode 100644 basics/rent/anchor-v1/programs/rent-example/src/lib.rs create mode 100644 basics/rent/anchor-v1/programs/rent-example/tests/test_rent.rs create mode 100644 basics/repository-layout/anchor-v1/Anchor.toml create mode 100644 basics/repository-layout/anchor-v1/CHANGELOG.md create mode 100644 basics/repository-layout/anchor-v1/Cargo.toml create mode 100644 basics/repository-layout/anchor-v1/README.md create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/Cargo.toml create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/Xargo.toml create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/error.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/instructions/eat_food.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/instructions/get_on_ride.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/instructions/mod.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/instructions/play_game.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/lib.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/state/food.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/state/game.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/state/mod.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/src/state/ride.rs create mode 100644 basics/repository-layout/anchor-v1/programs/carnival/tests/test_carnival.rs create mode 100644 basics/transfer-sol/anchor-v1/Anchor.toml create mode 100644 basics/transfer-sol/anchor-v1/CHANGELOG.md create mode 100644 basics/transfer-sol/anchor-v1/Cargo.toml create mode 100644 basics/transfer-sol/anchor-v1/README.md create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/Cargo.toml create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/Xargo.toml create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/mod.rs create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/src/lib.rs create mode 100644 basics/transfer-sol/anchor-v1/programs/transfer-sol/tests/test_transfer_sol.rs create mode 100644 compression/cnft-burn/anchor-v1/.gitignore create mode 100644 compression/cnft-burn/anchor-v1/.prettierignore create mode 100644 compression/cnft-burn/anchor-v1/Anchor.toml create mode 100644 compression/cnft-burn/anchor-v1/CHANGELOG.md create mode 100644 compression/cnft-burn/anchor-v1/Cargo.toml create mode 100644 compression/cnft-burn/anchor-v1/README.md create mode 100644 compression/cnft-burn/anchor-v1/programs/cnft-burn/Cargo.toml create mode 100644 compression/cnft-burn/anchor-v1/programs/cnft-burn/Xargo.toml create mode 100644 compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/burn_cnft.rs create mode 100644 compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/mod.rs create mode 100644 compression/cnft-burn/anchor-v1/programs/cnft-burn/src/lib.rs create mode 100644 compression/cnft-burn/anchor-v1/programs/cnft-burn/tests/test_burn.rs create mode 100644 compression/cnft-burn/anchor-v1/tests/fixtures/README.md create mode 100644 compression/cnft-burn/anchor-v1/tests/fixtures/mpl_bubblegum.so create mode 100644 compression/cnft-burn/anchor-v1/tests/fixtures/spl_account_compression.so create mode 100644 compression/cnft-burn/anchor-v1/tests/fixtures/spl_noop.so create mode 100644 compression/cnft-vault/anchor-v1/.gitignore create mode 100644 compression/cnft-vault/anchor-v1/Anchor.toml create mode 100644 compression/cnft-vault/anchor-v1/CHANGELOG.md create mode 100644 compression/cnft-vault/anchor-v1/Cargo.toml create mode 100644 compression/cnft-vault/anchor-v1/README.md create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/Cargo.toml create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/Xargo.toml create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/error.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/initialize_vault.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/mod.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_cnft.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/lib.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/mod.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/vault.rs create mode 100644 compression/cnft-vault/anchor-v1/programs/cnft-vault/tests/test_vault.rs create mode 100644 compression/cnft-vault/anchor-v1/tests/fixtures/README.md create mode 100644 compression/cnft-vault/anchor-v1/tests/fixtures/mpl_bubblegum.so create mode 100644 compression/cnft-vault/anchor-v1/tests/fixtures/spl_account_compression.so create mode 100644 compression/cnft-vault/anchor-v1/tests/fixtures/spl_noop.so create mode 100644 compression/cutils/anchor-v1/.gitignore create mode 100644 compression/cutils/anchor-v1/Anchor.toml create mode 100644 compression/cutils/anchor-v1/CHANGELOG.md create mode 100644 compression/cutils/anchor-v1/Cargo.toml create mode 100644 compression/cutils/anchor-v1/README.md create mode 100644 compression/cutils/anchor-v1/programs/cutils/Cargo.toml create mode 100644 compression/cutils/anchor-v1/programs/cutils/Xargo.toml create mode 100644 compression/cutils/anchor-v1/programs/cutils/src/bubblegum_types.rs create mode 100644 compression/cutils/anchor-v1/programs/cutils/src/instructions/mint.rs create mode 100644 compression/cutils/anchor-v1/programs/cutils/src/instructions/mod.rs create mode 100644 compression/cutils/anchor-v1/programs/cutils/src/instructions/verify.rs create mode 100644 compression/cutils/anchor-v1/programs/cutils/src/lib.rs create mode 100644 compression/cutils/anchor-v1/programs/cutils/tests/test_cutils.rs create mode 100644 compression/cutils/anchor-v1/tests/fixtures/README.md create mode 100644 compression/cutils/anchor-v1/tests/fixtures/mpl_bubblegum.so create mode 100644 compression/cutils/anchor-v1/tests/fixtures/mpl_token_metadata.so create mode 100644 compression/cutils/anchor-v1/tests/fixtures/spl_account_compression.so create mode 100644 compression/cutils/anchor-v1/tests/fixtures/spl_noop.so create mode 100644 finance/betting-market/anchor-v1/.gitignore create mode 100644 finance/betting-market/anchor-v1/Anchor.toml create mode 100644 finance/betting-market/anchor-v1/CHANGELOG.md create mode 100644 finance/betting-market/anchor-v1/Cargo.toml create mode 100644 finance/betting-market/anchor-v1/README.md create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/Cargo.toml create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/Xargo.toml create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/error.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/add_outcome.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/cancel_event.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_refund.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_winnings.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/close_losing_bet.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_config.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_event.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/mod.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/place_bet.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/settle_event.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/instructions/shared.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/lib.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/state/bet.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/state/config.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/state/event.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/state/mod.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/state/outcome.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/src/state/user.rs create mode 100644 finance/betting-market/anchor-v1/programs/betting-market/tests/test_betting_market.rs create mode 100644 finance/escrow/anchor-v1/.gitignore create mode 100644 finance/escrow/anchor-v1/.prettierignore create mode 100644 finance/escrow/anchor-v1/Anchor.toml create mode 100644 finance/escrow/anchor-v1/CHANGELOG.md create mode 100644 finance/escrow/anchor-v1/Cargo.toml create mode 100644 finance/escrow/anchor-v1/README.md create mode 100644 finance/escrow/anchor-v1/programs/escrow/Cargo.toml create mode 100644 finance/escrow/anchor-v1/programs/escrow/Xargo.toml create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/error.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/instructions/cancel_offer.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/instructions/make_offer.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/instructions/mod.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/instructions/shared.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/instructions/take_offer.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/lib.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/state/mod.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/src/state/offer.rs create mode 100644 finance/escrow/anchor-v1/programs/escrow/tests/test_escrow.rs create mode 100644 finance/lending/anchor-v1/Anchor.toml create mode 100644 finance/lending/anchor-v1/CHANGELOG.md create mode 100644 finance/lending/anchor-v1/Cargo.toml create mode 100644 finance/lending/anchor-v1/README.md create mode 100644 finance/lending/anchor-v1/programs/lending/Cargo.toml create mode 100644 finance/lending/anchor-v1/programs/lending/Xargo.toml create mode 100644 finance/lending/anchor-v1/programs/lending/src/constants.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/errors.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/admin/collect_protocol_fees.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_lending_market.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_reserve.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/admin/mod.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/admin/set_price.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/admin/update_reserve_config.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/borrow_obligation_liquidity.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/deposit_obligation_collateral.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/deposit_reserve_liquidity.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/initialize_obligation.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/liquidate_obligation.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/mod.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/redeem_reserve_collateral.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/refresh_obligation.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/refresh_reserve.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/repay_obligation_liquidity.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/instructions/withdraw_obligation_collateral.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/lib.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/math.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/state/lending_market.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/state/mod.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/state/obligation.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/state/price_feed.rs create mode 100644 finance/lending/anchor-v1/programs/lending/src/state/reserve.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/common/mod.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_borrow_repay.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_deposit_redeem.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_interest.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_liquidation.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_reserve.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_rounding.rs create mode 100644 finance/lending/anchor-v1/programs/lending/tests/test_security.rs create mode 100644 finance/order-book/anchor-v1/.gitignore create mode 100644 finance/order-book/anchor-v1/Anchor.toml create mode 100644 finance/order-book/anchor-v1/CHANGELOG.md create mode 100644 finance/order-book/anchor-v1/Cargo.toml create mode 100644 finance/order-book/anchor-v1/README.md create mode 100644 finance/order-book/anchor-v1/programs/order-book/Cargo.toml create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/errors.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/mod.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/withdraw_fees.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/cancel_order.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market_user.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/mod.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/place_order.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/instructions/settle_funds.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/lib.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/market.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/market_user.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/matching.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/mod.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/order.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/order_book.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/slab/LICENSE-OPENBOOK create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/slab/iterator.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/slab/mod.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/slab/nodes.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/src/state/slab/ordertree.rs create mode 100644 finance/order-book/anchor-v1/programs/order-book/tests/test_order_book.rs create mode 100644 finance/perpetual-futures/anchor-v1/.gitignore create mode 100644 finance/perpetual-futures/anchor-v1/Anchor.toml create mode 100644 finance/perpetual-futures/anchor-v1/CHANGELOG.md create mode 100644 finance/perpetual-futures/anchor-v1/Cargo.toml create mode 100644 finance/perpetual-futures/anchor-v1/README.md create mode 100644 finance/perpetual-futures/anchor-v1/TERMINOLOGY.md create mode 100644 finance/perpetual-futures/anchor-v1/programs/mock-switchboard/Cargo.toml create mode 100644 finance/perpetual-futures/anchor-v1/programs/mock-switchboard/src/lib.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/Cargo.toml create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/constants.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/errors.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/add_liquidity.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/close_position.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/collect_fees.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/initialize_pool.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/liquidate_position.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/mod.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/open_position.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/remove_liquidity.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/set_funding_rate.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/shared.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/lib.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/mod.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/oracle.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/pool.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/position.rs create mode 100644 finance/perpetual-futures/anchor-v1/programs/perpetual-futures/tests/test_perpetual_futures.rs create mode 100644 finance/prop-amm/anchor-v1/.gitignore create mode 100644 finance/prop-amm/anchor-v1/Anchor.toml create mode 100644 finance/prop-amm/anchor-v1/CHANGELOG.md create mode 100644 finance/prop-amm/anchor-v1/Cargo.toml create mode 100644 finance/prop-amm/anchor-v1/README.md create mode 100644 finance/prop-amm/anchor-v1/programs/mock-switchboard/Cargo.toml create mode 100644 finance/prop-amm/anchor-v1/programs/mock-switchboard/src/lib.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/Cargo.toml create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/constants.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/errors.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/deposit_inventory.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/initialize_market.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/mod.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/set_quote.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/swap.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/withdraw_inventory.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/lib.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/quote_math.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/state/market.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/state/mod.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/src/state/oracle.rs create mode 100644 finance/prop-amm/anchor-v1/programs/prop-amm/tests/test_prop_amm.rs create mode 100644 finance/token-fundraiser/anchor-v1/Anchor.toml create mode 100644 finance/token-fundraiser/anchor-v1/CHANGELOG.md create mode 100644 finance/token-fundraiser/anchor-v1/Cargo.toml create mode 100644 finance/token-fundraiser/anchor-v1/README.md create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/Cargo.toml create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/Xargo.toml create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/constants.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/error.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/checker.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/close.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/contribute.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/initialize_fundraiser.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/mod.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/refund.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/lib.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/contributor.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/fundraiser.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/mod.rs create mode 100644 finance/token-fundraiser/anchor-v1/programs/fundraiser/tests/test_fundraiser.rs create mode 100644 finance/token-swap/anchor-v1/Anchor.toml create mode 100644 finance/token-swap/anchor-v1/CHANGELOG.md create mode 100644 finance/token-swap/anchor-v1/Cargo.toml create mode 100644 finance/token-swap/anchor-v1/README.md create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/Cargo.toml create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/Xargo.toml create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/constants.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/errors.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/claim_admin_fees.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/mod.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/deposit_liquidity.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_config.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_pool.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/mod.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/swap_tokens.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/instructions/withdraw_liquidity.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/lib.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/state/config.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/state/mod.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/src/state/pool_config.rs create mode 100644 finance/token-swap/anchor-v1/programs/token-swap/tests/test_swap.rs create mode 100644 finance/vault-strategy/anchor-v1/.gitignore create mode 100644 finance/vault-strategy/anchor-v1/Anchor.toml create mode 100644 finance/vault-strategy/anchor-v1/CHANGELOG.md create mode 100644 finance/vault-strategy/anchor-v1/Cargo.toml create mode 100644 finance/vault-strategy/anchor-v1/PRODUCT.md create mode 100644 finance/vault-strategy/anchor-v1/README.md create mode 100644 finance/vault-strategy/anchor-v1/app/.env.example create mode 100644 finance/vault-strategy/anchor-v1/app/.gitignore create mode 100644 finance/vault-strategy/anchor-v1/app/.npmrc create mode 100644 finance/vault-strategy/anchor-v1/app/README.md create mode 100644 finance/vault-strategy/anchor-v1/app/index.html create mode 100644 finance/vault-strategy/anchor-v1/app/package.json create mode 100644 finance/vault-strategy/anchor-v1/app/pnpm-lock.yaml create mode 100644 finance/vault-strategy/anchor-v1/app/pnpm-workspace.yaml create mode 100644 finance/vault-strategy/anchor-v1/app/postcss.config.js create mode 100644 finance/vault-strategy/anchor-v1/app/preview.html create mode 100644 finance/vault-strategy/anchor-v1/app/scripts/verify-client.mjs create mode 100644 finance/vault-strategy/anchor-v1/app/src/App.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/components/ActionTicket.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/components/Allocation.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/components/Header.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/components/ManagerView.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/components/atoms.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/components/states.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/hooks/useVault.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/idl/vaultStrategy.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/idl/vault_strategy.json create mode 100644 finance/vault-strategy/anchor-v1/app/src/index.css create mode 100644 finance/vault-strategy/anchor-v1/app/src/lib/amounts.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/lib/tx.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/main.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/preview.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/config.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/format.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/instructions.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/pdas.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/program.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/pyth.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/solana/strategy.ts create mode 100644 finance/vault-strategy/anchor-v1/app/src/views/InvestorView.tsx create mode 100644 finance/vault-strategy/anchor-v1/app/src/vite-env.d.ts create mode 100644 finance/vault-strategy/anchor-v1/app/tailwind.config.ts create mode 100644 finance/vault-strategy/anchor-v1/app/tsconfig.json create mode 100644 finance/vault-strategy/anchor-v1/app/tsconfig.node.json create mode 100644 finance/vault-strategy/anchor-v1/app/vite.config.ts create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/Cargo.toml create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/Xargo.toml create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/error.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/initialize_router.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/mod.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/set_rate.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/lib.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/asset_rate.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/mod.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/router_config.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/Cargo.toml create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/Xargo.toml create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/error.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/add_asset.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/approve_asset.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/collect_fees.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/deposit.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_registry.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_strategy.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/mod.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/rebalance.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/set_weight.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/withdraw.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/lib.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/oracle.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/mod.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/registry.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/strategy.rs create mode 100644 finance/vault-strategy/anchor-v1/programs/vault-strategy/tests/vault_strategy.rs create mode 100644 tokens/create-token/anchor-v1/Anchor.toml create mode 100644 tokens/create-token/anchor-v1/CHANGELOG.md create mode 100644 tokens/create-token/anchor-v1/Cargo.toml create mode 100644 tokens/create-token/anchor-v1/README.md create mode 100644 tokens/create-token/anchor-v1/prepare.mjs create mode 100644 tokens/create-token/anchor-v1/programs/create-token/Cargo.toml create mode 100644 tokens/create-token/anchor-v1/programs/create-token/Xargo.toml create mode 100644 tokens/create-token/anchor-v1/programs/create-token/src/lib.rs create mode 100644 tokens/create-token/anchor-v1/programs/create-token/tests/test_create_token.rs create mode 100644 tokens/create-token/anchor-v1/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/external-delegate-token-master/anchor-v1/Anchor.toml create mode 100644 tokens/external-delegate-token-master/anchor-v1/CHANGELOG.md create mode 100644 tokens/external-delegate-token-master/anchor-v1/Cargo.toml create mode 100644 tokens/external-delegate-token-master/anchor-v1/README.md create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Cargo.toml create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Xargo.toml create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/authority_transfer.rs create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/initialize.rs create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/mod.rs create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/lib.rs create mode 100644 tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/tests/test_external_delegate.rs create mode 100644 tokens/nft-minter/anchor-v1/Anchor.toml create mode 100644 tokens/nft-minter/anchor-v1/CHANGELOG.md create mode 100644 tokens/nft-minter/anchor-v1/Cargo.toml create mode 100644 tokens/nft-minter/anchor-v1/README.md create mode 100644 tokens/nft-minter/anchor-v1/prepare.mjs create mode 100644 tokens/nft-minter/anchor-v1/programs/nft-minter/Cargo.toml create mode 100644 tokens/nft-minter/anchor-v1/programs/nft-minter/Xargo.toml create mode 100644 tokens/nft-minter/anchor-v1/programs/nft-minter/src/lib.rs create mode 100644 tokens/nft-minter/anchor-v1/programs/nft-minter/tests/test_nft_minter.rs create mode 100644 tokens/nft-minter/anchor-v1/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/nft-operations/anchor-v1/Anchor.toml create mode 100644 tokens/nft-operations/anchor-v1/CHANGELOG.md create mode 100644 tokens/nft-operations/anchor-v1/Cargo.toml create mode 100644 tokens/nft-operations/anchor-v1/README.md create mode 100644 tokens/nft-operations/anchor-v1/prepare.mjs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/Cargo.toml create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/Xargo.toml create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/src/error.rs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/create_collection.rs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mint_nft.rs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mod.rs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/verify_collection.rs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/src/lib.rs create mode 100644 tokens/nft-operations/anchor-v1/programs/mint-nft/tests/test_nft_operations.rs create mode 100644 tokens/nft-operations/anchor-v1/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/pda-mint-authority/anchor-v1/Anchor.toml create mode 100644 tokens/pda-mint-authority/anchor-v1/CHANGELOG.md create mode 100644 tokens/pda-mint-authority/anchor-v1/Cargo.toml create mode 100644 tokens/pda-mint-authority/anchor-v1/README.md create mode 100644 tokens/pda-mint-authority/anchor-v1/prepare.mjs create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/Cargo.toml create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/Xargo.toml create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/create.rs create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mint.rs create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mod.rs create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/lib.rs create mode 100644 tokens/pda-mint-authority/anchor-v1/programs/token-minter/tests/test_pda_mint.rs create mode 100644 tokens/pda-mint-authority/anchor-v1/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/token-extensions/basics/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/basics/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/basics/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/basics/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/basics/anchor-v1/README.md create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/Cargo.toml create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/Xargo.toml create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_associated_token_account.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token_account.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mint_token.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mod.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/transfer_token.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/src/lib.rs create mode 100644 tokens/token-extensions/basics/anchor-v1/programs/basics/tests/test_basics.rs create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/README.md create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Cargo.toml create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Xargo.toml create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/src/lib.rs create mode 100644 tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/tests/test_cpi_guard.rs create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/README.md create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Cargo.toml create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Xargo.toml create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/mod.rs create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/update_default_state.rs create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/lib.rs create mode 100644 tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/tests/test_default_account_state.rs create mode 100644 tokens/token-extensions/group/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/group/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/group/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/group/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/group/anchor-v1/README.md create mode 100644 tokens/token-extensions/group/anchor-v1/programs/group/Cargo.toml create mode 100644 tokens/token-extensions/group/anchor-v1/programs/group/Xargo.toml create mode 100644 tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/mod.rs create mode 100644 tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/test_initialize_group.rs create mode 100644 tokens/token-extensions/group/anchor-v1/programs/group/src/lib.rs create mode 100644 tokens/token-extensions/group/anchor-v1/programs/group/tests/test_group.rs create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/README.md create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Cargo.toml create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Xargo.toml create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/src/lib.rs create mode 100644 tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/tests/test_immutable_owner.rs create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/README.md create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Cargo.toml create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Xargo.toml create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/mod.rs create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/update_rate.rs create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/lib.rs create mode 100644 tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/tests/test_interest_bearing.rs create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/README.md create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Cargo.toml create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Xargo.toml create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/disable.rs create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/mod.rs create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/lib.rs create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/tests/test_memo_transfer.rs create mode 100644 tokens/token-extensions/memo-transfer/anchor-v1/tests/fixtures/spl_memo.so create mode 100644 tokens/token-extensions/metadata/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/metadata/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/metadata/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/metadata/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/metadata/anchor-v1/README.md create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/Cargo.toml create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/Xargo.toml create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/emit.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/mod.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/remove_key.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_authority.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_field.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/lib.rs create mode 100644 tokens/token-extensions/metadata/anchor-v1/programs/metadata/tests/test_metadata.rs create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/README.md create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Cargo.toml create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Xargo.toml create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/close.rs create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/mod.rs create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/lib.rs create mode 100644 tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/tests/test_mint_close_authority.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/README.md create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/package.json create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/pnpm-lock.yaml create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Cargo.toml create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Xargo.toml create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/constants.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/errors.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/chop_tree.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/init_player.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mint_nft.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mod.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/lib.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/game_data.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/mod.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/player_data.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/tests/test_extension_nft.rs create mode 100644 tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/rustfmt.toml create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/README.md create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Cargo.toml create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Xargo.toml create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/src/lib.rs create mode 100644 tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/tests/test_non_transferable.rs create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/README.md create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Cargo.toml create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Xargo.toml create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/mod.rs create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/lib.rs create mode 100644 tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/tests/test_permanent_delegate.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Cargo.toml create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Xargo.toml create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/harvest.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/transfer.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/update_fee.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/withdraw.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/lib.rs create mode 100644 tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/tests/test_transfer_fee.rs create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/constants.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/errors.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/attach_to_mint.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/change_mode.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_config.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_mint.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_wallet.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/remove_wallet.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/tx_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/state.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/utils.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/tests/test_abl_token.rs create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/abl-token-exports.ts create mode 100644 tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/index.ts create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/tests/test_transfer_hook_counter.rs create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize.rs create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/error.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/configure_admin.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/switch.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/state.rs create mode 100644 tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/tests/test_transfer_switch.rs create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.gitignore create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.prettierignore create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Anchor.toml create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/README.md create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Cargo.toml create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Xargo.toml create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/add_to_whitelist.rs create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/mod.rs create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/lib.rs create mode 100644 tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-minter/anchor-v1/Anchor.toml create mode 100644 tokens/token-minter/anchor-v1/CHANGELOG.md create mode 100644 tokens/token-minter/anchor-v1/Cargo.toml create mode 100644 tokens/token-minter/anchor-v1/README.md create mode 100644 tokens/token-minter/anchor-v1/prepare.mjs create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/Cargo.toml create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/Xargo.toml create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/create.rs create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mint.rs create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mod.rs create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/src/lib.rs create mode 100644 tokens/token-minter/anchor-v1/programs/token-minter/tests/test_token_minter.rs create mode 100644 tokens/token-minter/anchor-v1/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/transfer-tokens/anchor-v1/Anchor.toml create mode 100644 tokens/transfer-tokens/anchor-v1/CHANGELOG.md create mode 100644 tokens/transfer-tokens/anchor-v1/Cargo.toml create mode 100644 tokens/transfer-tokens/anchor-v1/README.md create mode 100644 tokens/transfer-tokens/anchor-v1/prepare.mjs create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Cargo.toml create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Xargo.toml create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/create.rs create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mint.rs create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mod.rs create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/transfer.rs create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/lib.rs create mode 100644 tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/tests/test_transfer_tokens.rs create mode 100644 tokens/transfer-tokens/anchor-v1/tests/fixtures/mpl_token_metadata.so diff --git a/.github/workflows/anchor-v1.yml b/.github/workflows/anchor-v1.yml new file mode 100644 index 000000000..b3b5296f9 --- /dev/null +++ b/.github/workflows/anchor-v1.yml @@ -0,0 +1,372 @@ +name: Anchor v1 + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + MAX_JOBS: 64 + MIN_PROJECTS_PER_JOB: 4 + MIN_PROJECTS_FOR_MATRIX: 4 + # See https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + changes: + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + changed_projects: ${{ steps.analyze.outputs.changed_projects }} + total_projects: ${{ steps.analyze.outputs.total_projects }} + matrix: ${{ steps.matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 2 + - uses: dorny/paths-filter@v4 + id: changes + if: github.event_name == 'pull_request' + with: + list-files: shell + filters: | + anchor: + - added|modified: '**/anchor-v1/**' + workflow: + - added|modified: '.github/workflows/anchor-v1.yml' + - name: Analyze Changes + id: analyze + run: | + # Generate ignore pattern, excluding comments + ignore_pattern=$(grep -v '^#' .github/.ghaignore | grep -v '^$' | tr '\n' '|' | sed 's/|$//') + echo "Ignore pattern: $ignore_pattern" + + # Single source of truth for "what is an Anchor v1 project": a directory + # whose name is exactly "anchor-v1". `find -type d -name anchor-v1` gives + # us that by construction — no substring matching, no path-segment + # trickery, so siblings like "anchor-example/" or nested files such as + # "anchor-example/app/pages/api/foo.ts" can never enter the build list. + # It is also what keeps the two Anchor workflows disjoint: an exact-name + # match on "anchor-v1" never sees "anchor", and the Anchor v2 workflow's + # match on "anchor" never sees this one. + function get_projects() { + # An empty .ghaignore makes ignore_pattern empty, and `grep -vE ""` + # matches everything, silently emptying the project list - only + # filter when there is actually a pattern. + if [[ -n "$ignore_pattern" ]]; then + find . -type d -name "anchor-v1" | grep -vE "$ignore_pattern" | sort + else + find . -type d -name "anchor-v1" | sort + fi + } + + # Filter the full project list down to projects touched by the given + # changed files. A file "touches" a project iff it lives inside that + # project directory (prefix match on "/"). This is an + # intersection against get_projects(), so the result is always a subset + # of the authoritative project list. + function filter_by_changes() { + local all_projects="$1" + shift + local changed_files=("$@") + echo "$all_projects" | while read -r project; do + [ -z "$project" ] && continue + # Strip leading ./ so prefix comparison matches git's output + local project_prefix="${project#./}/" + for file in "${changed_files[@]}"; do + if [[ "$file" == "$project_prefix"* ]]; then + echo "$project" + break + fi + done + done | sort -u + } + + # Determine which projects to build and test + if [[ "${{ github.event_name }}" == "schedule" || "${{ steps.changes.outputs.workflow }}" == "true" ]]; then + # Workflow file changed or schedule — build everything + projects=$(get_projects) + elif [[ "${{ github.event_name }}" == "push" ]]; then + # On push, only build projects with changes since parent commit + mapfile -t changed_files < <(git diff --name-only HEAD~1 HEAD 2>/dev/null || true) + if [ ${#changed_files[@]} -eq 0 ]; then + projects=$(get_projects) + else + projects=$(filter_by_changes "$(get_projects)" "${changed_files[@]}") + fi + elif [[ "${{ steps.changes.outputs.anchor }}" == "true" ]]; then + changed_files=(${{ steps.changes.outputs.anchor_files }}) + projects=$(filter_by_changes "$(get_projects)" "${changed_files[@]}") + else + projects="" + fi + + # Output project information + if [[ -n "$projects" ]]; then + echo "Projects to build and test" + echo "$projects" + total_projects=$(echo "$projects" | wc -l) + echo "Total projects: $total_projects" + echo "total_projects=$total_projects" >> $GITHUB_OUTPUT + echo "changed_projects=$(echo "$projects" | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT + else + echo "No projects to build and test." + echo "total_projects=0" >> $GITHUB_OUTPUT + echo "changed_projects=[]" >> $GITHUB_OUTPUT + fi + - name: Generate matrix + id: matrix + run: | + total_projects=${{ steps.analyze.outputs.total_projects }} + max_jobs=${{ env.MAX_JOBS }} + min_projects_per_job=${{ env.MIN_PROJECTS_PER_JOB }} + min_projects_for_matrix=${{ env.MIN_PROJECTS_FOR_MATRIX }} + + # Generate matrix based on number of projects + if [ "$total_projects" -lt "$min_projects_for_matrix" ]; then + echo "matrix=[0]" >> $GITHUB_OUTPUT + else + projects_per_job=$(( (total_projects + max_jobs - 1) / max_jobs )) + projects_per_job=$(( projects_per_job > min_projects_per_job ? projects_per_job : min_projects_per_job )) + num_jobs=$(( (total_projects + projects_per_job - 1) / projects_per_job )) + + indices=$(seq 0 $(( num_jobs - 1 ))) + echo "matrix=[$(echo $indices | tr ' ' ',')]" >> $GITHUB_OUTPUT + fi + + build-and-test: + needs: changes + if: needs.changes.outputs.total_projects != '0' + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + index: ${{ fromJson(needs.changes.outputs.matrix) }} + name: build-and-test-group-${{ matrix.index }} + outputs: + failed_projects: ${{ steps.set-failed.outputs.failed_projects }} + steps: + - uses: actions/checkout@v5 + - name: Setup sccache + uses: mozilla-actions/sccache-action@v0.0.9 + - name: Configure sccache + run: | + echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV + echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV + - name: Cache Cargo registry and git + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.toml', '**/Cargo.lock') }} + restore-keys: | + cargo-${{ runner.os }}- + - uses: pnpm/action-setup@v4 + # Replaces heyAyushh/setup-anchor@v4.999. That action's version-detection step + # runs `anchor --version | awk '{print $2}'` and writes the result straight to + # $GITHUB_OUTPUT. `anchor --version` now prints more than one line, so the value + # becomes multi-line and the step dies with "Invalid format", aborting the whole + # job before any project is built. These steps install the same toolchain (Solana + # via the Anza installer, Anchor via avm) and read the version from the first line + # only. The other workflows that use setup-anchor (native, quasar, pinocchio, + # solana-asm) hit the same latent bug once their matrices run; migrate them the + # same way once this is confirmed green. + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Install Solana CLI + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/v3.1.14/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> "$GITHUB_PATH" + - name: Cache Anchor toolchain + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/anchor + ~/.cargo/bin/avm + ~/.avm + # Pinned to match the anchor-lang/anchor-spl crate version the programs depend on. + key: anchor-toolchain-${{ runner.os }}-1.1.2 + - name: Install Anchor 1.1.2 + run: | + export PATH="$HOME/.cargo/bin:$HOME/.avm/bin:$PATH" + # `anchor --version` can emit more than one line; read the first line only so + # a multi-line value never reaches downstream parsing. + current="$(anchor --version 2>/dev/null | head -n1 | awk '{print $2}' || true)" + if [ "$current" != "1.1.2" ]; then + cargo install --git https://github.com/coral-xyz/anchor avm --force + avm install 1.1.2 + avm use 1.1.2 + fi + echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + echo "$HOME/.avm/bin" >> "$GITHUB_PATH" + - name: Install Surfpool + run: curl -sL https://run.surfpool.run/ | bash + - name: Display Versions + run: | + solana -V + # it's okay to use --force in github action since all programs are tested in isolation + solana-keygen new --no-bip39-passphrase --force + rustc -V + anchor -V + surfpool --version + - name: Build and Test + env: + TOTAL_PROJECTS: ${{ needs.changes.outputs.total_projects }} + PROJECTS_PER_JOB: ${{ env.MIN_PROJECTS_PER_JOB }} + run: | + function build_and_test() { + local project=$1 + echo "Building and Testing $project" + cd "$project" || return 1 + + # Install dependencies first + if ! pnpm install --frozen-lockfile; then + echo "::error::pnpm install failed for $project" + echo "$project: pnpm install failed" >> $GITHUB_WORKSPACE/failed_projects.txt + cd - > /dev/null + return 1 + fi + + # Sync program IDs (Anchor 1.0+ requires keypair and declare_id! to match) + anchor keys sync + + # Update IDL address fields to match the synced keys. + # declare_program!(name) reads the address from idls/.json, so + # after keys sync changes the program IDs, the IDLs must match too — + # otherwise LiteSVM tests load the .so at the old IDL address while + # the compiled program expects the new declare_id!() address. + if [ -d "idls" ]; then + for idl_file in idls/*.json; do + program_name=$(basename "$idl_file" .json) + # Look up the new address from Anchor.toml [programs.localnet] + new_address=$(grep "^${program_name} " Anchor.toml | head -1 | sed 's/.*= *"\(.*\)"/\1/') + if [ -n "$new_address" ]; then + # Update the "address" field in the IDL JSON + tmp=$(mktemp) + jq --arg addr "$new_address" '.address = $addr' "$idl_file" > "$tmp" && mv "$tmp" "$idl_file" + fi + done + fi + + # Run anchor build + if ! anchor build; then + echo "::error::anchor build failed for $project" + echo "$project: anchor build failed" >> $GITHUB_WORKSPACE/failed_projects.txt + rm -rf target node_modules + cd - > /dev/null + return 1 + fi + + # Run anchor test + if ! anchor test; then + echo "::error::anchor test failed for $project" + echo "$project: anchor test failed" >> $GITHUB_WORKSPACE/failed_projects.txt + rm -rf target node_modules + cd - > /dev/null + return 1 + fi + + echo "Build and tests succeeded for $project." + rm -rf target node_modules + cd - > /dev/null + return 0 + } + + # Determine which projects to build in this job + readarray -t all_projects < <(echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]?') + start_index=$(( ${{ matrix.index }} * PROJECTS_PER_JOB )) + end_index=$(( start_index + PROJECTS_PER_JOB )) + end_index=$(( end_index > TOTAL_PROJECTS ? TOTAL_PROJECTS : end_index )) + + echo "Projects to build and test in this job" + for i in $(seq $start_index $(( end_index - 1 ))); do + echo "${all_projects[$i]}" + done + + # Build and test projects + failed=false + failed_projects=() + for i in $(seq $start_index $(( end_index - 1 ))); do + echo "::group::Building and testing ${all_projects[$i]}" + if ! build_and_test "${all_projects[$i]}"; then + failed=true + failed_projects+=("${all_projects[$i]}") + fi + echo "::endgroup::" + done + + if [[ "$failed" == "true" ]]; then + echo "::group::Failed projects" + cat $GITHUB_WORKSPACE/failed_projects.txt + echo "::endgroup::" + echo "failed_projects=${failed_projects[@]}" >> $GITHUB_OUTPUT + exit 1 + else + echo "failed_projects=" >> $GITHUB_OUTPUT + fi + + - name: Set failed projects output + id: set-failed + if: failure() + run: | + # Prepare failed projects list for output + failed_projects=$(cat $GITHUB_WORKSPACE/failed_projects.txt | jq -R -s -c 'split("\n")[:-1]') + echo "failed_projects=$failed_projects" >> $GITHUB_OUTPUT + - name: Show sccache stats + if: always() + run: sccache --show-stats + + summary: + needs: [changes, build-and-test] + if: always() + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Create job summary + run: | + echo "## Anchor v1 Workflow Summary" >> $GITHUB_STEP_SUMMARY + echo "- Total projects: ${{ needs.changes.outputs.total_projects }}" >> $GITHUB_STEP_SUMMARY + + # List all processed projects + echo "
" >> $GITHUB_STEP_SUMMARY + echo "Projects processed (click to expand)" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]' | while read project; do + echo "- $project" >> $GITHUB_STEP_SUMMARY + done + echo "" >> $GITHUB_STEP_SUMMARY + echo "
" >> $GITHUB_STEP_SUMMARY + + # Report build and test results + if [[ "${{ needs.build-and-test.result }}" == "failure" ]]; then + echo "## :x: Build or tests failed" >> $GITHUB_STEP_SUMMARY + echo "
" >> $GITHUB_STEP_SUMMARY + echo "Failed projects (click to expand)" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + failed_projects='${{ needs.build-and-test.outputs.failed_projects }}' + if [[ -n "$failed_projects" ]]; then + echo "$failed_projects" | jq -r '.[]' | while IFS=: read -r project failure_reason; do + echo "- **$project**" >> $GITHUB_STEP_SUMMARY + echo " - Failure reason: $failure_reason" >> $GITHUB_STEP_SUMMARY + done + else + echo "No failed projects reported. This might indicate an unexpected error in the workflow." >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + echo "
" >> $GITHUB_STEP_SUMMARY + elif [[ "${{ needs.build-and-test.result }}" == "success" ]]; then + echo "## :white_check_mark: All builds and tests passed" >> $GITHUB_STEP_SUMMARY + else + echo "## :warning: Build and test job was skipped or canceled" >> $GITHUB_STEP_SUMMARY + fi diff --git a/.github/workflows/anchor.yml b/.github/workflows/anchor.yml index d1e039bcd..191c5c202 100644 --- a/.github/workflows/anchor.yml +++ b/.github/workflows/anchor.yml @@ -1,4 +1,4 @@ -name: Anchor +name: Anchor v2 on: push: @@ -50,11 +50,15 @@ jobs: ignore_pattern=$(grep -v '^#' .github/.ghaignore | grep -v '^$' | tr '\n' '|' | sed 's/|$//') echo "Ignore pattern: $ignore_pattern" - # Single source of truth for "what is a framework project": a directory + # Single source of truth for "what is an Anchor v2 project": a directory # whose name is exactly "anchor". `find -type d -name anchor` gives us # that by construction — no substring matching, no path-segment trickery, # so siblings like "anchor-example/" or nested files such as # "anchor-example/app/pages/api/foo.ts" can never enter the build list. + # It is also what keeps the two Anchor workflows disjoint: the Anchor v1 + # projects live in "anchor-v1" directories, built by + # .github/workflows/anchor-v1.yml, and an exact-name match on "anchor" + # never sees them. function get_projects() { # An empty .ghaignore makes ignore_pattern empty, and `grep -vE ""` # matches everything, silently emptying the project list - only @@ -376,7 +380,7 @@ jobs: - uses: actions/checkout@v5 - name: Create job summary run: | - echo "## Anchor Workflow Summary" >> $GITHUB_STEP_SUMMARY + echo "## Anchor v2 Workflow Summary" >> $GITHUB_STEP_SUMMARY echo "- Total projects: ${{ needs.changes.outputs.total_projects }}" >> $GITHUB_STEP_SUMMARY # List all processed projects diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e0318df..93d091b7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,45 @@ All notable changes to this repository are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [2026-08-21] - Anchor v1 kept alongside Anchor v2 + +Anchor v1 is expected to stay on long-term support, and many deployed programs +will stay with it. Both versions of every Anchor example now ship, each built and +tested by its own CI job. + +### Added + +- Every one of the 55 Anchor examples gains a sibling `anchor-v1/` directory + holding the example exactly as it stood before the v2 port, restored from + `94abbea`, the last commit on `main` before that merge. 864 files. The 17 + third-party `.so` test fixtures are byte-identical to the ones already tracked + under `anchor/`, so git stores one copy and the tree grows by ~2.3 MB of text. +- `.github/workflows/anchor-v1.yml` builds and tests them on Anchor 1.1.2, + installed through avm. It is the workflow as it stood at `94abbea`, with + project discovery changed to `find -type d -name "anchor-v1"`. The v2-only IDL + workaround (`anchor#4947`, enum variants) is not carried over: that bug does not + exist in 1.1.2, so v1 builds generate IDLs normally. + +### Changed + +- The `Anchor` workflow is now `Anchor v2`, so the two checks read as a pair. Its + filename, triggers and `find -type d -name "anchor"` discovery are unchanged. + Both workflows match a directory name exactly, so neither can ever see the + other's projects. +- Every Anchor example README now names the CLI its commands need, on both sides: + `anchor/` pages say Anchor v2 and `anchor-v1/` pages say Anchor v1. A bare + `anchor build` was unambiguous while the repository had one Anchor and is not + any more. `README.md` and `CONTRIBUTING.md`, which sit above both, show both. + +### Note + +- The `anchor-v1/` crates are not members of the root Cargo workspace and cannot + be: they carry the same package names as their `anchor/` siblings. `cargo fmt` + and `cargo clippy` therefore do not see them, and the Anchor v1 workflow is what + keeps them honest. They also have no committed `Cargo.lock` (`.gitignore` ignores + `**/*/Cargo.lock`), so their transitive dependencies resolve fresh on each run and + can break without anyone touching the directory. + ## [2026-08-16] - Every Anchor example on Anchor v2.0.0-rc.1 All 55 Anchor examples build and pass their tests on 2.0.0-rc.1 (304 tests), diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2f74096f7..5e5d315ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,10 @@ See [CHANGELOG.md](./CHANGELOG.md) for release history. This file had no changel ## Project structure - Each example lives at `category/example-name//`, e.g. `basics/counter/anchor/`. -- Supported frameworks: `anchor`, `quasar`, `pinocchio`, `native`, `asm`. Use the existing layout as a reference. +- Supported frameworks: `anchor`, `anchor-v1`, `quasar`, `pinocchio`, `native`, `asm`. Use the existing layout as a reference. +- `anchor/` is Anchor v2 (2.0.0-rc.1) and is where new Anchor work goes. `anchor-v1/` is the + same example on Anchor v1 (1.1.2), kept for the v1 LTS line: it is a frozen snapshot and + changes only to keep the v1 build green, not to gain new features. - Anchor and Quasar programs usually keep Rust tests under `programs//tests/`. - Native and Pinocchio tests are Rust + LiteSVM, kept under `program/tests/`. @@ -25,7 +28,8 @@ See [CHANGELOG.md](./CHANGELOG.md) for release history. This file had no changel Run an example's tests with the command for its framework, from the framework directory (e.g. `basics/counter/anchor/`): -- **Anchor:** `anchor test` (runs `cargo test`, per the `[scripts]` table in `Anchor.toml`). +- **Anchor v2** (in `anchor/`): `anchor test` (runs `cargo test`, per the `[scripts]` table in `Anchor.toml`), with the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked`. +- **Anchor v1** (in `anchor-v1/`): the same `anchor test`, with the v1 CLI: `avm install 1.1.2 && avm use 1.1.2`. Selecting the wrong CLI is the usual cause of a confusing build failure in these directories. - **Quasar:** `quasar test`. - **Native / Pinocchio:** `cargo test --manifest-path=./program/Cargo.toml` (build first with `cargo build-sbf --manifest-path=./program/Cargo.toml`). diff --git a/Cargo.toml b/Cargo.toml index 7bc5e0061..f3ca804b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,15 @@ # `anchor/Cargo.toml` workspace. `anchor build` uses the project workspace; this # one is what the repository-wide `cargo fmt` and `cargo clippy` jobs see, and # they only ever look at members. A crate missing here is a crate CI never lints. +# +# The `anchor-v1/` crates are deliberately absent, and must stay absent. Each is a +# copy of its `anchor/` sibling carrying the same `[package] name`, and one +# workspace cannot hold two packages called the same thing - adding them fails with +# "two packages named `favorites` in this workspace". They do not need an `exclude` +# entry either: nothing here depends on them by path, and each `anchor-v1/Cargo.toml` +# declares its own `[workspace]`, so `anchor build` inside one resolves there. The +# cost is that `cargo fmt` and `cargo clippy` never see them; the Anchor v1 workflow +# compiles and tests them instead. members = [ #basics "basics/account-data/native/program", diff --git a/README.md b/README.md index f25073ec6..e010a8928 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,14 @@ _Solana program examples ('smart contracts') in Anchor, Quasar, Pinocchio, native Rust, and sBPF assembly. Focused on financial software ('DeFi'), plus the basics, tokens, Token Extensions, state compression, and more._ -Working, tested, up-to-date examples of common Solana programs (what other chains call smart contracts), maintained by [Quicknode](https://www.quicknode.com/chains/solana). Current as of August 2026 (see [CHANGELOG.md](./CHANGELOG.md)): every example builds and passes CI on **Anchor 2.0.0-rc.1**, the current multi-file program layout (one file per instruction handler, account type, etc), and [LiteSVM](https://github.com/LiteSVM/litesvm) tests rather than the older `solana-test-validator` / web3.js stack. +Working, tested, up-to-date examples of common Solana programs (what other chains call smart contracts), maintained by [Quicknode](https://www.quicknode.com/chains/solana). Current as of August 2026 (see [CHANGELOG.md](./CHANGELOG.md)): every example builds and passes CI on **Anchor 2.0.0-rc.1**, the current multi-file program layout (one file per instruction handler, account type, etc), and [LiteSVM](https://github.com/LiteSVM/litesvm) tests rather than the older `solana-test-validator` / web3.js stack. Every Anchor example also keeps its last **Anchor 1.1.2** version in a sibling `anchor-v1/` directory, built and tested by its own CI job, for programs staying on the Anchor v1 LTS line. -[![Anchor](../../actions/workflows/anchor.yml/badge.svg)](../../actions/workflows/anchor.yml) [![Quasar](../../actions/workflows/quasar.yml/badge.svg)](../../actions/workflows/quasar.yml) [![Pinocchio](../../actions/workflows/pinocchio.yml/badge.svg)](../../actions/workflows/pinocchio.yml) [![Native](../../actions/workflows/native.yml/badge.svg)](../../actions/workflows/native.yml) [![ASM](../../actions/workflows/solana-asm.yml/badge.svg)](../../actions/workflows/solana-asm.yml) +[![Anchor v2](../../actions/workflows/anchor.yml/badge.svg)](../../actions/workflows/anchor.yml) [![Anchor v1](../../actions/workflows/anchor-v1.yml/badge.svg)](../../actions/workflows/anchor-v1.yml) [![Quasar](../../actions/workflows/quasar.yml/badge.svg)](../../actions/workflows/quasar.yml) [![Pinocchio](../../actions/workflows/pinocchio.yml/badge.svg)](../../actions/workflows/pinocchio.yml) [![Native](../../actions/workflows/native.yml/badge.svg)](../../actions/workflows/native.yml) [![ASM](../../actions/workflows/solana-asm.yml/badge.svg)](../../actions/workflows/solana-asm.yml) Each example is available in one or more of the following frameworks: -- [⚓ Anchor](https://www.anchor-lang.com/) - the most popular framework for Solana development. Build with `anchor build`, test with `anchor test`. +- [⚓ Anchor v2](https://www.anchor-lang.com/) - the most popular framework for Solana development, in its current major version. Lives in `anchor/`. Install with `cargo install anchor-cli --version 2.0.0-rc.1 --locked`, build with `anchor build`, test with `anchor test`. +- [⚓ Anchor v1](https://www.anchor-lang.com/) - the previous major version, on long-term support and still what many deployed programs use. Lives in `anchor-v1/`, alongside the v2 copy of the same example. Install with `avm install 1.1.2 && avm use 1.1.2`, then the same `anchor build` / `anchor test`. - [💫 Quasar](https://quasar-lang.com/docs) - a newer, more performant framework with Anchor-compatible ergonomics. Build with `quasar build`, test with `quasar test`. - [🤥 Pinocchio](https://github.com/anza-xyz/pinocchio) - a zero-copy, zero-allocation library for Solana programs. Build with `cargo build-sbf --manifest-path=./program/Cargo.toml`, test with `cargo test --manifest-path=./program/Cargo.toml`. - [🦀 Native Rust](https://docs.anza.xyz/) - vanilla Rust using Solana's native crates. Build with `cargo build-sbf --manifest-path=./program/Cargo.toml`, test with `cargo test --manifest-path=./program/Cargo.toml`. diff --git a/basics/account-data/anchor-v1/Anchor.toml b/basics/account-data/anchor-v1/Anchor.toml new file mode 100644 index 000000000..1d3901b72 --- /dev/null +++ b/basics/account-data/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +account_data_anchor_program = "GpVcgWdgVErgLqsn8VYUch6EqDerMgNqoLSmGyKrd6MR" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/account-data/anchor-v1/CHANGELOG.md b/basics/account-data/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/account-data/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/account-data/anchor-v1/Cargo.toml b/basics/account-data/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/account-data/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/account-data/anchor-v1/README.md b/basics/account-data/anchor-v1/README.md new file mode 100644 index 000000000..bae3adceb --- /dev/null +++ b/basics/account-data/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Account Data (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Store and retrieve arbitrary data in a Solana [account](https://solana.com/docs/terminology#account) owned by this [program](https://solana.com/docs/terminology#program). + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- Account ownership and lamport rent +- Serializing and deserializing account data + +## Setup + +From this directory (`basics/account-data/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/Cargo.toml b/basics/account-data/anchor-v1/programs/anchor-program-example/Cargo.toml new file mode 100644 index 000000000..1ca762589 --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "account-data-anchor-program" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "account_data_anchor_program" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/Xargo.toml b/basics/account-data/anchor-v1/programs/anchor-program-example/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/create.rs b/basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/create.rs new file mode 100644 index 000000000..535efc853 --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/create.rs @@ -0,0 +1,32 @@ +use crate::state::AddressInfo; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct CreateAddressInfoAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + #[account( + init, + payer = payer, + space = AddressInfo::DISCRIMINATOR.len() + AddressInfo::INIT_SPACE, + )] + address_info: Account<'info, AddressInfo>, + system_program: Program<'info, System>, +} + +pub fn handle_create_address_info( + context: Context, + name: String, + house_number: u8, + street: String, + city: String, +) -> Result<()> { + *context.accounts.address_info = AddressInfo { + name, + house_number, + street, + city, + }; + Ok(()) +} diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs b/basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs new file mode 100644 index 000000000..c36beaf3e --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs @@ -0,0 +1,2 @@ +pub mod create; +pub use create::*; diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/src/lib.rs b/basics/account-data/anchor-v1/programs/anchor-program-example/src/lib.rs new file mode 100644 index 000000000..f5fd99dad --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/src/lib.rs @@ -0,0 +1,22 @@ +use anchor_lang::prelude::*; +use instructions::*; + +pub mod instructions; +pub mod state; + +declare_id!("GpVcgWdgVErgLqsn8VYUch6EqDerMgNqoLSmGyKrd6MR"); + +#[program] +pub mod account_data_anchor_program { + use super::*; + + pub fn create_address_info( + context: Context, + name: String, + house_number: u8, + street: String, + city: String, + ) -> Result<()> { + create::handle_create_address_info(context, name, house_number, street, city) + } +} diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/src/state/address_info.rs b/basics/account-data/anchor-v1/programs/anchor-program-example/src/state/address_info.rs new file mode 100644 index 000000000..1142f354d --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/src/state/address_info.rs @@ -0,0 +1,13 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] // automatically calculate the space required for the struct +pub struct AddressInfo { + #[max_len(50)] // set a max length for the string + pub name: String, // 4 bytes + 50 bytes + pub house_number: u8, // 1 byte + #[max_len(50)] + pub street: String, // 4 bytes + 50 bytes + #[max_len(50)] + pub city: String, // 4 bytes + 50 bytes +} diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/src/state/mod.rs b/basics/account-data/anchor-v1/programs/anchor-program-example/src/state/mod.rs new file mode 100644 index 000000000..4cd006d5d --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod address_info; + +pub use address_info::*; diff --git a/basics/account-data/anchor-v1/programs/anchor-program-example/tests/test_account_data.rs b/basics/account-data/anchor-v1/programs/anchor-program-example/tests/test_account_data.rs new file mode 100644 index 000000000..567a816a5 --- /dev/null +++ b/basics/account-data/anchor-v1/programs/anchor-program-example/tests/test_account_data.rs @@ -0,0 +1,66 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + AnchorSerialize, InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Deserialize the AddressInfo account (8-byte discriminator + fields). +#[derive(BorshDeserialize)] +struct AddressInfoAccount { + _discriminator: [u8; 8], + name: String, + house_number: u8, + street: String, + city: String, +} + +#[test] +fn test_create_address_info() { + let program_id = account_data_anchor_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/account_data_anchor_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let address_info_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &account_data_anchor_program::instruction::CreateAddressInfo { + name: "Joe C".to_string(), + house_number: 136, + street: "Mile High Dr.".to_string(), + city: "Solana Beach".to_string(), + } + .data(), + account_data_anchor_program::accounts::CreateAddressInfoAccountConstraints { + payer: payer.pubkey(), + address_info: address_info_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &address_info_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Read the account data back + let account = svm.get_account(&address_info_keypair.pubkey()).unwrap(); + let info = AddressInfoAccount::deserialize(&mut &account.data[..]).unwrap(); + + assert_eq!(info.name, "Joe C"); + assert_eq!(info.house_number, 136); + assert_eq!(info.street, "Mile High Dr."); + assert_eq!(info.city, "Solana Beach"); +} diff --git a/basics/account-data/anchor/README.md b/basics/account-data/anchor/README.md index 1f6f31cef..cf47112f1 100644 --- a/basics/account-data/anchor/README.md +++ b/basics/account-data/anchor/README.md @@ -1,5 +1,11 @@ # Account Data (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Store and retrieve arbitrary data in a Solana [account](https://solana.com/docs/terminology#account) owned by this [program](https://solana.com/docs/terminology#program). See also: the [repository catalog](../../../README.md). diff --git a/basics/checking-accounts/anchor-v1/Anchor.toml b/basics/checking-accounts/anchor-v1/Anchor.toml new file mode 100644 index 000000000..3f63a6126 --- /dev/null +++ b/basics/checking-accounts/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +checking_account_program = "ECWPhR3rJbaPfyNFgphnjxSEexbTArc7vxD8fnW6tgKw" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/checking-accounts/anchor-v1/CHANGELOG.md b/basics/checking-accounts/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/checking-accounts/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/checking-accounts/anchor-v1/Cargo.toml b/basics/checking-accounts/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/checking-accounts/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/checking-accounts/anchor-v1/README.md b/basics/checking-accounts/anchor-v1/README.md new file mode 100644 index 000000000..956a15c3c --- /dev/null +++ b/basics/checking-accounts/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Checking Accounts (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Validate that accounts passed into an [instruction](https://solana.com/docs/terminology#instruction) meet signer, owner, and address constraints before handler logic runs. + +See also: [Checking Accounts overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Account constraints in Anchor +- Signer vs mut vs address checks + +## Setup + +From this directory (`basics/checking-accounts/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/checking-accounts/anchor-v1/programs/anchor-program-example/Cargo.toml b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/Cargo.toml new file mode 100644 index 000000000..30bbe293a --- /dev/null +++ b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "checking-accounts-anchor-program-example" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "checking_account_program" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/checking-accounts/anchor-v1/programs/anchor-program-example/Xargo.toml b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/checking-accounts/anchor-v1/programs/anchor-program-example/src/lib.rs b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/src/lib.rs new file mode 100644 index 000000000..5cd90a851 --- /dev/null +++ b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/src/lib.rs @@ -0,0 +1,30 @@ +use anchor_lang::prelude::*; + +declare_id!("ECWPhR3rJbaPfyNFgphnjxSEexbTArc7vxD8fnW6tgKw"); + +#[program] +pub mod checking_account_program { + use super::*; + + pub fn check_accounts(_context: Context) -> Result<()> { + Ok(()) + } +} + +// Account validation in Anchor is done using the types and constraints specified in the #[derive(Accounts)] structs +// This is a simple example and does not include all possible constraints and types +#[derive(Accounts)] +pub struct CheckingAccountsAccountConstraints<'info> { + payer: Signer<'info>, // checks account is signer + + /// CHECK: No checks performed, example of an unchecked account + #[account(mut)] + account_to_create: UncheckedAccount<'info>, + /// CHECK: Perform owner check using constraint + #[account( + mut, + owner = id() + )] + account_to_change: UncheckedAccount<'info>, + system_program: Program<'info, System>, // checks account is executable, and is the system program +} diff --git a/basics/checking-accounts/anchor-v1/programs/anchor-program-example/tests/test_checking_accounts.rs b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/tests/test_checking_accounts.rs new file mode 100644 index 000000000..15cb44851 --- /dev/null +++ b/basics/checking-accounts/anchor-v1/programs/anchor-program-example/tests/test_checking_accounts.rs @@ -0,0 +1,61 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_instruction, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[test] +fn test_check_accounts() { + let program_id = checking_account_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/checking_account_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let account_to_change = Keypair::new(); + let account_to_create = Keypair::new(); + + // First, create an account owned by our program (like the TS test does) + let rent_exempt_balance = svm.minimum_balance_for_rent_exemption(0); + let create_account_ix = system_instruction::create_account( + &payer.pubkey(), + &account_to_change.pubkey(), + rent_exempt_balance, + 0, + &program_id, + ); + send_transaction_from_instructions( + &mut svm, + vec![create_account_ix], + &[&payer, &account_to_change], + &payer.pubkey(), + ) + .unwrap(); + + svm.expire_blockhash(); + + // Now call check_accounts + let check_accounts_ix = Instruction::new_with_bytes( + program_id, + &checking_account_program::instruction::CheckAccounts {}.data(), + checking_account_program::accounts::CheckingAccountsAccountConstraints { + payer: payer.pubkey(), + account_to_create: account_to_create.pubkey(), + account_to_change: account_to_change.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![check_accounts_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); +} diff --git a/basics/checking-accounts/anchor/README.md b/basics/checking-accounts/anchor/README.md index ab5c6c208..829401d5e 100644 --- a/basics/checking-accounts/anchor/README.md +++ b/basics/checking-accounts/anchor/README.md @@ -1,5 +1,11 @@ # Checking Accounts (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Validate that accounts passed into an [instruction](https://solana.com/docs/terminology#instruction) meet signer, owner, and address constraints before handler logic runs. See also: [Checking Accounts overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/close-account/anchor-v1/Anchor.toml b/basics/close-account/anchor-v1/Anchor.toml new file mode 100644 index 000000000..496f4a647 --- /dev/null +++ b/basics/close-account/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +close_account_program = "99TQtoDdQ5NS2v5Ppha93aqEmv3vV9VZVfHTP5rGST3c" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/close-account/anchor-v1/CHANGELOG.md b/basics/close-account/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/close-account/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/close-account/anchor-v1/Cargo.toml b/basics/close-account/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/close-account/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/close-account/anchor-v1/README.md b/basics/close-account/anchor-v1/README.md new file mode 100644 index 000000000..ae234b96d --- /dev/null +++ b/basics/close-account/anchor-v1/README.md @@ -0,0 +1,52 @@ +# Close Account + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Two [instruction handlers](https://solana.com/docs/terminology#instruction-handler): `create_user` initializes a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) `User` [account](https://solana.com/docs/terminology#account), and `close_user` closes it and returns the [rent](https://solana.com/docs/terminology#rent) to the user. + +1. `create_user` initializes the PDA with [Anchor](https://solana.com/docs/terminology#anchor)'s `init` constraint: + + ```rust + #[account( + init, + payer = user, + space = User::DISCRIMINATOR.len() + User::INIT_SPACE, + seeds = [b"USER", user.key().as_ref()], + bump, + )] + pub user_account: Account<'info, User>, + ``` + + See [`programs/close-account/src/instructions/create_user.rs`](programs/close-account/src/instructions/create_user.rs). + +2. `close_user` closes the account using Anchor's `close` constraint, which returns [lamports](https://solana.com/docs/terminology#lamport) to the given account: + + ```rust + #[account( + mut, + seeds = [b"USER", user.key().as_ref()], + bump = user_account.bump, + close = user, // close account and return lamports to user + )] + pub user_account: Account<'info, User>, + ``` + + See [`programs/close-account/src/instructions/close_user.rs`](programs/close-account/src/instructions/close_user.rs). + +## Setup + +```bash +anchor build +``` + +## Testing + +Tests live in [`programs/close-account/tests/test_close_account.rs`](programs/close-account/tests/test_close_account.rs) and run in-process with LiteSVM: + +```bash +anchor test +``` diff --git a/basics/close-account/anchor-v1/programs/close-account/Cargo.toml b/basics/close-account/anchor-v1/programs/close-account/Cargo.toml new file mode 100644 index 000000000..fe78b018f --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "close-account-program" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "close_account_program" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/close-account/anchor-v1/programs/close-account/Xargo.toml b/basics/close-account/anchor-v1/programs/close-account/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/close-account/anchor-v1/programs/close-account/src/instructions/close_user.rs b/basics/close-account/anchor-v1/programs/close-account/src/instructions/close_user.rs new file mode 100644 index 000000000..6606fe22a --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/src/instructions/close_user.rs @@ -0,0 +1,23 @@ +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct CloseUserAccountConstraints<'info> { + #[account(mut)] + pub user: Signer<'info>, + + #[account( + mut, + seeds = [ + b"USER", + user.key().as_ref(), + ], + bump = user_account.bump, + close = user, // close account and return lamports to user + )] + pub user_account: Account<'info, User>, +} + +pub fn handle_close_user(_context: Context) -> Result<()> { + Ok(()) +} diff --git a/basics/close-account/anchor-v1/programs/close-account/src/instructions/create_user.rs b/basics/close-account/anchor-v1/programs/close-account/src/instructions/create_user.rs new file mode 100644 index 000000000..a64ebd79e --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/src/instructions/create_user.rs @@ -0,0 +1,33 @@ +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct CreateUserAccountConstraints<'info> { + #[account(mut)] + pub user: Signer<'info>, + + #[account( + init, + payer = user, + space = User::DISCRIMINATOR.len() + User::INIT_SPACE, + seeds = [ + b"USER", + user.key().as_ref(), + ], + bump + )] + pub user_account: Account<'info, User>, + pub system_program: Program<'info, System>, +} + +pub fn handle_create_user( + context: Context, + name: String, +) -> Result<()> { + *context.accounts.user_account = User { + bump: context.bumps.user_account, + user: context.accounts.user.key(), + name, + }; + Ok(()) +} diff --git a/basics/close-account/anchor-v1/programs/close-account/src/instructions/mod.rs b/basics/close-account/anchor-v1/programs/close-account/src/instructions/mod.rs new file mode 100644 index 000000000..fe570ffec --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod close_user; +pub mod create_user; + +pub use close_user::*; +pub use create_user::*; diff --git a/basics/close-account/anchor-v1/programs/close-account/src/lib.rs b/basics/close-account/anchor-v1/programs/close-account/src/lib.rs new file mode 100644 index 000000000..0819ae853 --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/src/lib.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; +mod instructions; +mod state; +use instructions::*; + +declare_id!("99TQtoDdQ5NS2v5Ppha93aqEmv3vV9VZVfHTP5rGST3c"); + +#[program] +pub mod close_account_program { + use super::*; + + pub fn create_user(context: Context, name: String) -> Result<()> { + create_user::handle_create_user(context, name) + } + + pub fn close_user(context: Context) -> Result<()> { + close_user::handle_close_user(context) + } +} diff --git a/basics/close-account/anchor-v1/programs/close-account/src/state/mod.rs b/basics/close-account/anchor-v1/programs/close-account/src/state/mod.rs new file mode 100644 index 000000000..82a8f00c6 --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/src/state/mod.rs @@ -0,0 +1,2 @@ +pub mod user; +pub use user::*; diff --git a/basics/close-account/anchor-v1/programs/close-account/src/state/user.rs b/basics/close-account/anchor-v1/programs/close-account/src/state/user.rs new file mode 100644 index 000000000..6548d53dc --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/src/state/user.rs @@ -0,0 +1,10 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] // automatically calculate the space required for the struct +pub struct User { + pub bump: u8, // 1 byte + pub user: Pubkey, // 32 bytes + #[max_len(50)] // set a max length for the string + pub name: String, // 4 bytes + 50 bytes +} diff --git a/basics/close-account/anchor-v1/programs/close-account/tests/test_close_account.rs b/basics/close-account/anchor-v1/programs/close-account/tests/test_close_account.rs new file mode 100644 index 000000000..f7189df61 --- /dev/null +++ b/basics/close-account/anchor-v1/programs/close-account/tests/test_close_account.rs @@ -0,0 +1,71 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Keypair) { + let program_id = close_account_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/close_account_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_create_and_close_user() { + let (mut svm, payer) = setup(); + let program_id = close_account_program::id(); + + // Derive the PDA for the user's account + let (user_account_pda, _bump) = + Pubkey::find_program_address(&[b"USER", payer.pubkey().as_ref()], &program_id); + + // Create user + let create_ix = Instruction::new_with_bytes( + program_id, + &close_account_program::instruction::CreateUser { + name: "John Doe".to_string(), + } + .data(), + close_account_program::accounts::CreateUserAccountConstraints { + user: payer.pubkey(), + user_account: user_account_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![create_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify account exists and has correct data + let account = svm + .get_account(&user_account_pda) + .expect("Account should exist after creation"); + assert!(account.data.len() > 0, "Account should have data"); + + svm.expire_blockhash(); + + // Close user + let close_ix = Instruction::new_with_bytes( + program_id, + &close_account_program::instruction::CloseUser {}.data(), + close_account_program::accounts::CloseUserAccountConstraints { + user: payer.pubkey(), + user_account: user_account_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![close_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify account is closed + let account = svm.get_account(&user_account_pda); + assert!(account.is_none(), "Account should be closed"); +} diff --git a/basics/close-account/anchor/README.md b/basics/close-account/anchor/README.md index fba83a7c8..533899a91 100644 --- a/basics/close-account/anchor/README.md +++ b/basics/close-account/anchor/README.md @@ -1,5 +1,11 @@ # Close Account +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Two [instruction handlers](https://solana.com/docs/terminology#instruction-handler): `create_user` initializes a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) `User` [account](https://solana.com/docs/terminology#account), and `close_user` closes it and returns the [rent](https://solana.com/docs/terminology#rent) to the user. 1. `create_user` initializes the PDA with [Anchor](https://solana.com/docs/terminology#anchor)'s `init` constraint: diff --git a/basics/counter/anchor-v1/.gitignore b/basics/counter/anchor-v1/.gitignore new file mode 100644 index 000000000..d243ecc13 --- /dev/null +++ b/basics/counter/anchor-v1/.gitignore @@ -0,0 +1,7 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger diff --git a/basics/counter/anchor-v1/.prettierignore b/basics/counter/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/basics/counter/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/basics/counter/anchor-v1/Anchor.toml b/basics/counter/anchor-v1/Anchor.toml new file mode 100644 index 000000000..2a252a43b --- /dev/null +++ b/basics/counter/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +counter_anchor = "BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/counter/anchor-v1/CHANGELOG.md b/basics/counter/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/counter/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/counter/anchor-v1/Cargo.toml b/basics/counter/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/counter/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/counter/anchor-v1/README.md b/basics/counter/anchor-v1/README.md new file mode 100644 index 000000000..eb7dba01c --- /dev/null +++ b/basics/counter/anchor-v1/README.md @@ -0,0 +1,37 @@ +# Counter (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Increment a global counter stored in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Anchor](https://solana.com/docs/terminology#anchor) adds an explicit `initialize` handler that the native variant handles differently. + +See also: the [repository catalog](../../README.md). + +## Major concepts + +- PDA seeds for global state +- `init` vs `mut` account constraints +- Instruction handlers: initialize and increment + +## Setup + +From `basics/counter/anchor/`: + +```bash +anchor build +``` + +## Testing + +```bash +anchor test +``` + +LiteSVM integration tests in `programs/counter_anchor/tests/` call handlers and assert the stored count. + +## Usage + +Inspect `programs/counter_anchor/src/` for seeds and handler definitions. \ No newline at end of file diff --git a/basics/counter/anchor-v1/programs/counter_anchor/Cargo.toml b/basics/counter/anchor-v1/programs/counter_anchor/Cargo.toml new file mode 100644 index 000000000..3bf40b435 --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "counter_anchor" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "counter_anchor" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/counter/anchor-v1/programs/counter_anchor/Xargo.toml b/basics/counter/anchor-v1/programs/counter_anchor/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/increment.rs b/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/increment.rs new file mode 100644 index 000000000..fa2a65946 --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/increment.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; + +use crate::{Counter, CounterError}; + +#[derive(Accounts)] +pub struct IncrementAccountConstraints<'info> { + #[account(mut)] + pub counter: Account<'info, Counter>, +} + +pub fn handler(context: Context) -> Result<()> { + context.accounts.counter.count = context + .accounts + .counter + .count + .checked_add(1) + .ok_or(CounterError::MathOverflow)?; + Ok(()) +} diff --git a/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/initialize_counter.rs b/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/initialize_counter.rs new file mode 100644 index 000000000..fa17cfd55 --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/initialize_counter.rs @@ -0,0 +1,21 @@ +use anchor_lang::prelude::*; + +use crate::Counter; + +#[derive(Accounts)] +pub struct InitializeCounterAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + space = Counter::DISCRIMINATOR.len() + Counter::INIT_SPACE, + payer = payer + )] + pub counter: Account<'info, Counter>, + pub system_program: Program<'info, System>, +} + +pub fn handler(_context: Context) -> Result<()> { + Ok(()) +} diff --git a/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/mod.rs b/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/mod.rs new file mode 100644 index 000000000..0dd7c5cac --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod increment; +pub mod initialize_counter; + +pub use increment::*; +pub use initialize_counter::*; diff --git a/basics/counter/anchor-v1/programs/counter_anchor/src/lib.rs b/basics/counter/anchor-v1/programs/counter_anchor/src/lib.rs new file mode 100644 index 000000000..d6a48dfcd --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/src/lib.rs @@ -0,0 +1,31 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A"); + +#[program] +pub mod counter_anchor { + use super::*; + + pub fn initialize_counter(context: Context) -> Result<()> { + instructions::initialize_counter::handler(context) + } + + pub fn increment(context: Context) -> Result<()> { + instructions::increment::handler(context) + } +} + +#[account] +#[derive(InitSpace)] +pub struct Counter { + count: u64, +} + +#[error_code] +pub enum CounterError { + #[msg("Counter overflowed u64::MAX")] + MathOverflow, +} diff --git a/basics/counter/anchor-v1/programs/counter_anchor/tests/test_counter.rs b/basics/counter/anchor-v1/programs/counter_anchor/tests/test_counter.rs new file mode 100644 index 000000000..97a3d3c03 --- /dev/null +++ b/basics/counter/anchor-v1/programs/counter_anchor/tests/test_counter.rs @@ -0,0 +1,143 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Minimal deserialization of the Counter account (8-byte discriminator + u64). +#[derive(BorshDeserialize)] +struct CounterAccount { + _discriminator: [u8; 8], + count: u64, +} + +fn setup() -> (LiteSVM, anchor_lang::prelude::Pubkey, Keypair) { + let program_id = counter_anchor::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/counter_anchor.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +fn fetch_counter(svm: &LiteSVM, counter_pubkey: &anchor_lang::prelude::Pubkey) -> u64 { + let account = svm.get_account(counter_pubkey).unwrap(); + let counter = CounterAccount::try_from_slice(&account.data).unwrap(); + counter.count +} + +#[test] +fn test_initialize_counter() { + let (mut svm, _program_id, payer) = setup(); + let counter_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::InitializeCounter {}.data(), + counter_anchor::accounts::InitializeCounterAccountConstraints { + payer: payer.pubkey(), + counter: counter_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &counter_keypair], + &payer.pubkey(), + ) + .unwrap(); + + let count = fetch_counter(&svm, &counter_keypair.pubkey()); + assert_eq!(count, 0, "Expected initialized count to be 0"); +} + +#[test] +fn test_increment_counter() { + let (mut svm, _program_id, payer) = setup(); + let counter_keypair = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::InitializeCounter {}.data(), + counter_anchor::accounts::InitializeCounterAccountConstraints { + payer: payer.pubkey(), + counter: counter_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &counter_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Increment + let inc_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::Increment {}.data(), + counter_anchor::accounts::IncrementAccountConstraints { + counter: counter_keypair.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![inc_ix], &[&payer], &payer.pubkey()).unwrap(); + + let count = fetch_counter(&svm, &counter_keypair.pubkey()); + assert_eq!(count, 1, "Expected count to be 1"); +} + +#[test] +fn test_increment_counter_again() { + let (mut svm, _program_id, payer) = setup(); + let counter_keypair = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::InitializeCounter {}.data(), + counter_anchor::accounts::InitializeCounterAccountConstraints { + payer: payer.pubkey(), + counter: counter_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &counter_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Increment twice + for _ in 0..2 { + let inc_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::Increment {}.data(), + counter_anchor::accounts::IncrementAccountConstraints { + counter: counter_keypair.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![inc_ix], &[&payer], &payer.pubkey()) + .unwrap(); + svm.expire_blockhash(); + } + + let count = fetch_counter(&svm, &counter_keypair.pubkey()); + assert_eq!(count, 2, "Expected count to be 2"); +} diff --git a/basics/counter/anchor/README.md b/basics/counter/anchor/README.md index 1ba5dff87..b425e98ad 100644 --- a/basics/counter/anchor/README.md +++ b/basics/counter/anchor/README.md @@ -1,5 +1,11 @@ # Counter (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Increment a global counter stored in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Anchor](https://solana.com/docs/terminology#anchor) adds an explicit `initialize_counter` handler that the native variant handles differently. See also: the [repository catalog](../../README.md). diff --git a/basics/create-account/anchor-v1/Anchor.toml b/basics/create-account/anchor-v1/Anchor.toml new file mode 100644 index 000000000..34b77695e --- /dev/null +++ b/basics/create-account/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +create_system_account = "ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/create-account/anchor-v1/CHANGELOG.md b/basics/create-account/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/create-account/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/create-account/anchor-v1/Cargo.toml b/basics/create-account/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/create-account/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/create-account/anchor-v1/README.md b/basics/create-account/anchor-v1/README.md new file mode 100644 index 000000000..4c9ade78f --- /dev/null +++ b/basics/create-account/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Create Account (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Create new onchain accounts and fund them for rent exemption using the System Program. + +See also: [Create Account overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Account creation CPI +- Rent-exempt lamport funding + +## Setup + +From this directory (`basics/create-account/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/create-account/anchor-v1/programs/create-system-account/Cargo.toml b/basics/create-account/anchor-v1/programs/create-system-account/Cargo.toml new file mode 100644 index 000000000..3dd5dabd7 --- /dev/null +++ b/basics/create-account/anchor-v1/programs/create-system-account/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "create-system-account" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "create_system_account" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/create-account/anchor-v1/programs/create-system-account/Xargo.toml b/basics/create-account/anchor-v1/programs/create-system-account/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/create-account/anchor-v1/programs/create-system-account/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/create-account/anchor-v1/programs/create-system-account/src/lib.rs b/basics/create-account/anchor-v1/programs/create-system-account/src/lib.rs new file mode 100644 index 000000000..8898ba274 --- /dev/null +++ b/basics/create-account/anchor-v1/programs/create-system-account/src/lib.rs @@ -0,0 +1,47 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; + +declare_id!("ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi"); + +#[program] +pub mod create_system_account { + use super::*; + + pub fn create_system_account( + context: Context, + ) -> Result<()> { + msg!("Program invoked. Creating a system account..."); + msg!( + " New public key will be: {}", + &context.accounts.new_account.key().to_string() + ); + + // The minimum lamports for rent exemption + let lamports = (Rent::get()?).minimum_balance(0); + + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), // From pubkey + to: context.accounts.new_account.to_account_info(), // To pubkey + }, + ), + lamports, // Lamports + 0, // Space + &context.accounts.system_program.key(), // Owner Program + )?; + + msg!("Account created successfully."); + Ok(()) + } +} + +#[derive(Accounts)] +pub struct CreateSystemAccountAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub new_account: Signer<'info>, + pub system_program: Program<'info, System>, +} diff --git a/basics/create-account/anchor-v1/programs/create-system-account/tests/test_create_account.rs b/basics/create-account/anchor-v1/programs/create-system-account/tests/test_create_account.rs new file mode 100644 index 000000000..70fe47ec5 --- /dev/null +++ b/basics/create-account/anchor-v1/programs/create-system-account/tests/test_create_account.rs @@ -0,0 +1,46 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, rent::Rent, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[test] +fn test_create_the_account() { + let program_id = create_system_account::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/create_system_account.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let new_account = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &create_system_account::instruction::CreateSystemAccount {}.data(), + create_system_account::accounts::CreateSystemAccountAccountConstraints { + payer: payer.pubkey(), + new_account: new_account.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &new_account], + &payer.pubkey(), + ) + .unwrap(); + + // Minimum balance for rent exemption for 0-data account + let lamports = Rent::default().minimum_balance(0); + + let account_info = svm.get_account(&new_account.pubkey()).unwrap(); + assert_eq!(account_info.lamports, lamports); +} diff --git a/basics/create-account/anchor/README.md b/basics/create-account/anchor/README.md index 7f58c49f5..5986209b8 100644 --- a/basics/create-account/anchor/README.md +++ b/basics/create-account/anchor/README.md @@ -1,5 +1,11 @@ # Create Account (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Create new onchain accounts and fund them for rent exemption using the System Program. See also: [Create Account overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/cross-program-invocation/anchor-v1/.gitignore b/basics/cross-program-invocation/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/basics/cross-program-invocation/anchor-v1/.prettierignore b/basics/cross-program-invocation/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/basics/cross-program-invocation/anchor-v1/Anchor.toml b/basics/cross-program-invocation/anchor-v1/Anchor.toml new file mode 100644 index 000000000..32edcc336 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/Anchor.toml @@ -0,0 +1,19 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +hand = "Bi5N7SUQhpGknVcqPTzdFFVueQoxoUu8YTLz75J6fT8A" +lever = "E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/cross-program-invocation/anchor-v1/CHANGELOG.md b/basics/cross-program-invocation/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/cross-program-invocation/anchor-v1/Cargo.toml b/basics/cross-program-invocation/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/cross-program-invocation/anchor-v1/README.md b/basics/cross-program-invocation/anchor-v1/README.md new file mode 100644 index 000000000..d49fed3d6 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Cross-Program Invocation (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Invoke another program from this one (hand program calls lever program) using CPI. + +See also: [Cross Program Invocation overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Cross-program invocation (CPI) +- Composing multiple programs in one transaction + +## Setup + +From this directory (`basics/cross-program-invocation/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/cross-program-invocation/anchor-v1/idls/lever.json b/basics/cross-program-invocation/anchor-v1/idls/lever.json new file mode 100644 index 000000000..3ec862d79 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/idls/lever.json @@ -0,0 +1,68 @@ +{ + "address": "E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN", + "metadata": { + "name": "lever", + "version": "0.1.0", + "spec": "0.1.0", + "description": "Created with Anchor" + }, + "instructions": [ + { + "name": "initialize", + "discriminator": [175, 175, 109, 31, 13, 152, 155, 237], + "accounts": [ + { + "name": "power", + "writable": true, + "signer": true + }, + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "switch_power", + "discriminator": [226, 238, 56, 172, 191, 45, 122, 87], + "accounts": [ + { + "name": "power", + "writable": true + } + ], + "args": [ + { + "name": "name", + "type": "string" + } + ] + } + ], + "accounts": [ + { + "name": "PowerStatus", + "discriminator": [145, 147, 198, 35, 253, 101, 231, 26] + } + ], + "types": [ + { + "name": "PowerStatus", + "type": { + "kind": "struct", + "fields": [ + { + "name": "is_on", + "type": "bool" + } + ] + } + } + ] +} diff --git a/basics/cross-program-invocation/anchor-v1/programs/hand/Cargo.toml b/basics/cross-program-invocation/anchor-v1/programs/hand/Cargo.toml new file mode 100644 index 000000000..bfb4cecd4 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/hand/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "hand" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "hand" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/cross-program-invocation/anchor-v1/programs/hand/Xargo.toml b/basics/cross-program-invocation/anchor-v1/programs/hand/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/hand/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/cross-program-invocation/anchor-v1/programs/hand/src/lib.rs b/basics/cross-program-invocation/anchor-v1/programs/hand/src/lib.rs new file mode 100644 index 000000000..2efa0b06e --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/hand/src/lib.rs @@ -0,0 +1,33 @@ +use anchor_lang::prelude::*; + +declare_id!("Bi5N7SUQhpGknVcqPTzdFFVueQoxoUu8YTLz75J6fT8A"); + +// automatically generate module using program idl found in ./idls +declare_program!(lever); +use lever::accounts::PowerStatus; +use lever::cpi::accounts::SwitchPower; +use lever::cpi::switch_power; +use lever::program::Lever; + +#[program] +pub mod hand { + use super::*; + + pub fn pull_lever(context: Context, name: String) -> Result<()> { + let cpi_ctx = CpiContext::new( + context.accounts.lever_program.key(), + SwitchPower { + power: context.accounts.power.to_account_info(), + }, + ); + switch_power(cpi_ctx, name)?; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct PullLeverAccountConstraints<'info> { + #[account(mut)] + pub power: Account<'info, PowerStatus>, + pub lever_program: Program<'info, Lever>, +} diff --git a/basics/cross-program-invocation/anchor-v1/programs/hand/tests/test_hand.rs b/basics/cross-program-invocation/anchor-v1/programs/hand/tests/test_hand.rs new file mode 100644 index 000000000..e9c7c64ac --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/hand/tests/test_hand.rs @@ -0,0 +1,130 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// PowerStatus account layout: 8-byte discriminator + 1-byte bool + 7 bytes padding. +/// Account space is 8 + 8 = 16 bytes, so read the raw bytes instead of using BorshDeserialize +/// to avoid "Not all bytes read" errors from the padding. +fn read_power_is_on(svm: &LiteSVM, pubkey: &anchor_lang::prelude::Pubkey) -> bool { + let account = svm.get_account(pubkey).unwrap(); + // Skip 8-byte discriminator, read 1 byte for bool + account.data[8] != 0 +} + +/// Build the lever program's `initialize` instruction manually. +/// Discriminator from IDL: [175, 175, 109, 31, 13, 152, 155, 237] +fn build_lever_initialize_ix( + lever_program_id: anchor_lang::prelude::Pubkey, + power: anchor_lang::prelude::Pubkey, + user: anchor_lang::prelude::Pubkey, +) -> Instruction { + let discriminator: [u8; 8] = [175, 175, 109, 31, 13, 152, 155, 237]; + Instruction { + program_id: lever_program_id, + accounts: vec![ + AccountMeta::new(power, true), + AccountMeta::new(user, true), + AccountMeta::new_readonly(system_program::id(), false), + ], + data: discriminator.to_vec(), + } +} + +#[test] +fn test_pull_lever_cpi() { + let hand_program_id = hand::id(); + // The lever program ID from declare_program!(lever) inside hand crate + let lever_program_id = hand::lever::ID; + + let mut svm = LiteSVM::new(); + + // Load both programs + let hand_bytes = include_bytes!("../../../target/deploy/hand.so"); + // Use std::fs::read() instead of include_bytes!() for the lever program because + // include_bytes!() runs at compile time, and during `anchor build` the IDL generation + // step compiles tests before the .so files exist. Since this is a cross-program + // dependency (not our own program), lever.so may not be built yet at compile time. + let lever_bytes = std::fs::read(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../target/deploy/lever.so" + )) + .expect("lever.so not found - run `anchor build` first"); + svm.add_program(hand_program_id, hand_bytes).unwrap(); + svm.add_program(lever_program_id, &lever_bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let power_keypair = Keypair::new(); + + // Initialize the lever directly (manually constructed instruction) + let init_ix = + build_lever_initialize_ix(lever_program_id, power_keypair.pubkey(), payer.pubkey()); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &power_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify initial state is off + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after initialization" + ); + + // Pull the lever via the hand program (CPI into lever) + svm.expire_blockhash(); + let pull_ix = Instruction::new_with_bytes( + hand_program_id, + &hand::instruction::PullLever { + name: "Jacob".to_string(), + } + .data(), + hand::accounts::PullLeverAccountConstraints { + power: power_keypair.pubkey(), + lever_program: lever_program_id, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![pull_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify power is now on + assert!( + read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be on after pulling lever" + ); + + // Pull it again + svm.expire_blockhash(); + let pull_ix2 = Instruction::new_with_bytes( + hand_program_id, + &hand::instruction::PullLever { + name: "sol-warrior".to_string(), + } + .data(), + hand::accounts::PullLeverAccountConstraints { + power: power_keypair.pubkey(), + lever_program: lever_program_id, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![pull_ix2], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify power is now off again + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after pulling lever again" + ); +} diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/Cargo.toml b/basics/cross-program-invocation/anchor-v1/programs/lever/Cargo.toml new file mode 100644 index 000000000..19826a09a --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "lever" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "lever" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/Xargo.toml b/basics/cross-program-invocation/anchor-v1/programs/lever/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/initialize.rs b/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/initialize.rs new file mode 100644 index 000000000..025fc5b7d --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/initialize.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +use crate::PowerStatus; + +#[derive(Accounts)] +pub struct InitializeLeverAccountConstraints<'info> { + #[account(init, payer = user, space = PowerStatus::DISCRIMINATOR.len() + PowerStatus::INIT_SPACE)] + pub power: Account<'info, PowerStatus>, + #[account(mut)] + pub user: Signer<'info>, + pub system_program: Program<'info, System>, +} + +pub fn handler(_context: Context) -> Result<()> { + Ok(()) +} diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/mod.rs b/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/mod.rs new file mode 100644 index 000000000..1a992a880 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize; +pub mod switch_power; + +pub use initialize::*; +pub use switch_power::*; diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/switch_power.rs b/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/switch_power.rs new file mode 100644 index 000000000..55674ab63 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/src/instructions/switch_power.rs @@ -0,0 +1,23 @@ +use anchor_lang::prelude::*; + +use crate::PowerStatus; + +#[derive(Accounts)] +pub struct SetPowerStatusAccountConstraints<'info> { + #[account(mut)] + pub power: Account<'info, PowerStatus>, +} + +pub fn handler(context: Context, name: String) -> Result<()> { + let power = &mut context.accounts.power; + power.is_on = !power.is_on; + + msg!("{} is pulling the power switch!", &name); + + match power.is_on { + true => msg!("The power is now on."), + false => msg!("The power is now off!"), + }; + + Ok(()) +} diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/src/lib.rs b/basics/cross-program-invocation/anchor-v1/programs/lever/src/lib.rs new file mode 100644 index 000000000..fa90458d9 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/src/lib.rs @@ -0,0 +1,28 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN"); + +#[program] +pub mod lever { + use super::*; + + pub fn initialize(context: Context) -> Result<()> { + instructions::initialize::handler(context) + } + + pub fn switch_power( + context: Context, + name: String, + ) -> Result<()> { + instructions::switch_power::handler(context, name) + } +} + +#[account] +#[derive(InitSpace)] +pub struct PowerStatus { + pub is_on: bool, +} diff --git a/basics/cross-program-invocation/anchor-v1/programs/lever/tests/test_lever.rs b/basics/cross-program-invocation/anchor-v1/programs/lever/tests/test_lever.rs new file mode 100644 index 000000000..47d32a638 --- /dev/null +++ b/basics/cross-program-invocation/anchor-v1/programs/lever/tests/test_lever.rs @@ -0,0 +1,124 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// PowerStatus account layout: 8-byte discriminator + 1-byte bool + 7 bytes padding. +/// Account space is 8 + 8 = 16 bytes, so read raw bytes to avoid "Not all bytes read" errors. +fn read_power_is_on(svm: &LiteSVM, pubkey: &anchor_lang::prelude::Pubkey) -> bool { + let account = svm.get_account(pubkey).unwrap(); + account.data[8] != 0 +} + +#[test] +fn test_initialize_lever() { + let program_id = lever::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/lever.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let power_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &lever::instruction::Initialize {}.data(), + lever::accounts::InitializeLeverAccountConstraints { + power: power_keypair.pubkey(), + user: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &power_keypair], + &payer.pubkey(), + ) + .unwrap(); + + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after initialization" + ); +} + +#[test] +fn test_switch_power() { + let program_id = lever::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/lever.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let power_keypair = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + program_id, + &lever::instruction::Initialize {}.data(), + lever::accounts::InitializeLeverAccountConstraints { + power: power_keypair.pubkey(), + user: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &power_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Switch power on + let switch_ix = Instruction::new_with_bytes( + program_id, + &lever::instruction::SwitchPower { + name: "Alice".to_string(), + } + .data(), + lever::accounts::SetPowerStatusAccountConstraints { + power: power_keypair.pubkey(), + } + .to_account_metas(None), + ); + svm.expire_blockhash(); + send_transaction_from_instructions(&mut svm, vec![switch_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + assert!( + read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be on after first switch" + ); + + // Switch power off + let switch_ix2 = Instruction::new_with_bytes( + program_id, + &lever::instruction::SwitchPower { + name: "Bob".to_string(), + } + .data(), + lever::accounts::SetPowerStatusAccountConstraints { + power: power_keypair.pubkey(), + } + .to_account_metas(None), + ); + svm.expire_blockhash(); + send_transaction_from_instructions(&mut svm, vec![switch_ix2], &[&payer], &payer.pubkey()) + .unwrap(); + + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after second switch" + ); +} diff --git a/basics/cross-program-invocation/anchor/README.md b/basics/cross-program-invocation/anchor/README.md index 4d2f41a6a..cd7b7fe51 100644 --- a/basics/cross-program-invocation/anchor/README.md +++ b/basics/cross-program-invocation/anchor/README.md @@ -1,5 +1,11 @@ # Cross-Program Invocation (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Invoke another program from this one (hand program calls lever program) using CPI. See also: [Cross Program Invocation overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/favorites/anchor-v1/.gitignore b/basics/favorites/anchor-v1/.gitignore new file mode 100644 index 000000000..6e66c84b7 --- /dev/null +++ b/basics/favorites/anchor-v1/.gitignore @@ -0,0 +1,9 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn +.env diff --git a/basics/favorites/anchor-v1/.prettierignore b/basics/favorites/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/basics/favorites/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/basics/favorites/anchor-v1/Anchor.toml b/basics/favorites/anchor-v1/Anchor.toml new file mode 100644 index 000000000..3847ba91e --- /dev/null +++ b/basics/favorites/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +favorites = "ww9C83noARSQVBnqmCUmaVdbJjmiwcV9j2LkXYMoUCV" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/favorites/anchor-v1/CHANGELOG.md b/basics/favorites/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/favorites/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/favorites/anchor-v1/Cargo.toml b/basics/favorites/anchor-v1/Cargo.toml new file mode 100644 index 000000000..14a951cee --- /dev/null +++ b/basics/favorites/anchor-v1/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/favorites/anchor-v1/README.md b/basics/favorites/anchor-v1/README.md new file mode 100644 index 000000000..d30ce843b --- /dev/null +++ b/basics/favorites/anchor-v1/README.md @@ -0,0 +1,34 @@ +# Favorites (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Store per-user favorites in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Account](https://solana.com/docs/terminology#account) constraints ensure each user can only modify their own data. + +See also: the [repository catalog](../../README.md). + +## Major concepts + +- Per-user PDA keyed by signer +- Anchor constraints for authority checks + +## Setup + +```bash +anchor build +``` + +## Testing + +```bash +anchor test +``` + +LiteSVM tests in `programs/` assert that users cannot overwrite each other's state. + +## Usage + +`anchor deploy` targets the cluster in `Anchor.toml`. \ No newline at end of file diff --git a/basics/favorites/anchor-v1/programs/favorites/Cargo.toml b/basics/favorites/anchor-v1/programs/favorites/Cargo.toml new file mode 100644 index 000000000..229771829 --- /dev/null +++ b/basics/favorites/anchor-v1/programs/favorites/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "favorites" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "favorites" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = {version = "1.1.2", features = ["init-if-needed"]} + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/favorites/anchor-v1/programs/favorites/Xargo.toml b/basics/favorites/anchor-v1/programs/favorites/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/favorites/anchor-v1/programs/favorites/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/favorites/anchor-v1/programs/favorites/src/lib.rs b/basics/favorites/anchor-v1/programs/favorites/src/lib.rs new file mode 100644 index 000000000..6f4fabc8c --- /dev/null +++ b/basics/favorites/anchor-v1/programs/favorites/src/lib.rs @@ -0,0 +1,68 @@ +use anchor_lang::prelude::*; +// Our program's address! +// This matches the key in the target/deploy directory +declare_id!("ww9C83noARSQVBnqmCUmaVdbJjmiwcV9j2LkXYMoUCV"); + +// Our Solana program! +#[program] +pub mod favorites { + use super::*; + + // Our instruction handler! It sets the user's favorite number and color + pub fn set_favorites( + context: Context, + number: u64, + color: String, + hobbies: Vec, + ) -> Result<()> { + msg!("Greetings from {}", context.program_id); + let user_public_key = context.accounts.user.key(); + msg!( + "User {user_public_key}'s favorite number is {number}, favorite color is: {color}, and their hobbies are {hobbies:?}", + ); + + context.accounts.favorites.set_inner(Favorites { + number, + color, + hobbies, + bump: context.bumps.favorites, + }); + Ok(()) + } + + // We can also add a get_favorites instruction handler to return the user's favorite number and color +} + +// What we will put inside the Favorites PDA +#[account] +#[derive(InitSpace)] +pub struct Favorites { + pub number: u64, + + #[max_len(50)] + pub color: String, + + #[max_len(5, 50)] + pub hobbies: Vec, + + /// Canonical bump for this PDA. Stored so later instructions can + /// re-derive/validate the PDA without recomputing via `find_program_address`. + pub bump: u8, +} +// When people call the set_favorites instruction, they will need to provide the accounts that will be modifed. This keeps Solana fast! +#[derive(Accounts)] +pub struct SetFavoritesAccountConstraints<'info> { + #[account(mut)] + pub user: Signer<'info>, + + #[account( + init_if_needed, + payer = user, + space = Favorites::DISCRIMINATOR.len() + Favorites::INIT_SPACE, + seeds=[b"favorites", user.key().as_ref()], + bump + )] + pub favorites: Account<'info, Favorites>, + + pub system_program: Program<'info, System>, +} diff --git a/basics/favorites/anchor-v1/programs/favorites/tests/test_favorites.rs b/basics/favorites/anchor-v1/programs/favorites/tests/test_favorites.rs new file mode 100644 index 000000000..6f217c0df --- /dev/null +++ b/basics/favorites/anchor-v1/programs/favorites/tests/test_favorites.rs @@ -0,0 +1,163 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +struct FavoritesData { + number: u64, + color: String, + hobbies: Vec, +} + +/// Manually deserialize the Favorites account data, skipping the 8-byte discriminator. +/// We can't use BorshDeserialize on the full account because init_if_needed allocates +/// more space than the serialized data occupies (padding for max_len strings/vecs). +fn read_favorites(svm: &LiteSVM, pda: &Pubkey) -> FavoritesData { + let account = svm.get_account(pda).unwrap(); + let data = &account.data[8..]; // skip discriminator + let mut offset = 0; + + // u64 number + let number = u64::from_le_bytes(data[offset..offset + 8].try_into().unwrap()); + offset += 8; + + // String color (4-byte length prefix + utf8 data) + let color_len = u32::from_le_bytes(data[offset..offset + 4].try_into().unwrap()) as usize; + offset += 4; + let color = String::from_utf8(data[offset..offset + color_len].to_vec()).unwrap(); + offset += color_len; + + // Vec hobbies (4-byte vec length + each string) + let hobbies_count = + u32::from_le_bytes(data[offset..offset + 4].try_into().unwrap()) as usize; + offset += 4; + let mut hobbies = Vec::with_capacity(hobbies_count); + for _ in 0..hobbies_count { + let hobby_len = + u32::from_le_bytes(data[offset..offset + 4].try_into().unwrap()) as usize; + offset += 4; + let hobby = String::from_utf8(data[offset..offset + hobby_len].to_vec()).unwrap(); + offset += hobby_len; + hobbies.push(hobby); + } + + FavoritesData { + number, + color, + hobbies, + } +} + +fn setup() -> (LiteSVM, Pubkey, solana_keypair::Keypair) { + let program_id = favorites::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/favorites.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +fn favorites_pda(program_id: &Pubkey, user: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"favorites", user.as_ref()], program_id).0 +} + +#[test] +fn test_set_favorites() { + let (mut svm, program_id, payer) = setup(); + let pda = favorites_pda(&program_id, &payer.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &favorites::instruction::SetFavorites { + number: 23, + color: "purple".to_string(), + hobbies: vec![ + "skiing".to_string(), + "skydiving".to_string(), + "biking".to_string(), + ], + } + .data(), + favorites::accounts::SetFavoritesAccountConstraints { + user: payer.pubkey(), + favorites: pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + let data = read_favorites(&svm, &pda); + assert_eq!(data.number, 23); + assert_eq!(data.color, "purple"); + assert_eq!(data.hobbies, vec!["skiing", "skydiving", "biking"]); +} + +#[test] +fn test_update_favorites() { + let (mut svm, program_id, payer) = setup(); + let pda = favorites_pda(&program_id, &payer.pubkey()); + + // Set initial favorites + let instruction = Instruction::new_with_bytes( + program_id, + &favorites::instruction::SetFavorites { + number: 23, + color: "purple".to_string(), + hobbies: vec![ + "skiing".to_string(), + "skydiving".to_string(), + "biking".to_string(), + ], + } + .data(), + favorites::accounts::SetFavoritesAccountConstraints { + user: payer.pubkey(), + favorites: pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + // Update favorites with new hobbies + svm.expire_blockhash(); + let update_ix = Instruction::new_with_bytes( + program_id, + &favorites::instruction::SetFavorites { + number: 23, + color: "purple".to_string(), + hobbies: vec![ + "skiing".to_string(), + "skydiving".to_string(), + "biking".to_string(), + "swimming".to_string(), + ], + } + .data(), + favorites::accounts::SetFavoritesAccountConstraints { + user: payer.pubkey(), + favorites: pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + let data = read_favorites(&svm, &pda); + assert_eq!(data.number, 23); + assert_eq!(data.color, "purple"); + assert_eq!( + data.hobbies, + vec!["skiing", "skydiving", "biking", "swimming"] + ); +} diff --git a/basics/favorites/anchor/README.md b/basics/favorites/anchor/README.md index 1194598de..1b49da05b 100644 --- a/basics/favorites/anchor/README.md +++ b/basics/favorites/anchor/README.md @@ -1,5 +1,11 @@ # Favorites (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Store per-user favorites in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Account](https://solana.com/docs/terminology#account) constraints ensure each user can only modify their own data. See also: the [repository catalog](../../README.md). diff --git a/basics/hello-solana/anchor-v1/Anchor.toml b/basics/hello-solana/anchor-v1/Anchor.toml new file mode 100644 index 000000000..2b4e653dc --- /dev/null +++ b/basics/hello-solana/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +hello_solana = "2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/hello-solana/anchor-v1/CHANGELOG.md b/basics/hello-solana/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/hello-solana/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/hello-solana/anchor-v1/Cargo.toml b/basics/hello-solana/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/hello-solana/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/hello-solana/anchor-v1/README.md b/basics/hello-solana/anchor-v1/README.md new file mode 100644 index 000000000..a16edc937 --- /dev/null +++ b/basics/hello-solana/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Hello Solana (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Minimal program that logs a greeting. Introduces transactions, instructions, and program entrypoints. + +See also: [Hello Solana overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Program entrypoint and instruction data +- Logging from onchain code + +## Setup + +From this directory (`basics/hello-solana/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/hello-solana/anchor-v1/programs/hello-solana/Cargo.toml b/basics/hello-solana/anchor-v1/programs/hello-solana/Cargo.toml new file mode 100644 index 000000000..a5c764e32 --- /dev/null +++ b/basics/hello-solana/anchor-v1/programs/hello-solana/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "hello-solana-anchor" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "hello_solana" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-kite = "0.4.0" +solana-transaction = "3.0.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/hello-solana/anchor-v1/programs/hello-solana/Xargo.toml b/basics/hello-solana/anchor-v1/programs/hello-solana/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/hello-solana/anchor-v1/programs/hello-solana/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/hello-solana/anchor-v1/programs/hello-solana/src/lib.rs b/basics/hello-solana/anchor-v1/programs/hello-solana/src/lib.rs new file mode 100644 index 000000000..54fc73ecb --- /dev/null +++ b/basics/hello-solana/anchor-v1/programs/hello-solana/src/lib.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; + +declare_id!("2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV"); + +#[program] +pub mod hello_solana { + use super::*; + + pub fn hello(_context: Context) -> Result<()> { + msg!("Hello, Solana!"); + + msg!("Our program's Program ID: {}", &id()); + + Ok(()) + } +} + +#[derive(Accounts)] +pub struct HelloAccountConstraints {} diff --git a/basics/hello-solana/anchor-v1/programs/hello-solana/tests/test_hello.rs b/basics/hello-solana/anchor-v1/programs/hello-solana/tests/test_hello.rs new file mode 100644 index 000000000..6dd3541db --- /dev/null +++ b/basics/hello-solana/anchor-v1/programs/hello-solana/tests/test_hello.rs @@ -0,0 +1,42 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::create_wallet, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +#[test] +fn test_say_hello() { + let program_id = hello_solana::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/hello_solana.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 1_000_000_000).unwrap(); + + let instruction = Instruction::new_with_bytes( + program_id, + &hello_solana::instruction::Hello {}.data(), + hello_solana::accounts::HelloAccountConstraints {}.to_account_metas(None), + ); + + // The program only logs; assert it emitted its greeting rather than merely + // that the transaction landed. kite's send helper discards the metadata, so + // send through LiteSVM directly to read the logs. + let transaction = Transaction::new_signed_with_payer( + &[instruction], + Some(&payer.pubkey()), + &[&payer], + svm.latest_blockhash(), + ); + let metadata = svm.send_transaction(transaction).unwrap(); + + assert!( + metadata + .logs + .iter() + .any(|log| log.contains("Hello, Solana!")), + "expected the program to log its greeting, got: {:?}", + metadata.logs + ); +} diff --git a/basics/hello-solana/anchor/README.md b/basics/hello-solana/anchor/README.md index 4c8f4b729..35e2643a7 100644 --- a/basics/hello-solana/anchor/README.md +++ b/basics/hello-solana/anchor/README.md @@ -1,5 +1,11 @@ # Hello Solana (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Minimal program that logs a greeting. Introduces transactions, instructions, and program entrypoints. See also: [Hello Solana overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/pda-rent-payer/anchor-v1/Anchor.toml b/basics/pda-rent-payer/anchor-v1/Anchor.toml new file mode 100644 index 000000000..1dd276da7 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +pda_rent_payer = "7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/pda-rent-payer/anchor-v1/CHANGELOG.md b/basics/pda-rent-payer/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/pda-rent-payer/anchor-v1/Cargo.toml b/basics/pda-rent-payer/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/pda-rent-payer/anchor-v1/README.md b/basics/pda-rent-payer/anchor-v1/README.md new file mode 100644 index 000000000..dcdf0caa7 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/README.md @@ -0,0 +1,40 @@ +# PDA Rent Payer (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Use a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) to pay [rent](https://solana.com/docs/terminology#rent) when creating another account. + +See also: [Pda Rent Payer overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- PDA as signer via seeds and bump +- Rent payer pattern + +## Setup + +From this directory (`basics/pda-rent-payer/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Cargo.toml b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Cargo.toml new file mode 100644 index 000000000..2eba08465 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "pda-rent-payer" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "pda_rent_payer" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Xargo.toml b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/create_new_account.rs b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/create_new_account.rs new file mode 100644 index 000000000..80a2e84c8 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/create_new_account.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; + +#[derive(Accounts)] +pub struct CreateNewAccountAccountConstraints<'info> { + #[account(mut)] + new_account: Signer<'info>, + + #[account( + mut, + seeds = [ + b"rent_vault", + ], + bump, + )] + rent_vault: SystemAccount<'info>, + system_program: Program<'info, System>, +} + +pub fn handle_create_new_account( + context: Context, +) -> Result<()> { + // PDA signer seeds + let signer_seeds: &[&[&[u8]]] = &[&[b"rent_vault", &[context.bumps.rent_vault]]]; + + // The minimum lamports for rent exemption + let lamports = (Rent::get()?).minimum_balance(0); + + // Create the new account, transferring lamports from the rent vault to the new account + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.rent_vault.to_account_info(), // From pubkey + to: context.accounts.new_account.to_account_info(), // To pubkey + }, + ) + .with_signer(signer_seeds), + lamports, // Lamports + 0, // Space + &context.accounts.system_program.key(), // Owner Program + )?; + Ok(()) +} diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/init_rent_vault.rs b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/init_rent_vault.rs new file mode 100644 index 000000000..a15c49b42 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/init_rent_vault.rs @@ -0,0 +1,37 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{transfer, Transfer}; + +#[derive(Accounts)] +pub struct InitRentVaultAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + #[account( + mut, + seeds = [ + b"rent_vault", + ], + bump, + )] + rent_vault: SystemAccount<'info>, + system_program: Program<'info, System>, +} + +// When lamports are transferred to a new address (without and existing account), +// An account owned by the system program is created by default +pub fn handle_init_rent_vault( + context: Context, + fund_lamports: u64, +) -> Result<()> { + transfer( + CpiContext::new( + context.accounts.system_program.key(), + Transfer { + from: context.accounts.payer.to_account_info(), + to: context.accounts.rent_vault.to_account_info(), + }, + ), + fund_lamports, + )?; + Ok(()) +} diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs new file mode 100644 index 000000000..31d096b95 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod create_new_account; +pub mod init_rent_vault; + +pub use create_new_account::*; +pub use init_rent_vault::*; diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/lib.rs b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/lib.rs new file mode 100644 index 000000000..c3f3b686c --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/src/lib.rs @@ -0,0 +1,21 @@ +use anchor_lang::prelude::*; +use instructions::*; +pub mod instructions; + +declare_id!("7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA"); + +#[program] +pub mod pda_rent_payer { + use super::*; + + pub fn init_rent_vault( + context: Context, + fund_lamports: u64, + ) -> Result<()> { + init_rent_vault::handle_init_rent_vault(context, fund_lamports) + } + + pub fn create_new_account(context: Context) -> Result<()> { + create_new_account::handle_create_new_account(context) + } +} diff --git a/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/tests/test_pda_rent_payer.rs b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/tests/test_pda_rent_payer.rs new file mode 100644 index 000000000..650d71864 --- /dev/null +++ b/basics/pda-rent-payer/anchor-v1/programs/anchor-program-example/tests/test_pda_rent_payer.rs @@ -0,0 +1,112 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Keypair) { + let program_id = pda_rent_payer::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/pda_rent_payer.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_init_rent_vault() { + let (mut svm, payer) = setup(); + let program_id = pda_rent_payer::id(); + + let (rent_vault_pda, _bump) = Pubkey::find_program_address(&[b"rent_vault"], &program_id); + + // Fund the rent vault with 1 SOL + let fund_amount: u64 = 1_000_000_000; + let init_ix = Instruction::new_with_bytes( + program_id, + &pda_rent_payer::instruction::InitRentVault { + fund_lamports: fund_amount, + } + .data(), + pda_rent_payer::accounts::InitRentVaultAccountConstraints { + payer: payer.pubkey(), + rent_vault: rent_vault_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify the rent vault has the correct balance + let account = svm + .get_account(&rent_vault_pda) + .expect("Rent vault should exist"); + assert_eq!( + account.lamports, fund_amount, + "Rent vault should have 1 SOL" + ); +} + +#[test] +fn test_create_new_account_from_rent_vault() { + let (mut svm, payer) = setup(); + let program_id = pda_rent_payer::id(); + + let (rent_vault_pda, _bump) = Pubkey::find_program_address(&[b"rent_vault"], &program_id); + + // Fund the rent vault with 1 SOL + let fund_amount: u64 = 1_000_000_000; + let init_ix = Instruction::new_with_bytes( + program_id, + &pda_rent_payer::instruction::InitRentVault { + fund_lamports: fund_amount, + } + .data(), + pda_rent_payer::accounts::InitRentVaultAccountConstraints { + payer: payer.pubkey(), + rent_vault: rent_vault_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + svm.expire_blockhash(); + + // Create a new account using the rent vault + let new_account = Keypair::new(); + let create_ix = Instruction::new_with_bytes( + program_id, + &pda_rent_payer::instruction::CreateNewAccount {}.data(), + pda_rent_payer::accounts::CreateNewAccountAccountConstraints { + new_account: new_account.pubkey(), + rent_vault: rent_vault_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &new_account], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the new account was created with minimum rent-exempt balance + let rent_exempt_balance = svm.minimum_balance_for_rent_exemption(0); + let account = svm + .get_account(&new_account.pubkey()) + .expect("New account should exist"); + assert_eq!( + account.lamports, rent_exempt_balance, + "New account should have rent-exempt balance" + ); +} diff --git a/basics/pda-rent-payer/anchor/README.md b/basics/pda-rent-payer/anchor/README.md index 93c9c03dc..022a62e51 100644 --- a/basics/pda-rent-payer/anchor/README.md +++ b/basics/pda-rent-payer/anchor/README.md @@ -1,5 +1,11 @@ # PDA Rent Payer (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Use a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) to pay [rent](https://solana.com/docs/terminology#rent) when creating another account. See also: [Pda Rent Payer overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/processing-instructions/anchor-v1/Anchor.toml b/basics/processing-instructions/anchor-v1/Anchor.toml new file mode 100644 index 000000000..cf29467ae --- /dev/null +++ b/basics/processing-instructions/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +processing_instructions = "DgoL5J44aspizyUs9fcnpGEUJjWTLJRCfx8eYtUMYczf" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/processing-instructions/anchor-v1/CHANGELOG.md b/basics/processing-instructions/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/processing-instructions/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/processing-instructions/anchor-v1/Cargo.toml b/basics/processing-instructions/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/processing-instructions/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/processing-instructions/anchor-v1/README.md b/basics/processing-instructions/anchor-v1/README.md new file mode 100644 index 000000000..c1ec784db --- /dev/null +++ b/basics/processing-instructions/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Processing Instructions (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Pass arguments into an [instruction handler](https://solana.com/docs/terminology#instruction-handler) and use them in program logic. + +See also: [Processing Instructions overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Instruction data deserialization +- Handler parameters + +## Setup + +From this directory (`basics/processing-instructions/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/processing-instructions/anchor-v1/programs/processing-instructions/Cargo.toml b/basics/processing-instructions/anchor-v1/programs/processing-instructions/Cargo.toml new file mode 100644 index 000000000..21eb08981 --- /dev/null +++ b/basics/processing-instructions/anchor-v1/programs/processing-instructions/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "processing-instructions" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "processing_instructions" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/processing-instructions/anchor-v1/programs/processing-instructions/Xargo.toml b/basics/processing-instructions/anchor-v1/programs/processing-instructions/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/processing-instructions/anchor-v1/programs/processing-instructions/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/processing-instructions/anchor-v1/programs/processing-instructions/src/lib.rs b/basics/processing-instructions/anchor-v1/programs/processing-instructions/src/lib.rs new file mode 100644 index 000000000..1cc3a11f4 --- /dev/null +++ b/basics/processing-instructions/anchor-v1/programs/processing-instructions/src/lib.rs @@ -0,0 +1,28 @@ +use anchor_lang::prelude::*; + +declare_id!("DgoL5J44aspizyUs9fcnpGEUJjWTLJRCfx8eYtUMYczf"); + +#[program] +pub mod processing_instructions { + use super::*; + + // With Anchor, we just put instruction data in the function signature! + // + pub fn go_to_park( + _context: Context, + name: String, + height: u32, + ) -> Result<()> { + msg!("Welcome to the park, {}!", name); + if height > 5 { + msg!("You are tall enough to ride this ride. Congratulations."); + } else { + msg!("You are NOT tall enough to ride this ride. Sorry mate."); + }; + + Ok(()) + } +} + +#[derive(Accounts)] +pub struct ParkAccountConstraints {} diff --git a/basics/processing-instructions/anchor-v1/programs/processing-instructions/tests/test_processing_instructions.rs b/basics/processing-instructions/anchor-v1/programs/processing-instructions/tests/test_processing_instructions.rs new file mode 100644 index 000000000..413688cc4 --- /dev/null +++ b/basics/processing-instructions/anchor-v1/programs/processing-instructions/tests/test_processing_instructions.rs @@ -0,0 +1,49 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, solana_keypair::Keypair) { + let program_id = processing_instructions::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/processing_instructions.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_go_to_park() { + let (mut svm, payer) = setup(); + let program_id = processing_instructions::id(); + + // Test with short person (height 3) + let ix_short = Instruction::new_with_bytes( + program_id, + &processing_instructions::instruction::GoToPark { + name: "Jimmy".to_string(), + height: 3, + } + .data(), + processing_instructions::accounts::ParkAccountConstraints {}.to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![ix_short], &[&payer], &payer.pubkey()) + .unwrap(); + + svm.expire_blockhash(); + + // Test with tall person (height 10) + let ix_tall = Instruction::new_with_bytes( + program_id, + &processing_instructions::instruction::GoToPark { + name: "Mary".to_string(), + height: 10, + } + .data(), + processing_instructions::accounts::ParkAccountConstraints {}.to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![ix_tall], &[&payer], &payer.pubkey()) + .unwrap(); +} diff --git a/basics/processing-instructions/anchor/README.md b/basics/processing-instructions/anchor/README.md index 6f78840ef..645f60503 100644 --- a/basics/processing-instructions/anchor/README.md +++ b/basics/processing-instructions/anchor/README.md @@ -1,5 +1,11 @@ # Processing Instructions (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Pass arguments into an [instruction handler](https://solana.com/docs/terminology#instruction-handler) and use them in program logic. See also: [Processing Instructions overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/program-derived-addresses/anchor-v1/Anchor.toml b/basics/program-derived-addresses/anchor-v1/Anchor.toml new file mode 100644 index 000000000..f356f522e --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +program_derived_addresses_program = "oCCQRZyAbVxujyd8m57MPmDzZDmy2FoKW4ULS7KofCE" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/program-derived-addresses/anchor-v1/CHANGELOG.md b/basics/program-derived-addresses/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/program-derived-addresses/anchor-v1/Cargo.toml b/basics/program-derived-addresses/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/program-derived-addresses/anchor-v1/README.md b/basics/program-derived-addresses/anchor-v1/README.md new file mode 100644 index 000000000..4c88eaba2 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Program Derived Addresses (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Derive and use PDAs as deterministic account addresses for program-owned state. + +See also: the [repository catalog](../../../README.md). + +## Major concepts + +- PDA derivation with seeds +- Storing state at a PDA + +## Setup + +From this directory (`basics/program-derived-addresses/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Cargo.toml b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Cargo.toml new file mode 100644 index 000000000..6ad63ff3e --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "program-derived-addresses-program" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "program_derived_addresses_program" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Xargo.toml b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/create.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/create.rs new file mode 100644 index 000000000..2278e1d13 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/create.rs @@ -0,0 +1,32 @@ +use crate::state::PageVisits; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct CreatePageVisitsAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + #[account( + init, + space = PageVisits::DISCRIMINATOR.len() + PageVisits::INIT_SPACE, + payer = payer, + seeds = [ + PageVisits::SEED_PREFIX, + payer.key().as_ref(), + ], + bump, + )] + page_visits: Account<'info, PageVisits>, + system_program: Program<'info, System>, +} + +pub fn handle_create_page_visits( + context: Context, +) -> Result<()> { + *context.accounts.page_visits = PageVisits { + page_visits: 0, + bump: context.bumps.page_visits, + }; + + Ok(()) +} diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/increment.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/increment.rs new file mode 100644 index 000000000..206ef7311 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/increment.rs @@ -0,0 +1,27 @@ +use crate::{state::PageVisits, PageVisitsError}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct IncrementPageVisitsAccountConstraints<'info> { + user: SystemAccount<'info>, + #[account( + mut, + seeds = [ + PageVisits::SEED_PREFIX, + user.key().as_ref(), + ], + bump = page_visits.bump, + )] + page_visits: Account<'info, PageVisits>, +} + +pub fn handle_increment_page_visits( + context: Context, +) -> Result<()> { + let page_visits = &mut context.accounts.page_visits; + page_visits.page_visits = page_visits + .page_visits + .checked_add(1) + .ok_or(PageVisitsError::MathOverflow)?; + Ok(()) +} diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs new file mode 100644 index 000000000..3f667875d --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod create; +pub mod increment; + +pub use create::*; +pub use increment::*; diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/lib.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/lib.rs new file mode 100644 index 000000000..40a9f3bf9 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/lib.rs @@ -0,0 +1,29 @@ +use anchor_lang::prelude::*; + +use instructions::*; + +pub mod instructions; +pub mod state; + +declare_id!("oCCQRZyAbVxujyd8m57MPmDzZDmy2FoKW4ULS7KofCE"); + +#[program] +pub mod program_derived_addresses_program { + use super::*; + + pub fn create_page_visits(context: Context) -> Result<()> { + create::handle_create_page_visits(context) + } + + pub fn increment_page_visits( + context: Context, + ) -> Result<()> { + increment::handle_increment_page_visits(context) + } +} + +#[error_code] +pub enum PageVisitsError { + #[msg("Page visit count overflowed u32::MAX")] + MathOverflow, +} diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/mod.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/mod.rs new file mode 100644 index 000000000..391641172 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod page_visits; + +pub use page_visits::*; diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/page_visits.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/page_visits.rs new file mode 100644 index 000000000..edb1fd715 --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/src/state/page_visits.rs @@ -0,0 +1,12 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] // automatically calculate the space required for the struct +pub struct PageVisits { + pub page_visits: u32, + pub bump: u8, +} + +impl PageVisits { + pub const SEED_PREFIX: &'static [u8; 11] = b"page_visits"; +} diff --git a/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/tests/test_program_derived_addresses.rs b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/tests/test_program_derived_addresses.rs new file mode 100644 index 000000000..1ef8645bb --- /dev/null +++ b/basics/program-derived-addresses/anchor-v1/programs/anchor-program-example/tests/test_program_derived_addresses.rs @@ -0,0 +1,100 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, solana_keypair::Keypair) { + let program_id = program_derived_addresses_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/program_derived_addresses_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[derive(BorshDeserialize)] +struct PageVisits { + page_visits: u32, + bump: u8, +} + +#[test] +fn test_create_and_increment_page_visits() { + let (mut svm, payer) = setup(); + let program_id = program_derived_addresses_program::id(); + + // Derive PDA + let (page_visits_pda, _bump) = + Pubkey::find_program_address(&[b"page_visits", payer.pubkey().as_ref()], &program_id); + + // Create page visits account + let create_ix = Instruction::new_with_bytes( + program_id, + &program_derived_addresses_program::instruction::CreatePageVisits {}.data(), + program_derived_addresses_program::accounts::CreatePageVisitsAccountConstraints { + payer: payer.pubkey(), + page_visits: page_visits_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![create_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify initial state (page_visits = 0) + let account = svm.get_account(&page_visits_pda).expect("PDA should exist"); + let data = PageVisits::try_from_slice(&account.data[8..]).unwrap(); + assert_eq!(data.page_visits, 0, "Initial page visits should be 0"); + + svm.expire_blockhash(); + + // Increment page visits + let increment_ix = Instruction::new_with_bytes( + program_id, + &program_derived_addresses_program::instruction::IncrementPageVisits {}.data(), + program_derived_addresses_program::accounts::IncrementPageVisitsAccountConstraints { + user: payer.pubkey(), + page_visits: page_visits_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![increment_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify page_visits = 1 + let account = svm.get_account(&page_visits_pda).expect("PDA should exist"); + let data = PageVisits::try_from_slice(&account.data[8..]).unwrap(); + assert_eq!( + data.page_visits, 1, + "Page visits should be 1 after increment" + ); + + svm.expire_blockhash(); + + // Increment again + let increment_ix2 = Instruction::new_with_bytes( + program_id, + &program_derived_addresses_program::instruction::IncrementPageVisits {}.data(), + program_derived_addresses_program::accounts::IncrementPageVisitsAccountConstraints { + user: payer.pubkey(), + page_visits: page_visits_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![increment_ix2], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify page_visits = 2 + let account = svm.get_account(&page_visits_pda).expect("PDA should exist"); + let data = PageVisits::try_from_slice(&account.data[8..]).unwrap(); + assert_eq!( + data.page_visits, 2, + "Page visits should be 2 after second increment" + ); +} diff --git a/basics/program-derived-addresses/anchor/README.md b/basics/program-derived-addresses/anchor/README.md index 70562dae4..77d8eb011 100644 --- a/basics/program-derived-addresses/anchor/README.md +++ b/basics/program-derived-addresses/anchor/README.md @@ -1,5 +1,11 @@ # Program Derived Addresses (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Derive and use PDAs as deterministic account addresses for program-owned state. See also: the [repository catalog](../../../README.md). diff --git a/basics/pyth/anchor-v1/.gitignore b/basics/pyth/anchor-v1/.gitignore new file mode 100644 index 000000000..152e6d3ed --- /dev/null +++ b/basics/pyth/anchor-v1/.gitignore @@ -0,0 +1,5 @@ +.anchor +.DS_Store +target +**/*.rs.bk +test-ledger diff --git a/basics/pyth/anchor-v1/Anchor.toml b/basics/pyth/anchor-v1/Anchor.toml new file mode 100644 index 000000000..e26be35ce --- /dev/null +++ b/basics/pyth/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +pythexample = "GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" \ No newline at end of file diff --git a/basics/pyth/anchor-v1/CHANGELOG.md b/basics/pyth/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/pyth/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/pyth/anchor-v1/Cargo.toml b/basics/pyth/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/pyth/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/pyth/anchor-v1/README.md b/basics/pyth/anchor-v1/README.md new file mode 100644 index 000000000..3076b574a --- /dev/null +++ b/basics/pyth/anchor-v1/README.md @@ -0,0 +1,55 @@ +# Pyth Price Feeds (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Read a [Pyth](https://pyth.network/) price feed account and log price, confidence, and exponent. + +See also: [Pyth overview](../README.md) and the [repository catalog](../../../README.md). + +> [!NOTE] +> **The official `pyth-solana-receiver-sdk` is not Anchor 1.x compatible (as of June 2026), so this example vendors the `PriceUpdateV2` account type instead of importing it.** +> +> The latest `pyth-solana-receiver-sdk` (1.2.0) builds against `anchor-lang` 0.32 and pulls `pythnet-sdk` (2.3.1), which still derives **borsh 0.10** on `PriceFeedMessage`. Anchor 0.32's `AnchorSerialize`/`AnchorDeserialize` derives require **borsh 1.x**, so `pyth-solana-receiver-sdk`'s own `PriceUpdateV2` fails to compile: +> +> ``` +> error[E0277]: the trait bound `pythnet_sdk::messages::PriceFeedMessage: BorshSerialize` is not satisfied +> ``` +> +> No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this repo standardizes on), and no `pythnet-sdk` release has migrated to borsh 1.x - so the dependency can't simply be upgraded. Tracked upstream at [pyth-network/pyth-crosschain#3756](https://github.com/pyth-network/pyth-crosschain/issues/3756). +> +> As a workaround, `programs/pythexample/src/lib.rs` mirrors the onchain `PriceUpdateV2` layout locally (same fields, same 8-byte discriminator, owned by the Pyth Receiver program) so accounts written by Pyth deserialize unchanged. Replace the vendored type with the SDK import once an Anchor 1.x / borsh 1.x compatible release ships. + +## Major concepts + +- Oracle price accounts +- Consuming external onchain data in a program +- Oracle account validation: `Account` enforces that the price account is owned by the Pyth Receiver program (`rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ`) +- Price freshness: `read_price` rejects updates older than `MAXIMUM_PRICE_AGE_SECONDS` (compared against `publish_time`, a unix timestamp in seconds, mirroring the SDK's `get_price_no_older_than`) + +## Setup + +From this directory (`basics/pyth/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/pyth/anchor-v1/programs/pythexample/Cargo.toml b/basics/pyth/anchor-v1/programs/pythexample/Cargo.toml new file mode 100644 index 000000000..d7e244f8b --- /dev/null +++ b/basics/pyth/anchor-v1/programs/pythexample/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "pythexample" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "pythexample" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +# Self-dependency with no-entrypoint: host test builds otherwise export a +# #[no_mangle] `entrypoint` symbol from this crate AND from spl-token (via +# solana-kite), and the linker rejects the duplicate. The SBF build +# (cargo build-sbf) ignores dev-dependencies, so the deployed program keeps +# its entrypoint. +pythexample = { path = ".", features = ["no-entrypoint"] } +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-account = "3.0.0" +borsh = "1.6.1" +sha2 = "0.10" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/pyth/anchor-v1/programs/pythexample/Xargo.toml b/basics/pyth/anchor-v1/programs/pythexample/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/pyth/anchor-v1/programs/pythexample/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/pyth/anchor-v1/programs/pythexample/src/lib.rs b/basics/pyth/anchor-v1/programs/pythexample/src/lib.rs new file mode 100644 index 000000000..013b6882e --- /dev/null +++ b/basics/pyth/anchor-v1/programs/pythexample/src/lib.rs @@ -0,0 +1,155 @@ +use anchor_lang::prelude::*; + +declare_id!("GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2"); + +/// The Pyth Receiver program that owns `PriceUpdateV2` accounts on devnet/mainnet. +pub const PYTH_RECEIVER_PROGRAM_ID: Pubkey = pubkey!("rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ"); + +/// Maximum allowed age of a price update before it is rejected as stale. +/// Pyth's `publish_time` is a unix timestamp in seconds, so the age check +/// uses unix time rather than slots: seconds are the only freshness signal +/// the price message carries (this mirrors the official +/// `pyth-solana-receiver-sdk`'s `get_price_no_older_than`). +pub const MAXIMUM_PRICE_AGE_SECONDS: i64 = 60; + +#[error_code] +pub enum PythExampleError { + #[msg("The price update is older than the maximum allowed age")] + PriceTooOld, + #[msg("Computing the price update's age overflowed an i64")] + MathOverflow, +} + +#[program] +pub mod anchor_test { + use super::*; + + pub fn read_price(context: Context) -> Result<()> { + let price_update = &context.accounts.price_update; + + // Reject stale prices: a price that stopped updating is wrong. + let price_age_seconds = Clock::get()? + .unix_timestamp + .checked_sub(price_update.price_message.publish_time) + .ok_or(PythExampleError::MathOverflow)?; + require!( + price_age_seconds <= MAXIMUM_PRICE_AGE_SECONDS, + PythExampleError::PriceTooOld + ); + + msg!("Price feed id: {:?}", price_update.price_message.feed_id); + msg!("Price: {:?}", price_update.price_message.price); + msg!("Confidence: {:?}", price_update.price_message.conf); + msg!("Exponent: {:?}", price_update.price_message.exponent); + msg!( + "Publish Time: {:?}", + price_update.price_message.publish_time + ); + Ok(()) + } +} + +#[derive(Accounts)] +pub struct ReadPriceAccountConstraints<'info> { + pub price_update: Account<'info, PriceUpdateV2>, +} + +// --------------------------------------------------------------------------- +// Pyth `PriceUpdateV2` account, vendored from `pyth-solana-receiver-sdk`. +// +// The official `pyth-solana-receiver-sdk` is NOT Anchor 1.0 compatible (as of +// June 2026), so this example mirrors the `PriceUpdateV2` account type locally +// instead of importing it. +// +// Details: the latest `pyth-solana-receiver-sdk` (1.2.0) builds against +// `anchor-lang` 0.32 and pulls `pythnet-sdk` (2.3.1), which still derives +// borsh 0.10 on `PriceFeedMessage`. Anchor 0.32's `AnchorSerialize` / +// `AnchorDeserialize` derives require borsh 1.x, so the SDK's own +// `PriceUpdateV2` fails to compile: +// +// error[E0277]: the trait bound +// `pythnet_sdk::messages::PriceFeedMessage: BorshSerialize` is not satisfied +// +// No published `pyth-solana-receiver-sdk` targets `anchor-lang` 1.0 (which this +// repo standardizes on) and no `pythnet-sdk` release has migrated to borsh 1.x, +// so the dependency can't simply be upgraded. Tracked upstream at +// https://github.com/pyth-network/pyth-crosschain/issues/3756 +// +// The fields, order, and 8-byte +// discriminator below match the onchain account exactly, and it is owned by +// the Pyth Receiver program (see the `Owner` impl), so accounts written by Pyth +// deserialize unchanged. Replace this with the SDK type once an Anchor 1.0 / +// borsh 1.x compatible `pyth-solana-receiver-sdk` release ships. +// --------------------------------------------------------------------------- + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, PartialEq, Eq)] +pub enum VerificationLevel { + /// Partially verified: only `num_signatures` of the Wormhole guardians + /// were checked against the price update. + Partial { num_signatures: u8 }, + /// Fully verified against the full guardian set. + Full, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, PartialEq, Eq)] +pub struct PriceFeedMessage { + pub feed_id: [u8; 32], + pub price: i64, + pub conf: u64, + pub exponent: i32, + pub publish_time: i64, + pub prev_publish_time: i64, + pub ema_price: i64, + pub ema_conf: u64, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, PartialEq, Eq)] +pub struct PriceUpdateV2 { + pub write_authority: Pubkey, + pub verification_level: VerificationLevel, + pub price_message: PriceFeedMessage, + pub posted_slot: u64, +} + +// Anchor's 8-byte discriminator: sha256("account:PriceUpdateV2")[..8]. +impl anchor_lang::Discriminator for PriceUpdateV2 { + const DISCRIMINATOR: &'static [u8] = &[34, 241, 35, 99, 157, 126, 244, 205]; +} + +// The account is created and owned by the Pyth Receiver program. +impl anchor_lang::Owner for PriceUpdateV2 { + fn owner() -> Pubkey { + PYTH_RECEIVER_PROGRAM_ID + } +} + +impl anchor_lang::AccountSerialize for PriceUpdateV2 { + fn try_serialize(&self, writer: &mut W) -> Result<()> { + writer + .write_all(::DISCRIMINATOR) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + AnchorSerialize::serialize(self, writer) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotSerialize)?; + Ok(()) + } +} + +impl anchor_lang::AccountDeserialize for PriceUpdateV2 { + fn try_deserialize(buf: &mut &[u8]) -> Result { + let disc = ::DISCRIMINATOR; + if buf.len() < disc.len() { + return Err(anchor_lang::error::ErrorCode::AccountDiscriminatorNotFound.into()); + } + if &buf[..disc.len()] != disc { + return Err(anchor_lang::error::ErrorCode::AccountDiscriminatorMismatch.into()); + } + Self::try_deserialize_unchecked(buf) + } + + fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result { + let disc = ::DISCRIMINATOR; + let mut data: &[u8] = &buf[disc.len()..]; + AnchorDeserialize::deserialize(&mut data) + .map_err(|_| anchor_lang::error::ErrorCode::AccountDidNotDeserialize.into()) + } +} diff --git a/basics/pyth/anchor-v1/programs/pythexample/tests/test_pyth.rs b/basics/pyth/anchor-v1/programs/pythexample/tests/test_pyth.rs new file mode 100644 index 000000000..5071866a4 --- /dev/null +++ b/basics/pyth/anchor-v1/programs/pythexample/tests/test_pyth.rs @@ -0,0 +1,162 @@ +use { + anchor_lang::{ + solana_program::{clock::Clock, instruction::Instruction}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + pythexample::MAXIMUM_PRICE_AGE_SECONDS, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// The `publish_time` baked into the mock price update below. +const MOCK_PUBLISH_TIME: i64 = 1_700_000_000; + +/// Pyth Receiver program ID (rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ) +fn pyth_receiver_program_id() -> anchor_lang::solana_program::pubkey::Pubkey { + pythexample::PYTH_RECEIVER_PROGRAM_ID +} + +/// Build mock PriceUpdateV2 account data with Anchor discriminator. +fn build_mock_price_update_account( + write_authority: &anchor_lang::solana_program::pubkey::Pubkey, +) -> Vec { + // Discriminator: sha256("account:PriceUpdateV2")[..8] + let discriminator: [u8; 8] = [34, 241, 35, 99, 157, 126, 244, 205]; + + let mut data = Vec::with_capacity(133); + + // Discriminator + data.extend_from_slice(&discriminator); + + // write_authority: Pubkey (32 bytes) + data.extend_from_slice(write_authority.as_ref()); + + // verification_level: Full = borsh enum variant 1 + data.push(1u8); + + // PriceFeedMessage fields: + // feed_id: [u8; 32] + let feed_id = [0xEFu8; 32]; + data.extend_from_slice(&feed_id); + + // price: i64 (150.00000000 USD with exponent -8) + let price: i64 = 15_000_000_000; + data.extend_from_slice(&price.to_le_bytes()); + + // conf: u64 + let conf: u64 = 100_000; + data.extend_from_slice(&conf.to_le_bytes()); + + // exponent: i32 + let exponent: i32 = -8; + data.extend_from_slice(&exponent.to_le_bytes()); + + // publish_time: i64 + data.extend_from_slice(&MOCK_PUBLISH_TIME.to_le_bytes()); + + // prev_publish_time: i64 + let prev_publish_time: i64 = 1_699_999_999; + data.extend_from_slice(&prev_publish_time.to_le_bytes()); + + // ema_price: i64 + let ema_price: i64 = 14_900_000_000; + data.extend_from_slice(&ema_price.to_le_bytes()); + + // ema_conf: u64 + let ema_conf: u64 = 120_000; + data.extend_from_slice(&ema_conf.to_le_bytes()); + + // posted_slot: u64 + let posted_slot: u64 = 42; + data.extend_from_slice(&posted_slot.to_le_bytes()); + + data +} + +/// Set the test clock so the mock price update is `age_seconds` old. +fn set_clock_to_price_age(svm: &mut LiteSVM, age_seconds: i64) { + let mut clock: Clock = svm.get_sysvar(); + clock.unix_timestamp = MOCK_PUBLISH_TIME + age_seconds; + svm.set_sysvar(&clock); +} + +fn setup_with_price_account( + owner: anchor_lang::solana_program::pubkey::Pubkey, +) -> (LiteSVM, solana_keypair::Keypair, Keypair) { + let program_id = pythexample::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/pythexample.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + // Create a mock PriceUpdateV2 account with the given owner. + let price_update_key = Keypair::new(); + let account_data = build_mock_price_update_account(&payer.pubkey()); + let rent = svm.minimum_balance_for_rent_exemption(account_data.len()); + + svm.set_account( + price_update_key.pubkey(), + solana_account::Account { + lamports: rent, + data: account_data, + owner, + executable: false, + rent_epoch: 0, + }, + ) + .unwrap(); + + (svm, payer, price_update_key) +} + +fn read_price_instruction(price_update: anchor_lang::solana_program::pubkey::Pubkey) -> Instruction { + let ix_data = pythexample::instruction::ReadPrice {}.data(); + let accounts = pythexample::accounts::ReadPriceAccountConstraints { price_update }.to_account_metas(None); + Instruction::new_with_bytes(pythexample::id(), &ix_data, accounts) +} + +#[test] +fn test_read_price() { + let (mut svm, payer, price_update_key) = setup_with_price_account(pyth_receiver_program_id()); + + // A price exactly at the maximum allowed age is still accepted. + set_clock_to_price_age(&mut svm, MAXIMUM_PRICE_AGE_SECONDS); + + let instruction = read_price_instruction(price_update_key.pubkey()); + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); +} + +#[test] +fn test_read_price_rejects_stale_price() { + let (mut svm, payer, price_update_key) = setup_with_price_account(pyth_receiver_program_id()); + + // One second past the maximum age: rejected as stale. + set_clock_to_price_age(&mut svm, MAXIMUM_PRICE_AGE_SECONDS + 1); + + let instruction = read_price_instruction(price_update_key.pubkey()); + let result = + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "a stale price update must be rejected"); +} + +#[test] +fn test_read_price_rejects_wrong_owner() { + // Plausible price data, but the account is owned by some random program + // instead of the Pyth Receiver: Anchor's Account owner + // check must reject it. + let fake_owner = Keypair::new().pubkey(); + let (mut svm, payer, price_update_key) = setup_with_price_account(fake_owner); + + set_clock_to_price_age(&mut svm, 0); + + let instruction = read_price_instruction(price_update_key.pubkey()); + let result = + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "a price account not owned by the Pyth Receiver must be rejected" + ); +} diff --git a/basics/pyth/anchor/README.md b/basics/pyth/anchor/README.md index a82eceb9a..6961fec61 100644 --- a/basics/pyth/anchor/README.md +++ b/basics/pyth/anchor/README.md @@ -1,5 +1,11 @@ # Pyth Price Feeds (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Read a [Pyth](https://pyth.network/) price feed account and log price, confidence, and exponent. See also: [Pyth overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/realloc/anchor-v1/.gitignore b/basics/realloc/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/basics/realloc/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/basics/realloc/anchor-v1/.prettierignore b/basics/realloc/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/basics/realloc/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/basics/realloc/anchor-v1/Anchor.toml b/basics/realloc/anchor-v1/Anchor.toml new file mode 100644 index 000000000..dd979df38 --- /dev/null +++ b/basics/realloc/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +anchor_realloc = "Fod47xKXjdHVQDzkFPBvfdWLm8gEAV4iMSXkfUzCHiSD" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/realloc/anchor-v1/CHANGELOG.md b/basics/realloc/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/realloc/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/realloc/anchor-v1/Cargo.toml b/basics/realloc/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/realloc/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/realloc/anchor-v1/README.md b/basics/realloc/anchor-v1/README.md new file mode 100644 index 000000000..b37a90c3b --- /dev/null +++ b/basics/realloc/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Realloc (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Grow or shrink account data when variable-length storage is required. + +See also: [Realloc overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Account reallocation +- Rent adjustment on size change + +## Setup + +From this directory (`basics/realloc/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/Cargo.toml b/basics/realloc/anchor-v1/programs/anchor-realloc/Cargo.toml new file mode 100644 index 000000000..cc14c040b --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "anchor-realloc" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "anchor_realloc" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/Xargo.toml b/basics/realloc/anchor-v1/programs/anchor-realloc/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/initialize.rs b/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/initialize.rs new file mode 100644 index 000000000..dc45b857c --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/initialize.rs @@ -0,0 +1,23 @@ +use anchor_lang::prelude::*; + +use crate::Message; + +#[derive(Accounts)] +#[instruction(input: String)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + space = Message::required_space(input.len()), + )] + pub message_account: Account<'info, Message>, + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context, input: String) -> Result<()> { + context.accounts.message_account.message = input; + Ok(()) +} diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/mod.rs b/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/mod.rs new file mode 100644 index 000000000..f73e2b4ff --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize; +pub mod update; + +pub use initialize::*; +pub use update::*; diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/update.rs b/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/update.rs new file mode 100644 index 000000000..cd1032c5f --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/src/instructions/update.rs @@ -0,0 +1,24 @@ +use anchor_lang::prelude::*; + +use crate::Message; + +#[derive(Accounts)] +#[instruction(input: String)] +pub struct UpdateAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + mut, + realloc = Message::required_space(input.len()), + realloc::payer = payer, + realloc::zero = true, + )] + pub message_account: Account<'info, Message>, + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context, input: String) -> Result<()> { + context.accounts.message_account.message = input; + Ok(()) +} diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/src/lib.rs b/basics/realloc/anchor-v1/programs/anchor-realloc/src/lib.rs new file mode 100644 index 000000000..f51e65d69 --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/src/lib.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("Fod47xKXjdHVQDzkFPBvfdWLm8gEAV4iMSXkfUzCHiSD"); + +#[program] +pub mod anchor_realloc { + use super::*; + + pub fn initialize(context: Context, input: String) -> Result<()> { + instructions::initialize::handler(context, input) + } + + pub fn update(context: Context, input: String) -> Result<()> { + instructions::update::handler(context, input) + } +} + +// NOTE: We intentionally do NOT derive `InitSpace` on `Message`. The realloc +// example demonstrates growing/shrinking the account to exactly fit the +// caller-provided `input`, whose length isn't known at compile time. +// `InitSpace` + `#[max_len(N)]` would force a fixed upper bound, defeating +// the point of the example. Instead, `required_space` computes the exact +// layout (discriminator + length prefix + bytes) for init/realloc. +#[account] +pub struct Message { + pub message: String, +} + +impl Message { + pub fn required_space(input_len: usize) -> usize { + 8 + // 8 byte discriminator + 4 + // 4 byte for length of string + input_len + } +} diff --git a/basics/realloc/anchor-v1/programs/anchor-realloc/tests/test_realloc.rs b/basics/realloc/anchor-v1/programs/anchor-realloc/tests/test_realloc.rs new file mode 100644 index 000000000..fecf1c6c1 --- /dev/null +++ b/basics/realloc/anchor-v1/programs/anchor-realloc/tests/test_realloc.rs @@ -0,0 +1,177 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[derive(BorshDeserialize)] +struct MessageAccount { + _discriminator: [u8; 8], + message: String, +} + +fn fetch_message(svm: &LiteSVM, pubkey: &anchor_lang::prelude::Pubkey) -> String { + let account = svm.get_account(pubkey).unwrap(); + let data = MessageAccount::try_from_slice(&account.data).unwrap(); + data.message +} + +#[test] +fn test_initialize() { + let program_id = anchor_realloc::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_realloc.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let message_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Initialize { + input: "hello".to_string(), + } + .data(), + anchor_realloc::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &message_keypair], + &payer.pubkey(), + ) + .unwrap(); + + let msg_text = fetch_message(&svm, &message_keypair.pubkey()); + assert_eq!(msg_text, "hello"); + + // Verify account size: 8 (discriminator) + 4 (string length) + 5 ("hello") + let account = svm.get_account(&message_keypair.pubkey()).unwrap(); + assert_eq!(account.data.len(), 8 + 4 + 5); +} + +#[test] +fn test_update_grows() { + let program_id = anchor_realloc::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_realloc.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let message_keypair = Keypair::new(); + + // Initialize with "hello" + let init_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Initialize { + input: "hello".to_string(), + } + .data(), + anchor_realloc::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &message_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Update to "hello world" (grows the account) + svm.expire_blockhash(); + let update_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Update { + input: "hello world".to_string(), + } + .data(), + anchor_realloc::accounts::UpdateAccountConstraints { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + let msg_text = fetch_message(&svm, &message_keypair.pubkey()); + assert_eq!(msg_text, "hello world"); + + let account = svm.get_account(&message_keypair.pubkey()).unwrap(); + assert_eq!(account.data.len(), 8 + 4 + 11); +} + +#[test] +fn test_update_shrinks() { + let program_id = anchor_realloc::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_realloc.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let message_keypair = Keypair::new(); + + // Initialize with "hello world" + let init_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Initialize { + input: "hello world".to_string(), + } + .data(), + anchor_realloc::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &message_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Update to "hi" (shrinks the account) + svm.expire_blockhash(); + let update_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Update { + input: "hi".to_string(), + } + .data(), + anchor_realloc::accounts::UpdateAccountConstraints { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + let msg_text = fetch_message(&svm, &message_keypair.pubkey()); + assert_eq!(msg_text, "hi"); + + let account = svm.get_account(&message_keypair.pubkey()).unwrap(); + assert_eq!(account.data.len(), 8 + 4 + 2); +} diff --git a/basics/realloc/anchor/README.md b/basics/realloc/anchor/README.md index 749b62835..b8e471634 100644 --- a/basics/realloc/anchor/README.md +++ b/basics/realloc/anchor/README.md @@ -1,5 +1,11 @@ # Realloc (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Grow or shrink account data when variable-length storage is required. See also: [Realloc overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/rent/anchor-v1/Anchor.toml b/basics/rent/anchor-v1/Anchor.toml new file mode 100644 index 000000000..7eee939da --- /dev/null +++ b/basics/rent/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +rent_example = "ED6f4gweAE7hWPQPXMt4kWxzDJne8VQEm9zkb1tMpFNB" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/rent/anchor-v1/CHANGELOG.md b/basics/rent/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/rent/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/rent/anchor-v1/Cargo.toml b/basics/rent/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/rent/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/rent/anchor-v1/README.md b/basics/rent/anchor-v1/README.md new file mode 100644 index 000000000..802a80df7 --- /dev/null +++ b/basics/rent/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Rent (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Calculate account size and the minimum rent-exempt [lamport](https://solana.com/docs/terminology#lamport) balance. + +See also: [Rent overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Rent-exempt threshold +- Account space planning + +## Setup + +From this directory (`basics/rent/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/rent/anchor-v1/programs/rent-example/Cargo.toml b/basics/rent/anchor-v1/programs/rent-example/Cargo.toml new file mode 100644 index 000000000..d63f77e9b --- /dev/null +++ b/basics/rent/anchor-v1/programs/rent-example/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "rent-example" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "rent_example" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/rent/anchor-v1/programs/rent-example/Xargo.toml b/basics/rent/anchor-v1/programs/rent-example/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/rent/anchor-v1/programs/rent-example/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/rent/anchor-v1/programs/rent-example/src/lib.rs b/basics/rent/anchor-v1/programs/rent-example/src/lib.rs new file mode 100644 index 000000000..e2d8a840b --- /dev/null +++ b/basics/rent/anchor-v1/programs/rent-example/src/lib.rs @@ -0,0 +1,60 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program; + +declare_id!("ED6f4gweAE7hWPQPXMt4kWxzDJne8VQEm9zkb1tMpFNB"); + +#[program] +pub mod rent_example { + use super::*; + + pub fn create_system_account( + context: Context, + address_data: AddressData, + ) -> Result<()> { + msg!("Program invoked. Creating a system account..."); + msg!( + " New public key will be: {}", + &context.accounts.new_account.key().to_string() + ); + + // Determine the necessary minimum rent by calculating the account's size + // + // borsh 1.x: try_to_vec() removed, use borsh::to_vec() instead + let account_span = anchor_lang::prelude::borsh::to_vec(&address_data)?.len(); + let lamports_required = (Rent::get()?).minimum_balance(account_span); + + msg!("Account span: {}", &account_span); + msg!("Lamports required: {}", &lamports_required); + + system_program::create_account( + CpiContext::new( + context.accounts.system_program.key(), + system_program::CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.new_account.to_account_info(), + }, + ), + lamports_required, + account_span as u64, + &context.accounts.system_program.key(), + )?; + + msg!("Account created successfully."); + Ok(()) + } +} + +#[derive(Accounts)] +pub struct CreateSystemAccountAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub new_account: Signer<'info>, + pub system_program: Program<'info, System>, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Debug)] +pub struct AddressData { + name: String, + address: String, +} diff --git a/basics/rent/anchor-v1/programs/rent-example/tests/test_rent.rs b/basics/rent/anchor-v1/programs/rent-example/tests/test_rent.rs new file mode 100644 index 000000000..2451d0dcb --- /dev/null +++ b/basics/rent/anchor-v1/programs/rent-example/tests/test_rent.rs @@ -0,0 +1,76 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Build borsh-serialized AddressData bytes (fields are private in the crate). +fn build_address_data_borsh(name: &str, address: &str) -> Vec { + let mut data = Vec::new(); + data.extend_from_slice(&(name.len() as u32).to_le_bytes()); + data.extend_from_slice(name.as_bytes()); + data.extend_from_slice(&(address.len() as u32).to_le_bytes()); + data.extend_from_slice(address.as_bytes()); + data +} + +/// Construct the full instruction data with discriminator + AddressData. +/// Deserialize the borsh bytes into AddressData via the crate's BorshDeserialize impl, +/// then use InstructionData to get the final bytes. +fn build_create_system_account_ix_data(name: &str, address: &str) -> Vec { + let address_data_bytes = build_address_data_borsh(name, address); + let address_data = + rent_example::AddressData::deserialize(&mut address_data_bytes.as_slice()).unwrap(); + rent_example::instruction::CreateSystemAccount { address_data }.data() +} + +#[test] +fn test_create_system_account() { + let program_id = rent_example::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/rent_example.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let new_account = Keypair::new(); + + let name = "Marcus"; + let address = "123 Main St. San Francisco, CA"; + + let ix_data = build_create_system_account_ix_data(name, address); + + let instruction = Instruction::new_with_bytes( + program_id, + &ix_data, + rent_example::accounts::CreateSystemAccountAccountConstraints { + payer: payer.pubkey(), + new_account: new_account.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &new_account], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the account was created with the correct size + // Borsh serialized AddressData: 4 + 6 ("Marcus") + 4 + 30 = 44 bytes + let expected_size = 4 + name.len() + 4 + address.len(); + let account = svm.get_account(&new_account.pubkey()).unwrap(); + assert_eq!(account.data.len(), expected_size); + assert!( + account.lamports > 0, + "Account should have lamports for rent" + ); +} diff --git a/basics/rent/anchor/README.md b/basics/rent/anchor/README.md index a9d15c645..67eabe7b0 100644 --- a/basics/rent/anchor/README.md +++ b/basics/rent/anchor/README.md @@ -1,5 +1,11 @@ # Rent (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Calculate account size and the minimum rent-exempt [lamport](https://solana.com/docs/terminology#lamport) balance. See also: [Rent overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/repository-layout/anchor-v1/Anchor.toml b/basics/repository-layout/anchor-v1/Anchor.toml new file mode 100644 index 000000000..411ce3df7 --- /dev/null +++ b/basics/repository-layout/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +carnival = "8t94SEJh9jVjDwV7cbiuT6BvEsHo4YHP9x9a5rYH1NpP" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/repository-layout/anchor-v1/CHANGELOG.md b/basics/repository-layout/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/repository-layout/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/repository-layout/anchor-v1/Cargo.toml b/basics/repository-layout/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/repository-layout/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/repository-layout/anchor-v1/README.md b/basics/repository-layout/anchor-v1/README.md new file mode 100644 index 000000000..c76f40771 --- /dev/null +++ b/basics/repository-layout/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Repository Layout (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Organize a larger program across modules (state, instructions, errors) instead of a single file. + +See also: [Repository Layout overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Multi-file Anchor layout +- Separating concerns by module + +## Setup + +From this directory (`basics/repository-layout/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/repository-layout/anchor-v1/programs/carnival/Cargo.toml b/basics/repository-layout/anchor-v1/programs/carnival/Cargo.toml new file mode 100644 index 000000000..ff02c6a78 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "carnival" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "carnival" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/repository-layout/anchor-v1/programs/carnival/Xargo.toml b/basics/repository-layout/anchor-v1/programs/carnival/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/error.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/error.rs new file mode 100644 index 000000000..fc136669d --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/error.rs @@ -0,0 +1,17 @@ +use anchor_lang::prelude::*; + +// Real failure modes for the carnival examples. Previously this file was empty +// and the rejection branches in the instruction handlers just logged a message +// and returned Ok(()), which made it impossible for callers (or tests) to +// distinguish "the ride happened" from "the ride refused service". +#[error_code] +pub enum CarnivalError { + // The rider/gamer/eater did not bring enough tickets for the requested + // attraction. + #[msg("Not enough tickets for the requested attraction")] + NotEnoughTickets, + + // The rider is below the minimum height required for the ride. + #[msg("Rider is below the minimum height for this ride")] + RiderTooShort, +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/eat_food.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/eat_food.rs new file mode 100644 index 000000000..2e3a62a06 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/eat_food.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; + +use crate::{error::CarnivalError, state::food}; + +// Instruction Data + +pub struct EatFoodInstructionData { + pub eater_name: String, + pub eater_ticket_count: u32, + pub food_stand: String, +} + +pub fn eat_food(ix: EatFoodInstructionData) -> Result<()> { + let food_stands_list = food::get_food_stands(); + + for food_stand in food_stands_list.iter() { + if ix.food_stand.eq(&food_stand.name) { + msg!("Welcome to {}! What can I get you?", food_stand.name); + + if ix.eater_ticket_count < food_stand.tickets { + msg!( + " Sorry {}, our {} is {} tickets!", + ix.eater_name, + food_stand.food_type, + food_stand.tickets + ); + // Refuse service rather than logging and returning Ok(()), so + // callers can distinguish a sale from a refusal. + return Err(CarnivalError::NotEnoughTickets.into()); + } + + msg!(" Enjoy your {}!", food_stand.food_type); + return Ok(()); + } + } + + Err(ProgramError::InvalidInstructionData.into()) +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/get_on_ride.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/get_on_ride.rs new file mode 100644 index 000000000..0427f0c36 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/get_on_ride.rs @@ -0,0 +1,54 @@ +use anchor_lang::prelude::*; + +use crate::{error::CarnivalError, state::ride}; + +// Instruction Data + +pub struct GetOnRideInstructionData { + pub rider_name: String, + pub rider_height: u32, + pub rider_ticket_count: u32, + pub ride: String, +} + +pub fn get_on_ride(ix: GetOnRideInstructionData) -> Result<()> { + let rides_list = ride::get_rides(); + + for ride in rides_list.iter() { + if ix.ride.eq(&ride.name) { + msg!("You're about to ride the {}!", ride.name); + + // Refuse service with a real error so callers and tests can + // distinguish a refused ride from a successful one. + if ix.rider_ticket_count < ride.tickets { + msg!( + " Sorry {}, you need {} tickets to ride the {}!", + ix.rider_name, + ride.tickets, + ride.name + ); + return Err(CarnivalError::NotEnoughTickets.into()); + }; + + if ix.rider_height < ride.min_height { + msg!( + " Sorry {}, you need to be {}\" tall to ride the {}!", + ix.rider_name, + ride.min_height, + ride.name + ); + return Err(CarnivalError::RiderTooShort.into()); + }; + + msg!(" Welcome aboard the {}!", ride.name); + + if ride.upside_down { + msg!(" Btw, this ride goes upside down. Hold on tight!"); + }; + + return Ok(()); + } + } + + Err(ProgramError::InvalidInstructionData.into()) +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/mod.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/mod.rs new file mode 100644 index 000000000..ee6ea6d1e --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/mod.rs @@ -0,0 +1,3 @@ +pub mod eat_food; +pub mod get_on_ride; +pub mod play_game; diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/play_game.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/play_game.rs new file mode 100644 index 000000000..4867f98e8 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/instructions/play_game.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; + +use crate::{error::CarnivalError, state::game}; + +// Instruction Data + +pub struct PlayGameInstructionData { + pub gamer_name: String, + pub gamer_ticket_count: u32, + pub game: String, +} + +pub fn play_game(ix: PlayGameInstructionData) -> Result<()> { + let games_list = game::get_games(); + + for game in games_list.iter() { + if ix.game.eq(&game.name) { + msg!("You're about to play {}!", game.name); + + if ix.gamer_ticket_count < game.tickets { + msg!( + " Sorry {}, you need {} tickets to play {}!", + ix.gamer_name, + game.tickets, + game.name + ); + // Refuse service rather than logging and returning Ok(()), so + // callers can tell a successful play from a refusal. + return Err(CarnivalError::NotEnoughTickets.into()); + } + + msg!(" Let's see what you got!"); + msg!( + " You get {} attempts and the prize is a {}!", + game.tries, + game.prize + ); + + return Ok(()); + } + } + + Err(ProgramError::InvalidInstructionData.into()) +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/lib.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/lib.rs new file mode 100644 index 000000000..9d0bea35f --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/lib.rs @@ -0,0 +1,63 @@ +use anchor_lang::prelude::*; + +pub mod error; +pub mod instructions; +pub mod state; + +use crate::instructions::{eat_food, get_on_ride, play_game}; + +// For setting up modules & configs + +declare_id!("8t94SEJh9jVjDwV7cbiuT6BvEsHo4YHP9x9a5rYH1NpP"); + +#[program] +pub mod carnival { + use super::*; + + pub fn go_on_ride( + _context: Context, + name: String, + height: u32, + ticket_count: u32, + ride_name: String, + ) -> Result<()> { + get_on_ride::get_on_ride(get_on_ride::GetOnRideInstructionData { + rider_name: name, + rider_height: height, + rider_ticket_count: ticket_count, + ride: ride_name, + }) + } + + pub fn play_game( + _context: Context, + name: String, + ticket_count: u32, + game_name: String, + ) -> Result<()> { + play_game::play_game(play_game::PlayGameInstructionData { + gamer_name: name, + gamer_ticket_count: ticket_count, + game: game_name, + }) + } + + pub fn eat_food( + _context: Context, + name: String, + ticket_count: u32, + food_stand_name: String, + ) -> Result<()> { + eat_food::eat_food(eat_food::EatFoodInstructionData { + eater_name: name, + eater_ticket_count: ticket_count, + food_stand: food_stand_name, + }) + } +} + +#[derive(Accounts)] +pub struct CarnivalAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/state/food.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/state/food.rs new file mode 100644 index 000000000..62b5e04d6 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/state/food.rs @@ -0,0 +1,25 @@ +// Objects + +pub struct FoodStand { + pub name: String, + pub food_type: String, + pub tickets: u32, +} + +impl FoodStand { + pub fn new(name: String, food_type: String, tickets: u32) -> FoodStand { + FoodStand { + name, + food_type, + tickets, + } + } +} + +pub fn get_food_stands() -> Vec { + vec![ + FoodStand::new("Larry's Pizza".to_string(), "pizza".to_string(), 3), + FoodStand::new("Taco Shack".to_string(), "taco".to_string(), 2), + FoodStand::new("Dough Boy's".to_string(), "fried dough".to_string(), 1), + ] +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/state/game.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/state/game.rs new file mode 100644 index 000000000..185547230 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/state/game.rs @@ -0,0 +1,29 @@ +// Objects + +pub struct Game { + pub name: String, + pub tickets: u32, + pub tries: u32, + pub prize: String, +} + +const DEFAULT_TICKETS_TO_PLAY: u32 = 3; + +impl Game { + pub fn new(name: String, tries: u32, prize: String) -> Game { + Game { + name, + tickets: DEFAULT_TICKETS_TO_PLAY, + tries, + prize, + } + } +} + +pub fn get_games() -> Vec { + vec![ + Game::new("Ring Toss".to_string(), 5, "teddy bear".to_string()), + Game::new("I Got It!".to_string(), 12, "goldfish".to_string()), + Game::new("Ladder Climb".to_string(), 1, "popcorn bucket".to_string()), + ] +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/state/mod.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/state/mod.rs new file mode 100644 index 000000000..12a92a2cf --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod food; +pub mod game; +pub mod ride; diff --git a/basics/repository-layout/anchor-v1/programs/carnival/src/state/ride.rs b/basics/repository-layout/anchor-v1/programs/carnival/src/state/ride.rs new file mode 100644 index 000000000..a3af23969 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/src/state/ride.rs @@ -0,0 +1,28 @@ +// Objects + +pub struct Ride { + pub name: String, + pub upside_down: bool, + pub tickets: u32, + pub min_height: u32, +} + +impl Ride { + pub fn new(name: String, upside_down: bool, tickets: u32, min_height: u32) -> Ride { + Ride { + name, + upside_down, + tickets, + min_height, + } + } +} + +pub fn get_rides() -> Vec { + vec![ + Ride::new("Tilt-a-Whirl".to_string(), false, 3, 48), + Ride::new("Scrambler".to_string(), false, 3, 48), + Ride::new("Ferris Wheel".to_string(), false, 5, 55), + Ride::new("Zero Gravity".to_string(), true, 5, 60), + ] +} diff --git a/basics/repository-layout/anchor-v1/programs/carnival/tests/test_carnival.rs b/basics/repository-layout/anchor-v1/programs/carnival/tests/test_carnival.rs new file mode 100644 index 000000000..c59114e23 --- /dev/null +++ b/basics/repository-layout/anchor-v1/programs/carnival/tests/test_carnival.rs @@ -0,0 +1,161 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, solana_keypair::Keypair) { + let program_id = carnival::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/carnival.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +fn go_on_ride_ix( + payer: &solana_keypair::Keypair, + name: &str, + height: u32, + ticket_count: u32, + ride_name: &str, +) -> Instruction { + let accounts = carnival::accounts::CarnivalAccountConstraints { + payer: payer.pubkey(), + } + .to_account_metas(None); + Instruction::new_with_bytes( + carnival::id(), + &carnival::instruction::GoOnRide { + name: name.to_string(), + height, + ticket_count, + ride_name: ride_name.to_string(), + } + .data(), + accounts, + ) +} + +fn play_game_ix( + payer: &solana_keypair::Keypair, + name: &str, + ticket_count: u32, + game_name: &str, +) -> Instruction { + let accounts = carnival::accounts::CarnivalAccountConstraints { + payer: payer.pubkey(), + } + .to_account_metas(None); + Instruction::new_with_bytes( + carnival::id(), + &carnival::instruction::PlayGame { + name: name.to_string(), + ticket_count, + game_name: game_name.to_string(), + } + .data(), + accounts, + ) +} + +fn eat_food_ix( + payer: &solana_keypair::Keypair, + name: &str, + ticket_count: u32, + food_stand_name: &str, +) -> Instruction { + let accounts = carnival::accounts::CarnivalAccountConstraints { + payer: payer.pubkey(), + } + .to_account_metas(None); + Instruction::new_with_bytes( + carnival::id(), + &carnival::instruction::EatFood { + name: name.to_string(), + ticket_count, + food_stand_name: food_stand_name.to_string(), + } + .data(), + accounts, + ) +} + +// Riders that have enough tickets and meet the height requirement succeed. +#[test] +fn test_go_on_ride_succeeds() { + let (mut svm, payer) = setup(); + // Scrambler costs 3 tickets and requires 48" min height; Alice has 15 + // tickets and is 56" tall. + let ix = go_on_ride_ix(&payer, "Alice", 56, 15, "Scrambler"); + send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()).unwrap(); +} + +// Insufficient tickets must produce a real error (NotEnoughTickets), not a +// silent Ok(). +#[test] +fn test_go_on_ride_rejects_insufficient_tickets() { + let (mut svm, payer) = setup(); + // Tilt-a-Whirl costs 3 tickets; Bob only has 1. + let ix = go_on_ride_ix(&payer, "Bob", 49, 1, "Tilt-a-Whirl"); + let result = send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "ride must reject insufficient tickets"); +} + +// A rider below the minimum height must be rejected with RiderTooShort. +#[test] +fn test_go_on_ride_rejects_too_short() { + let (mut svm, payer) = setup(); + // Ferris Wheel requires 55" min height; Jimmy is 36" tall but has plenty + // of tickets. + let ix = go_on_ride_ix(&payer, "Jimmy", 36, 15, "Ferris Wheel"); + let result = send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "ride must reject riders below min height"); +} + +// Unknown attraction name routes to ProgramError::InvalidInstructionData. +#[test] +fn test_go_on_ride_rejects_unknown_ride() { + let (mut svm, payer) = setup(); + let ix = go_on_ride_ix(&payer, "Alice", 60, 100, "Quantum Coaster"); + let result = send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "unknown ride must be rejected"); +} + +#[test] +fn test_play_game_succeeds() { + let (mut svm, payer) = setup(); + // Ring Toss costs 3 tickets; Alice has 15. + let ix = play_game_ix(&payer, "Alice", 15, "Ring Toss"); + send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()).unwrap(); +} + +#[test] +fn test_play_game_rejects_insufficient_tickets() { + let (mut svm, payer) = setup(); + // Ring Toss costs 3 tickets; Mary only has 1. + let ix = play_game_ix(&payer, "Mary", 1, "Ring Toss"); + let result = send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "game must reject insufficient tickets"); +} + +#[test] +fn test_eat_food_succeeds() { + let (mut svm, payer) = setup(); + // Dough Boy's costs 1 ticket; Bob has 6. + let ix = eat_food_ix(&payer, "Bob", 6, "Dough Boy's"); + send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()).unwrap(); +} + +#[test] +fn test_eat_food_rejects_insufficient_tickets() { + let (mut svm, payer) = setup(); + // Larry's Pizza costs 3 tickets; Mary has 1. + let ix = eat_food_ix(&payer, "Mary", 1, "Larry's Pizza"); + let result = send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "food stand must reject insufficient tickets" + ); +} diff --git a/basics/repository-layout/anchor/README.md b/basics/repository-layout/anchor/README.md index e452cec49..7cf34f996 100644 --- a/basics/repository-layout/anchor/README.md +++ b/basics/repository-layout/anchor/README.md @@ -1,5 +1,11 @@ # Repository Layout (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Organize a larger program across modules (state, instructions, errors) instead of a single file. See also: [Repository Layout overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/basics/transfer-sol/anchor-v1/Anchor.toml b/basics/transfer-sol/anchor-v1/Anchor.toml new file mode 100644 index 000000000..95e4188b3 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +transfer_sol = "4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/basics/transfer-sol/anchor-v1/CHANGELOG.md b/basics/transfer-sol/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/basics/transfer-sol/anchor-v1/Cargo.toml b/basics/transfer-sol/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/transfer-sol/anchor-v1/README.md b/basics/transfer-sol/anchor-v1/README.md new file mode 100644 index 000000000..3cfec5851 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Transfer SOL (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Transfer native SOL between accounts using the System Program. + +See also: [Transfer Sol overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- System Program transfer +- Signer-funded lamport movement + +## Setup + +From this directory (`basics/transfer-sol/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/Cargo.toml b/basics/transfer-sol/anchor-v1/programs/transfer-sol/Cargo.toml new file mode 100644 index 000000000..cf282ac60 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "transfer-sol" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_sol" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/Xargo.toml b/basics/transfer-sol/anchor-v1/programs/transfer-sol/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/mod.rs b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/mod.rs new file mode 100644 index 000000000..3886f7ab8 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod transfer_sol_with_cpi; +pub mod transfer_sol_with_program; + +pub use transfer_sol_with_cpi::*; +pub use transfer_sol_with_program::*; diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs new file mode 100644 index 000000000..4aa9ed0a9 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_cpi.rs @@ -0,0 +1,26 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program; + +#[derive(Accounts)] +pub struct TransferSolWithCpiAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + #[account(mut)] + recipient: SystemAccount<'info>, + system_program: Program<'info, System>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + system_program::transfer( + CpiContext::new( + context.accounts.system_program.key(), + system_program::Transfer { + from: context.accounts.payer.to_account_info(), + to: context.accounts.recipient.to_account_info(), + }, + ), + amount, + )?; + + Ok(()) +} diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs new file mode 100644 index 000000000..03d98b73b --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/instructions/transfer_sol_with_program.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum TransferSolError { + #[msg("The payer does not hold enough lamports for this transfer")] + InsufficientFunds, + #[msg("Adding the amount to the recipient balance would overflow a u64")] + AmountOverflow, +} + +#[derive(Accounts)] +pub struct TransferSolWithProgramAccountConstraints<'info> { + /// CHECK: Use owner constraint to check account is owned by our program + #[account( + mut, + owner = crate::ID // value of declare_id!() + )] + payer: UncheckedAccount<'info>, + + #[account(mut)] + recipient: SystemAccount<'info>, +} + +// Directly modifying lamports is only possible if the program is the owner of the account +pub fn handler( + context: Context, + amount: u64, +) -> Result<()> { + let payer = &context.accounts.payer; + let recipient = &context.accounts.recipient; + + let new_payer_lamports = payer + .lamports() + .checked_sub(amount) + .ok_or(TransferSolError::InsufficientFunds)?; + let new_recipient_lamports = recipient + .lamports() + .checked_add(amount) + .ok_or(TransferSolError::AmountOverflow)?; + + **payer.try_borrow_mut_lamports()? = new_payer_lamports; + **recipient.try_borrow_mut_lamports()? = new_recipient_lamports; + Ok(()) +} diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/lib.rs b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/lib.rs new file mode 100644 index 000000000..49f40cb3a --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/src/lib.rs @@ -0,0 +1,25 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W"); + +#[program] +pub mod transfer_sol { + use super::*; + + pub fn transfer_sol_with_cpi( + context: Context, + amount: u64, + ) -> Result<()> { + instructions::transfer_sol_with_cpi::handler(context, amount) + } + + pub fn transfer_sol_with_program( + context: Context, + amount: u64, + ) -> Result<()> { + instructions::transfer_sol_with_program::handler(context, amount) + } +} diff --git a/basics/transfer-sol/anchor-v1/programs/transfer-sol/tests/test_transfer_sol.rs b/basics/transfer-sol/anchor-v1/programs/transfer-sol/tests/test_transfer_sol.rs new file mode 100644 index 000000000..3afb86614 --- /dev/null +++ b/basics/transfer-sol/anchor-v1/programs/transfer-sol/tests/test_transfer_sol.rs @@ -0,0 +1,146 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +const LAMPORTS_PER_SOL: u64 = 1_000_000_000; + +#[test] +fn test_transfer_sol_with_cpi() { + let program_id = transfer_sol::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/transfer_sol.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10 * LAMPORTS_PER_SOL).unwrap(); + + let recipient = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &transfer_sol::instruction::TransferSolWithCpi { + amount: LAMPORTS_PER_SOL, + } + .data(), + transfer_sol::accounts::TransferSolWithCpiAccountConstraints { + payer: payer.pubkey(), + recipient: recipient.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + let recipient_balance = svm.get_balance(&recipient.pubkey()).unwrap(); + assert_eq!(recipient_balance, LAMPORTS_PER_SOL); +} + +#[test] +fn test_transfer_sol_with_program() { + let program_id = transfer_sol::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/transfer_sol.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10 * LAMPORTS_PER_SOL).unwrap(); + + // Create an account owned by our program with 1 SOL + let payer_account = Keypair::new(); + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + &payer.pubkey(), + &payer_account.pubkey(), + LAMPORTS_PER_SOL, + 0, + &program_id, + ); + send_transaction_from_instructions( + &mut svm, + vec![create_account_ix], + &[&payer, &payer_account], + &payer.pubkey(), + ) + .unwrap(); + + // Now transfer SOL from the program-owned account to a recipient + svm.expire_blockhash(); + let recipient = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &transfer_sol::instruction::TransferSolWithProgram { + amount: LAMPORTS_PER_SOL, + } + .data(), + transfer_sol::accounts::TransferSolWithProgramAccountConstraints { + payer: payer_account.pubkey(), + recipient: recipient.pubkey(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + let recipient_balance = svm.get_balance(&recipient.pubkey()).unwrap(); + assert_eq!(recipient_balance, LAMPORTS_PER_SOL); +} + +#[test] +fn test_transfer_sol_with_program_rejects_insufficient_funds() { + let program_id = transfer_sol::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/transfer_sol.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10 * LAMPORTS_PER_SOL).unwrap(); + + // Create an account owned by our program holding 1 SOL. + let program_owned_account = Keypair::new(); + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + &payer.pubkey(), + &program_owned_account.pubkey(), + LAMPORTS_PER_SOL, + 0, + &program_id, + ); + send_transaction_from_instructions( + &mut svm, + vec![create_account_ix], + &[&payer, &program_owned_account], + &payer.pubkey(), + ) + .unwrap(); + + // Ask for more than the account holds: the checked subtraction must + // reject the transfer instead of wrapping. + svm.expire_blockhash(); + let recipient = Keypair::new(); + let instruction = Instruction::new_with_bytes( + program_id, + &transfer_sol::instruction::TransferSolWithProgram { + amount: 2 * LAMPORTS_PER_SOL, + } + .data(), + transfer_sol::accounts::TransferSolWithProgramAccountConstraints { + payer: program_owned_account.pubkey(), + recipient: recipient.pubkey(), + } + .to_account_metas(None), + ); + + let result = + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()); + assert!(result.is_err(), "overdrawing the payer must fail"); + + // Balances are untouched. + assert_eq!( + svm.get_balance(&program_owned_account.pubkey()).unwrap(), + LAMPORTS_PER_SOL + ); + assert_eq!(svm.get_balance(&recipient.pubkey()).unwrap_or(0), 0); +} diff --git a/basics/transfer-sol/anchor/README.md b/basics/transfer-sol/anchor/README.md index b8c0ffddc..085104477 100644 --- a/basics/transfer-sol/anchor/README.md +++ b/basics/transfer-sol/anchor/README.md @@ -1,5 +1,11 @@ # Transfer SOL (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Transfer native SOL between accounts using the System Program. See also: [Transfer Sol overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/compression/cnft-burn/anchor-v1/.gitignore b/compression/cnft-burn/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/compression/cnft-burn/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/compression/cnft-burn/anchor-v1/.prettierignore b/compression/cnft-burn/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/compression/cnft-burn/anchor-v1/Anchor.toml b/compression/cnft-burn/anchor-v1/Anchor.toml new file mode 100644 index 000000000..2306dedeb --- /dev/null +++ b/compression/cnft-burn/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +cnft_burn = "C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/compression/cnft-burn/anchor-v1/CHANGELOG.md b/compression/cnft-burn/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/compression/cnft-burn/anchor-v1/Cargo.toml b/compression/cnft-burn/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/compression/cnft-burn/anchor-v1/README.md b/compression/cnft-burn/anchor-v1/README.md new file mode 100644 index 000000000..42d9e4f54 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/README.md @@ -0,0 +1,34 @@ +# cnft-burn + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +An [Anchor](https://solana.com/docs/terminology#anchor) [program](https://solana.com/docs/terminology#program) that burns compressed NFTs (cNFTs) in your collection. The program performs a [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi) into the Metaplex Bubblegum program to do the burn. + +## Components + +- `programs/cnft-burn/` - the Anchor program. +- `migrations/` - deployment script. + +## Testing + +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cnft-burn/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. + +```bash +cargo build-sbf +cargo test +``` + +## Deployment + +The program ID declared in [`programs/cnft-burn/src/lib.rs`](programs/cnft-burn/src/lib.rs) is `C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv`. Whether this address is currently deployed on any cluster is not tracked in this repo - verify with `solana program show ` against the cluster you care about. + +To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, then run `anchor build && anchor deploy`. + +## Acknowledgements + +- [Metaplex](https://github.com/metaplex-foundation/) for the Bubblegum program and [instruction](https://solana.com/docs/terminology#instruction) builders. +- [@nickfrosty](https://twitter.com/nickfrosty) for the sample code that fetches and creates cNFTs. diff --git a/compression/cnft-burn/anchor-v1/programs/cnft-burn/Cargo.toml b/compression/cnft-burn/anchor-v1/programs/cnft-burn/Cargo.toml new file mode 100644 index 000000000..e46e7e802 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/programs/cnft-burn/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "cnft-burn" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "cnft_burn" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +# mpl-bubblegum and spl-account-compression removed: they depend on solana-program 2.x +# which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually +# using raw invoke() with hardcoded program IDs and discriminators. +borsh = "1" + +[dev-dependencies] +litesvm = "0.13.1" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.0" +solana-account = "3.0.0" +solana-native-token = "3.0.0" +solana-signer = "3.0.0" +solana-message = "3.0.0" +solana-keccak-hasher = "3.0.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/compression/cnft-burn/anchor-v1/programs/cnft-burn/Xargo.toml b/compression/cnft-burn/anchor-v1/programs/cnft-burn/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/compression/cnft-burn/anchor-v1/programs/cnft-burn/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/burn_cnft.rs b/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/burn_cnft.rs new file mode 100644 index 000000000..595a81da9 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/burn_cnft.rs @@ -0,0 +1,127 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::{ + instruction::{AccountMeta, Instruction}, + program::invoke, +}; +use borsh::BorshSerialize; + +use crate::{MPL_BUBBLEGUM_ID, SPLCompression}; + +/// Burn instruction discriminator from mpl-bubblegum +const BURN_DISCRIMINATOR: [u8; 8] = [116, 110, 29, 56, 107, 219, 42, 93]; + +/// Instruction arguments for mpl-bubblegum Burn, serialized with borsh +#[derive(BorshSerialize)] +struct BurnArgs { + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +} + +#[derive(Accounts)] +pub struct BurnCnftAccountConstraints<'info> { + #[account(mut)] + pub leaf_owner: Signer<'info>, + #[account(mut)] + #[account( + seeds = [merkle_tree.key().as_ref()], + bump, + seeds::program = bubblegum_program.key() + )] + /// CHECK: This account is modified in the downstream program + pub tree_authority: UncheckedAccount<'info>, + #[account(mut)] + /// CHECK: Written by the Bubblegum/Account Compression CPI (the burn + /// replaces the leaf and updates the tree root); validated downstream + /// by those programs. + pub merkle_tree: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. + pub log_wrapper: UncheckedAccount<'info>, + pub compression_program: Program<'info, SPLCompression>, + // Pin the bubblegum program account to the known mpl-bubblegum id. Without + // this constraint the caller could pass any account and a malicious one + // could short-circuit the CPI in unexpected ways. + /// CHECK: address constrained to the mpl-bubblegum program id. + #[account(address = MPL_BUBBLEGUM_ID)] + pub bubblegum_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, +} + +pub fn handle_burn_cnft<'info>( + context: Context<'info, BurnCnftAccountConstraints<'info>>, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +) -> Result<()> { + // Build instruction data: discriminator + borsh-serialized args + let args = BurnArgs { + root, + data_hash, + creator_hash, + nonce, + index, + }; + let mut data = BURN_DISCRIMINATOR.to_vec(); + args.serialize(&mut data)?; + + // Build account metas matching mpl-bubblegum Burn instruction layout + let mut accounts = Vec::with_capacity(7 + context.remaining_accounts.len()); + accounts.push(AccountMeta::new_readonly( + context.accounts.tree_authority.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_owner.key(), + true, + )); + // leaf_delegate = leaf_owner, not a signer in this call + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_owner.key(), + false, + )); + accounts.push(AccountMeta::new(context.accounts.merkle_tree.key(), false)); + accounts.push(AccountMeta::new_readonly( + context.accounts.log_wrapper.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.compression_program.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.system_program.key(), + false, + )); + // Append remaining accounts (proof nodes) + for acc in context.remaining_accounts.iter() { + accounts.push(AccountMeta::new_readonly(acc.key(), false)); + } + + let instruction = Instruction { + program_id: MPL_BUBBLEGUM_ID, + accounts, + data, + }; + + // Gather all account infos for the CPI + let mut account_infos = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority.to_account_info(), + context.accounts.leaf_owner.to_account_info(), + context.accounts.merkle_tree.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + for acc in context.remaining_accounts.iter() { + account_infos.push(acc.to_account_info()); + } + + invoke(&instruction, &account_infos)?; + + Ok(()) +} diff --git a/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/mod.rs b/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/mod.rs new file mode 100644 index 000000000..cd32a2822 --- /dev/null +++ b/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/instructions/mod.rs @@ -0,0 +1,3 @@ +pub mod burn_cnft; + +pub use burn_cnft::*; diff --git a/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/lib.rs b/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/lib.rs new file mode 100644 index 000000000..7bd40193c --- /dev/null +++ b/compression/cnft-burn/anchor-v1/programs/cnft-burn/src/lib.rs @@ -0,0 +1,43 @@ +// `diverging_sub_expression` is a false positive emitted from the Anchor +// `#[program]` macro expansion under this clippy/rustc version; the generated +// instruction-dispatch code is correct. +#![allow(clippy::diverging_sub_expression)] + +use anchor_lang::prelude::*; + +pub mod instructions; +use instructions::*; + +declare_id!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); + +/// mpl-bubblegum program ID +pub const MPL_BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); + +/// SPL Account Compression program ID +pub const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = + pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); + +#[derive(Clone)] +pub struct SPLCompression; + +impl anchor_lang::Id for SPLCompression { + fn id() -> Pubkey { + SPL_ACCOUNT_COMPRESSION_ID + } +} + +#[program] +pub mod cnft_burn { + use super::*; + + pub fn burn_cnft<'info>( + context: Context<'info, BurnCnftAccountConstraints<'info>>, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, + ) -> Result<()> { + instructions::burn_cnft::handle_burn_cnft(context, root, data_hash, creator_hash, nonce, index) + } +} diff --git a/compression/cnft-burn/anchor-v1/programs/cnft-burn/tests/test_burn.rs b/compression/cnft-burn/anchor-v1/programs/cnft-burn/tests/test_burn.rs new file mode 100644 index 000000000..a2ece44da --- /dev/null +++ b/compression/cnft-burn/anchor-v1/programs/cnft-burn/tests/test_burn.rs @@ -0,0 +1,460 @@ +//! LiteSVM integration test for the cnft-burn Anchor program. +//! +//! Full flow exercised: +//! 1. Load the cnft-burn program plus the three mainnet fixtures +//! (mpl-bubblegum, spl-account-compression, spl-noop) into LiteSVM. +//! 2. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! max_buffer_size=8, canopy=0) via `create_tree_config`. +//! 3. Mint a single cNFT to `leaf_owner` via `mint_v1`. +//! 4. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. +//! 5. Build the Merkle proof for leaf 0 (all empty-node siblings) and read +//! the current root from the onchain tree account. +//! 6. Call our program's `burn_cnft`, signed by `leaf_owner`, and assert the +//! transaction succeeds and a second burn fails (leaf already zeroed). + +use { + borsh::BorshSerialize, + litesvm::LiteSVM, + solana_instruction::{account_meta::AccountMeta, Instruction}, + solana_keccak_hasher::hashv, + solana_keypair::Keypair, + solana_message::Message, + solana_pubkey::{pubkey, Pubkey}, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +// ---- Program IDs ---------------------------------------------------------- + +// Track the program crate's declared id (CI runs `anchor keys sync`, which +// rewrites it to a freshly generated keypair before building). +const CNFT_BURN_ID: Pubkey = cnft_burn::ID; +const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); +const SYSTEM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// ---- Bubblegum instruction discriminators --------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; +const MINT_V1_DISC: [u8; 8] = [145, 98, 192, 118, 184, 147, 118, 104]; + +// Anchor-style instruction discriminator for `burn_cnft` = sha256("global:burn_cnft")[..8]. +// Computed in `burn_cnft_disc()` below to avoid a sha2 dependency-mismatch; the program +// is generated by Anchor so we mirror that scheme. + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: String, + symbol: String, + uri: String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard enum, encoded by variant index + collection: Option, // None - Collection, kept absent + uses: Option, // None - Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- Anchor discriminator for burn_cnft ------------------------------------ + +fn burn_cnft_disc() -> [u8; 8] { + // sha256("global:burn_cnft")[..8]. Implemented inline to avoid pulling a + // crypto crate that conflicts with the program's solana version. + let digest = sha256(b"global:burn_cnft"); + let mut out = [0u8; 8]; + out.copy_from_slice(&digest[..8]); + out +} + +// Minimal SHA-256 (FIPS 180-4) - only used to derive the Anchor discriminator. +fn sha256(input: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut msg = input.to_vec(); + let bitlen = (input.len() as u64) * 8; + msg.push(0x80); + while msg.len() % 64 != 56 { + msg.push(0); + } + msg.extend_from_slice(&bitlen.to_be_bytes()); + + for chunk in msg.chunks(64) { + let mut w = [0u32; 64]; + for (i, wi) in w.iter_mut().enumerate().take(16) { + *wi = u32::from_be_bytes([ + chunk[i * 4], + chunk[i * 4 + 1], + chunk[i * 4 + 2], + chunk[i * 4 + 3], + ]); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let mut v = h; + for i in 0..64 { + let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); + let ch = (v[4] & v[5]) ^ ((!v[4]) & v[6]); + let t1 = v[7] + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); + let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); + let t2 = s0.wrapping_add(maj); + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3].wrapping_add(t1); + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = t1.wrapping_add(t2); + } + for i in 0..8 { + h[i] = h[i].wrapping_add(v[i]); + } + } + let mut out = [0u8; 32]; + for (i, word) in h.iter().enumerate() { + out[i * 4..i * 4 + 4].copy_from_slice(&word.to_be_bytes()); + } + out +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56 bytes) || zero-copy ConcurrentMerkleTree (1248) || canopy (0) +// +// Header (ConcurrentMerkleTreeHeader): account_type(1) + header-enum-discriminant(1) +// + V1{ max_buffer_size(4), max_depth(4), authority(32), creation_slot(8), +// is_batch_initialized(1), _padding[5] } = 56 bytes total. +// +// ConcurrentMerkleTree<3,8> (#[repr(C)]): +// sequence_number u64 (off 0) +// active_index u64 (off 8) +// buffer_size u64 (off 16) +// change_logs [ChangeLog<3>; 8] (off 24), stride = 136 +// ChangeLog<3> = root[32] + path[3*32] + index u32 + _padding u32 = 136 +// rightmost_proof Path<3> +// +// Current root = change_logs[active_index].root. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Helpers --------------------------------------------------------------- + +fn send( + svm: &mut LiteSVM, + ixs: Vec, + payer: &Keypair, + signers: &[&Keypair], +) -> Result<(), Box> { + let msg = Message::new(&ixs, Some(&payer.pubkey())); + let blockhash = svm.latest_blockhash(); + let mut tx = Transaction::new_unsigned(msg); + tx.sign(signers, blockhash); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) +} + +#[test] +fn test_burn_cnft() { + let mut svm = LiteSVM::new(); + + // Load the cnft-burn program and the three mainnet fixtures. + svm.add_program( + CNFT_BURN_ID, + include_bytes!("../../../target/deploy/cnft_burn.so"), + ) + .unwrap(); + svm.add_program( + BUBBLEGUM_ID, + include_bytes!("../../../tests/fixtures/mpl_bubblegum.so"), + ) + .unwrap(); + svm.add_program( + COMPRESSION_ID, + include_bytes!("../../../tests/fixtures/spl_account_compression.so"), + ) + .unwrap(); + svm.add_program( + NOOP_ID, + include_bytes!("../../../tests/fixtures/spl_noop.so"), + ) + .unwrap(); + + // Fund payer and leaf_owner. + let payer = Keypair::new(); + let leaf_owner = Keypair::new(); + svm.airdrop(&payer.pubkey(), 100 * solana_native_token::LAMPORTS_PER_SOL) + .unwrap(); + svm.airdrop( + &leaf_owner.pubkey(), + 10 * solana_native_token::LAMPORTS_PER_SOL, + ) + .unwrap(); + + // Create the Merkle tree account, owned by the compression program. + let merkle_tree = Keypair::new(); + let rent = svm.minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let create_acc = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(merkle_tree.pubkey(), true), + ], + // System CreateAccount: u32 instruction index (0) + lamports u64 + space u64 + owner [32] + data: { + let mut d = Vec::new(); + d.extend_from_slice(&0u32.to_le_bytes()); + d.extend_from_slice(&rent.to_le_bytes()); + d.extend_from_slice(&(TREE_ACCOUNT_SIZE as u64).to_le_bytes()); + d.extend_from_slice(COMPRESSION_ID.as_ref()); + d + }, + }; + + // tree_authority (a.k.a tree_config) PDA = [merkle_tree] under bubblegum. + let (tree_config, _) = + Pubkey::find_program_address(&[merkle_tree.pubkey().as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + + send( + &mut svm, + vec![create_acc, create_tree_ix], + &payer, + &[&payer, &merkle_tree], + ) + .expect("create_tree_config should succeed"); + + // Build the MetadataArgs for the single cNFT we mint. + let creator = Creator { + address: leaf_owner.pubkey().to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "Test cNFT".to_string(), + symbol: "TCNFT".to_string(), + uri: "https://example.com/nft.json".to_string(), + seller_fee_basis_points: 500, + primary_sale_happened: false, + is_mutable: true, + edition_nonce: None, + token_standard: Some(0), // TokenStandard::NonFungible + collection: None, + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator.clone()], + }; + + // mint_v1 + let mint_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), // leaf_delegate + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator_or_delegate + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = MINT_V1_DISC.to_vec(); + d.extend_from_slice(&borsh::to_vec(&metadata).unwrap()); + d + }, + }; + send(&mut svm, vec![mint_ix], &payer, &[&payer]).expect("mint_v1 should succeed"); + + // Recompute data_hash and creator_hash exactly as Bubblegum does. + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the current root from the onchain tree account. + let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; + let root = read_current_root(&tree_data); + + // Build burn_cnft via our program. Accounts per BurnCnft struct: + // leaf_owner (signer,mut), tree_authority (mut), merkle_tree (mut), + // log_wrapper, compression_program, bubblegum_program, system_program, + // then proof nodes as remaining accounts. + let mut burn_accounts = vec![ + AccountMeta::new(leaf_owner.pubkey(), true), + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ]; + for node in proof.iter() { + burn_accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*node), + false, + )); + } + + let burn_data = { + let mut d = burn_cnft_disc().to_vec(); + d.extend_from_slice(&root); + d.extend_from_slice(&data_hash); + d.extend_from_slice(&creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce + d.extend_from_slice(&0u32.to_le_bytes()); // index + d + }; + + let burn_ix = Instruction { + program_id: CNFT_BURN_ID, + accounts: burn_accounts.clone(), + data: burn_data.clone(), + }; + + send(&mut svm, vec![burn_ix], &leaf_owner, &[&leaf_owner]).expect("burn_cnft should succeed"); + + // After burning, leaf 0 is zeroed. The root the test cached is now stale, + // so a second burn with the same (root, hashes) must fail. + let burn_ix2 = Instruction { + program_id: CNFT_BURN_ID, + accounts: burn_accounts, + data: burn_data, + }; + let second = send(&mut svm, vec![burn_ix2], &leaf_owner, &[&leaf_owner]); + assert!( + second.is_err(), + "second burn must fail: the leaf was already burned" + ); +} + +#[test] +fn test_burn_cnft_disc_matches_program() { + // Sanity: the Anchor discriminator we compute equals sha256("global:burn_cnft")[..8]. + let disc = burn_cnft_disc(); + assert_eq!(disc.len(), 8); + // Also exercise our empty_node against the known depth-1 value. + let e1 = empty_node(1); + let manual = hashv(&[&[0u8; 32], &[0u8; 32]]).to_bytes(); + assert_eq!(e1, manual); +} diff --git a/compression/cnft-burn/anchor-v1/tests/fixtures/README.md b/compression/cnft-burn/anchor-v1/tests/fixtures/README.md new file mode 100644 index 000000000..a10fd95bc --- /dev/null +++ b/compression/cnft-burn/anchor-v1/tests/fixtures/README.md @@ -0,0 +1,24 @@ +# Test fixtures - mainnet program binaries + +These `.so` files are the compiled onchain programs the cNFT-burn test CPIs +into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) +can load them locally (LiteSVM only bundles System/Token/Token Extensions/ATA). They +are the real programs - not modified - so accounts they create/verify behave +exactly as on mainnet. + +| File | Program | Program ID | Source | Dumped (UTC) | Slot | +|------|---------|------------|--------|--------------|------| +| `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | + +## Refreshing + +These are point-in-time snapshots. To re-dump (e.g. after an upstream program +upgrade), update the date/slot above and run: + +```bash +solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com +solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com +solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +``` diff --git a/compression/cnft-burn/anchor-v1/tests/fixtures/mpl_bubblegum.so b/compression/cnft-burn/anchor-v1/tests/fixtures/mpl_bubblegum.so new file mode 100644 index 0000000000000000000000000000000000000000..3b573de0bfe31fac52f561db9709b4c30cf766d0 GIT binary patch literal 1329808 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%0Ao62o3`e+;n)8NbASg?^NI5b4pr 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 fTPjJRa-T}fU+ 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ëi{{RVTe={IP=rr*HEMKi=dkG<(PuyIkU-+*zB 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 A*8l(j literal 0 HcmV?d00001 diff --git a/compression/cnft-burn/anchor-v1/tests/fixtures/spl_account_compression.so b/compression/cnft-burn/anchor-v1/tests/fixtures/spl_account_compression.so new file mode 100644 index 0000000000000000000000000000000000000000..a5db971a3bee12066fc5e0811d2246f458b1fe03 GIT binary patch literal 2349040 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∾C-nB~IidB;5jf!qJ>SXmIzMhZ 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
$e+kT4RQa#L5--zK`m2@gIb}U_T}4g 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

rHiP4k%L10 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 z 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�(lo1^~1{bP#0~#)z(AR9<=-KYWdZ?DX=ka=| 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

E`%epBjsj)!V~ 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

iJETt<*3(1!rC~iiq;FbuogLCY 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 QN-_@5S&pK6mRkxxXRhDA|d> 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%0AifUtiLcv3##f;SzKRK7g@Ugl!PmBN@$;*T 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%0DRO3mr>z{L%4NSq})y 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 literal 0 HcmV?d00001 diff --git a/compression/cnft-burn/anchor-v1/tests/fixtures/spl_noop.so b/compression/cnft-burn/anchor-v1/tests/fixtures/spl_noop.so new file mode 100644 index 0000000000000000000000000000000000000000..e250fa09254f69ad2e39a74a000e01ca5e3825b4 GIT binary patch literal 41056 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 literal 0 HcmV?d00001 diff --git a/compression/cnft-burn/anchor/README.md b/compression/cnft-burn/anchor/README.md index d0fabdd44..60d41464f 100644 --- a/compression/cnft-burn/anchor/README.md +++ b/compression/cnft-burn/anchor/README.md @@ -1,5 +1,11 @@ # cnft-burn +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + An [Anchor](https://solana.com/docs/terminology#anchor) [program](https://solana.com/docs/terminology#program) that burns compressed NFTs (cNFTs) in your collection. The program performs a [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi) into the Metaplex Bubblegum program to do the burn. ## Components diff --git a/compression/cnft-vault/anchor-v1/.gitignore b/compression/cnft-vault/anchor-v1/.gitignore new file mode 100644 index 000000000..d243ecc13 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/.gitignore @@ -0,0 +1,7 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger diff --git a/compression/cnft-vault/anchor-v1/Anchor.toml b/compression/cnft-vault/anchor-v1/Anchor.toml new file mode 100644 index 000000000..f60734398 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +cnft_vault = "Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/compression/cnft-vault/anchor-v1/CHANGELOG.md b/compression/cnft-vault/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/compression/cnft-vault/anchor-v1/Cargo.toml b/compression/cnft-vault/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/compression/cnft-vault/anchor-v1/README.md b/compression/cnft-vault/anchor-v1/README.md new file mode 100644 index 000000000..2e6b4fde2 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/README.md @@ -0,0 +1,50 @@ +# cNFT Vault + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Example code for working with Metaplex compressed NFTs (cNFTs) inside Solana [Anchor](https://solana.com/docs/terminology#anchor) [programs](https://solana.com/docs/terminology#program). + +The program keeps a PDA-owned vault. You send cNFTs to the vault, then the vault authority withdraws them via the program's [instruction handlers](https://solana.com/docs/terminology#instruction-handler). + +## Authority model + +Deposits are plain Bubblegum transfers to the **vault PDA** (seeds `["cNFT-vault"]`); no program instruction runs on deposit. Because of that, withdraw authorization is per-vault, not per-deposit: `initialize_vault` creates the vault PDA as a `Vault` state account and stores the signer as its **authority**. Both withdraw handlers require that stored authority as a `Signer` (`has_one = authority`) and reject any other signer with `VaultError::InvalidWithdrawAuthority` before the Bubblegum CPI runs. The same PDA doubles as the Bubblegum leaf owner and signs the transfer CPIs via `invoke_signed`. + +Three handlers: + +- `initialize_vault` - creates the vault PDA and stores the withdraw authority. +- `withdraw_cnft` - withdraws one cNFT to a recipient chosen by the authority. +- `withdraw_two_cnfts` - withdraws two cNFTs (possibly from different trees) in a single transaction. The client passes `proof_1_length` and `proof_2_length` to split the proof accounts between the two Bubblegum transfers; the handler rejects lengths that do not add up to the supplied proof accounts with `VaultError::ProofLengthMismatch`. + +Use this as a reference for working with cNFTs in your own programs. + +## Components + +- `programs/cnft-vault/` - the Anchor program. + +## Testing + +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cnft-vault/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. The suite covers authority withdraws (single and two-cNFT), rejection of non-authority signers, stale-root replays, and out-of-range proof lengths. + +```bash +cargo build-sbf +cargo test +``` + +## Deployment + +The program ID declared in [`programs/cnft-vault/src/lib.rs`](programs/cnft-vault/src/lib.rs) is `Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D`. Whether this address is currently deployed on any cluster is not tracked in this repo - verify with `solana program show ` against the cluster you care about. + +To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, then run `anchor build && anchor deploy`. + +## Limitations + +This is a reference implementation and is not optimized for compute. The vault is global to the program deployment: there is one vault PDA with one authority, so anyone who deposits a cNFT is entrusting it to that authority. + +## Further resources + +A video walkthrough is available on [Solandy's YouTube channel](https://youtu.be/qzr-q_E7H0M). diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/Cargo.toml b/compression/cnft-vault/anchor-v1/programs/cnft-vault/Cargo.toml new file mode 100644 index 000000000..4e54a8190 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "cnft-vault" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "cnft_vault" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +# mpl-bubblegum and spl-account-compression removed: they depend on solana-program 2.x +# which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually +# using raw invoke_signed() with hardcoded program IDs and discriminators. +borsh = "1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.0" +solana-account = "3.0.0" +solana-native-token = "3.0.0" +solana-signer = "3.0.0" +solana-message = "3.0.0" +solana-keccak-hasher = "3.0.0" diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/Xargo.toml b/compression/cnft-vault/anchor-v1/programs/cnft-vault/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/error.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/error.rs new file mode 100644 index 000000000..a349bac19 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/error.rs @@ -0,0 +1,9 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum VaultError { + #[msg("Only the vault authority may withdraw cNFTs from the vault")] + InvalidWithdrawAuthority, + #[msg("proof_1_length + proof_2_length must equal the number of proof accounts supplied")] + ProofLengthMismatch, +} diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/initialize_vault.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/initialize_vault.rs new file mode 100644 index 000000000..58cf3389b --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/initialize_vault.rs @@ -0,0 +1,27 @@ +use anchor_lang::prelude::*; + +use crate::state::{Vault, VAULT_SEED}; + +#[derive(Accounts)] +pub struct InitializeVaultAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + init, + payer = authority, + space = Vault::DISCRIMINATOR.len() + Vault::INIT_SPACE, + seeds = [VAULT_SEED], + bump, + )] + pub vault: Account<'info, Vault>, + + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context) -> Result<()> { + let vault = &mut context.accounts.vault; + vault.authority = context.accounts.authority.key(); + vault.bump = context.bumps.vault; + Ok(()) +} diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/mod.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/mod.rs new file mode 100644 index 000000000..435b40c79 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/mod.rs @@ -0,0 +1,7 @@ +pub mod initialize_vault; +pub mod withdraw_cnft; +pub mod withdraw_two_cnfts; + +pub use initialize_vault::*; +pub use withdraw_cnft::*; +pub use withdraw_two_cnfts::*; diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_cnft.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_cnft.rs new file mode 100644 index 000000000..79dfaed97 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_cnft.rs @@ -0,0 +1,113 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::{instruction::AccountMeta, program::invoke_signed}; + +use crate::error::VaultError; +use crate::state::{Vault, VAULT_SEED}; +use crate::{build_transfer_instruction, SPLCompression, TransferArgs, MPL_BUBBLEGUM_ID}; + +#[derive(Accounts)] +pub struct WithdrawCnftAccountConstraints<'info> { + /// The stored vault authority. Only this signer may withdraw. + pub authority: Signer<'info>, + + // The vault PDA owns the cNFTs (as Bubblegum leaf owner) and signs the + // transfer CPI via invoke_signed. + #[account( + seeds = [VAULT_SEED], + bump = vault.bump, + has_one = authority @ VaultError::InvalidWithdrawAuthority, + )] + pub vault: Account<'info, Vault>, + + #[account(mut)] + #[account( + seeds = [merkle_tree.key().as_ref()], + bump, + seeds::program = bubblegum_program.key() + )] + /// CHECK: This account is modified in the downstream program + pub tree_authority: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub new_leaf_owner: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account is modified in the downstream program + pub merkle_tree: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub log_wrapper: UncheckedAccount<'info>, + + pub compression_program: Program<'info, SPLCompression>, + + // Pin the bubblegum program account to the known mpl-bubblegum id. Without + // this constraint the caller could pass any account to the CPI. + /// CHECK: address constrained to the mpl-bubblegum program id. + #[account(address = MPL_BUBBLEGUM_ID)] + pub bubblegum_program: UncheckedAccount<'info>, + + pub system_program: Program<'info, System>, +} + +pub fn handler<'info>( + context: Context<'info, WithdrawCnftAccountConstraints<'info>>, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +) -> Result<()> { + msg!( + "attempting to send nft {} from tree {}", + index, + context.accounts.merkle_tree.key() + ); + + let proof_metas: Vec = context + .remaining_accounts + .iter() + .map(|acc| AccountMeta::new_readonly(acc.key(), false)) + .collect(); + + let instruction = build_transfer_instruction( + context.accounts.tree_authority.key(), + context.accounts.vault.key(), + context.accounts.vault.key(), + context.accounts.new_leaf_owner.key(), + context.accounts.merkle_tree.key(), + context.accounts.log_wrapper.key(), + context.accounts.compression_program.key(), + context.accounts.system_program.key(), + &proof_metas, + TransferArgs { + root, + data_hash, + creator_hash, + nonce, + index, + }, + )?; + + // Gather all account infos for the CPI + let mut account_infos = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority.to_account_info(), + context.accounts.vault.to_account_info(), + context.accounts.new_leaf_owner.to_account_info(), + context.accounts.merkle_tree.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + for acc in context.remaining_accounts.iter() { + account_infos.push(acc.to_account_info()); + } + + invoke_signed( + &instruction, + &account_infos, + &[&[VAULT_SEED, &[context.accounts.vault.bump]]], + )?; + + Ok(()) +} diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs new file mode 100644 index 000000000..fadae6e01 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/instructions/withdraw_two_cnfts.rs @@ -0,0 +1,195 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::{instruction::AccountMeta, program::invoke_signed}; + +use crate::error::VaultError; +use crate::state::{Vault, VAULT_SEED}; +use crate::{build_transfer_instruction, SPLCompression, TransferArgs, MPL_BUBBLEGUM_ID}; + +#[derive(Accounts)] +pub struct WithdrawTwoCnftsAccountConstraints<'info> { + /// The stored vault authority. Only this signer may withdraw. + pub authority: Signer<'info>, + + // The vault PDA owns the cNFTs (as Bubblegum leaf owner) and signs both + // transfer CPIs via invoke_signed. + #[account( + seeds = [VAULT_SEED], + bump = vault.bump, + has_one = authority @ VaultError::InvalidWithdrawAuthority, + )] + pub vault: Account<'info, Vault>, + + #[account(mut)] + #[account( + seeds = [merkle_tree1.key().as_ref()], + bump, + seeds::program = bubblegum_program.key() + )] + /// CHECK: This account is modified in the downstream program + pub tree_authority1: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub new_leaf_owner1: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account is modified in the downstream program + pub merkle_tree1: UncheckedAccount<'info>, + + #[account(mut)] + #[account( + seeds = [merkle_tree2.key().as_ref()], + bump, + seeds::program = bubblegum_program.key() + )] + /// CHECK: This account is modified in the downstream program + pub tree_authority2: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub new_leaf_owner2: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account is modified in the downstream program + pub merkle_tree2: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub log_wrapper: UncheckedAccount<'info>, + + pub compression_program: Program<'info, SPLCompression>, + + // Pin the bubblegum program account to the known mpl-bubblegum id. Without + // this constraint the caller could pass any account to the two CPI calls. + /// CHECK: address constrained to the mpl-bubblegum program id. + #[account(address = MPL_BUBBLEGUM_ID)] + pub bubblegum_program: UncheckedAccount<'info>, + + pub system_program: Program<'info, System>, +} + +#[allow(clippy::too_many_arguments)] +pub fn handler<'info>( + context: Context<'info, WithdrawTwoCnftsAccountConstraints<'info>>, + root1: [u8; 32], + data_hash1: [u8; 32], + creator_hash1: [u8; 32], + nonce1: u64, + index1: u32, + proof_1_length: u8, + root2: [u8; 32], + data_hash2: [u8; 32], + creator_hash2: [u8; 32], + nonce2: u64, + index2: u32, + proof_2_length: u8, +) -> Result<()> { + let merkle_tree1 = context.accounts.merkle_tree1.key(); + let merkle_tree2 = context.accounts.merkle_tree2.key(); + msg!( + "attempting to send nfts from trees {} and {}", + merkle_tree1, + merkle_tree2 + ); + + // The proof lengths are client-supplied: bounds-check them against the + // accounts actually provided before slicing, so adversarial input gets a + // clean named error instead of a panic. + let proof_1_length = proof_1_length as usize; + let proof_2_length = proof_2_length as usize; + require!( + proof_1_length + .checked_add(proof_2_length) + .is_some_and(|total| total == context.remaining_accounts.len()), + VaultError::ProofLengthMismatch + ); + + let signer_seeds: &[&[u8]] = &[VAULT_SEED, &[context.accounts.vault.bump]]; + + // Split remaining accounts into proof1 and proof2 + let (proof1_accounts, proof2_accounts) = context.remaining_accounts.split_at(proof_1_length); + + let proof1_metas: Vec = proof1_accounts + .iter() + .map(|acc| AccountMeta::new_readonly(acc.key(), false)) + .collect(); + + let proof2_metas: Vec = proof2_accounts + .iter() + .map(|acc| AccountMeta::new_readonly(acc.key(), false)) + .collect(); + + // Withdraw cNFT#1 + msg!("withdrawing cNFT#1"); + let instruction1 = build_transfer_instruction( + context.accounts.tree_authority1.key(), + context.accounts.vault.key(), + context.accounts.vault.key(), + context.accounts.new_leaf_owner1.key(), + context.accounts.merkle_tree1.key(), + context.accounts.log_wrapper.key(), + context.accounts.compression_program.key(), + context.accounts.system_program.key(), + &proof1_metas, + TransferArgs { + root: root1, + data_hash: data_hash1, + creator_hash: creator_hash1, + nonce: nonce1, + index: index1, + }, + )?; + + let mut account_infos1 = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority1.to_account_info(), + context.accounts.vault.to_account_info(), + context.accounts.new_leaf_owner1.to_account_info(), + context.accounts.merkle_tree1.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + for acc in proof1_accounts.iter() { + account_infos1.push(acc.to_account_info()); + } + + invoke_signed(&instruction1, &account_infos1, &[signer_seeds])?; + + // Withdraw cNFT#2 + msg!("withdrawing cNFT#2"); + let instruction2 = build_transfer_instruction( + context.accounts.tree_authority2.key(), + context.accounts.vault.key(), + context.accounts.vault.key(), + context.accounts.new_leaf_owner2.key(), + context.accounts.merkle_tree2.key(), + context.accounts.log_wrapper.key(), + context.accounts.compression_program.key(), + context.accounts.system_program.key(), + &proof2_metas, + TransferArgs { + root: root2, + data_hash: data_hash2, + creator_hash: creator_hash2, + nonce: nonce2, + index: index2, + }, + )?; + + let mut account_infos2 = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority2.to_account_info(), + context.accounts.vault.to_account_info(), + context.accounts.new_leaf_owner2.to_account_info(), + context.accounts.merkle_tree2.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + for acc in proof2_accounts.iter() { + account_infos2.push(acc.to_account_info()); + } + + invoke_signed(&instruction2, &account_infos2, &[signer_seeds])?; + + msg!("successfully sent cNFTs"); + Ok(()) +} diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/lib.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/lib.rs new file mode 100644 index 000000000..f86065d06 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/lib.rs @@ -0,0 +1,137 @@ +#![allow(clippy::diverging_sub_expression)] + +use anchor_lang::prelude::*; +use anchor_lang::solana_program::instruction::{AccountMeta, Instruction}; +use borsh::BorshSerialize; + +pub mod error; +mod instructions; +pub mod state; +use instructions::*; + +declare_id!("Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D"); + +/// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) +const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, 0x8a, + 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, 0xa5, 0xa5, +]); + +/// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) +const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = Pubkey::new_from_array([ + 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, 0xf7, + 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, 0x7f, 0x14, +]); + +/// Transfer instruction discriminator from mpl-bubblegum +const TRANSFER_DISCRIMINATOR: [u8; 8] = [163, 52, 200, 231, 140, 3, 69, 186]; + +/// Instruction arguments for mpl-bubblegum Transfer, serialized with borsh +#[derive(BorshSerialize)] +pub struct TransferArgs { + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +} + +#[derive(Clone)] +pub struct SPLCompression; + +impl anchor_lang::Id for SPLCompression { + fn id() -> Pubkey { + SPL_ACCOUNT_COMPRESSION_ID + } +} + +/// Build a mpl-bubblegum Transfer instruction from pubkeys and args. +/// This avoids using mpl-bubblegum's CPI wrapper which requires solana-program 2.x AccountInfo. +#[allow(clippy::too_many_arguments)] +pub fn build_transfer_instruction( + tree_config: Pubkey, + leaf_owner: Pubkey, + leaf_delegate: Pubkey, + new_leaf_owner: Pubkey, + merkle_tree: Pubkey, + log_wrapper: Pubkey, + compression_program: Pubkey, + system_program: Pubkey, + remaining_accounts: &[AccountMeta], + args: TransferArgs, +) -> Result { + let mut accounts = Vec::with_capacity(8 + remaining_accounts.len()); + accounts.push(AccountMeta::new_readonly(tree_config, false)); + // leaf_owner is a signer (PDA signs via invoke_signed) + accounts.push(AccountMeta::new_readonly(leaf_owner, true)); + // leaf_delegate = leaf_owner, not an additional signer + accounts.push(AccountMeta::new_readonly(leaf_delegate, false)); + accounts.push(AccountMeta::new_readonly(new_leaf_owner, false)); + accounts.push(AccountMeta::new(merkle_tree, false)); + accounts.push(AccountMeta::new_readonly(log_wrapper, false)); + accounts.push(AccountMeta::new_readonly(compression_program, false)); + accounts.push(AccountMeta::new_readonly(system_program, false)); + accounts.extend_from_slice(remaining_accounts); + + let mut data = TRANSFER_DISCRIMINATOR.to_vec(); + args.serialize(&mut data)?; + + Ok(Instruction { + program_id: MPL_BUBBLEGUM_ID, + accounts, + data, + }) +} + +#[program] +pub mod cnft_vault { + use super::*; + + pub fn initialize_vault(context: Context) -> Result<()> { + instructions::initialize_vault::handler(context) + } + + pub fn withdraw_cnft<'info>( + context: Context<'info, WithdrawCnftAccountConstraints<'info>>, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, + ) -> Result<()> { + instructions::withdraw_cnft::handler(context, root, data_hash, creator_hash, nonce, index) + } + + #[allow(clippy::too_many_arguments)] + pub fn withdraw_two_cnfts<'info>( + context: Context<'info, WithdrawTwoCnftsAccountConstraints<'info>>, + root1: [u8; 32], + data_hash1: [u8; 32], + creator_hash1: [u8; 32], + nonce1: u64, + index1: u32, + proof_1_length: u8, + root2: [u8; 32], + data_hash2: [u8; 32], + creator_hash2: [u8; 32], + nonce2: u64, + index2: u32, + proof_2_length: u8, + ) -> Result<()> { + instructions::withdraw_two_cnfts::handler( + context, + root1, + data_hash1, + creator_hash1, + nonce1, + index1, + proof_1_length, + root2, + data_hash2, + creator_hash2, + nonce2, + index2, + proof_2_length, + ) + } +} diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/mod.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/mod.rs new file mode 100644 index 000000000..2d0688244 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod vault; + +pub use vault::*; diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/vault.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/vault.rs new file mode 100644 index 000000000..5ce304df8 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/src/state/vault.rs @@ -0,0 +1,14 @@ +use anchor_lang::prelude::*; + +/// Seed prefix for the vault PDA. The same PDA stores the withdraw authority +/// and acts as the cNFT leaf owner that signs Bubblegum transfers. +pub const VAULT_SEED: &[u8] = b"cNFT-vault"; + +#[derive(InitSpace)] +#[account] +pub struct Vault { + /// The only signer allowed to withdraw cNFTs from the vault. + pub authority: Pubkey, + + pub bump: u8, +} diff --git a/compression/cnft-vault/anchor-v1/programs/cnft-vault/tests/test_vault.rs b/compression/cnft-vault/anchor-v1/programs/cnft-vault/tests/test_vault.rs new file mode 100644 index 000000000..9e0df7d91 --- /dev/null +++ b/compression/cnft-vault/anchor-v1/programs/cnft-vault/tests/test_vault.rs @@ -0,0 +1,768 @@ +//! LiteSVM integration tests for the cnft-vault Anchor program. +//! +//! Shared flow exercised by the tests: +//! 1. Load the cnft-vault program plus the three mainnet fixtures +//! (mpl-bubblegum, spl-account-compression, spl-noop) into LiteSVM. +//! 2. Initialize the vault PDA via `initialize_vault`, storing the +//! withdraw authority. +//! 3. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! max_buffer_size=8, canopy=0) via `create_tree_config`. +//! 4. Mint a single cNFT whose leaf_owner is the vault PDA (so the vault +//! holds it) via `mint_v1`. +//! 5. Recompute `data_hash` / `creator_hash` exactly as Bubblegum does. +//! 6. Build the Merkle proof for leaf 0 (all empty-node siblings) and read +//! the current root from the onchain tree account. +//! 7. Call the program's withdraw handlers, which CPI Bubblegum `Transfer` +//! signed by the vault PDA (`invoke_signed`), to move the cNFT(s) to a +//! recipient. +//! +//! Coverage: +//! - withdraw by the stored authority succeeds (single and two-cNFT) +//! - withdraw by a non-authority signer fails with +//! `VaultError::InvalidWithdrawAuthority` +//! - replaying a withdraw with the now-stale root fails +//! - a two-cNFT withdraw whose proof lengths do not match the supplied +//! proof accounts fails with `VaultError::ProofLengthMismatch` instead +//! of panicking inside `split_at` + +use { + borsh::BorshSerialize, + cnft_vault::error::VaultError, + litesvm::LiteSVM, + solana_instruction::{account_meta::AccountMeta, Instruction}, + solana_keccak_hasher::hashv, + solana_keypair::Keypair, + solana_message::Message, + solana_pubkey::{pubkey, Pubkey}, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +// ---- Program IDs ---------------------------------------------------------- + +// Track the crate's declared id (CI runs `anchor keys sync` before building). +const CNFT_VAULT_ID: Pubkey = cnft_vault::ID; +const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); +const SYSTEM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// ---- Bubblegum instruction discriminators --------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; +const MINT_V1_DISC: [u8; 8] = [145, 98, 192, 118, 184, 147, 118, 104]; + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: String, + symbol: String, + uri: String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard enum, encoded by variant index + collection: Option, // None - Collection, kept absent + uses: Option, // None - Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- Anchor instruction discriminators -------------------------------------- + +// sha256("global:")[..8]. Implemented inline to avoid pulling +// a crypto crate that conflicts with the program's solana version. +fn anchor_discriminator(handler_name: &str) -> [u8; 8] { + let preimage = format!("global:{handler_name}"); + let digest = sha256(preimage.as_bytes()); + let mut out = [0u8; 8]; + out.copy_from_slice(&digest[..8]); + out +} + +// Minimal SHA-256 (FIPS 180-4) - only used to derive Anchor discriminators. +fn sha256(input: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut msg = input.to_vec(); + let bitlen = (input.len() as u64) * 8; + msg.push(0x80); + while msg.len() % 64 != 56 { + msg.push(0); + } + msg.extend_from_slice(&bitlen.to_be_bytes()); + + for chunk in msg.chunks(64) { + let mut w = [0u32; 64]; + for (i, wi) in w.iter_mut().enumerate().take(16) { + *wi = u32::from_be_bytes([ + chunk[i * 4], + chunk[i * 4 + 1], + chunk[i * 4 + 2], + chunk[i * 4 + 3], + ]); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let mut v = h; + for i in 0..64 { + let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); + let ch = (v[4] & v[5]) ^ ((!v[4]) & v[6]); + let t1 = v[7] + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); + let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); + let t2 = s0.wrapping_add(maj); + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3].wrapping_add(t1); + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = t1.wrapping_add(t2); + } + for i in 0..8 { + h[i] = h[i].wrapping_add(v[i]); + } + } + let mut out = [0u8; 32]; + for (i, word) in h.iter().enumerate() { + out[i * 4..i * 4 + 4].copy_from_slice(&word.to_be_bytes()); + } + out +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56 bytes) || zero-copy ConcurrentMerkleTree (1248) || canopy (0) +// +// Header (ConcurrentMerkleTreeHeader): account_type(1) + header-enum-discriminant(1) +// + V1{ max_buffer_size(4), max_depth(4), authority(32), creation_slot(8), +// is_batch_initialized(1), _padding[5] } = 56 bytes total. +// +// ConcurrentMerkleTree<3,8> (#[repr(C)]): +// sequence_number u64 (off 0) +// active_index u64 (off 8) +// buffer_size u64 (off 16) +// change_logs [ChangeLog<3>; 8] (off 24), stride = 136 +// ChangeLog<3> = root[32] + path[3*32] + index u32 + _padding u32 = 136 +// rightmost_proof Path<3> +// +// Current root = change_logs[active_index].root. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Transaction helpers ---------------------------------------------------- + +fn send( + svm: &mut LiteSVM, + ixs: Vec, + payer: &Keypair, + signers: &[&Keypair], +) -> Result<(), Box> { + let msg = Message::new(&ixs, Some(&payer.pubkey())); + let blockhash = svm.latest_blockhash(); + let mut tx = Transaction::new_unsigned(msg); + tx.sign(signers, blockhash); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) +} + +/// Assert a failed transaction carries the given program error. +fn assert_custom_error( + result: Result<(), Box>, + expected: VaultError, +) { + let failed = result.expect_err("transaction should fail"); + let expected_code = u32::from(expected); + let error_text = format!("{:?}", failed.err); + assert!( + error_text.contains(&format!("Custom({expected_code})")), + "expected Custom({expected_code}), got: {error_text}" + ); +} + +// ---- Fixture setup ---------------------------------------------------------- + +/// One Bubblegum tree holding a single cNFT owned by the vault PDA, plus +/// everything needed to withdraw it (root, hashes, proof). +struct TreeWithVaultCnft { + merkle_tree: Pubkey, + tree_config: Pubkey, + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + proof: [[u8; 32]; MAX_DEPTH as usize], +} + +struct VaultTestContext { + svm: LiteSVM, + payer: Keypair, + /// The keypair stored as the vault's withdraw authority. + authority: Keypair, + vault_pda: Pubkey, +} + +fn setup_vault() -> VaultTestContext { + let mut svm = LiteSVM::new(); + + // Load the cnft-vault program and the three mainnet fixtures. + svm.add_program( + CNFT_VAULT_ID, + include_bytes!("../../../target/deploy/cnft_vault.so"), + ) + .unwrap(); + svm.add_program( + BUBBLEGUM_ID, + include_bytes!("../../../tests/fixtures/mpl_bubblegum.so"), + ) + .unwrap(); + svm.add_program( + COMPRESSION_ID, + include_bytes!("../../../tests/fixtures/spl_account_compression.so"), + ) + .unwrap(); + svm.add_program( + NOOP_ID, + include_bytes!("../../../tests/fixtures/spl_noop.so"), + ) + .unwrap(); + + let payer = Keypair::new(); + svm.airdrop(&payer.pubkey(), 100 * solana_native_token::LAMPORTS_PER_SOL) + .unwrap(); + + let authority = Keypair::new(); + svm.airdrop( + &authority.pubkey(), + 10 * solana_native_token::LAMPORTS_PER_SOL, + ) + .unwrap(); + + // The vault PDA that stores the authority, owns the cNFTs (as Bubblegum + // leaf owner) and signs the transfer CPI. + let (vault_pda, _vault_bump) = Pubkey::find_program_address(&[b"cNFT-vault"], &CNFT_VAULT_ID); + + // initialize_vault: store `authority` on the vault PDA. + let initialize_ix = Instruction { + program_id: CNFT_VAULT_ID, + accounts: vec![ + AccountMeta::new(authority.pubkey(), true), + AccountMeta::new(vault_pda, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: anchor_discriminator("initialize_vault").to_vec(), + }; + let mut svm_context = VaultTestContext { + svm, + payer, + authority, + vault_pda, + }; + let authority_keypair = svm_context.authority.insecure_clone(); + send( + &mut svm_context.svm, + vec![initialize_ix], + &authority_keypair, + &[&authority_keypair], + ) + .expect("initialize_vault should succeed"); + + svm_context +} + +/// Create a Bubblegum tree and mint one cNFT into the vault PDA. +fn create_tree_with_vault_cnft(context: &mut VaultTestContext) -> TreeWithVaultCnft { + let payer = context.payer.insecure_clone(); + + // Create the Merkle tree account, owned by the compression program. + let merkle_tree = Keypair::new(); + let rent = context + .svm + .minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let create_acc = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(merkle_tree.pubkey(), true), + ], + // System CreateAccount: u32 instruction index (0) + lamports u64 + space u64 + owner [32] + data: { + let mut d = Vec::new(); + d.extend_from_slice(&0u32.to_le_bytes()); + d.extend_from_slice(&rent.to_le_bytes()); + d.extend_from_slice(&(TREE_ACCOUNT_SIZE as u64).to_le_bytes()); + d.extend_from_slice(COMPRESSION_ID.as_ref()); + d + }, + }; + + // tree_authority (a.k.a tree_config) PDA = [merkle_tree] under bubblegum. + let (tree_config, _) = + Pubkey::find_program_address(&[merkle_tree.pubkey().as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + + send( + &mut context.svm, + vec![create_acc, create_tree_ix], + &payer, + &[&payer, &merkle_tree], + ) + .expect("create_tree_config should succeed"); + + // Build the MetadataArgs for the single cNFT we mint. The leaf owner / + // delegate are the vault PDA, so the vault holds the cNFT. + let creator = Creator { + address: payer.pubkey().to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "Vault cNFT".to_string(), + symbol: "VCNFT".to_string(), + uri: "https://example.com/nft.json".to_string(), + seller_fee_basis_points: 500, + primary_sale_happened: false, + is_mutable: true, + edition_nonce: None, + token_standard: Some(0), // TokenStandard::NonFungible + collection: None, + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator.clone()], + }; + + // mint_v1 - leaf_owner and leaf_delegate are the vault PDA. + let mint_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new_readonly(context.vault_pda, false), // leaf_delegate + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator_or_delegate + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = MINT_V1_DISC.to_vec(); + d.extend_from_slice(&borsh::to_vec(&metadata).unwrap()); + d + }, + }; + send(&mut context.svm, vec![mint_ix], &payer, &[&payer]).expect("mint_v1 should succeed"); + + // Recompute data_hash and creator_hash exactly as Bubblegum does. + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the current root from the onchain tree account. + let tree_data = context + .svm + .get_account(&merkle_tree.pubkey()) + .unwrap() + .data; + let root = read_current_root(&tree_data); + + TreeWithVaultCnft { + merkle_tree: merkle_tree.pubkey(), + tree_config, + root, + data_hash, + creator_hash, + proof, + } +} + +// ---- Instruction builders for the program under test ------------------------ + +/// Build withdraw_cnft. Accounts per WithdrawCnftAccountConstraints: +/// authority (signer), vault, tree_authority (mut), new_leaf_owner, +/// merkle_tree (mut), log_wrapper, compression_program, bubblegum_program, +/// system_program, then proof nodes as remaining accounts. +fn build_withdraw_cnft_instruction( + context: &VaultTestContext, + signer: Pubkey, + tree: &TreeWithVaultCnft, + recipient: Pubkey, +) -> Instruction { + let mut accounts = vec![ + AccountMeta::new_readonly(signer, true), + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new(tree.tree_config, false), + AccountMeta::new_readonly(recipient, false), + AccountMeta::new(tree.merkle_tree, false), + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ]; + for node in tree.proof.iter() { + accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*node), + false, + )); + } + + let data = { + let mut d = anchor_discriminator("withdraw_cnft").to_vec(); + d.extend_from_slice(&tree.root); + d.extend_from_slice(&tree.data_hash); + d.extend_from_slice(&tree.creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce + d.extend_from_slice(&0u32.to_le_bytes()); // index + d + }; + + Instruction { + program_id: CNFT_VAULT_ID, + accounts, + data, + } +} + +/// Build withdraw_two_cnfts. Accounts per WithdrawTwoCnftsAccountConstraints: +/// authority (signer), vault, tree_authority1 (mut), new_leaf_owner1, +/// merkle_tree1 (mut), tree_authority2 (mut), new_leaf_owner2, +/// merkle_tree2 (mut), log_wrapper, compression_program, bubblegum_program, +/// system_program, then proof1 ++ proof2 as remaining accounts. +fn build_withdraw_two_cnfts_instruction( + context: &VaultTestContext, + signer: Pubkey, + tree1: &TreeWithVaultCnft, + tree2: &TreeWithVaultCnft, + recipient: Pubkey, + proof_1_length: u8, + proof_2_length: u8, +) -> Instruction { + let mut accounts = vec![ + AccountMeta::new_readonly(signer, true), + AccountMeta::new_readonly(context.vault_pda, false), + AccountMeta::new(tree1.tree_config, false), + AccountMeta::new_readonly(recipient, false), + AccountMeta::new(tree1.merkle_tree, false), + AccountMeta::new(tree2.tree_config, false), + AccountMeta::new_readonly(recipient, false), + AccountMeta::new(tree2.merkle_tree, false), + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ]; + for node in tree1.proof.iter().chain(tree2.proof.iter()) { + accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*node), + false, + )); + } + + let data = { + let mut d = anchor_discriminator("withdraw_two_cnfts").to_vec(); + d.extend_from_slice(&tree1.root); + d.extend_from_slice(&tree1.data_hash); + d.extend_from_slice(&tree1.creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce1 + d.extend_from_slice(&0u32.to_le_bytes()); // index1 + d.push(proof_1_length); + d.extend_from_slice(&tree2.root); + d.extend_from_slice(&tree2.data_hash); + d.extend_from_slice(&tree2.creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce2 + d.extend_from_slice(&0u32.to_le_bytes()); // index2 + d.push(proof_2_length); + d + }; + + Instruction { + program_id: CNFT_VAULT_ID, + accounts, + data, + } +} + +// ---- Tests ------------------------------------------------------------------ + +#[test] +fn test_withdraw_cnft_by_authority() { + let mut context = setup_vault(); + let tree = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + let withdraw_ix = build_withdraw_cnft_instruction( + &context, + authority.pubkey(), + &tree, + recipient.pubkey(), + ); + + // The stored authority signs, so the withdraw succeeds (the vault PDA + // signs the Bubblegum CPI via invoke_signed inside the program). + send( + &mut context.svm, + vec![withdraw_ix.clone()], + &authority, + &[&authority], + ) + .expect("withdraw_cnft signed by the vault authority should succeed"); + + // After transfer, leaf 0's owner changed (vault -> recipient), so the root + // moved. A second withdraw replaying the same (root, hashes) must fail: the + // cached root is stale and the leaf no longer hashes to it for the vault. + let second = send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ); + assert!( + second.is_err(), + "second withdraw must fail: leaf already transferred out of the vault" + ); +} + +#[test] +fn test_withdraw_cnft_rejected_for_non_authority() { + let mut context = setup_vault(); + let tree = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + + // An attacker funds and signs their own withdraw attempt; the vault's + // stored authority did not sign. + let attacker = Keypair::new(); + context + .svm + .airdrop( + &attacker.pubkey(), + 10 * solana_native_token::LAMPORTS_PER_SOL, + ) + .unwrap(); + + let withdraw_ix = + build_withdraw_cnft_instruction(&context, attacker.pubkey(), &tree, recipient.pubkey()); + + let result = send(&mut context.svm, vec![withdraw_ix], &attacker, &[&attacker]); + assert_custom_error(result, VaultError::InvalidWithdrawAuthority); +} + +#[test] +fn test_withdraw_two_cnfts_by_authority() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + let withdraw_ix = build_withdraw_two_cnfts_instruction( + &context, + authority.pubkey(), + &tree1, + &tree2, + recipient.pubkey(), + MAX_DEPTH as u8, + MAX_DEPTH as u8, + ); + + send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ) + .expect("withdraw_two_cnfts signed by the vault authority should succeed"); + + // Both trees' roots moved, so both cNFTs left the vault: replaying the + // single-tree withdraw against either tree with the cached roots fails. + let replay1 = build_withdraw_cnft_instruction( + &context, + authority.pubkey(), + &tree1, + recipient.pubkey(), + ); + let replay = send(&mut context.svm, vec![replay1], &authority, &[&authority]); + assert!( + replay.is_err(), + "cNFT#1 already left the vault, replay must fail" + ); +} + +#[test] +fn test_withdraw_two_cnfts_rejects_out_of_range_proof_length() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + // Claim one more proof node for tree1 than the instruction supplies in + // total: the bounds check must return ProofLengthMismatch instead of + // letting split_at(proof_1_length) panic and abort the program. + let supplied_proof_nodes = 2 * MAX_DEPTH as u8; + let out_of_range_proof_1_length = supplied_proof_nodes + 1; + + let withdraw_ix = build_withdraw_two_cnfts_instruction( + &context, + authority.pubkey(), + &tree1, + &tree2, + recipient.pubkey(), + out_of_range_proof_1_length, + 0, + ); + + let result = send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ); + assert_custom_error(result, VaultError::ProofLengthMismatch); +} + +#[test] +fn test_withdraw_two_cnfts_rejects_inconsistent_proof_lengths() { + let mut context = setup_vault(); + let tree1 = create_tree_with_vault_cnft(&mut context); + let tree2 = create_tree_with_vault_cnft(&mut context); + let recipient = Keypair::new(); + let authority = context.authority.insecure_clone(); + + // proof_1_length is in range but the two lengths do not add up to the + // supplied proof accounts, so the split would misattribute proof nodes. + let withdraw_ix = build_withdraw_two_cnfts_instruction( + &context, + authority.pubkey(), + &tree1, + &tree2, + recipient.pubkey(), + MAX_DEPTH as u8 - 1, + MAX_DEPTH as u8, + ); + + let result = send( + &mut context.svm, + vec![withdraw_ix], + &authority, + &[&authority], + ); + assert_custom_error(result, VaultError::ProofLengthMismatch); +} diff --git a/compression/cnft-vault/anchor-v1/tests/fixtures/README.md b/compression/cnft-vault/anchor-v1/tests/fixtures/README.md new file mode 100644 index 000000000..2af152e3d --- /dev/null +++ b/compression/cnft-vault/anchor-v1/tests/fixtures/README.md @@ -0,0 +1,24 @@ +# Test fixtures - mainnet program binaries + +These `.so` files are the compiled onchain programs the cNFT-vault test CPIs +into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) +can load them locally (LiteSVM only bundles System/Token/Token Extensions/ATA). They +are the real programs - not modified - so accounts they create/verify behave +exactly as on mainnet. + +| File | Program | Program ID | Source | Dumped (UTC) | Slot | +|------|---------|------------|--------|--------------|------| +| `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | + +## Refreshing + +These are point-in-time snapshots. To re-dump (e.g. after an upstream program +upgrade), update the date/slot above and run: + +```bash +solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com +solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com +solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +``` diff --git a/compression/cnft-vault/anchor-v1/tests/fixtures/mpl_bubblegum.so b/compression/cnft-vault/anchor-v1/tests/fixtures/mpl_bubblegum.so new file mode 100644 index 0000000000000000000000000000000000000000..3b573de0bfe31fac52f561db9709b4c30cf766d0 GIT binary patch literal 1329808 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%0Ao62o3`e+;n)8NbASg?^NI5b4pr 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 fTPjJRa-T}fU+ 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ëi{{RVTe={IP=rr*HEMKi=dkG<(PuyIkU-+*zB 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 A*8l(j literal 0 HcmV?d00001 diff --git a/compression/cnft-vault/anchor-v1/tests/fixtures/spl_account_compression.so b/compression/cnft-vault/anchor-v1/tests/fixtures/spl_account_compression.so new file mode 100644 index 0000000000000000000000000000000000000000..a5db971a3bee12066fc5e0811d2246f458b1fe03 GIT binary patch literal 2349040 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∾C-nB~IidB;5jf!qJ>SXmIzMhZ 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
$e+kT4RQa#L5--zK`m2@gIb}U_T}4g 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

rHiP4k%L10 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 z z5xF0`3%~P=2pk86{$qNwt-qHRn+Wr$4_W_7o$PmVuI=c!8%q1}qi%mcS+5lWFZhF6 z(EDWlK?#93%pa6^ER%A*+#giwmqNK7goBdwNqXMn(j)$$0uKl-%FO?T6_PO47X-2c_w_1{~C_F29G#L5Zh2_x*s@gKO^(s;%ut@CVhR zo|VVxxT7ZZebfuo_ft2hAE2&Nn?I-;^@EJBQkSSJ)abaRvt{as7!M9Ja8M=2e}M65 z_oB&1sHYkKSE#3`KS*7mo}-?iHh)lK)F&A~N^Sn2a@0S-_-(cC(c}+OZ&8~+s7>f= z<`0VNJVoQ6+Is)kb5I><&q4K|JqOi?_8imz+H+7V(4K=@h4vg&Tl1g3u!iH_A5=?^ zyM5(w-1~z$k#}Vm$;v&8;O1gL+aS`7iIgW_&7?(Rg zY1H_BDe2;Q$3=YKWbTpKFq!g3j5+U8NZu9D6}idd9*XhIkY>w`-A$tG*`I`AJgiYyA^IG zbEh11@0!C)IH*;3=8eNab+jD!_Xh>L>ijmcy{=vKbCc_Pe>kQWzt}P5^R8UnZ7*86?BJj*pLm^er`#Hpei!DhlYE_Wp?(*}cw0Y``$#@+{Y&mY?oY1M z@4{TD--V$(Lwsyx)*9#v2DUN^Klej@mdV z*uOY$92D$h@COC^8Rw0If_)7f6zp&8IVjlYIBy&j?01~EbzIo@IBy)(KlqvoBs7_V1;ZhR1S0>fVlAE`G9udUtk_^{Ys5?R{xBHD)D;bpsfBG2W9ooI4G-s#z7T$eV_T6pf(Q5 z>Ys5?R{xBH%JF>TpsfBG2W9ooI4G-s#z9&A8}Rq7{uu{l_0KpctAEBpS^YB(%IcqS zP*(qpgR=T}L4PkhZ?htHyQ_~~{gZS=FHy_9l+05(BP{bM&QF2nTjqEE`Hz8zy3-v$ z2oE*m8balZ-1){c?DPxO)cYsBOY7w@zfd!uL>gTZugWi!jCUkI&wM7#k6HU8=`FbX z596Vp`?<{dCy4%Q zi)HHHXZ#%XA5fR5|B!ly`s>uw)MnqOsLj3?sLj4lP@8=pqc+ZUl-lfjj@s-y=LfuB zD9#^v`_B0V@9&TE5Z=CXzQS{^oX_y~o%0>uzV|U7;q7~m+Uz^$Q@nj|Gv4fbiyHPl z`~GaW_sRB+m3sF7xDq{G>7Tg&<&vd!Tz?fjl#bgEz(ZMmf9`*|5qK!tizUo| z1bWOsD-Ji9)=D+D$?vJPa-P8D;3!g@~(=Qa#v%g=cU)39A+m)(&4~(ZX zyXy99)92*;5h2W@-@8})B=1v}hsyoG}c3XSPls_Q%^$yA}LGtx{v& z&h6)>&oB6eT46lq{eqt*%nLfci1C;=OpB-w!7o&U_rtuS^D9M-c}eG2iW=jIv{7SYd&x|kPEi=&Kxmg&h+KS#aI@@Y_SQJY_=P3X)0LUlf&=SMF-k8tUe2)m!+ zeOh{5@C((3_I{!8T+@>s9QS^q@I2F7dN@AvUaj}(NBhv;FVwo~^y~n~y|p-&GYg&{%$Pz#dpapf%60P*t#xs9lz;$T_3i2 z4CSBR=j`semR=wHK;eFOd>HpRmisNePfGq<+Vz4v;`R?f{USe{wQFJzkL6Bl`~^&_ zY5&_DzG(h)o^kDf+(-P}NchzIkWWjW*`s6}^I6GlC3luf?{{DxFL_g0b$a`n<}ZC@ z72&-r2#*gmJeGS>&&%3t?f1Li?YO*1za?_}EqVV=w2x;#f^yrL9{g@{8`Je2CB1+0 zCZsF9o#}Xl>9`l^NRK0($%}Ze_TrLs9uC#&$UoCVTD-aI)jyN8_c{-k;gLk&`f;RN z`WbEtFn8-+(6_>TnB*R_uK#XM{vL79PDq>qrF{%Jx{vqcYD7~ zu*19iWuhI~*Dn+8lHZ?>cFXTiN4w_zGSTk&{pn~Iy{8_`%4z5soz9BMLkYkpvHhC_?5!KVel)3iQQyzl;@jYrW`dUWF6mub}#Jr zMGgDu{e6$;`TJ}q{r+@pPsd@`-F|qy{tlksp@w~Q`{7Zuomgy97xesNxxcOBtqZJg zQa`1iH;hO6$)645e3|F?^E0@o+(@pwm)C8b568t`p3Yo1)GyPg+;cDvsetG5gnni1 zj-z>e+Wr6I1@K718wDN-^()IGNe+hb zNKylb@kn3Fd{1@|9;r$mspHZkJd)fu@JL8cHa{{>$nr?P{L#I6B)R{q!6Qk!_u`Q> z9e6ErH;-anGyKE>M@KC#X+Qk5NBFJxcvBb&mQ2)Z1!b0*{3G zt7y{JPceTLO@5H)WBwwVWdCRu?NT&p>$8~OiY9IS7V}%tq^<9+@b`Xz_Zv|EAT{Q< zqDfmn#{AZ`+n=tizZdqWt3Z1msS53Rq#Cs6k?PQ%M`}QO9%%vE^GHo-&m*C}q%X8^ z-1A7NH(`G{j4Q+ba>gT}yyBwqNGQ+1BcZ$lkFmJ zjK{b;@KDAhp+3b$OM};eCmV zn3qUA4|Rsu<9&;ZnAeD3z_=woTV*`@BguKRGs(G*=5Kc%>2t1iarW$E@?Y2QL$^YC zBzYsVewjvH8+)N3XSwsH5hkz0xGh;O>F?k1xI4-H$-I!<_*m{+Rl8|F_y={|ulyy; zb9(+$k8@q`b!c~! zP{xDumvW!5{dpwVRr3p<=FwkE^XR8JzfEY@U!(iix#yti_dJr7Oa8{rca}$b(A9?> z^&HbGx!{)xo^N;VPgg^G6Ol*q`^!DSde&h4ho~2*AE$0olSlIV%gr;s&G<5Phx$?K z9yQyOe4m=_O@2Vl_Q>xq$M!0}%6PVC`88^`clmW{wugRyIkuO6e>t|Net)?~n7(aZ z&-R%6IYtrN>paFQQN;E`ymAUE=-lzJ>ki@E(T!>F|C=(E~gm|BQf6AgQZ+w@8Yh8N0M<=;F13IO`;FNBk8yR z!|~j$7UZFgQ2zsug!d!xNO*q&kA(Lt@JM+70*{3EGw?`we*=${)BFS;3GaWLxAp2ReRMgU8BCMv1mQh%A+>R+FFo$fD`P`E|L2Y z_h;*DXXY`!-07DI?WwMRJKK}yD{2qTk94w#_`~3kw4Zw#>D-+|LVEV+kUDy!?7FtB zyB`LJ^b@s1;E+0~SHdCbx`8xS?$6f!1BcX6yBRp71#07vP+oyUYBL`5ePMq!%ajShlKuB)HMzX{j13DPlx_h)HMzX{i~>J91{9hQ5W;2VShX0 zkhYn=I)8tQ+Bl?5YU7YLsEtEfr#230joLV*RchmqR;Z0b8c;X*`+aKTkb2OUb4bhk zaY$voE^tT{XwMFUs)Lu%o?vke^g98yzt((NEzM*3sF zKOOQH`~B&V|9JjgS|5{Tluy{7ZWZ_U`_rvazk}zmQM35o zO??kF```2Ake1m$_kNjBzvB73c|Pi2JU>Z|`WgH(q5j5xf4XUmFXsz9e}?)_YS_d5 z_ou^q7|&y!JHCuVvUwb}yFY!|{&b%T^E?{=X*b?KH>c?cToUg8TH2p(%;j^KAEQw@ z&i-t+Tyk>!-CFFrKi&3ENk0Y)rkB`x>F2vn`G&KZ(%<>N+&)RRZko`pX74-U?t8}C zoy+X(mF!Qa>E`@Q_WqjgA^DN?XY-@wfokURh54K>{{r$W`H?8$Wpv)}ZXAE+^*H_< z!`okv0+R7U_WQ$OevKrnk3NL^$objt4~L!ae)^L0v)>;MJKrVglJjNZ1i$9$Gt>X{ zdvQe4KYIE3?t;C}caPTJ|GZ0_tjicb_nga*T6lb&dKC>MFHyP!(#n zQ}!LuctOt}wm+Sel-Plp960ke^d!nZ zEu!2VpZjN$zbr?yBL4iu$hkkUw+rsylK<~>?T3tiq$UIo3hzmlgOZvsjDwOTZYkHx z{W5)9E0pU&I4DVwK6?BR#qN$yXs`?HVi%|XfiUkwgQ(!Cc4 zrRlf^9Mu2q@_U#ZlvoPiZzfNk951+|?)W78t9MVUb{w9zWzN45!YAht=D{%-ClF0? zJ#coQ^*3-(n16~Ujf2AcQ#5%W?mvrphiLMCYS{H?@&RhhPeqf)L1BI>ntYJ)3;ewj zb%Pommvk2MQ_g_`TKvzVU>9Ml}+Kgjb-)adu5voqAjK}}N| z2Q@`)98`hYIH(C~DghTF)`748$4aGoV_P%M{xhxctWY%y#yTwvH>SZ7#c zSY=pYSY|lKu*7hN;WWc3h6RQb496IbGR!f2W%P($lErgbtL)WFsLVf)jqYPmUnD9FN(_4$afSyN{#Y}BDN=alv5NL2Zi#B zBIBS?u2Ezh6v{h_jDx~+h$7>l@O+|(?P0#8-jf1LCvpptf7dWUI z<39yln}$Nf1d)bGGSwe>!MgTng}IH)G$ZM_`tSKy%V{sj)I&hu@(9Pe-7psI}j zx{fQ7#R|1?P-SXcFQ23S2G1{1Z&A-so8OLUYV+GMMQt2Zf!a8z32Iv}AEUPQ@=Sg?{eFv96N8M!ndFln~9(9A-I4G-spJRND@y0<_ zslUMZ3bk=iR{xBHnq&Nzd47qyPd!6z9F)~R4yv!^ad~|l#z9q{M_S#_Ulj)>;~dG)y+0M^#j+ff z0Jt)bwtoIj{2=rH$luJIe*#g`&Pl=U&q4KQCyayYP#Xu;rZx_$Mg4oMCrxVOpcbgj zt~aP*FOtPNwQ*22YP0KAYU7|P)MnSq)MnS`sLigIsLig=P@7$!rZ&4iMQwJyKy7w? zg4*o*7`55;QEId6oPY5Cm^e@2{V{PK!~0|6Jcswk#CZ_!kBRdn-rpYQQM^AU&a-&C z-pBk0?fOoCOxqeS_3U@PZx{!K_^aWdbi9sX#h&}qS$%)x@7xF+6zv7awaHRW>&0Fi zl#Ktf9F*w8DqM6eHmgTnZ7CkNG0`zPz|az@JUS^@`!_`~3!w4Zw#>D--z8ff~i zCl2ago;eH-3iV1jC|x&j&qMxpa!_c$0|&LC^)Kog2Zizq9Mm@Bjf2{v#(bdjOGRxQ z6rOkR$JEyHkGeH&2LeZB98{C>n6GsHoTxFMnHC$=nD2D{oT!b1s!HFLwT%sEvb~pl2$WMxn2mgX(L! z2M%fg?Kvns*YxBHj(ZLY&og~;6~{dXwFd1uC_Lx%>^hEn4hqjZ;eG_kGSVM7DC942 zP{@Dapin-6gF^Ymo`XX9#`Evc`kO4H{Ns7!pzwU+dE=nwwEW_EL&GF)Gg`)b({K5>JBy5pLg}gv^?N>dA)8g z4r5_bRziGIKj24wvIjH_E!oVRA0-@=FPO7bN4x8?apO(_DVP?P4^HEO4B_gKa&1zezZIa z$oF0xl+OF1Iv@FgdI;rp{c=!vFNLqr`M>udy~06>K70-e?L%@7_CM*--qU}m^TU8~ zgXf@fuv6oB5o{hOmPLQ}mn_nb?aM*YE_x2C&HIk>KD4WzgQDH_9Mu2M-n)RubyoM@ z<2Y`V^kT({9eGIb$c~932q*~&!nuueLl_EjQsb%5$(M0l8qw{zJuXk@rGx8-i zaZ=5bcPbHCmP>-F$GDAxPI530!h-4CijmI06*-%q}j z+(*WP#dmS*?pV^Kd4*edC#REl=?Hob)@^*{~i?lMiW0M_>Crh zQ1BZ~{Gi}Bn)pG%Z#40PLOej?2L->;#19I7qvaiWc`6zAbA6)n4s={9T&F1UgPOPc zD)EDwBj3&AXUXmdHACjS?XGF^>$v|ExsNYJxJZ}`%r$c%qeo#oS#19JTnfO69aNe*!-8dQJ?zlcd#<)DLPmwWhkL%N9jO*k2 z3>o8o`7R|Hb^-rBaPmE9og^_Jit@c4#uEPb2-s9>^E& z_n`9jUQX@@g?hD;?O=P|PT5A8pxeJD65pClp~bGltYw*lqJdm$|7ZfvY)cgWZDm^X+DQpC-H-NN3Z05 z@q^l&w~U{xPlxj*>(k*n$@+A-ezHCt?kicJ4)>d^PlxA7)~CbsCF|4Sxs&zjhV6Nh z_31{)-rkIoy*;Xuy}fFXy*(QzdwVxQ_V#d!?Cs?=+1t|@vbVRhWN(k>$ah&fR(8#k zF@To#o$T%XA{pskVZJLzckp=R$8vN#8Tqsv-9|?KEl0PKk*`~R4=Surm$&PBJ-WgV ziuRT8J*W-Rx0WmT_qbd7LBYMv_D#o!J!rWr@e^vc9-K@&o2^$LB)z{3>BD+(eto@{ zbbMHP{|j5}uMSJ1vR`_C?I$<8AN6qJ?n~}RM<%}i`Mf@zj-wJksNcCj`BeO%Y+Qih z_?i1b)zMC`^nYTz&3ZZbK^;eaj83{f9rAbL2Zj8f_(7q3Bz{mRKgsu?P_HL`P$++i z9~8=G@;xY&-^33JW?UVH)P7nT@=0>GC}tF@^P}ymp8~h zUtT5qeEBHZ=gUXPK3_gec0Z^gGW>+%+927#8&V?scS8oq?uS$)`*%YMWdCkRKiU1D z`p76t=Z_y$uiaPtRFBD1U!TtNpZh_1{&PPl&wuU*<@wM3pgjM%AJih#$Niud$nFO< zPj)}3IkNjf&63>@YKH87P}5}hgPJ0{AJhc-SFNs#YvW}1gKCi752{LbKd4diZ}9jL zvim^|lid$$i0pn)gJk!EDv{j}YJlv1P(`x)K^4gE2h~q@Kd3(Pq}^ZIZgVm}D6I$8 z4@%pI_;`=?Bh@bSjR)WlrTwZ?@rRn#^JpU`KRur|g)6@ch59mX^xFM;zHH_XHT!Nm z)pPzXl#X}wd4BHQiG3{X52fu~Gk>VDBdPt-jX90)LUr+dxIa{m?EX+4WcP<^C%ZpX z8`=G#GGzCM;`o&7qQo_hU$gEH#qn*{{h{VCp3S;H6vxNmyHFfIhwnmhd>!g{j=w|w zKEd<3Kh!wc>-PrP>-Q?z>-SNz*Y6`_uiuBsUcZ;fUcV2Jy?!r}y?!r{y?*Z}d;Q)= z_WC_f_WHe-?DcyO8TI>0f2cvzYd-t+k2Ld#g8sSqL)p0f6#St)zmNU*7lS_(>kG!& zCw@>rYxP|Edr(?WrTw6k&!r!fy^jcWRI)xD>d!-$VVt>geLA$OdSAMS#AjN4oA^UP ze=hu?tiO8@_uJYZ3ioqzf2d!w6Q%uYi!$yw7vF_?#e?U-AL=;rmHI-5+X>?EX-*WcP=fA;T_P>7FLLKhzZ2{h=nv?hiFi zeutIUN_T_o{!mr2`$LVA-5+X%?EX;0;N|{MCtaVe$Bs+BjB(D)%%XZ>mD>95vZ&eLCy+r{<;qx2(4m{F+!l9(pU% z&C|>4$CLRnRW|cJ?%{phg!`!M#C^ucik44S^Gh;29J1A#UlPo!=k@w@W{11MifKmu zk(9r4>(dQdeu^6<$gu&)I{V$hA8E+8xBe~@>yeZCBe7lz{z$C1!grZiuLXZ3)_cJp ziS=UeM`FDh)~92=8vK!1?*@M)*2|l;mn-#GjrDf;E)(nZ@LeX>`{BDxQ%nb|9_085 zvil>AlieSwL3V$nD%t&!M#=7vG(vWNq+zoABNfOm;r;iMuO#=8uOjEkXa~f9ip+K* ztjCwL{hO^%r~SNU{zy;0CmH9fo#Ry3r~BE|aV!0i@czvoNzQrh{E;y3t?WVmll6aX zJmKGKNZWyOY5R=S`#HHU9j|7j-q-Pmrcd%+CgjhwKhh!kv^J=Cp#5? zB)vbqpFjQ?_#^3g6MrP!Px^W0G`{a4*-3tS+(-WN>i$T2{_li8lHT`f{z!HoXTcxo zDS6&=>5ruKcU(uhpM8I%4lBQjKTZho`n><1G`O$H*&!0BPujBqzavyn={Ce^T+2?PE$v(e3 zME3dLL9)*em&opqGypzp{z&b1zQiA?104L3a^T>P)CCUyNIl@-kJJke{z!Rn@JH$c z2Y)2wm&(z8Y!CiO$Tx8v&ztxoAw3d*B&1j3kA(D0{E>!n-r$ckLdLjPzH3Bwf21ne z{gE1E_eUBhyFbzd+5M5G$cSS~{F&SzX@+|DN17$OKhhl8{gLL$uq!0~Ot3qMUpDoy zOGvr4@|5@^p}e*BM?$+2pFlekKUuW%oeh7aK52(0b5;yq1pY`lOV^Y8BcWcE?F9|_k_{E={9i9b@G-B03=)K7-vN@Z7p+;2Bh*;ORJnLI%D_M}Ai z_GXam?a>g~+pA%+w`U_{Z|_FQ-X2!T-d;Ay-ky$=y}g|vdwV=Z_V#+3?Ctps+1vYB za-PpSNA~{0JlXpb3*_6l|04NTGV=Aw{gHBZoY$kL;*X>wEVsX``6F3!XU=DTBppYk z{gISU#UIJW1sIM$2Y)1v|02Dr^rLw`&u?BYC;mvtk0LjF$tk&yore^^)BmsfXGZ~ej3^GBLU+q>j^+R<9+kHm3Jqr>jk^JO!Cq=|QHP4nE>sndR-KF_*G61(H6 z_#<8VuGIeM#+-&fQXAig`y*w@?vKRrVb=YT7BF7Sx<3-fm)TD-Rj_>-S!=*Y7=Kuiv}KUccwaUcYycy?$>exAI3Sm|pYQ zCRyToL*}*izBT?@%RxK_{d4h0vhmC*_#=6Kzf{&)j1Qt;5!nnM1lW5269FR%msxsvY-&U3$MlMih2bY}jj&u}}g<8kR?C&6)J zv(WEAesF(A`Tnp`A|rk&s@A zKN8yQ#2*Rme&UaWc0ch)!uwAAkru7qNc@o&$nK9cPlnyH(mh9pU9-|XONQOE(mg|l zT{Q70a(|>L>S0%{bWe~=Rvu;D5i;zui9eD1BUPz)f22|Jf8p^XWcNoJCc8h<5ZV2a z2FZgwzC?C^qyg}0`y;j6afv@t2RQg6;k{P&~ntJy~njv4!<7de`$aCcFdg4{V_vY9`U_4}nA z@_Fg+{^_(o66(i8Z$-L!dU^eLa(^V=$347{n{XeMow(2VSl-_AYW_%OheNhn^GAYN z^}O~+(w^qFls}U4cg`QFVEHL-^h1vILDt#t4*p0*+uqtAiS@`y{gGHN1%D*gTfrZR z^;+;pV!apqkytMVeVO_nP>6`f@X+N)-KhouuWSoCG{z%_S+Y^%cCA> ze>9Joee1u=_TP8m29p}kwNC!rV53Hf>rxiYkD|HE{DSQzi$T2{_li8lHT`f{z!HoXTcxo3VGgh z>5rs2*1zL&_WhCYUAx2|3E#I%zK?|O+$G;f!uL~??<3*+YKcD*zOR;i9|_-AOTLeU z@2e%>N5c2jlJ6to`)bMeks4NhlJ6r`$#+Yt=(v59?DL}|WS>7BCj0#A5V?=X50YO` zE|Goyc7W{jyG63k{}#wTKip6D`QtwDS@TEY_tCrGgK^m|es?hVBW3J*QSe7<0|$Sk zc5v`V>Hr6Sq#QW-BXxm;KhmOcqz2jjk;cjHk2FDc zf21k0`y)-0-5+U&?EXlzWcNp!Bl|jW^JIK?Iy!pL-gESL(WLt~#V63t#82jJ|JMFU zt=EaWLvnoj`$z-Q4o&8)7`zDlkuqq1cMVy(xn1vR?R?1ZX*BopU3Ro*vfdZl>lw;v z$|=eT%5lmDWtDQ2a)ff2a)@$}vP3yRS)?pb_EYvz<|%tAdnmgobCeyF?UZdML;W1(EaeR4H02cK1m!qogR)9FN;yI~OgTh3NLivBpe#}rDEleH>a(}aR;&8rXoj6>lT;8X7U*+=s)Z>23 z<@?BZj&hm)NLf5zvQ8YHJ6R{L&z>h)C$68&_J->dChNo%sb_n|^$e4B;!4!By$kEK zu|3QVQP1`=tkcH!l7q-}620~5mN9_a6&cEdQ zNU8Jdt^58bOY09pf_#>hGCH_b#pNT&b%5UP2 zRORtLUp-3p`RWm}`y&mLeZG2#%=yULAlc`uOJtv~9w7UCb&>4z)djN8SND^BzPgX> z^VNAW=R5s-)L}iL9_oF*x{K`ds5!FFS9g$ozPg?4^VMx+l)dxk`$&t{Z;YQ>FnQ|h z#Le+}+#hL{?EXkIWcNp!Cc8h<6xsceCdlrOG){JZqz2jjk*efhwz@2?jgo(bJVJJV zq+#+0sUISblLyJaN-mMzA8CN>{zygguXFzb+5M6F$-hZ`AKCqp^5hBXd&%yP)I)ZE zq%N}iBjw2MkJLeSf24M@`y;iHC+&J^yUmo=+jXfF<#&-ZGF9a1x9@P1NwWFv# z=&ybNen@u+t9{OYx@)YJtNbQeZ|c1IXxh#t=g~t}`XMdY{l$%?`LUTF(&)SF63_X& zNIK5Z=PA7-v5Teskn(aFwWBRxCvHf(hr%!4GM|%5hS!kCQ*keAXblA5xY4dFn^WUayaky5^k-c8ek=+legY5NsJK5{? zHnP|28M4>ww6lbD;(VPt)a&VTGbb5D;&knJD>q+m=7$9RbMZs6@j8YTtF9C0`F-g9 zF9ts())(Ht8p~TcC;mu3WBED#eWW|2e5SvTqHJAf_Na8De9HQ0 z_MXK4Vsf>1Nz2pIQXk7Htp2_DE$6@wsfv81en>WNAn!weKF^-`A))^htxxcJy6!sAj4iLene#06UC2+411&a5s}>wX`1YQNK<6@Lz*D}7}C3Y zoD6%Y_z{s|FRgS}$*`wZx<|>dw%_H#gC9~4_Itbo+k+ocmvLOrLmtQdC+o!F`I2?w@chX-aY&zJ zowxyzGvpk3mb{HTN5=ef%kLr`U*vwxzl-Gd3afYjS7zBdaqEL!M)e&> zrGNY6yqz!cOTzhINbAIvXItwoaUl6Qq9jdF)8m zD+=FJV!gUNy$>B+dOfdaPv*}wDRwgbT_n=(8*ULR@4LzK=>4ak$I>Hbr<3P`{qut# z0Bd`rs)wb~F}okK^P2zDok*YacbzztOYLvykTmTFrF`z!iR*nvQ%Jt62HEI>9Lqu0 z+3yd2P00C&=GJX1yN# zpc>R`>Cp36$?gX=N>*#J>PN`>7L$PPOyU{}? z%nr49*S5?-bT=|Pr2&@i{~a6TO8T?=l5;Kb%aU7K;g^*i|GMr!S=4`}y^#Mq^4r8; zYsR*3zUb|CN97}UUzKdbwwI6KeO9tnGTwJ3J4!}=sANaT$S;-bFd6x&k{u!=zg4n> zWITT*TOuRBR|xoF5k5x<9$@J{bZDvO16)T@+9A>Afvohvb|)ymrAyW zjPhE^c9Bt@E7=_RdwD+{WYh%fCBFvyC;Ja-Po2~4+p*u|&vAb_$GmR85nMSs zjr;g{>gDkkRDU=1dqy!{*);;$Jq($JUqkx-tKUj}hdy<`hxC5SJipwpl&5D;NV2PZ z5ZN#2SIpnJ{_Qw^zdYBC@;fZYYtrl&sl1W;$xiI2=g~Lietvq~M)_SMa-IBWKelJl zBOXMy%^ViJmJmPB!*U+Y0r68aNGGP_Mr3>O|C+GvPs=|4D9JOfDKmB-m7{Hx?UWsqIm#}|9?D+IJY^qcKV^ZkNI5`Rq8y|g zq8z3ip&X^GQZ^{ZO?F6iqVHLsS$|iJe8i;N)wDfDjg9xa@di_89+vda$)B2URZeb} zf8?j>zD?wH<%03#eiKXbLshP)<^H4hT_Er4CvAtghJ3YAj@O^sAN9UAWUe;$_pay9 z$rh=9SZ-nWO6RvB&9}6JRUU`^JguJ+ecG-zC!Ds2ow#59PiJxd4&+Da?~$2bYtv-r zmSlO)!y;{e%J=M$gXFhg zc%8`2^z-&~*5}R1_EvUD?{`RhV(HcDeO4YneLH69EWEeLlH9!fHe|kFa+1%xJROv^ z>PY7+Z7()nZ--@K)~B1-OM=Kx^OvSq=-*w2_qcC8`*)Y&{q9@8tbcbo-v7P}y?^%$ zmTq3IV%GC9&lg|L{CO$!O?CqLa?d#At_Eax)nu#mU-Dd5p76fBT&49VD^It{dnwmG ziR)%j@04qwAfrAi*Z!W2da7LeI2rXa}w1qh!=~<=WqoQ4f~A{AN)$lDo)%Le7!@nA}1B zBXT?W56NxhKOkqwte>)IpUSn5P>*)2T>E`8+Ou-)_sD4H%JmN$m&bk=^4RY{9{+7f zukXBlWq&BHqP>kSLH>#k)NKD~PaSgC7-aV`ld`_5wVzQp{T=GKpQxMu4(z9FWIs~; zf4Kh%9*^gXx{PVlcoBj`Vq+irc|A#u#H|qXno)76Cb<_W$j`tIF z)BmB4_ZM~3|Dlfe8+D_6#q~U|PydH{ADR9S^?ow_AL<1%{U7Q@@^A2d2FUb(sF%o3 zQ$I*XIT!zJGW{Rw!{p!M{v%}iKh#IbAELfWrvF2|L8kvheVjaL`&U?=wcl>-i^!bR zbB8JAdzALRwEeO6WxFWlr!3XVv&-9~_pm#Cz>9;>s>Cc3ILzeBh_ZzY!NMG+aWQWO9xZh^ukJNLnc)l}e zAAcr&e`nmULAj3WEN^4X_s7`Iyq@jOYuR79mi-mR1^Kumt|A{v_tD<7wnO&5Gw=Ae z<_~54ZOBB%@l(i0@e??o<~QACzx?y8oTRc9+v5-5x;w?LqT4l}>3)@K*)D!S&zfxa zc6sv!x>u_IFM}=3pZnHh`y{%dnab;Jx6C!Nd0yJ|$zKF-+yYrX0x9EjD<|b6INr-i zS=Iv6pV&vJmy;Ny+?9{$C{Oh$m*pcqUPrktAMx=#%60jOrl9VRa$i2e^!9cy*b7R$ zp4$@!$Zl^alHDFrAiKSypX~OGKC;_8@?^gEY%lpz-d_(H1zhYSWOS6oK0Xph>%cJRHlSM8dy zdaV4Y)^d{G90w=%t_jmmj+#1ik-P@0?}osYOB!Y`iMG7PHbgJG8S>_vAn$!OIcZ%$t7|p zd61kV50ST#hsk(PVkalNoq3du_bhgHvfHT}WVd6FlikieK}J5CJZP8AXnoWxe=ZqU zirqu&7q@eLb4cP*QQR|!Zhpr8ijN^*9J+VW*vD~tzJFA^RULM}2#>$SPWBI`haIq) z-t1*{*ae&EKWWFqPS{NU3Dd)F*i8TTriUG|nf~LZhh4Fm{$r+xow1qzqo#-5v6=qw zOblu_EPru#C`;sKi@Uu}%()FM0ylqR5dm=gRQ>JfkssCrwceK=h+Vr`W z`p=lYtEJxTo%NoU`p??&y)E^hGkw0L{`02qYpMT&>HAyizi9eGOZ}HjUu>!Wvgrp} z>dl^8FSXSFiyc4MQvVgx54F_)tLcYZ>c49Gk(TdKO`=e=jZ&XkE=S-f06GLQIGzOeCMCc`B@)Vb)tVHak13Pi;-U#S9P+V>Eo(S z^uOXd+nG-E&m=CE$D{ui*V)c=qJJm-XX?=)NIg$R|4`mHS!=0GCPMQs{o$W|M%nG& zYM*UuAP?wvwX6R1+mrdu$^qo3${w6AKB9Zc@tj|b-^=uTAKq(a&#YayvTFvidm1u3 zWpc8COZeJ z-0k-Iyq|xQ%*UjT*ZBswyQ=ws&yV@Mj;4p^%+2fXwl^|~+sSN1am?%&*6~t0e%Z!14`(fXVcQD@_$8$Y!KkS>{KZ>{eb&w7Z z+y}pQ?H6HO20wp&F8#?ol|8?F*Nw74Sw*_wHd6T!^{J1`d^{%e)b<{I{3Yp59;O_k z9HcB!4p0^;3zYqoeUy31UdkTIF3KEb2W2~D8)b$P^|RQ~Eg$(jm)K{?vy^BjuDTH8 z3>lYl`#8_jpsZ4kQjSm#Qw~uMQkEzOD2tQ@%6`f|$~GMI+ zfqw+o#-Y#t6S+bD6uCr6U6lPM z8Rag@ev8chRQ4G%%3+lKcQVRjl>IiD{kQD1WYkmf*qrfIm!ZM4_Cj*RhRlDne36dB zZ(3h3%g+b|_>+t$0kK)fmejWGkC*MmhknbTE$#;_n$S9xUZ$!S6`av?%IoRX&=BXd1 z{tog8`F8Rs`8INud@H#@zJ)wa-bJ3k`z*ZHxO^Y$r%s-PwMu=l$+NTto?NTS{(keIDBm^`SHl#nx6aRfAiy^-oG=c>8f2XZ%6bv z^WzcO)Q^Yl&0*1NOR^#JGJ78~PJ|qrw|wxxWsh(>`akj50=FNw?OKoMFCIfah>tBo z|7ygQY+i?Pi}t6a8z}pse;Vz;fnE=JeBFl3GvCznMcq?&{^)Vc3q}VpPblkX*!iO@ z<`3n5$sgu@B7a9&%sWclG4+_240gLL<}Jm)mHKHOKSaj7r}(#$F)u3pW-{hYf5ZT{Vk&<+zsP z@tAjxYaL|FOUwEyWXxN~wKnoBub&}f-aFWZvzQkTcH=DO&EuN4PncJiI5?{>qAcd! zW!{R6d3pE8iL#itcfVG*PwZQ#xm?PE&8}#^WIg>O({`REuIIyOa4?ca~q6 z*LfMZL%L%f{}q4hE}QAMyI+chen(_-fcwdLwS4GL_q(nO_5m#)TCTPH=(tJ8oqzh{ z$vE7`DS8djEsul#WGUHi`Eyks)hlJfd{g`+)Au24cYi=1Z~1s!pWE-_lH?f56AjV-3qsoAu+7^7DGg$ItHPABA!B+pJ!Sk0HM-?=MyEm6ssDofmU{P+p(r zjLI*ff3AK{$~sT1Kfm5)&I9`W>ie{DsQ9VrZ}J8cnF{mMHIf-@{M?7_8<~F&4bskk z1lxVyz{jCBZzT5+{0`l2!}>JD_0*@3&STS%$7Udp&zh{9%#X5`T;IkwW$@$&AeYa} zAN(om4?(W<1N(JTr0q6SVuz7%U9RaQ_dJ+sVI2ZX^Fbd7S(aa)XTfmv~b0 zA5cF^{zLKz`H#rM~{eD>1Zzu1M%^8Y`+BKrikCmkE?Ci{s`O8@{N{X#D5XjVVr8^=sfrd7;+PPc#rL$ z*uy!G8|>kn#|`#y&f~hDQ77kdgFXD^JRjae)X90=U=P2Rdc4P|vx|)P9CcnpF4=QM zov6?fd-zW3hp0!xE8mGE@1TB!yq!Es?j%>qIdX%%jXX})(kSKe1jkhX*TY(WZ^*pC>eF<+uI)u!o3ZrQ zeumC(Pu`2`YQN_ySzl^-x_EkPJ0O?N9O}gWo^I~9d^+)}mM(6OWBK&+>Gdpqb}zk- zZntzoF_du*(n*_pOaC19_j0`<1N+1W4`REwV-L%Dv_10g^DOrd-n*XySDPk*_1 zrte>SPQL#Mc^K^%dAT_(H>=OLU!;A%t`lc+y>7R0v+ShLwO^!-o7tc9xRt}QU7y4I zyL#N|#J^~M*P3EmC$7J9-CpDP7|L%bx2Vp79XLLYeD33QpD&4bvs~Yqw-d&9v0UGc za(yzteb0AZK0UvM`i=8L(G7Cr@{43n&*TRr!^kgsR8vFbedrfQ7krm-72*F*gk0sw2AGM&);uiJ62V$A>K$q~;J8knf1N!0Da4`L_-?YOsfMw5M}DKmq1yH)aj3RE6^Ba3 z`;&P-GTyJu_mT1bWuBFswd;vpmyG-)aj0bEFR=@gk^dwPm5lr;aj0bEUx`B{BY#UA zDjE4-?ABzI53y^LQGO&2m5lNwaj0aJKk>69!!JVoEXnYTknio1;TIu(mSoK1ik~GJ zei1TG{WndBR2(WN&ALkWv3h|AmZ# zB>fk%U0$xAvHMN;W9HOP;cd_dI}=W4^VU;xD($y){nur2sFGis#-Zx=?Kq#$v#Z@; zUbmzBpOH9J+{e#jKea-S<(*J{jCy*isxkg z|F9gBlm8D>>U@m;)W5|fvcI(p#$xZ#pTwcsc_a>%a)EM@65rXAI8?iz%29lmuX415 zjPLkWj^g`%zV1NfXfO5n{#)f}AGx2hKv|?5pe#`iQVvlLQ;txMQdTJ&l;b8f4prYX zo>Ka1P2x~dW1&Ck{wS-(p=u3yDsiYk{e~rRsFsfDI8?o_=OYgFEpJr2H|+hDGmh7o zu=Lgbh33;Uh(krbI*W0rdLPTj(-Mbj*U@@(QR+#4_RHo6B>7)Zaj4tQ!h3s8aj3c; z5XX~iaj1#i_zP0bQ*o$PE>dx*}e4F$W$srDv%<`K>{g{eFr9Q-= zl0zISImDroF`p>?L~@8jC5JdvGUh9#pGd}hrt}lZAr6%s;!w#U4wW3@P{|<oY@sMLozRC2@G zu(+PF=TF69aG`u@(i zUqgSnGmk^H@)}o}ZzL~BR!Qc2TgRc|xbrCvRc?HhI8-YasW?=!WPJIF-!mBl4)K2` z`*?hm?BjKm+f*DX^*-K5xlhHRQjY|_nImz+Tys+~6#hf40T z6UQ|?cPb9m(jgUxO6L4!4e6SSL#3Ycmo>bXR2(Yx*YbLJucaU?5`6AlF`O6ye zO|)ev^#$&KHMvOMK^`EZp%8yEawqkJl2AYVuvs_~LIRJB{xVfSkmXZa7N zpFqAs@+^s`oHIS_g3XTqr0HQNY^MK&>0vi)rvH1>!;aWY|8dj9uGmcfG1J4&*i8RX z)5GrAO#gSLhaIw+e%AD`O9uUJdyN)1tO?#U4%LopLpf`buAeeJ?6u*%PbBC4XVZ7I zJpR+B&$ZNl#`Ik+^=9v^!`|HN`k%Gqds`m=In(D`>OXJ#zLxqgn7+TI{)?tBwA6pe z^u?C?FPna#rQYnh^-@dyzu57EE%je9{ZLE&znXryrT(j?A8D!on(0Sd>c4LK>Jq)h zq3ZTp1KUyE2#*`fJSq3jSw@pMR5I(m`V5)%UVWC#dapi5X1!ORC$rwGFOai5|00?7 zo{y`NI8@YwNgOJf^MUmaGUp5HIWp%H>s@5D{}P8v=6s}oUpR?Fr5^o@xZX$Re5bF^ z+KK*2TrW_M{)@yPlF`4BI8-wFKXIMyOcIAmJ^D`)hf2nLi}>A;(f^V-R5Is->uhH_ z(SMUTRO->clQ>i|`hQZ-lhHqv_f6JXO6DzTS4zd9nqKEEm&c*L??;n)ONm3Z_b73w zw*M)_q1t{DhYHy}4Vj%Xxg-u%>|O5nx+D%&Zdu#AKN?&ThsyITP|j1%;k-3_OskiR zGA>N}z1Td`d!bi5y}n_$+v|0XzHV6@s$%l~cZufr?#i62H(0<|LF&~G?{ItC{ znU|(Sd6#);@*ri2a)7c(S)lBv?4!(6_EPpxc2VXiJ1E;J+bA=XsGntCmd}CuT;_4f zsQ+bN*fHW&{i*CTWcIhR|4v4ElsHr}%4L*&mQ1_a*qreh#i43_{Z`i3H$h4qs%+JGq20D2 z6^Cm1DHVrG-e>!HJ(7w;rT%{E@%*VcROlJo47yTPbvqd zyZwGG4%L#^(nFHQ{A8D`2aWFi^BISV_q#Fj`l4%O1v*AJBVL2!27q~sTr+xndGDsiaT ze`Ophw=dXv9@x}s{EY3XI8=MyCUK~?eU&&=yWaB}hbrkmiS9=x6^ANYllP?a=Dqr! zeI8x%i1yf0ai~Z)_V-h9sMtO>4S8$^^7yRD(~3jY@l9FpO780ekjwqV&L|F5>@c2> zH2>%1)DpLe`|C!&l76P~YW0QMe>6X9(a>`Bkl1^g#G&H(lQ>lJyyZ9XhbD(ORO3_} zs7ohf2n{K;lrz>=)O6mz?4LA11exe~;Wo{(Un0b@h*s z8`R_eC61E(2h@*}|ByUF{v+}*`H#s%=TgnPnwkUL%os2 zp@Ne*RP1*E{pnO3Dz;z3aa$6HitUeZe3!(b;=D;5DmaNlwd11B9?5O$CxhpVI$uRb zIz*kXBqN=oPR`@jk&aOkhsyJD9yi#-LmVpgoW~9J@GhPo?>QBR%KbTyTOTCv;ITMS7lo9I73s^{)9NU22y@ z9O@m??w@`fs-4frPj0tAqc~KV|7jYBs@r$tKK(j+|2n_BBo0+Mhy5hZ4e4~e-DD~b z)mZJ;x~upH8cV!~$#gwDCG~F8I8J>5K=bQVYF6+`+}+w6R+#i81`nRdaoI8>zb z2}xh+-k+CosAm7|#C>WUs z`Mn_5L#PBjkoZ~x1(I8@26P2*5?JG!-*C2^>_ z{YI3}rg5mM$87X)AdlLKf4x(iuP|U4pr>VQeL!O z?Y;Z_j6>aEc5m4G|3k&0N!(D& z#BWeIZ8!d(@?O^BP}ky6wTBk1Tn`oFwzW7^D__B1y8A^KhpO!h`|lTtJyNQP7gZeU zx9>`|Kj&c_>gUq;_hO1el{w0$>!Hea&1W)1J2&g0%8A$FP}ky6wOx~ShG72~Rg!$C z{sdaz4H>S*p{~WDW(x96OYIlyPu4@#YH9U2RJB{J7Kdv3RpL-hze*gc=~szEHT^1a zsHR^f4%PIl#G#sgl{i$>uM&r9`c>jkO%Ji^aB!!7k+HT_6S{nt!C+EV{@ z(^r@1Ee=(;uf?HSfs5DTP%&THY0boG#i8E#L&?15^BITwNclSxhx+>b>T#$)x?9I( zbC#ZKaj2`Thbn!OCF`L|)?151g zsxWWVLlbvEKqe_GblS&KuJ`dsqOlJ!u9 zJ)ZHLtcNOX#abNdf|c8|8HakQ*n9lFrPf2W>!j90C9lPyYI{?zuf?HiI;_Q^uEn8h zKCrk*nQu9GKEE`KVaj5C^TZ==rjD-GZvQAaA^;0zh>V>c# z>RKGCjytQ?FN)UUP%VGQHOwDG=W!frTujD?FXZ)53$ixk!E4Yy?UV-W*=N^@9Z3w4 z^0Rh9#$zX64;B7ElSMl$qxE)&d^@LdNxRMWtXvNj{zb`psPIQBA3+>(vL5G^cEV)6 z&XnSj5utW zcO)ZDTjn3h=(xx{B-!IoOJw)U93Uf3T-IYHYi+20iv_Z;KhjV3^-223zJAHVq8^v5 zhq_2coV%c#-shzk1vfw?Unr6EDklV+qdI-={VFr-5%ml+blm$$~OJ! z_ptg^e+F@=dHqfs9^d>2{eDY&zh$0Zl0*IJUwCn-D7T)D{=HxM9-6(!r{(d!EYBt1 zud?)fjOkG6&KRH0dZ?NY&P5!mmPD~b*!{F#548*V0om5(U2<~VVfkOBe^>qF>!Eho zc`8S9ls%NalzGZN%6`fMWs!1#vP3yZIYc>3IYK!~S*2`Hj#ExhPEk%%&QQ)$&QZ=& zE|}EyQ1v}aQrNHAdZ?)3Fc0J3MPF?_RIM>jWj)l-+?tL<&Di~<*F)9&dOp@e{q@__ z?)_ZjP#5iawEob1div|3q8wJv;(DlhAM$Ap%lC&Vfu z*I9UP&m|63+l#gJP{lqX87Ccwx<}qi5{HU!G5aD%bGcR_P~N{w&vg zJyg_d<(jXDiu$fx^Yu_s50<_BGCm|(4|Sa9^Yu_0WXuQ3dI)4+4|SC6>!FU2eLd7+ zvag3aM8rJqRlIMfo^*Fzm3`+BHFvag3)Ap3f#{bXMcwU6xUq2|f>Zm{&z$oQ^s z_+CoQ*F()w@9Uv-M$`byPZE-54FcQ>h|?e z@qAHtgK?aA{$xE=q)*iC>!Bk3qHbRgwZQZFdZ~W|Kvag3aPWJUsC&&}L{uJ5QL!Bo3dZ;sGUk`Pb{2?Ac zNA~ql=gGbv>H^u9O|z~ex#5f&MG^f#I)xms|7azV+BXd9|rC6)d-qxkfh2GE1w(p)T5UChMW%dCN!S zAoDV~FhbkU_H63i`YyvfEPz$Zl^bk}v1}1+v>~`pIt3=_9+n zCr@^JP%n8a&({NfEDL_53;cfCn-1i_VLj9ia99tu9URs}&49ytsOYb!*F&}XZpbbt zcCvZ1*PQ-(sJQQBJybkbw57*REZ^m~`$*P9MY<&Gp(5R)E!S~>q-(MsYLUnDJGwQz zmt;NE67`(FtPPU8c)lSr42-fKDVg8Vt&Na(a{o~>3Y6Hz$vdcTkhhb^$(`g0a*jMj z-bS7#^ELyvkk2L$+HN*4*eidg zzsI6>53Nt!Zgi2XQ|I-|p_~7+RRr-dt2*p{A&&Bi^c`j|YNo%{^sp;7)8Arx*cqGYcbOh`$7cH1 zn!dN?_05i0hg~upzdK1ksluDaq26WZ?Q417yG`HUQh$%>3oZ5cn!eal|2oqTwA7ou zvtDYcf4v<)*iyg8^g}K6Z!rCEOZ^*7KhjeF{iYvnsehB{t1b0!HhrU|-t4)n#Aold z<0o1kf1l~6TI%mN{d7zH514+YrGB63XItvuV*0rydiAT?uiI<$*uE9{RQ#%pWxYl2 zpEE^V&!ArFWW85!C$rwGcaT}{)pKOld-X0d>%FkPZkFfor5-mD*Yjl5d$JxW8SQUe z?(QeB7Kim{ z(Z7qsdbH^ONj=Z=p?@gvo2<1|v-MD+Z?+!lKT6Z$-_NZaKz^$1!Tu*-50&w6yBPo0 zy)^zUy&kICyL|nX^m?e?-d+16={VHhZ|QTiin~kC8x^JBy}TWre6JoY{c}k^%@J<5 z*XLa9T^fgK?XD!F?x*_fE*+P_@B8F&sE7w#xgKhd-M{41XZ1c-uIGa1i&w0NigaJO z9xBT9`LrIYj+fGLs5ZWNNS`*7al8MEXFXKZrzel&oUw8!>#0yqQBF{z-jMZF$*5;! zewjQ%IZTOq%Wh>G%6`f|$~wg|{7Ui&`Bmg$GV9se z5czuQ2gx^(OXM5L1LRkei{zWg1@g`0e)4O`ePq_-KCaHbmik`mcaeL@w~)KYw~}+@ z+sGZ{+sPU79b{h*74Q92)ppz+3}Su?mt-% z70*}Rdq4Gf{$xE=q)&P8Uh4Dqe93yKNZ({VRHT1-@0+-Pf%|_yxk!E^d4T)|a*4c$ zJV=ItPW*Mq9)~(iejWE8A>T_LCEr7?lJ6!r$aj&)$#;?`$QWSyI@HN}sMFNzTho5f z4Ec8QEcrI_9QjuAJoy�(lo1^~1{bP#0~#)z(AR9<=-KYWdZ?DX=ka=| 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

E`%epBjsj)!V~ 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

iJETt<*3(1!rC~iiq;FbuogLCY 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 QN-_@5S&pK6mRkxxXRhDA|d> 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%0AifUtiLcv3##f;SzKRK7g@Ugl!PmBN@$;*T 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%0DRO3mr>z{L%4NSq})y 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 literal 0 HcmV?d00001 diff --git a/compression/cnft-vault/anchor-v1/tests/fixtures/spl_noop.so b/compression/cnft-vault/anchor-v1/tests/fixtures/spl_noop.so new file mode 100644 index 0000000000000000000000000000000000000000..e250fa09254f69ad2e39a74a000e01ca5e3825b4 GIT binary patch literal 41056 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 literal 0 HcmV?d00001 diff --git a/compression/cnft-vault/anchor/README.md b/compression/cnft-vault/anchor/README.md index 26096f2d4..ea7ac9c0e 100644 --- a/compression/cnft-vault/anchor/README.md +++ b/compression/cnft-vault/anchor/README.md @@ -1,5 +1,11 @@ # cNFT Vault +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Example code for working with Metaplex compressed NFTs (cNFTs) inside Solana [Anchor](https://solana.com/docs/terminology#anchor) [programs](https://solana.com/docs/terminology#program). The program keeps a PDA-owned vault. You send cNFTs to the vault, then the vault authority withdraws them via the program's [instruction handlers](https://solana.com/docs/terminology#instruction-handler). diff --git a/compression/cutils/anchor-v1/.gitignore b/compression/cutils/anchor-v1/.gitignore new file mode 100644 index 000000000..a6b0d8826 --- /dev/null +++ b/compression/cutils/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.local_keys \ No newline at end of file diff --git a/compression/cutils/anchor-v1/Anchor.toml b/compression/cutils/anchor-v1/Anchor.toml new file mode 100644 index 000000000..91ff8523f --- /dev/null +++ b/compression/cutils/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +cutils = "BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/compression/cutils/anchor-v1/CHANGELOG.md b/compression/cutils/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/compression/cutils/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/compression/cutils/anchor-v1/Cargo.toml b/compression/cutils/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/compression/cutils/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/compression/cutils/anchor-v1/README.md b/compression/cutils/anchor-v1/README.md new file mode 100644 index 000000000..803e40e78 --- /dev/null +++ b/compression/cutils/anchor-v1/README.md @@ -0,0 +1,44 @@ +# cNFT Utils + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Example code for working with Metaplex compressed NFTs (cNFTs) inside Solana [Anchor](https://solana.com/docs/terminology#anchor) [programs](https://solana.com/docs/terminology#program). + +This program shows how to add custom logic around the Bubblegum [mint](https://solana.com/docs/terminology#token-mint) via [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). Two handlers: + +1. `mint` - mints a cNFT to your collection by CPI'ing Bubblegum. You can also initialize your own program-specific [PDA](https://solana.com/docs/terminology#program-derived-address-pda) in this handler. +2. `verify` - verifies that the owner of a given cNFT actually invoked the [instruction](https://solana.com/docs/terminology#instruction). Useful as a building block for permissioned cNFT-gated logic. + +Use this as a reference for working with cNFTs in your own programs. + +## Components + +- `programs/cutils/` - the Anchor program. Instruction handlers live in `src/instructions/` (`handle_mint`, `handle_verify`). + +## Testing + +A Rust [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) integration suite lives in `programs/cutils/tests/`. It loads mainnet-dumped fixture binaries for Bubblegum, SPL Account Compression, and SPL Noop from `tests/fixtures/` (see the README there), so the CPIs run against the real programs in-process. + +```bash +cargo build-sbf +cargo test +``` + +## Deployment + +The program ID declared in [`programs/cutils/src/lib.rs`](programs/cutils/src/lib.rs) is `BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ`. Whether this address is currently deployed on any cluster is not tracked in this repo - verify with `solana program show ` against the cluster you care about. + +To deploy your own copy, change the program ID in `lib.rs` and `Anchor.toml`, then run `anchor build && anchor deploy`. + +## Limitations + +Reference implementation only. + +## Acknowledgements + +- [@nickfrosty](https://twitter.com/nickfrosty) for the sample code and [live demo](https://youtu.be/LxhTxS9DexU). +- [@HeyAndyS](https://twitter.com/HeyAndyS) for the groundwork in `cnft-vault`. diff --git a/compression/cutils/anchor-v1/programs/cutils/Cargo.toml b/compression/cutils/anchor-v1/programs/cutils/Cargo.toml new file mode 100644 index 000000000..2b24395ee --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "cutils" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "cutils" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +# mpl-bubblegum and spl-account-compression removed: they depend on solana-program 2.x +# which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually +# using raw invoke() with hardcoded program IDs and discriminators. Bubblegum types +# (MetadataArgs, LeafSchema, etc.) are re-implemented in bubblegum_types.rs. +borsh = "1" +sha3 = "0.10" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-instruction = "3.0.0" +solana-keypair = "3.0.1" +solana-pubkey = "3.0.0" +solana-transaction = "3.0.0" +solana-account = "3.0.0" +solana-native-token = "3.0.0" +solana-signer = "3.0.0" +solana-message = "3.0.0" +solana-keccak-hasher = "3.0.0" diff --git a/compression/cutils/anchor-v1/programs/cutils/Xargo.toml b/compression/cutils/anchor-v1/programs/cutils/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/compression/cutils/anchor-v1/programs/cutils/src/bubblegum_types.rs b/compression/cutils/anchor-v1/programs/cutils/src/bubblegum_types.rs new file mode 100644 index 000000000..3f91dcef7 --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/src/bubblegum_types.rs @@ -0,0 +1,117 @@ +/// Re-implementation of mpl-bubblegum types using borsh 1.x and Anchor 1.0's Pubkey. +/// +/// mpl-bubblegum 2.1.1 depends on solana-program 2.x which is incompatible with +/// Anchor 1.0's solana 3.x types. These types are borsh-compatible reproductions +/// that produce identical binary serialization. +use anchor_lang::prelude::*; +use borsh::BorshSerialize; + +/// Mirrors mpl_bubblegum::types::Creator +#[derive(BorshSerialize, Clone, Debug)] +pub struct Creator { + pub address: Pubkey, + pub verified: bool, + pub share: u8, +} + +/// Mirrors mpl_bubblegum::types::Collection +#[derive(BorshSerialize, Clone, Debug)] +pub struct Collection { + pub verified: bool, + pub key: Pubkey, +} + +/// Mirrors mpl_bubblegum::types::TokenProgramVersion +#[derive(BorshSerialize, Clone, Debug)] +pub enum TokenProgramVersion { + Original, + Token2022, +} + +/// Mirrors mpl_bubblegum::types::TokenStandard +#[derive(BorshSerialize, Clone, Debug)] +pub enum TokenStandard { + NonFungible, + FungibleAsset, + Fungible, + NonFungibleEdition, +} + +/// Mirrors mpl_bubblegum::types::UseMethod +#[derive(BorshSerialize, Clone, Debug)] +pub enum UseMethod { + Burn, + Multiple, + Single, +} + +/// Mirrors mpl_bubblegum::types::Uses +#[derive(BorshSerialize, Clone, Debug)] +pub struct Uses { + pub use_method: UseMethod, + pub remaining: u64, + pub total: u64, +} + +/// Mirrors mpl_bubblegum::types::MetadataArgs +#[derive(BorshSerialize, Clone, Debug)] +pub struct MetadataArgs { + pub name: String, + pub symbol: String, + pub uri: String, + pub seller_fee_basis_points: u16, + pub primary_sale_happened: bool, + pub is_mutable: bool, + pub edition_nonce: Option, + pub token_standard: Option, + pub collection: Option, + pub uses: Option, + pub token_program_version: TokenProgramVersion, + pub creators: Vec, +} + +/// MintToCollectionV1 instruction discriminator from mpl-bubblegum +pub const MINT_TO_COLLECTION_V1_DISCRIMINATOR: [u8; 8] = [153, 18, 178, 47, 197, 158, 86, 15]; + +/// MintToCollectionV1 instruction args (wraps MetadataArgs) +#[derive(BorshSerialize)] +pub struct MintToCollectionV1InstructionArgs { + pub metadata: MetadataArgs, +} + +/// Compute the leaf hash for a V1 LeafSchema, matching mpl_bubblegum::types::LeafSchema::hash(). +/// Uses keccak256 over the version byte and all fields. +pub fn leaf_schema_v1_hash( + id: &Pubkey, + owner: &Pubkey, + delegate: &Pubkey, + nonce: u64, + data_hash: &[u8; 32], + creator_hash: &[u8; 32], +) -> [u8; 32] { + use sha3::{Digest, Keccak256}; + let mut hasher = Keccak256::new(); + hasher.update([1u8]); // Version::V1 = 1 + hasher.update(id.as_ref()); + hasher.update(owner.as_ref()); + hasher.update(delegate.as_ref()); + hasher.update(nonce.to_le_bytes()); + hasher.update(data_hash); + hasher.update(creator_hash); + hasher.finalize().into() +} + +/// Compute the asset id from tree and nonce, matching mpl_bubblegum::utils::get_asset_id(). +pub fn get_asset_id(tree: &Pubkey, nonce: u64) -> Pubkey { + // mpl-bubblegum program ID + let bubblegum_id = Pubkey::new_from_array([ + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, + 0x8a, 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, + 0xa5, 0xa5, + ]); + Pubkey::find_program_address( + &[b"asset", tree.as_ref(), &nonce.to_le_bytes()], + &bubblegum_id, + ) + .0 +} diff --git a/compression/cutils/anchor-v1/programs/cutils/src/instructions/mint.rs b/compression/cutils/anchor-v1/programs/cutils/src/instructions/mint.rs new file mode 100644 index 000000000..795bb9caa --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/src/instructions/mint.rs @@ -0,0 +1,207 @@ +use crate::bubblegum_types::{ + Collection, Creator, MetadataArgs, MintToCollectionV1InstructionArgs, TokenProgramVersion, + TokenStandard, MINT_TO_COLLECTION_V1_DISCRIMINATOR, +}; +use crate::*; +use anchor_lang::solana_program::{ + instruction::{AccountMeta, Instruction}, + program::invoke, +}; +use borsh::BorshSerialize; + +#[derive(Accounts)] +#[instruction(params: MintParams)] +pub struct MintAccountConstraints<'info> { + pub payer: Signer<'info>, + + #[account( + mut, + seeds = [merkle_tree.key().as_ref()], + seeds::program = bubblegum_program.key(), + bump, + )] + /// CHECK: This account is modified in the downstream program + pub tree_authority: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub leaf_owner: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub leaf_delegate: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: Written by the Bubblegum/Account Compression CPI (the mint + /// appends a leaf and updates the tree root); validated downstream. + pub merkle_tree: UncheckedAccount<'info>, + + pub tree_delegate: Signer<'info>, + + pub collection_authority: Signer<'info>, + + /// CHECK: Optional collection authority record PDA. + /// If there is no collection authority record PDA then + /// this must be the Bubblegum program address. + pub collection_authority_record_pda: UncheckedAccount<'info>, + + /// CHECK: This account is checked in the instruction + pub collection_mint: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account is checked in the instruction + pub collection_metadata: UncheckedAccount<'info>, + + /// CHECK: This account is checked in the instruction + pub edition_account: UncheckedAccount<'info>, + + /// CHECK: This is just used as a signing PDA. + pub bubblegum_signer: UncheckedAccount<'info>, + + /// CHECK: This account is neither written to nor read from. + pub log_wrapper: UncheckedAccount<'info>, + pub compression_program: Program<'info, SPLCompression>, + /// CHECK: This account is neither written to nor read from. + pub token_metadata_program: UncheckedAccount<'info>, + /// CHECK: This account is neither written to nor read from. + pub bubblegum_program: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, +} + +#[derive(Clone, AnchorSerialize, AnchorDeserialize)] +pub struct MintParams { + uri: String, +} + +// `with_capacity` + push is intentional here: it documents the exact 16-account +// MintToCollectionV1 layout in CPI order, so allow clippy's vec_init_then_push. +#[allow(clippy::vec_init_then_push)] +pub fn handle_mint<'info>( + context: Context<'info, MintAccountConstraints<'info>>, + params: MintParams, +) -> Result<()> { + // Build MintToCollectionV1 instruction data + let args = MintToCollectionV1InstructionArgs { + metadata: MetadataArgs { + name: "BURGER".to_string(), + symbol: "BURG".to_string(), + uri: params.uri, + creators: vec![Creator { + address: context.accounts.collection_authority.key(), + verified: false, + share: 100, + }], + seller_fee_basis_points: 0, + primary_sale_happened: false, + is_mutable: false, + edition_nonce: Some(0), + uses: None, + collection: Some(Collection { + verified: false, + key: context.accounts.collection_mint.key(), + }), + token_program_version: TokenProgramVersion::Original, + token_standard: Some(TokenStandard::NonFungible), + }, + }; + + let mut data = MINT_TO_COLLECTION_V1_DISCRIMINATOR.to_vec(); + args.serialize(&mut data)?; + + // Build account metas matching MintToCollectionV1 instruction layout + let mut accounts = Vec::with_capacity(16); + accounts.push(AccountMeta::new( + context.accounts.tree_authority.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_owner.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.leaf_delegate.key(), + false, + )); + accounts.push(AccountMeta::new(context.accounts.merkle_tree.key(), false)); + accounts.push(AccountMeta::new_readonly( + context.accounts.payer.key(), + true, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.tree_delegate.key(), + true, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.collection_authority.key(), + true, + )); + // collection_authority_record_pda - pass as-is + accounts.push(AccountMeta::new_readonly( + context.accounts.collection_authority_record_pda.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.collection_mint.key(), + false, + )); + accounts.push(AccountMeta::new( + context.accounts.collection_metadata.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.edition_account.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.bubblegum_signer.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.log_wrapper.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.compression_program.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.token_metadata_program.key(), + false, + )); + accounts.push(AccountMeta::new_readonly( + context.accounts.system_program.key(), + false, + )); + + let instruction = Instruction { + program_id: MPL_BUBBLEGUM_ID, + accounts, + data, + }; + + // Gather all account infos for the CPI + let account_infos = vec![ + context.accounts.bubblegum_program.to_account_info(), + context.accounts.tree_authority.to_account_info(), + context.accounts.leaf_owner.to_account_info(), + context.accounts.leaf_delegate.to_account_info(), + context.accounts.merkle_tree.to_account_info(), + context.accounts.payer.to_account_info(), + context.accounts.tree_delegate.to_account_info(), + context.accounts.collection_authority.to_account_info(), + context + .accounts + .collection_authority_record_pda + .to_account_info(), + context.accounts.collection_mint.to_account_info(), + context.accounts.collection_metadata.to_account_info(), + context.accounts.edition_account.to_account_info(), + context.accounts.bubblegum_signer.to_account_info(), + context.accounts.log_wrapper.to_account_info(), + context.accounts.compression_program.to_account_info(), + context.accounts.token_metadata_program.to_account_info(), + context.accounts.system_program.to_account_info(), + ]; + + invoke(&instruction, &account_infos)?; + + Ok(()) +} diff --git a/compression/cutils/anchor-v1/programs/cutils/src/instructions/mod.rs b/compression/cutils/anchor-v1/programs/cutils/src/instructions/mod.rs new file mode 100644 index 000000000..f2a2113e1 --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod mint; +pub use mint::*; + +pub mod verify; +pub use verify::*; diff --git a/compression/cutils/anchor-v1/programs/cutils/src/instructions/verify.rs b/compression/cutils/anchor-v1/programs/cutils/src/instructions/verify.rs new file mode 100644 index 000000000..60d72b51a --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/src/instructions/verify.rs @@ -0,0 +1,79 @@ +use crate::bubblegum_types::{get_asset_id, leaf_schema_v1_hash}; +use crate::*; +use anchor_lang::solana_program::instruction::{AccountMeta, Instruction}; + +#[derive(Accounts)] +#[instruction(params: VerifyParams)] +pub struct VerifyAccountConstraints<'info> { + pub leaf_owner: Signer<'info>, + + /// CHECK: This account is neither written to nor read from. + pub leaf_delegate: UncheckedAccount<'info>, + + /// CHECK: Read by the SPL Account Compression verify_leaf CPI, which + /// validates the proof against this tree's stored root. + pub merkle_tree: UncheckedAccount<'info>, + + pub compression_program: Program<'info, SPLCompression>, +} + +#[derive(Clone, AnchorSerialize, AnchorDeserialize)] +pub struct VerifyParams { + root: [u8; 32], + data_hash: [u8; 32], + creator_hash: [u8; 32], + nonce: u64, + index: u32, +} + +/// spl-account-compression `verify_leaf` instruction discriminator: +/// sha256("global:verify_leaf")[..8]. Precomputed because hashing a constant +/// at runtime burns compute for no benefit. +const VERIFY_LEAF_DISCRIMINATOR: [u8; 8] = [124, 220, 22, 223, 104, 10, 250, 224]; + +pub fn handle_verify<'info>( + context: Context<'info, VerifyAccountConstraints<'info>>, + params: &VerifyParams, +) -> Result<()> { + let asset_id = get_asset_id(&context.accounts.merkle_tree.key(), params.nonce); + let leaf_hash = leaf_schema_v1_hash( + &asset_id, + &context.accounts.leaf_owner.key(), + &context.accounts.leaf_delegate.key(), + params.nonce, + ¶ms.data_hash, + ¶ms.creator_hash, + ); + + // Build verify_leaf instruction manually because spl-account-compression 1.0.0 + // depends on solana-program 2.x which is incompatible with Anchor 1.0's solana 3.x + // types. Once a compatible version is available, replace this with the CPI wrapper. + let mut accounts = vec![AccountMeta::new_readonly( + context.accounts.merkle_tree.key(), + false, + )]; + for acc in context.remaining_accounts.iter() { + accounts.push(AccountMeta::new_readonly(acc.key(), false)); + } + + let mut data = VERIFY_LEAF_DISCRIMINATOR.to_vec(); + data.extend_from_slice(¶ms.root); + data.extend_from_slice(&leaf_hash); + data.extend_from_slice(¶ms.index.to_le_bytes()); + + let mut account_infos = vec![context.accounts.merkle_tree.to_account_info()]; + for acc in context.remaining_accounts.iter() { + account_infos.push(acc.to_account_info()); + } + + anchor_lang::solana_program::program::invoke( + &Instruction { + program_id: context.accounts.compression_program.key(), + accounts, + data, + }, + &account_infos, + )?; + + Ok(()) +} diff --git a/compression/cutils/anchor-v1/programs/cutils/src/lib.rs b/compression/cutils/anchor-v1/programs/cutils/src/lib.rs new file mode 100644 index 000000000..dde598ed5 --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/src/lib.rs @@ -0,0 +1,52 @@ +// False positive emitted by Anchor's `#[program]` macro expansion; accepted in +// this repo (the sibling cnft-burn example does the same). +#![allow(clippy::diverging_sub_expression)] + +pub mod instructions; +pub use instructions::*; + +pub mod bubblegum_types; + +use anchor_lang::prelude::*; + +/// SPL Account Compression program ID (cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK) +const SPL_ACCOUNT_COMPRESSION_ID: Pubkey = Pubkey::new_from_array([ + 0x09, 0x2a, 0x13, 0xee, 0x95, 0xc4, 0x1c, 0xba, 0x08, 0xa6, 0x7f, 0x5a, 0xc6, 0x7e, 0x8d, 0xf7, + 0xe1, 0xda, 0x11, 0x62, 0x5e, 0x1d, 0x64, 0x13, 0x7f, 0x8f, 0x4f, 0x23, 0x83, 0x03, 0x7f, 0x14, +]); + +/// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) +const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ + 0x98, 0x8b, 0x80, 0xeb, 0x79, 0x35, 0x28, 0x69, 0xb2, 0x24, 0x74, 0x5f, 0x59, 0xdd, 0xbf, 0x8a, + 0x26, 0x58, 0xca, 0x13, 0xdc, 0x68, 0x81, 0x21, 0x26, 0x35, 0x1c, 0xae, 0x07, 0xc1, 0xa5, 0xa5, +]); + +#[derive(Clone)] +pub struct SPLCompression; + +impl anchor_lang::Id for SPLCompression { + fn id() -> Pubkey { + SPL_ACCOUNT_COMPRESSION_ID + } +} + +declare_id!("BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ"); + +#[program] +pub mod cutils { + use super::*; + + pub fn mint<'info>( + context: Context<'info, MintAccountConstraints<'info>>, + params: MintParams, + ) -> Result<()> { + instructions::mint::handle_mint(context, params) + } + + pub fn verify<'info>( + context: Context<'info, VerifyAccountConstraints<'info>>, + params: VerifyParams, + ) -> Result<()> { + instructions::verify::handle_verify(context, ¶ms) + } +} diff --git a/compression/cutils/anchor-v1/programs/cutils/tests/test_cutils.rs b/compression/cutils/anchor-v1/programs/cutils/tests/test_cutils.rs new file mode 100644 index 000000000..36be2b733 --- /dev/null +++ b/compression/cutils/anchor-v1/programs/cutils/tests/test_cutils.rs @@ -0,0 +1,740 @@ +//! LiteSVM integration test for the `cutils` Anchor program. +//! +//! The cutils program exposes two instructions: +//! * `mint` - CPIs Bubblegum `MintToCollectionV1` to mint a cNFT into a +//! (Token-Metadata) verified collection and a Bubblegum tree. +//! * `verify` - recomputes the V1 leaf hash and CPIs SPL account-compression +//! `verify_leaf` to prove the leaf is present in the tree. +//! +//! Full flow exercised here: +//! 1. Load the cutils program plus the four mainnet fixtures +//! (mpl-bubblegum, spl-account-compression, spl-noop, mpl-token-metadata). +//! SPL Token + the Associated Token program are provided by LiteSVM. +//! 2. Build a real Token-Metadata *sized collection* NFT (mint + metadata + +//! master edition) so Bubblegum's `MintToCollectionV1` collection check +//! passes. `payer` is the collection update authority. +//! 3. Allocate + initialize a Bubblegum Merkle tree (max_depth=3, +//! max_buffer_size=8, canopy=0) via `create_tree_config` (same mechanics +//! as the sibling cnft-burn reference test). +//! 4. Call cutils `mint` to mint one cNFT into that tree/collection. +//! 5. Recompute `data_hash` / `creator_hash` exactly as Bubblegum stores +//! them for the minted leaf (note: after MintToCollectionV1 the collection +//! is stored *verified*, so the data_hash reflects `verified = true`). +//! 6. Build the Merkle proof for leaf 0 (all empty-node siblings), read the +//! live root from the onchain tree account, and call cutils `verify`, +//! asserting success. A second `verify` with a tampered data_hash must +//! fail. + +use { + borsh::BorshSerialize, + litesvm::LiteSVM, + solana_instruction::{account_meta::AccountMeta, Instruction}, + solana_keccak_hasher::hashv, + solana_keypair::Keypair, + solana_message::Message, + solana_pubkey::{pubkey, Pubkey}, + solana_signer::Signer, + solana_transaction::Transaction, +}; + +// ---- Program IDs ---------------------------------------------------------- + +// Track the crate's declared id (CI runs `anchor keys sync` before building). +const CUTILS_ID: Pubkey = cutils::ID; +const BUBBLEGUM_ID: Pubkey = pubkey!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); +const COMPRESSION_ID: Pubkey = pubkey!("cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK"); +const NOOP_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV"); +const TOKEN_METADATA_ID: Pubkey = pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const TOKEN_ID: Pubkey = pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); +const SYSTEM_ID: Pubkey = pubkey!("11111111111111111111111111111111"); + +// ---- Instruction discriminators ------------------------------------------- + +const CREATE_TREE_CONFIG_DISC: [u8; 8] = [165, 83, 136, 142, 89, 202, 47, 220]; + +// ---- Tree parameters ------------------------------------------------------ + +const MAX_DEPTH: u32 = 3; +const MAX_BUFFER_SIZE: u32 = 8; + +// ---- MetadataArgs (mirrors mpl_bubblegum::types::MetadataArgs borsh layout) ---- +// +// These mirror the values the cutils `mint` instruction hardcodes (see +// programs/cutils/src/instructions/mint.rs): name "BURGER", symbol "BURG", +// the test-supplied uri, a single creator equal to the collection authority, +// seller_fee 0, primary_sale_happened false, is_mutable false, edition_nonce +// Some(0), token_standard NonFungible, token_program_version Original, and a +// Collection pointing at the collection mint. + +#[derive(BorshSerialize, Clone)] +struct Creator { + address: [u8; 32], + verified: bool, + share: u8, +} + +#[derive(BorshSerialize, Clone)] +struct Collection { + verified: bool, + key: [u8; 32], +} + +#[derive(BorshSerialize, Clone)] +enum TokenProgramVersion { + #[allow(dead_code)] + Original, + #[allow(dead_code)] + Token2022, +} + +#[derive(BorshSerialize, Clone)] +struct MetadataArgs { + name: String, + symbol: String, + uri: String, + seller_fee_basis_points: u16, + primary_sale_happened: bool, + is_mutable: bool, + edition_nonce: Option, + token_standard: Option, // TokenStandard, variant index (NonFungible = 0) + collection: Option, + uses: Option, // None - Uses, kept absent + token_program_version: TokenProgramVersion, + creators: Vec, +} + +// ---- Hashing, exactly as the Bubblegum program does ------------------------ + +fn hash_metadata(metadata: &MetadataArgs) -> [u8; 32] { + let serialized = borsh::to_vec(metadata).unwrap(); + let inner = hashv(&[serialized.as_slice()]).to_bytes(); + hashv(&[&inner, &metadata.seller_fee_basis_points.to_le_bytes()]).to_bytes() +} + +fn hash_creators(creators: &[Creator]) -> [u8; 32] { + let creator_data: Vec> = creators + .iter() + .map(|c| [c.address.as_ref(), &[c.verified as u8], &[c.share]].concat()) + .collect(); + hashv( + creator_data + .iter() + .map(|c| c.as_slice()) + .collect::>() + .as_slice(), + ) + .to_bytes() +} + +// ---- SPL account-compression empty-node helper ----------------------------- + +fn empty_node(level: u32) -> [u8; 32] { + if level == 0 { + return [0u8; 32]; + } + let lower = empty_node(level - 1); + hashv(&[&lower, &lower]).to_bytes() +} + +// ---- ConcurrentMerkleTree<3,8> account layout ------------------------------ +// +// account_data = header (56) || zero-copy ConcurrentMerkleTree (1248) || canopy(0) +// Current root = change_logs[active_index].root. See cnft-burn reference test +// for the full layout derivation. + +const HEADER_SIZE: usize = 56; +const CMT_SIZE: usize = { + let changelog = 32 + 3 * 32 + 4 + 4; // 136 + let path = 3 * 32 + 32 + 4 + 4; // 136 + 8 + 8 + 8 + changelog * 8 + path +}; +const TREE_ACCOUNT_SIZE: usize = HEADER_SIZE + CMT_SIZE; + +fn read_current_root(data: &[u8]) -> [u8; 32] { + let tree = &data[HEADER_SIZE..]; + let active_index = u64::from_le_bytes(tree[8..16].try_into().unwrap()) as usize; + let changelog_stride = 136; + let root_off = 24 + active_index * changelog_stride; + let mut root = [0u8; 32]; + root.copy_from_slice(&tree[root_off..root_off + 32]); + root +} + +// ---- Anchor discriminators ------------------------------------------------- + +fn anchor_disc(name: &str) -> [u8; 8] { + let digest = sha256(format!("global:{name}").as_bytes()); + let mut out = [0u8; 8]; + out.copy_from_slice(&digest[..8]); + out +} + +// Minimal SHA-256 (FIPS 180-4) - used only to derive Anchor discriminators, +// avoiding a crypto crate that conflicts with the program's solana version. +fn sha256(input: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, + 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, + 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, + 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, + 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, + 0xc67178f2, + ]; + let mut h: [u32; 8] = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, + 0x5be0cd19, + ]; + let mut msg = input.to_vec(); + let bitlen = (input.len() as u64) * 8; + msg.push(0x80); + while msg.len() % 64 != 56 { + msg.push(0); + } + msg.extend_from_slice(&bitlen.to_be_bytes()); + + for chunk in msg.chunks(64) { + let mut w = [0u32; 64]; + for (i, wi) in w.iter_mut().enumerate().take(16) { + *wi = u32::from_be_bytes([ + chunk[i * 4], + chunk[i * 4 + 1], + chunk[i * 4 + 2], + chunk[i * 4 + 3], + ]); + } + for i in 16..64 { + let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); + let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16] + .wrapping_add(s0) + .wrapping_add(w[i - 7]) + .wrapping_add(s1); + } + let mut v = h; + for i in 0..64 { + let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); + let ch = (v[4] & v[5]) ^ ((!v[4]) & v[6]); + let t1 = v[7] + .wrapping_add(s1) + .wrapping_add(ch) + .wrapping_add(K[i]) + .wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); + let maj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); + let t2 = s0.wrapping_add(maj); + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3].wrapping_add(t1); + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = t1.wrapping_add(t2); + } + for i in 0..8 { + h[i] = h[i].wrapping_add(v[i]); + } + } + let mut out = [0u8; 32]; + for (i, word) in h.iter().enumerate() { + out[i * 4..i * 4 + 4].copy_from_slice(&word.to_be_bytes()); + } + out +} + +// ---- keccak256 leaf hash (mirrors leaf_schema_v1_hash in bubblegum_types.rs) ---- + +fn leaf_schema_v1_hash( + id: &Pubkey, + owner: &Pubkey, + delegate: &Pubkey, + nonce: u64, + data_hash: &[u8; 32], + creator_hash: &[u8; 32], +) -> [u8; 32] { + hashv(&[ + &[1u8], // Version::V1 = 1 + id.as_ref(), + owner.as_ref(), + delegate.as_ref(), + &nonce.to_le_bytes(), + data_hash, + creator_hash, + ]) + .to_bytes() +} + +fn get_asset_id(tree: &Pubkey, nonce: u64) -> Pubkey { + Pubkey::find_program_address( + &[b"asset", tree.as_ref(), &nonce.to_le_bytes()], + &BUBBLEGUM_ID, + ) + .0 +} + +// ---- Helpers --------------------------------------------------------------- + +fn send( + svm: &mut LiteSVM, + ixs: Vec, + payer: &Keypair, + signers: &[&Keypair], +) -> Result<(), Box> { + let msg = Message::new(&ixs, Some(&payer.pubkey())); + let blockhash = svm.latest_blockhash(); + let mut tx = Transaction::new_unsigned(msg); + tx.sign(signers, blockhash); + svm.send_transaction(tx).map(|_| ()).map_err(Box::new) +} + +fn metadata_pda(mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[b"metadata", TOKEN_METADATA_ID.as_ref(), mint.as_ref()], + &TOKEN_METADATA_ID, + ) + .0 +} + +fn master_edition_pda(mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[ + b"metadata", + TOKEN_METADATA_ID.as_ref(), + mint.as_ref(), + b"edition", + ], + &TOKEN_METADATA_ID, + ) + .0 +} + +/// Create a Token-Metadata *sized collection* NFT whose update authority is +/// `authority`. Returns (collection_mint, collection_metadata, master_edition). +fn create_collection_nft( + svm: &mut LiteSVM, + payer: &Keypair, + authority: &Keypair, +) -> (Keypair, Pubkey, Pubkey) { + let mint = Keypair::new(); + let metadata = metadata_pda(&mint.pubkey()); + let master_edition = master_edition_pda(&mint.pubkey()); + + // 1. Create + initialize the SPL mint (mint authority = authority). + let mint_rent = svm.minimum_balance_for_rent_exemption(82); + let create_mint = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(mint.pubkey(), true), + ], + data: { + let mut d = 0u32.to_le_bytes().to_vec(); + d.extend_from_slice(&mint_rent.to_le_bytes()); + d.extend_from_slice(&82u64.to_le_bytes()); + d.extend_from_slice(TOKEN_ID.as_ref()); + d + }, + }; + // InitializeMint2 (tag 20): decimals=0, mint_authority=authority, freeze=None. + let init_mint = Instruction { + program_id: TOKEN_ID, + accounts: vec![AccountMeta::new(mint.pubkey(), false)], + data: { + let mut d = vec![20u8, 0u8]; + d.extend_from_slice(authority.pubkey().as_ref()); + d.push(1); // freeze authority present (required for NFTs) + d.extend_from_slice(authority.pubkey().as_ref()); + d + }, + }; + + // 2. Create + initialize a token account, then mint 1 to it. + let token_account = Keypair::new(); + let acct_rent = svm.minimum_balance_for_rent_exemption(165); + let create_token_acct = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(token_account.pubkey(), true), + ], + data: { + let mut d = 0u32.to_le_bytes().to_vec(); + d.extend_from_slice(&acct_rent.to_le_bytes()); + d.extend_from_slice(&165u64.to_le_bytes()); + d.extend_from_slice(TOKEN_ID.as_ref()); + d + }, + }; + // InitializeAccount3 (tag 18): owner = authority. + let init_token_acct = Instruction { + program_id: TOKEN_ID, + accounts: vec![ + AccountMeta::new(token_account.pubkey(), false), + AccountMeta::new_readonly(mint.pubkey(), false), + ], + data: { + let mut d = vec![18u8]; + d.extend_from_slice(authority.pubkey().as_ref()); + d + }, + }; + // MintTo (tag 7): amount = 1. + let mint_to = Instruction { + program_id: TOKEN_ID, + accounts: vec![ + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new(token_account.pubkey(), false), + AccountMeta::new_readonly(authority.pubkey(), true), + ], + data: { + let mut d = vec![7u8]; + d.extend_from_slice(&1u64.to_le_bytes()); + d + }, + }; + + send( + svm, + vec![ + create_mint, + init_mint, + create_token_acct, + init_token_acct, + mint_to, + ], + payer, + &[payer, &mint, &token_account, authority], + ) + .expect("collection mint setup should succeed"); + + // 3. CreateMetadataAccountV3 (disc 33) with collection_details = V1{size:0} + // (this makes it a *sized* collection that Bubblegum accepts). + let create_metadata = Instruction { + program_id: TOKEN_METADATA_ID, + accounts: vec![ + AccountMeta::new(metadata, false), + AccountMeta::new_readonly(mint.pubkey(), false), + AccountMeta::new_readonly(authority.pubkey(), true), // mint_authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new_readonly(authority.pubkey(), true), // update_authority + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = vec![33u8]; + // DataV2 + "Collection".serialize(&mut d).unwrap(); // name + "COLL".serialize(&mut d).unwrap(); // symbol + "https://example.com/collection.json" + .serialize(&mut d) + .unwrap(); // uri + d.extend_from_slice(&0u16.to_le_bytes()); // seller_fee_basis_points + d.push(0); // creators: Option> = None + d.push(0); // collection: Option = None + d.push(0); // uses: Option = None + d.push(1); // is_mutable = true + // collection_details: Option = Some(V1 { size: 0 }) + d.push(1); + d.push(0); // CollectionDetails::V1 variant + d.extend_from_slice(&0u64.to_le_bytes()); // size + d + }, + }; + + // 4. CreateMasterEditionV3 (disc 17) with max_supply = Some(0). + let create_master_edition = Instruction { + program_id: TOKEN_METADATA_ID, + accounts: vec![ + AccountMeta::new(master_edition, false), + AccountMeta::new(mint.pubkey(), false), + AccountMeta::new_readonly(authority.pubkey(), true), // update_authority + AccountMeta::new_readonly(authority.pubkey(), true), // mint_authority + AccountMeta::new(payer.pubkey(), true), // payer + AccountMeta::new(metadata, false), + AccountMeta::new_readonly(TOKEN_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = vec![17u8]; + d.push(1); // max_supply: Option = Some + d.extend_from_slice(&0u64.to_le_bytes()); + d + }, + }; + + send( + svm, + vec![create_metadata, create_master_edition], + payer, + &[payer, authority], + ) + .expect("collection metadata + master edition should succeed"); + + (mint, metadata, master_edition) +} + +#[test] +fn test_cutils_mint_and_verify() { + let mut svm = LiteSVM::new(); + + // Load the cutils program and the mainnet fixtures. + svm.add_program( + CUTILS_ID, + include_bytes!("../../../target/deploy/cutils.so"), + ) + .unwrap(); + svm.add_program( + BUBBLEGUM_ID, + include_bytes!("../../../tests/fixtures/mpl_bubblegum.so"), + ) + .unwrap(); + svm.add_program( + COMPRESSION_ID, + include_bytes!("../../../tests/fixtures/spl_account_compression.so"), + ) + .unwrap(); + svm.add_program( + NOOP_ID, + include_bytes!("../../../tests/fixtures/spl_noop.so"), + ) + .unwrap(); + svm.add_program( + TOKEN_METADATA_ID, + include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"), + ) + .unwrap(); + + // Fund payer (also the collection authority / tree delegate / leaf owner). + let payer = Keypair::new(); + let leaf_owner = Keypair::new(); + svm.airdrop(&payer.pubkey(), 1_000 * 1_000_000_000).unwrap(); + svm.airdrop(&leaf_owner.pubkey(), 10 * 1_000_000_000) + .unwrap(); + + // Build the verified collection NFT (payer is the collection authority). + let (collection_mint, collection_metadata, collection_master_edition) = + create_collection_nft(&mut svm, &payer, &payer); + + // Create the Merkle tree account (owned by the compression program). + let merkle_tree = Keypair::new(); + let rent = svm.minimum_balance_for_rent_exemption(TREE_ACCOUNT_SIZE); + let create_acc = Instruction { + program_id: SYSTEM_ID, + accounts: vec![ + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new(merkle_tree.pubkey(), true), + ], + data: { + let mut d = 0u32.to_le_bytes().to_vec(); + d.extend_from_slice(&rent.to_le_bytes()); + d.extend_from_slice(&(TREE_ACCOUNT_SIZE as u64).to_le_bytes()); + d.extend_from_slice(COMPRESSION_ID.as_ref()); + d + }, + }; + + let (tree_config, _) = + Pubkey::find_program_address(&[merkle_tree.pubkey().as_ref()], &BUBBLEGUM_ID); + + // create_tree_config(max_depth, max_buffer_size, public=None) + let create_tree_ix = Instruction { + program_id: BUBBLEGUM_ID, + accounts: vec![ + AccountMeta::new(tree_config, false), + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new(payer.pubkey(), true), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_creator + AccountMeta::new_readonly(NOOP_ID, false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = CREATE_TREE_CONFIG_DISC.to_vec(); + d.extend_from_slice(&MAX_DEPTH.to_le_bytes()); + d.extend_from_slice(&MAX_BUFFER_SIZE.to_le_bytes()); + d.push(0); // Option::None + d + }, + }; + + send( + &mut svm, + vec![create_acc, create_tree_ix], + &payer, + &[&payer, &merkle_tree], + ) + .expect("create_tree_config should succeed"); + + // ---- Call cutils `mint` ------------------------------------------------- + // + // Account order mirrors the Mint<'info> struct in mint.rs: + // payer, tree_authority, leaf_owner, leaf_delegate, merkle_tree, + // tree_delegate, collection_authority, collection_authority_record_pda, + // collection_mint, collection_metadata, edition_account, bubblegum_signer, + // log_wrapper, compression_program, token_metadata_program, + // bubblegum_program, system_program. + // + // When there is no collection-authority-record PDA, that account must be + // the Bubblegum program id. bubblegum_signer is the `collection_cpi` PDA. + let (bubblegum_signer, _) = Pubkey::find_program_address(&[b"collection_cpi"], &BUBBLEGUM_ID); + + let uri = "https://example.com/burger.json".to_string(); + let mint_ix = Instruction { + program_id: CUTILS_ID, + accounts: vec![ + AccountMeta::new_readonly(payer.pubkey(), true), // payer (signer) + AccountMeta::new(tree_config, false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), // leaf_delegate + AccountMeta::new(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(payer.pubkey(), true), // tree_delegate (signer) + AccountMeta::new_readonly(payer.pubkey(), true), // collection_authority (signer) + AccountMeta::new_readonly(BUBBLEGUM_ID, false), // collection_authority_record_pda + AccountMeta::new_readonly(collection_mint.pubkey(), false), + AccountMeta::new(collection_metadata, false), + AccountMeta::new(collection_master_edition, false), // edition_account (mut: set_and_verify writes details) + AccountMeta::new_readonly(bubblegum_signer, false), + AccountMeta::new_readonly(NOOP_ID, false), // log_wrapper + AccountMeta::new_readonly(COMPRESSION_ID, false), + AccountMeta::new_readonly(TOKEN_METADATA_ID, false), + AccountMeta::new_readonly(BUBBLEGUM_ID, false), + AccountMeta::new_readonly(SYSTEM_ID, false), + ], + data: { + let mut d = anchor_disc("mint").to_vec(); + // MintParams { uri: String } + uri.serialize(&mut d).unwrap(); + d + }, + }; + + send(&mut svm, vec![mint_ix], &payer, &[&payer]).expect("cutils mint should succeed"); + + // ---- Recompute the stored leaf's data_hash / creator_hash --------------- + // + // Mirror exactly what cutils mint hardcodes; after MintToCollectionV1 the + // collection is stored *verified = true*. + let creator = Creator { + address: payer.pubkey().to_bytes(), + verified: false, + share: 100, + }; + let metadata = MetadataArgs { + name: "BURGER".to_string(), + symbol: "BURG".to_string(), + uri, + seller_fee_basis_points: 0, + primary_sale_happened: false, + is_mutable: false, + edition_nonce: Some(0), + token_standard: Some(0), // TokenStandard::NonFungible + collection: Some(Collection { + verified: true, // verified by MintToCollectionV1 + key: collection_mint.pubkey().to_bytes(), + }), + uses: None, + token_program_version: TokenProgramVersion::Original, + creators: vec![creator.clone()], + }; + + let data_hash = hash_metadata(&metadata); + let creator_hash = hash_creators(&metadata.creators); + + // Proof for leaf index 0 in an otherwise-empty tree: empty-node siblings. + let proof = [empty_node(0), empty_node(1), empty_node(2)]; + + // Read the live root from the onchain tree account. + let tree_data = svm.get_account(&merkle_tree.pubkey()).unwrap().data; + let root = read_current_root(&tree_data); + + // Sanity: the leaf we computed must equal what the program will recompute, + // and the proof must rebuild the onchain root. + let asset_id = get_asset_id(&merkle_tree.pubkey(), 0); + let leaf = leaf_schema_v1_hash( + &asset_id, + &leaf_owner.pubkey(), + &leaf_owner.pubkey(), + 0, + &data_hash, + &creator_hash, + ); + let mut node = leaf; + let mut idx = 0u32; + for sibling in proof.iter() { + node = if idx & 1 == 0 { + hashv(&[&node, sibling]).to_bytes() + } else { + hashv(&[sibling, &node]).to_bytes() + }; + idx >>= 1; + } + assert_eq!( + node, root, + "locally recomputed root must match the onchain tree root" + ); + + // ---- Call cutils `verify` ---------------------------------------------- + // + // Accounts per Verify<'info>: leaf_owner (signer), leaf_delegate, + // merkle_tree, compression_program, then proof nodes as remaining accounts. + let build_verify = |dh: [u8; 32]| -> Instruction { + let mut accounts = vec![ + AccountMeta::new_readonly(leaf_owner.pubkey(), true), + AccountMeta::new_readonly(leaf_owner.pubkey(), false), // leaf_delegate + AccountMeta::new_readonly(merkle_tree.pubkey(), false), + AccountMeta::new_readonly(COMPRESSION_ID, false), + ]; + for sibling in proof.iter() { + accounts.push(AccountMeta::new_readonly( + Pubkey::new_from_array(*sibling), + false, + )); + } + Instruction { + program_id: CUTILS_ID, + accounts, + data: { + let mut d = anchor_disc("verify").to_vec(); + // VerifyParams { root, data_hash, creator_hash, nonce, index } + d.extend_from_slice(&root); + d.extend_from_slice(&dh); + d.extend_from_slice(&creator_hash); + d.extend_from_slice(&0u64.to_le_bytes()); // nonce + d.extend_from_slice(&0u32.to_le_bytes()); // index + d + }, + } + }; + + send( + &mut svm, + vec![build_verify(data_hash)], + &leaf_owner, + &[&leaf_owner], + ) + .expect("cutils verify should succeed for the minted leaf"); + + // A tampered data_hash must fail verification. + let mut bad = data_hash; + bad[0] ^= 0xff; + let bad_result = send( + &mut svm, + vec![build_verify(bad)], + &leaf_owner, + &[&leaf_owner], + ); + assert!( + bad_result.is_err(), + "verify must fail for an incorrect data_hash" + ); +} + +#[test] +fn test_empty_node_matches_manual() { + let e1 = empty_node(1); + let manual = hashv(&[&[0u8; 32], &[0u8; 32]]).to_bytes(); + assert_eq!(e1, manual); +} diff --git a/compression/cutils/anchor-v1/tests/fixtures/README.md b/compression/cutils/anchor-v1/tests/fixtures/README.md new file mode 100644 index 000000000..0c41f7125 --- /dev/null +++ b/compression/cutils/anchor-v1/tests/fixtures/README.md @@ -0,0 +1,30 @@ +# Test fixtures - mainnet program binaries + +These `.so` files are the compiled onchain programs the cutils test CPIs +into, dumped from Solana **mainnet-beta** so [LiteSVM](https://github.com/LiteSVM/litesvm) +can load them locally (LiteSVM only bundles System/Token/Token Extensions/ATA). They +are the real programs - not modified - so accounts they create/verify behave +exactly as on mainnet. + +`mpl_token_metadata.so` is required because the cutils `mint` instruction CPIs +Bubblegum `MintToCollectionV1`, which in turn validates a real Token-Metadata +collection NFT (mint + metadata + master edition) that the test builds. + +| File | Program | Program ID | Source | Dumped (UTC) | Slot | +|------|---------|------------|--------|--------------|------| +| `mpl_bubblegum.so` | Metaplex Bubblegum (cNFTs) | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_account_compression.so` | SPL Account Compression | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | mainnet-beta | 2026-06-05 | 424532091 | +| `spl_noop.so` | SPL Noop (log wrapper) | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | mainnet-beta | 2026-06-05 | 424532091 | +| `mpl_token_metadata.so` | Metaplex Token Metadata | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | mainnet-beta | 2026-06-05 | 424532091 | + +## Refreshing + +These are point-in-time snapshots. To re-dump (e.g. after an upstream program +upgrade), update the date/slot above and run: + +```bash +solana program dump BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY mpl_bubblegum.so -u https://api.mainnet-beta.solana.com +solana program dump cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK spl_account_compression.so -u https://api.mainnet-beta.solana.com +solana program dump noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV spl_noop.so -u https://api.mainnet-beta.solana.com +solana program dump metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s mpl_token_metadata.so -u https://api.mainnet-beta.solana.com +``` diff --git a/compression/cutils/anchor-v1/tests/fixtures/mpl_bubblegum.so b/compression/cutils/anchor-v1/tests/fixtures/mpl_bubblegum.so new file mode 100644 index 0000000000000000000000000000000000000000..3b573de0bfe31fac52f561db9709b4c30cf766d0 GIT binary patch literal 1329808 zcmeFa3w%|_bvL?&IF{`s6&5~*oRsJY@v>4SfFBTAw*q3D&?drmWH7BFWSIhXT(dcj zVSA^s@Dn>}0(N4Pq-}I0WaPHDqUi(LBt7&?Zt65mOWNCB_mP&ozLI`vKl)1CrZIQ@ z*MF^jMn@7a8)APq`v;mcGizqntk+rl2f!QYQy7y)1>7*jHa;~fL|d0r+u0Ewc*i(a2|%`rb^bp z+UW{V8y^2E%X#SKrbsf{JAO0E)rJRHEb{O|izjpVBWY#ItSgUcLRvWR0)8YdGc7)# z@yc?IMh()z+43`G_o8(5AHAr(p&?RQC$}zO zdT&v~N=bw0Au0ZvS4B|;%#dfhgm0E`rr=R057H36DUV-KbWl?Szrt?z<2Lp$>1BR} zWQrQP*@3Gn0ZkY^~(cjgfoS>SIC1n!gT#Eg-r|n8uoM`CyE-a z-NfnAwpa50MI<0eO-^miKa-q<%Ev@U?h)`TP_` zHOfUls`Yqz@D1%%=4x`ZU+Adq8{I0mFnzl;k9I(pE_slOu;)?cH-DI+!}n}q9DIQ+ z_H1Ol(dw%hJn|vmo<39Jjq(5*VUNKheGFd%ywIaYk|*kUD@sPuCW%XtsB)D?BgZdE z7*EzQob@QM6ZsH$^e-1(tnp->$w$Jl`_b>7Kt{68Z`t;<@)Dr=f_D8b%03rIX@w9M==|VP9m8jHa{g-$V zaBasmf2PC-t~906^kbS{8I*`T4U#`1_@r$|t==OR9v%mG7#Lk7pG=89dCeOnaS+epm^VlxcrU#@A%X?DL`)%@6AZz0)@00s0B5!q=I^tL;J! zLwNErVm}1FsPNA#9^i|XU&j8F3Wr&~tj+4Uab%KyeNpCHL7x`=`D<#`HLzLPI=P80@8Q=Du$~&#?fgN_)=KP{I-P}c1@YB z=fWCIKL{frPkKA$F}-~Q(*+19mI}ui7c`52d+eCTF@B8E+m9aA^w5s1Q9Pd0 z^z`;;Ej%<1u0!BLIXNV8$m_4Hog(_%Ev=5#U&($^`r8@k?<$+9D;<+E z`IQ#-THN?p*llt0ISuRw`9Glf>FpyH9?%f<2>I^(PAA~+fbbzLOv2y5{(zrJd8yW~ zc4$mLd|YGuX<>)Li5((dncXye3!5!}m*um6NqM)$+5e=x*W#p4D3=w%CzLnH=|SoA zLZK`0`!m5Wghze|kNyB2Dhc>M7Wg>skeJw^rxy~xkp&udkzJWzS(-sOAEz+hE|+pS z^-87uE0CX8jp65G?Efjp!Slz@y=TbJ$CaN&;mYaolW-wFTclhlFD_p$FAq!o=?=5| zo6$-X)!O;WJf>IZ9!6ak)Y@;-5BiG7{V?~x4$AnddTf3c;zhu<9aH{{_q&d2dWg5` zciVHCo)(_9@DSmK(5m=n(g^gy=XaGGnGU`9%Qdjyt(p+}UjqK3?DtcvtNvHje!u+b z@mop{`XN>O?RJm$s%rOW&yuq13GH2C{%v0PE-bD38JWJFT|F5c#n;4>l-XW7gL0bL z*BQcC&1XC53<~I^@_dBGMoKP zZ2s0gm-Ds;@h2hI=}Ok;^EWiVP|BrL1JMUMp6D+yOHI$y%UCWKeO>zterUe+H`DVB z?(eCG^MRGv8>h3)CzG8_&)1=r>U=F1$%IaxWGCC}s{3!!c_;hZRrg<6`wDkI``b0; zJDT2ACkii*+dJ^t7U%E4}vgNn() zry&PJCeMSW4?9iXY<`&--fs82Uv3W_pR_!b~}Q6z@CC$uUP>3?$>&f zLF!pfy?`oTK)(>5?w02WZ~aAnh*x*Z|D*XXCyDWGrm$;XfM@sOKUKKAt!?Ha#zVY; zXE@)Fu9_0{njJzpa3B|P-7^_EK)lRf^YyFb63SOvIHvhNe;?P*pwUPAbJXZ_#!Vlv3~Qd<{vz43mhrU$v`4O(&U;6CCvG{SJ7;X8bYc&)c^wbi?faD8no*JpAQ z;=L903GjBlJ~R7qmNM2gcZ+F?Q*>3_jHNv~ZOC2;^@Ex0QhxMyp!(6n& z=tq72e%dAA8QP^gg}=RKcdB-Y4nQ(ubT_|fyj>d5{-teu$I(aI3G{of(dWY-7yE2> zBz}hDWd5Q$^TTG7PS&1}@1=RN2q}--sq|`%ik`elfAkLinzo;qUMBkt?_tVOy57Ro zOi!0le)`&2uFux#Li@5AbPDiy{!UT;(!L~vTeaPZ?9)0aAKIrsek1JKI^sFFK|{=c zr$`Sd6g1CG_ z;YyeFXuR|!@kq*SC%sGx%9E5?Uq*koZ#y+x*A=DN6IJ_ljCj5b?AIS(0l(_S+plM3 z-4y(E`}H{Z>Fc9|wjP|>uSok}wO?GHt=ccH&sOc%Fax7@$7b_Ut*ME;eCP*lqNtA(mSy@T98 zN`|cbKEr#Ma+I#OaJAKI>-&9eEZ0{cJ|X@ipi_Xq^Y?b;?+DlL2M=gCk^R~$APv2!?z~m7>N#ni`mz1ragQj{O7mrq+%vw{nXa&T0Zzx&MWRv-$CI zj`zu8hTTmzKVEKjbuq*4rsuUC&>K&(oQ_~}1;g&?oF5;QY5>wTWdp#*%pYGZeC@Jz z{v@_`ZA;Mig$@e&fnUBJe+6H%BTBYuH1d6yuBlTL4)law_b@3L-nOrU`50@Y){&!%k$G#={1QRzph4+pGY-D*FMDtuR6UdL1S+uh&6`U85FwkTR6 zS8OjCJf!6ks=uz|fnKS}MOQrpQ}}7;JHQ9#8-L6mp?*!b`n#rBxhBF@^BK=YMXk4Y z@at@Uh~sUt?>OVbl&5sPg{zsKE+brD8_V@g;MWcaA|ahXH}L;!b7fo@w0`?Mb!5QW zH#!7zq5WB@XhvOAtv|MYRlCk}w)D&Vk%!ri+naIorsd2}&bPkG{vP#pP!ULW5Rb}E zhM?<*g|1!EFEiiPlakZb+ecZ?DfRY&mq>3PG`)SOs13*crnmQ--tIEJeeBOvE=p}* zVtBFX>w44I)s&-j8Rf>;ozjnvD14~5&(+AI`{Dm{F~l#}M@{@pZgwS-wHYB;7rczQgLvL7HX!x)xF({mb$h_j4Ild#+%owD%R7i|Tyd z{IHj={r;kMY$E&pWtG>@GyhEO_x+^TOK!jK?N|96?|;#cOeVAAk4$36?>$31-gf$S zynT!vpK;FY_?k)V_&>J7j=xqJar*Y;oeH0?of&B(P`?Vg9GjYrVuxC@xFKay<7vq@gYiCo>hqWFXzjkW( zblvUcGA=IskspkU={q3JBEM%j4?5#<@%yk(J$uo)*{44C29clt1NW(ys-31iekJTv zzd`tWKKH3V_*<{ced<3Ddwe$g)bE3w+xf&~a5Me1AM8_eKJ_Bb&wOy<#CGXbTQ~j& zZ1UH>^qy-^=ll%T1;c%wF11TGU$S!()qQHN8&vmsxXw}C=Xuup1q@{V8k~~}@$z*D ztXePqr5o=9>>X1-^F=@Rf%J8U-c>?+Vc>heo!WVFq`&odzVs=i*FS&xbrbnZx}LWW z5Hf!g_u;Vg5B|-t%I^U2vvUm-ou3KundtmXh}X%^&xClM&iNVO>3%5i-7EarOA(4`sXitUvb@l|SiqGZ|hjjFcy>+2;<|c?7Ls zANk+3zH#fh-v_^^UhT`zD*lcy)(1m9J{|jleZ(Wks(J6`CD=y}@k$F9Djmn$ zmuXpgsK?#wj^rK?|y>EAegs;(!$^!v(sZeUQ!qVE-YKR>Q`9x^-+YdDeJsohuJ zqIPHOzVfO1m)V_c-*}g{cd~ur=b?8(HyqgnUEg~H#uJ`D>btCYP~N9J9fLAyE_->VHT<#qn^unKsk5` z?AX}zd{sL(_B>zJj=j|9VfrVO>lMmq_w&A==lN>wSV{PMKF`B^@t0oN=V30Kz`mZ2 z-TE`U2V5R&wB`kiuW%ZW-CKflcyJK&7cj%$o4K?1%~}BSEPt?ro^abe!h1wfKXdRC z^9($GA5MkaXi;;oCP!!okDuFXUqpC6x7TIo?fm^#v};B597_96?&sFxlkQ}_eh#V9 z$2k1r*9kvr;T`|*T+1=Y5jr7Hdz0aH5#wEQE*4Lvm2vn-$L`~A_FEFF@hMm6c4y`9Gx_kE3MoQ?{=py$)L0 zE^S5Hxrzy>cMSce8vUdmrQb~kC*&GKzm=2I@8J+{f@vkvRFvBORWiruw~}Ep$LMJ9 zXC|}RuD_R=@lh(NrRygGy1G2|wz8p$wYOIAKucXyNg&8aQR04HHD~97K=;+1Q)Imk z*is(;{B4Mnj>wPRUge|TzXUn#4ezUw;-Dnpzj0jv--=qRdYd$%!fG7wSFWnUdw-CA ze0eq9LZ^Y<;?zPLZ(=jEUepg`$dy`Mg)-PU>jA?T^uC-n2P z^8RI)zX$8@r)2MojOaMx=QI7BLhZWYOZh(gr&m<%!HbcrZ;9N5a`huMaO}e@L@pF5%?I%s7TQXe`mB;Pz znVwfmjL+5c+ge?8>hs;J*zWWWhGyr^U;8_({jJ}p_D9(6B?E?s2Gw)&W=}FY+Inh6 zXZO!qtenUT|D_Did;7-!>6^b#?GLcs zOZGA}Q&Q!#CRg?82Xa69ic>;i`0H$5cX^YWe(#`)wD+C`ra<6a&hShe2{Pl3ty-7cA?8TmTCcTy=54t_Bn z_v3tAa6c_u26HJiB7`aB}S~qAsU(fp>Aa_XEGIz74Z&^rqpGUQ?(PZhz^Xj*GI?mxEr*adp#CvyN)BH`6 z4u7igMorfDRq!jrQ`*D$nV)L+-Z}nRI^Va;MZ`bv@2@$WRF3jp_21L>lG)ZDdCvh) zE@Ha#4gTe>uh=G-e~)L>))Rbv!rzn0-uqc*esJ5f^oQ+zB%L2_+o^U;_P){)EeH5_Z!D=%-FW9+rO_6Hvvpwj-9?o1^T+#{kNcK!&L}*;q4RiKmjK@I zXy9M3lK;M5;p+~_N4>~@i~RTdQWLxHz~!RR^t*Bc+ubhsTp>RpCpeMZnP>XwRSZKo z+^kSp!}LuOTq6HFr7b+kzN3^kksD}kQa+~f&Pz30-V-EUE6W*oy7>E&zMj@NpZUJ- z>vHS&wvAq3`5PJH{$k)?*}ypP(ta48uFrrgO5P@;Q>W=k#rli3bd1H%UL0zP8?& z;nB)`z!&A`CXqLUohIM=B@V(@j4zGIl&7(#z0p3VyIyUV_LPoR59(Dq-fD0+GXz{w zenMUlc6z^gEIva17&`U}kUXPx3^TmeFy1Krz~lPqd`3M=kGaf8drFT9+8aaX+V(nF ze!B!k`M*i%fUwi);dJVdM0pye-*`r?-Ad4JrH}Cs^(cLABYa55q9kQ<=5#(&`hbY? zG)lkmj9R;=lCO-;*RmYsTIslwap0wNoJ9VeKhPtPrqlT3_mgLOBy=hw|3>*EPh$(i zQKP4ihuZ~C`6Jn?2StPP{+WGny8wFxkje_eW%Au*<&Y`QXom)wKj7oLuaA6~*;zj9 z@;mD`E7$*X?Q7oU_X;EZhSH4R0r+bQQ$Jr@-q+va7M}aa*UeD>1ml=L5Mf`(t5|<9 zjvux2C4f69d_a-*OIZ+cJa`WtkK2Kn4N~sCnxx~l-!r#X8qx8<><`)(P<_yT`wWZ@ z(vGC#7wA!x-xv?RAnUBYE|attCZC9F< z_xA|z^mqDsyJteb=VUxYdw9--e$U;s!27uf$SWSlC*SZ!jn5b1o-My} z5#yByHCfLqqe#-rxR2kBa~V%M*x@wCFzGNp`$6AKE8$J(rXz4zoPtf{NhKM z-rY)V^M1SEjs624^dIjECVf_~;pg;lyU;j?^_4!v5bdG7x7Xb&1D`x6Yv&Var>1_V zbNoPymTwR=K)=!=jp}-R*be;7zZ1T90RefE0nR5}Z@nMBzF+14pPXnGc*jrefyB}O zj{`67zsXN7GQV#=T9I;QAKae6KPpPP+kM!reu=l+I<4FFzBbN3G%kH>Z$c@l&*W;N zdO%s5~{Rt_5y@dS|mI^%Q=lQ?~H~1m{sOGc%?Ls$jXsv`=Uc!Fl-^+Q< zL5V{@a?t|$EA*(*qwXf;R_O=2VMwULX?8ZAmIA#IuuM+;Jg4J3zCXmr@x5N~IxOW& z_Zl4~4$kMI>GHQq$MN;hHh4Rri}qi_)1lw^`l@(gNCzF|Uj+P)OBmueRpQBJArL~h zLpwDZT@!Nvbvg9&vElb=-X=I!%d?z+=OvtH;l6>e+%;mC8+Q;seVFb0I)Uql`+F6# zIr8~IV&5h4`*xc57{0xRuko|;IMc&@_9ehKD{uH(`K*6^Oo!Yo0G?YIPoJ6uPoJ-t z-sSy%gXN+`^5pC0X_(l4ZdX0HA%0223JoF8c>ErS^d4(RaK+>MdAW!VYOVj^ei6R+ zp^72_G{Dz&+rL8iym^E`8uTuz5Od*^C=QaXUX{R%Qx&TanUa@yQWm`u(^PJmZ? z3-Qm^4QtNxblE*!Is5+3c=@J1uf?xcu6y*A0ONfZxXwO67BO@&i&!J zqPIfo2zE_F;TIsFFQ5I)XFh|EXm-lB>zWsg|pNG}THT0c5(fayl zwQ&6Js*?wRr!+)avcxpQ(qKcTDAT&;R_@Pd_m~zfBOYZ>Gp~362jk@obEJ` zNuM@5Ilb+^vs2MK^ao~~Bf9_LBy|6aAl>!B*SQ<7WdB@_+E))Q(f`hq|Am(_V4>v-Kshv(N~i zFOD03$)-sCr}qe;JdpFuk6o-uCq1u<`gJ^!wqRe^1^CzEo3^k%9bW`K(+B&`OdL;B z1umIi5yzKUTmu~^Vc}h`Dub*K{l<9W^Eu#A`k?5eeGkO%xvb9jb5XMt4eh0$^DRm` z$`8OkX63o>ljC+Vf}P9z?R$IbJR%^ULUN(f<$S!u%CqKY`rH(54UMroBa& zDv#UoP%iSJT!4x8pq%^b4)5Q4^m_pko1cY#KDyL?EA6hz6Y2@*fqL;^N|NSbT`=E! zn0#ALf55-n+1IPtdJY{uNFU?65%Bq*RMdVedpS;CBp>jhzj=#}tCW{yg!N?e^9kn1 zt5?f>cQf0^ck;&IZFnU2EKmUOS*lkb2?_0&aX&p7J@^8UG+hq7rI9@gB1C$?I3fcpFwY`s@b$fq%7VWt_#PKg` zyIpnso=W%qr{B*no}^v1pHg$FMXMKk_geiC-y<)t%F})S$>j+Ab9&;tu#RsnA8Yj< zeg(>vR%$cK*O1PW^)GCXe%8cx)A{H4KyJeN<9qJahPy6!wc4G@+H-vg+Z{S1dUCu! z6FNS1p6U1~+M7iGPff?v==d7d%QKEqvAS*M=J?+oR#C>(%2TNAch<3}XhKBRm~Tg?C5_I`^?L3xsG4_aIl zMdNhh(iV-Xeir4Y+d_@1o_&~?FUbeuaA{x3T#{x8$^&V>K%=b8V_As^0?|Gu8x z{D5{hO77X9KjzB&F_6HMjc?!}Qt`6_Tqa6G~;Z>^W$i*#&2@}!R?sa5$|8JZ5`W-S7{i&cjfDi-~O)nwRA(H z{6$<}^ZA3%!+k!IK91f5=X1;S=c{n0Z{{zh{{EZs$Lq;O{2n6KWBtL;_gv{hBSOnBV!nZ6D!*M`^mcsj*J|`!y3_k+ z^m7~2ll_y>+xCgQpOewM7N2V-k$2Yz_b)>Ed`pOr^WE`s`q$tSmcL>Gdb=DXb}!zR z>o#bI=U#N7`s=m&=y*XcVHzM0iv%w(pV4U&d?uYoUiYB3>wZo5{U?{p(BEsBsQub; zzlJW8jYsiy4=Enq_tUP`_CIX5DQwrlr9^*>qrQ^NLZ+HHJ9tIPH& zOEVbH=`97ASDw0m-6ZsMU^k34S{j@J#5f`lGyJosJ=j+CCOheaI#|72w99-GjmCoq8^Xtg|O`7ifKcuB-88jaKhj=^NYLS{ba6 z(lzy8RF2{2A)ej;BJJV1v#&?P(9c6wa)l<-D)jR=(*0hG%0j03duYuN0(sP*L@2;$ zuid||X6^a;kjh&D&3==j=FdLSnWgIw`GcbA6O3iwQ7b&F{YpQ|@z>9(xIIa4H~nq3 za&6S7Ywnrcp9G}S*ZnETDM3N0RxJ?_`MbbTO#Bo7Ue%1ECL}{g zlpohzJ@NSD{sHQJqvA*Sq=t@-kFtLEi`>t0zM%Xp;I)}>&hM(-Fu9-^m-oELFQ3n) z_e%xxxV=PuzjAeTp5*hW@chrgAm8_I!}0g9tka{OcS^m zmihgkeqPeY72lV1xSYNvC;hSa;!1^GT7TNs&+xGw3_rS+;k}zR?6rI1`wEX*oOtyW z-mh_|uip#f=Qq=P4_G~iGC1hHe|H4siW2vIX4uj2{u19`4Cy-}eDQnA(|bvm^j^|6 zgxf4|;r_GpbKw%)*Y_%AOz1b@9&5DU7v9Swb{tb8%-@d$_cP&K>G2>AIeFpDReAI8 zYo+$Rd4Df5E$me~$UVBGOJTQ$A)dekbjeG*sP}Wd41Y}2{X{Z{?et#D zFf~6DcmO_K!SsCYDjpmvlEpf^O_ejWVGC@p665MY|Lq?VtX#@zVO``$%rr-F~6nzmof-DjQhH-xtlk zzv zHkp62QP#UeTu#7`K-m5yY7=^GA>1_|o~u8at(@EU<{K=3kLhcfah#V>zx+nVE9OU3 zu45c@_!+Dt-p081$NQNKu>XmDpR_`BqDE^E^p$^6`{O^P6*L&$8QtA)S$&jxZ1?6@ zxQwQHJ0g5Y>|XuE-c$DW8%=@T-*bP#@$`0lpRmE?wPN&1Kl(iFhShV;yVnl+nlL)m<0S?~PXwF2hso0{ELgK)V4ufEs;W zGH3HJf6vnSmOe&0`ndwP2dRB$7yNuJ=sEBl`@NCvX6GM9Sl;R9bZ*{DILD{a)=OPg_gU5O+^#7m3@ksbtkaW=F)BnM70`M6gW*^d;`6KMlWb>1CHS+PXrPXoF z?TUXl7f?g@e`#T%)|0RM9P4c> zDxD{_`!M$X@?ReO%-?sF z?N=&#I(`5m8!tKt4}D{gZG5Qzq!t)w$4x%c!Yaxah$BzBdX2`@ix*nh!F*{SPcGV^ zVKU5n=G`tNtP`G6OX2Q$h3H&;@F@LR?Eu5C>yxQQ0MzZ#_AN!AJ zywldDlc5fcmlm~Xfn;c=(x7QGRZ>aFeu$xYMoA{F^)MJu>mbS+CQ3f294v zdjyKdd?_rCtdkRuk)wncBovSPnV+qf3_Y*;rA0-}SS$4^en#(P=orfje%kN-)5f-! z(fPQwcOmn=J?m%I?-JWTRlj|GCmRn;&i(x>$SpA5ZecRGknKOcRNMFSvAO820zrEU z`1W1}i_-PG^hdgSH_Mexe+mraJzO6^JLq@(IQv|M_7*rPi!5Nol zt>~fBb1viY9$0BPf1cG#z}kA#Hqt%bLj#r7|2P}&wD!|B@;BZCEQ5OYUc$Jbqxj;F zJnANAphPxJG3@aM<#tL-M3;hb%4vt?>gE7shIQgz=|n2;;|RSUUAOe*Co--%GgNBrN>B zqU0nde+`1}QTR1Rhf0Re0+r9?8ID&DpKhVtq?c>;*}Wy(g{-Kz^D3reJx}H7LB?gB zNbzvJb$#`FRyGNk>g^Emh2E(=u=|m(-z7urAM$}o)qav5NY{FvCcSX)i`L_IIIxE( zpA3=ioevnE&yX+h?=^pfeCyon`Q$6|7fKT3Z>fZx=3n7n6|@h1N50>CbH`)!uhPQ9 zv^&DaqU3K9Iw9O{Vdor)$dlQjK8uTZDLpA>VmFT~J)w`oM`Lm0M4|;^B|8p7qaD&WDZ8>rHQm zAF_PYmto>1>#_#_faUjF{CPbBOVas1<LL8ovlxy zo|&JsK??ZTI(-PgN#PGGUX}dF1lUIO~kKDgkO`de~~aQ z&&l8dt;f%6`TRB)(cf`-u7&gR*}UBDPtVyZp3IwwZ&p8~LilKO@N!9+{qpur4YPSY z`u~4j5zL!ye8Rl%f7h(P!b6Pd&dI!06hxkUUA^)P@YB9l)w7&xx5%iZPYu!!3V-3* z`MehGf8j?bSid!S$k#2@b`q1v*yPObsq=YcdZU6xem?@zA%E$OkXBi@Up-&xm7m(K z@x1HESy42E=3b1N487@E>^B z+Oa?RH`p=hxI7c-!2$Wc49cM&{(UCb3%}3B=~J@xR;Q2OFXQphzAK%LE@=1om~nvg z3+aUZO-?83NeDk*;b||hPYe80+dm5J|AJG{t!omx?H9T^9ZC;_dXO_2IOXyF`Z}GT zw?rIIX&$ht($n>|c0DU!&-no4QqauyGvei1e9Zcl_HPB#ONH$!ANe}YE3p2Ad_Qj! z(h2eh`6yw3bb#`flqp|%ITwg086431(s>w-gpLh# z?{v&XEn2QxAM1CxT*UcXmLJ?7N_isw(xEC( zBjfaNhroq;2>OP4_^L_dsXLIT)Z}TLTx9n0X6?vJXD>s6SzQ;iQ2b}ynBm24I?b?L?@%_wD-cM#f za}o6o?E>GDeW%0kTdTzzampR-`*^vl?Zv*wgFSf0qxZ*W`Z1%U|x*k9Y;k{TJk14fs(z51Vxgxj*qEC!2>=<(_`a z|2c9$JPEzN^Dk9B~>0|Ks;fXY;M1s!78&E%3cX;M-8PhpIo$XOuEl+ z07pM{SLSbzoo~|*5A7W1N1QhSzf;YR!u8dI;=cir^mfk2LO*qL&HSjpW`4A35`OP)0>P=i{es^KO%E2oKo%S+*5f>EG$JUW97jpeHu7?!_J?NOrdcKv%Dx{QO zL4IO>(So?mJFq^D7L!53V|^Pv_x&$_-*1z!2Q_pql|S-ezfa56?oU3!d|Btv_EDdf zoA2rDFVeOAKGFm0?bs*Xp{j@RedBbe_p}oj+yjC*(xw+QM>vo+{Z#efE9Z#Li;?eu02?E+;(pfs68U zyM^AKpG#UR@Jinn!uxyl>FwO#^L-MRCts)UH27q2RfhLMsUjJm-GclqmH(YZ`6Ewy zFZWA*A2!>cmOPa6?@{=EZM@IuZ1NeGxxeXplbydPbDtCG;8#4vea`IMMVb4GUM_x` z`;OUuyv?WM!QELuw4P_U-`IJ%REl~Bxj*Xq6YuB#Y3(_pc$nh_`ls~_a^KYVxzmfe zPnqqjn_R{FxZewYLT=*$?gxX8%Kr}eAx}Kaec-JAa=+s3`{MBk_n9G|+WtQ7Gj~47 z@_zm;)4OdPezn|f2_9PzQzCO@b ze1~?Ceo_ukJn(Ui$K^*f%*NfPDZlZE?f?6EfMN18DRW#X)wO6nr5jMY=)*Ae;f@=G zKpOARdi!pWj>)6@rqY)?ZqTUQ3t;2h9*#GeoRpXk`9RH`s~C6sg02fB34Bn!d)VNO zp4*+S5^DLYneY1Bc`M^-i!el)z5r`7RXP1tA>7F6!q%5tvRw@PuMOf>g|>aw(lk7kludjk86GI zZ~8tC{KB#O_Zt*1z-d2T2K!#K7EV0hy6ZUB8OR9Wi+&+U5{SO`oVw8em3x}op-)n=-}&v)p=Bd_IIw_d*33zCYqnLzhUzE zsLMa*QGciS)6a=x>PP0+#?U6%A^IV4On*||pHe?0j@=)pKNQEd{##gM`R*svuZm;$ z*Uj&YdA=|$&<~5_qP0gqEsoJUw12?rqn(lW#4Jua$UKVicVjdWI~Thjz1!g2kKSc* z_q+Qo-mK+h|JUNLxA<0z%YY}3$dScG@ie}{;;_od@31)STUuCWar)EQ{2_M#dzIzW z&-QcdaZJZa<~^3reUEIOl5k*;w{kuZ$MpN-yP+l0{~f|ud9w5KLZ;b>+jyAlU#Ru^ zI9eS)Bef67zBSAjc~pDK?p6KsviXscujBU~ZBF{nbiaQm86Z89GW+3vOeeb|ej)qs zen(R4&yxL8@AHa}j6)ORm6XW`_k)rl@(JUm;z#mJd*o-ey&YM73TN#lgZ)ewa-!?W z$S%f(7z($5{SD_gN++73>N($s2$%UE6ie~*N$0gfKlL9LIsJ_O<$(+@)SKA3cK7?_ zeZaB#cHXiR$jP%-{-a)}r+@Eot;hk>$)}7D<-=Kh+TX#wj7$HuzZ6%g@7WAa`%AHn z?s)9IlpE`pzlVCqvfDHrc1`|CKaOa5f8QJFcwBBUpDIdxoL_GSD_wt&*5~t*O#%z} z?G|=!l^^nC=VIqD?&sg#?+WKxV5R%}@IQ(Y&(4Wj|K$Fhj2;UmKb(gxMfq0wBTstq z&k;YV2XusA0(hTa#bwe7atgY}gFjDrlQYL79(+%h4m!vCQjPn$)pXgM`Ph8%T!D&DCZ`QcW zef-S3nJ;pu?GBlIx!tgJhxnOzEL?e8R2^qvfWEu`91l@G-S33FtNcF5dg4LKRjJM9 z>yliQ|E`zWe1>j<*i*`j>(w~DH9V3*%1bscGka1&{U_V+T&4x>-p59;y)#9Hj3?gHR-Y=#BX}D!llcewYZJ@%MM%I`~v$P zZ#><`{bdI%pMsn&8?iY1lP(*uxZ%Hy^YVDQFjSs&*>20vS$vnq)7zh8`epRn;_2qk z`T6nbBKTUKb|aonI;G1f*YPy-JEn60PnT`Bc8uQ3XeZ+7&Y!~`m6cG3)3ncV$ z9eRrN?H2mFXkzaNpd2tt_OYM7PLz~M2js()B*UZ=@KODySc!a-o`8eo_<7rLev+ME z&DtAWqx5pSp6n-Ip{H7p-R}T+rAI84%j55PCuPcs*XRC7^2}DP*Xfy*cQEetm|e~6 zzdwo?@!(A9m~Zq*%7-=X-*a9o=YO`tU{s-w&g!V{1^NJeA^A|8&a5=--Z5ozZ zEZoWTQcSqCx2XAP9qUPNAYOj|Rk~cWv-PiDljn`~7wL^A8|6GJP}^8PPuE-W_19>D zeEllzf$!VkJo#NU=gA=|x#&@a-&lW{ey@3BeXE|Z&(~k8=gsr=Z`JQlHwaN6FQ;?= z$eX`z&Vs-n6nTaP$NeM4;5>3Jq9NE=|2nNVU%y;W`sVB3qPz(4{zeVnki1;9P5z?a zuhsRJeEkZ&X&_&JoqlODEdS9Od|I^p?OGoF6cpt?theg))>D07LkB0bV(s0ixcw>pd{}`WqwgCxrj^G4PADe((hz z#Od&5eb6891)>eU90>RVJt@jPCb{T(tv_skLrrgm^U7)B{h|@1F?a zK3M}dPvIbCW9$1$4IE4p4 zA<|)YnjhC_@N&ZTM}~Yrn_jdI3j?_8Baf^?RpQ6E!k9+QQ*1 z^84`MFM^VHEhk)OFGFYtQ1CgyX+rW2rYAmr*u6h~&b;wj=KDR6STDIklF%MJZJ(!&-Y_2S zO_JpIvsIv6^1x36sWLx#-*JwIZy~@a#YNtyw)CF`7o({0It`)<2qI7842G42q0d+S zd_V9jN|wJzJo<>iuQPb57WqDp&HTkx)qF@8_$ZF!hrj| zu37x!ih$pfm|&tJkMkv2XLzq+eW~$3xmm%Y#)lcYd~O%ID*vS#tOyU$sM`A zG?<;LJZ0sLzwNC@s23(LDGa1M{@wW0?wj!MWVu}WeTw7k+C{~Q?b>VE0smgB+r7pX z!{=FwT5hmJ-08r}MbC z(d?GpU+e2le*WLbj|L$-<`e$@gr9Hs^DM}R9Q!(i+mZ0zxW9UJb-V-~SjkA+I6sAd z^PAs*XTc|J<2<%h7*+aUUbSFOkYC{ZEbQMX@GG!CfREnhwMjb#&hJ9_y$a9yU*&1S zHe4WnqNIo4i^V#c_Xl{cx!NWtQUrdABv1`%GuRdsrFX1D)rjD((%pcFoXDq^mIM=L(_w6C)5L$o9sPB*Uw}d z4T9@~p9_v>TX}20cZNt^LZc zC{OZrCJ!y-Q8Jryl*|ToqUaaoKj7V7fZj)g_vS$F1@eA`%cb9gfO7+Q4vIMerIWcD zjoi*SUd=Z#-PiAz2!3eV@0*@=0}UM7{RhDx&=TC&E@yV}pxr-}a{=DI>aXUo{|U*d z_mxKd%m7{Tij~j@Mo}KWC$afz#(_5;yjKSN+x@);k|*+e6#TwMv};*P_x9Ja;)9Zo z@}WKZqm$s9?m?@x4+xVM%1K(Vanj_&?=#OuTz8Id1GKcWhGFAEhOwTekaQo%pR|1I zXX!e|lLr~5*3aZYle6nch~z;MGQAF7jo|g5;brSwr3+d#9dZW#H3%_;Px3t+uCH~$ zK*}Tgt;)l6C+m}aOvY{e@&3D>xL@M;lBcU_zmqwJ&uSZo<`};I9q(JTxyZ*y_mdg~ z4E)H}!R)@u#O~jmC3h;~ft~;^r=tz}%leb2IUaQ1_Fcu>>EeET_ie-vYtsI{-jeV|NUYgL;vhY75{$PhrwMM z*2=r<*Eo99{Eiv#F$DN~LdgvBBiY7qrr7CMeX8*=VxPSJkKQy(-u1%+d}#MD>lOQD z`-OnN`?Ht45osU#)#-oQz4*U~=Qi450bFST2I#$jt_AY_W|-#=4m;UM-?ff+5HbWIpqg{ke=|r0e{&1vr9lv z+c!!E4-ntj$5W0w?)PQmYj!@6b~%X^4VecV*76wVL%R9B>qrmjTWDts>b zO_m#HuTL$n-_ZKbqr4`!JO=7CjxIQGI`aD6KbzYJ_|_|y|KvpSdSuzJ&e8g|F8b%vzX?94K=Gp**Y+Bq7(55mvU_#PWG+KjGEq zKt3_=$K&?a?W^0w^-u#5K81Mf<>pOqr{RLnC_E$i||94~g ziPIVH|LO~0xeoAu^1qT_n`pfM;oo}bpOD}4(@XZ8Y`kCg{{MIgaB{NwnR7Ybe;V{W z2jhK6H#pM&}Asx;{USBhzyq?-W{n&)^diMV5o^vR#81LWygYjPX z8EVJ-ThEbPkD>Q@81H}U;QJK$P>djG0(X?K6<9LZ-$x6tl} z^a<^5NSDy=hIBX+yZg=w<@MBd_gj}t%p69?%2#vy|5-Ut)QE|9O_zS8d(+8<3l?ed#^do{qdO{iPf41ND1cia`{r1V^^{v12rB9)r`sXjd?p(_2t>;KyL%N0X8qz0} z*N`ruyoPi*6M6l_MHBf0r?#&hCzDrO*UsK6*|q>IijugfVMSLkxzD{u_D3q*UXgsR zXLQxcfiijg`@7hGEh28~);=G{y76C1dUalUjPu8xk|@u1@%ORQ4!^ce9;6}k{rn1> zi{4a34%YLDh<|U?*U7{47Dr|Mc_#LOUwA>^J(J*tnX(IDXF1?}2YLI_#Hy2SMjVkHPnRi1l<$<$6nE`?G!? z0P`Q<2PlMIE<4X)=b!R*@38fb#af|%&#ghKMSG6NeyLB}-=kpJJ+|8=3Sxs!UGg9o zVb50ll5@Stl*j4cvxaf-3+o*{H!$94{PA;V$d@iho{s)B$^&SGJqC~Tkl$~zbl~-) zfbEw*^7JfZxJd#?oS!ps{E`jKcYku$R$wRcCjX_0>Uz*L+aJV%MR~d#Y`t~0`GQ65iX>vhQ{uG@9b;Cf}xTbb|Q>C8tvG$9v#R^=x@mFFXz558|!>0r725-4A+ z-y!{g_c*?oJT*JK@C{GTT85yT@?{OGlOvB_!Fd$;g6-`y;ATeyXT!^ z95p_|`g)cy^zQ&~k|_Gq1EG+oYbxIx^zTW7F5rmUPd~4iew2FX?>p7%Z!*Aj!dgAg zMZDi988}KigU01a_Hli?aXI7J`ESXGYX6~yz7ClTAJOu6HtCjOlvq8mQ_xG)g0QCr zzi^(*_-#w^I9~?-X8LDvZl|_OKB~mN(?^5%bEGbJ z8Nbc`jN^BZK8D|xzFqJGzg<3S>9=;Lu*0XB_8aVHcV^1DZe8s)|Jx&3{H#NNO4b7GA~cOT!{R{|TZKO@9G22#Rx{ln5PhsSvMHaRDl3{W0( zQM>d&`eX0&$~`AapTyp$tvrleIoEUn`|aONhx~vFJ(VmzJM<%)xH8FJI7~)_7wg5o$_9c=KDEioQp7XC%7w8VU-Zzi! zyS(J0ub_Fcud8Se`!PDp5~_jTj)H;Vc@TF+Ux1R zt^M`$dysGBS02}5QRvssULxm)FW~!3iOyt1&ISJ68%tXOz46YwO0M^#W)HJ-DFS!r zUAO%l;Ci>+bz5aFenrt}o}qtF)9q!&`U86krxWkR;G|3EwFYl=8C_#>qeJ$72ZUZ8 z=ovWBY4yR6?cKIf@z}U2dDrMo3a0N5-n8-V1hHFh+j#frjZF9Vji6t58or}*30G0-3msNi-0*3f&Um_Pm&)OOsjnzWjaGlC z4@w`YN9kj7nDJqb)w`S_^he)=TD?Q-&FEwNN>^{C+%Kxa7v<+BYv1n+NbTMR=NsyM z1K@`XnC@;EED%lK%)@zSE2M5^j$q$^$t(D)OEdHfTEJ7Ek)vh{n^8 z4rrKD?(#i$%!~Ye|B}HweyC5!%bi+HFrWa!^*-!Ap*`(bOC4mrI<{`>oiehvU| zN-wkXevd@w7OQU_L%1vc8|D z^pJM&R4!+@UFI1|_afuyhthpF<39fd96(?P5O#h@{>bCwuAiG8?a<_Cv}oaChA!W3 z2S=TrH!&alQ+nRQIOwGGgtE#L@>%I={Q#e*Nxt8w5&C0ANrxOE^m`?I{_OQNTKg3Y z_VSGGW$1n%^ftKlhVIZ?*bb8D{c1kMWHDhOf($+e6H&gJ;3$ZpJF6r|=Wd^-h;R zlc&l22bbH%DOS&1hM69jJ;>y>R_`w}c<0Y@#xr>}x$*mYoZrY-dUN>G_n=j7Y}{z< zU_A~$x`**b!)F}7136WB4)}eE6wTfj?zei4UzuD>|BHZI!TkLahhcZRWPZ<8%+Kg! z^njgJeKx+so~d2DjqpBxxZTd=dV|&H^qU-eq>Q~un_@}rKg!8KZajn-cu_nc4JIBNYv z|CK&2H-SDNsn&1J^v2{G^%Vgp{YU8c`nmt$_Sf%6$n4E>0hVV{`E04?kLkDB+ff^L zvUXMyKJjOQvvHs>7c)*40 z0uBdyLezWuSkC>taGgO=i98+i>M`r*hEMH$`%M9!Sg-SSz@7)$PDc0Tj8D4$Ded98 z)9&9(_AuUa1H){c)A-gP@Jcr!j?!%r;X*l7x=E+T&}}8*njQX9#?h}abn|{mB}zAg z_x`yb4*gTQc|8&zL$@G3T&H-GrNeH6ZprZ2`Ac()^~dpTWqj27-}3_%)aD9835a%qV)EKiA_my!FPL1no&)XsgEWQ_z*NzSg|iQ{^P_I`9}3FD`sEIp<|#jOlWODt@%bi0o`ZlxnxT4G@n z!#KW7@rqj+mX=u9Wa;q?%V$_xVque|+j~~Ay$4ZRLI<$a#L(|Ek6T}B{kO1*VI1>* z&A63eX^DkRmL9*(+Gki=Vque|$99i+E5p(f3!5z6?-y^KW$jzo#4wIuZ}l@QEwQl4 z(&J{!XINTdVH3k#^xXFVa8T6ogoN4pk=adOmzmVwETX<7M#t3X=KKDs$x-6(tNDAE zv7(jTr;&?BiHE2yG{5~i%Ev*8qXl2*%Isq=%O{UpJuM7#(NAeT;eN_-v3Cc>9Kmv7 zKc!V{Rq`~)^JL&Sx~=QDv}{^WfA=&6*K~|iNR^+B| zE_?g!Z)Gcp<5_EXbxol?#D2nmR@=L;eFg1U*qy+AwupygyXWALk@e*Q+fub=z+M&(B4`FL_rqUcfkjn*$_XXiJ%NXE?n zS}R}}x6nQ%hx=0PO@FQ>Yw_~?R(zhFeYZ`@qr>R`wkxMZl?`kdR$Zz;;q$h3Fi0NE zBk*g!gn;q;PW-#+zRsDiLyw>b>y(~$-G7v9(d1~q@E7%C-5-7@QW5sh97M_e>{Z&f zi{+W-*i3um(M+*2y|UUy-2nYKj(|{ z0rw{$r$N9F<}c!TG`AlO#z*^I6|^sRX3$X<-OpM0xe7m5<$OzqC}+(y ztHLkJV`A@bLytc44UubMCgd4dB1|u)9A)#gfxSwv9+Q(~-+;#5udbb^`8=vi?m5Nd zcF5(>>+$)FuXBu>he^Mck3J7uq}Ay@3HX-H!>oV)K0oLx|8#$A4F7Imd8dcNqyJ<0 zXK>j(>?W3*X#TAHGrY#l!-DiN{Ihi6`J+;`)2|0e%Tuej@oc7JePXHn{6h;de&e~b zmESK&Rxn-#Out!y`4Bnlu8yuLd9 zrGNTAY`??t_o&dv$6wGLatZxupN(;t_A4jW6h(c%B(Z(6xpntNMM+Ou79cyCD@PbH zQ}Fvn4@%?k?E4B|e*yVnySt>_@Oz zHrivvi-2pRJ;pdZaHT1ern6t+cdG{kpX~k1!n4}nv_Lx@!W{zMu~Z@t=ydE#tmTpL zxhU22q@_bc(BoP8l~d_ve=w6d8+!cf!dC`8KBx3}ul7F|-J+p^z?ki zF^Pkpe^D=TKg{peNV{4t7adW+EiH6J!PjXr7UrURH686?26{GpJ@^XY>-&_iTeQEq z==E8@F|$9Le(!yS^!r`fZ?11thP2!IJ!mll>NoctwLwU-V0V^Ch;xlc0(*mT_;?V9 zoPB<7_5QT;p&#!#L;dKVL_cEHk6o%4;&+*Tyh{mlKKk+AGwjE}B>h;Y{TQ)+@H<(# zhz^n4kEC^-_A6bsL*erEo$Tij<8$kaVgrQl_#@AJ8H8p_m=srOJiU0Umh*ezuzrun z?2+WddM#FZ9Wr_y&`{2AYJb9U{jijW9zbIt=anmj9>dRCIes537tLe2 zCp5_Psk@%*g#LXs|NdIzV#39d_7`JM>t>P6?mlUH!FSC8oYc*MdMvlu&N;V53#)8qc~sSP|o2RFIO-* zmqh%pX{Fzk46~kOkoEih%9zgsljKG#_XP3E?pdj&|BXifCph2gZZ-PbdF$kfOSGcy z)*AY+HTpl!g^ccPc3x8OhpOg9mhpfetrF&wNgbyI&#nxJ~KtUWl8>*(=WXqmZ=Tv?t@rTz^Py8IP zuNT99;OQ$ISGyA4uX-Hw%@*eSJOlHnq9nop#yU%HndS0zD;3bseRo~BQrG#gzlbLK z9{U#SFDsbtr{G?|aGm*EXm1pEhW(JUU4Kei z!}0cz;l=gSQ?EkBJPYX+p59D)NSZMJL#@7WFr<|mPqQ+zU zKC8T!dD3>1A;ar#wqJRuipQ!kc&w|zV@(Ynt7`D*ARf=`P&~tVzxMmqYCCWEp(#-eJ^tN;WSIS*^^UtVAM1f&NPcRf@hTkg zoAr)gtbu!)aVa!Qe)Sc8Y#ja_;2Xj8yugnk9`xrKS+avZqFuRXMCnkqdq*^$7N}QM zySJBcq9;X^Yul~y@pf;QriXg_tmv(r7qNP`TDV~x+y>}-uT(A%2~ zV5DI#+N^khUOz1OoDKbxR|x&zru5hDioE}&@*ycxF8scVr0nv-aZSE6V*GuM{3&;6 z=;K^s--Gu1ZTy^)kB6Y^`*oZ+uH_IHk&|(Pdg}XsA^*01PvmA$(Nq82`S&x*za6x5 zgIhI}^=j>qfA=RDUZD7PzvBbM*S>F(3@^0w_Yn`bvvbYP4lHGU?h(z;Pjxymo-`4k z5KqVJpTAot-=U{H%-7j^ki8!o!XJ=+K@RWIejKuX9I$@y!h-X`k6$=LejJ~KA8p!? z=dB;dtsmc|T-kSIlHpZG_ud+Qtg-ZWj^)Q}1j}{WD4r@EK3` zJ+qox-seNv{6y>$L@nD7wfFJ;9*}H)@_-14Jbpi7Hb0T_nr`1Mb9wDvQQeOd zlO+3bKdx}0oYKE465q0B>wNxHa{9Jch@7^loKlf<(XW^soO`)CQ~zp%*s*YYbGcfm za<$p)*#-@(az%&9uk=;E*_&d z17rA*7Df#J15AGj>@Dp7+1T3)#^}urici&^?XbAx>-LfTsoKX~)*rWzyDjeaaj(TU zXb5}sfiu*bfl2fxuX;10{FV1DG|WY8FY)(1hbRZ#i#Z=l{Jqd2+K2ANhlv-Av^?28 zx!lo8 z%*(k#gkin?HT5Q1?=Gvi-|D5GmEmpr*d=>Gcz_pv<)S`qKdgUuP5pOj{d=wc-Bv%> zdoq8C=1k7<(m$OmZ&@yp`mx{ET65mJ73mGpaa$mRle}Dt1tk2TFE^xgqq=)W9 z7P$U~dUm{BtJXih?-|1H75ce-sf-X7?;{=-xsrP*H39uWyRog$lnU1?AG+$k%zD>9 z|KIqL-oBLK>JEk%FJ!oE6~lWM5buu`HH=%x2)y?PPWXH6)q4w<8r)oMrwTVm<5jqY z2KWE5cP8+a*5$oFVGP7*YgiI8N01YSC3AYY4cidYEkLm`_x6%O!o=9r3{y)CZO!2o z$(z?D1EOKn8bBb9+c{Zg&Qz;WP=cZfZbVUtD?vemTjSCiYt>Y}a-Zk<{hs%{IhnAD z+vju72j-vef8W>V|9>0S+RJ2MPwKP&at%kC8vAo1Hgf&_!(0RI!K=AC$(^LTDIy~( zm0U-l^C=IS+j0{0rCyl56L4`--?1=za;HFlxh<#wm$E>R3TTLU*_Y)e8{hcd+4?)wL z5tCelboTO7`)bqQjngx2{Y5Q{R-gPGiKwL><X)|v()2Hp{K|-aIEnOVIV)d5)!*R@4{v~3^>`^^`RQ{0P zC6eD6QLmut_0Q{x)&ncgX0@&TFyiO=cRsR5^pPIbZxVZ2Pt}Rn({KX$p#Ew-2n)z3 z&(BNK-$eQ(9$N48-nsg7{zdYS{B}q^weo%~c-PR9*^jD!0=4}=p!R>;)Lh|VaGLpF zK>m3>$xVEV_7JYDr%;ZQ-++Gp>ok7|>J-E4?ts0i|7-eD_Y(ORd7k_O@*Ma8 z@;5j2@6;cmz3-EU!Nu|E17*!VSYCi+^n@OZ{Aj7P{99lz>7$-_4D2lKV$_;tVR zn?xK}%g3+ezLuVExLlFWZ?1plA$Cr#J@4$58cU4p-}SnGVZOuaRotJcCHZOo%73ZO z!}MRUs=1RePzL?zH+G1g^-Ha4s{Jzh5%1^D=lHwx_|wfiNG~A%1=MHRzalSMJRuq}pY6(i5%$K>9xsu6v;6S>z0sm4 z_iNDZg6zBDe|6E+9g+=}&fTzgY5TkAAKHC5f&L&)H=3!v)1vM)yo@;2@u*4E^Dzv^ z?<8I!{;T=g=x5#cxb+aQww0pPaFSq^HTK-bEfa_{mK4Y?9TEX)2Ec(r_y=Ng>Y9sPJ4d% zd-+id-tm#|aK!#uJjRu>tl( z-X!+l!kfVOq~&PgZE<^5@NW|1lcvYg%lwP;ljZK|yF%if5id0VRXv~akFvAoU$Wh6 zzo`A;|2<0NVG5|dV>eW+ zS)Xb=Tn6;dk8Y#%{BkE|Mq=^7qY%- z{mY0yS5WnPg_Ws0MOXa4%9QwBW4Cvh*q11#T)wwF{GQX^Yz|c(E+c=Pa)R2{G`!8! z@^E#%uQp!7dhPF*m$zq+f4O`AZb@b8ugrh#*EN4mIrT>4UEP?+cs%bE!;F|{zQ}So zmRI)nbEmjh^PUFz$5fo_Yx%aWnV&4K8@Dl^SulOIKfT8O`f(of8I1G0ve++BccY2= z;_d5Jsb-q4Xo&4@2<_r^C#+ue`+pONX|P}OgRlETs)JXmapcA`d1#$OXXa-mhT=^rrvJ$wH{{Vui8ym z_?Nez{o;@2!wVbCdffiB{}m$}hxHwwpfQ?)$bENj+X=|SUQ2=!0(KP%zy;y#wL zPBFZ`YWm*ztx|o8_r3bjFDJ{tcZ2a|hsfi}c^Jo+UQ;Vmuh(Q-|2+C&$^Tm=Um8?j zDq~Zky=gtJO!UthubKzex;uvM+REJh@|aS;ZsoPX{$g*LyPuZ1+bEvXW$soUqr1T} zci(x8?&izfeLdk$%TNBZc7OT5V_u>4&ew}kKl&-nhoyu+-k&AQvwR?Pmz_j)s0s z{oWA!y`jh6?|nwjoep+>uH%rF(-XaavNh3Oe&hWM$2YByUzGBG-2Dspxsvs3V1xeU zuAgcDGRXdA0IJVJ*+rE1yCL@#O7qC0tY6f9zl_A!znkFu6*|8DK--ZHlJfI=1*hy5 z1G1|A-9n!i{n=^9s`i@s?ndMExYSc`zdlZv<_oO1zeD5odtZgVh&QM;X6aU--V7j;k8(Z{vPl(+2(9iq2OhzE8A&dqZN}E7h}M zn~Rm^PlIHiKMjyaP4)W@kL7;d+id=pUC~XGqt`&P z&uA6ALLMeBlSjZ8E*XaxEKOZ+(Ax}+sI4gR`Tjkkx`)7ql-x@mA@`Ao$php;@*sJDJWTE*kC1!GqvS5~7`cO- zC%2J{$aua!u+(@1$XUGfWdh#Nn@4m4dw;t5%=F!_^lVH~3zElpTXT%4Nwo zLgqM@9Rbr_lpY3OTMvKM`8QMM-*lOO#WMf$^e?l4e~V@QEtL5;U*_K&{bT&wdo8~@ zEAr-lXO+$>F<(htMq|yoLf>J~{lC|j?f)HpQgU69vVHQ>x}wTB>aT&mOcQLLm~OQBtIl&W5{}#_ zGuHXq+I_%!%ySDG8`@5O7pwYK3OO+Nv1!m zSuj=PQp|jZ#9#N#MPAYB?fDIeik!2WJ-N4F8p-vv*O$q%`trFGf4A#Pd3-0WzCeyB z`F=;Qwg<_VC%V3O+keB<;TYVp(huPrNV z7}RLWy>mbJej3u>y=>|C^D2$s*B8Zqrd!je;d%NtoX1RXJjr8x3HKpirN}(Dc&_%e>+x~CUijWM=U_Ph zl62bq+23VSdncWF%)7;D>aaVerlNGc&8tkm>(fW7{{4Ns8)SYI>%Z@Wm%dQ-pZ~z@ z9*KXfKlZxe@2P%xX5)(`{-&Qym(HKc=Ml+wzjPj^`>|SXS}(@`K+jRCFds{=vi@>@ zmR=#RS~!w!GUjb^J_NoN{dsK#`}cL_hxCR=qCSfpu=y7r1$R+9(&y_5Pgj&>yjmEa zcEqF7PG6JrZjZmm+vAIPmdY3Pq&&Z(H0n!I|Dm#dU9AV2Z&H+&Z(E*r2;^{u)&I|n zd96)!wVq?2Mas?ENv;67St(yK4|LZ*Ce zdYDZ4+w>rr^10~&GUa#EePqh_rhCbh|4nz1DIc8fAfp}2IXIc}#pzZu<&V?NWXdO} zo5;Ul{xy;*-<-~nU4FWr?DEwsEHA7Nqr^&6xT0gf)J(c=n>wsDnxR9U3%h>hR-k+L1=$GtaUsCQBn|-zS z3F{Z3U$VDi`62iD%%1FHGah}67y1kD=j47L%`-HgA-BcxevZWl{+7bQzNYlc7M{lE zH5MP}m+WDGRMtCjynkx;pkJ~#&3u5q`gfh#gMP{0D$@sjJ@0#k#;<+F+{gANQ}B=a zw~C!t%KvfykY7T4q!`|(;bg(F`|&Ecr@qE#PVB|*3pKHO?Z;#N@p|Zs=AB9V6B+2s z;B|jef2tATw7^{YE7+6p}y3h)YturE0gZ`wb2~*)cj`}-+t<6m#q9^|HeCD zKMQj|my4=Xh=-IjuaEObx>y>PP*J;Od&#-PK9|rbb}C2jPeL z4D3nR1M+{I{`@HYq1sJ%X{I~dVdiq5g(~t}>%U}0!kKQnPR9Of zkbNl``>R1VAY*?u$X-Uq{%VlTfeWj)-x{O`$UZORd}q7}^Xw4a=gARyjQn!)DESrS z5%Md^)0PiW7HW`Pr2Yc+p$6G|slQBps6qD2)Ssh1)FAsM>d#XjYLNY+=||PWrXN&) z0rraMmxDc@r@Ja^cR}`ZD|vzZ0dQdvoPIxfnS6`0&3A(I z&1B4HgY^5zDcXN8xrRJV#`#!~elr>8V{$*2JZI~wAbk@V=VL+oMl#OFg7gh!oR01)Y29}Ci>gn$F;HfT{cYoi_8P30w zYiR!s;K>o#Z~u2Ur~P-6t7!k9!4m_p-|`>EQ484jwPZhp?%zZADY}0nczhJ@vp<0Q zJuB9a`Tkart}uO_|LMF(&e?wD4?=DE8r1d&pz_{EQ2kYK|5u<6 z-Dj%2JBIv9FOt1}-%Bpi{LAE4@|VcoUU_e?&_weu(7c)adE;QO-vex<{sQe)k?$eb zlkX;H$e$(GkUv9SBHu+`Aw#ZD%AfoxnopDG$qQuMKl6Q}ApJ?2&(Zu7X3qc~u(s%%q-hoc;*S>*@Z(- z?{yZ6x?GiM)%vOum@B zLf%PUCHI1hDXR~1zou+nvVwWZKAgV={XaBLzCXDj2c*gKBs*Wq+4hT_gS>vT>`(Dr zB-*oV;RXETo)JWj#Z_g68w&mys99 zmy;LCFC{OL1M)KYGV%&JM_wflkW=gzUqY@T{}Z`}{Ey^%@;{I>Bi4QS#f#W8}Ay^W?XZi{!VEr^$QCGvqgu=g4E^dGbx< z1@evLMe+^gW%8SxSzgzZeI0ZiIYs-|l55DLWZ!>jBQJ3N&`O>sHvQsZND<+TQ_p-wAK^w0$yu)B@ z=BFH?r-qO>(WuzDm}sdSkII;EF0FBcEw7hMQ7yqxky7eWm$H)An}s`1aL z{cIKTBb|cUvWoJ5QUig1B>tSHQ#O1P~zug$GqO)LM?~NmWJ`4XI zbN=ix`$6?JP`gJ=joOEywhTfY8ZcGXSvF4kJJ3h75rDNlKxdr~la)21G z!_yyY{$RY1hA>Zv`Y}HU_rafNUA@}J@E&Wu!aM3g^=;-Z=$K$gnv+y2D0FjxD7Vn5o8`**Vc@KZGrxxf`u_uw9$$iZ2^DDR<~zN}MN zuDFLM=Q3p6!%L0_Iv$Fgp1DivLv9%N@{;^l?uwX+NWK@DoUn_OCUX z-YKw;H{m4uBTet+n{^y+M1MV=ftsj);{4&booo^hGv}sYmtaT!b5^ zoAZm<-MMAyID_dxwpo8}>1cvKvAa!W?waUslI{D6hPy%j#o<1$EZj4}@q3_0gKt1| z?VY7m^N}RXTb`bnN9sKTO=@N8$F`1^c^Ss8jJbvbI-I3W zsr{b$S6gw6&5LpkBc@+lf%SaYP%svGX!zUkW-|8;8?Gf|zcFmMhRppvz5{vesWKsx zpUrPYjlVBcVEiWFzUN4OUx@EH%R7=5ZqJdc)=%2JS=@&cO!p+>)pG{Fr^S4#t-$_; z-_NK_-Hm)}n6Vj9DLvCB*DJ(}RlV>8Y)_%i>p=x`X9Yo-W>}T9+<-UwPwn z;rq(96|?mJ{pSDd4$V#JKigNWT;uO8H$s25j%op_ioMfetCCF&Vg-zxwGQW zu)f&4jQY`!ecv$0{&#@=Zh-zad@1@@ncrK#Dc?bZ8lu1KtU$ixc1ITQ4hdH)L}$gg zaa7H9UH1~gYv($!h3miUoayIw51IYiiZ)X7?G-9F2QWWU@Y4L`Y0o>9KcoZ0;U zozE)OyC{u$m*;oH?{WLR1MSB(1wppn>YZ{%ILg)->pF4G{aW6ONRE@k5`L6LI~2KS z%V&{4$9_Jt0ryIEJWcH1zv_6AqfB98ksN2H#XnttKGA!U_a9kWkA~x2h!5vOnh%ns zRKWTYog@`Re%>#Ig;C4z(!E{IU(>#ig#0YMYu7>hzHaX#`?|iDjCH?;KPK~nUA!l( z>m!R#KiXr|zhL>EEbk`Gw?sZJ$hdFwkss>)+$Kw3=^oY_Ej>y1YTw^KRd+xClC}qg zQ(JMj*$>Cj-sQd4wdGeZW4lM)TNaNcVSP_ck`$lAsQ>poMep?t(jWFKg#q{1(kJil zkr&Cmq#i!r$L|#ujrf-z(TSpRK$S<*oUw z@konceW~0g%%ctWg*de8{30*$(sr%CQ;yWqlJer_PABgT`8%!kGOx|Q%B)zwP|NSF z>=5^>;?FFW!!~}e*&o{c9QZ5VSE>JEzgJX^_kGVOwMQ+tqeTCS^lLT0C;i$t8?;|T zK3Asx&g#i;qF;ISVSGDYS$ zJCM%t=C$_A?792O6uuKxUVkI5pZwkFXfwi-`#jc9_`CAn4x-Hn-}|9x2>q?rGo8rz zds@+6^wYB6VDXcFgZ)lCUXi_BdcTBmOzt0<`I>%1+e4zAdj3s)Qrju|o!W}iErNQF zLQ|ssy{nR?a;~FPoYS&*mkZhxoa?w*RZYDEV;!`7if% zSx=C^N%txCbN5*NOQ9Z(SFNp2W%WvH)jpN;bxoxFJpXDBL;X$Wj~G|Y24*dFN^a4@*YdAQ#4BlEz4Usl z@zLL5GX7{xXSp8M_q{c%XHQg9dF!|qYB;)r^xX)KUWE1$F+bHGZD%^Xsee63Asxy3 zmS=stZIjMdFfR`|FAR68YwbV!5DxFJ`@QOLC&NplJ%l^Wy4d%A2J`*!hz>LG^73_9 zG9ET>;CDaNUdF;j|CF?+?Mvo0)(@#YO{&~?G}e4wdmkMAmCWO@f0RW%S9@#kgO6GI zOn=RNaP&i}zxF;j`Xkj}dmkMAQZl|eZz=B|llQ@OUZ?F+>w(sjrAjRa@1GaZ?hD>O zFOa=|o+o?%JZG%&s!!}IY}9XiKC1osyRin5Xh?n{eaUppNjlcAqgLW_5HI3#@Np&S z{$Tl_>HWkXYI+fWc_+u>ulkZL@@@{+r~ZyYIDvJqpKHvXs+y zTtn|KTTq_i7S`Jqq|@C+oF{w#=I^Wc_Zv#*L);f&KO*0Yw0v-Pp5M8`u%$=pJJz=a z+$)j%A>+P?+=n3J-iF)*C-YuLx=6--2ssxd6ge z$oHnmxHlm0IgxQ6K-xbU^8V8P$&lxl`2`vB`O^N$qYS@|jC(y%x|NK3KXNWa#=Rif z2PWg*P?T;Y<6e=xdqu{*Bia8Y<6e^7Zzhj1{3H)Pz`k^YB_`#Dnn^llRg8F*5G8NcoeCG#?@3K8ln-8TU-2{K>dSBIQrU{SYaCGVXs!`IB+KL&~3w z`x;XIkZefsxoOaLx`Rt$_a@j#Qat+chXN__X(k^F>dJ&{u&KmV5NV}Xh>Q#^)W;#&s zg0#z7cUgG{X_vF^CA*w;ANl2UKR|Xl>p`;1Sr3z4&U%DANcW>;m$M!tyPS2N>~hvc zvddXdlU>ewhU{|Ib7YsZo+l45`~|YhSuc`Z&U%ULa@Naam$P0WyPWkZ+2yR!Zw6_X zvqrxfr27~?`rRPya@OdVgS5+8qu&nFE@zE?JxIHpHTwM^?Q+%_7lO3QS+`oh9i&~( zx{ch+@H@yaBzKYjmfTD3A@`C0hCD!i0eO(zO&%scpFBeDB9D@HkjKauk@MtEa*=!? zd7At@@(lR`@-lfld6nD&-d|(oCEvZV{>0@@f_~1g;(iAGg`BIh-{Cwc?x#3Uiu*Cn zqYCI>O7r`A3)lA-!a|1Ji}gaGk=#daB4^0xf25xyqkoeApN#&?#6VZz!|d312>Xg9=M6@^1#hxmj`YoyF73kd4TcmAiF$p7un^3d&w>j z+(&kK-~qDB0}qm29(b7S^1vhHK88O^c6s12vdaVK$u19EB)dHDG}+~WXUHxOJV$nU z;CXT{!(Sk~Jn$mf<$;&TE)Tp+{u{bqA-g>AD%s_MQ|upH9=M9^=QuTFmj|vVyF74) z?DD{kWS0kSBD*|rGuh>VTgfgD+(z#3@+Y59?jrvmaxeL>$$jMiO&%csFY+L{ojgo_ zE_sBEb12!5CjS-9$H>ni=gH@hi{!r~Pm|9j&ydd{FO$zEuaf;-teO3apPQlIlm3tP z(JxB>NJhUY^FU)=xBE}`4}AUU`)BLqVRaKp?d@B!c*NgD*#iBIzW#RqE?p-Ni+(z}uTXwYr28ov{=GYO zUvmWG2=|ly{OOV8VSPU)BT-X-Hp#rL9QY^1mzTN z%2)()PeDX-l{nbTr6}iG-EQd)x}OWRz0K69r4?$H?RSXnc8|ALv{TvFLjG`T?eWUF z#&U=_cChalAst__@IyZrx*qwc^}zB&+LWrkPp0z?{YBmAfBbvICHd9``1hFQ5r@ov zP#r?;9yB#-AAs7@2X$|+sik{_UC_^VK!0ix`9ry>ko$SMUv24N`MO-bpC3d#=Mecf zbKfcTOYK*tZiTWi`rCr?iuSTzA3*=@=WC^K{)OSN9$k>p>`mpK$9i-j z>rp4`Q8(-d?FYW0=uy+*x#`iQwjH7<^H~yWO@Hz|5qrAqDLT7*}{c6BA}JzBe(eHrYP+OOyTYvJExZeKsM`F7C#-%vODZtk8XGmrLS zKJWXhN%D^`ip&E<47CPu~H|)jk>gn$6GIuJ(AU~1ULpz>gyV-|! z6Z>~|nSV#oznyR&hvVl?lc=|`d!93u?9siXOMkJx(I3FlS5Z9|I)~ktMbG>4^;&^!fKFRu&FRM?dmgN`aD|}uN z`@{MWPL$QB-<5i?LAv95u~9lVtWSrb9&AvbDpQ-x+~q`b4HsL5^6-Mwb{czqsZ2qh zDcPTmN=KsWg!1n_yh7@Z&)ehgByzD3{SJKJvpl{X$EtkN`tMWxs^7o+S2@p&=dbbi zgE@W|rZJwUF<-`3z6`AK%dV-H zNSFGjKiS{oIt%%s^Gh88gX{|OOE{zUvdhRX;k9zWOQxUfr!`;XJlOQ*z75rxb@pbY z9VO*}e|e17#}`RxGEbQ>CBEOF<@7}5fM1ZPkA6-a-y7OnW9bjKa~?#wif}vTJ${ZK zZpVB_)}uBL3%6sQFu z?h)v`SL3VW$JeBMYUTc){wh=7NBI>D&AeXAkLl5Rwpr4YE7Y64&I%+TESzdA`y0sT z!dCJyxq&=L-b@|#xSFwqi17&4FF%qs;vywU47T-j|s(>!&^` zb3gab_Zxl}+s9sOA3H7Lm8rK_I^~@c=2wyI?Kw|Id-wH~?DtuI%K10V$H*h(JQ?dS z%?G`|wu|3wEy<}joBgOC<(w4P}FIPg7{C#^?$j${8W+KPJW@|*$N zNoDF>^FYJbA@qs#d$0RFDc2WTxoU0JcGk;s`1P0T6_2xA8#gG|f3k9IWVtp$ov1-Q za=D{2`QJ+JqK1^alzlFwdjoe`52Px^^Y(8g~apqIk2Kn?{%cm~pQ?IF& zDehx&o-6Mzn0`;gF676l?8nE^U-mShet7>Bo+g!Ce&GcA*Phe<#@zXSQDq98Y@asn zCi=e*-lO}wGj#XI@Nb;sc6Jrz$bHyyf8u?JM0?lqU)N_^qqW`t^Diq>FU}2`zsY_< z`(e2+WZ~+(BO^9sJY@bXV80`a{_9fq>s}9J+%z)JOcnaip)O;k%~4zWyLT zdQSVcnV0GhIGN8ck@(2G&ccuO%ppDn%wt533;KJfO-;J9dY34lX{Kxc11jf;`WH^1 z-X-1n`0)oamGSvSZG}v;?f0f-Z&JQXZ~8g*yYlV@>>a4Fex~*i?d4^z z$Z^NlUnTivw7Zi0GW(5KewqCTmP@iO#=KVURigfE?lb?rzlk>Yl3AZOcah;P+T1~| zLjQP#p^R@xN9nt9OmF~Sx~>^93(<>*p+0pG>hlLo4aZS# z(bggv^tot-HzSuY#?^Wb_Zw)_Fs@8N{%ID?HL?HL_Me)-U+4bgUKv|`e*C+< zzw%Eqb+1i*-^%;R+<&}FzSF4Vm@H3Zy@PU-_baS?qImzY$;v_QJ(#}i3zJc=!tEI{ z>XGbMl2MOjzmhyi_f=%nTiLH9kI;Pehni5i*Fat&50ID1UF0QlFL{yNMqVIykmub# z#72tz^h+gxj0RJm1^i=;lmchKznq%A1USQOeuh(|#3s znw%ofkXNmPlYKz)3OP?+CKt&|}tS`;vIdT)rbCKLg_Y35D_n%xtUM5$OSI8+c=Q%@| zU+Vc$oAe7le~!;DLhBY&vo}J0hOd{d1OGmsTO9I?(!Rp))49caWG(RfFs@!DbFA9b zPOB)DDV)#zCiZQgtaFR&mVdM77BBrhDc3eDSDRkSxy609j{HrO>yveEvBS!>5%C^x zg6jK+|Nq<~KDRr~@~MmY)NAT*>)aw7$2g_)>F&Fe=N3)Yzl4wZ++rGXK#Be6@^gzT zey;5v;l23qUh_YBzVOKB7w|uN63;JQWbyI+tFr`UvM2wN{Us>8_RT#^CO^e0~x2&scn- z$8l~k`jy9aZt;^pD9tZ^^>d57)!Wj!1?pMp+@eTxKereo`?DaNjEz*K6GO%JG~>_78rh^|f?v zf%{&$f}dNY7@nV7RFVDMqK53}7WHI5x5$va9W|1Q~jJa!t+0Crk^`UYpeE`T!(Rf5uaC3p3C2fT7Nzvovr*Le=q*g z&MSC+vO|tTw7|7r|Af{Hz84!#VZB((`$%#=X8GdpZK!>@?)7lVe1YagOaBgeY{>nU zZY@>I_o}2`(jM%`=Ojn=iY>(BKJ_=YKS%orU+TH#S0~>Y)OhHxbYGeM&yjtmFXw4! z7e{s&tNjb*uaf_Z^dG94Z(U=)WacUlC(kLC(mR>5_5H14_shxnQvN!sE}4ISjrj_~ zYlo`-o|g=7a+T&-zpMGar29$ii`*(gYzLD12e6+JwZmNY3lTqY|GK2TN$g8R?I>UM z|6&P0YKMNUys4zWa1#3&t}p4aaZl|R*Z7Bh5Ph#sj?_}o9Vv^iFggu9Q9nyTg6=N zHJN^#Z~I1QkM^s<8n3pbfB8|^t493PTqSp+YUs!Q<;Q3b`f6|68h`RMhpOg3S(C0J z&7rEfZvDjhou4*yP0#g7cl&1GZZE^{2dljwt+6);_fjr0T$TJiFi-dNU(9!jx!g-L z{WyIG7HALp+J3$z{zrSEuk}|sj&E@h?s;AuPA$QGH~rZIbAOL7uCG(eW^YytL4Mj^ z?pJ@kK2NT|pLW<&^XoJo?a=rBUix9$qkX=Aqy5u!#NXIIzLy@Hseds0qYlJVJB4}HncKTYZv zGtigx&aKIhM$?bl>7SUtGU;xz3GSr4ULpF?UT~aG2b$rY`q3VSBjLX<8BVbk_V%zG ztHE0CpI&3H4dF>x&r8N5-vRg4C38JGj;f&_$0y%Kd(hW>yfW#3zL(}u)jV1gP9M#o zs`;O+F&}_=zlQ@>dy;jfdXXPAd)kf`li}|hrhBMr{< zkM`T^WBXUH@h=a3iCmAwFKP$J{!A9(5A~&Af_H^$%!#{CHeU5L^PUOE*J{HDcKiz8WQRH=O9E|T9XPcqFSt^qJ z!dlM9{eCdz-9o?r=kgf!w0AV-Z8GnJzx!%Tjp`cVpWhRy%a9jo?(P=I^ly9_>2djm zx;D6Txs1A2GU6N6>8L32ZZIVk)ir@#E~BnXvqR>kln1NpAhUm|Ya?@>Ro6=Pcv*Ie zdyjV&&6hmhWTZc;s|PnQKK^bD?`g&F%y@dzD4+0nP2~|H;$Pqa#iSW>qg0#$47O8j34ItQ61$93Rnk3b$v9)Iw7j-C1afw)KRX3>!qNM zavfYZ1$C6`;P-igx>35vIx486TnE2<6x30!gX^lGj&dD^D(jzvI?8o$ofXtkuA@*- zbINsa-4)bPu7m5Zpl*cWH_<-jI{00!ppJ4KT$crPlV`dhE03V=>sB5?-RG%~b{o_^ME%cEALDXRw?zE~>epC%2fb^AX_|0wm}NBt`5-$DKNQon=xbJU-v{uuRV zssA48cTxW%)PFbi2dV#I>i;YC`>20A_1{JP8tQ+D`tPLvBJ<&c)c+UiH`4xX)IUJ| z6!mAQU!*?9pP)`hYLTO<+fV&^+W!Fc_fda=;l7{xQ`E;gHK@CV`jhTI+uzO9pP)X* zwV>{O)E{^MY5%>{FHnD#@tLN6-t?oBnrV*yR>ldpZ}F7zij46ws>>Mbd{zJO?`H&c zE9S548!>%mP0a1sTE>YL`sd@*D(!bMzAjhQM)%)fJilNbiM$o#|1s*{OnvMJ1$8cm zRiyiG(%u(oZ-DMUPW@Y`-^cJ>ZmXB>zeRgrqP=0d{{;2l@BY&LP2>)`|2FM?nfi0o z|0MN4K>b0wA9Md`@84+eUg{Sa{+-m<643D*`&~hu%aQfb{W9$>(q5kK=czwK{Sk)m za%YWn{~g-9kM>6C{!`Sy&GqTt<MOA z{$14n5cP|6?{aW?+JhXI^y{=Y&G0`%_qV$~-Mie}Al?5v?L9zyb9Db%>VKH}dAf(3 zT`U(^_aC(PHQHOGdwgdlsQU=@n;G5@X#YX#&(r=r)SoqdxyNAovmK@_-wzqF`POVB z*zdK6hd|yVY=FLh*D`9c?YmUy_apo}qr9ILwXB$bVI|~A!cCMTX&Ht7Cd!Sp41*76 zJkprw)o)t+9(eryE78{kRHk&-5bx|6A&$=Xb>K2m5z!qM@SYufNBj z_M~cx{Obzpi*QC*?tL3;{aSP1J-uZ5$#a0bra!$%f9I*rz}~ocCO^FgtM{MOzw-DV zC-NQ#dxt^uN9{k+d+#qlv?O;b`#p%)hVL%qY2Ih5^kd`>@+i5BJVx#{RrB$xqxGKd zaLkfq$=9lw9}wQfcNf(DF~a`-fTr_rmrLd7a>DYCtF`-NelN;Bk>okNzWb)-e(X2( zydLXMxkmzbY}b`3^!wr25~%#N-W>YCPae|0?|o6>`ePef^-p`hPog6G1b=Ou40ogY z_Dc!-_o=>pPWCKH-zD;M!QX!U(872!>c{*B_2a&8X#K$cg~*AN)sGP?@9=E)pHe^W zyX&FnsOH_@3*Xh#aJ$vx@ND* zGTO(?2JPc=YaesgF62ILS^GG_$~(8+lvH?u2>;11%2ptME|5Xj_`l))0!+N3><`IW zTh;z|j04UW^}AEr;*#~Kc#!zbUS-ZxvoD1jPGLT({r=8x+Ia@T884dJc}VNS+7zR` zn6H-lXUvO};f-l{Q}q8zs+^aFlbGjfIOl#H_uAFpu#jhXV+`*!gvWcO{(a*c;9cpy zO(Xi3-0shtNoPe`cF-lB?KA(aYPehf6_xM9$@z)xzl7Ek$vomv&L_o{=4kDq$X7jY z(qGuYdji$d@NdWJit0y0!>eY#V}(3IUM7!{m&jw}MRK0JK%OSglV`|t&Td7eB? zULY6Ai{w0ci9AMLCXbR=$Rp%c@-R8Y^beA&$OGgWav!;#+)K`oyU2~?4ssK@joeIb zCAX5B$!+8&atFDQ+(piid&%|WK5`9tfLui$B&W#3;11j)33u?m$k3|0`=Ql`PTmvg z9)Z5hMfDeT4R(^`F+i%#NA1yqk;m6MxtKV(7>3byl)n@Lblz2{*%D zw08jEoCGd~^DXpae$K;wE{?x6dW}yUf9(Y17Y%j6zm{I8%)d?vAMyVR;{RIMpGEYg zoim?ed7dh?^W$MJP7lX9f+2kx8|+>$b28_$#7qKr6qnU4y z(f_D>5&rSJHS6C)-iP>K)rR<=#`t5nOC833Hm<)<(cD6PRyEACe~#~Kk6C!W&W+Ad zTgm#2byIi-({Ucm4`aR6U1Y0gQvdabU1h0f{R>FP-W8}9nsKUAY^%-6)EkhFGwaPD zY|5CL+tvv6*;}EW&i8m*zHa3i?0pDo{}Rf#dJ$^(0@U_-sM$HF{7zH28~*w@6*8TV zT5nZ&M1B$Tw^Y8DBmUf%^89<$_SZg#{Aihn>iY?C`|F3lS2kI=zAxeDwvSrATg+K1 zIvZ-Kzjz`1J>l_|7GUlqmfu#E-|;NJ>=D>^+ME$+ zDX8tMEVmV?Ez71R=RYg*K5uvc<3jR1w_EM|r7OSCh}2eK01)|7+pmnWRi-cfiK(;u zEV?#7QU8+b^OW*Vm?z%_dfkuZU7%|R%^+#N`RB5qlC3d+OYZ_PyncjtDZiJd^E&Ce zWFGb>|cbDaR1D0Q5;fF{czqb|^zC+H?{2_8Z zc;AebXLvEf2@jxs9(zQ)Y52UewgL^--w9OxYO%2^jeV75yfyvF_Z;=T(d0WMD!qs_*{^Y$tt3S0B-?Mai{wL!*DEY4SU56lz=O0OZT%Z5L%>O}_ z=Ysj0E8J}1*H-+cNe;?>s)Zk6H!_I$k>PGH^?PL7#SeynP`e7|YE{148HeY}p}VP$&jMH&8;^XNEcY?!_97nP-?QEF9rCEV5%HLU zJWJG_Aun6~jJh!nid-uh{b@Lb{yFMyqJ5+%>TV`;T<>lrS6RHH?lv;&LDbzrUZ!~$ zndkf6z2sGz_Zf?vA=K(&sM$fN=>bzkj?C&qkjD2tWgnl6?|+IM9U0#T6?p^f06NhS&<7M zk6QTAP!;2`zIu*)GpPdyBtse2%+EeGkXkjDiQ2XBsb?7aomdbT6*~|USWUm)vWUn_jk-c8sNM2;Q-auX=zlrSa`FipS&95V` zlCLGFygrk?J>xsArS^>PwU*j5zS|nc?HS*1EwyKS$Fy zwL)#k`~~f!1?R;69;}R`n7_Ze%REZ@-=*`P3HYz_8mqE@@BM~`_htE{f%Ko8|8zm! zziR0%&4c_MwxZRu(mbRQ{S42`ot2QN42+N_T&%w%^ol%b(l<-Ex)e?tG(};J?7hf z+7merE62oo?AvOO>jsgNKzw)Bn*(_#$T(RK=5!sJm|rE=^&0LoWe+R)ebS{e`&Msu zm*QC~_M<)6FPHJp@=w0kyrMRue(ak|IZ_|{=JGuVidbyp?(!QSl`;9PGY|$JP+=5e^0!7 zIP!hFN~yT=3(rHnDw%WscLv?b{-e1&7aVdwKHRrp@hD$UcRq#woCWrz6Lo)XS-7mPaXL4ur@WUPPGX+)WVgpht!EtH zWPOft;x}E-Ck7DiWZ!Qo{8onF{A&uo2J?sw`a9W=GxN@hqRo2_wl6dy{l50^x2mF|E-?QqQ?E6B4@c)!dL+0j-D~Mj&I4@RPK?jJ(h(>3 zc~6&piqig6YRx?DcWGbuFv&BQ&#W}5zP0l~-A~ee%=21WAyNP*?&QsLC z^7wvN>czq2G@GQ{)czBd)BG!u<<)wp%-eh|!vOV3T#qn@{y*0j z>C*oH)zZ*+r4OEd-;YbS)5Z8=?n z*C%nmp_N^JQ48l6W#=aGyz^1!nSMUq`2^>ik2=0R%6#%s$LGoaKabRM4mX&Oh2`_d zjpk)nsV~ycNxjj2B>HvFANOpq*;*D^lwd*L{yPu+mvM6R#N`X$-VgPLxI+R}*r>MZFH&c<{F3%fPEz8hKXvy4?Ze z_%YCYBs`%%fB4Ia#Q2BwMSE)CzP}#vDhtQ`#jPle?|E74hWnA<{(batlj_RdfGvo) z&hsP+(m(6zyV$>s>l5BH>Dj{X=UvA9qdZE_mQ^d0cpo5Oz8(d&=Zya{^V&nO01FSn zy~)}`Zn7GaJLLHqtbPAoV{*!tXDZ4)gCUq#G@E&C1^unqZXADyqT;z^?l)DOO~$@i zSn+If%HrYaKehoC)aQ}46*lXqUN$UB){k-Wv6i`~VW_`IO9;F7D6j zI!N>3PsRVR*o$_(uglcR)JqYLf4_usF@B#%z8`7zD}HYx{(j*M^Ns7N?Q*pr1SE@9mEu`$2Q};&cAa_|h!e zad^(9#!+?_;huwmB0M)T{oG$(W$LcqUHKx`+r5WK%;F_hfPB;Bze`VuNVjNo4@i}DCf_+>dn=NCe3&K=nyUHorpMWS1~+Iwcipe!!!XKk-=L|Lshcbu9Y6kLv_j6FPEM+U!UA;lz1mxAZrashowkbNs(7{kyWq7>DEENB(7xB7c+o zbn^Y=rx^P^x@5fj%Hr+g{FIgBfVmI%^_eR3BJ;=JTgWwdK8=}vX9ec>VFSxEy^44= zWXz)Mr;#~N;C=J>J8QgW9yXvJc)5fPC~q&fu%VUyp&Y`7Hu562=h}QI)!$JI zFV}$gH{`pNLm;4~PgZwpeEBOI(6Zw8}hWu4>4f!kN z6!|_f&S7#5i{u&GH_kQOOP(WtnLJPa5_y6AMe-u~3uNp==Ndjw#{P7!;d5ljPvsgG z$g6aZcUGcw7t8BznzxZZOKv8AhTKTLi(F6sG`WiWDKh%|T*EwhnfY@kd6E1{@;vzy zl1IpQkO#?gwKk$ain zGvq$}KhjN9SF$*GRORgs`ktHJX6Zueb6M3H8 zOkNoYI$ivY->T5WG`WbASX81*#qdyHNX2^>)pCh9`4JYQw=ug9m1v2{6 zaAJ{+{?xy-8*D>=8cr1n9EX>dx5k}+Qp`ED}C6KTI>%rAUDEvUoz6Y_nOpbqm9f4?@Un`e5K z=zf{JO2+sm@(^UqcjR4NYhOVf#zQH8GUi88{$z}wQvPJjr=!BQ#fkUIR~^Zd?=lTE|#GX^bK7x{e^ z-|x`-rP{MZ?M3r9sXt))W2Ud`p(^81*qb!(?f&tKuG88_*17L6`-AKBn@qni_BUfZ zZ7lCJQyr!{K(*IY-50M>`&r~m)Pnp-uIFssm_@$&IwrY}Y7`4e`)#`3+a!DL;%{Z@ zO!*i44-%B@yZ*q!^?Zx{n=otfd1kHw<5|?QX!d8fl*||8&!}a7o&L1x&#coQHT~i` z{Q=V-GkuM(l}8K9BM~1fkCu^j?mNu=;5z*#)9;J@%@{8jM=f(yr>U}hT39|U1Jplw z`S^L3d{-RyvK^)-^Zy50e^_2Y8uj$ClvlOHQ|BLb|4||L!2SyUbDum{cn-PV)Lh{_ zat-+}$yMZY$tm(VWb_}o!r5f>A33&Dxi4k?Nv`l0G)MoFEBrZmk>-C!ULgM|8U0_b z@F!&Sf4M>n8U1Ij@N6>r&m8-eD2@KN^u47#{oh9WV`Tr{(kS^1nvalACl8bTdrO1l zQ)xZ`&Nmt7_TxKCxgx%=lska$D&-3Jo>Ff7k6>>i3w09TugOg{8V46iA<8d!4%$z! zO-Uu6DEo*^GWo+BSgo+lqgULe$J&T+{dDR_f?BhR5%FzW1CS=^m`gwbK-q&%2$Mgs24pV+@~($cP|G~UOmmLrmyZ{&Ug(%?P=zD ztW>j%SkUxoIQqWPlJr-#Pd#0oNw~Pr`*_pk{?#6uHGe`xHx-74sbjBU`WSAUzA9J@ z>7eHtrmu?iFl73!Vfx(Pr!sw%3+TCiZTjMLsc@bAJY9Y+9{wfV$MHUd_4r)GH$*X} zj%{MRMSD%TP<|!sK!kdl81Hi#?+(VhiSdTFsqkFJ`y!UhHpW{jNk;7WIl0%rPL_v` zI~tRy0UiZB|M7Zzuym>Y+Cvb2_*+hw=d-7;R=yIWDXC0-*VI`|Q&Q#c>Uw?F^lMJ* zJVAf8m6w~U`{oyQc6KU=QhCaDO*O{RzSYt>;OqsaojO^JHRsix|I|xA57zhkQo}IO zKmELY7S$vEPV;dr2Y=_(_t#H36&@?=uaocB%%Yo%&kJ@)J6x4^r}03~5BY;rjz$7? zzd_Th^MT$(I?Cf6yBIhCct4!T$ z=Cde{)Fq;7ktY37qqyFv;jsKKKh=-x4Ti(i?Ad0NI_^}cns55^caBbhc#*N{>$^Al zo5gUO+9CE2T3?PpMf3VHdzv}3db9bF>P-Xe>G#Jqhi9E7Sk2*Cc$*3X)PoSsEfsBt zyXaK(E9&0zTimHXy8hC9_k8Po3gnoQ`)p#>;&^s2e+l=GC%<1XtL^dEm*0by-@O*G-$s7-Jo*yR_P41hRzLr}??fH8-E!_WWKQ1=6dX;Wm=g+Fh|I2+1 z(+{_|t%x_`5B5jH?X6_&pN89U|5NUvTKvN8O*F^;X}GTc~{)zIaP zHSzLu|GYnq{lzjX6`loq@_wMDFUo*BE1z!uSISrNR40tzI~YVh91nYs>Oa2|w%%X# zOHbI}{fI}LAC>it?*oW$EY~*h_~I-1sXzbjTCNH6cKLp!`IBqfO7kXiBe@yjG-b%G z;L~*!5dT`*z!Qj1w8gY#Jo9*e@>h$u&!dJq5U;Zs?;*zfEXI3?@ji?39%8)D%2z%Ovq7$KZZgPM4{^1k$$Mf-Rh!5Ydk@q~2@8$J% zgLs9#h*wmdK|a=a`Qv?pT#c81isoMaRS2ghV;)HV1&-fitOpkmA78I@Zt{4)=2wgN zC5-nF<9)Q3KjVG0mp|iuw3k2QeKg}e^jPEV{liNT@A&?HFVl_q_&op}=dEAkJW^SI z;RNiL-t+YO@OSWc7aF9$cl2ofmHhF1eF6Nrw#veb&s7gMT=(v%&rjp{T@QP*ulo!A zE4PdJ+Oj}qzP2oqnXfHN#^J7vc@VWMlf6H{eZO#`%krxf@6Bvi*tZPhct5^;mG7q@ zyg2@IjGxEf)8p~?^mzP{o>KfhJsy9iXI=R{gYn0{VAMTr;YNFApbjA(;SDU;4f+e2 zw^_cd>o>ZK@F(s+G7RroR?cyF)&GyZcY&{~s`AIrEnEmyhY+}Fh*ob%fe^t7uM(o; zq(CJU#0b3-I%G@;fs{v^+gnObk0SvTW0@IJ6o^&F+?!xhd_@qAq9i^><70jX2gm66 z$oL{MKH@wyDkJ~(`0jJ|J?EaJ1$3DC&;1m3);asJ_F8MNz1G@~qwV?az&;Plk2`{P zLUQSuc2dGVC*$Aad6cwc{0iESCU|D|g09v5O6R?xYxMwN(6xF{V0SO%qIw80=vqB2 zaO#j7q+#}}-gp1~_cK7rD!Ru<+B>C25lcE1l8@z;CETkAK6e41df;;x@TmtrcLASz z;B!}6>Y@9K6ra0*Prc$Zb&k9y|4kjR2wr2rEBhhI$acwJ{K|?m)M)t=sXq<$C)@Rc zZ}o)o8TazV`jKp}^lKeFg_vbzBd+Sf4hZgt)&0rt@fdI6aX_8a`hKc%jZT~R6S=WsUz+v( zsWY@+N4{NC+dpQ$x^FeCMNwc3tb(009A;Bl$;+r#-Cj)O3sCVr4{G(JP?yHZcC8t0Dk z4S;{6^GCiBu=@A3eyi=8{ge3?z_4rceSpV1G6$)Br! z2jDWmLx9Us-yq;BzypAx_x@N21-upS=K%Kro)?(zUj@7X zxDD_k;8wsrXs-ou8gMh~=GzVrvnI0N*{V1AvtRN;6%d$(jbP(ADG)i-Os znS{}+FH-*=c=~#Eohmr{{uM^i#Nks0Z|FhS=+(`rpVmz{Ki&VT^&7p~rtkT@ozzGF z<1|$Uy~+Une7#DFRs41Ao0`Hra^zmkXX5=_AL}bO4SlwHR{5SzOGa`S8vsJGKbG%9MlOux#|kQ4S>~-qJ1-f%kjQhV2bkqZUO87 z?gOmro)izqIM;R2K+o#BDXj;~`&{++ArET*k%t22Px zfRC>G(mp5PGl};`uRZ|Sk^H&p4+Aa(JOQ{I^^F6r0z3@Z=+z;>y?8$exE1gKV53KG z1#I-_Er3;z=BoPv8$H?w*yzz-z#XW+2XGJI4!~)^ZGguCw+bBGk1>ho&GJ0ZtBnHN z`cd_21M2HXxs~U{uuR(f9~0uda8b$%wZZAF#R{F8&h9wTrym5@_9nXq@(M??s}b&+$*(xgI`>I z-ah4z2YsGNnmB{5vmSJPemy46@Gq*LRzXhShq=cc7=A7b1pU0-y~2mAAHN#_ta{qp zJqTC{?(H5D*!AOgIzC)K?%1dAG0zzJ%_L2nLG4X%59qT`$E*1ssqrTdxF0kRNI&)| z9@(?uhwcO3`2L5tPw~#4jehJKRy-TiQa-?6`)~Y@0Dlu_cmQ-)d7%4wwVoKdn|;T= z9K)XR_GtUwwLMz?y;@HoFGl`GwY?k#QR-YrDVO+A@66E@}34 zoTlyi<1G%q^EIC@&pw`tM}TKr2v5bs_3;Eh4u}0ytMz6M)Af&}vqSjd?Q7KjK@Ypl z;LoZ9#5WKAr%nBT0)2C}*1t#TY2q&jTfZMyAHz8F+gXElE|+$uUZ?Gw`=s3y73TG1 zo=1E;l>-8RId#wE{}Ug#lqo$oLN2zH1BP5|sR9hS*pgPdZA_zlox<1$MEAxB?Cp@( zPNu9H`075&srCAt?r+y}@W0*T%H+iXv%TbL4w?_L~n1W_B&H%>Z#FsHbd?Xx}Mj9uJ9kvQh9fw4~?EQ zenR$Wr9<{8rH`?1b4_a3=Jw629kFLl)7`V0Zko}wep*u67q9%So&?-1aIV_et1W{aD+uG-kE%ICmdRX)@G(g-Gj=MS!$i3Wlv@Bi40sW658x%heSnSM(hu19 zH3I?%e$gOc;};D9R=+6D9$wCFE@l6^BhykZ+hvm_?A@gE8tFfszmRA}h};&9SLOE2KyOZKx_eU7O%s}$d-Q$z8cciJMkX#a$fJ%@hYWS|DKd7%v)w%#cjlV z)}Z;kEvnx#tF$2Z$NU%{v+vKWr?7u2-#ddH=I;kRS_?+@gTlV7I)ci*L2KqJ%zDR^ zsvX&HNG6f|`28uz>cWSSM_IomS}}cI`0s%~{@lS=4Ys876X8o3FAs4*?hkLUH1}SR zA1nDyKd(DhX~5-4OynIuIi>0fdC_I|m(zQ89n3g5zN|d)TO!;P+F^5&-%o*0<~zqC zUx%!6IF7-1a6FR#AVdJXAU`E>f?ShJx%)T^G5@|@%&kI4wOG@ zV)*mj^Di6bUcJBl^M~2|nQeOCI(~j+?`eOAWfbiOk8XD?R|3xZwG3#6Vh zm9v5)Y0`ODO~I=rgAHnfnKCOiM%AUf6HDV87i2 z|6%vHB!BMOZ)&=FPEv2ntfrf0G&Sc0v5(lRSA1={H#5Bo=s)R`4u(en6SH`KyO{@g zd^J4I_wF=H{jBGC21`0kQo!tYcMFs9-mMMlp=zG;FkhH^QQcad-+129_n7Z0P>%4C z=QRquBW6CM0`zmSZ;;~~norB~d_w;SuNKYsKY*^ul5{;?@y9uWKRjJkj*`w}!oSYK z6_R$G-x_9 zt?4M_X`_(C3BG%x@E`1+YRFrhefx)?Pk9V|{zB+e1^Sf#k?5o6PLj?)OMAB75WPTy zOze=`ln>r&^{<(q=YEX#H@_Er+pl_u_Jc@0bWTV7Ze!0JX~uU!%iH$Msr2PcbDzMG zw`e<4YBoEmBhHfglFkpbzC7e30ll>het-Hb;kR~K{7wdbhbaAEzjva)-HD^=1g7J3 zC(foF;+(b%J-ZX%5dD=(?5CcvJv}Ka@;3bk`MboV?)c;@>pMwREvldKQKJ8TT_1JF zblsHgqE~Ot$!4|Aon1ZN8nw##c}r)mhuhk^?V497owrI&-H8f^XCB7uI7x4IUQB5! z@liRkl1lu2VlBZoUahol$9Nr2&lxXCExZ~9FOBE8V;Zk9_qA0~{?rpt{#>5Qae0=f zMf%=B(zywE)yX=0cj9K}WO~nd@XVM>JeGJVr8YjSZx|nT`WPQcEqqQ8e4uy6RPV6e z+PSm)s;)ImRkfeb={~QU|GvKanoe&GRY*Uk+eO`-SM%SmzA?8m>0Al?&KLWpJMo~L zCt|$##BwSzpWqs8{Ca8KlksEGVEiPt@T(B~G+yA2X*`14-PW~z2NiL4ba(Ca)^P2L z&-NW#ck3r8JU8#?7W_BdxU(neyc&33O8hdxM!1dFH01m!dd_r_)S}Bj3tlrCUmVl;E#t*Z$l;!K=Hmr7+;Ag3 za&~rJNpv|3?cXWil}ROjkx0?IRN{9DmJ7Rm{w@Z~O*DKxEd3D+90>Bk}^MXS8Myk4x)!OuC{F!I(2T#U7d8sxOr;-oz8knSw1*IV7EWJ zLi_hh`*Uc2)^GoM8a7<_&aKv5Z!$ltdyZFW%K-aELT3-fUeTKRiED zRnDbbuOYb(#R(q?Zy*~86S5ldWsP^kDy}Nze z1u~vqwPXA4r1L8D??;KVLhUW0Ju=Cpf0A15J^2x~2bR#@qEGMbJ6|RGbNlXY;(uU2 z`EV%d~?y=-?(uzBJK2H9_p2p`P&T9^OU@n%n6iMQ+c-WTuF|>>@)ZDc)K!pPN^h zM{?4B3)*j%l;^RX-Ir*++jm@L&m-OBm@yvYw_RfM;eu_uI{EqaTd$&V_Q41p%2&`U zR|+0g&}Zeo{$yol>y_=-TqgRhv$wa%j<(vrDCzuNr2RD7=lPb$x1`qizC_wb9DFS8 zw||4QuYnMz%l2)p(*E{qc97k}S{eS}4ZZTbJC`H=1oCO&b#BtRBZ5~e#(xFX!+1$* z;q~W&R~z(BtE4QS+lUMHypq|mbu;6#efvcu2iHd0=|DSia(J4w(}Q+8{C2LPfneK% z+ji#APD_y-p3|Ar@!7h4Ytq>gX}=%zuR%X0wfcFSv_Am;_e*N)*PE?)1<{eaTBOhB zG0x-cwMwa9_i?*py1$$GN&fPyxGu5_NX`%EKPBE^%^NgdZjSV4aRt3nChaXjuPyp| zjR&zU&pUD|Pu;oV`TFAR=c+t)?j(Mm7ioVO<2p_CvD`>%(R1lRwhzWJu7~|`-AQ&1 z6%jkgE3$*SMZa`j#dg;RI7< zz9a3-Ku)K9Io(DMw>=)VZ-c+|s_i!>ons^I%%Yt*d6|`V=FrZpq%1FFUI_l=#uv$p zHJBgy$;Zi;~UH`NiBYTM%wEE{W>JI<-f_2f3`2UJlhw$>H9TFM-LL&^KLW7 z8(Rk4o}^ZLACdN2Fy5La<^Elev+YN=)^t4h^DJdZI{zlm?e?b8UYs5GUgaCwo0gR2 zgZ*#Yj@w3#H&;&XdGS0S#7QnlI^U19KMVTS&>QZrq*j0LQGSBHvl06KWr)69p6PqB z(D&<+_J%S3d1m1DB(>TbkoLwg{)Z)H`gW24ab-D)I|TCwg+VXn=UqMBH`wz>W?Sw? ze%{-=eMi#yEdN+0INli~~k9$UMOJ-4lh{ucm` ztFPWle$oS6vW0bez!?` zOK5M=Z?8C>8}xf88CKi~k>i3Q`uAQXc-Q0of6^M)2r|{Kxqb>s1aQ|NWA(Jf62TC;g)^T#=neW{ku!wowKf zkMp{_E@H{Wbs8_ZbZ2LgUvJT8bJF?qNc+>! zQ@j(5+n3a8|KA^AJ7ETTYTDORJ2qT(6<4-{3|h}xpXnyUh@X>LQsif!cVjR7AfDG> z##xH!FpTl~C-j{0kkrEC`+~+3lCFFdjcA?N@>C z<&yGvq&Tb016y|&k4LhbWFE*-1{)8KQ*-BuPGpY@8659+#mCzP_#PckcPkjVH?M2A zexJ$4e~`wNeIMRWsXz92$}VNOB7Er|?K>Nnam6tI%>GfcKacs%tj^VIyo%v8=c`BD zir}K}!{dHQd;bFO_cZrQn)?CFzCAl1+aczjKAyi%q;^Vu7oNu@)BEXu7yeDZ4E9gb z`C93}=b!7J0Nf|3xo^)i`|$AH5A!`6^Zk(E+`i5e{(e5flSoAOv8!K9`)Ng9_&i20 z@w{vIfV5-tFZ`V^?l05hWC~H3?+Unud8x-cLFFU7@3oVICiLs3=(w(*zXaRk=A>#^>AHrBl-B%aIlt)-ev)z{O+ zBU^u@_oxNN^C+xWpM~}64?DVE{gB4Lim_f0TfEibq0S&w?sSXbVJb>#;{U(tHJ zb0n27h0nm*c0H${o>Q>y`#P-qJ}BR(EmeNJ2#@1YegoERKP>mYrVV)B>0!XAI0LjF;wE+&6fQT-o7{t@z}OZRu7h>sse{(|mvDbe4V zB0jti`SZH3qeT9;qWt$E|FFi5OXP1XqUU=geO_wv|$3q|=h$L8xRYWFp<`Pz!;w<$K?Tv5J_vH2E? z+HH=_H(A7wm&fKCD(WxqGATX&>x%N78k?`I2)~nK^Gz1@m#x&&?G6>ycU)|~zM}fr zYARjdQc*sRT9nRLR+LY5YpL-&S43y_>Ppu)Swz1hV)L~WJ}-@?PTr_Wt`>_8V$6i+wNp{r`~&&VlK$ai$uPPub>wf6BJMTe-elH6PpE zPmyEd7Fxwn$>#5uG?RFN*w1v|rNDOiGWJiX`@i^QfH&Xc!4&5D8t3XfAR_I=3g!-ThHK9PUR!s*`(@I|$}>cqB6( z_dm(!6!g3I=6l!KyxxDCtA0}3!S^RJviqkvF0erTWPk8e&(r$e@OAP}M%2Hd`(~tk zYE^~w%cc+eH%y=Z3ejgZ@H&R+Got>D@pn?>Z!mq5&Ob_r+}k8^48Qq&LjyfB_qLe( z@ceTRb?PT&R-GgT>Hboon~m2@s6SUqe`b{q_|AB0)#^xpCefe6|E-wc9JgmW|8|u7 zGp+UDyK;OkMEmn`;4`QE-8Ub>YdnP4YZ$Nn6TnN?iBhXx62WVT%1ymZs&|;)KMc{E z*e3Y>nDN^`4E%;9P0_AO#*g{SY3>BbCE^iDN9`O#$AjSqq4kspexz3Ec&2lyMg8aV zdlUwG%Bxboxo_2enEmklUihtQuqa*?9>0(C_{BIi<2Xb2pDO)X>Wbxh0Q@{A#7{%7 zY2oJ}=rsU(nfh*)`aIlIWXo3=uQz_C6kgi|FS?&MA_w8}kMj33#&z6B`^DH6_p68H z0po_{;j~cyjD8yB{*Cvdf4Z&}$m?FI*VTm17bycg#E0Ap5_tNV_>eh&WWGCM&eNK6 z!mRhxoWEM*4K}^zng951wf$V^P~cYR93(Mu7J7}Ua;9V@ROR|J-{*LV#;eWwX}UL3 z^tFjUneP;uco&`5$9s(fW%IoPy9L#=ISg@k6nc1rpkdKL+Y9KR?FDoIzmC#!=DXPD zdk$-BULh~ce4R?j5_ge&w-FzCT>cZqkj(jJ)-zw>b9^Hm%C|zBq&D4JAlGs8Qn$!; zE6TTMnnnMP0iQRaf5(8&o6x^wbewvdV)|#k;%S`f@$!qRSM%J!0aHZb9kQUh(N7I=BU;YkS2b^4!=*bU&=-!}odHYd;~d zIZvK+6wczl=9KJ0CpqcVezV?erax`Ffb9fh7ufRj-rw=}3DpkhEG%h%N7N3*FjF20xRfnF}YkL#&f?{uAThm_A%-YIF) z`6s0d5uNGo&ri1-zCJ4NZNAoF+|1IrVLo0hCS>BVwn%Td-_V0^Cp5`G>bCRZ3 ztrPjAeJo5)$9=mbj(aQ8TBK)cx^^SCPI`p&8Z*NGe%{-)efLaF+c)AnbZ^J_IaAa2 zjY~Q%s67ANyLFtI`{&v()pMz-LywpDc7MY3&Xk~cDf@Q@blx1IGjoLbzE9{pt8~G4 zlLLF=Yk~)TuT|tJptsV?#&0r2@1OH|Ph(dXCPD9Np|@Rb9Qeig8@CI76Toj=>mh%K zIgxZ85&Xjb1?y1~Z{I#;z0W`TE|v5nquY9@{NuupgRzgLUf*9?r}Z{XM#kGvh#p@N zdJJnn3PakD68_2n=n?0yTqX1v)Ozv*T95CqybJi~{urCieIa~4A^2dPEc5}NlOz1; z0X}hh_7cIT7x?r5pIYz-ehKLFTp3?HpYqS#&*6VpndGE_o|p1di42xs^p7GpUX#)} z;t#=&H}|K7{UNVuA|fv`zV8yW9ODP@`0N+@svTnHo#p(aHt=g>XuKauRdanWlKMKp zuQu?@_(vL-^qPhb7{BXF;@2qr_nL-E*K@1(lkxehspaO4sQ=f9{>Ax!j^NXb{xydB z2Ro=~a7DbPOX77R`Zcg(`6Jo?i=7Xn{i;I0Mi=135Q#W0MI;iw{iwk8rO~gdP`}m+ zLA|E_74iB#_bcL;s$M2PN6IHkW5?U=l~H?UTrKBcPjb8C!n=aU!Nhc-EY2sx|DxC z|24KZ9Pmry0d_gQpKv)l+!c9K|H;3P`#I=e%RP6aLKeC2hvk6z{L(KopEXWL`%lD= zOFFwC$CJtz-=Ed_E4c5*__KjLatl#^_A63P;Lj?Y-JlLsDgiqh_tIyNGS5}-(svw0 zZp`yc;91uvXqC^*0i^HxFU-_)ump-;BP(DB6ryX)XL;Cllm zZud;}kb90)@2ssz%O7SOCS|q1cs{5L(W6)B(ExhXMd(olKE?TaM+iNtP(BTMyjb{T z^Lr@NZl|<6jB-Pfb_dXIoIUj0Jj=%b$`7L5BX!(tfL~Woz1?1e?>%l%{YK+VLpNalY73qJ>Pkx*g^OGMp z!2IOLSydmHIBRYV&n~1FfPYl(p057acGlLsR_Zr$mrDGFz&8K;z<-Xfvfir^{`Z4_ zeG&fmfd4i<*{(8n%O{xs_)ex<=+Sz@{d>moRqbD}Pf_Vi_Xw+A&MO~+eU8c}bFZx3 z|2FDRsrc%3Ut;~=20C;|nsh!Ip~np9_gE-Cz4R#0pR*`G6DcwEoy+X%nl%Lcz ztK-1zw{)|x3(R+vvapM)+msHNZ~eG?{@J73cnsan6S|E9?+Hnh&YcS5d&@x_`29uv z3gW=~<+(rp@f~c}j|1N)?}K?$VKa{G_-_wMyd9^rKJ0jz$Fx4s#$`bi$*$Mn5B)YE|X8u#$l*8!fv`!rzn z|Gf1^AL_j3neS8D?(4P3 zODo&`w`zW--)}xiihJ$zaOAq;r-Ee*j}*tF6Y|Fp5H_@G2Y|EcZ$yneqGgzLMPe}AaJhwKLlQ`-(P*0 z^_;eA`X9s*I2u?yzw^0IwwL4La!1Q}Uyyd``(To0==LRYMJPVoqy0pDHkEj>)E|z^ z`Ej>X<+Xetl_kqlaiMy8r5If6hPzTLjX5DQV{M{Y$yGcC? z-G4RA_QA0Br!cPgl=!YY_d6F_N3!vi`xq#biAQe|eXHZvE$Dbnt@;=7Z|!n?&V>08 zXWxFG@f*=`XTDFBO3X<;W}KPtfOY0KLw+ulv@`!&!0NBl{2?&uU+r(c18_@({w=Ie z3*Z~|i{pe6S0fXF<@FMh*I<3OEmA%_E`Ln?i^}I($W!x*GNOzqmNph~TIC z*Z5Vb#J3P{nU?v+mZL$c??B=oLtO8;>TNf#`rqIg^j{etjepGO{OHF&6pvtieNx{a zrE+7=v+%r`rblMqfsOZs#6Q$tvY(6mSn|jBu$%aYJF4>m%i%-c6*+_)4`}`X#mL)(g3c+h@=wa@B|Oy_&)Q%wJ`UxVnX z`SVKe;CmX%53+;tUin3Ku)uadI#{0VI0)$<=J)C^GQT^3e~+YeE(UxCf3g3fy~4yn zAO{8IQ+tKloq;_ExfxNuw%3-9gOI)xePH4nsl=a)V3_d}`0*F&^O~^SEGnM9+$;bF zUF+u+_T@&$MHP)7d;T)t5n=p!9;5S65&G$O3$(w%_|yK`bY7D2r~Kl4j7h*RohOXn zYM0}2YtIinUU_`dKgS-Q8)SUWNWaW^HxrjK_l2AN80MaE(s#%|C}|dcLNGoFQEn%% z^G*prRpra4bIkZesN1W@_#Dyp)}D5p)X(FOTcUdx1vcjclaB7ou<0>Pb_VA+aji`< zPG>}3+`@EZ9+`k$5@&z?;60?L^AjjPDQVJ)o;REiwfk~ucLC+*Bkj(j-8g&WF==-e z<>%1uca)xmA(cF`q}NVDQ&mMcAIUdt)=$7+lQqhijxXIy~-iL zYIk{+gMigu@hS%ZD}TJoet~nlcH?;m>Zt?V2RIE_`RG-$=HhYMg7->q+UEyY^bME?s*aan9@OzsY94HenFmjr;d!tT{b-QX>?7iF$3rj2hw|uWzT1){E1qGS zUJmGM^wxty-!jzeNNVR_g#L)5??s|NmW01Gt`0X>e9W>)-;h50Un{~ZH=6zo6-+c}=mOn)aa!Y|G^!@zd7VvkZ?Ye*B#YGS7wI4}U%(=jC`Dy9L!J zsa1Lo!yQq5V%OVG<=Eei8<*ewJJx#xf{&Z;S3Kj^)g$pYU4JPVe`EY_Rs2~_-}(t^ z$LyaR!+D*<-azev6#fd9xtm)$2Nu`;PFw$pMM`+H~Uq zX7i(iV0*qk^H9R*_VW!39~V_0`uirkG~R%C9PJa4 zer6K2LJzyYb5uXi4<=6apLBIA#gDbV!knbb?K6zC8~;Y|ngw1nT93bPP0u-cO}hSO z<1-n;=Ldq%H1L@OKF3P`>~iB&j_K4M+6TpvPL@MY@RY@AHg)V-4@-zYE zJVOKhS!#b6iG{U4?8iEO&>xO_5<32VM8DosQ7^rhdi}U(bRDae%G=}Ul7DWvHZ2%ugLx+NS;Lqs%!gf)bs(QB0?YN_=-+A0z_-(c;dsM!w zXH;+b>&erARiCYNZYQVPMJOHseY_#ue{Cn|e}~rZ`*YBnemtaA-xnq%J&-t>#H~r+ zh0p7}PV`JK_@(xxJ)YViZ*lX|FW$}LpabRGG*x%dvEpcoZxBZVtoG0!}%ooCyo<@-OE*BvK6`QDFkci%`+W8?p;ccwH52+55}MVk$sGF=Oi!muf(|)SNdzq z$qf73l-c-C&l9V2|*rC(;f+q;KnWzwVmc`2R0y!B~$ZuX4?>)VR2S$A_swB2BRTkWp+b5o~9 zp5HLP|ELNe`^YQg!%TwB+3*?b z-@$-9xBD>wKE~;RTES}o{Tc*bs>r?ietkY3t+#>kDk$E3Zf4LLFO26qX?%3%HE!Eg zU8nfw^*d_0>XVh9MjrO4J(H5JA5jdA#x+&AcI|PpjHc_9!=U^Iadf zdTkB2O7SX^8~R7{ubv0y`Ti#-JT6Yo~Y6Vzr>$^ zDt;yTj6K5b^)8&Yo%2mj)VQvhhiZQbxlsPw^9^fCd;IWt3ePt@j!u(#M#oEMLB~;U z*OlB9&BHow%sk=U1A9-eX`+2kU6L%_yo6f^W_`k4% z+`WVOZ_Zodeh@cr^z@L{n>TuV5U|qS=yBQyB+reWXFk~cH0ya`{+V^ZFyGAj3_rK| zWc&(yJj_x5Y&(|qFY}@0@7a!>gIv!`8pMZ`A0{pyzNc{t`rWJ7^#r5m-8RIHpa*01 z-@U><$J{s0`f(-w*9*QH{rC4@A^gWwUT7Uz@GqtRc)!?GPTN~9UUmiZd8|k2fqf8} z#E6VO}dWY?Z$cp>@E8{_aaA- zPyhTP#XZTKdCEH*^Dpjuc6S0F>Nj(S*Sk11=N}p7pG)I~f8J_czwpjiIFo#t<{*3fVej107_Bzns%^|zP+%xnuX|Dt2 zdn66?5aj6u#P%=*j+b^b{;%L`YF3tqUn|fO^-M2)CgWlCok;;_7C{9OZyw1FWka_)Dz(=*8j{rlXP^Q$dcnwxSL2w7hpKS^>`}d{m3V)w2RmjS1-RJNOy#FkJi3|i zWxduI;tR8u@xPAs!AJ|{;bzP;3#I3oP&_(lR}Ds+P7P=`8`4AO{-`UY-A1(Apegzh z#G`K#LVHcxKfC_0J#Z+0-*+Tz4_pmCj4L1V$~T@5!{x7Gdm>WatUHK_U$h^g9Q})n z^EXTXs?fi3(ACs;1^P9-B3{2|e?5ZNG3eKjl&5?Cq`r)QpG395zP)oA`c3+-f&Mi5 z(AJYYpBnv{T2(6rXdO)IXL?b0eLKOg_f*tN@1vOUFCEo|3{uui-%jZrM{yHR=W_~wV0Bjn9(a)PDKvm3(@P_}MhD zq8yd89PJN}k3SVTatmqEpGijzIlEtJ@Gb7V34+-k zp{gjp)h2vq`Tp7*jobW^lqdgNQa8T{co?wCE$zDnJdgK-l4kQJ-q0%b`upPZbt+Hj zPe2E4FIdmh_N?_xZO5mBwnzS*JYQS$G9i$O2c;5fSK4$LhCVRoL%+l4`$opWuVG2; z{DaT~adFmNGR}rjUgP<0xPShBK=jXF&qM$G`}dTd)_Se>H?RHkszJ}Z(%Y-n_$2v1 zlF!3;D%`yC%d6ISsNJ7_mgi9+llTiP56tfqKg;|cKtFUHB4Vfd`vGU=~hf`IO10z4w!T{$$PtuUiGLB^_tDH_pyK z55FMJAAO zcOw6kz!a|+J0Mr7{-KfET;<2{Uj3q6{rOy_u4Cp-cq^VS0IvbSivoL<{eYJM_W@SBz^m*P*xS{E=j9?FUS)?qzo!k) z)&B7+TLG)x>Q%M?Ry*0NYzC}$w^!LHu=lD4JlApSRo3bA^=UlU`IYvG1Fixd<(d!c z5Jn%<`hf7omZR2?9KBHFs10(^8j+)B$WfgC^bwJx7L;#>9KBA*jdm;Y9Vj=8{=lBH z@f#+Csfy<3*6-pa_00I|thX20F2?x@W5=5F5_Ubjj<=k@`EJ1*aeV9-&8)gb?a*6< zoDQ#tJg>L=!wmi4(Kl?2TYoY40CN7ucVBWd=fCdI&;CPujjq4Aw@I%D|_p7+0!27->dG2jN zx=EkYJ?Qeht6s}>RnH4-)2W{tvgyQhV>*3~4Pf~6J${mVwup5K-TF&hAw(;+!3V8g->8-Ug{`-_}IA?1185=vq ztJL~E*nxK|I?mKt`iH;%g>ja_y1$J_<8O=o@f+kkX5(+U2Di{GX;QxSMeyaijy4sh z!}*|(Xbu|h(5r{j;|8k7dyC?eIW!s{Y6-R9F73CV{Z>f>yI1GSATGe0_@QL7dp9d!Dh; zeHAUR=i=8|r0t$VCke(oXa*I2l`=@;)RDUOeo zQNQeU*tmGY`?!B&YFD}WGT~Ryzqdu|WqD$KRQ)a1+iHJse%9MbXQ$-%c01A^IzK0N z3GLT{JgB`x`?&zCA42=R6dqH#cC$RXXk7Z|DaZA_AGa6=3_Vdlq_FR=4+z%BMNI$l+CP#X zp`V*q`Vw6MEB$HzA7JGV@kL;}A2ZYsJ6>Vr{3w}s)lZ^zFY!~7PD?~?8lgu%6pG_M zpC~PMj?keQ{BM*rmFPx%`-liXs!(5Cy!;HQFOB-DP~Wal+!gZ*)@_o`d4hLm;VS8W zS3Snn$Q1&c`*z*Y%?fWC()#baNZ~CyuDa^Ayw`+sn~;Bt=Ig3f`LpS}#Pqesm7(wc zY5V+``hj$RrnGDPNV9L%*aNixS^8n@1^-_EU8)a~&WZBg$OE1868zgM)Xz5S?X+(k z&)=o>@gS$4SwD40R4&_VReuEWBIuJ1n&0g2Wj^0Y`=3%yyVjG}`Od`IEPbZ<1^NuI zug?_r$Fu6G==W5fu3pgk)>gbr@C@|Adj+0Sadf=hOTXaZkPwnJ>J3ivn}Kt3FKfl9yt79}~q7 z-Ga^!{Qmb7^nO3yGrk;e-m5U_DXE9;s|I?+`Ct1B!qcj+xP6_kIN!f>y;eTn|7zBQ zxxNn6cRtm}bYqU0^V1CT&zzqoJrjuo@cy?_`288 z$fj3VK9VFK-fHcSFHd8NH?O-hAA)|X9B{jz3Gtzd^QpNd{Cp(zp1*Hl*30pmyE+0{iP`Sx4xBT>b;(vR7bpjw0za zGrAR11s%3*=qEB;bagTGsVe#N~Y?X_FveJ~FwZ1-b=@aA~ayR7{d zEH5voam4i|>2HSL@r6Kd+T~|r%0K@-q<5)2yQp2&iWkG{2qybl_`u`*PU~KDn?Fnk z5A$-@?s?@K_@3LX_LGgrKnZ>@-osOD4{Cgs=1HNq8=mL-wuRb z=hp|j&Tp?@`eo)@BX@Sc`nX@COby+~#&X8}dW`#(@6-O6`?YW$C+R$2^`)ghs%TvJ z`eVQ1YwITpffdaoI$l+t-9n&mjt}KyeN#%0xIZtRzlJHFnI~+0vy<{Y=k*QAspuP= z+qC)ftm>OF=$qXdZ?fANFCpJd#}1MUmWLxg!}2f={bKy=OIU1*=8+al4s8BE@u36b z|BpiX;`o2|0rLNh|KmUDIpYt;&o@IQ`0tJc^UEuR|3e}EYaq~;BblcxyL8{ZbpL0* zAbKc>qv&~&a9ql+r;Xx;%lXl}?xFFXZ_~I+p+nN7bCc@3!i3y z=8*jJ_&55G>vL$|X(!_SL7eF_!Oz7#J4JM)e!7K#kH2_~$Fa_j#t(e<*9(Y{^ov_B zpnVf+Z4l=uFG=G^NacZpowP(@%42wZftz}5U)4;8m{4Uo+JGjZ+(*5`FmCvua1n@ z9+dCJcuh#VorTY-JV1Wk(K&&=O-uTGbQZAM?FX`M)E3fbY~M3|{^}8tf7mr0l1Atg z+Hd{8f4uzgNfx}g@tSnz<-N`C7NRfv-Crl0ndw?9^3e*qwn%E{Z>0Ro>GMzC&HB6% z<(nm?eJ|3k6`zBg`0+W&haaC)IEc>){B+`Tbs_mNdf`lxA0B@^o=C4Mz9S95_YTOj z#{K;HZ4~ACH>8g*97gojKQ!DaZ1-hky$34o=F|=#^2BfKkE@;{O zDFZ*h1AhL5&*zPlquw$}?fgp^?{VjNZWVqmVZ1w1e#LQyd6U=oSbv%IyQHIWRud-= zzjyQMZ)A_UoW+>#cf3ead%i82uWyytBDeQ`Fqnr~j(e?a<~9I7A0MA9RIJE+uuXa9xL;UEl+ch12Zo+ ziyX{@eshxA`Da#;gKxf_=fxS6pOrM}d`tClr-;9-2Q<>3HvibaVLlmu=F*=sAM2#N zSJ{B^0D!`;D1x^EIYn0+?dhChpYT$RaJf?jcn$O>-vRCt$ z+NV+n`k8YqRZKtNZPq*deJYn>pGt+cEI z3Crb?v>q8PZ{#v6H@yFb?fMpOPi9rG z^vmW4mt%Wx-rF}b->?f93&)N4$o<}Ev|Fon@=Y)v;V)og@?*9`yg!kFFE9|rR^GG{O zjHhm=bC~XN`|&=`?d{k7FLW+W@J=OeFWsJhPUlo<&x#wUy#5jP^(=6|3M&7spN*b* z8PPw88!RXvu#YT$Uys_Cf3$r&=PTZ<7piD~uD@?*RPDg%cpeuz2mA04*Y)?|>As*~ z{ZaSX7(YH(|HrzhuNM)w@aus-*Xh__x25xk(thl|9g1b}&)cW_U+nQ7-k0$;`tFz6 z=X3lK*tbLG6`69*DK7t?{g_lM_b$l39ivwYS})J*4U~oRf9r|jbYJtd zOg#DE_w7XS`#j^fSKFcQunHX_`*!v!J^v8CL^I=h8FP4k%NFwZ=5yAFPUUmxuJO})BK z{S5Z)^l-mQ*m>>TFMRLJ#diz?IeJ3Z`7He*`*w`}7(<-G(oYY*kJ_>Lit&p1F3>k0 z4CRx38zuC}s*t|XeLEN*);#xLKlvY^Z%B^G#3Os;54=xsKlIJM=)Rqy67p^9_q!y1 zI|Th={OL;wYl?eWav=M5AP4q3L@vbFIR0-7<%{G0XNa%1JjL<-7PWf+*Yni7kyR?@4uBWqarv>rsxbrVh?WOrJ--38*tE5RMqxum0 z75sfWV+X%)XBWv$HhYrvFO|4L`)SF!Z74EAB&qFYNr)iOVj87cl&m}u5m5MnZN#p`@rZsckPp`Od2YwFYaobn_Z+;HuXR~id{p#iR?Tm-!tz$)wCm@I8 z5jh@$9LMe3d4LQ(x*rYYhb2uqx~^#ReIV5CYH4>6F`mmve-Vz20Ev%e3g1Ip8rb>5Aj{f4yD#3+UPCzMUD!f!Vk7#c8&iWU8Z=MdtJPGwL{Im9lQVYw2oox(^Dzl?7F%iC!3#_^I@q( zTI^Rohi86l*_-tsb3T{%{d0Z(dH}^qxyUI;Ye91_ROV2Hr%uz_s%U*@{*C%K*PBYP zwd^>TQL@DQDNhv8;r1!3{5an!Yp4PGnRO3tH%)n1f4}Y#4&D$0;=L%x}cQ8R`f1gR6;vKmsxlZGnnN?}YK;JP{d9wP+-*aL* zn|(v=(>%T$&}B*Nuhgm_bwK5_RJ{^y<4KlA;x{DRh#sFHe;&iT?YyS_T+ zm$mL3_q~ZHxZeE@pnIL9sl+#B-PyZ`1ciP{=M_@Fx68my3ZwrALq|f(|4wPfzi+xP zLdUrf9nTOt&P%^(eFt=07op<}==gBxJ`QvL_*aCEvszDn26TKO==kCY9jgdoo1e9U zM;iRBQhKe@??Tx0FN3_t-GBM8;86~`mx1mN3Ek-)LC{y}axnCz?pyR-2RZGH(04LK z-!kdfH0V1C`s#O6?S74ezH#?l4okl#K;LoD*TiH04fym#@EHo>^DAC28W{#YL%^px z!tVj#6L;^}-wHm1z-IvX=>7S0-lK><2SaBHSNU{Kt@@Gpb@Y8%=@bQ<*1P^Zc(0bLZk2Mu z{mzYmb$;-wn*r-QLFdy~Y^R3KA4L0qx5xwCi?(9A1KwYH=$qY70bVd;;>P=7(Pbjq7nUy+xJu_{c1+P8bkfs4Y{Ziyv%)< ztRH!1^y5%7Qe@H&PkC|b%SG;f;`xC=kK>LUzkom{#%x>G|E?LnnnMP zQaoM0oPvICO6?>6yFo|6E+13;>3%qke~l?Uz1=D=?wHcs+g*M*XqZi<$r2k9)}oCO-iED3{bbLHUq$(u)5w_A9SHvVHc&kX>QE z>-cG=Q+`Ot1=e?h`jtR7o;{#@-1i?oCUoyrd~ttwDsd(316{DO>uW)MkA?7K4sicJ zAoaDPz7|PSiJaPb>y-}X{!R85_!rsFK7w&Ds`PI^1K&X!!FU-}{~UDnTBY;~_RS6JIPmw)4FOhpBmYfd$Rm9ZP+`QY+**}G zuSwf?Ytdgb{%}vMKmLwWyp8@@TT>wqm@Z73Qs3K|B>CWRXVxRW%jXqGrXdfL5j{Q* zd5Rl%H;Furqx^)VfjoUl$4OrKV7^b#Uh%JZu6%F{N~iXU1?30$>f-y1WM2uL+G~HP z{J{6_g8Kk!rQdXKnzSFpwHoBPEq}b9*6#l!(tqrqE$BUUc7C%@KF&VAO!}{JEZT1< z@ztRJ_Y1yueRH7yKa=8OdHi}B;@ zjd{hRpzTHPA6I+I&G#aomT#~4o$@1(e)!*`&~yDppSlI~+y5TLe@M9u*6+=CAySFk zq$AON$U0tweaJe#&H8bi9_04ZR3q)*6};_n!2I*7XCu$W|0pOuIW96w`HbCR+fm2z z_u>5SxXdVB{O`C-16Dej@5mT`!Ps@dcU%U9kGTqJkbdrH@3YL;3BhM=%{5ZL(dVgz z2DWUv%s`)o&sWGf^pROz@4~fP-j_riF_`@gvhV7|ol%Ld8o2Ty-VxHOrx%KzW zL2mu~u#}!AzDWB@L1*n>@Ew;)c^-VnMfnkY$3^*7>N_su)Q?hj)V7Z@zbAnIxTNNO z4b~(4Gxv3xIBe4SwcugXX(@)jzvg{BBaYfBg(a!qF303U z-3s*UVfvZx3l$nd?LRE-)A<@r{qOPI1O12b?(4s|$@4(}sl2(q{<~A&^S%=PB^`wW zJ(!Z`W}m0AKT?TiJns!ad#d^&u8OOC zhk+&fWAq=Vsiev`!~8Sf@$g=&aE78ioP+IF3LA>Q%Bg#%_TN=Dh)*u{l8r0%%K!D= zU9QQ)dEyKOAo+dL!FN9zbY5}KN^>?R+o*iVo~`~?_Vjvro@-LSBDYV!+nd{?`+dFL z)6#Em^`xd-CN!-c*L2gcq<*}k!o)v77sLlv`fiE2pUc}I=vdzo{Xw_rcJYw+WLT&w~E%UXBi$*{CHh(m|*7r;74fw!+EdZdpkps`uZt9&x3LP zD3G9MecxBJz~{kT>8!T7h2Q@e#$X)imbep=@6 z7f3wQ9chd7V+nDKxP7$uNI#Zf4>&UJgY|uN@QwYEbcO{H@?$jrJ9M3v_K`}vWG87q z@}N5l1>;`;O!i9$!Ce0)dc^%X;)lFHM&lV>h(l%bACmfV)lWwBP?#PKV?+=1+t9`E zA?ZZpI16NFGhgHU!ktVH6Q_dzpGlbW?6cbMTXfuI5=TkLY<|tL9Z&r<>yuyP^RgrJ z(hpi!lQgxeLilBun*m-w4aJxEh9#y`r{JZ21l{AI^(2mvdXmnyg2%zEuMivj^_9%3 zbyD7Inu+jlGSr_BNq>wTqIQZIM|OY4(VtcSuCX0%fa9J_G49X#(jT>_={`{O$HdiJ zfzNaVpP>*w?-qQ9LEjH}Tk)+;K6F8!cOpVF7?Nu|pRL6^xD z@tWOV3NKy%^qMACEMLpz$5qb+P7$5|41c%CUILH z$K21{3DAT1-a|NUYtyrh+MBvf$g=Et^vAi~@eZ`xrm0zX_v!m)smPl5mEQGBq921e zh0d2joI>YK%YT*pR-8g$8}E6R!|Ld~D)Lp({z#mH@&$1Uows;AANnQsTYIElbB>Ab zfdD)$X)sSr0@itq;uHdB^SzShj@9DUN)i<@u9Mc$fGzERUG`sc?d&_6#uf&TgNiJ1Q7 zwSN@f1AUdw!9AnOhv1&k8OcZSd`azo)Uh0og6}k6vK%mw_fdDcSQB0 zw?2*cil?_8cJheM2OidmTzr?@e4mB(528IO?sT1?8;^38x*s6vY!kXh^wsTZrzD-N z5&l*|zD-=?BXW*44Zc=MYRf|z)OIgZyv=^VDRl#!1F?6X zdN0*$?A<)<-9)^-JG6qm+bDPr2|ejvTS)`?-6x0!_U=y&y1PSOyTanfxJyX-@y zC|&&den{}3eNG{IE4^&|CPVaoh0uE%^qvI0PZoOH<;HsjidqUQ^CWWp1I$o{W^HRsW(E8@c3Tfc_vn$M*XHX&?U}qx=!fQ0lKt- zE{0FWZ)#l;ua}mLZy3L+WySJu;PSD4lhUP>-_(Ns#raLIk^Z%!e=X==*l)sodH{Y? zBei!Rep55IJKl_T8#OIxKX{!(=a)CgIC!r5P3E3Fwx`?qJCM(o-?T=$&HL~~F5C@( z|A>B59r3Z0-_#@erUCq_lhmG&a3JJj#UD?NF>m<-`n zDR@nz-pL4F<16?P9}>JKP<|YE{k^u^8MMnYa;(33zUE^+Q1>rUf72Zqka~0LwSP2U z3+%0Lk%Hc?W=(Hzl++#3`M_J>0Js(T>ongzX*}0?H1I!_-+}+B^L5~V_MjdqPX6aR z<&RwDdn8Rd8zc0d3(DA6O<4vJq-iR0TQrblEw_dCtK&@20$ zkBvn6v7FzzIkbMn9Ao`*tngu0>E^E=8G8x(6Mjr^o^NHp^9JF^H25(IenkC= zesNOpn*e^}T93c}q8Gx4{jzw!vqShF@jDThH|IXX^{wpZsXn#kb0{RA7YaRwL60HO zBi_$DJj5@SK<3vE2AJ=IpvM5{Vfb|wiyht1t@_@^r!R!h*@90$@aY3SQU3IRKXLQ$ zqk>N_@aX|Q#?QM1_$Ymzxu2)~I(R=%=QW!iY=0SjVEhZF?@=Oeaq+Wwe{W-mUq@2U zxxNnweL6s&HqgiL>t&!%b3~tq{m?Zf;!K%Udd}8sYFx2=cggYwk7&Od!S^^n?=IetceSHp^Uy^ryV^+T0!%lV;ke)by$zgFPa0{p%eTED}*djNhY`!7aLc%MMr z`M&Mk?sx;*t*Zep5p;gd>;q|+FC)o~7gI`sW z+WLb1H|BesAKD=DR*v#znmz~pQ1-)0`JvyRU_Lv*e@Vt|)IODAP3M!;9{Xdh-$nh< z9>Fj0LtiC`x%a8Q$i7zn(^7sY`<1pI+9rHol=@uwkv8AiUtzw-&40gq3yt^uJj%~W z8ude=XO{6p*{`(m+9-HUpx$vwZM=qnSDZY4SMVA}`61vH^+Vf;atGpvUiQ7HADX*I z`{j=GO8wsYR@M8v;D_Gctb7^KdB9t5{Lx0_Z@_!yTd*#w^L(%_+KT*D$glhl{8F7i z1HZHb`6WB~r6cl3u5wILx`!g-m$IK}(?2EjpOt!yUun~S67-MrZ$2pWpGNsfNt4dq z+V16wms$7p>L=uVDZjLt>=b*SUkBU$g=VQIJErUBnZwnNBtJjWFN0^CoV-KuRQ%k6 z;!Epr6dB=lnqkF%udZu))k6yJkG8YO^P`G`!}c@VFRVW{Q9V4597*!inSZC?*HyhB zdM2CK{oA?fpQ_%$I$|mz+mPvA{XT8)R?y3=!%)2}Ii8A>W8d>a%|7Kds(y0Kcbc%C zxZ*z8w6^1|?v-}E3lz>IWA+KBsblnWNk8y!rTV>Q$!6`Z)qTRLLl)(Qw{Jk&&DPc{ zjP<^3t?Dzgo|LVv!}~U+Pi-2oj+5ZrrH&(;KEx)UK2z(YnBd((e|nn+wck2?9e14) z*xNL&?VK0nX93}Tdz_keGKTr*p2Xat`t~(zx&2x`pr_dv{B@BB_oQaYZ`S`-q@&Ll zQ_okV9&dHOw3l7CMe6f5H3HTF=WS{L+=lmcir>0cz-hqHUz@4~P95^7ybt>wEa!vt z##43_-8&o}x8KdvxW)K1<2P8BkJ{gpus7oL%W*tzN2Yb$;9N*xUp}t=X(|`|ZM_x7 z>&qqa`X|I;%2q7@GKoW|J~)tm4WVCgcKhMduVM6SNYbERUqQc|74iCeiC2a3`Y`&n z^dwib99^oo{CK#$@t64Yd2#tZ)_=Fj<7M~v{p;;qZ$J9i7wX?hqIccAjzhCg&pKDB z<0Uv(3Ajuerv29nAEkIizk8tZal7C1tPe`;?-MyGXgw_Fvy_kZIV0$fP6+*3uj}{g z)L#zv_vyYmuNwQe@=8ZKhp71Fb^Z$W_v!vFIyWu#`u91E4htMzuY!N>(?Qz{_W6Nt zJ{`2ZV4vT(bSyZB_<+Du_iBG_`f&V%?E>)^R4vGSb`%vRyGQwmbE|f_HpqG0yn8>( z!AJ+nw`qEdwjZ2FL_huge(0ya-!G=0{(e8u75nSxJTK@!EorbHa0YOnq;@}ASguDE zFV@Q}7tHr7KE(b4{Of}H*MYzAgcJzQBdUBR9o55j{cK+|eN7zq$9xX&0M-NI;)ORe zU2(sZTbLF3iQnUlKSobuz$h+LR|drI>K*i zr?yMqJyrQGEFKV^N#`6XXty^9`84!QTa3Y2~> z?oSTht2~AXYV`}=lP54Bfh@LctaSwCy9xI~^?=TS8u)|1+6FBX{RdHy9Gg#*9;LV0fFC|jfU za4Mm8oV|~?nR3#3eBp!bkFbAY`y+q#9rkC{@5oi&DfM?^e`8nW9f02}cy(1iEN~Y4 zOmme}fb~35XF<;?nQ`Q;m)E4n$^{Q2H(e+EtGvin{z6i7FOE5{P4O4aUs;9sYNwd< zn%?boc&_teaL%(2<A%Bxp71h^mXhXJ<$9tYeCcmi;nz`4pv zz#V`;4!8&KCjd92{4`)4A715*z}`KxcwU8kbAZ!;=Kj}N~8%{(uaqrAok$+w41ySO;jyQKXFl&_PN^rp6dnUK*xcX%-SurFr+!K{-Xz&`95od1opi{2u5 z&WL?Z^S7kI{H<~o%p;eJ!XUd+@_F^sS}w9)J|WL-dO2jr*!rOZ_U$Gj1<&)p`Svqg zFHaBiybAm6S=fht71JfMUcO##r1hG{wciJ^5BuW}iJb*`n3MFmyAS(CBA_<^!s}!I z_MRxcms<~yvkT4=I?pOyeEY`uePtqV!8$kz3jMq$z1P6TZxZ9z*kyMJy{AF%NzhyO zVJDp$sVBVd?9bO#W%8cK0sk`oJh>?2*ThZy{S0Zzw#;{~S4#$ezr6o_>(GArr1md% zzr6oFYuztz=x`wW=0ACW{4#c2I%LPOslwwlA^Zy4afV-ClYV+lL!t4Z29nLMp%A|^ z!mnZQYY6;`u8$kLHO?RT*_&7{2elsGZZ+%Uj|hG%@|}%o`g!<%bHIP>n@8N?>F-|{ zjOfR{5Is&8dh~-HeV|8l|3VMup*a8N%R-M{(4$A|A$jI5CY^U_Kb!Ra2%A4`A$)2C zpAO*D27IFD8d`u)+`Ra4!KW4Yv;ZG-u3-=GQTjy2S*^ULeLkB0vCgF!Jz(OlQ@|rE zNA|uIB7=3_Snp$?d$fh`tY^q=_0MVe`!r6~e)0PT`qQgY*lQYy$cyOXyY#(@gYo!$ zT<9A&52_xr`P>M8#qFoKP3mg~zZ$_WBR`u30Xmm-!1(=RN&FfSC+sa<&#l@|?%xlW zo#&(dt3vgIk$_KT=qru$%}e9~Db_1W~P z1Km%z?$=}dc&7^Uu~G1A0Dfv8rxH`K@r5$f7ZJV4A6K1M`@+AsZ%$!9t~x7l zaDIGAV4Ln7H}vQZe7RTf$|0WOj!ui5MB~bckNW-Bc7nJv#*^QFZ6}B;*Gq?jxbhhS+x<52&hY+| z^ZESr0mMDy{HFQac)ZRk-?0zc#FK(}GWzGolhHpvo*dIZKc1{~H0QOS&iV04mg7}AlaA5zlPY)q`EcAPl%K|P?MHjXtiaJYllHs4R@Vu69Plsc zC>+F@)GnlZM?^l%{bs3z>RpPT6g@Aszod@(XU7emFMQQ_g}cl>&~f(3eazRq#z)+O z#zm6OTG1yFJ>u^#*(G$a+JjT;A)kE$%QoXabA}xQIahP=K1h)HE7UI)4gdXLP zzcNYf{7axm+q(e`dZ z&I`q9KnaN>!Xr9IQhdy#s5}}0?UkUV=)!F)DEv_=rD|_)uY3ErYWt@M=xy%I{ASi( z+WTzFN&=+)?)efg&ED%VYi8E0nOTqBg*4s2$9;bY`j@O1g3gKl2OpCAL%^qM_lLAo zf2!&KuY8F4+^+rTl(Z0FT=?{;DE+=l^qap*$SZVwtExC!%(-2+YEEf9IL`PSVlQ+nd)HkL!T4+-7I6z_3KX`K~tNymem zH$MzKOFC}cy(%Z=xf}mw9cS)dl^J=T%$tC19Qo@nL&Oq4uF7#%w(IuMbC&m)e*>_|n7@;K zh~xUcP2X1(#(Y8R`wAEJ{fNS*A4e62Ttrh73L{=e@}#g7r+tW6N3!*!LU4=Bm-FaO zF#kg2i(BiZT($jxazC{C*-X!CKR|L@UXgmj6CJ{*WIy03)L%lq?8g^3nAacRaZoBs z`(&?3S_l@U0{Wf^o*%XSfNQc*FREnQVL#rNgY^2_(?|{mNTecA9o3w-o8lP7ueD%FQVJ< ze#3o%nR;wr;HtEj>A2jj=a@#*3$fyN#3?9lUN9z(o=){|u%C4T>(qrV*^(jR|* zOyjj!6)$%_bHnlrRm)qP?i|5mUHdve=f(NYl75}id2L0~q+g%Ye)WS-syBLT4rSU| zQv1QyW%~I1{nRq*)%`-%){PbvzpGN~5a&}1tcO>RG9MQezl9Wjzp423W#~4W!e_7G zGpG2#o@uCkjl}JIdQB=mZ%E-|=gz(*_`nW|O0a7hYI@ei+5P%DX<(}Z8L535J(={qAl3&EK1)2By~#-&fcr!jt|78!qW6Z9wf?--A@ zzm9!IC8X9C!2ppJPLkQhWpa zt7v`_3(-eM6+h43X?Z{K&7<1_HSC{{_yf7GY*FY;=NTmJt=%GWXYE84v|9*%Od9a( z8`p7lS!!HaoOoEqmHG#^PglRQWA!F_>1U+=xI_Et^b-6;zunQ49{Bukv0gH}eiZto zHoM+7r1-uyg|F#>1A^~}>ZPHSUP9o7&I=14e0=&-_T7m4CO7t{M6&c@H>JId#urW+nUfbYDjDUdx%>}@w*FV%WzyvumqP!G&Wd6OTme{*`EGb490?!EE;-1l$JKI&9?$y;Ch z{wUYirSj6L@?v%g_Vdws>J9Pw)Ca2J^{XPs_Fc@xe}RBF`k%3$Y}pWxEsV#>wEg&c z)pyYQ*>eQT(2p+8wWKiQD{fW&3H3m6J?K%64-`p6?0Z7KzF<9U-xczo3qQ+=T+LEG zTjzHF3Z`}ht zk~s4k>Tz^fRoLjDbaiw5q-L*cE>8_ zzmn34DqB(eC2zflJ}toZf|g%F8fyPsyifb*)_b&nZoMa`erGtm$vUk!(0cEwYJb^xR0=^`roAGy=i7~cz~`{1T2Qa9 z_cYYLEo(1ozw^Fhd9C!jQSqx+{NAel-iC3a-+?3hP~`c*HrRFKFJK(F?+Hyw{vuNY?LF>_?&ysbun}op>XOrjACE&Ncul8M`1szYeFLzStwWxBm zAgM1OvpSCQ?70^*ol0|Bepb>#fbVPi^^B(4y+_&|({iJkc89dxyz$#A?T%>qA#E3Q z^W&)_L=r!a#&I=2o;v+?j;A7CHoW}{LcjsNhx^d>-&6Pw;pd_4{~~Z$IwtV&_U|bC zE`bNicY*Kfha~&h5idygvF~7Y7YuK|NK#s#7yc#t*x`pK-xY$NVEforj_EkA^%fPLP`Fv)Nrhn_7lLO9|9!ciOv(MFBKH-Q+eu0N z{NpP3dH(B{-p=D~Ld%a!O6&a4i(q$<-hUol9SGrAPZp_PySAyHp!54R^n8U3_J-QC z<$Xgf)kyhl{~NzwllQejKRv&OdQWIR+FR2Yup}_G#x7$I4?mutp7*($fIi_YKh95~ z3s)ce!!!&ZeT3Ga=+9u+MFD~ylIbCTM3=xiPwK8*S-UJ_kx@%TxU+tV)@;--qgetVOIxbH8&`n|-DGW30T z;(NmX-mOoC{Wt|Z@0VX7d^tXmr`O)~cINMb;=i~K|3dI);MF>T_xgPovfnazE`N{k zETf-HZ?hY19jQQiZ=m#j!S_(p()T!LSb9|8;ij(&?Bkv8_fI`YcxwNw{|&YHZjN7W zf$%t8oGax1PAy7%)Ne_9Ypw?U)bFeIJ)rvUuAle6z~?E;_21=wG}NA}^luc{$0wk2 zj89%%>$O7v0QJ=9y%6O(feX4{+v4f-S8!`o7tyzkQg@DB$CZowwA4wy-r5F9eSB6` zel2eJo6?U};iuidM|MJnzbh(7d3s{6^kW6})SM4`lurq4HbE+!^b<_?=QcvTEB0Te$zb{8&5Z*k+^=w_q~Q$gB=TznpW&;iL-dQL zFnp=`sMm{T>AXv^=jrL)9WFY->E?@-;XpDbiD5zYyVtaK>O$70y+IFp?}72XQw-U zgCF)?YucBkd|1xP7mvqj;Kl2@%zwuJ>J!ZG9>u>;(nOzK2RpH(<%qbGN{?LsU+7Um zeWgiB8)}Bt5B?RYZ=n1;g5RN5$XPV?34vYQe)_|J_d(90nQ6fL`=x(}T2Vgk&~p1U z|9<2ODhVebE^_J1tZ|EmPw_zofz{p_5p@qx~t3tk7d&0_vj zKa2J!>+_GubCyf~MP(gNQ;>%P^f5Jlp7`;A6M}CtE`Lkl_?#~2sbf9przc-6q^EeC zeog!R9@0niKtH&U+%P8PBLs6we30_H;C>N*{!;4q`ObWfn>s-|m9cm&NaH#_y<*hvX1+JHHt))0>(Kb{*w^iM|9&%98{A zc%J8+Q}x72wL7~6E|3=@?Uwjo z(z(=5T0VM7J~HxD(fmX_=0no&g#X)8e5eqAef~c^^?pS754xH^=ktGn>Fc%2^Lf&4 z!v8I)dKW1l&0`{0KL4*t$x{o>`_Ef1CoMR=N>drzKLY#pE{L6! z*jH7$m=d(FR-Z%OXdadR4>vs|&l7oH(0tH~etWCrC#L5YTK5892}#yx z^BO>4x&J+h$FHj2_*W|TYw9;%E$x^cOY?@n2e!Q${8M{2DuccUw!PBPgPNi74gAP1 zLAf2>@;;eo0Q>mY5xp8|+`sRyl5xyO5bMG(C^HbsVMNrtLM%A8uZD_T3`*>FQfjxRJX@_W&*fc78;*Ujg^4iv9L%v0no1 zSDot36VSh&KH_!#L>~c9=4W`Eo|gm-(XSX^kXyQELgbh8{c0*7>#b_~XyL2t=fO46 zZ#oXV`SLTA@BitoAHCjct1@1A9y0suWfkUAo5)q-m%mm7#-HzsEDuK^NB%r|VM=cD z9rJ~HkQMpCZ#2>z0^lDUYS3UbH89O&G z&cbsX_xCw0mlf>e36EmKPeaWcGyTOlsfhkHJ-iYfYxcGRpmZN=!QcllHC-1df3HFiMPe1JTd&R3_xx@le z{(J{JZL@wm+fhX#K(%r1+sQtk#UCmQ*<>Ap`Of;Ds#1YT)2BzLt_#`zhTHgD^i-FQ|4vE${B0ZPkMl%-v}yTvNfZ6? zf293^^6!IQQy53l^s>P5KK0k8^&H#2RXpzieGj$%wZMm}#CKOx{>KXOmG#4WrkRf` ziqENa_~flm7@sY^^}`-Fblz0?+J|(9u<;4h8+(Nh7GF;54Z8O;BPUBLCtoAqgX#Jb zk&|Vm>yo6toGff0C(AMG@dYivxQ;J{K=;R#bX>VO<22-^1i47!j3s%_a?ii0ta9Yy zjJRL2w+8c##Sd-YPeaWsP)^rDlIPdT^LY#-@ekUl4d2h@bz{~awocsnCp>Q~$#^@o zJr<0@64r-@x4&Irzr4(sT0hrg^W+Pt9*Rqgo`|=Tk-+^b^(#E7@SwsI3Xdv0uJDk; zV+tew6K@|Cc=+%UeLk-FS`>zUqWv=pWB#Q5H3Aocf0sD4&+l244?Ac4eLg2THK+WY z&B({3%17S1{(USTQxz>gi8QS@AGg1Xb)sZ_0rHltC#n8vQh&7sxr&?MuloHTr~Xv) zPp=gHGok$$m(K%BL= zc3JX8BN!Lv|FM2NF;x@v24BT{-Io#RmLIn781F|YF2-rY78zCoa{;?oFTR8!YUiw+ z??K#({zR7{--hQEj|@paU z;Uiy0dd?E+-H-V^-iP>P+%bpeO|wW_E0X&1wM_H0uMaCaZ-0mOB@O6#^4^+f$@+G5 zLgxcJPp)=x^i1%b^(X&gwHM3|i(8kgw##zR=f(TDJlDkh`$U=7o1QK8ZMZLs%CS7` z+A$#c8*2I`Ed;+T=|K6L(tb1reG^SNR4mD-*pGeV->BxA; zBzJTU9PO1SBrOCt2p;i~K|DV(BxyJzkAvZ3YXYB+FKbjk(}yLM+ZiYN^ad}G3QX>M zYknH=O{kac3YO4xy}pwRNI*{P8tH74Uwey!g)bN7(Kj1>H`LNNRpid>rlSGR-=< zY@=6xJFIW~ar|_V=TAy~zC8DAP;RS~!~XZjGYriK| z=SY;Kp07wfk<_!5e85$Do^IFrl;=MEc;NeXP`{2Z^DE!_WwwWK??3TR;sRj_=Ld(I{!L)NKDqDk7SNUD;C=V8 zKh-DnHTop`7s;TdpI`nI#haNfdG|i7L|or0;uHEEgWj5My&t?C{dW72p|AY!`^(RI|ui_I~iTjC{?d=)G0wZShIO9UE%@v)vC4I-JS<;O%F~ zuZr^Pfz_ z`jNTkp+%pozISm)x8MH)$q;uGGx9ropNE9LdGp{oQox_5+Esq??(ut+4DM*EQ~A}d{4#$9>zZ*# z-5KN8T@}CGG7rWbfz)IAzMTHGCcc=Szpi0BDq}DFjN-AnVfmS=<&7>` zI-eqj^E{Zhulg%OXWX|D>37VMaoQ<#pt#S5c>OKyv&iq)%7*3tJNGMdANb`$mq_o; zCR(QT=DgF}KWm%lCjYg0LDQ91go?i+_*^yP9*>6Le0=EG87p!KcEI(x+?hAdd;8Cx5)M>vys(57W&SmXa-o5Vk zNPR2VhfrEx*RLd=u6B9q{uSrfmZbX;6hvd6`@W*WZJh|s~0r-@lC(rzz z^B(A@J?Z|d-{<<@uk?UlK<9{3{qF%>MqK5*=2ofD*0mdI5b*ZpaE|!M{7;{6`5^DF znOabO%}MH)tEjx?`F}4Jd7IVp6{H%cdNSQ}KEZN4t#VCzl=V65m2Xc{|4S2!|D>da z;36H5b4q8>|G>5%^gZYB3zPNLc0t(g$+G9w?m3?$Kb`q&>tAmMUm$Hw6sJJ?QN?Q{gV*2&@rG~T%yW%76FxX-ieeqY+fxf6<)Nclpb zdgN;8ttfrZ`PDSwnC^M^oWDZ(lDX#`4pCHweb-QXwbYaF^>Wnv1LG^kq3KuLX0SdU zG^X^Gd$2V=$NJ^pPe>eJ={%O9^T-Btet_vbHLB%DkUoj-!5$?1tLfE!qE`nM?;%MG z!LLc`%VnL?&E#@f=vA-f>N5G)bUftQiJ{2lnvRD++kGSI%gE*Dq2Dud`8j#+_RD1C z^1sOY-kMuP?l>RYskRS}SG#?C@A23n@BAdsPiBXxek#E}u=QIyk0SWcz6gKJytse_Sl)&A*WRT**=&Dh2N{nuTzrx^0BP^_UY;0xBq+@A1hjZ8EGliKerD? z`{&MCsGa4`VStWCmmkEv@r%@-YUAavA7VZ)YCo1FrTYdTx4O6e!F|) z6T6rNlkSnidv|X>SwQc)rEi$Ns3=eeqp_uf_Yx-xoOE zJtXbW_Yf2w6ga-4U!P;1j(7Jd4F5E_KOTN`a(_Jd8t?AZ{Eb>K^m8;-RJcvww=0am zS~P|EBi>!q_jUTdQQ>-pb)K4PQCR1*sWycrJKZ1ud-8|f^Hd0~5&OuO-}an&;b%qe zJHg*_yQF@(7M&OJ^xRhu^Sscei>y0k?-*2F-d!$V)x{<3+$KYIH#?@vE7^J&zxksmJsKR%7}Z?_q8D( zCDcpbo5=8aobf9|E;w%6nHo3EG;Rh;cL`p!Uq#A?rFRKD-1JR>>3%4I?cP4}OB60j zO8ci3ZjsdQ-wOB7YoGTC@wmN|P+~jenbf|YKTXdU-9!DZpnp*rbWPU3vhk=zZcpQe zOwW&|)@S%8UvBs9OwY=a_HR+r-kJ*~9u$VyH`P#s1%C2#w129%O6a%EpHT_@ws|(1 z0v~KYklp*5#1$%_oAawdKik(!-|xhG7gqrN&pWq47@636=Lzi7Z;bly`!%2Cb9VM! z(ejw|)6dWG`P0eWevv!G>7(+flrM?3%LDXKD@acl@QKy*1dc5*u#5-u;N+OZV%8Zf?Ivc0JqlmGR>{avpuXzN)sKZF(zjAN#um zKh;}qz1_ZdJtg>^`Fb|`(d+z&$Ge`5xK7*wJJ^>`)@MAw8a=)y^nm_~%Ft&GwHJ%L z`{j6E=6N=6J^PJ9k8#!Cn5P?Ric(J@II8>tKL1hVo%JC99_#m~duuVE>7I3wQ=gtA zDLzaKA4XMAz+R~~ZU&VPdGX~J2_J@(4}+2>GbZJ+*SbaYs{ippp8{+kas(4{P3higv zuzVx?dzp3Rddzoa$Vnl{uG_X~|MJ$&|L!eJuQu&pi}vpyWc@W+=TQ6N4Ax5 z%DdO_o7`@tsO>f))qW)7;Mat{+4WM`>&baw*!PKF1G_VcW5MoZyT3>^TAa`y=PN9S zO-mWOQsfKW7dc;2yNIfC^Eum@-<9v{z%G5_)=SlX+aqM~zKe}^lK!iG?AD9>U@tqr zPVH;AUW#)V=HJ=(gnfF{5g(cV>GjgHMBmgazv?9Q%dKhLCeMz2zsOsl<<~^+?K_oE zruEWOIq{qB_p?8-3cSmwB+c64;Fs;2F9Z*QAMRWN_;X;}AM5i4q%Mw$IA!9eF5RqP$P;w}*X2dQk8SFR?fS_5(#T&==v=cwTKib(#9_`}d#cbBbs1J@CBw z?po%1X-Vm}C}|;B7Q8ch#;vDfU$`${6DhntCU{M1y%Uo9`NuYp$6pY<#l;XJh z9s$8fzrPUgZqxUe2jkr>3Zva5uG^{Q)jv=gTU0AM*UUCgH=Zmaj-!2<}6>uK`}>ho{eh`t8&c zUwl9OzrBm(u3V4tQMy6WUb}~Ssxi~A#SP@8Ab2h+o=b}79}0qWpNPP5tJ2{;xCcFn z>t*RO#Q1viOVN`nmZKviM+2oB1y8#lEG)fQ;Nd3R^BI+f1g5wk^lE8D;XqP5&tu<9 z@#(d|^R?H$oWmlywz%mH)V`lTP2c<9$@T;2Xmn2ErdhwfqV`B$y!20pxxQKLM@3SL zm)gF@xMNc2+*_mP`bv-wwkIca-ZH=Gr=cHozL}7;n!P?|c%}B=@f6B@_yfUfT=5!1 zJ*0nWiX{Dui8k)Y>YtGmKF<++MirkC#pgL0KW?LU|C z<&8(SOL?B*nclt+$@2Ii{$7(?4_F317N1r-Hqkq<526zEAl+vm`NLA1q{A>5$evZb zwMWFnvo~8%zw3WdVe7y0%h{V~Cn}?z^O`rdH@kG4r0vb$mh;Lz;9I#%QlDP!I!^NJ z&2AYdom##fX{h~k>*Cr!w=S;zbL-+c{nPuOl6W@goW#4Agic939DJhlU-I1VM+?jG zH1OhcoGb^-=bHBkpB4W$NfUch$9GQrn%2|7r!w$Q>`mZB-~W{N2ezf{P2fp(2j1^M zJ^A+LO9b)cdugZ8u73Y4S-+~2=gImN=0mrBrQe0MarAh{-+AZ$tl*XSIXHmp)4fsU z&ell=Mc#@^??y@e{B;}18(rm1^H;r=uS4qANkGqJokZnK@3BeNJy(=YI*#1@-llXN z(f92Nk1E`$@R-6~lKS|we^yP-KJi|bvo+|yav*pYf{#i0%zWbP^WVzU&wi8dH@sNr zxvKS^lGMkC{fyJC3x543qNncTrhRi#z7XKMRJ0xM7{w>r8;?@eCH`pSnYEAKH&B?sn_=x*rNCCDz>wD+_GIY|MQYv?1~qE zk^KbNaRcsNTG)}pyD`4$o*e17+57SFqEryyVfH=dt;D{E9g^7hu$S!nS%-GQ4xsyn zq@F^6bG!4I^)8*Su^hV24(uWQs{al)7izRRIlXuM~9gn znf0#sBmU>syTJD|S?~H1ovSB*UiH+nq}lZ@wTBQMclXY0e6H5kyR>}ndY8SYiH?5x z>s^{JcfIQcQr_opT0Vm+{HW#!EGi%J)=#b!J}jwTUj*HpA8@1K5qFGUO!;Jf`+5>E0|9Fi(5h0UKjWJ8phYHc)!{6 zqz$#-lJZ86&HFRs89Jur?k4e%^YlP=Jz_-ZnYSMC?U41rsM2#J#a~;G7}*f7Pgcdt z)+2^CEPpn~RdUxOK$mLk5rf*ly!D7bmHrKB{|2>x>GcTJ|7Wls(MRo_iGTP-Za3v0 zMrHJa?E?7uPxkeQS>YS|4gXWV!!-!`)_aa4w{Lm@RC-^Uq2es@*yKER3&c zTIbh{e~5N|kn0g$#7EWxY5(w_ORT4QATN)>KfFuity9alBhC1S+CS$X_Jdx|Kh*K< z{9n+K;t5L6A>`NiKYdR@Velbt8dZ2v^N&gD>*p4hW6wWiJ;Qwdxd+*9Z&UnRB+c4M z;NOpaJp%SgvL11TAQsJFoSkkxqEY#8=OjKZd@pLh8zuGWRY&>RzRa7Kev$cJs@L*$ zl4jQe?ZbgfbU89d}M#sr|(;YzJc;>P4M&cv;WC_&$FYSCiGpEa^yEkO8c8J-csuf zaVz+ECj0&7e}m-7{GSuL-*0RFem}!AFK)Fq#PSLJ$d45~v*Q}^w?eQ@JX^ZQ5dFHx zzQ4Kz_$2g`Pp6IipBqVTHu8TG`xc7Num6;eSF>+_PWZN}d^;s+L+!SVJ-MvoHqXBO z8q>x6meMlnslj(r3&B4^P9LK^*h~2EFYds&^ZT=y>dy}8&yx0MQTv1VyI*cj`;+HS zd`9}SfO<-E+8@|q1-&2C@YzhCUmr90@ zJ=AYMPIN(4zvE3pZ(G;%`I#<%GyCxwzr*mzt`BvwJg7ckdC1$3w2%8&>CygmrTVAy zrSc((ORotZ6T5d+VaQ9~_rsEPp=HVM_jiTmWYhbQFi-Kg8~jbS2Vt*1-hD_>8S}?5 z)FQ19>HPA9+y5^T`AOpRdjAMKR- zByFgC;j!iPr-T@4-CB z`AFY~zhr7u*mlMm~-ck%a5sW+O!IEZ(r?d3_#XKr5(^r6|y@o}@0RqyNh zo=EQ>N#gaeKl1Hl#Jw`}l=D-TGJ2&>$B+3>PnB^~uX0l-sV@&~cb{(loMw3_1zLVh z`c2=XM7szxKBoIQUws$VYj$)=?dY0(J9<#@%p2eD5KYRH~KuD^@LxQ@w^KDx%)Z4 zE%UJ1^|nv@Ox6=V%ja6nF4yyH4YaSG?WiZ;{hSvH-%m&H@77jA(Vyn;<(@NvnG%?v!+Pf&k>kAiBJ2OPD}D0L2R$tG z=~Vi(D}9V#*xwa*G-mjfp2zBWe$UKf=c)f!zhU`ntClxBvi)k*e&yMSvke1PpWd3?`uZPX+ec(JEZs+fjJwbkPvL2@P;S=r;Z@gd9;^Jw4 zc%09>PX)>^*yTR|H;Ox7Eb_K0@@nz%C*%1XUU#YH5C7S5=JSf;zbt9i-j`ub-_x?V z-jC{hPM6@9tcP_8V$n&AGxKMwozGdM{`>19R}0^lwBL)8`h1_;z@PhHZ=~^FTF~-y zl4jS#RL?j+GrJx(mcr}Bg4ej#JC?y~MDfb=-@Yz*jcWN3#VflW)=!l4_jCFFy`9ft zJ<#*{te;Qwk<>f98~vm8WP$BorucA=@Fl)O`7>3g?>pr=?e|nz;{nIp^m$RAwvewrDS7VWSwKGh2aqzA6V`U8I_ zkblwrsz>B&ctLQW2jA^udF0<_?nj_y2yeX#@kFD4re8Zy{}2B=D?cd>`+QB0pHI;E z2}|D<`Zd&iP5cZ*`G7N%Cc<@B!Tc-njK9Cg^)R3LXWwDm^-2V!jo!Uy0k(aIT<^-; zP=@PmD4>FCC|Tomux7lAk4%Uh^Y;a};!(i)cQyaMKpgjG&U5=k`kUpk`4csgGGD62 zV+h@3za&>iza$Rxd4V&0E6U>^x;)Z3IqCo7mCN4RR_Q?8F_h5@Z0|7rOfT#by|AG3 z)|{l(;(0t@vYyI|mwo1uu8aI|I=r*Go}zoP1kZ+=>t%ct0$n#$dTu7pA@Zl+X=$ka z3#l*e03A5aLEUij>FUjmbM$5Cmmb%9-*LKm5qi|8-=5zbkzhVFGKkdAq?O&JnFE5VpCh1>~_78SvBDdet z{&j7L*H6hhMA{y?TH`mJDf)av>fJnj+Bd}GFx!ijG#=Lq9<+`q5UeP0d+iBA4F z{NVf8ei;H?%7fs0?Uy9J;+N}F`sT$CuMqn7D}DP=PtE62ahi?B;hNZkh2T4qrtLoZ zev&-rdBc9J>h1e@z8xy_7ro^9V_x^~@;oy8dvuc;ySD%ECfon4w!a`L%h#Fd-A`+|Pi?Z?$FCBeJ><~_X15Iano$( zx#;~e+Go3GmhCcn<9kox@739Pyrv4;FRe-%H%%%GeGxZJD7>QY$0ZH*ylN8P zn}j~wgZ90BKPd0cL!+If|EiZ<|IrSeCy;XIHNRXcO!m9<3GDNc?|ElAO2_wpT*h6X z{94QCNxom4?S(wQ_#@2ssa5o=dw9iF=od{*C|sxTh{6I=Jnu8|$ME)fNejWh3g0tws`1xY&*diay(;+& z!T*-jms7rXpX;&xKX-|oE=l{eze-X+|D5WPJbUK?me10HmYFBpn5m4|7T3cQJ%hghTu6S^sw_>iM}Wcos&4AWTW|MME;0dM^Vnj0kNJM zH^E-?>9x`RpQ9wlk7xf+<#yKFdF#2n+l0nVNfH@nr)XU9Jdo$_{QV6w52#*%KIpCa zhUii9+t6=!Un}I*uYZ~6VUj2FulI;N**v!__5MfR|8t}Yy{p9w7M0F<@z!~v^ODke z5p*HF$@5hq_^>c6?&wd^d*l5-=L)?SP_Nz_@L2B0{gB`{tN20BH@NS;P6&S0;!VE4 z%W}X!+b`Ga=7q<*|K|eKtM>={@;8x^zkhm==Uvzrk-Hx^8;2fKe&xke?i6~!j)_WR zDSjPRe7b~RK0YHUeEvf48CCv_pdS5xvR`gc@yXM(Hw!*P%AY~S$G-Rax^?u)#P@c{ zYdTktbi;VFyN@~*Z+7=k=fs=c{nL*<-b`fh;?4NZob5k+4Dq83e`KDivQK74=$ofk zvvHO_b@jRH(_qI<4eyT4=>3Q_KRm&S5 z*?zTazw-R#ozkyP?N@uMU$#%CZNq-OgyVL(`(*m0e6@WtU5Z~`d~2KF*Q5A#DSqjF zGG&aHob?)?o-NegnfTFLxZO&dw%dZVjD943^sh;~Sw9-%De&bX+QdT zqMwV(uSQ9I{@1Cz<=K_Le?5=SdM#gvG~-8W|C}GK{d0bFPXC_3bK`3q51Izu`Cc*B z6Rckj-^+Xs6#q3DcUij_<$m=0WMGdbekINaMJF-NPPb3yl=|o9_x$~P*iL|-Wc!tpp>sY8n;(t& zGC5Zc`ztvw)35m>=Tt88{HZI1{tH@uPSQef zKiYi_@Ur`Bl6dDW$j{^S|G$mo&GyBd(0wuPT=}Vt-fG_<{Nj0zR2-U*b6skE;7&CP}U~+7FYgM?mrWeBgQ6 z_d9PAzUlm{=l80eE9ZHD$93Mi?m0{s+s9JEe9+*|mD6RL^mFT$mojwv?;ePMr0b!{ z{`y9to8KRvXZ-&3Nq^SQE7kl?*6ZA#JU?c2ko%+hUGMcv?2!k+*N*xOKBh0tuiq>9 ztg2j}lC+wixsl%dmf*93dfa!}ZGZjkiVx_s89EdBJio#A*P~yX_Z#Xm^hl4#n{Q>h zLhfx`Ci}6nb~Wpn)5T#vBXm){Q-a<}_;gU|5@5V(Jf@-MZpa_K6*)WOb!U7((wDz< z|9*Ls{hQGK6;tbb{6#y~Uk^$DCYA4)my-VNmHydyk2~jPSP;_38IYtLfzy5b4^>Mw_~q&ppT9n}4a}i``TM~{dKsV36MX6w zpE|{-S>uzi2mJcxQh3}Vcq}L$bBf1Jnf0!U;&E<@E_@Q5<$ylvM|yQu@u(;s*GoNx z;Io4JX66Nd{%xqmd1<5T=H-4d!;iGyJfH2fP0S0tzRUAMUOZ#%I<7BJdaQ~5PxR75 zLXWs(VMDxrTjJR1`3n2P;*L2fZ{wh$<~FI9>9e_cWp+b60>&e=U&qczVcxa459@iB zqqhovzC7A`cV67;kA;q_m_JLWl#VMZSBU5O_3^sbnZ$j5pX;sY`d4WV z^_S6)giqL)A2kcwUfg3D`p)eiSW+1Mj9XP7y0{1QViNb6ll(s3tXDU?eN+*3n@F@7+F%mr8|9 z7y2(~sQD#e5*+6mz&tYkGf6dYEsKjAPu#DPojMkV=T|p zz>DKQthbooyT_T|7q**@@<&yXhzEkYeX<6xO{=$OLbw%r4mb9TZ&ddkA9?kkM zZ~sG|(02*-=y%~8YA~;4^g~WOH@n{f_k?8kJ3JzG5z7((DE)G==%j;yTe3?2+U<^uW*d zOGHy@7wUZ|G!JTfZCd}T!YvA~DO^-I5I!gO2!gIjyr*8@LqF2@W)zm}ZB@?Da;b5bSX z&GYO?s@*?XAyBd}<2)I7bT5|Vw|f~Q7mr#-J&)m@!m7B{?(wR}}u~Jf{1ss>P$0sT}LSym-_c)5q>p$=q|eCU`tndpNlda8c;y z_h&KHpR=VuYM+#0msIn6=CnU~@u&|-e_+SZJy4=w6Fcc!(jT%%!QThrPxyFMQh5Cf zpYuIAtM&l&bwh3TKEMeo=lhF!G#4LYSQ-ss$4pI^oxo&=(rhv5L#Z` z%I*VP-+$H*G>npS1$RnwkLffyI&{#99MdcNt*Bz21l&-8~S`q z>y@Wf#p_P7|Kkq$fu}1!#CmBH{TkGM<@sGdFZ~+QehsGj1qPhSJ%wAvA57DGMEf<7 z8Fy*A?B_UKW}V#P7ggdSEaz~K0@f>e_Z;rx{^j0t_z?7p+ArRIXPG}dJ6&PS$3Lul z4*l<6{Q`eS?Fm|^wtJcre`N*p$sUZigbt5)y&CJ5kI=a039X@~M;h?uyPf!0&0pzd zefK!-IsC`h^EhdPT>l5W=Wz0!%+93{^5PHkQeVH;*QfQpUFu8x7{x!=kD0@GbN42~ zU!ncC`W*WT4s82`z${<cfNlM}!Q$=%D9`f`OQ`Rs7>HuH()+U)`<}>G`}G}P7I`9^1USU z7cf63_bI+t@(pi)NYX;^70}K33(61YFZ`jr_xWC@^KD73qg-aB7NTgd~6+u zUd`;M9+T%jy;#nCx$7s`{9_)cU;mwr?RLMu^!)noZ)bg&o}X)Fex4r}u^>M`yPkJS z$9tY#v`5DKs*d+lkOQrcz5^up2hcfs&|wq%tM3>2T2c90mNc`!n&y4}MYm|WL(`4+ zf1ah|B)$LhEFDjI`#%f1KO?pOv*D}@rQy@j|BtHBznWjMxPiVtSLnT@^j-vA-2Q4I zGu_`cl%n^>`>U@LdM_xw=ak+}kdG4R%KEXQ_~rR=kG_uOY*z8BD1Nr?{kKxlneVSg zKYCpp>WSK4-JcnM>^J#-?Uh20Nu|ex(j&XxI;Ql<^8^1}=rOMJ7*l$fU2Es(`!e|O zyzS%je8Fc_@flHkc4hc8sQBdR-7g6~LyFI!;$!!gep2{j`}0jNL{E}&#`=(do4MD6 z$l>{&nD^oi&^zOAsy~r`j(sr0r?j5kR@J{VerNTo*;9G`+5N(=e&tu6^2_RbyU-)9 za$X>fS8r9k>>m2A4g2*lm*0ec)=q>!6aOsY{#81)f9 zpLU<1DfaYn{*K%ecPX9n{HX?^ zQxDoHbxE4NhkmpE)DwIU{ho`ZqYZkGb2J5eFIgvgnY@oqVjP?QRqdWX_8WNKGe6^1 zB4>fpc`c)-Ebg8+-~GcO(l4b|=nwb(qc4iy$oQkq|M@!n5YO(heISO{9>Hrt>z&Ks zW&1z!yLKn`!?{) z-3thR)V{+TO~HOLKh*f0tY2Y%P4+9pj?4E)aqqpaKbBK+aIVmMMd`IHsh@vQ{kS|o z<-+IlsN_~8a z1hc=`#Q11E(EvT9pW!!;W$oY@T5oha{F?Yx>fdk$^ow7GG`b!5#IHgc;d&r?FWF?@ zbCL5~e>^i2_MhOmAg+e zekuMr{DxCe2 zh@u|$^ff=R`R;ysOZ>8XXPTk!8)`0+Hyl5r@Y17^+EL+4Q6S!ieC#hueOKVQty2wm z-0b`he$%i86*O#lF7h{FovM)vFFjw4NXkd|HD~;i1&(huP0Dl5KZ2{aq(S>0o^L1L zEcvmH_6VUV_#K;&^6{|>>OUdH1D;<;D8KK2j58eKJ=+!W$(n%s#U{`EP08~=r1NF* z*`UMl9e7>{u%5_xj$M}Yi|hFat#4a?i$@eBx`}%|8PDOJ{4b@-562&{!|}=QFXPMg zm-yU81^tXpf{qPOIbZ6d{gLQ@)2jHH>GFQRCb*um)>G1YYEDW$anp*Fr~Lu&S6#i! z8`gU_*E^&2PHMdYpQ0cdA6r6wA?V3`BhxI{#e}3^A$Yo^)#!Q)(RKKaNqHZiEeYj6 zE`Kncxt`(elLE(%Pxn@T|7v+m<=-iPL>162QodiW<6vIxeZE(i>yKZ6a^?^5a|(Mr z8ovPjY1neDWQg}KN!tNGZn0s@d0f5F^?Ot<+`+X{y&dC_i)TSzcphL; zj&^72u;3RT8xuMW zlBkXyAC)i;Xq{W&>-GMI8=J=PUiIwh==RaKvK|H9L)DYL zHD?7ZVb&j~mq4z-^gZ2I20pirD*h#D_fS)vqywdCg`Wz1lpl1DndCnmUbQTDDi6Ii ze<0;UrAOQ}xMBJ4upXaQJwBsyRoDx@k=(L`asN2Ab<*A~4B@$?G<@a#B=lCVK=dBN zI*2A!@1B6%_p%|v<)JQv>ra3WHy+k~C?~+D*uL+10(^`QACqzeCqTDDhcU4aoB-Vp z9e#_vk4`{Nh7TW682b6f!!Qt|6X3`2;URqwI>(0x6$YQ&J%wlY$@6$`57Jk6A>Xu) z-@Tm*WBkT@+ZC>W?|a)6URJn8;Zq716<$%eQQ=jE$snL#G`*xS^h%6rF&LP}I5@QT zZIW+bI)FUwMSL#4;}$JHDCLLuP6|A{^C6_WKY;goZfAJs`|*7H`y?GGeOJmI+Fnxl z-xQt}xDb@3z05d(7}5Ou0eOGA{p@D<+!B&JZfN(kp+2A^`Zuj7Bd#Z7_xz6F8#fiD zJl&fhX<|<`ZdmV|xZYg5rylh^2D|6b6x%%rR3>&0?6icg`u+~-2GMm!{>Z#{b`J>j z#MwQUf`0ok{^EU*vnS5(SrfVXk8Jn+?-SMii#>FHwh&-FtzirN3RZ(`&xAXmC}YoF z;CaRD1?PWJepZ>gG=5hI{!HYp+PwU1lBbMZoGt7lxw#g6>`?u44)jb^0$)!z-yETN z(B_*4iZ}BwYd@%*ZkN~89`t51FG0_puAK|2`YkV$3hA7Q$cek>+W9Su^89r57OUD% zx=-f>%JaNLr1s`L$Ypxoqy2;!?|QD-z1MkdU`p+j4&2*5Fr{`%M?1<*Pf8l^!~7P_ zQ~>WEmGt__SxIj^XG~Jse+l?(==1p1nBU^PFc70@&~d~9U&ecFK5G&D;=M&JuX=W`&1cZt@m`zHK)-lz zdOibv4(&Z8^$bjdeuwtHLEzz?kgwtGw+S5YzCqH0e5D0^V-^f=S2^4%ubn-1CiBow zzlHR?v#Vg|$2S14r~*FGc@*&FVesX2a(97OU$VdV$AJG0O1B4-?&rr>3BA~b{^yp;u{)42c7pCYTk%?9}Mu^ z=v4;2;#Tn8&7;GTJqR(q1nh6~_%lD;;#Q^~&90>HeoFnrt?H*uf_~A%O3!^5w+*%M za~f)Eq~1bsKpLFad6e$imwMd!yAtr>cGGsnJv{$Ug5M?|wEtWR*gfj8)2G_sCg|Bn z=`*hcoF7CxhHs?!H`H7Q{5VKOKaR`MH1Vj#Ey5jm9$$rVGk*bK7r(m-@FSRJ0-HY? zwqQS3@0Qm>zY(43zhKw7IC#kY<+#N4JDB?H$Eu$7<|WQ=^Agw3IpYUapX}dQulEo8 z^9R}~1RoOmhbK4oU;C<-$3ASEU!pSPdwARHxf{Xoy|0rrDxp6&Zd3iJ=k{*g*01k% zKHR2y($3d!!~A9QW4x_P^2fJyYB|VHyscefwd1#`o-AQ}#M@f*J;p`6t*9{MG}iAo zM5Ut8Bi8!|q7vlV;&#U}>ov;4YHhIVYaD6YO{cYUu zPiy@ps(&6~F=xk_96tiJNpb2~jI(2Nl5%<0Z^KP%4lWWLH?0cHay99#1H?_If zo^Z*-tFb`&J(%h9EsDo-O3jj8gZ^4PEOPgmjtHJfylhC}arC39PvHrL`xTy4cu>+q zN5&*&dOnlzvp5&SYzf-;N4P&<^Uit2O{xcv!Onby_(xp~hL6-seLkJ}o(zAThv~!p z8+`}w^VIoP?`8DMEioO5UjN{=%l9qu%*f^c&$Ub+%oB9(P~>v>FyztByIWk;*+Dy~ zF#V!SAz1wVK^adMT+HG`{cRWgqumVAxEMgn^DXC#n|jc{=Hxklk1$qx^SCI|t6k^L zNQQ6#GH@N0CzONmbui$rqjs6T-D)?4hnV_7a2=KBcESP9P46#}B)EpkKT0ik?*SYh zLP5@7q(^aUQSb_12m6WZZ=vVimudck&y_#o)<)zzxIXTZ7ZARL2XRis{J`)a_nz?v|H6Y!3PZny2QeSUt$Jb1o7pVWNK3b$xKiV9EYd$sFZ+w?vB{uBLYtdqqzj7hnzXM_In4UiY+f063BSySWVbu?(&=sEMToziZw zCAf~{oLlbJ^J>>o^8!!ML;8_Ely;(N;K}^v_fZ-B=)OX-5q$wu+*tB+K9;Pg40>?; zB8M(Np3`|WX`;VoIFEpsDAK`^9f#hFJ1S=RuA~@>Unq>?GfDs zABY>(v*PfO_GX|jm_CvZVjIk3*auN%75S-AX?JE#;O^Veu8qT+iQY{2ZuO_kj^lB@ z?2YFe_ahz}&47+K?#KNfamO7ZFVPJ6a1G%j<5TguhV-Gp*P&gzH{lv;SDwEV&zZdp z8$Y^>cy954gkKn!X?~eM5j|Wl_*_TylYW;m&btq4JH!WR_X@yV4>!f=aeA|+*1qYL z>!=^{UeoRuP)7P4(zr)Ba}48V>Mo?y*!LQi#{`a#!0wIDIWF)cRJKU}@2an%f7$-P zIOq8#y>9>8lZjmr9~qVM{`}BMeBycaGipaX_)eNn9`2HSbnXNBLup3zCy_pw*C}}` zm80q9QTB`I&tTWZ#6bEr&^i(SI3_LWP1JFQpDRglHzk}uDq)@&zDMVqqj(?dz7d;m z;{CcWdf)i};T(3~LEMUc-C^l&X@~54c^{U3L*a_TO1~!T=MGEn(D$Pv*J0@)h5HnS zyv9xa3g52p>l9Y`)pf40bgRB!)Anvr82g~Z(ouy^>3i@YZfeo`-mmZ56n>w=oeIBK z;dX@|RCq|?_bA+@@PxvH3O}H5kHU~6`p%icxEGr26onDTBfC!V#rM?hzMHUguhv)8 z{P1JRZq)qa`X2kZ!_vDHUeNa#_w?O0DIZnFP|wjzMF32{gttB)FbSRLDb+LKQB3HZ zkH=|v3u__LLn@cokZ{R3MRh@V6cae-FH*knw#zwtzSTNPeX82bchUxLEz`hG#-4u$6w{#k`* z75+Jep~u3bFH*RI_jkNl;PB{6^!cQg+oQ1BHAg!Yp3wI{r7-5T@aQgu$Mro^k;Y{c z^n3UYOib)Eo|$>Sg#MXbLE}@}%gp;4-(YzXxdi#B|DYeO zuL)gDKD*8TEP)UFyq@uz2A|x#uXb#_56{U@SyxY_c7n;P`ID|bwGY_N5xih7QvV@e zF5e8~&&~fZcPZb>`u0vhj=P`5)FgTmKNxQ}@9&VuH1C2hJRi*Qyx-apa+s^FU!) z>uVjv`$^1$;lmF}ec=@N6_$0rYXu#{vhq#i*kM`cJKaYYmUX_}!xmMMux@ewv<}ze2K0{AAV}SG$@&C-NQL!llR_JF59eKKkfS=U?who+D0!aoJFV z@BGF$bP1kYNnTG-{h@xJGTw)Le2$4DHgvo+{_Mf6uo|7r4K=pO)*{Xx|=%M=Ae;wCnHNqh;uIag$MobspgO$Fp=l z7pq=>AL;dUuCow8F5=d9p;LTLQR*jqROlafbjoudZ>hgbmC;Z5O6_qwH`0c=u!R1T zeJ$mZbum)d^h@l-wll7`->bJlZu1~Lsr!ox!BNOb3H8zU^s{Lg5 z*z^2~`EyRnW#TB!f;Q>@3DisVNdBn`^6UIy{uY@+_^jh+=@gz*dFj`Q7SK`W zb+RK+-_#=VDc_CX=BLoTtMcBy8xu{ftk2IxpkGuPLOy4Ij3S@5-|e1{3m)^#JSm6q z=J>A9oqceT<-@#U`CPn4<=4e)^xh+u2kE!opOw&kMB0z^zR&rcsGsL`k*Ap=N@uh8 zqVkgDGx}Pb+4$0}bT>QQwRZ{daQ3>|r*;mQ$F=Zj8uo#+qu-+VpI8N5%nvB5{dg1J z&%Y8W)2T>*vR%vRbwmeFyKkj`=*Rk{Na@X*UPpg3+)Xh5%nt2Vc`!W{H^IJ&CfhM@ z)Dt4~i)M5lm|g?@IzfONix=R%u74h?FA5y@NJ8TZdSST!6_!uN)o?u+L;ixoC_w9D z0>?!#G%5$cqu7b^YPZM5ixh?(&3qBMRyr|mi5?U(rO^<=TB=3~P`DxDo zzD4s-x4C>$?@T{n8&_8%Upx-~Fm6LUIBj1uUPW%l$xFM`6O}trAH5emnzh|>7wA!Z zi9DeBLGle3&lfoEe}SY<-c-J$a+j-5@SPe0O!6Ug*kSee$n$7=5byKoa4GT|{^r-R z{wmTdo8RIh6mlV$6uepAbANa}vg<|az!Muz5j^oot=dD4`RKulh(Ut-ugdgU5=U?4=X6v2bNv(IX=4JZ4 z_LsBkooP88K1`YEXYpq{M-#n}M(6vhS6$ABAjL!g7vqCEuC9wXn6MBq?BjBXZ`s?%o{w8IR9q+r;W}XK34zf&9v`^@k#qn zpFPO_)AOYNkIOZ zkE9;hHQ_+B!w2+yF5nbB-8%Qcd8zzAnUf#(RX6~{o$-+RUyt?XbR5yvv6PAsZ#bXO?>ej-cV8rE1o08rBjG_XCdr2kmXG#GI>CKv&93}Bs(ADho zLmkj7;lrtQ$eGkSq{SomA+8pcK-aC*?$>GF;e8<7?yes{c{U}qPqtp{fp~u-(hm3& z6i*R2S+}cG*w*ce3fsCJ?8ju?4)$lVZm05JvUR%v{4UwL-HO&{>vqcu+qxb26P9e< zZbIMNx?M$K(234-D{Sj_YYN-C-KxU2Zg)yyTen+M*w*b96`l~hDUPMEt=r8hZ0mNj z3fsEfsKT~xH?FX)+l?t~>vlS>Qs?IEoP(X;OV;g%w7jj`LC(#u32UCu>=r#Ju~f3G3EDsuH2DMo%Y z_+@&#djQW(-$pZ_Yj+=>vp!|KoW7=h@Xz9k-NS(0e4+Ada%p9Zk60HM({w3(~xC!-zr7_hrphNti>e*vi zz5WR6b?PtUw`Fq{^5eK3DeTvUR+WxA(H@%H`V(9cX z;vHeh^maw_o8AtzKGWOd`rh<5{Ai22C;LN8Z!c?p)7wi5o8Cq|G%T6kUeNcZw`UbL zy*;L|>FrU4O>eI$Y@RM_w)mB9>5vB-S6^= zUa5Pnz=_`emG$pye;Mx+eGB^3V4yp_{1mqINdGv!y-#5GzV_$w-qlmodZ0)WdLBeM z>bK}km%mN(A8_@uehJUM7H~#yLvgu!3;U6eMx)dVcZcZw3wTcLNqsfH2)HJ#w_on^ zK_CB;z==L?2Y$7KseG&ni7ppOLiTx!s*V-+(lDy`+iW2K_eH+nv&0 zzTO61fAo4AbV>9!=$X;mC)D1aOzr!dQT?oXIhyLk_*VUF_aJU1zCNJ(nfbVDTZiap z|NXnx>F?bs{f+P3CHh;xA6PQ|jqltgcDKrf+b@THhR*I@`!{B6qQ93FHvPS%u<36d z2hQ%E)%T{qD+)WiTVd1RD+-(bURBui_bG)rz9^FF3}?h$I$-DcC_0(>hg=8xcKb?JH6O^w|kHJ-U&EUUz^tV z8!kWB7w_xB^PP9ebK5@?UT`P!k-kU0#{gTsFBLEdFNoLWi_hsneZ^nHbNW~M)hQt5 zKZ55}ue84(`XszClIPu5TE5#|K5jog(usO6x&zO*YQ0x!{^r~8oW`Tj>4IAYcJ?QY zIt&@7wNCC`E7uye=YQvtqX@2jmYzG2S*x+P9`@yLOd_tgy-id z|BFB*d@c-TI!7Vx+4p&GY=s?Y>pmH~c~Gk3{mD{}{gxs?h1od+o{BkxV$TD&A< zXJZ;Cx&sfJU$3J&MQ)h+^fSH~AB_G+Z+_lJ`Pd&|mb(3NgcnzFGd<_`b`Bw$(RqyM zD{?_8|Ds9Auf=0x)%RwfM`fJ{j;OzL0&+RujPhFv54zq@zDrZ2N4w4)AxUTa>%~sC z{zX$QfT>;Sr;hu`Tfb&Grv6Dj+YjmHUAXOZ?x@byBl)L`$Pf2FF!^Kpv)n{_A3fU( zLZ_E9cCagpl-^AEbDE_y;yosJZeL~z{!Y>__&Z$x`hLOhVLZ?;_&ulTm$PfouX=&a zAIr+t>F#IM8mev^Il z_#SW)kHhzZll?K3?{j|>ziv`tvkO#Tm&`6u{Zlf#K=qvS>!3%&lGz2&2cf%{3Umrf zW*5{6-NKUD1)zIaGP?lZ6Aty>F4`Bb_?caR?-3{a=vVZ;*#-E1aT1Ti_m7i!+=S*g zJ8fKHI|nhQu*FkH6}Gs*h{6^(7*g2c1cM5@IDx{>k5}02k{*GhlkH-shWEag+2i&L zhxfb>Fv+Ei%Vq(C@ZJaUoctA*ukhXP5!l7=?)wPd)3{|l8s7VxfX$z}Lck!r@53&i z)N}ub1a|ZJeJ9;}sb~Cyfazbsr&GWnJYKZK3e&g} zeXja6yyyM$g7s68{tCxG0GR%5q5mx|AKo*A=af(IJN__W!b9-0_}x9zE}!)C-YJ1C z4jJB4a_^;{2g-nH{*ii~C14OvOyW6JBK6$!kigwX@!siqOyhyu&v6j%S$`Di&zm*v zrj&oCH*CJWndnrc=eF(G=K~+_ z15E!)|B3<R72Z1mn98-&Uv{1=JU;942|f>eRN!t_yz~o?-;Z?SxTLmz z!u{v=c^?PYZ~GUWJXn8}zTJ07@!-ZA;0M{cuUOYn;wBx(x{u0VSLvqtoZ@;iuC_iU z2!4yI3d;{+oK3@CO8l*b?{Q0sUY%3e{HQ7Itl(hLh{b4 zW!F7>WJEE)`MxZEUX z{DhaD2bjuBy;mTAc-c?5d@?Ry*d%bb+UwzEKknXhJrsvR{V#w6!1j~Wca>zL{p&@% zZ--)Lze4K03;{V?KfQ*si~jCMIX9lwuLv(80?^Ow&9I#sVwftE_V^$Ag$T1ado8?# zxk`FsKoVyccf%bD%zv|Uz2WYsOGaBK4ljKMV58GP)DynoX?RX(NPl+!n84j|^OE!K zN0Hy@XOgQTJ#y;}uhI9E@birR2Kvc9N5}siQqcGxUjAHxO`hWYy54Xpa|v=)q%?fN zGZ_?rsfALDCk|XHkLi4bu3KFCRC(am*V@k!IMnY#hR>&t(C<(a^i@>qbM`E^7)_1= zroV+hK!fb$etB-^Sm}FUt{l_R=2Kdy7Cp=QUY=i0FX?CdM&o^|PacF`i%MN$2b+9E zCr1Din$o`dFwjF67h6$C#6Ep`*)>aZU2%-lJau>d(kOo)ceF z^-sF;>+6U9uz4q%>X&-i&Tk`9bRPmeLOn;vbmaEU4`zOeoHScLjpr#|q1utGSGZjF zE0E9mRktZj^BK>>(G13~#m&NpVYeE7;SB6rr>9&blZ%iC)5q5% zzuiL-PQre?jvg~z!YSB~=HJ8};A5!w;U)QC=O+0&g>K;__8+-?4?`bxD_(T|PVz-l zlag9|#{A#71JCJv72Xpa#XfQJfaj){O)l-+D(w$N{UzuF_uk31=?RP%=3kNeeY2)) zM=_k7o3?SK^I|$b*$I+=4;7-H=_@W9zYWhMK4{|~dc(bMHhSZ^>8Uh7qw=WW!Tl&wk)+=vN*|1WtC!A;$nzv0 z-bbZV=#QH>S5dFg-929fKi#~!w4R^(JS@YnO7sc*F2>*2Clp7McETz6U1pbs)9|}2 zJ{#)2v*xFVlkgjP97=s{pjS8rzt!b?82+sDb9N(Nr02(Np0oVXOn~{(>?E}h?Oa|a ze|ZJ{SAA%41Cj^GvCfyS{?eM0XTkdt#b@f2JdaMU;yvjzk@t7wz0)IFpIdKg(f2g2 zMUPyg_38PUbetzTxghj*{t30iKhxLr-A;LL@@xBom~Wy#ABI0|>sfYAis{R!gp;tJ znJ?}1e|JCqL%+2D!LanNQ(lw3HR0r~NRMp)eY%|CW#20?d&S1Z{Kcp*vo2(I`okDc zj4!uicC6EjYR^U|FfQ#mulI0%Tfgdl2LbepX2$+6d+z~X*HPt<-zVoqvJ(=;mTcvv zJ>wKbKfK7naTKK~UGZj-QeG?!NhB*y6q^N&pNp<9MF|0n*<}?6h!7=ua+6t#3B{sH zbW;MR1Ox;ky6A?@f~fwT@;!5}-m|U10>9n=fA7cEyziYeGiT16In(DV-=r^D!kgf7 zc{6T-{@6Ua+phBmZV2l=JDNq`@>M6Mh&;%j`D=Da9?cT(+Nvjj`viAZ9R%Jx#Xs^@ z-vk~3ehhdF_#43cfxixX0QhUb^HHf8?va1Y809 zMc_&qzvrvI09*rn!2Ch~LGuUx0B{!g{lK-r?*py}elKtX@Ca}d@IK&X;P(Kx0>2x$ z4ftKa?ZEE@?gD-oxEuH#z&*fwf%}l(Hv;SYRKDsBz&bybuX??O2mJtWH}LC#b$%*e z)eo%mQ~9a~fpvZ=U-eqxF@%2&@Cfj$f%gKd0itmL@HY4l0^bkZ58MZ=>lOK`7Xs^g zMZW3L;l`|tTjzN!bf4R{lG zz95pXT= zG{A1fm?tp5AlzD)zbw> zuP%ptwcU-X#GB;PfOx-+aQ)!p!@v{ZqX0Y(`g?$zfWHGgi0~f)o<#T|;0e&*3)~F+ zUEpDa|0wW5gx?N43Hp}+H~fKro4JQTvrGlfSzrp)T#Pb8-F~su;;0lD>1sothF9WVY_#XoA zNBBM?q9!L030cRoKJ-{^x z{|ewrg#R({1j2tBxEA4c-83v@5q_)1hwwiEo<#W10M{eDuFKl~oP5Kfx8910B6X*bm$_ zr)$2B#kg6!3xT^_GtT*CiMT6OPk9_uL)i8Oxhsy-@T6Blclq&(DV)$P6d1TGPVjWB zIqur02)1>hXtVZD+!eJ&bmtV&X?x1!E>4fvx9Z7lQ8O2~=0!s9u02!TE6x@-TCV*w zchy;n2Qc2+qw@6QUz9iZdSv{}k<(Lr4%Dynr7@4WUFB@!J07Ppe||pc3W+8@Pt>Eh zc-(H|Nn6LW@niB{-YmyU|JmIH*Y=s%{dw^^3i^Gxm#=f6SL{Q{Ind(!Xzd*6N?Z48 zl5pI6k#nGwZ%%)4b(g&N=RlX&h@Fi7_Z+Co1>bdw_nqw*`NaDuv>zDnI~#$&?W53f zLcH&+7yh=7q7T^iQEUOWeH5tw|J8G#yHI~RoBJ7LzD#gz$1k4lzv?3ON51?zbqB|)a*%jBFHpL9;!rwu^26tUl`?Ai@aI4~F86dQ zPc;<9^7QNF9hXd}zw1)P<*>I41XB7JPN!>cR7`)xE^}h^xK;m0Tux8Y?|7PGDqo>n zD3Iv>!P7~8yA}(!`xK(BIzDu(nv3YJEuw1{{p51w^mzYRJ-IEf7Bad&{!01bx~@`p z)ivtgd9}Fld7>tX$L1+*9?;K=Qai;@$vIFRzWaTB;h>It{r)s+2bnJ~|5Xx=%=2-+ zt(_^>U(?GHyNwPJ>p_;|CBE3@^)_~`9rg2jPyQUJj3=Bw2dZ*){v4>vCq4(N`HUK| zpW!feefl}jx5AFt{wW=Y#pj50Jmvg3A{`&a=ZK&W{v45xi{t&mI!_+&Ytwb0cwgHv z@@M!M0zc zxWD2$a-Kd*zuc-@6jQvl^vmp>^=md!q)caa!*#SMeM;?syQ5WciQR7Zbi&u_+XcsV z`#ID7S3O((z1`ONEZ5OCovxF6dT~8;9m}WtuewhCeLU@|haDZBj_rk8rG~=W4NqUI zdf9R7bo#q)Q(R)VpEaGXeWhahJKb*oqrN9OOZpwx`*73k_A@=5$nEZb5^Vd>qJetl zZ&gy@@nZTt4Z9V%bj2X6ZYd^u>b$oYHDzumhM?$G{hu|Augme}!^3Ojz^ z@{#Sh$|>%Dt9LNYlGIG+Lvg&%^I)ok3OI{+%bdwOT+%HR(e-_KJ;9j zPxRv`B4c|=`%R_1Y#zYdwH}LSqx|slK68U$>o-Tsb-vV{`9h_md}ZlZ$+=M2AAc_N zOrC+D{4a;ToT(jbclJ7czouFB=E0qh&2{AS4~+@o@_el*YP@cR~R4g>qX z=#lNN@^5z5+i{A6<6$n@ZRw>y^w@aE>!nT;ksOs@latBEnGS$83MxyxoH1eTA_1a|`m`^xe%HQcU_P_HmIwny=UOCpUM{ z(@VUS4+(C`iW9iGZ}t9Sm*>AtF^!ugKGY*O_br}I;;H_3!FF!I&D*2?s5frzn?1e6 zbDluT*XyU#o%{yH#rC~wK;Oe2yLqn@?CpEiPVX;#FW9A+>anDEt-!!l?eKKMcg=Re zEzRmbqdh-U>3n~-*q+bbtMOC4miSM8yT*Sm;wMM!`H+@}$-Ts$&wcImc&c=wp~a`K z>zQuu8$Df?ez^s2QcU@-rC&Dx?&kK(dx!lY(Q@cR)&2T@{x)%Go>$ws`8r|aPSS?$ zuV&Blk_>&{K>1(0S@+Y+xBAK{!Ium5E!=;FEeXuIh9)4F~b&yVPOWIR7I_B&27o*x+jw)v60z&1ZJ z4D9Defc^Xkus=@?Z0D(UJ=Xd2)VjVK-;-4fdOJ_8>(BALHuT4zr-t76^VHB!f1X;` z@$LKoeK!^H+r0KcV4K&T1pc3WKG4pAxVihecoX*glY&d_`G-B7*s*yZQB3+Oc5IPA zw&yCJxnrJQ>`mpUV6!W3?jzn`;+y|D#U=Lqvz|`kss4<{bCx({r$43ss5frzr#-#! zYJoD@4bR!d;W3nFMKcfgyIr={xMG{@zi`&<7pNr_^;dZ z0~)`#=bzX3OYOOohsnLvp1)^$JXP=3c+M1u`qvdG&kuUKEd6o|KBTzBo{z|TSG7-E zvgaDU>K*!i{=@oyO{Kn{|1N!h(mTcd8`yJ6=dWPTC7#3BbN{}ca=`tazqLJoI`&~? zDZRyWKdJ4ax92D?-#^#=Cb2zl{VfYRw&!iYX3yJ!&7OAwn?3IaHhbO!Z1!CD$JjY5 z+E)*MyB}i`*zV2J{Xp?LK?x%{^DM#RM>y&$e&7Kbfn>`-{ zHhbO=+=ul0fbG2Z7GOK?-3x5%6_vnt-n$0a&UHrUBT_dp7~w zdGBVy{(g-6f6B!x^Mzt}w*5q~^)LK7;{B6FbU!SjL%qHK>(lA_zNU0+{OEDpzAdir z=imPw#ndkn`@2ve(M@6N1;_0S?7;&+Q#!Nf+kWoDO|$0@{AfDetADJR?6%M? z6-f7fd}BJ@Yadf=?aVTx`~Gyg2Y;a0>^jEPuK#=bo-!f%c+GbO+dc`KA8yfUj$j4( zO24gL$mo6>m8-Y^SL%CfH$$9@^Ztv>ALFWR2jvCJThf2<7lN%n9S*4+{dtSI2ww;J z-v1R1Pvs-w`ybWtEHrxDwr`5d@n;!7@GZqu9<}t#%FAsVm-p_~Ulo_y3DwJ2e?i~h z|3!VD3H1GIzpU?H_a$-dzKd|T&Ue}TG~3rKQG~lyPQ~XQ{JaOzFx@7&Eo^-0S-TbI zVuu^F|4rkdEWHo6YyL~-ac<&JR9~ncz$)$g@voKFG(V*C^>qJ{m|$-=*`HzJI?NcFyMG(Z8>rUGe*0ay-TNZw=M{iDTmOlX`&i zC%x16RE}Kk)c+G~=fC_q$3hNG{>9(7+MZQ<=%eW;%aiqj&fWQR8wlI^BP-8MDJ=&t zKjX{3i;8p;_ixF(6VtQ&!o+uTrsu1vC|_7tUqXTCIZVDZUeq7b3&Ez>rTNnJWtQik zmoHt1j?cF#wskD8XD?GesXSy{=H1Vlu^)pn@<9>$fXFP7K0e{xds06lgV+FAFGn$Y;>t|@W+xcVq zo;3XJUYQDD>t|rz-rvuu^*f#i#JYsv52f}gzK5$`$|=5wOUpH07t?aLb8z&Xz9}xJ zcpYs7*!mfI?kc{&ThCp^`!o)K-ufBiz}C;ub62il{R};K6>i6VtR-xHX#PE;=Pk;~ zex5-6(sHr~zoPfyP^*+zxT9I!olWWvHmJL+Uftcb>JIBTJ{{EkhU48w`pfz_x{VRp zGK#mo=sQ*KcqslZQT&}M(38{u%3kUGgy+}ZeHy-B$??)Z`tHv95a--kSQg_;Y;xgjuE_KB>QO_W7s2jenPa zc<0VryMHNkxzus|DhO|=ILPik`p@}WT&WSHgH!l*klb(G{zttZotuW25*rV{i1u6K zzKL+CUGy&Yz`qrxa)B2v) zr&emP#lIDpI&^~DfJqVPaooXSw@u|&P7Z$`$vsP62jvtE%XjtcQ-bG-+Y&U2+Z8-b z+^46i$gQ3|m^w+^RKTV&9h@c!V_w@>6DU4>T8KW(|`Y4k{lx(#T&6Rz7pV z{8=9rtog_VRkJP;tof`at;-Wm2PaAV(MpvEeGgvbl9Vrh|7>(85!1tR{A2^Ai*w^4 zzU!C{J}L5EJv$TZA-dJG?-X0UdiK*&oKE%ZXQ!SouBA%_P7i(WbJiExEe~crmEGV_ z88Z;)>yKrVf-PUaFZ(yamapHIvF?V0alVK}%Ga-@K#rELKGNr8zAin1^VKiq8V>b| zn-1QBe60??OYyFr{n~(M2&!lIrg)~ldUh({%9Rc#CB0n556ij<=gNOjb{f0E_sd>I zZk(U*mT^y>_S;GPx!~JnT%V}_1^jp!_n?#cVGT_OkIk4LJ`a)1&pX>Fo`hAJ0)rmTnDI6t2% z+b!7g^U1Ow3AX%vyzFklarw+4oDM!RV}8bp^1~WKdWZasAwNChuAcpZ;Cza=diJK& zVsTT!Qc36C$j7_NxL)PT-&xkqZt!r~edNaZ*jsk3V9Uqb%DAS-_N#_m7$Lq^h5zdtll#Q_)ysm5` zxp6)oEE^GQ`FKs)1A?tQ9sqq@9$n<04*F)yM|Y7Oxb6RNK6<3z5)O5Xn+~o)K3-DB zBjD=U&rf|%+*I&=N#`ZV$Gv5X2Cs=hV1!K?AhL;e4IdvWB1t5_nMK9#mGlza2v&2J^Q(-Tf|KTD=gLnj+rn;e zYEe6qDdVn1Tpl%LpB8N8F~98Tg5!MfOjA0TH)B2y7PX7x^Ee+<(mvVuqtn5skdHT{ zZl`#wXYWn5i<=78N;=0PA8Dx%x$^Z)tOHw7F2kEEsq z$NVoLoDM!cBmdbV{@4E_^Ir@8v*5oM{BKL$NbxfNIf?&6;QxcEt%P&sA4vTRyTSX5 zEPiR`QKZ_|D|2b{|NZs3;w%=|6Ikee1Rrc zzB@H3eD0Djz{PUjky5=kJs(QFeHx#Gsd~XNpR7me;Egl#IapL*|K%j+a~Sn?P+a={ zF!+2R^*rXUd|T=?c7yv<4U(>nBmOPL^*5I1zoxz+*yQ<2$Uo-uR`O2=^wDB^j#eLg zi}>uB&3tYFpS|GoQtg(jj^4y&IkYJN%Pf@vVO#M#$V?HCo z=^#HNpY=uU(e*XVXM^x%^NQ)OB-Mwf`x$8`S=%ej(|aJXfbW1RI~7sb>l{ zd3L0}EjZ@$eT3;d)HCwgU8J8~)PV{M+8?I=81%CWeBLbOoGZUc#$mbOM&UP>XRFxp zxZIzan%>{KUSNN-DfKSq^Qoy%ihs=KBZR5_pOMerBKb-9MU3Ri&<``0YG=E;TpB{f$vcjrdPhrv8EXDS-df2{JAWaer$rb$seG z;tx5e=A;G$ga1@2IE`>R;F*u<^F{}#{CU66V`-f~So;E=HyTIzA3*t!Lav8`uTc10 z`JaLhu^ap`IE&m^Pk$fm7Ho3;t=uCW%k?*M!$49`xm`>LPtf0^+oyv?a(&*#ERQLv zKh*CLHyykgeEvB2SBfuJ{-fY?>;{uEpA+->1D$vDA7mFP>7&lAZ%9lVnM9-YtjB0i6!4rqvb zooSvJ^1K{;-Xrrgx$<5akLH3G2S23vV|l(X;C^4sXC(J{#N{5!mr;{^YWvB(zN7P5 zS=27=CxxT$Bf&0J!Y(}xd_Gs!zH;SjgBMb~xnK?WGI@51rp0{T8N7t(Vm|K(dIiV& z`CY!e%=u9 zxG?6kCD3*(=5v(%(^4ys&Sy|0&(~hgd{#i70puyeahmtNA~=rX&6QssJj8C$RHUDm z!mb;i7Y84m#%Cjy0P`L5$^F=LK*o@sqxD0_irV>SNq>32$dBf;#Z3o4`vb>QT`@nP zZa=xH;KSsm12SUty;>ym?n%Bm!E}(Nzenf$ zKoQ^f3*Y15`vCaki!%ANLzp(|cZbxFh0z zLl5HXMtmch--@Y2T;p@)zd3XTyTPvyP4726ap*(zJ}#GE9agTB!Nxo4(Cs04PgU|0C`W5q6{+&ZSZ$R_^hsK2utDlb_dXr!)pKl)0 z@wxH&jYIDe|G0eEKOJa)>S%lp7V+t*!$;#p@Hq%RUj;rtcj)&NZ?622Lv`#1pFO1Y z&G`KEp>u@~<8%KZp0|wc$R`f59Zu@G_HRBqqde=2>`3J^na>6ZN8>MX(?KYF+P$Wu z+zF>ATCRE)HKJbJVC!1Y!y9#di`ElGf2zyQkZ_}CiW8I{!~3IX-H!SI{6x!@&h9g2 z|CGGf`0|aP7k*aHI#Jdyt7mcPkzUWbPUxy^quwm z#m_!;C>-9e<+5u`-0EXb5W;BlUdea3+xmHz$@|r_P8EAuJ*!dLM^2YmCA~OB{P)em zeOrr|dw%~M`Ej`Wwx05@bl+BmkOek=SV7bjMd|%n^paQ)7B5Omfa(;dO67GA?=mCz z-g0(=@TuZRpPA{Cau}fxzi>V0`o{VH;byAm!(*DyJzBrh!4L-{xt>nEv-=9MYqs7U zWwf4gehxeXg-3KzM&-wJoZ%>=a*ZgUj;xKUje_#kjCuRAV*#{D();9@fPb`Q4O^;FTL>SN7*>3qJoOS{z$rGuvnUz|Qo=LL%wZjf-{ zWrukFWSIdRPxeLM`ga_q7D-a&)>5^)4@+gaLM>a4in$e>f6huzKv+SW#5t=Qz5=Pkc@YDhWhrQ z>!=*}41>Q%HJ;(Ug44lQOZc3ryk0^fV|&>x0u297c5;+EQS_8k`z-eF9>rW9yvHah zmnmvjNAFetVmaGA@*HlZ$azZYX?5AVAZO{0Pm6Do;$yqErO2-F_=4lPpXEG!P}_|? zlN#UbH%ojpZzgj7Yt)zJ6m#h7OOs^K+N)9SRMX?@$?%h}C#@8Y^YQyZswZ2E>dAu= zZE(1H(sLNS=6D{KcBohM%)XBm*AHDUNtRdFVd5z+w`6;?NXo5C^}5X3qi(^;c-v4v zj#O?drQF)VXPdaW*;P`Hlkqec@mEXsFNdfXb6;w2IPVaQZWFKqjSA3rCR8PlUU{|C4 zXFK=os!sO)5>ItTF_pE%bG1M^Kh22ty;FJ;Po)k}TAJi_ypOsSn26+DMuTEEk7q|H zJn<*#RPijX#wY146-eWgKB;GJ-W>HOdP%Q}TPeyH=-fP>g-FC#Jzuf$eZD}NH)%(F z+$&XjiEqC4sat4F&ySl&lMnQG{;IXF!}kRVe~8b`WA5X4te(1)c{Y*wyHFe%|2$6Z zt((WGQTy7c_gJ`j)R7iE2)?Aa$-f_%TN|d|0!#uI+zU(s5!?fO25>iU7Pt$TGC)t% z*apnjjd3fmj>Fsno)w|@o15i*vVX9U-=lvp(|K)wf8MhsI{)3l5Z~?d-xHy1v3}6^ zuq3_sJ`PQv_t$4B3NDXYa_znw)<1sF_Y1OX`Vh_eiqse0_s{Q3?i;zAUeZJBKaw8D z&m|M?RJqvwG-1*A1jFqrS4%$}Qn~Z_0M>*s@%=c_lZBiLy-$3A=A9_aH#i9Ps=U^v>C4L+C`*Sa<_QBf5ZwcMn zl^+w=4SikZg?zZeHx!dxlKF5$U-NXF54TIlPc3I7{W+gNeBYc-xBW4}{@e%gFZMvI zDSZd`(dqPsFDpId=Y}+2CTF+v^Ga{^@hnZhbGeSI+>S@opY%fb9Qv%rcZJfq9ncT* z=W=tqzpC_99VNflf^Jad#O1=}P<&p+&Ox~yUzncWcD2{u?hfmIBCapO&knWY{(Ge) zcag`9ny%@s|4t3bi^H|FtN#ir7oo>^+wJ_Krcd&a{OtOYVhShuxkbadou8ggxBD}S zE#E6ZH>`T$`Q7;0MRtM-BAw29~>+LUzxC}hZi+Iy)vbF--OYM_rE{g8cg?TS{l`+@m>>EtC)|Fi!1kR&hdSs%4$Hh;$b!4Aq}GGG1NpSoA+i~CW@{`n7hzF??d z`#ojHVcua-a5BCvGxVcQYv%rWpM(qdY|;4qc#TVe&Vf+3fmDOWZ&WepDehN=e%xO_ zga6aiALG>|pA|*(p1hvT<5aHNET>n}Ihu~bBGH4+%(GR`3g-yUXKojqU$atN8^=Zi zQ<5K%GsTrmZ=AG6jkoQv?DPH}GbF(v(Pn-4mj<^`>sqL(Xu zgz?F1G#Tob>{Y)14EaAyVOcKE7WwP>`_9b!MJ{&#VLme|IKSq7;ugz4Dfj&>_wA4a ziHqfK`koxeaL+cx_bLyUZ!523TX`Pr^{T(a2ekbzAbzrcMwcQwlXE)whT4;Bly39_ zxV7rie5u68(>x#ePZSz?@qF}Y_z3T(2fXBO3GvURR_S|(^3LddMpE8W zJRT!<>c5%DhpK5XdY=TB{Cw%9Jl|U>@kW_?)qAYd(s@^4U9XKYS>P!x?~Km-I;@jN znNmB%d?f2z4f92Od@U(ovV|-uyU&j0{7T}>VZTi^?I+?V9SqBl(Jp~9@4=SEW&<~CK88}jR_}kS`Kr_Uzk;IU7;~v@nr;E<65@O@pFgIddq;v# zE~&JfKB00enB3YRH(mdZGVQ=7_b$QAcjY-WZ+ed;7wn_rWt=S6HkRkT$_Jy$?}Rax{j7i zcMJ2CsNW5YcW~@97e(dEfi{ta>Jlwac0^l9Yz%x9qK z?ACTHtuP2f*n|5K4szmrPLmg5ej=To2y$g9@lOX|vwW%DT;C*gHa~B2KT>>QzCq|| zd@bQ!{ybpqN4Rb+K-W{R@oubDH=k8HjHhCL^qgSmn$;inBRol<*MlSSvs3ju(&>yu zK0hG&3^#O3MBxojF1~0^ugaxc4NNpg=ciovD&=oZo94T_1GpWy9k>hO+km@)TY-B7 zm-4$y`R(ozIy#yv&rIb(_p54rYns$;Y*v@_ou63Fdd@u5=!5WOWLW44HCv*8oFwc_+iXXw7g#8bxs>PvJ1efi2nS!>r?tnjrfOd3vd>=7r0jOJpzO1Y;|+APR%K& zgZorZS59fa1?^+FNa?tL#dQ0~uCUAN+x#%*CmIMe{+<2e`hMCm7JrY*8|`X%Usl4o zSJbNe(sR|_QYUVH>%&5yU-=Go2XtLET0X3NHV&#=*RSpx9kB4)J549)2s;^O|4Y&>Q-U!?dd;@S7a4WFt zYm{jQ?h*g^yYhp;4e(dJpne1J7Wmf!_aS~=Kcx8{;DzvS0L}t8A$$#RGjJtv09*mw z4;%mw1DD#{ZfXx~-JaVw))?9kAmNhzlM(Kp*V#Ui()Gu2ZpVg1Eu`KQw|i{It({|i zWR>LhXYIY*PZ$@w&h1(ay{G-%645Be_vO^iHPD-B?F7Zg;eYf@ink!-VizSH)L-^r zM*FBs`yteMpeGzQc|lI-5{4(K9kBfpQJwNvl1?JOoPSR5Sdw6z-alwMyO7Rqq;rqF z7Jj*%jyTiwq=PfX?HGCj?dSKj{DyuiII4RL_yF&+j~DT0>AqL^n*e{~>K68j8+D+ZoQN&Hx4`$?Aurz#hdhrU{}AJbaIO|eR5zjW zol63shx7m#>DC=kjCPs!&6LQ!SRbE=lKNr#uIbIBkG|b$gj_Q!*QlkGn%w4!^4DuaOHzA)C=NtN2O$~1u;dG$;x%QRYJjf%G@4tm!>@UiP@x4*>;sE&G zFK#-}{tfrbE0g0pV)|6#o5xpMitZyhsV}~d#1(X$lh0`XH7PH)XB_YS$?+M*%R60p zy>~DXZw<|#7N_&7L^`9(C=fliFVFT{as1ycivKjClcU=L z_&xKz<=ZfxgqdFCau|7k_upc9C+!Spki-3$!Z5$bZ6v!?v@bf`zF+O0t$!_IE&^Zg zlXAF%^2_lttC#dnmDI~xN{`d2emU32TJg`(DM^-Wi0=xesXCWFX?@vVNrf;eqrYDdQVq=`J09Be51-KKWA8Q zR5z${D=44zoicqt(5LR2E%4X!i!!~yT7LP=W?(J9d?p0e^2_^il$M{3qwE}Sl<5M! z%0C`Yss6;{sa`FQOsmlIID$2j?wj+NvD^D*JjAn-W+ zwcbV6@4`JKQ622d(1`L;HwOAK;1S?0zvf!V z2DMfEB<4(@K9Cm7Wzb=A)fnPW2WGT`-7^TB@K3b+Ye4r@Yg^GQ+ z2a3X7s5n=);1IWm)A*%${l4m#XgoGw!0pUiDBm3gZ6|WHn}} z5)M6~a;($#BpmuFu(m7VkoLo)x+AwQyxw)V_T_?qW;u>Sjt9g|2Rg3cen{}^>HQEE z>EZf)*S#w4hj6%MMd7%=Xzi@67ukJvOn>81=)(@QM<-Dv^w>IAbT-Nl>sis+u!lCj zI9u(KZ&%RX`1EaE=4_4E_U$u2&nx1GyAH;Gv{~y#xJlFN=&F?nMqi=voQQV7#{Y}^ zS&&rD>d-uY`Jdg-+f^iA)?ZDH`jHD>CO=K@Y(0JxDQA{^M(s-~ZPPEt7ze?&k&tI@St`dD#dyq@@qQ3`wfpR&kOi!?J{&^kcaQf5#npl5$p8Cra z|0UbBffz-5aJX=9NrVe`sogpQ<#21rt9+y{&>LR*{VkmuBZK;b5xH^Pom7A zlqs*r@Dptv)_T5G?JLu?zZCPQ>|UyT(>dRHa{H>sol2w5hJvFq4n>uU%>ji-u@k?{EjppADdx3{)TDgcL4Ga zAb;o?%RSpThSY9meBk@(aEY|nK%@e#L!PhA4yq(+QcwbUv=acPJ z*nxiSf~*KU?4SamCt84Z#pcTv==-okyvbiHu$Qx?tHES^|4>o7-1X-2rD}Jm<1TGa zIybgSgyE`sag+KnMs!U7YFfnUfIM@l`^5f6IM3woEv!*~&Z;<8<`Gz**$&#c`fzsj z2d|FpG3l3<>?Skro?LXo9H|AsUqF%|LxBKg0_no{xY`&qQcsYLSFL3;lZ?q>#dw(3+d$R-Spj8r1%Da!^XS;r1kzIdL zw}$&P?D}JL)laEi9~SxX{uzEETh|#-yUXd4D9HXyDIMV~)4|TOo=&&xlR}r|ZHku@esZGz#r3>b_@CL%_X%A*F6swvNBBYD zE?~3kTLfEq<}vTYSnYa+_gA|f2%ah@kEz@B$1owcvtu4DgWcxCKQtOwCj#eQDz2zH)IL8-=YGxZartolJe)ncIZ@w7S7<(?<$<=ljTP$Ryy$4c z&W;q>S?&s2df_@bqF67Y@rAyftI8_eHdspz*89cLnh! z`<*+KF5XwB<>dVrn!lCb8S=vTaOa&a*uEFDg8Hu#?|Ov8`FyuT8Svqj5+OZS4t6hq zt3O`e-$j43^xrMja~!;1x|VQ@2BY$(f@c5vW5tc;OvyToyHFs>l`=?=o%3+ZxYb~K z?!D65Z{6vr&zdjhD@*Ug#P={5+qls3$LD9{JzV>qcUaJM!nK)WBwpTk&UE1pUEeI( z?|mP6vj4D_Bj=Y@!t0S{i|1`5UnaK}>rddmPkvv|;Yb_}18SBFYwTIQI7o@Tjj_jSvyKsimXLLQx6;!UY zt_1%y{2PE(KBRBJv*2F?Tn1bLjQxO_gMXl8Y5yVk&FDT0S2zvyx{l}yrvi^4{3*b? zZtDse;9>Zm3_J*21Kbb10Jskra>{H0u7-ava20S5@I2sd;JLtEz}OF&X$P)^e;e?L zz^%Y2pG-5b&V$kXCh+l~uLtJS%UoVr;5opRz}SD834pboqk02*mxEsSS-XPj1&xc< zf5}B0eQeLqYZPqtC8{&K!K2$GoesQWI4vU8kQ)g`X=_0 z|Ip)>JY8I?H|{*$4`J!Kr5CF|*%OJU{u0IXSK?_BNcM+o6{Tl%=c|G7=jg5m-7=l` z=lU!0E#*~64JYy4VRYK@@N`SgS30U+Lf2t*&(QZ2A7w3Y7oI1$1@+d~W7vZgRR5)3 zU#sCu?EDS-{)l#-(&xwa8@nZ!3HI_k|5Cx${;nW1D(T%TuSwo#O{ZUarqXNk=I?!R zOS#vga>%=k2=kAKP`^*Y65u*Y%vAE0|rchutu{o&`3$UJ2~& zI^Al)>3O>jY<7J==*_N=0h?VP0XDn77uf8&o+C``hljt}^?qQp>wUmx*S7$hUGD`p zyWRtAcD)H&3Tql2c6eUgC2CDZZOLo$!C*je=W3^)IpOWRIjiqn%kn zfdq44dZMipVkcR>`6tDc|62Ox?Rx#S^4=}gf{2!*T$eTB{pI3D%cmq?ZmAC3UBean zeyiI1wVPqrcf+nz`DBTL&V#AlB>6CA`^c`@N4rm@#O~{`i|n=L$M@rBwC~Cf%ZK&1 z)V^yzOn!D=+~myf*?!+e{~MT3j)WfHf2ZH<-_pu&k7D09tNpU^L{43%A5#S23ANj^1rQ7@+yw8H} zqrf$w+Ya0YKE4ZF5BiS**Mfcra2M#m2iyeuj{`S=ekX7b=)Vs<0sINzafII`IG_1} zzAsEFUFMU(6H143;Q6{A;=T3@^4LdA{Zh~kYkanUub};jeCAUYPWjC2QMxrh!h7w9 z|<|n|~|H)@Q3tSKSw*agDIkYyT^s`J9CZ{o8<5|MQuj1Ggc5-Ir|lvF9^yhkqaB{|n%D(Ca+1 z-RGXiy@0g-3i^Yf?*jc7EIjym2k;>1e+k?T`Y&2|&_4`34EkRI_kjLO79RBP1l|k! z{{Zd<{g*8~=-&lA0{SO_w}Adp3lI8t1CN3JKY{x|{}l@l`u70u2mP;s`$7Lz3lI8z zzz0D88{k3E>%6{wPcD!9BWb(_`YF&4gC6_B3WJFMz3^B2ozMIhcrWO&uMFS$$YrO3kNDpYtnEiW^LyYi&_8D3LH_|@ZGZBaKLGCs{WmQ<=syUo?N>hY zN8kgX|CWUZ{fB_H9nEL{1UwG^$1ObYD6qD}`HZ&z`>5Z*9(GRvoyXPoJkzD^d!Yij zUEJh)(CySOu=B6U_tYVtcD|sU=uWP1Gm1k8VNfAv#E>sP#D!s!wlhr$g->sL4E1rKzOoak$`M%$-oK-=kX z6V|oXohs?^c$A_FoI6c1r6=RMg#rV&?i5c)Lyo|$&j@Zg)BKs5WMJ`hE92bnmw2-5 zOX1cn5SQsBp1e*7*}X$<9oB*1AFb4Wg4-}x!nK?wPT)3T-HYTZ@vOtT*DCd2L3+wH zvV}YG^!RlfjO$#t{$Tzz-#S3z@rv+EES%Uuj^B=iElDClMc63gR5rlZgLX z!Yv&dkFC$#Me<;}O>q7FN3`b853Qq$zBr86Z5+wvl_h^a|EI%x8P~~s@?+P=cg|4& zdT8H**jwkcAZT3$_zdy4aiiOCx?n$V;&dG4HmZQ#da7{rxE>M!J!@CqCiN?7yhU7| zKV(VTeN8<7Tu+$eZ{YVG^oJfR?@jcc{q5eOsP35(&)VfzX}pk_0M5?>zc5){ACU1@YnHN4Sn)Cl}~ zDo<~JZc@6aQQzBr&E8+l9o_F|<#m|^@a3@nQo**4Z1Y$x_aff9anvU@j6U2tHO#R- zXg|s2u|7fa$x;+<9o8qPy4DhI(d<(Bo+Amk{Mq70jT4&A#;m?~3-x_Q`%^BzNZ)UG zs<>;HYyAuhnlI)nOFrQam4n%%O;jHI-tx!wlkq0FEez z`?O8N**p{Lk>~@;gZ8;-IO2=TIi9!Dd@{dWq$TST^p5q+uS;-Xdi=VCRDRb|*#jLfxWbk2*YSoc zTmh`(6<4?%xDVmMUuG}xt?=(bdS=hMf%P6N+Gh)l`>!(Xz|TVXHsChkR^S!D&A^aL zrU^I){{~>Qm-WE<{XkmZ1HKXTS>PLhYk;*MM*TuGNQUJ$CsU6kGl9_Q=|WqV|n9Ir~QLy zTs=Kp{wfXU%Vk3KHIMZOl1r8-oGV(7uy(ZjS_$v++Q3;m^aFZOEJ(r@ZxXwc++gybF`PXZ@t7m&z0oKu4{h0U8h3gc&*>LiQ0R{ zcCRJPUub$MwZq=7Lq0aIXL672I@%oy$12I~OasTuN=py($3MB2_F{Ua&So6p696TSDO5Up;F&zh`eb^E%Ij=HC`HM1IJ{-R06R6}uzn@0qG_O(M zzk1)=%jo_Ie;>|nyf3G9xuSb1ns{EusXxzmeC|HoXJ19H?3^3F&t6UQAU>bpmjKSK z6_@P+*YBuquhxTg&(-&oX=yLOs&i{Ry|fp3?daQmx4z%LNXV%F{Lem~Ed6rsd5S5$ zTKd(pP$1F0P~XGOxb-hmOmIy zSpsRlC+y0`9`&d8R`RuuEgkW~lvZuKX*3jgb$FWA~s=Q_PV zm$Tb&hhme5^;eu`*xHA12zIciL*rxN(c|2m;u@V>w_0%A9~)G@Hufr=m+Om_4svCA zF+bccvRv%Gd6rg|{?j=KiHFl+ya}$Km&mBU%je0L?ZtX^yEm%qHi)~n4&$vMfUUpK3~c>{ zN?_|R)Bsz50eV-k{z4D@ZCuz6Y~#Wg_q0o%B+71+jwSzsF%)&kqOupijQg-yVI zTnKFA!UkX)7j^^NxNsQQ#)Sc}9~T1KxUg5Swbyj+MX=em(U)quS$k7mrUh*6v)$`o zPUTI-cxV*;@p95j`bYbuG<<%uw)@pw(DdZWpDO;<$LM^rYhY@p5)d(y; zONaN9uwE{{LMtHaBky;qruzr^eL8ps{iV80(G~A|Ipf8DpM5V))UGq1Y+1Rz{vDrt zEi{Y1hr>q%I_}({NC#UahiGI<&Zz2b_ zODqYp%QD`vc{w_7q2nLek#PHzVxkv2eWl8+cpPi?aTCcu%kiS!ru*Ym{@W`heX--@ zZ|zn%tagLv!6be*zVw7UMwFiQoALGRhMJ}Bg-6urnz@&;e&zG=z7O&0{v{f}BHRt|p9H=U_#p62z*E3C17`)VApPJM*6xNoTjf2scOrMR zcj5MarKj>{dfI2FbQGTT#rIRi?hw9@UeXgS9}&9Fx)U|sp?Zyn^g+@km)j+}kKV^8 z=`NJuv~Jlh@58}v4M(pf{hr|^<~R_T4ekt3zY#?fIx%h!*~hqh>Z;DgqIH9pG^ z`sH*!6y^7H<-afjyac!(<)Zu2$X>($Jopd7{|w;$@P7udj@R;;9I%e(@|jx{@90xL zP2US`)A>aE?)yPEX};tAF3S+_Akw`6SjUn1%nIOP_%{ISxHFIYRi*z%QFDEi^4i&> ze3+h~UE+F`CAv*;t-opCsUdkn9*dC9L8QAB82aMxSr`HRIq*LK`tt>^ty_=xW1#y# zz~i915I76`EWy6tbhF880{)GluLWMI82wwZZxqDV=eXX8{y|@&H7`Q=Nrb-$xE}b~ zg4te)oZwo&&DKT94uJk*gl_m( z1OF!AHu$##XW@T2a69}v1h1`o72el^?h4>8(5(_2HNFh*>p^!Va5v~Wfg9j|6>tyy z?*MLs|JA^~@Lvtw4F79@x4{2S;8yrw3w!|hF5oucX5ew)F5q_H>wqVK?*{GyUJg7a z^(UWM1KbV&e+1qS|Fyt9@V_2-68O2my}9t7{Tz0Wa6#)0_bYWirQ#sJNzSv#{KE_s9PE zL7G1q*8acS^(&d*iN9M)2AUq~ugUv#px-G9_b5)L*IzV$(@GuJeU$DHh39l0r%xMj zKItFzclmF8A5zEAe@OhDbr*^2hJGV%zV0%0*EEV74fLs8wr&yE4ZU34d|d~^sr>SF z?SjK0oqvkzbo>zxjfuP?e5WC~&xz-sqB_kN-QTb2U_CD!(*6>yuZx_+p(!a(I==zD zSM-I>SqrB1CvlVVc|OVC_9-Rbx5#_lmy>+Y-=RyQAu6>ud;{HEz$tKflFG_EMFrULuewTRk4o#2aAGnnCW~g1_t@hu6>=K-e zx0U0e_VX9NgpuZQr*`WEayg!pFQRw~ZQ!$2++4*Ag};4d+?mgG5J`E)`=)9|{(j%o zxyo1aKC#D&_D!9P^hivH=w4zepR-cc!5Q@aaO0!sg@2#%Q9TXVlH;RW`2L7OgXAw9 zQoEcE-Y*%9)@1d)!#=LL+5z$N8&%q2Vb1 zCuL(h+_Das^i=TGid~hC&uu=(Ex>*+lhd`Jn@3?y5rDT8GdJX5QkCz`7zpKQ)FnU`{|LweutL9oo@lyV%3I^_EDp1D6 zw#fBa0s}W+?X=Ga#v}gwZ1cJHB=R};bip>i>=uw<=yCH&5bUxcVD}_Sn4YzDmrA{k z8kfOdYrdnpe-Lczr7f=!a$3*Oa<=}O-$$a+`gL@Fo|KZUr=YCIta2?ZPie}@&s2UkpDk|Z%B=ELXwdh#pU2Ln+5J3r?uqt=N&6BOG@RYX6SwboO1TofxO6`# zu+|gXXOXm@canWLT)UCw^^xt$cR3Yb7tvY!p8P)fxv!(|o9K0~m$>35Qz6t)}HPu0iQQ^*b4FQ&GIk2gh^5>$#n4Mm$aG?oxXm;T~(d zmm2CGj5ezrM=ykX4qP>B(r*1{Q9H-=m($~RPV|m&KBM2|jJA%8+-N^TNx6NV^yzSV z)=lvw^-S(B+6g{jCpo?AIe)|5qW^A>o&(6uE)zLXKSbWASI&IjqwX5{O&q(2=6JvY#q(f+wBu$AU~>U>RpK>PL4nn~4@U45GGtrOz9g32SG z=|g>mT>N)bR6Y^z2TbxeA#zf_qs^M%r2j|}|13Y2&qr3X9*rqK!z1G6Dynr}x1jRm zZt-wYc;0_s(hq~Z=XmeFgycRnEb+ztu)TtleDzbjN9%`8UdZ}62>$xPpX#~w!@Qop zO!@tD^zNIQ*O5z-8>?&jt>kNRJK3(e#d{K1lBZi7(c>3c<;ExIQ0E?_MW*HwC>r_*d7vMMZkYU6@$! zdL%u&Z#~KP^NH`n*+bEf?a&X>i*By3hp~s{Z)Ck}5_y#BWwX3bORt3OVXNkUm%dN( z(Z}&8%Bhvgh4t~x$j1}Zu*UXK=euHic$uV=AJBQVXw4SQ@77*%lj*b-rPIqeulZzo zz4IY1Z!MqD?zdYCIZ*$L*dqJUuK5^l({!#>|J*UeFg@W??FW~GKDttIxJc=^AH(tZ z?`X~Rz0)DBFSHIJ`3#HriI9G{OXd5w;^T;Rkp~#`j9v$qJE8PMb&!9e9d9VoQy$5f zp4xbo?Iw417tehfN8`__^Smf^GY(akoh$y~IvpQ&K(0}v>N&SBd_KP89PKbue^ttf z?Hrc`eV?a9FS?07sej!5F<&z1Kj z{gZ)lc^_>(P{PMw(mx4@RL;!ruOA|QcPpQ6SoSL;`8)pAPmf4F{CxLx%s+yOn?sd~lbJ>He*Z|xotx#h~gR&rnelj?8Xr}E`^ zFS?lR;IPCOw|jd_^mV5G*88Zz_5H2g{owE8!rwj`R#26s@x@1_zSz9ild&T$MRtTW zoB5_{?B~7yJK2%i|6z9I!`uHlcH|eE|KHe=Pj~%o?Z|iNdsK0M$dDGp08$0qa z&wKwB?8uTo$Bx{hcC6HnREYhdbqjI1-RnA<9qG{db2{fJ^kIkgH|)DjNxR)v)PLBE z{=<(RrTp(|)BeNmDRFbW z;6D!B3p@d=?KSnsfVKUj`9nSf3*MT0!;0{oU>%S9$*T zzlU7yzx%WAAy@fwyCv&}XvgS$pz2fcJ>?749@_o2Zpj();w~$f^G+9R=MVh8Da`*y z%eB3j`5tn$7k~LZRZqOMm|FYRNv;d*$EX zUr0(T@$Jz3m#hb3ycP~?Ir8)?nUHwhSeGLyUgh89ZRb?%zC?as&*7*$A?t^_yzJLa z{rVy1d5X`CcFuSYxz-2PmkF|S@jc{_x4*Ae+k^PNT5T`l`)cc@eTeU?%>vI7drbX0 z;4rwH2wFiMugZ~KVPX*o!d@Vd|dVIFTRI- zQo}FHN`h|bLUH}~D@yJmKOpq+J>;ZWjfCGEvF zdP$G6h-)R`g>)&=hu*AM&zTNuA-o8_%5&O=8>0x`%@ol2_Z2#?^UE9yzat%|_ zIkp+^A=mcD+LO|I$W@N9UEdEokcJ&-06qq|7TD~14Y1ku3Se*7WuI-rt^=E09|OJF z^$}pR>wAICt`7s7T^|HCyWS6McD)bS?D`g9v+KRUX4iXw&8~L?n_ce$HoM*qY<9g3 z*z9^Mu-WxyV6*E@z-HI$fz7UGfz7U00-IeAfX%K?LB3|!bzi&P154kRQ2!b4Ave3O z9Sd(K{$}@(Tl-LS@5le|?;%%vWc#~H`}I~%w~IaS<#fSqf=llqS2}I@&9CrCH zzK0y;x~xg~aZ4{3*ME1S{Rul;$Y68rA&Ay<1I-$Rc1 zfxp5%X&Bhrr$JzApZbBVed+_Y_DRpdxPrA$z3{j8sR!8Fr!HV?pV}1v z+4qn)OSt$R@+QHwuS4AU9`b|0W77X1e`)XHd&mz0>%3*@J>(Ve{|LedQeR8&A+G_Q zu6KspD?zs%;Z$Gpjo$^X1^vf>v!LGr+z!6K2iySqj|10(ekX7@=)Vs<4*Ut=0|>uM zaC{H>gwpwY$j6ng8dY^@VE$H6@toj$c2#3lI9Y18+h6zW{Cn{Q=-s(C-D-`e)zIrga6-f5F0o z{vE*mi2s+sU7-IWa69N91|9_cuYkKj|0N3#`gZ~kgZ@8&dqDqX3lI8t0q+I<6TrQo zf7HT*{@uVMp#M+cEujC3g$Mn6fX6`pYv4Z6f7QZ+ejo6D(EkRwAN1oE9`qx?2S7gs zJP7))S$NRD7g+6gd=L3B=)Z2^LH|DB3EwJ92mJ?t zwf%|jAs++%H{m}5`VRtY`xW0qz9018g8vxkKLo7pXnYU(0r)=-|NX$Dz}gO%-b1eU zYuNX%?7pY?Uh+0+=acI&E2v*^xOF?;I5KTLhSyna-EL2X#)I)V_b2x8`klXre4Ft3 zm)t|%Q?#B_Nqq2n6Hke7I*-1R_Zd7O@yGX&KPb5L9`bJO*R1Ih*A-Mgd4CUiyZZZk z$W=ZxZz}O6<48hn0rEWW;qD=CD#~xM+y}WFc4$A9_fL*7 zMmexNo=;aJ**VQ{SCizY^d55Uzn0!Z9*AB=jTPdK)@nMVx-Bl)NAu-bdd2$!4txuf z^@O<}$?rLRV&_n}UiSqozUGfaN%LJ>Cq>_*fl7(j-#_k7Wp97)f!lDJVwxY4`5Rsw zqsO^Z#I^pt%j0~Q9%mzeov^X-fh)d$ocQ9$xdr0-c-HAekROLRoR1@}X-Gr&CTKh9 z)@xpEKB?sXafkD79TI(fpBBl5pB1F9GLLtYVz)u}725d2b!$d>eM0ixYIMrDrz^gH z9Q!!j2AoGDxp4?reE)bG;w!#?d;{l_#%-@re}B&ErNATy;oI^>`X-oMeoF2i?=CuL z)-GiJ+*--}-FfQo=v(Rh_?L^&tad{lf@z{MEd`_;OFvs7(?>p%a zJywpJ=so+lKp&#a2@=oR<;Q5ejmL`X@7JPyPf)$8PCb~)Qn+Y9+i$xsxTA2YhV%D{ zV|<#?cDSQZ1%K^_bQH8bitiUc9{$>o=E+B5Tev6z- z?jJu0x}x=n^|cbt*Eh$~O4x}fd;j=`f6#cm9l3aVJl&TlroU3}xbo0ba{u_c3*|lQ zuh5y^ZmiSyRNfra72iLOa(5e-PN#F{E2eUl_&NlVzCFX!iM;Io@w?UEuPeeH`*mQA zp6tHL)6Y*W)NpnWKlKAd-rk?m=O@0G|1!beKIShK?C+H!`y%xp_QAQcrqh?)JHA)T zcb)E2xBBngVjqr6+TYV=_l~bSTl}Ls?N_;tS;20dW{B=5)OfoW;r&xVKP>OpHfsG$ z-jBpF(76TiH$FB|dGdQZw`}&tpC?r_O>)(I(0rBD6T9!W#QwmJh6Uxr+9Pk*pqct2DnHjy0a`ir5cU62@eAISRiX(JZgy`6|*werP>H>oe?Av{LO$wAJj& zeo4PN^^{Z-(bM-(QU8^1T898`7dl#BHh<~Q(0mTCjuU7;2Uy2pu22Tt3;GnWj<0DQ z0$9g|^u0OYHl%0vtQGha_%{P*fSZ6%25ta0`&SRV0RFYWYPV^f4!9crHNa*sD}m?1 zzXEtJZ~%M~@D%cE_Vpm}iSVBUMtNi=fS&^YabUB@I!0shG@LJ&F)f#M*DD?DXUYBJYNqKP)@y~%t-D5C zU#=UQ@cweV-;a2&)c5}W@ez4{M0>tRN-#@O+bujvXL|1zMsJH8yA8*&GJhBvo z?KQib;I{PA4|*u-}J0I=D4 zy%#CA^LmexE0~?vdvIbqulI??b{_TH_ghi^+ttpyg4uWITfywR>H~dG)a;+?O~LGY z7wnta_jX{j?`^>SM%P0>s6Wv`KV5gbyvWZPC94nw z)xpmN=Yrd3QIH^-Gc57!Be0Ng2t8Z8kbU`l(y8Je?ws5M>r>=U3DI*n|9>NY)6c)h z_jj{&4^eX6>+V&&?p3Sv61%hFMs^P=#-ZreQG2si^1=0(>wnbPuky}6SKm{+!KU2o zY{`A%>(r3je8UQ=pJLx_JmGMkIK`i(cwGK@KHl1C@xD;s8y_qCl#dNB()VOXgb&~T zy};9xiKFi(MS|mYSu<++3I|a?H*VH&)UTBItetc{)8p%AOG)`=q0qy<1j$!BBi5fm z;m@~k+I*Jo=kao23#|PNwuj+%*oU4jeNUNapkH>sOUZrW`E^QHR31^|7L`-+ed2kV zG~@W@i9_YwDL+geZsQ$_OXRT1(}`R+bO<)PUUH9k_iFWroT53s%1_v<@lbou@mTxr zx?imHed5I5sURYjOG_=@Q}xQyPdY~^@iE_wi|0$CjQYEEdGaMa2-Og{^&1u2ed3tk z2nV%Y2nUtVwR6z#w{gUvmW!V^((KW_^{PKM?-dTJ-0i+1lPkA-qE~2-xgF>Hw`>!3 zyj}411nruQ-?(3uB~qSGVb{JR*tt^27vWCSi-OuiPM788hSgpckFQ)o?Xt|4r`EWbbei!G*$|K64J!;f;!4=e=b9m0L+phN9^v~pG_fQ@wpZuOx$&UxQ zQqW`f#M=G;+z)s$+5Pfz+$ZkGd(a0z-s@I<^!onX0b4(y2iV4YlfUKk<9>kN zqZ{`FQ2+dRuNmQOyw?P5kqU8TYsP)*!lw%z}6oKfUQ5!1#JC+EU@(lDuJy( zPy=lJfmUGa4;(~(tv@ghZ2f@=VCxU`N_hKDy|u&P;IO>6cD6c&eF$h@lHZ}HVmvf@ zB}w9ZI z&Jq~7D=@!I^rEjYLZsn~Wawz(k*=SMKT)#DnKcq#pTrPt*6t#~ht+H@oAS zPFH{WD|R9)koeL52J{q=HE0_Icf(si5)(UW+& zDz}^~koY)Bepr6o)pHdWl~c6xfa=>7T&n+#FXAuk0w2-2%!(iE{$URh)-% zsi_hYB18biAw-ymWXFyb^N17$qDVlseH~lJhY~>xRW(d29xbX`itd$c%kzEx#$RWK zxSbAC+nLs1zfS9~ol^CQc(v{W5YLK7$*i^h|F!Scl^jyq(w5KXXKUa8+3W1*+H0-7 z_d5Gj${p@`mf?8LAJ2)8>2<Ouaw)x*Fmx$bN%>+siDHy1#&=4= zSgs8w)VTpiX-cd zD2LZ~-FPX2&iP~AdgASfADEy%nVzZ|1}iOD1?`wH#-?zz*c3FSBzHbor{J82nVe1wxf0^r>g-P&5+4pbeiMhU6=pm-QE0F)o z)OXHTW$L>^Bk4KsEo>w9^;hsoD06+YFvfW5yTS-D^<80H_EA$al z-xUUlsqYFi#MF0%c4F$gLMt)#U7?Mb`mWGROnq1AB&NPAG!awZ74pQ?cZJi2U4OaW zYTndg^LPJ#h4z!_HLja!|H;3q?__XZ+JJ$$ui-s)8sB`;EtXEWMUm(+zTea!d?(xJ zPvd(TH{0_%FR^oTF1qPknnQMU()2_+yKL(VIzIJ&dVJh)_X{*P!E_bkq-gu2zm!zQ=(4(zzvTH=8d>x@uP<{S~{f<*80TEyJ!bJK4&$3_5vE%iXYWifnV39d*T%6U4GpQ`s^s~rzg&$JQA-91Tz0$n|`DRT{?FT^pd~Qd-=1d-(fdC zB5_uaPWd5MwiWk%zF_l6xu4FhuFbDgsg-^l{WRCKVSece@N1OIEN40czO1AVzSVMC zdv#j!m3@59OXa*K%dhgi3G}z@583@<@^{8hvQ9|+Rm0f?-m^&g{exlx`%e5ctlU}R z=fgt|7Lz-)*>qh3^%C~Bc9al&(2n+SK7jg@cIsWz4sxz1=;S%87w1`NiT$bRO2V$E zd>>ByW9_-LG-B&d#pDlJuTkQU5f2)_4QJ!|Rb#?h`) zPU|-xk25o%molUM2iLa0GM8L(o(S9hH(0Jkmiv#1PZ2K@=ZG!YiXYN;Pj3w6mvZLi zmaiA7yj0vBs~VL_O+Q50~rZ5%3?|$Jdpj{Ggo4j^2QLCGEWYkK=;#rtUtuDVMxQ&vJi? z_1H#?_cG*tN#aj4K2MDI59Pf{;?FR?mAIbmxI+9FjBg{xd(E=GN&J_LZzsn4a^jzA z{8Hq(gziUKOz?i)aN&05(@46%Vme(+2k+$#cieAu*~AXgH8UOyU{kHD@6?Px~&eil^m3G_6zgxe9QeEy^{{4vZ z^PHAS`dRFRk10L|tnJ?}TY{;7C*?$swcEaiN583jS)G4pO+GV%*PY}1a3$SO+@j|r zby|9r^DMgzSEt*i=}5WG_Z^qM=Se!Hc6%;8(Z=%av+_M5e5>WG&)sM3UpY64{^rz+ z3)J5WSD}15&VIV)+$1$gv^}KxqrbV1yS&`rao4wW_*MMQhakT$_@8U5$hyh}|8wIL z_xrrye~$IK?;Zbh*cE{v+I2fQtn)vI-4X&eS|Z&A|8tv1g@3UBIofl-NMD<0wLspu zf4SRxG2W!K+DYDDFSQ3^KNMeLIPQzf`oE?7E~NXf-~Sx-@_AqC`x~MJ^HPN)3|$WS z`o$5^uNv?EIT!rTFZiDeJLtT_?50q1e}o*d`y*gp9pd{vn1_dw`y*i9F6RuGJucs+ zvUzDJxqspkvHK^UC3gSBGsNznc#0VNed1q4jCsXBo&UMZ2VKFzdaJJUgnu^wbJq(O z{Lf9^K5ES_@10?tVx1h{&G;zCAG8}4IsOL2QH~4JbluO*{RTt0XYF(U&1<4w5letjBmelgo|-}Pd55!lx!&*yjjuiyV1 zDE`LOFh#{Yc(*uMq;bNU;95Bi@M zM*eyH&oB9be;WVu$=2`0|9l*N?k~i6kN)TS(wSW9fBp+K{^xq4#QFWt&D~x6W%?}L zY-kYS#F&NY2)>gZ>Yi=st6zrtUxfPS0L!|bX6^nNq3-HPXMRtc6T|LL6Y5aVn9jv; zoY(ivEgio97V6Y%9{a48&L%{}bB*fo!kMO{@!76PD{r_6FPOPMVram5B5J2uI(0bT z#qBj)2M~$c{g7o>dGGK(;BYY}f?7V*8|QQA`kIyZjihVPSlEL`ckv~_Ua!LjbD@Ff z(@1%Yu94^4NZ~BKQPORZgGJ=>bEX2%6X^aR;^TXUr*s)T32!H|r7CSI^`38SIojY446+v^RY&dYfgV#xUL&37fAqtmU%)tG~u@H_sahn|${lGXk>BKfu{J=dSJhh;axw9bUWT{p}g;Edq%X8T@-jkQ_ty_G5>F4kq&wuDIO%X%C_m@6E3_GE}G)WA*qQCSWV#w|O(l{~f zf&LQ9mEb+1Q1>D!MfEu9Fzn+fD~zJu>+YzbdqEA|2Yr!0B1i6w@s>`*i-DzIEFFjkNvC}+-Ng`$>*UF%0_cR@ zEWORo1(yD`^tKz!g-y4urK6D+s7970b=OBIi^Uu+q(Z9SO>B{%+ zt)1oldJAKG@Oba9mm+^Dm*v0dC5F9U^zY^$0G+f; zUVeqT9l(;0_H;M8Q^wa#c0X*s(ZZ~w9nW8!=lvGmZ)3V>;Lva#?jOzD{ow+}XL@&kx$;QQoZgKSw==6O02tZ+G23$xk62nV(oWw11T^RL)pGvt8s| ziWsl$TsbEf_0{Lv^f`%CPV{phd|g%Fr`GuHF8L!@e9s%hOU}t1!}z6q$__xjWD_n| zAUB%p8tOXb`B1|9iCHpl^Qusyd`sZ(8cOe?JUGpGmj{c)Kf-wWk(S;`e3tR=AYLM7 z`4Y5KD1C_W?w{@Q%>B3VKBc@zVe`CD!uzZ8-UQS889v`g?DDUP_=Ak!Mhv-KIsg2p z7~jfxmzQnC?`M2F@%xB7iQh}yMeOpmhxjKM-%HH?NcxEXJ>v(7T^^4R|2xKy5>F71 z5&t;xII+v`N#Y-4{1h?xK>XE#>t3sDR5{mt(*eUi?kn;f3O35uE%$>C=9Y}>R~U}* z7lA=5a=a(T>$nJ;b_2_JwDIBZ@fR>oLtTykdHrjQz9P?Gw>G_o*8{JU=e=v`E`9*m z?WijZN_lqSew6301orU@aU*mvfPCLM)a?VEj9aTmi>G&AOizZa$hSR){Tz^ZE{HxP z*Sd3E#12~Pe-1hH?dAA`mR{_KO>Z#l{poUC&bKi+RB6w9);_oSWq2;ibIRk*uL7O4 zOJ073x>o~B{afW%l;;ii+WoNkJ#OlzN22@IOKac2Dx65=dG02F3;PDU7oks$n#EOm*-u?F3)?2U7q(6yFAA_ zU?{mfA7s4C^ATc~=cB|f&&P;eo{tl|Jf9?Xc|Jw#@_dHa<@r3Z%kxvjF3(RByF6bc zc6ok=*yZ_IVwdMj#4gX54X^Vzm+_)kgM|GOhAn*xbH(WenWgG{0^_QA%jXozc>uus zHZ|siW$j#p772IooVohkbxOA3dFEdk6o2mdG2_E}EceB85k%jZ9(qC&)gomH>b3qH z3Gk89Y5rM){;z%yf6>+>(J%V^cY2P*Qq4I5V|v~I?P6Wun0d>_>v&(>A?qx$o}bX> z5IHz(p^kHv4`K70fn^+;UZ5NebwiQP^une`4M+Jbjbn2ER=X|fz9rJ<l+{-}RD?$@&%%?2giw?%p@$3>apioQ-`yw#`SD6q&Wt52LSjYc|6 zCmU))z84>{`z{BgoqE`ASM(j%6V}<~vHp+5^xHK3i9FJ89K?Oe)a0oaO0H0c4y^RU zLAzfoujM;`NT+TD@zQVB4x4|-aAkdIAjVre)ISVd)1KLZ9MgL!(p!2B{YWpi*PGVH z*S`_*?3e5S-ZOFi9JY*sUhDx&ul{k+bH3qrNSqh6T6ENVwdXDRcfG@=q7jBIhY((b zjtO;-8TNIK^ceUkJ%(}(AE5p3^ND%%hp!){$IuSG9^?LY=`pmofA`JP^?p)4Xnb`! z%g_48^U!Ip#PzkEq?7TIm!I0d8tVFrhJK#wz){yrkdv;5!wJaIT74Y29-?%bPAEg3 zYddSx`Zx_G$Zaown1fuetw%Nl{gfWZxX3!7FG2}&UZ1yqorOGfzVmi_+UKCV{cwjA zQZ6~4#^kWd{l`UKN_6fW^1osSoc+4eRpxtmU#VgT%rM^PduND!zK8Q~D)xZ;hx>eQ zg!E{Cc^{V8=X*=UZXe7OyM1tqIL`MlzDjN%fFDC#@ACJr+&)<0^KKt-yhr;0ep?}~ zkBySv?SnyLw-2U>qkTZ^_CXJ^+XubGZXYZfj_03Czvz|DLf^VvbG_2c_2>nThXxrR z(v43pY{zqI-wEsFczi?D=gnKRr*pY|TduSC=8Lu(4tb@2%etjqk32Q zamQVffm}K-!TGRtcE3LNe7moDclOo`rpLJF^vRP#N%Pv0Y( zF@8@^Oj($1(^`nWfO^VNT>hK3M}FeX8`~qxvVT;c!}q?k=`Q25Y%9jU>k-$>ZWpBG zUTY_nYuZx&y-hzSG@a{0y!5~7y|mmD=}k`W)YcXL5I!(_r3KjK<`KD{ms>nWBbODB zUpfalVe?&y_xX>Xr={hoPCuPHZS`^b^cdud&eOEq-LxOlV;Fxnztwal-pYM^+@6o? zw^+8wrN=NHoj#qxcvWk|(v|1+N@plHuWIJV2BNZ6&U5VslD$Shu&a;hG#dX5 zB)x`*3lH;t6Ysx{cz)w{m|a3YidZuKpy)}D8961ifS9MAA>^RyNExjw7yz*N!9Y z|GYf!<1wJ7{Mezs~ZhoG&N^mrKqiw)tOuj(jx_TwR`XHS@7aQB+Sz{_m6L zHJ>})rr$f?Zs`vsnWYy>HyJJ_j~gxy9knogU>l=D!D zq0g(!rSn9euV&MnpGvi)>7`y>)}Q%>| zC-Qw=tA8l{5aTgELMaeq+=bEzF~)Hy9VEs$45cFR8K!rL7;-w49wR=@c<_IgoFYEL z_<7*@QN!UxitzYRgfkh!V{bz^_rnNhG2TPzal`3J$Zgqg{gU?Q6EYvs{?4ZJhSQVK zXL7C{@uc-jHr;4AE94L+t6$XTvyK&nyUrmzu#9l)62hUg2#=mYII(Dn+4+PvLW7w6}c!lofnOk5{8l)V$4x;v@w*QXpnD8~%$%H_zH0Z2W!h={(Nv~6s%l&)#uk_XBYL{|U zuSb0JK3$LKwDPC(?H1POu2Azq?xWwb1bSEe*R7rXydXc{*v}J^^U4_yy({)6G4!tF zL!3i?Jbzg1dg3<5L#|cy7vx$>e-+V}Mqgd8NvT)$dChu0wzgN7)I;0-e;ieN{8udf zf#l!W^Zlh?A|5wfnV)>za5hc(II+AgzmH3P8_h?o-)FV;FdtdgavcLs%iuRH&yURr zAIy^vPIefdHgBo3{;IdX+Wr`q^|?=50*>XoFJ{M7*IyUDs_Wm%`d=zNsrenV`oGBX z8AvX(dWX_W4HuIu4Hu^`wNS=C?Ig+sD@+tp| zT||2o?T}5k0rR^pViyv-T{lDQcHI=Q+jWz~Zr6BBvWXr`N510*z8UJYQ01my@<=Yd1W4tKUQdXaQj&$s4B9+h z`E|!-cu?c@+IJD~!mYrnM{;k&Z~fWKd8@AjYrc?pke53yyWWU(9BWFJzof0@|Lmi6 z7E1Gp{()X~`I63KoTanSzv*qr)7P=HyMgyzq@|Gh-G=qDN<4779dx=5q4{L2$3FV? zrrY^kjOTMaZ#JD>`6kk5I#PB^=WgKdJpb2O0`<9G3v2r;y9McMyXhtK6XOrVQU;N? zhO-XvTQ%Qw*6@w;ueSH!d{o-GMEB5% zy_&A{W6z&6Qi@bvzK>on<43wzhk&eKvz*@tJlnUfoLwyEZC|RS_k^f<9Wq+qAuVUQ zi|K4)`FfB}s}RW*`TBd7kEOx2p64A$ZPp&yr5IP)JB>WRy9A?j>8^~!!IsKIwv5f!|`R4*WXQh^NjFywY@pANA1nCR)6`fuZ8tF z2zGgo0Qx1tIP`T`(bJ$WVLdZTFz#g^g7g^oGLDJINk2$DN!&*~Mchj~Lrnda%o9V; z$@-Py>h`X+x28l6uF?Og+MA!Y^aqk}*z^6RPY|yfuGpL1CTFtgUW5}p7FOriE%I<9 zd(-;8ijRBL4vh9D_)Yopj%ne8dGf)@g4rGG?M>9TKKHveFvNam`>dB&BbrZ@yzXKB z|5%>X{PtV@pKJLHB(F674W%D6TuizR7pHfDulZiA*k7!FpM{}>cB$B#Y@cXvqMbIf zH~Xx;+AY8IB-){3Z-T!n_9pmC)*(S(8nynBbx30Hm#jk)gTG|mkr@0{u{Wpq{3zqW zUln^3{8h0x!C$ftY4q9Cus43^Y43`?xoY`W>`n0BM)qc{+&G`T`P@TlZ-Rd+ z_9pC1**~*>>@UI297uMfUr&I4(s_)lYJMIR`Bcq6YJXPSo6nN^WD|XsjH|-)r)tK6kf;wf(i; z-bA}p>`ls@4)9ww->6=z<{RZ-ZRZdDH<528@+aT>58b3^Ule;zzEfu7s$y@h7_Khg679J2eRt`W7A@zpJ(tceS-7te^ZtsxNPhXAsA|F=XqqOJJXlH@HD|Qz2O2y8~p+2QSrr${1N8AK_9CnuMQ`-IN z`u5h0=NamO9a1l?_iIM$a*xjc&bsH$*G>bs>-a)D?W=>Ms((i_jytYfiT?=e>-F;b zcs)@5Y>4`L`V`uA;xwK+iF&5%gsQKM3=< zU)taIs9oNM{+e$^SO$NeZyaXRQ)~~|H=*GeqMEe-ySo!QTW*>8Woy2!y*W1VF zpZeUN(yjxR_1Jawov*Dg`T9SQufKFe=Lh(X>p*g!*#~kyzolDD_QT$p-b1^=>kavl zO+aph(vMj?6q5(+xlls873sGmZzP01MUCU9$ ze|?JQY`EKZBhLv=k4;)Rln*=1&ITV=?Ce+BxEe@aXZ+C5aW;@V0REuda5+?69^D72 zZihbdp|9(fr5&=G?|T-9U~j8l^Gk;6zu>wqR(VxEXpySdb#E2tGi^6%Mv?oJ!<=u_ z=ip~lTaWejC!W*vbGF{eaovG_sBX_%eWm@a`M>&CDtf1x=X}VzpY@x@e_FmDQJqd# zjeJ-Y{8aYmL%QEt?y~V*u|Ip($-#C_N9u4s`|}gmYB@XYIoa>Ca9`ujC)JK{`?EgR zNq%?v#&)RUW39Kg>vy_d_MV|izqy^2?c%uZz_`o`7>^53kMVof(`|#&@I`x z4VQ|;m0T4%tUo$kxKtQ`@%k%Vi478cpJSWg?wd4L?qB*W3u8LX&otb9g9Q@*>=czj>2FKtdZ$x_@+e(KdoWyq7oekm@r_0%>B8?`^R;xFzRw~ak-wI1-svvKeW$w$ z_Lce<8{N%LhqcmJk8S9)b?*~TfquUT7xT+jAtP5>M!W8peC+;1xSthpU;LA;-DCVt zk7vJKey!b5e{JixORq89O}glBjMs;9;c{8fl`GOW$%ArrcUq9kwoaj+n|O|l+|JAY zaQQQgK%Z-sU)^|2`WNylG+k`**;eSUfacGICSyxUcLwQRfr^WMWIj@HxrPhhf_!Iv zwLSB4-|g92zgzdWeMFK|x+4tzy_~d+dJGpnZRz@V?`!>}yWb@b%ccFV{1EvC)sg-| zxxIh=+>f-3dg}c)eNLL8T|(z?EtjUJ=iq33H{bt>=Y>2fH|0u?pS5-vm|nJWX319( z9{3!>qkmzc_{AFCere8Sk^jwgSzTV97rO-QSi*O##jYSmd;0ouD1C665#ZGSwJK0!P~?B$&&{(HucF#m574-(_M+p_LQ%~9sOit<_ zz2EYK7RGe)&okVu56Km_-)W(bo6z!NV5x_t!+qPZT}PSZ$MF?zz(#;D+xL#+e(oWJI+SBp99%7g0UBoWWJBeMMw-dWOZzFbj-b(E9 zJWuTMd>gUL^Cn`K=Z(ZJ&vV2s&sW(VF3-;qyF6bac6ok=*yZ_YVwdNqh+Upf5xYE} zG+dGAuhs6YlII5uSLC$I2bBQTbobZLLC%C02&^a>;-H@ybwxL(-)I>gKPv23W;HiIIUcHzFu>Fuus zmh_G8Zl~M3macUluoTkhP+dt60yx^iH}5gJb@Kejk#4l3sbAK~b18>jPhXxtX!Nlk zw!gu!_iNN2D$wK#E%#U$>92p8VVBR@E|1`a<=H#&`GV z-KQbnJ1EDFQl4zZxc2wU)qY;uy3cte~h<-;Ey+yec^%mt%oQG_q-1B)zBeCnP z)m2SDoPgd6GtgII7J4d_TtA^7L&^0M`a6_dKXF`?TtD%9K_%BuW6am}(!&ti*H5j)uAlP6uAiEST|ec3=b@j% zap07l~&~ zj~1s(9#1@DxVZHb2s@S$&+ly%JARG$H0V3Zpga0W-am_cI)0t_4C!WpOW>Pg@+rnI zlm5RGFOhzZ^o@v5KF#JeRhg;ze&1D z(wzWZ;V*H&bc*FULp%jK`imD2U>#o8^GWyr_;aK?iS&m4iuccu?ze~+N%tQ>H}TiJ zzeKwKm-sB{{tsgCQ8D=&;&Y_`ZQ^Cp|DVK7jQ?BWRpS3iyh8e4AkH)Xv&68&iplTz z^Q8a3h+9ejIbzsx#pHMWd6QSgAyPOa46RPZN)l z-uI(=N&iRwJn4Ulc#QOT??B$)A^jgSzL)gBOgv8duM-cF{!fVeNdI4np+}0zH;6|_ z@B5>Jr2iGhLk|`C-h-bbQB3~KpC|o)BZeL;CVx*n#`OQ3c$D-XC0-)_7V$Xo$NhQY z1!CyqVxp@Avi~9Wh5i~&uCaX)dB4o)#UGydG%@zYef?41YhTgltM_-V5yNGp{pe-g zkDFC$ydRVoy0{;Ga?#TF^9s^A=pD5;KKXOvFK`@szH(l{W=lux5L*WmJH*0zv)beg zJ+5aCB)3`l#sAde2a;P*pA(=@=ka`X`Pc1Fald{_+DOZD^&#Ci#6D7X6#GcUp*Bl5 zl&-ZWTrr%~IzY|Urq4c7L{j67GpPrIo280fYB$ULyN_yK$x-W-)@wB{ZeBkRN^|}9S?N-?*J8SLd?=i;jAY6s?)J{%n_Q`aL zq2-opJefYm{jdY0X#eP+G-g=s+`Q1sI=JPttsv+=ys?S2lh^qbMWmvnos#(n7zt!a25G3@&-aebBjzF%Th zeszx-S!Lbr1;FC}WcAkhmeB>=_x87Qi{yDZU&QEq9vyab-%Fm$%Ol}F?t4l7TLt_4 zJnWGPsK)QU*uvP(yJbQtmz)cMcHb=vkA_bH_g-T-?7kMEF8Ioo9i2hEZuA+RA~q=T z^Tbjxi=Q;?sS0@R%Hkyy`s-pMvNtNHUNB=qAXFex#w0d5C{i|$VZta&IKWAZf zm5v_ar$;S_^K$o(N=x7?IcEybmB3g1rMIEosQ>%p`zCp#>n|N*JmhtMeE%fJ_%}1Y zk$8}}iJ1M8Y%?5oL*O_cg*_O!-4K^@F4;2aZnlajxQy*0 z&+8Q)K*d836i>Dl<1zH)Ek4^yxz&RLXIn>6-X3I>Z5<)Lj`V}X*hk8?_7G#ADcjmb zd_CzqiEkioCw>WW8}UmG`}<}MBBwg#PBuinejM!{_g_$*%6YbE4q0~uU#XZiy%70> z_k}6+ep*Jqc)zRMQGQA3H`*=zsF$zPrsYK|r| zw3E^+hx`7QzyB-yWcGZ6#4oCREl|EDkguw*HEGv-Ivx}sVc7i+0dlR=2W*$&tr(xK z2V5`2eK&0YxzZW*uR`UkbQb-u^)S9x;V0KZ8^ZMXsFhpOwf37mg?1S5_|q|7A5p!f zBcYq}OUtYI9FhAPAJ^w4AL~EnH_+jJ*w8cCQRstgx<(JQz~4*GlcIdWx@IU*PbKHf z9+h*w7{6-suuyXO)ynt*#hF5jn!i;Ty-OwI)(9%pte8`6h8+=r9= zE#3QS_TjeMW1@fd;(7UtcHuspw~K^&g$M3MxcB82X1gE{!ro3|$cwP|E@H@&u=j3a z$e*xxCo%QUUhI2iyLwE%guU1o%XU%!?0p&OA(z8mY&>PV+DZQg#ONm>6eIh67oQa`6f)|q)9a!$^9HT@&&NW9<1u$^Hi!!Cx9m*O8z+{bW`A>^^F zM-q=Q9A`MmaEjp!!+D0M7@lUh$nXrqvkaFQE;BsGaK*wf3;i4Bpm!_!_H2#5T_SdU zyG-o*_8hV6+ZAHhw;aDS(6`|@<~iX6&nZ0#y&6icPnR*?qdukFF1bDhzf|<;Dbl+> z1;2$jUm9V&>r=|7s81<>ORi6QN$>i!huHNg@#D2}HPq#DQz}1_%KDoO z<=l=-p8dG(Mmi| z+(tY@+)g}2+(|r1+(kT2+(SG@+)F%4+(+zugZ563qaUm5Jzn#k%xS(S(7B0~TW;0&{?Lxibx`=}36!Tk_ebOlZzpdbZx?S5ZwIfx z*W2rhdS*k7R{w0GiS00H{O0Qh>HNImxL#GBLcA19<-4zkD1Ehkv|og_%`^0-Tt3fI zzrVcTe$ER966_oGmmr4*65rSI{^+sx%M#z`^?vK+ee6pHzK>eu`3S{?`(+#Sqn=w; z&A-~OPl#Uge!R%~5&bogJlER0zl8m?0iJs#`o-k&K=K|dhp)>I#Pc2+t(^vvA7y+K z@fh(o;A{#RqKah@*(0@%cq$99B~`*&l0y2PZM_%{|s>#@f7h{rtkY_OT@na zwoLqANq>&m_y1OiegCk{>QPKi8+|tPaXy!4{U(WXEXU6iPca?emun^c2N>T-`VSM& zkbZ%w8_&Lb?%6$Genf@rBpC^XCD<7Qo2`yDJY{w(7c8Sj1u%ZztFgfonHzk)&bpZgu0 zWxV?lj4lVEj48yI;UK<3Gmu6~?WQ#xXJM6*&);c%0Ao62o3`e+;n)8NbASg?^NI5b4pr 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 fTPjJRa-T}fU+ z+|BsQiD4fq$sXb!#&0KvJ*gx&5%)9x3S!uwO7cqL0meU{xXkb0OgzZ=Hm7HN7x4(= zU*PnNe--g4;}fT6{9fWQ#=nqwg7L2=9%uZEh|8?M*El`nUrgN2_}3CoG5$*8PR8Ft zJk9v4h`Shnt6`o0)ITaoGuz3Suy! zdaB>jTl^5>)$aUtR3_ z{o>%0`^Ag-QahXb$H9l(Kkok6Da(hi1IzvO?hhSjy!%68=j2=kt5;b^&G;7L5n|Xi zImd>$ll2Na=XP1n(PKR9n#>Ov7XN~U#qy|KEAm3~>?Qd4OlKF%Uty%FGvV4v5S2nsvKkBUH@2vc)oD}4AP4O|xjdsek zd<8%1%;Wmq8szT8EJDiTflDs`M-jEsX&K*W*i_nP@$P@gdfATlQvPqicZ&CfKT_wX zyi!P1UL_k(q>rII*&*s>-W#5EKu<+K#*P_FSlSEnSEZcIKrd#K=)Z)a=Np~(+rm50 z@rr(~A@$D6e6;8X9k+yG_-=jwX|{L3(ho!QQ<5(0fZT-P=i2*DABHY99MgNJrYiHC z*aln*L)sg}_oT?B@Zbx8g_+h*r0Y2AfZT?m%MmZ%HTs8;kd7OT9>tS%G`29WKJ>i! zUa|if9^Q)Ql1+S{`-%Pg)K}r*7oANv@?u~qj-@wkuoMPgi0AUJ@$ccpa39!^pXdI4 zppW;7V;Z~^=QmLeB6r~T{i?5}CFT2x`CQ~xpZocDu^u0!zf#IkmQRJDZ?O+*J+#YT zzAro|ujVLEfJ%5gQcT zN-P<%_)W7@ehz7~Fs*FQA@3LTSJuD>p9lAO^&^rUO{edD@{jx)&iAGK`8<7`pPz#q z`@Me6lFc>KD`;HvR+PEPST_bqiG-$Qc~_T1}v zXb#^~f9>a`++n0_-^uo({C-YDvxvtIiOG6VPnF3PtJm!qLGw?1B0x zm44SYeX4p=rBK?A!212re=ldyH5v7}gA23Y>J^z!oK5nEDT{ol&>=g z@5F?07`n;my#LcIX6rV2;{7An&*>b>bGU>0llyV=ebeAu^xIO-d>%iYLp}MvIOVIB zTgz|!r~N4IAJBUAevg+U%H6$|?RcK?`TViNT+f=Gq+C~__oMvHe$e#QLz0|Iyw^*Z zgI?EmUzX>giv2SBo=R-A_jA}EqjXxHa2)$qW4Ry}vc3=Xm343*ZZGUnn8Usrec$AE z9`>V;^;}=x^f>fPgIutGqt8vABrlzsPyI)J+13TfWA$TJUeU|MzVEq4?E9Wah*{s! zpZh+(Kfrk3chy7e`=0xWVGm^8AMtZLy_AjET{Y~k;$~?pj`wy3*KYrlS zT^7H6i%PG^>1|3a^a=8z{Sz6s$$2kGSNkK9WbBVD@;jcN(?YNEy6dtlHJMUcwxHzw zDNRq~@cYY!Aawzb9hl+CnSn9if#UEjHVO1b{Q?QXLa z=S!0A&<*-kEf>onh0vb6^QG9Yu>QiFk=yyao$|i+8(#k*oxg|N2HwYfV9QM$kCyF) zbM>=+?I!JKVZ8Fq+;1A&d+vVIuY5W0H$4;U@CK!Sr~TY_3CFcwCU@#Q$cXh{(o=&L zW>>Jje-!oj5d>2Io0!*_DM5}3=V|C0Dc48m{*{uY=X%`F<57KY_Gt$azOa8~h5BvT zzAt_Q;uYd0;#J}^#F+n<{f@-zjIR-6emkws5^u6xuK$q#d><^~L2SG3W1yv~0A21x#_5Q-j4NGS@88$q8 z=A%ZxeZR>2<$d=FbL8jqA;U?<=w%-}(^+RaM+{59kIy@q zzl?a)=o;i>Zq}YF|Bc^X-czffm-^KNe1B}@i`O^Lx$<<=`Dvs_yV6IynDzc3@|XN) z3-8x-lTRnEtGv?78cv>r)@mkIA3e_Y#!fJJFDYn zpLb2?+AJMy*U#2-Lr>AZoq)e3KQ~lfl%MMj@0T={xUOIl<3~B)+w@Q|UmJDfao>;U z{(`@~NBsrx-{kx8t}?#F{dkACA8&FU<)2xzFjT=OKUX=ef=@oLF8hZ;pLAP##eC^J zf%gY|e~hfZGdlO{=KJxWr`_)$-!VO$`x~IAbAJQ$biN-CdOF{aw`ua@^C#k8U_PO@ z-Ol)Yh|Kdd9{kOo!hSr}<3+vw%fe@sFZoZ#9j*5L1GqLQ-W!z8p&k!+Kpy2>5-Vq= zgZ|>V67tP+Qj7EbDrd58cEjXku7z~mkHzt5)&coE*FDX;zP^~A_PdJygSRU_rm5q+ z)W;Pc2UhvLc3jGJYRdTJ@_FFWE3AK3toQM{@02Cq_2;Cf$MSaZ(Z7-XQ*+~%ZhlVc zgyCYkqmu5Eos)XSU+F%qG34*msD%eE{WF}CD*8!OqVyBjt^N4Ef~L}+qCIiGa`7IN z*YA_gI*{HX*L7(BbLz?b9D#lg?mtbVp9A_`<)tj2*tK(?eQ1&MDcbMX=dvFR?dTed zwsUK3-nJL-@4BNG?-ly>-TK~MzPFR_$#<5d{xaGX?eCW*YS*6Iji5L#7?daReU6)( z#oo{A`v>ve?M<)7dxi8rCh?(F-`4j*S1iwvK4*Cc?w$*<*Q+`9iU6yrJKfdbRvi z4l-X&=+7Q#y2e*OIQjy=!J z{U)j}isOy1?9l!%+P{nktsTel#$zZiyMIxyx}I14YxR?$d|Ixrb)J06_>K7megEuv z@@cfsD)OOx9|S#~pXBrAQfakL4_f^M#B06$OxL-`d(Zj%uRhUKT50&s`Rezy)-UVR z&%4{cMKUJ8rqZV@oxI=kDe#l?6xrmm;i8`Xl;r!VoHwwn<)eK_=b$IGTz7t;FpjTb z-BrFGLTe}Q=QNdm!SZ*ma|YJy_~-qa56S!bozM1YzXt2P@_r50Ma6ziJZAv?ne6DQ zl~?(pGuy+-TN?PR^|@HnT#6kOweS|j?*-QH{*FC6Qi;62% zI+jrng3C(Rv1GVS@a!Hc1ABf3`I!?SKW*>Yj^(^cdoFU$aH@e$<#zEscu(^=(JS|7 zmf#02+If{DmFwX(4i4lM&8K=A)V{71^3x`EV55LF-9Hikj)w9%(JK?oPpgIbI>r`a z=qc%s5D${x?eGZk2JP}F@up$r>)i9Tp4#lWV#%tk_wn&K`qM@EU8s{AEwASH2VS6h z<&4#TdUC>MzPh3P zmucn?{j3AcgO7*ECh<1mM%Vt?ho*7a9jDCxxdtM9K=*njkX zgM73s^t*2SUinw#b_V0lY;p|!PoD1{wn-()Psg2VNkc0-Ozw{k+aTjH{&L8k`z4}3 zXm00d=2Qb-ZPf}uniqB zO;1Fm6rK;e9oJ!85BhM0#!9;4r_sN%y%?W{%b$nmp8h)wmckX7|8@HC0{~t_ zcDfhgeWn|>y%<>XV{{La?lP@4`MxL<L4a2&~3mCIypUwwL_A zOc-T&0sOyAGHSR6{DLbDhs&-)c)4m%dB1lW@t4bo3{Mdol=ul^Q4khCZrJ;a_5JJg z80Qxxdu5@2NdDLG2*bWX`9pr`3GhSfu`JlvXZU?VeIrUG&!re;36C&zdGz}7`zyV_ z*eu0ZGrc};?fLKw{Xtvdr%GqR56zd>cRCM#^?@DIe*-@?zEl2JdF_($g6lCRxgKNh z+3PX1AFkioC3C&{Ybv20)K1j*3qN;bzHT8sF>8E&vVG*M1^Q=V{(4m|@GJHwf2yo{ zf6ell)>bWy{mBnlapQe?G7beD=MmF6$Xz-I`O4R+fd4~toCjvR8LGjrHFOI7$Dxz( zXAZG{Hgp_(Pp>H3hl}UjYy0tWNl{K#3v#0Mq%COI&R;XR$qqp-yq$Wx&L;a&&Y1y( zM+Xt|JaIX{&ak$N-;wl(uF$V*JA*uGzxJhyIgTybvGesq|3>GxqW`9B`OEiT{0#D& zEZKMSbLUFL%VzJT-$}eg+)8|gxQ*E7>&wJ7#?yuA3-Je6d{pb$ptTev``UfY2$Q-YI-~xQh9f!^!KdpEFebpH|M{ zq^F_3RH{o)>p|0VzQ5V{4*m`&|6t`A;y#yQ-c#c9(8I}BjBg@$Mkn#a{ls4)Mtd1f zHi!oq|3%^v;&tL0G1mVM&#c*V?WgJ=mEjJ1u%odzMY5ub>{; zukm<4XRoQWY4Q2^i|u$Xa?GVFf)@O7_)C!gaw_yO=eu7mFf9=uYxFZ^#<2M>J~;yU=079|Jc&0aR0;hmQ73GKub$WSSRC? zHmhG9UnzaQ4*qJRJJ)!zZTGp>XLZ|md_GUkVKJ=lpFLk+j&%0@1bivl7nwE_`vU&x z`)AMBQ(sptd$yjh#rg{ymhR$7K9~9$ljlV{qw{_~UR8bl3$o5k^Q#)Gcpv!{f19t* zN>7a#f0|0q(d<5rb?q%^SO4PIwL|{Sx2`>%r~Y|{*0pCdW$^83uWv_xBn)XQmUb?+ zsrn#%-Rs-Ye+olrCo#RRd3`(jabc)ivz6y-@K(dVj#~Ai=^@dxriUJ|=%=v0y=46J zc@UkaS`@t@{#fvJ_!X9rtX~3->)WwDqj7yZ^i00K9s0%fZaRnZM7=lzy_lXtJ?87& z!M}W+JLE3fORl5v`DEpfnHg?@5-9jeH`rmuVtv)7xRc}V{5lK;Ja!W{Is&O4WtuDT0!@}71feSK4y>%eoN z)AEGlF9G&)T`Ldem&SD?uwz*->`j=vA--?&I}bhEu)dDvO^-wGG}znA@Ev`w`OtY% zEnmLQ9dZ+@x7zpebH!+1lNIB8s9wwXX=2)|cn;Q1#*Z`pYT{91KgVN?82p#<8S!gL zzf4TKnoJSnzGNA%5$`4a2Jx$i+0Lr4H?lsA@i#M`@?Iss<2hhAF@BKru-`HsC4L3t z2Z(PZo*?EqD#-{j?3%0>Cw@8Udx%lbvhK;S+jC!EDeKRyoyvYigw&62r_vKW_I&%r z>J829d&7E)Zi|-rK(y!L{G^Di^b6Q;*xF*_`Fx$nt=4bYzU4YgAc)Uaf7%}r^D668 zs2`+#iHOJkho|rP(DA6s@2<;q^d$0ry#?o3_l|rN*SBmIzH?f>Bmc=d7>qlzqg}?g zY%BCzN_&;^UcT%g+C#Hs+t#`7)LckD_jckv@)nh=p!h3aT#>re7(EoQgoMmw|@Tp&tIO;zkB~g#}mS$Z^*r=Q+4y{%P-dXhiQ|W zv^E8~dI9;uc|y9K3hOhvt$g21{k;#!`j>O{_g2N<+f@3r&2#uYcXB=t+vUoawccdi zG4U$#AhDnSGeGR;|MV04`9D3xe*O>mCw_F3J2~%w@h!xi#I3~b#BGL){pI?8?wH7< zwl80QzHq0`)1Kh_<%ajqC(nPP@;nE5ewgcx8t1Q1fo~mWj4xs*5Kb~gTAhxKTnTCFWb6xp_lnTd*93F`&H$9rgNt|I|zDt z*UG0Klb@{j2fe5X&4={I&Q2HVP5K3+pc8&sek0$;BYlx?;%5ZC@=w#98v~uZr!Bmp z-$4F)Kg`$R$94MemzU%x{;9L_A^IbJ-_qq$l!v)b@Nn`hvm--Q>~kAVN`~vl``$0> zy9?j(b@chV`6+z2zP{#{@qH<$m7nF1ePMO^oIPhg#gA}Sy5dg;oz#bw=QiXgJ6N|) zUh6>^>wfZ->zo_pX?`8))#s1%q)wk6TRZ1>EndIFb&)D>Wy#VJhTiY=ex|RJFSdu3 zx_MXC8$~_w5^E2buaNnE6&I01^f!hR>|aPZfA0Gnyq`RrV4sAnAF}qF@56w-9Zq~7 z#sK574@24?@!R>ml40MEA?vsei@(9*PfL0Ak4o~8$&cu1(qnzF?}HFOgT)ui|B%fS zU_DInx#_=oEiL*nBdRx!11~;^Q1!*|d({5|eHc!B!t`nGe-S~DpX@ua=S?M^?{o^d z_`Qibz0^s)^dWg)zw>1|GGM6sNlRxqd7*`&`Y8)5$yEpsB^G8g<5o^tzhhyjf-jYL zE*tnF=hPa#@B5Peui;|8R35xPnEN%B`5x?`oaaLfJ1Bf6_Va=UiD3uDk3;O|1;H-* zJ#yloWqirxUi!tvEyS>kA_v59^q?I|Ev5L<^9)%&nfSZJe=xPJil@^DAL$@kD4^x|*_ z_K7?^2fcZ?1Ls*5%cFAZ`v;28ZT_sIeZ%B&t`mIX{)2R`i`e%Wz)nBeK7*w?y`lZx zqQBoI=ve5$9t;|w0sQv3`F^B%Wf)RzqR67`5-pzdm2W!x4@!l8slXZT!Ea_&vS8&(1_vvRue(~LGX4<}=as8gG z12+8h?|<23I(6&#-o$l$EN9p+6I1e2JEZn9^y|N3ugVsb!o6yhC0^{GRGr)>fO&GY zV`i^u*F;a@d;jL{e*vGPosWJbKG%MsXb73_GX6wA(mt-=6F!!eulI8Op76O{u=lgW zewh&0_uKz`{-@In1EWx>9F?}!vf@z;L;%ZBAg=PlN3J^}6Q z@Fdsm^>W?bG4MhAr7F?Vzq9x9`(IEW8sDk;5_WWHer}h4k-eNu}<^3308}vjrV%g5u?YTbo^-sJH)z?W3RsW;$OZp2|A4BmT(k^1G+w=PY zhT^@X?Tp7dKH1MrJi+wZh*>X5+3OALJ>~mh#z?PH4tZDk z{^z?NW)=DAFKc$>d=|9V5buYXV*F0VPY_>CJWi~$CHnpdv96X>JV<;E@c=O<>a(r= z#J4cMhxk^*jrYUQzMlZ!8`gPC^R@9L{SoQEf_v_lRKIpmzb4SHzV6!ZN3I{wUif|( zv`@DKZWq)~Ulz{ysp6GiI*a;sJ?!(q+7GdQ2h3S%QI)gOpMbn*x~A{_p8H{shrDUL zzM^)^^!>w#S398XA)Z5Z51y;pw0h2&bg9tFfq=-%Kbw) z*Gl%?Gv4h~C-DcFpLSyOBjntD;0xX>vk5u)C%ac>4e5Qu@0Ef63{Ux9nK9;Tz#63X z(_pvYNRQ)?9cZs%KlWuux_iG3?@9YLy|I&Y{rBOy{A=m$KL9N08=Zvu3lH3l@V?hs znDs)BUYQBT-_G};*FwBkW`yytXZ#@Xox}sgm{`qv`-$Ji_#WW% z-YY}9bqsuu^TRNUrD(^vf9YR?-I{$mc1!F-SvVWVC*;fFt+ZQWCp5mnZb3}MAAtIG zd(vRH?vR(|x9I(ZS;&jpxwGsR?M*rhdDHl_>=uUYaUWc?TeN4=eUphR}cRH*x=m%r7&(m0=sh5r(4-Cm2pKoMt%2aF$_>;W)zu zhG!TqF+^KbK$Dv-3I1?dR`{ z99lVLADG2wM<)NbP)R;X+{yT#CWbwzBs{-@>kx*M(~K`O{a+;R=KCKfZfE>25qA>f zybiZ_m1No9XZ$Y{_YnUIaX;~|5)Tk#pQzi#O7iQBpJ4oN5Kj?fU5oqYE6EDuXBq#S z#5LmIB3>Z=ZQ?V;zeBu4{JX@<#J@+pLj3#0tHjuEB<-L04;a5rjQvNV7l=R0_)X$J zBrX~ME6E=bw-95$l8&D>qLO@+a=32svQChAni%IZ6y^S-BKPOo-(>n`UbPea#M9b7 z=qFBjPM_+Z@yA8~oS^=x!H;+T^HP4o(#vL$zjK|Na;B~w`aZo+$ea4TJ=P9=-(+U( zIq*KbxKA&hn*zO>($AG0g5453ZhWaEQ{*T3*xGDIOsP&Z~v*B z2dDZ^{kc8lbF=W-?Nz={4|*=&rw2Xg`}9-}^;bzgZ+ua#k7WMjFZFp*?mln*g>u7l zl{=ZIw&&5`m$VR%nckOmWW)=^QyZFo?!TTUUSj+#@iK9Zc!hX@c$N4J@fz_GaS!WZ znRtMBg?Ny7m3V}Bjd+xJop_9RgLs^HlX#uqA1Cf-`~>j^0UoL!CGM(_d!lozE z=&x^s{)ztjvf4_ixTm4?f>7 zO5Eo2gH@~Ob3PY&)#tv>>goIG$>->&9|Yf{pMC)NyncGLgAo1nXwSKy9`-Bu)3;lC z-cE8qJ>>ktetPi1=e68F6X(Gm1HW`0sx1G<^LaY?T==TvuRfhTm7nZ;u>9nHdbF>@ zlQ=gk>&3dL^ceV{^JO-EtAbCtpB{YFc>UB<_tU@8?Dpa0P7AY+*F`&CmUNzqpZ>3I zDEjHq-k<~o!(Z*!fIm!f~e=hx>TSE@!$@3U)=b?~_;9n<@B zsF%KWq!Z`kech0D{^ghNgB-DP$9<4~<+=fMZ{Uza5v_p>Oye$v;W z`#H5K&tYzs_$BGL$a+!hpBzr0KXX4k%AxaFn(h&X7xu%WeY&1^z2E4ENBt^4M8$|+ zNBy7Q4-a|C{qT^dzF~P;-#-C)d-{HO_}8-pb|gCreV@(L>G>TfXQ;lN`e_>SSEU__ z_xjw$_*TZd{wfjQ!FbG{gzD|Ym_G^C+lVoL5~`j*%%6nnTNyvW^j!ar6Tg}9W5frE zM~NRG9wEj#J8}*W@%@Y+ASPdue&Pd+?;*aAxSJUB5aO>U=6Ux?C-FYgw-aOCv-qot z`xxIw%=+LtVxjs5#$!GxMEimHqEP)d#$!GyRC|dr-xR9%5TCJeUx@dnFA(3&_!=?f zK<15rFX&H4I|~0~{&eVv@D2B;m!N;2vOm3r^aIu&RsU$a4*UMO{OQmKxj&uuC;HQ& zPjY`c?azI;TmG|N+Mno8--P_#=l=8!;yX#dPJ9>f8u8nRSAoy#PpADk2EIpo1M_wc ze>&vqo7w)%J{|jWUVl36kM!%y!ubaKbGKE8_|s{BgzlX7=MK>2{&dJowBNiZD?hIj z@}}{f`d#s(YfsGY(^b2q-?^|q-SzwV?T_{YcI|l7>~@%k{RzilcS6h^{0F^(UoZ>nxzN_^k#3)^ee?F-v0&kxKJw%4lL7q-``+m~sU-|fo;v5!y2 ziQT@85xafqCwBYNL+s<3Zr~d1OE?9)lD=tBYWH0JWa@|NxRq1=qwpu^^GhPi;!o!J z0!Pc1ezvt8VQ(kGy3mE>8BpCbJ= z#7m_A66sq>-^6(6!%A{3@iOT*Nk7ZCIiZ2I4j1t;GGr9mMOz&n6xtehKjg@pFjBiC;>*N&GFu6U4iSTgb2H5>GS! zWyEca|5jq?%S!Tc;xgk~iJ@OB@jj?_#y^ko(8rZzH*qK9w-G~sSCSivyBL2NamnPn zlDvYroAH+u!#-4!J;XhX-%bpBQb}$i?q~cJ#IQe=GJx)x_hBe-Uw+_4gX5XZ(wa+Zq2_;wi>o zN!-c!TZpF_e-&{T<8L*reoXzNk~FiOj9LD~Pf6TE++w(>=bFu*3IA2`x!IR_GfQ@! zOpC7Xp+71;)o8PE%+w|{e?K`4>tz4n{dBc_DwBgF+Pg$7Fz@BD@U`In0e5!EYwXEj{ z9nYJQby~z&4^+&T+S%Ms4nE|5a`(r=&iQ(<+;8vx&~eMBtaqY65_ZnliOIfh#`CJAO`rO-f^jCh} z=hKqU@qAk7j}XtNEu;Piue5q-JfF4&@$r1x60woXd9QXu(dlbdFz8qcSNykF2? zSpy$@9^B{EkBIpwOZt89)33<*zKQeV4E>xRpQn%W^SrllaR=Vhaod{d6|}d*TkG~0 z&w?Lup5Yky<>&6Cv*2f(XK3a;gM|9ie5oAke0!&a`T4ZmU);-mtVgka+5H0Bx4^-g z-+zJc3>}{~J2W)Mb=n=^&(O&!KIi)B4&-}iZUT0z1Nk1B!}ru*`*|sMem*VA@8{X+ zdJ|<)){Al^n6;SK6iY# z#4nP6iytsDp_jutGV}!e^#_VYCn7(TH|@PH7j?K ze#Pi#@%*IbM(m2@cdgD2*?L5_XVv$A)^YCh&0h1r3+LIM=(2R1O4nLR!_Z4C{iqKg zguhMYS|y~9ey%Xo5$SY3%I}L0|KiWHh5VlHJlpK(n#osqhR(AMPx~C(736nFTf4M> zsYR`ium2p|Wu|xa+39`F=h!YWo$j;K8NAhSpDHQ&MSUgnrKYdoE_e#(*sfaoDfO%R zGZ$5_c66IOhj@-H^jL`J*q%YY-iZxZVdy5yN7ey-)GYI~x5<<25cH7i=X4I`k#onO z-?%R~_uGPR(Qi8oIrDk^bPn}&;qz;eKd(nWufy%}{h~+BZr^L!w)0cU@~5t2(eMbv zKKiMLdH+Oul5)-S*ED_QcbNU4mFFS(+vclTFJTUPUE95;8>-khqwlGv^>f9-9QMg5 zoxU25WB-iStLckt<)Qr2In-Cy!Tq?sut#AI`)l-lliPXNkA`#TSl;yby47EUUDic_ z^3&&mOX=2*nq(zHVkMrwfd_(N}ulk8$4`iJ* zvG2c{CH8YGMu~m@)flnwzXJdA{m;vchkf?-Gx`22$ZKK$73qEdRTr`EziKD;{a2mD zzW-{F*!N#`6Qds><0)d_e^n;-{Z|u)-QK73Xs2=>pFK}$hqhk~!F4X;{ioY6-D(5}F5PAE+qbCnik#l2)M}rR5AC1GuuaaZ zr5=!WBuU2p$obE!z0%T2%NCsDyjtX^@w{4m=d^rB{*&`+w_5_)))wPOHq#2e%%k43 zy$oreQu?3V?ka!m{Ms9|6=}Ix4k^TQ6q7H-euecH=8W9#A?=j%Yro;6dahmEFNOKj z{M_2Iy>PDcWS%cwh^EpDE&iLi-}FgYZ>Ra!kzw&3fbFtgIrbCT&$?geM0CC(=kg9p z|E{0q-IjU}2sQOzaB<1?(+`m$?^jweo zxjag5dVB}ckL#i?xSws==8eQ}Kz+MHyhOZ8e1;hF-?DFmc%AVzV$5%+RrJH9d@Psi zKjc5(&(;DyRXH9>S`8QFzkVLa_p|vqxxe}<<@f(j-kU&2c2#Gi)fiz}2|*rY6dXW z7X+{vf<%}EAt1;k2oOOaC=7|RGKt~+etYll+xK3TT2{Ah2><_T_3ESV%xCX?_St8= ztyYfmSr<%{9y-2+Rp>t*H;q2(DZg+Add|ju#eA2;>F)Dsf2U(xzQ;PiC$Wbt-*YV6 zOgP(*ddRq{^$>di@uWV=PoIB=wJyYyesA>^*Xqmn{OkEC=V=jN?F!Ae)`NT{o#nd^ z<;Qjh$JzM(*ZUYQO3dsMRc7)F`F%w@pP+bZU~7Fjj|jPrp1co=d1LZED8`3F*+W{r z%%Q>On=5i+`T4t`!Pu+mzh?ga{%E~jXDG1dXn{r2-VAKt!RYvb88%G2>&=gq$E z8rE7ZKONtmce{*l$6%M0?#F&h@@}gnl%MPio8ED|q#?s|1!Itxa1P<=dTrFr$NgTO z?-yJl`sCmg_HUB!=bdkKiSOn4_w&Zq(f-Lbb4yd8Q^4;}%DrjQ2kYu`kC?dA@=MoC z*9qJn@cS|H4w}XDecj|<9`tl_FAsV;*>8ZJPWBt1r;~em(9_AiyiJoIUq6xk1=bUK z+s7GS50Q0#hEs2!!1wc1kL!Mc>+Q3I&MIH>PxMf;mB0O+Rq*k}dB~%jo3-&K$aB9q z{@w=m3DWERDrf%AYFKMT`|`Yx#rfz%y`QS*>(lwE-Id-yc)sEp6GOX)^=ielz$(Ar z(*1*D<3=Z!&)(Cvzn@yED<>!Q-u`}S(l5U8O?^MLV)-WTr;Zv<%hQnL`%v$v9{jrA z!x~2Yjt!aHd)jyKeyZpvQ8{8KuA_hPUO_|V9}O=)5$y~wRxKxX`a$hInN07VM(ddI z`IJIG?1LWc&x8jpS|;TCf#Ds%J}*%DPk!h%H#c`+z&a z|I(Gt_hFNh(v{~ip9=B0#G}N{_i(1)cfo$t*IcfPk0JKuA} z&i6KA=X*P`^Sy)E`QAzFeD5N5zV{G2-}{K2@BP5P4!(!9zoIta-cuf9dPDWDs9~EQ zs~fg}Ug0%}x0{}cx(AGIQPU9Ii#-25mVZO$-)ubgciY38K#wp-m-riI z3fiGqf2Gq=@sRbG@=T7Sc7*pn*30`A#{V4Kaf118&*v+aPw4^_==%e1_qROesYdvy z++*zy53;_R=K2S7K@chr7Bc^^S}CH7bUE^*1r?_oIF=jR^666!7MO%|^9iN=t3 zB{1$yA^cSFZx;EI`}^jv@p2Y#)9RBRhdV9ahWTqe?GbXW)v&J5{Oz|m=`jB_^B23; zTsaqE_0V`1??3ll5+!r$M`vgKoQV1Nea2eOTb5*Pow4^9&tWZh@DTv#M%O-;}GzOr$;@)5l@eLgd?6F^$15iJ?bIvHj&=o zli1tD;AdjDgWri=54lLrr?#0qBBk_8bzFbnDac|!z~`?)7W)NKKgP#CfYhHD`vm^}Q;@~FzuYTj_$bS(5@TP&&#MMm zzPH7Be~`sGz0Yq0zMC!dW_qmC3%!Z4PA~K(#yY*wo4CUA*N9(DyiWWo;tk?g5^oaU zPMk6R23fqj;`5szTV{AO!$aa$;$h+(@hgbih+j_JPW&?B4r1H~kau2*1BQ1I-%8v= zTq5ox9wHt#{TF0^m$*XwJH(^JFCiW$elhU`@gQ-P*x&z~BOYM*Jn@T&7l>a-yhQv0 z;$`BSiC2gZ5w8;8M7&0Pka(TApLm1#`NW&VzfGJWe{UpiB>pYpX5!x@ZY3@f=ZJ40 zZX@m^ZYRE;xP$n4#GS;w#9hSK5%&;ZOWa3%4RJs5)x-mAUk~x9@!!V{c}I%!fPEb4 z?~MOai?8F1{^T4U)2*1le?P{*DwKr&b zGu+|?=+He5w=fEKtYWUOce~vd<%i&ZkaBxA<>}A~wrdjOkDTkZ{ua~k>Gg6z{q~6a z*>9YrJblO77c~77+~T^qQTH0$!YbU!6}W>KU!%cg;QW%gex5jdBKyVJpx5FY=_F*U z9?!m|J*f8Vi+)M$-6_VGPP(G&h}q5!^%1_9o|XB6VL4w*|9<+n!+)?1ZaHUeIzP3q z{aka}U+wCh&p~frN9X)wTmHJvnqH^W?@IZ)r0!E%J7%C?w7oa~vdokHoO7)T`Izaj z_JjuzU-h_D@4@IY;NDZjLw?}_$YByrxx9Y>`K092(o^2TqdmxfW*G5iyMU{m=EnIS zs>}cBp8wE8=g)q-Yd&a(>0_&3dtLiZsVl#o^y2sv&QKrCLO;d% z+*wzC2g`rB{Hju)Kiu>O>gs=@{a^<^_nvZ#Wf<CemGNY)RuKY!tAGCvo+CI902vEEbAUo<#O{fTi#<0(mk?56oE&S|{thGAVVs9tua z_~0k@qWP!m0lh^%J?Q!w`Z&Fgpn6a9tFQ0OmiB_it8G^lz2Lqm2|+et)xVPjYW0z84$M6T$EJ zdylXq-(wQdvgg@m0r@$-@M_pq;kDeK zyvd@)`;YOvlsDxpAnbu%7hVs$E-EkEygj@g`_EB%9k`eKmBkgqr52=*iYs=HuheqB z)lZBuLH6H>p}SzHik@?E6+7#J+FUPVDBw~MQ7QIr&`1`dI05^0}NrxtEjA(xA zG5K7^`dI05^10l}aPqm_MNB@Idx**BGS(x~ zn0zje5|hv6abohhJV8u8m#f6&b9s)Kd@j!e>)?<01;_Y*tc2Z){TL&VPaVPfZdh1mH%O6+_eCw9J15If(i#Lo9Q zV(0rjvGaX_*!jLh?0jD)HuhyoAY&%n3ml$7zT`PRpFuk1IZmI!dhHTc2m+S*r{B%5>$ED|MIxk7rOXp#}Uajh-`Q!A z{d$%3hRk7WPc*g!KKuHvuTyhhR_Cpfoz+2{S10#F|IO0t{<_uE)7_!D%X-tDIdjwX z?&rMV1xpfM8-P4=f23v4_qWCGVf?lRnMbfbTAtP?Jlco!e77R<^5@W=hRju3E#u?m z;vVAue7ZhLr^TaItlj@KI^GJbbo=U4jx#^ET$L|AKf%03=Ygt;f;{Kvf^&l9-VNkI z@Rs>`p7Zk>%G2{2%GW5rM)`nTNxudEQ}LFx-X)~ddcJ$V&dX7;hKx<0ek${+qcU{u zG{2O6E8|a^-t9Zg6PM%+O?b3}{A@S3A@c-lP_o`RYW_E#@iL=_oL5Ku+Bp4hHGkJj zVU2osdII75e%HcP{`J?80ru}bTrb|rzm`3(wg|Dlsnau>|D_V|;mFgy|BJ}ei%gzi zM>J&KtK`ZYti9gocPRg3()}*OQU2eFZzuj9@omK4G<@hd@-Vc6JRC837)Cxk@7j?0 z3#-RZW1ZlwCn?v>JGA2k){a)TqZw|Mv8^}7G_cyjtPv@Tg+-_y6~zu*3; z$;lr*gq$cpJ|Z=FG}e=HJIL2LCSProubjCJnE`9R+BKt3hmEHmI!^p(UwZu!deP6P z$vGlR@8{BzePE1pzF!xgosJ0kk7XAanH=#6;^UE&|gRxMt-Uz`1&vgfO6C#UTBLtFZHC+frc`+UsbS$j0> zc^zLLjy-?5^=nkDAp<)rdFRykM|}Us&;6l2$$n8Y=$Q5WBG?JiKARwfQ#pnw`$g4< z7|)Jp&v))HE?x&Kr*|BL5)Jb$|5x&-Hg;ZAm!OeodvZ^(Qb^?f$VkJk;jzToQ(EqkyYwtbz4 z{VzVxR5AL7JeM!u!vc=iV=!Jt`Bm_N>j+WzvSI&zjoWp;4j}gm5ue|=jOT|_sJG6K zmsIZjT>Pn=hn68P>HhNdI{vA=s=iRkQ@WSV*8RJ$8(rjnBKzY%5qtmqSK=zee?UCJ zbp`FM!gsbiSr=;qJ>qpS$YU68JVV z%A(xMwD>w+Zav?>g!=Kkv)s3g<83|P-0ekeJ0Q+)x()FQ z2-kk{m2~~4+bvx4`IO}Y9H*~!usrz7{XO6;{A0cx?KJ!ctDo-kRas8&cP`}$yKW*=~(&4op3s-); zU+GW=j_Gi;5ACME#=BOsit|6(&v3-k@XuI2^zQ~A;{0X?5WgGYy6$;Lx;`^QaeXe4 za-uSDoc`!A%Y(nH>j86JRNMcn>H1Ao5S|4cq5`n2BcUHi{Af%3QO56t+s*oNzgOkx zhw1uGk0V|aTy4*)gv&i|^N;B?GhtZ2*Qf?&>_1zDzxdsl_OH&tU+OoLE^lhV{1>r2 zF8UDI*ZZ~ohquIEviM=G4fzRwhSKF6T`~WtjCi7N<9L!)QqQCF@K?{Y|J1VihsRbS zhm*8lj;#=PLQan@6L%0V5w{x-nm!A+_~&rDKLfY$X>;YhBr7K;r~ z#GfGUC+2zg=|19*F}#QP&kP6IkHQ^WLip4$!n2F;&wqse?ezas;tKJHiF3p}A3xPf z{6U5{6MulXk$8c4oEYyZi+&+~Kf@u%LH2#b(1Stty@rD_-es0|iJ9&_j0e3QWZzAk zVfZ}pg!PZ)9Rt`4$vXyf44+{91>$ky72Cf{?n$i@`#q^OV!tP~PVD!jHi-S6)F$z$ z*VpuYko9{~jl_OWs+rjDNwpH+#q>F1zbDm3d zJ*ht8+nK(f*zZXV5c@r;A!5HLHB3Cr^c7;iCpAj!_oT*&{hrhWvEP%b68k-=Ibxo_ zkMEiJJ*fqT53&4p%8TEN+939OQJchmFDgU+`Msz{V!s#FOgzB+TZ#Q%RF2s1MYR$8 zy{LBLo0-0Y*zZMk65qt|E@HnI)kECR@IGR{7u8Sf_o4=f{a(}%@ozExFtOi@su26V zs8M3S7d1}Y$Mh4#elMy@?DwMPi2YvFJh9)4S|Ij&QA@ZTVVL-JU+wyUe&Vciy(`8RkF{__@8I|b;ieh#`i~q zZmi4bIHx~vP_2Jpd7D>pm`@zUq`Y`m1Y zwEncd`U_{VFJHPo2aIi+Omcr}hx_%uKYFJn+x=cs5#?;ZPlI)(@PzNvoZ!8zu^jB$ zNzD7it_S@N_Mx38dG9DHuNc4M`!oB|?&Mw;zB3TtKjAvXZuj8)osRAI-oAkPo-kcb z@LpCK^GM&PjMu5+ds&=cpCo;Drpp4_(JT{6`GsPi>Th?ttQo!ioTa~O;P3k-bbseb z(&+^6W0f&4@^#I4e?GpC)nV-jPxe0681zs~ucuo!nWR1UpgkwszjzKUn#4G`y`SBE zl5{%3ds$;#KjJ+szn3NY*z{+jzc7A>=iod?`kaKWv!vH0bR9i?9^t(g37!I-bUkY8 zy{uK!%kjOevfs;Eh5TfBFKd$LclmCcd_QYLb4=%}^U|N>{j7|(Ynttleo%iuOEq&i z13jbbFY}k^xs*nXZ^trl4>G+(mg+tj;dr0Czl4qz9)#XkIw73nz(`#>utCnvU>pml zm!aQg(C@<8dBbtOd`BV9*WYovqAp*agNxH$QCA;-SLEutbU2on3Aw%+r@y)`z3ZjD zb?G^7#p(9erQ{VI+|rEGJ*6()nZR=X1N3>gdT20X@zedZB7&XP zA1dhSeVO)4)BCPfOCJr+(VaI}?KAB$kL3PSRr{Z>5ASmSDXq^M))6Bh)Lt zm&1By-OgtHW4pJ)_#L!EM~S(PF*Qz%bq;OkknO`@-lABR*reT9&lCI9_@AcleBC-A=8ao>!^g2Va+az)B}AuU;Ob zL9EY5gZ)P5M?;R3E+;BSy3Su;-w(APf8T!n5$@Z!UXb3mM|+d~K+++W(;mv5&(Cti zE~jn8E~o9piJW5J{`hjLbjCS3%=Z*uZ2ZA|OX>2g^!Zr6QyL9!m+z%IId%E|fYd0g zEkhsryFmV4H}&a#Ds1u#xi6O_s13MFY<9Fey0j{>*5H)bzD^qSh@o^ znjEltMEQQWg;u!y?y;=*o1X7|%#$oZct@MLzW*2Akt1F)I)^+*8|9aYr6bBO^852X z@5_Ua$-Wu*oY--YgYa}15b<}%MtYE67JLs!`iQ~zaHO9Yd=Ezkh%vq>KlLZ$fwi+C z^A^L8yj`qkegN%`$1%1e-XCN;<8h31sH^ApcGS0XD;>05+B9!hY2;t5UH(3HY2=@Y zVTYAQzE2GMwKVcQV%TS;k?#`29x09Be7mfJntf0j`6q@?5U&%D5`UX`nD`%w2Z+B# z+(-OP;x6KUAnqXk25}ql*NIz+*N7X5|DJf$KPSdKp)~RtV$3T`BcCRQ{azYbCayBS zPZ5t3f0DRD{0ZVA;*S&e6Mu}jhxpHkJBdF^+)lhioFiT&ZYKT+afbL$i8n~E4->Bu ze~5U6_=Cht#2+A@Cte_~5~6-f5Pw{;`b2u5x<+bpLm{l zfLOJG>VrnZ;m8nikI6$gGECe>Tp{ix9wqJ|9w%-mo*-@mer?ro_?kJmcQ=}wwu6@J zos*o!U*!0scG@TQ$^3H`<4;ihy4jmic@_Ciq5eVk3&had0qsdyFExGZ=X~UyH{x~1 z$GGJ8!{uB7!#5cY{hRDdLqGd_jPec^<2Ta|hJN>V_FV7EJ6H&>H5kdG+Oc|`o~HSMz+_LHh`A43s}R4D;lsq- zH|F;!g8Z8pKFaU~;wte3@dPpVrEBxVZ)W%$G54{#{u1OT8NR@9?tAn5UqSv48NSSL z?vvNnh~L8SRbuX|^E*jF{;dpOXE^uaYZ%{y{M#75$#Cq~%RBYf|APD2$u7xgCFN{yv}f?>TAt zaumaU8h+_sEeQADG^x#N#7oDCKRY*>C)U?H;=ID+`~1Vt83tFg-cp|a73|egP>zzo z&)22LE1j>U*Nc}pzyE4U&$VEj32PW%{JT!)@3U+(7oGCB%=z+XIzLUXbj^vsw&%2O z===Cv^9iRho-JO6e4ar1hx{IB*wAVL(RFac2FXZ%(RFY`e>eR)jK86rvq3mqy|0&( zKO^qz$+&28Am`m6FL#YAdA8JhTQe~kQ2cwevE=p8gY z8*Z`7+^D+~F29EsO>%r5Y=eIu<8e5W1D|}|{Mv+$8sPiZ_3xC&{MnEA$^O)RsK39n z7o1pr{(Xk+`<$;kNqUq)ho%s2aTx9G9)epKfLrc2*WXL^b>_&|H+-G(QKQSPYzO;M zp%3_JCrTgMU*!%<7fsUM=e^|Zbi4T^>2`wqd1dHLxgUUf__=UjCmMks+Ub0O%Tvg4 zr(Uk)yPc@FuQxrTUcR1<@Uy8m51k!Qm;0gq{g)`~`=Y4#@%BY^yglB&sE(V*d$$tn*?3b!<3un5l{yMHb{z4hoc#qZZ5r#kEal+@pVHN$;-wW7v z{JA%gUuo8Z@p$0xMDFyCR!Z(Ioy)hUJ5)E``TLlB-*cz;JKZkawcaVcZsqeHO*n)8 z8>bKI>Tx;8-D~UG?c<2o|Ju5A`Px^(Tpae1fIrQ79Q&N$r;<9q1uQ0{17JZN@$ zL*_?jC&c@zm!KY{(wJ4SWzYMqKbH3942QRx6Wi_KKI(%)7wnCFBFOTK3Y>56Lw@po zQ-oiD^znQ<=rE7-o(ij6`-K+R@)#^whqv}wcsPyu`FZ==412r=+g*@(#I2o-hjMP* z_n)SB!dtuOkNVuW58pe9`(Mz5@EO$q#>@W2()qlhAp;!Vigx*YC299kUAsB2i`&h4 z?mjC<=rV`+x3S#^o@W8^{@*G6hEF>Gn6At}0Nu`e>hp|$3B7*XaCj@rnRa^pHR&~g z@~53%Uo`)OUPB0v>Ge6%3+Ker`fo`0>4cy4_t38w``y>Ev;53(GYTf!QzKgIder{NY3IPbgCogdXVppmmNhr0`|8V^n)8On?e1Ri5mYl z_P1Ho`^GClN4KXMGQc7AZ|M5}W~A430j+@E=TNsr?)K|XvHrrR!i}B|NfcadBV zYX16@_Yh$Rg3XzTdQI11Ko{tXu#@yKV1)P+edC%f*prsncjFmc^Pyb0v*FW zq^Ezc6T`%=-&-nOnP>gyten!7PbQuxZX;em`>xCx4u2i=iMp%s7x~a%)I9+_vubX1 z7W|WXzZ>;_Ea`9s!gr;^*!T|lv40J>TSm$Ee^yYB6Qn~l*lO`hk0U(>2Z%|J!69PO zV{jPxKQ3qGMuQb#dmT&Y&@>8Mv0%adz*W>M+Qv_OH#V%0E+;Ar%`V1LH%5=_mu>8m7v|5=` zBkEgfKt)O!v@d8XTKu4R1KhDb)T_G(ZlMb<&rwH{9l(Pe=W3u&kk6aH@7DzRCliA{ zfuE;~_iHfD$@~lP_&w%ie5CyNIvw9Xi`VJ+J@O#?L+G)oA)`l-{Q)uLR_q31$gQtG z%6%@-&%YNl)kVC<_^ZUL#1q6ThE*S`Wchd->qm~q$#-nWnXaGh>>(Z?ULqbMt`ZLu zHxpNg=L`qgG2(gR*Ag!fj~Y&o^AoD~vl##N{dASXXb|IfI$lQNrNJyLC><=O3Ji0=qQ_gQbuF8JVgm%RCDe8CQKJKU8 zI$-g`=>@CDjr*|Ax!pcpLilAE|5_gNABNNIbo=zfb?-Wz()P1$pVrs+Z~hOpPrHmR z$9r$y+gX3U?jPkGc49ZcUQOQBpD;c||BZHdeSJS*?cDy3kJ>|O?>^jje9k^E+2@gS zn`n0ydQQF*M@)V9DA@Hl57=q>D*fy2`n|%*N5igPtJ_cVe*A#kERgf@)-UBAh`9}! z3i{Pgq5UO0x4U!uf8|kXfAbD{>`m7GR?`Ra-EVUnGW}?Otr7mSt)Ne8eqifGoCmmG z3ul%sUc4T&)B4W=%Rc!o3-{Z4Pr2Fx8Z!S6%D<3yz?F>8d5)g$5mCvs$Qz&f!)YJU z-`5$;^h&6PG-PG|2xjp>h-_03-#{?{U0$Mu0TFJ(czMMI&dGM%vy`IoZipW^$49`Pyays;U@dx2Hf5E^+4|(*Zm-mJFSz( za=JtMXoqvbi)UN0ndIKZP3F$@jYGcyp*eUK);lr<8ZU1a0?aG`wnB{qrgY6|0hxZ zo#-LOZJ`H>KaRfr)8o_OlAZMJm#sa)*q7jzSJBR<6}ZJ^xZRL%pI<};^pCV0RM^i} z9wBMZ~Ndvy)tT-n);``0I4!reUXXw?m99N}2e$LnAFt+&^UTiOZv)pv^Y7nK(v=Vi#b($nOJ z-|2clw zd8cS>)6y$F+P|in0zY3Tk?;Rlc$&`j`vpG!{F2%;Q*9PMtmVvY$h^-oOzs1EyIp?_ zu^rGaNxMhQKWX$r+59*EBa---E$4;0D6bD4dj0T%8%}W>*tevoif@B|A#8q$AM=Zw_FU|ZdYw9 z_ojy~SI)bW4v-UlbMcoqIwd`#TpRUa}8^eO&o&obf&C2Hm43^5G7|4=-RjoG<8i zYec-PkBIZ?OE0@vMo`&jIg|TF1;|zDOsq5b{%`5bHp?(7K>ousbHwZy@%_^wtB=3) zsd`Rp;OpwqGg%+LFA%?PaF))p#ct|ux4MO-Pt@H;4E{vjIbiM^`aVoFiF0i7e&~kg zqx94q)8mhhbLsb0TZI6Au1)Rh-XH2Y^LeYk&if?`(VJM`ippK+U$qIi@p}u?LofVbgzKeQ z+OnW^RQ?w_6Tg)6uc&p{{9inQiIj%xFKVrrt62H(`+8|PS~Ge#qP}tgafP5Z^^ z{XEDiZ#Dm&zkB>`+m8I+0RD$p7);JT2p_eG zm|lYQ7c~tVJxV$1r>1sd>Zhg-;x@+b1pRV3;x^z5C|7p!EAOe3!zYM44XeJ=p5^EEVttl{-cHW@L7w~`m)!F;y7>Bo z>rX#-=;!DBJ$9cb%ecgPv|ByoJOgnD@ehd6AN?F;T8}o`_=a&p>#Oo5=iMz`I$l-B z?V5=T#&t;-PFJiPIfrhp>i^r{Ao{g72mh%m-21Ul7+nm#dPnY!dR};{$1@_j)&Xq+NM5~ zSL}z|J%D!lzR0e2?Ox?<%C3c+CU!04G_h+tk^h-Ft9az+!ehI($HIRW?b`8O?Ajl0 zs$Dy7^-t_tOpKy(8`{l%m*gJeD*WSnh%3aDGoI%S_ZqpR-!57BPs*+h2Hl>`SvkAg zvtPD~$+-xNAI}rw^AYGLu5bK%8gBo)9`*M)ll4y5r_jqMW1k+q2;Xl|lj+5+uSNat zhn!!}b4|g(sQJ4-thZNVz5a0RRO-R-Ao%9?M{IYU2LJF9xUMe~J9Pwl-RD6w?3V|a zpXg21k5O!=_8a|w;&$pq)H_#iZP$)=Y762edgp~`*Tb|^6Z^E;+FQ!eK5J?vZnFX- z>a{SJBW|?tFt$%Kz_EP_J7v3l3i&%}`;_+Lc02W1*8Yg^CHwnSvAudH=(W2YNc;2% z?Nxr4xO9Z{$YP(rbcFQq_eqYB9)3Rh4YZeCzjUDd#GYh799%H_CFJ?_kn-UGl`-hFr5$8v}(h)RXL*^pLf$tArk`rGUM|^+yVzi?apF^RYI!HTpl6Go& z3H0QCx$J`iyPeAK&B!`+ot+B$1X;IJR~SBldd2qIIP&Wrg-iR?&qewBxUzmu`)-Ko z+pXP+o!UX{c4{ZF+o@fkQ*5X95WAg<{+;Z1Kp!M}bBOUz)=q^SC3Y(KoY<+b=My^> z{U)(f(XSFa75y@?Q_(Nw+%4(S$98WTPTQX+YNu9?Yp3Qc-*BeQT(uwXoK!n?6#iVV z38x{C?nc~?@OSD?#9m#gvqwi$_Ndyq>viGpYf0Iwmz$Vp{5v6jZYE6!U1v(~vp@UG zYF8{-J6iVKZW%;_n|RNlwqpKKzLD~mF?aD8$~pBk`R+^|y)t_K=m^4HZ!5jdm2Vy0 zQW~~^^gLiq$C-RH@}EThFZTV_koicvv5wPf@pSymNszpwfci`!o{oc8*PVaT`e;2g zz1HLBq#ohaEhsOG_d>#{gTxy@)||qr8;J4VNH}#hG2SZ)`QDSS6NP6CSp~u~(Z2Ak z3h?Q$17u$j>AU;k@*ca~n>Xy|UJng|4{3h&)U{_#zmGU$+1q-o(qG$`6EAI_j@t)g zem>hGD!sJ*a;|e*zfk(8&tWVnzSWXhekHjVt?A{T&>Q@T1}P7N;G2d^74)8*$xFhY z4Z|w8Tlde`%|G2v<&&>}%KMU#JEuo#-e~exO6vD4+2=pr_cg214lVcLp39wnV$!eV zoTl^NTv=BjUL_`7d>ouwGdj!p5r(f5FA;ALFB?{R-D>;C>oHb-1=%6PqLHh5f_j8Ze^Bd^zy?g#I+y4ru&~KtFz7w8&j|u%N%AQMoGH3ld5dm;VjxApg` zjvLaSt`R!v`2uy7j_+!cv$8_Q!t4Lzu+s2V4`z<}IXLw{_q~VhG1ce)=H*8suG^~r zm;U_g&(ipx`)>G7x#wf$s{iA@`k!A{|G#~~)V)$~)Ms$}dljm$Wjx=|xM{kW+^6(^ zzm8AS8Vl>$6~(i_i?W}sKW)e3e@@2vTd7xabfrG}^ZBydC-J;l2Qm4D+^3D_SEuYV z$TS*P&~fzh{0?&ec9Z)B>Q}t47QGzxi(X^J$KNqNSbK@-%R_#DZ5r>> zM1`EuF`W4=3y->6foHD+E;buJlt=ogz;xY=Uqrm))w{Ywz3;Vp&#~TBjtdyq!i$A4 z@(T~5{=3mPUXO_PY5ofJA4Y!;UrT<`j@&K3(nY?ng7*hY7h!%U`wY+@7qwZ%#k{*R|V$!29VK}@yXB7!Y zN&iErS5&B=p5FfWUi8~g&+cKQKS(;9fpojA7cbt%{F{c5|6bsPzWiRxO5jMY{6cZ`luG{2s(Vx@I`B-x^h1Wgm4Fa(xB{(#Y=>oUv*2_jd-v(>H)QpNR80 z9da7qL!Mf=_QQ`k7&reUbB&TD*0XOv-&*R z=OcGJmni!YDA(VO+Go{D?wLImI9@kC$@7`Jm%qgF7yet?zuiuP9k|_2f<3t1PJ&&y z-A;mi8186qF0h|M@5(qu%>I{${gv38u)D%i&KTnJtmK^^_WSt#kQLsNlC=mPLF z{=UIByLz*(UK@4wqP-B?)oT`>?r&?_kF)4U+TZkdJiD-dUBv9bRDY^!f15#iJ-4R% z!R57O3CU zc5dB!6JZzPMHo)y{Kx@Q{0$kr&wa4=e_J_+@;^2=to=I5&GY+$wO=Ft9>Xsq{-(Ky zd>wC!^^wYq*V&iKZ>7go|0eW5Izjt#9PSC~x6tQ>{tnusu4n#t*K_IA;a&v9uP*!ul}8$_&kxzmkz%2i{Iyo&kymtrbD#r_54XsFZ&CyZ?4E04xh>Ltd~o@x?yicFRqi%{{q^&F8PApA@jPF!{=$plMn1of z*Et?Qe|$3a$`Qni*9~^aFY@_!oX@+EkJIsF?>)3pkB(I^KjXU$(by<4_2}3*^k`eo zDk}3_V(Kr>_vM{9^H1(e_&)rbQO}dTC(%8G{4NB2l68SUfPNZ;K8xSQjO|qDvG8f6 zE9t3v#`xstT?Ol}bT;WQ*k$FF&gOVB*h5S@4E7lg&(2vo`A!}1>7awygTUmwoX0dA zJ;kD@zC-&8(8KS2UxDyl`QP1%{LW&2u^jvk=rIO;AC?9zLU<y{_#EFH(w~m>yUNcPzT+O-1x@(AZ#aW|wx3J70DR$kWjNen z1%(yJ)rsCCC|yW;b>lnlr3*=~?q$%6=W)UdbI70a6N>KDUsPPMc*#1v^Ys@{zwRo+ z^K+p02=yxU(r)XJ(c}cu%|QO-Ju>2D@PYhE^bg)Gmit+V_wr7wXS_apg7dD@T~3!# z%cpcV=u$ci`3djJA>Ru1?0~^cGEZ|leBb6t(b$mXBlpPQc2`ipn@Ep+NFSg3+Cd*K z4kKPTTSfby3Y@&}_xG5W9b&z1&RK-g3sCRv>$3PROi;%6V}km3HVUJ(w<~Zbd48tG z_T-0PFV{e)AU|k07`ui3Xm1dIuL}~G377YP7FDebEl3$$83(6{X5%Ayas+{n~B#A2iYd#4dT;?H;EgGGt56j z480=XL4>}TqF&^8Y32LjjK9wC6_&q7+-l)L7VGKZ6!dTT0!jtv)9%5gA?<1aL`hMnDB_1H2ARZ#7-9EL-_Kq@qnBf)T zis58kew5hP<;RJK8GnN5hlrPm2Z-lcUO#b_;eEu*#65=7>qix_OLto@R=Y-~$~J#G zEN=rJoWiGHn8)qB zemRVJKs;|4BF6Y4-(Lgf_~z?t{yhkvPbB;K6LtBG*X1`_mmla9uZOanB)^5a{O0TO zo2$#OYB*W1Y~E1CsOL`9?u^D-4J%#SzskW${g1Oxpz{@9|E%X+5=kAkp2+bCruHSC!olEDZ z*E^9uzE?ZdYWXGWohV<{aj4f&KR+K9zKr9KfA{GMwp-|{^p59a5T}f09@(0Y?jvos?M z_!^BtUxa-*t4G)iI>h_f7n!%%P1LJsR_b2hw^7fF*xsuVe^>jldlhUitOue zyB+xn%P+ix^w^7dyV8U6Klz?C=-~5JcJ0Jo`~dQQ`G92{+llpZ#(8SUb+}l5#b1Ak zz1W5J-{p364>9GVyAS2vowIcDem?mj-?y^xSbpPq;CfdV%HtXS-8_Lq5Fi@Kl$GLII+|H z`1X<7D;MuS_g$LlsUMx4O`ik2xbHKj9lkO!vNwGW@I4pa_I!&*83guiTdzp8|;m_9NhR^_JcN0I9Pj&@#RqdT=b{f8w^MJ zvxr|${PVB|e7^8$m8-a(-(fvJY<5{v zPkhfdspmT_Jj#1L@lJY_-?^UsJJjtiMcB7d_X;rY z<3@!g!;iKeP4l;2A8JdEr#Dr8{r*-uJ@jO|$)D<7=+h3v@@|9CE#P-gHC*ZK_rB8o zT<0;-L!6uHm+*9aJNJ>&3#Lyw&+&DBmG5_mZGMp7Gf(vAuNuE(9R&2{JqXtiI**d# z9*ozie?sR8RIh#|^?f9rXXsF=_15ykBmGuS#lQSDp<7ck=<4?^o7XJdtSI_T#{9_;cm;!N5x%3PyOltnGm-F&Yw}Z9Y zjZTSPy3KH+mtI2bdg*53o%K@B4tnWd|5^2UAN5iX+!K^5*QXEvT--BE56O3Zt)C_H z_+e{La{hma81~zVoLg$HYp?V1FRi_;Y;QB%cwD%|>a)oC&n3dI3xrqt{)YebPv4i* z{nktcA?n}4`NZOW_$^ZZo_`^*%f$l%RWL8T&cri*hd!K5^t7gkzsD`cl&+8IPs_RV z04n5iuX59ylArLJE{of$Mi_sZ!tcSWe$n3|=e>(LgPA9E!Yw^+ul=!zYe$(UTt$D{ zA;I0iA&%Q-qPx+Ku<{2J`pv!Nx?$kiPV_VX-q0+@iKy5JJ7yN+i0qRQLvCeV1M)jN!1T++{lu{6 z!`X4-d4|KDjrje5aJItmD#JPM7CFzE<@j4fKauYnS-Ybm=Q;ddTvX&dXSUh$DfLZS z`&xv*Dks6qRJ)11a6cq!$Qcf+&DO4{0rC}A(e9|Bli_H0)Byb(R?)7gp@-pUchmsA z7*;`-sG*wztQ zV*Y;KIBLOtz<52dWt!ojPt@{<#ORl$)BnhD&?1lG%g@KH?ei4MV>~~kJSOK!Adl!4 zVoyLGx7Z~z-|~B^+Rt-R-tq1US7qFhcj30#%Q){1`fGaaM{XA-b`9w5dPLSox8<{@ z<7G_}%TMRe6V$_eOj7yps36C}*dGKR#~Am2ZqE5jA&MeSIDoHB(-X_bf0=?y%HYnB40YqZOD9g6Y}xs*Ry?xdg?9H@Ms6?(aw5&+3Io9^LpBo z$vpm($mfLT@i;ddl(CK)@Vk^z(~$8aq8$0v!-QAfr9eKtSci>@Rl}u*^HF|rj`$ae=ZViF zULZb~c!~H)#LL84;uYd^h*ycxj;OdstfR7wcg1yLJYXFaH;6Hzh>DxUXEA=p^h2rP zOyWjjOthk6Gco52#a3bw6!}HP9Ptx~+lYUGxSja%#2v&xPuxk2?@~m?F5)JJ_Yiab zQtTrJ|Ds|)F$N&%C&Z6q`XOSS5NdsgiDiOexI&D1o1AYaR;knYd<^Pf28KXI1juMnR@yhnE%8v|9_+zm#&QYPaN}~ zIOacb%zxsT|HLu>iDUi~$NVRb`A_WpAAr1G>HHrecK#0&JO3-h&i_$j=l?jd^M3-k z6Z|h-3BH%E0>4YoGO}m3PDq*j>l_Zp^*sY*nw87^nF@^rNlw zGNqHY^XBi#xK+dct*ob+oJV}$)!$dXPcxTacqaN+_!Qvyyns|%s+OETfw;=NtH7VQ$VqZDQZ@wF_g;x2|n6fTl@|Bj4ew+6ta+kAsneYP0+ta{glVLPB^`ZeqX?TPdEd;CGSsKd^rb;@O+N(&^|e@ zZ#a2>p`Cb?>1g-I=OZu=k?-L$yo>Q6XQEe#A%~(@h#{wPevlY)EbHJN-}n(^|A)sX zewW85{$t`L;&&1+6TgFah4}5ntHj5M*NEqc*NKl3ZxG*4yh%JuoH6?#$j%Tq5>FF1 z6W54aiKmEj#8u)p;y)s8Cw?1o2k~2pJBi;y+(rC{#6855#C^nXChjMmARZuo6Y&u7 z8;OUB?<1}dzkzs^_+H|1;(LfEh>s9giN}fOi2s0ip7{5P7l?n4c!~J+#LL95BVHjM zBVHwbE%6%hDDgV+-NYNjuOZ$fK1`f3`46&p5jPUwN!(0)2XQO$2yu?MLfl6DYT|a{ zR}ps*zmm9<_;%th;s|(d0P;Fk20l6jTn>Tn9|j&AX8H={`xS;4&k^M#Kl#oa{a+4$ zsCn@pr~k{~&wUut3-rGY{xF{Wv_;Wm!b!+-I$YbTyycn9$k zaVPOIaToClG1evGdus7JF>`G1A2I$s@!NGJN_>PkM?6m4MvQxg;Z!^E?=!rE`1goA ziC<6LMf^JA9^x_LKH}FB_Y;p24-nr?JVg8&;$h;$#1-PZh)0R7Hi%!&@J-^E z5ob)EgY0d@jl==5>%&`#T_2W+bBsSk+(!ITV%LYiOYHg(_bx?WF#byz-bMUk!@<}f z-104O2M6Fzz6fs93*i=D0Jj_Ky+Pp+aQ-H9!~3b12Jud9I7huS){pR`)Jx^fI=!@E zc<~tYl)l%yQgP}Z4-vndc$oNQ z#1-P(h)0P7;&I|zi6@9l#8qOhL)7Mo`F=@lp7?hee}VXSh?j_8LcC1O_f2Xm#Dff9 zCBB7tjd*}~o%lt>8^kXp-XwkjG4)mcW@75A{2^lMtNcyG)K~d~#MD>$eq!pY{PT&a zukyc5OnsHVk(l}_|69b=SNY#09>DmTFA@(C-#|P}jCGr^Rw3rQF11nO=P~{`aWC-% z@pZ&K#Mct{5np3C7`z(pSP#Qjp(pZP#4E&|#LL7T#7o5OhIPHqe>%?%F91q^4@T#~ zm+pgM=k{H%%!T#0cp2jBd^>YH{?>e2`0mZ(6%3bhxaDf|=}Y%wJ=67n&D z;X>pW`ghE(<9^S5l7al9>)?j>aUI9+cX8n@x(?~J{yB}GZzMf3a0{E@`~CeUN8!yH zOZYZrj=lTZuj_x)#8Q9xtj>c*U-8m*+}NV@=r_6P-E%h1OVwJD-(FvTYQs8Qd>=nY z?CVdh#3;wVKNuctGmm(G>)xau!n%x~2l4Z8e%>ssby)eOOL9n0xrm;D^u3Qg%jBRT zvlruYZNTau&a|Q42M{kl-%2?S=h`hiK8JV!^-tmfhcmf{%%}I1BFfz%eM9DX2yZ2S z?@a3RQ0+vH<>suMMJTm^uBGND1D}rjV?nlPd4@|B!Uy`NHI0)i;pO z3DafF+7&dt7H)AA?d`6>Eeyjg55b)rfSd0(H}rj4J@_WS^!F(rs@^dj_M@Fi{XfI{ zgAP#vr}I=}%9RP9L=P22CG;>)(Oto(DY&b8yR5bHgdt z!`Gklp=h|49{ z=T2Cjcu%ismwS4Xm_Nup3+u;GehvM33i>VC4}cw1|6a=C9O))vwhacJ5PX#JWiVc=i*NIu62dk984^D#cW$VUtb3cjlXoHvM`IoIZ>E2{#{++|Z5~dX zGn^iGbo`Zdp>6)yN5J`obbRbXY`;&|F6}t({qVYRty$YUi}v~W7S2E)X?vd_5#;;` zo1#xr%-r=NHuFcljf%N0oZ;;kM&i zv^Q?Q>uaamwRQE~&-xyyOGi7S_mt_I;YuSUNK`_NBh9J2o9@8QLA--G@dH8moiUi4SFC%>urms)b_ z$a#@Y3oo^tPuxZPi^M&|=Xp5OpG(}w@F#hEhG#vT_#EP4;#OkJXG<+lbjgqSWH&MIgte7C$f2%J_a>1bU>@;^#%$ znLh+y_{scqR;2CAF};bI;6{WW&M_S81*OBz|2E`z*!e$-^oO1QSWhS&cK$CjzVjdJ z3#G%(|8b^w{$stNbhwq}uQ2@+i6|N^S?su{2wQF{;v`{|Et8#{|xKr{GVXB^S_zl&i?`8 znE%Aif2_Zh4mfpFcYb3&SlaLW#{93e-}%jX z=6>gQC(Cz!cM&_kdx)LieZaWnV9@9v=Wp5g&Z;YUuYvH{|oKJZrn3()8REWv{!YDEMUl=DQ{|ghuw&kL474p}GbgMJ%@Jf!XKakZx}fxp_zZQqymt=fde_kCEskD(UGkyJz%z}g`9DX#OQ^2eja%v=_;}|OUv-wOTS>FDWilW5vF7u$d`|J| z)}PEd#doFX_OozKu|xQfKBxFg#vjakRUR%n!E=hXPFYi~;{KSQQ+)2XWq#`Gdt9e% z$Xsjk7fsID_z@n1{p|O+wx18gxps$@D$+^r`#82)^ z5>vnCmw{t_w`4f2UzSAAh4&!7?_-2}QGQa+Ci3CA*Ql@od=|^;Uau=>4R{vylY0ZE zpF)2Zs@O@4`pLY681<8PqzwDHzNotoxX=$bKY;jCpqH$#6N8?z&O!`&%Xw^K@Wam~ z`uhc{N3WA6N7;6(cQn|Bel&&t6qWnUPHcG$#ud3=PkBUqIZtHi7BS4*I|iQ+z1d$??a4Lg(6c{e)el1;(=^XMcAfD!XlhF(QaXqFnzmf0x zA$}J1()h31lHaDupVH|o>H5vIvb{<8F>P-*{Nr+_DwbaQg~iu=-m@j24TN{Y)$l8| zd~fdz=5cCYyfR&{`!TpkV? zr1L*Igmy^&_iH`J5I@Pc3OUKbU-e8^I{nl-`zzu-AYu1uK27jX@~JQ%_-j5NR=PQV zrq-Ab;%T^Q=7{f#C;3b;AI2|Cp#BoSb4$HeEkBjRU(tLDz;Qm)Ugcz)8)20kM@eZzF+HC z25#~4kIpka{G%-7Lgo8c)A<~oLwob6kIL005-xU&`N#Q9%^^SfM+L}-#=j$7@2P%k z*WxvjiTqT)eyH^;z(3A!x{vb3_*W+JBl$CK=k&0}Q+*}>Wc)q5)QkQaZ#7+? znI5DUxjL-%7zB>f-`|7u^jH0NW4iqNyO3VwYDmi;1CGC z@tWukvfOUgzkqfM-4U-${^cPDa$m{n5l$^zxSX#uEbpfflOIy9up|@CL0`snthO`W z1oMF&38$*S)N|qNFyc|KhaA5`jt_Evg!%NFtJn0jJQ-&Vt32pW>@34^`BNQ+-F}ku zf+k-<7U#dEJ;XToE%R?;ocESO2xpXWn=*r`GGz4YI-`pNlC*7Hy3-^loIgY0|gKVap#9U5fc zP5(~DhZ|()>5p~0AnW%yux=M*?_)UD?SkwZh$n2_E6CnUjCH#pdk-U0?w!`lwG?PAm!|)vI2{*{TpZ>!v*YBTnF(1G0kYPSLtCMs7`3IP8i0LMXJDJY! zO*AsyD#K}K(%uZR3-ljgK7K!@gZbb-Mo{+AQDFfIkzZ!tc`ks$jC;tbRKy|xU~`#q;Q))Q`!{YR!-qd(jr`$_t5vVMMVZj<@@ zJ*s)O=i7|G!hGNc*-z1bgZa!kWWOzel*n{CKbI{ywyC@H>pZ!uIkU)zm7}`@O_frsqAiY9GRz zaQ;lblVUiWT4H_R2H8LN{F$HMdt70Dya#u*2j!Q)$M~a+|5@T?V!ubZ%=ElhM>{O& z{=UVR^Leb#GV233$o>WMTVj5GPjiX+@!sBS7wS{|XU6ZNK7$)%KexqSzPrTy{2u56 z^W(k1=`Ms9{sr|b0EfqxQO@M&nIG()AiKw~+B<6UB=^I*tR8-@Y5RH}?inZRvb=8* zugmg2M!cTq=cg82U)wrk7=M?snRt%jjl@-AtV<^M!2BNB3d7qOf0?+Ac!@YijC#v{ z3Nh*}>vzOF@0IN$M!o$z;X&c=%|9r94Q}^W;g-Jwx9RWT`gh*PzGPVJH1chg*!%t8 z61zV68^`P?e@*Oq@2`kmfBq%0>)$UDQ@>}w;PFj9gX{{ik2{|yUS)ZoBldCcFNil8 z{#oJ;;y)+$@%uBx6Ab?}aUA@=_Jr^KU7_hDk!HyZJ z@i@cZPV9D{e+LQnWbz$>D&rqz{2cSUpSXi~me}V5GsK&0-!yR}PH? z_`OlLfBfF4+fjaRG)MjK_eR@@{obhCjpNL}!^aEaPGY||+C}X5Mtg|;-e@1O-y7{G z_IslP#C~sdhY+DD9gqjLX*823kIzlj+4 zNR#!50hT|^aNH|R)=zN1G+94+0ppJ|{>{V_#JG2wte@P(@HzIcgT!sb{lLfO4M&rk zb#~7N?4tYIpq~c+m3C5}rStDY$US{xKSvKcLDnU)4?We%aGa-4p94Sceby13t>aw9 z^^Lfvq;^=u@52OxU$^|sK9hj>K54w4xMAV4Ze)5cx#v1hocW)cfBd~pz9S>{GsBx1 z?siivvD;NS;#J1yJ=ek-%k3h4KhJnw)bF1o?qT>}IA-`~iTfD-|FQQj@R3~Axo^w1 zY%zpb9wS>WY~14q799*4V;fnJps_I#;w58*g_}Us!A=1nK9#poSXiQ zUHb1=?e|`L*Is-7xijrQNgk&CC&**uMe-co{~5W?`thgEwEsAHf&4M@Jo!(^bM*gF zau@AC;_hj`KrS*q$H~id|6%e9`9tJ&GVZ02a~H_}o%SwAeULm&`wx&?_`Z2^j{E?* zmHd8kJNb{uU1Z#YA$s8q{|{;3N&EMb^W;Au_mJnvi}e5dWS6IY&+VCCze}E=f84v_ z^EiRHQHCnMaHi} zc6sVI$z!yC54lYK4e|u}-DH=iew{o;`x&y!Q@=)bd1{(mq5F4{U7mU;+2yJG$u3X5 zgS^i4-A8tL>R#h;{2UR@wlpS`+BrapUhiA;U=WZqAG_Ua1lCmH@K z`R(L2@&tLEOnvrhj^irz*{K&32GnP-w$lD?`fn#wpS_wV-$nZlGWFT3o#Zm@yU5gM zPu2se&z_veLVfn+d>87oC+E7v3~!j>QJ=j!LZ&`@wMZVL`!O>0*{fwT_1TkiX{gVh zoJT`__T(HI>a$lX^nVA#ual|IUY#QsX+KYa$l@ z$fFE@m3%vSjXXkLCsUujnqxhtK6|x=Onvrb-SXA+-%fk#vsd%vSJA$MOnvs`e3fC^ zchR2u?A0DJ_1UYvWa_h5U5=tYd-C1oWejha?y1k7$Whd1PrmC6()}3SQ=dKg4n=+T z3)Mrn=Ls6eS`406WhF@p{ON~Wm-}MsPbP92 zwl$kOP0Fe0xu5lt)1&9!`KPC#=k9tPuIH{9pz(G+_j`1ghBBVXz2~|aO@1fTbFcTB z{21NcVeYg0`pUAePrp}dIc%lxuI3t@w?0PmrEK9O`tAqvVw={VbRS>`{06 zfxioo&nK;C%X=#my+S!-Tk}W4L;O!#5B4PW%}0AI+)aAs2YL|y)23JbH;Dg*%#YB5 zPx4*&Lufja{73T@y(q|=oAsxcPBA}DP0!r-QTjbaa*sRScOY*Ok4{^@Jiv4yUwj|q zsq33VE|mSEXop82&uy+p$4)WdPEzlD6yw9TdglkwFPup4-24Ac^?>IgB<)Z)cgZi+ zJO96su2a-I-+T_jJ*SvIJ8ZlQPgdWYdgiWo?)QlMen`KkT=o%LIcC=vbYIpF(=&hW z*F!(p81Wk{?d4^a<*TV?D~=QxuXjDtLPBsWr<$(cKY2nrSZ4- zUki>7Z*0d&INO|SvRyi&Ll~D6|J&)OOaAFE(X;LZC;qn6Gq0fEi5{;1ZPK5-cf0iJ zCPVop@x2b5_}fk|e6}C;_j1Y!=fmIqc!(Uw^4p{j-enSjoSzNl-eFgZl`@fuG9ZTxJg5d{RB|C8p2yLYL{@^+H?d-t|J!zm+(?$K3zDy&gE)SE)@l#>&s{ z9p7FLe2wwJ{#)O#ThfcP%>O#a_RrpC)_xSI8IA{S@Et<-b6CFaJ5Rm;WLe4NcNR|6cw}w1=P`50z=}jlr#-phZC?0UhyWH0|kvX}oH*~@>G%>H3$nT*+GaxTN2m>`J05bDpJUj7So z4*^!}Sw83>_VVrlKh?5Z z^c#A?i5_@AndRR-NM`wW50hE`-6Ld{e|M40^6wraUxf1QE|c5I6J(Zu_Y|4s-#txc z`FB^yEdTC0ndP78wX^&ay>^y=qSwyyPxRVZ{)t{Y%RkX;XZa_3?XCyD%J;MU6TNoV z17D{-%RkX;XM0cd+FAaIUOUS_(Q9Y%+;!(`Y zf1LGjf9_v(p49Sv&3M_*YyH3I?UCom_+GuO9_|4vwp0)I0NTsua$H7u$-3AQnf3c* z^>FWk`$TVP7v7()zpW$O|I_qv??5_ro%e}WURXy-^r#a3HkhkB(<=>n(9U>%S?a#a z@=4as&Hng7hA-WN>XXLZ81LJf&_6`8kSE<-^^&xwi@Om{5^kc`33GJ^JzU5Wsk?T( zpL(6@4tlsSPu+E)J$1ue-Mtv^HS^RRK99UwD+XxfE+91nVG9Q)2sD$ z`y=xv=jeN$ZSMi6{vjvF-7t?w5uS!)ddo>Tod{pL<5y`oTt7|Y+hg*W=nEqsMiGAv z=W=nMd`CFaL3_Mc?M+{o>uG6tkPqW-xL0?kr<=s5mEpjhrmt@04D&P`$dz*cAmT5> z(KE8~Iktj$&)})yyd`Vzdff8<3CsT$3nvNx&=~yp!Cdqvjdh*X^maYIhjMtogk$=; zqu?Z**dy3a-T#p#*pK3=`Ej$x)Ad1*EaJT~oW405|D(%R{&64UIi9-f%KAS# z5C2lWrl0HYJ-m+kBl)(d>7N0o@h&pnbSK@JWMS?Baj(yK2JcVYADV;vKA8J?WJ&#? z{;ldiK3Dw@VIG?LFVjEF<4J_4<@Sr&^vq)ZqW4v*-fTPxPQ#gCICLlPQ+?hfKM!NR zr0M9jbbwR;bIezm$K8mRmb>Zm_Q5`NzexA=H-vn9K*H7$Al?D{)cq9W2XjqFkGM7ku0nS( zS9hkbI|K97T_@s0b9JYZW;_G))ZG-rgSom>i8!8tdFrlAcQ99X`^_EFow}Q#JD96G z)8CzO|FBQoC;GcI_wj<~-p2*_bN$`8Fk<0HHONUxzgio^dugxlRej!g2Ih&oV@1Xf z=IZWNO9#wTcl~q+bA7+*`4(WFxT_8Gy)f7Co^Ij6JaKnykm12x-CbqwV4k|`r8}4( zf4w-8pT1x9eB%P_6Zf@g)LWV#e+}JBzodGH9^rNz*^u34c4-{wL8-MfIYYN0qWYkN>QA zlAo-z8*4u3Pude$Gf#d=z8>m=|7yFHXR2qLC%c|)2if&(JIStR+eN~ zEtY?&o-Nvi-=8GkHR%40?w&kG&XHZu7W2q3a6Q{Kn^%T`>)EcD`V86%bThGE#lLQ{3p6=`#{kxv-65YF=F62Ww|Bdy9db+c# z^anlNumJsBnGZ9)c!mM>b!#hdU!cBjZ2|Et9AG}p^S#j5mG76}ao5{jhW~(iyR~`x zcfH*?`lsIR4(jdJmiS)R+r{`P-~ZX}U4M6-`HN?&zq`oyy8dpN?(hr)=t;wvo^EHEu$LJ2vFmQd|C7R82*-f4z&g!wehaDItA$Z+sX^?Mg-j%TXhJH_x^zjun^xqk03{oxq~uID>Vb39W$ z-wB52dcG43&-Hxkte>vuTW2_UhJow(mKl!g`IZ?D^?a+-3i3Q?JlF3X zVR)|JJB)a_e(!82+;_Wv?=bzle(x~-Q@{5}JM2fP-#ZF+Jrmi-$N0E@?;yi-{oX-_ zNB!Q)AmX#b^?N6nPk5&Kz5NWw^?Lgm4)uBux59pidc8wnxij8WFU8emo>yzsNd%xp)z`eA0J>W6&U(tV&?0Ufcp2S_8+19UdkN{#$li9|9U(8Fx`3k{t(=CyWX$&L$3F`!1uY{ z?-bwXdcSqr&of-_=Uwl2k@l|lJ3;@h_q#;<_tF0x+4X)`$?v6ok^Wupca8RQv|lH? z-fx-iUGKMt?0Ua0ce&oL%Wbar+e`PZ_q)vSx6}KD92^F&_Y3(t45;^etOxzr%wfd$ zNEdkY5aW+|NEo=@ug^QE_sjci!k|j`JuL4E+51=5`}KbNJ+$|6;Wx-W&bZ!h5%CFJ z?{|#sdcS3|>-|oUry1T9+4X*>$*%WXA-mpho%{~^pCh~8?>zZl+Aok@?{|?rMf)Z4 ze@;!9lLB5;Z zNp`*8F0$+W_K*+IeJ{C8_VLv9etn#N3+-JFcr)4M3fKEBGCbG&9V5HmZ<*|RzZ2v! zhBrlaz29lF>-|>9uJ>Cfzn=c*$gcN0Prifp3uM>(T_hK2zeIMu-(|Av{jQK*?{}5# zdcSLA*ZW;3yWVe(?ceo&TgW4Pe=FJbe%r~e_nRlbhVDDauO@erUGKMx?0UaFXYQTV^{X(T-fukz_mihd@3*R}OtSw_Ub2w3R~91mRYx1IK`_d85`*Za-W-t~SfwEyG}G~eW$JhJQk z*2%8-JIwNSz28By>;3kUUGH~{{4s`KB)i^kKY2U7-!knN=zoOldcSjw--l^GPyP^j zjO=>9OJvvkT_n5S?=so-epku!3~z<(dcSLA*ZW;z{9NyMf%dNV+fR1A-+8)!FT-D_ zz3ctD{4_`V4wj$m{Z7!o>-|>9uJ_wX_pbLlMSIu#T_FD!!=K{&UGKL}d)ND&CcED6 zBH8tRC+OexewS!}h~dwXUGI05?0UaN`ggtGHQHA^f5@))Tc-Q>(7uQK8)TQKT<_QA zDcAe$rF+-=U1s>(>HWGq<$Av^PeJcDoPoY?IO=-7E|?>kI(ecutX>-!eTuJ1cWp5*(>WY_ndAiKWr6xsECr^&AGTOqr?Z=HNM!=EF& zzVAHQ^?et}uJ5}@F4O-K+4X&w$#0?k3i-|CRkG{*u902ecb)9|zB!JkuJ7AIc75Mg zvg`Y{lU?68Pj-FZ4zla}c9LD+w~KrS-+YTUEg<*?E1dLWY_l{A-leB zk?i`uW8_i3zf5+0-wCqo`%aNv-*=kq`o0yi>-*NpuV(mjWY_ndC%eAy0@?L_7s-*}ijIH&3N2MfOKXb!=O8M@))qOUH z&iRjZpUoQ|E#I$m*zcOvuT}jk-50sP;ohI8Nj|m9ci5%Oy+7@;&txsbnqT^b((~=d z;Xa#tB;MKkY<3C9!J5g@n$EL+#QSXS{2TplJ%V-8jjQysGzIe0l4wC$LeQ~KjU_4K#FMhNi z`TY70^N?+qC#x_1f#xmr#Y=e$Z}Yy`hp8`K>O^=at1o^J-;eF?xkSJ8g!Wi0p5dYJr7fpTfQ@y8s2=kcD_q9Jl`r?yC=nL~cn@#%SULQ|ezMLj~ao*$oW2-M- zLcefAeR0YUjr!u->xut2l-H@ALokE>YV$b+kC49jIL0-4%{& ze$Nkn@X+yN)@*a<$Udzt^~JegUFCqciu-t`XH9*G-nWetoAt%>H2;sUFa9Q3w>xe6 z;vw@{_SK2l`Ha;o2h_3z|dZhm)#dY#C}_#V3by?yKSFE5r~ zTtL4QCE=~YJ_&CHe31P!@7;@TH1Bp!kcz~<-tGIsmGu|trfK=bSKv8t<{7rn)aM!g zj9L+&NcOMlPvyxU7H-@(Z~J@Vyg8Tp=jY~p6aD>tU1kwo!+hoY&yjhMg)8!_KHKEH z9sTJ(fBnTf=CE(*Jnv_@pKmwqneKsRf8Q7JzH1r(o8j&phW~(|y+_>ZPg#HQDE2MN zeNae;D&NRY?~hlP&AI;<;a-P$M4frH&Xul5Ih4Ad2!3k8o?&;v=KbO16Y(7FuxGp@ zkLOT3o_(!&7FzHOa`uc4@;$B0uahi?2;Op=%i&KDf0u9fSv2kYiKb8YZR^wb1uN?> zW_=kDeG=pY&ZCL$&6|C+i}8c{Y3{`3$$eLsoA+G22hX(peh=}y;uOno68pE}QSASV zH3A#`4zBk6i#BjC>+H)k(@t)avJKzv#*Ec)`e$xr#(vt z7c61X5!5Ho*XG<1%nugvtf4($vh#VyzQ3s1w7=xMuBsVZISv0{>-Cbi$UMybiGHJ{ zQ}6H6Up&5G9FH%;TnbUUf{^F&tG~Ru<9Yl#&#q+FA^cqaY&_<5{0zFRABx92_-wal z_Iw=eUp2f#f6vL7yhr<&TOPIbdWnw9>i*%bm;By$vg;*Cuk4>jxmTGF0na6?BA?`( zAKGIbQqK3a@{@CxS*|(S7s)M2K86?SdI;vVnvYMH^z9Go=1%#iEMF_enyzCE28uRV=0odz!*eQQ%K0aAKB4^z#Xnxb3+JE9NMNZG;zpm?L?LRK|(HQ!bwiXOr z(Hq30{F-x*x92%hzWP3mm)7%vmdBZSsfzt3ZB4JT^3Rt0eexdfm%{@0rQEBbY&^#= zC+QSD#x*sUd5Jx<;dH8fz;ke_>?ecVCU?uSrEtQCyM zHSU}D{_Tv9S^S%G$hgwJ4hyHPX$AFbpP`g5@+mH$yf&3*BKNSo6S)WVA)BtP%2(rg zpOi;)?o&xS)gbl<6UJHp6)A`8d0nc4jSH*By3W0!Uo9YCvh_;S6Bm}veH<+EiGC{UPW#{ECFG~Z^Jt6qr%h(ioEtEI zaxOgES)T0i_5RQMJMaH0eBZkHi>h^Uj{fJ!E%wxWIMC4lNfKpTnd5smm)EM+uNvZ= z?Z@8#*V>P9pGa-h>Q{5_ZcC89M^C!gAKY#4&6b~)*HMNi<>uu$!E*9)oFaQUPLtDeyyq0ladDe+ ze6y9~68ncmd&WZ4(81s{87V=?Kshj!08QN-f+(9_0e}-$dQ2K3oTDa2Q^f%B%e@*n4 z*wf!`xJ&$Th)ewKZt!z=5YbzWIXEQCdS8jlH=li7L2W{EXtq9-$9o7>bi23EU8j? zEZeWyx&p^h?VoRub7D$I(I2**GidE#UzPhtYM3AF=XuHds@Na0pYl_5gyUcx^3L&H z>3ek~&AzuT@z8u)7IS^?`I1jAmub1kzisDv>QC$UruLGw6ZI|cV?B;^gvmkAEEZm_I$#6jp+YpJNAC-l-n`(#Wd$W&2neGtf5{;v#bY~OU094 z%>GQrTkH2(Zyxdb@SpwthVk!&?c%ie_t&t$|5enJgHw1W>l|7eq#u%cp-r+mhjYQA zgVSc7&P%@w`R8DT<~}c7H*=TcqI>JGPv)gqZ)|J2+TxMzrz_IGsT}@04eJpvIdcm+ zKUqJa+&o^i@btYp^2@&FBp!L;I9N5-`RoQcKUgvIY&=ZP50=f`*Ja}IdAQ4re>xs& zc#ZLWqU?`J<$c#{Lj2P8j?*vimw$+ysQJ<_`S5VpKeG9=zKwjj`+w>@A;cm!vjey-MYZ*w=|qdw)ayr9F^4Qu!0yoU346vcsa2JI?j&=$Bz1 zmH0dl_UZaWKjfC=J5Mhe?&AXG8v0A_;V5DJ+x*=K?K55PK>PH0hn#PZ@RRTcjZ39T zi`W3?8Ku&Mak`#-n{ia?!m|c{m+X9waoW!!g4;w#`ylSoTI+g{yVLA+J8RW_2kb#m|agsdZnDLpO$+vkPks88Tll7 zC*;O?dELxqeUA2XMA+9;HJ!x`>&tV9-+0}g z*>dk_n6K!(LFWti{6E^icAERB)?v@)+_@66n3sC=A^Y=CPxtP8AJS3krTK`t_w{5= zkN%=NbX1V%A=Ll9SNyK|8))MEp;U(b9b@)P*NtCi9Cu^AIUda+9VIh1Ilfc=^!7$oK4i4XwA0^RMjrf*L=~*H_6m&8)jF z^>+~IQ2X!y`Ns9-!3O(pi+%L=cJt8oD6TL6l6aI~b53i8^s~OcEc-~b-VZzq3n$t5 zHqNgt{)|UKX8OZM{;`K=O<5(Bpx*y-FyjrwgXXJkG zk3aKQ(*7FO1DkVuEuZCHcl1v+_EWQ{=kW>V-_5y~ntxyK(eL{DOV)LsRyGzn8|8RV z3S54%uj?Ezl=|Fne?+B0JQKMC6<+I?hMdgrO2c$FY~k+R$@yJrgythOU$=7d{ye&) z2>WFG@cA9a;l_Hq)%mauD4nq_`bbh z@lk%b@<;nN_5Dt(?|G!R)^5)eeLuM0YKPR{8}LWtKCs(lxYP-z&QzNKZt!2%6WOOjEgou+5CMF z-}SToLMP52H}@j#P-0D+c23h@-IZ4ltA|IE(m64CRPcqt# z_YO35*dNhuJbj;??>~$7L7tHP7P4zY`ni4VX9DPfM(l57U4`}t*U$57&N2Kd@;469 zucY^14YJ*!T;iagT()vf=4;gnau4mN$i2o|o;6$dK>wuYQfdzuj#91}U9$4X_Crf@ zpk=l^mgGCWmcvC>zn74n+Oj?4ZT4$4=RVS6`NDBNl@FL-$-I>LmBddh`<=C)0P9Eb zDBI8IinXI`d1?F6cF`E$56buCRGxUJ)e~9IW;=i6>L2EXtbY6Ra4>5mG zkD~L&tQ=%MVE*^+{D9eOeDxRA=tNoM3K6(TC;kL6muN)H# z`889YQTHo#3hVq*n(;#eXIu8?q9ZIX_Ty0<`909|eDm+~p3=en#%)a{dp76ZZO_ty z4w`=h^@QUy&eg3f; z|2Ono4{@A(S7c|12Mx)-I^=6pX!$DR3G(aMn3*@{{)_bh zI_^AGygrCRjKn$1s}KOHsa zIlUh>FXKseUFq5%%O z{gZr8XE|&h$EUVQ$1hqsrkRc@rsD#P3kOio+M2rUkK=CuYkgA5V?Xr*PNja{@*kvr zUTO7H5-PvuT+_cRzj>Z@c<<)A@ z!?pS>dL(4ZtJPuh=6Y`Z5!ZFJp62B}vi@Q2v+>jPdc0*nzKuVx3)o*u?bm$rbNI6U z%3GyN(xdJ*J-17G;_>{Zep~x#nLllchmOO(4i(KpPPj_KyG+89c^<~oT>|nucQ>A% z9?`4b6rPo14eoS4qxr7!`irC4@*Fk?I)C$@yfWwVny+K){@{wl+vTIH&xZ$JUl@?R zk^1v>DOH!Lyw!|sox$(*xJ}}*uH%$;8uHWkS_dP4>wB+m2Wfdp5VpT^Se_d1|GJj0 zkEL?L2>Yqq#nl$)njA1=saKfq#D4xl74^sUdc1ze5G(CoB~4L0gZ@_IBcITu{;)ru zL_Zx>xo?K+1-|cI>J#g$w+pYYD5tIDb*-AKRMrb|J|Z$tJPNY5r@J zo9*@<$$zHz+kY@BUFuqyOsJ$PPP!qeNC>g}q_tM|aY>+!07r~Z!bv`5a{ z)u#5e^I~)0?I|lC?pjORQ*^Au@=^4qt)J0*uq5fSE`fCjspn=s(Ddt?l3e^w)~71m z#}}YJ>3h^)c!9doeA_8CL-QBq?B&+h@-Ozj#(Zvj6g+10QM|VtzfVJvd^q?S^QYyy z{cm1_Rdzdb$~Q;$sD zPyg5QSJXVZuH$z3?rrX~@zn9Fv470Y*W$~NA zIa&ivXb5S(puD|&y*!&asz=ohi;vffsG29EKFB&a8R?hr^JJu3-;>vPaNN!25AqZ3 zB5VFBT_3J#tffv$XQcHzJAPa*?XpzG{Q^D?l&ZLYK+4VXrBwZlmA8}^8TS{+`4eQ^ zZy@`{$hiMN_9Kw7k67;CAXDB5rpdTpLGq1^`xhkt$heXnn}?LD|4d#Xe~r9IM*EfWGL8;tsM1~%{aMuG z^t%M>XR2WBK~kT|xbH{C4e|v2+!G_^L7w9Kr^vVmP1*w)_oPX_lW~ul^ebfCvla(qWZc6h?SqVa z+N6DuaUYtr5ArnMKS;*?WYRv!xMxhxbs*#3Fu#|sRDC!7chMgAeaU(^8TWU|epWK> z<&yFxSLnZ;jC-@>dn_6EVo7Nlph)QKS_C!>-1kI zA0t=DzeS!V<9;ORzsR`XNXm=+yL4YBJWR%YeKHP^aj&10 z5BYs`-%I`@at|5z;mNuh_!#cBi)UKF^?A6TYyltr0C+qHK7xDWtAHw}@ao-Af7WcBry~W_#akwum8H=0<4qB|=lKChZ>#0!{@`{eIFxHO3!0&@;A^UwW79u}6y$`0JTw!>FWWNt)nC$n# zjFA04m?HVz^gl-S`(VmszYk`D?DxS;k*Dc@n(X(%RLFiGOr7la!OWBWK9~hE&)wiU zTNwC#Fsrop`(W0{Q}+I_fO}xVZruM8_Tk=_a0vIkggbE0OE`-AUBYqP>k>{*!2irI zGaYFEVc_?;pnnL1duWgTBMj~)qkjnlzsCjrPZ;<;F2k&6eviutxlI4)-@?G}aT%k% z-{Vpy`#mlb8 zw@&tZTrfU`f#2hT@k{QdrF)ETVc_?;VEhXMzsCjRV;J~7E*L+(y3!Pr5$RP9C)NgQ%J(50g8{BjiqUp4>(5Aoq|v$-U$*N8~Lowi z@0^`^9Em=65$Mbo!SM!bIIrhz~`Nr|Qp19vQo>%x@$UV|8k|7s`L2^HZ z$wgt1+)qJ%6Wv4ZlKZL2kjv!$YI2VKRB}HBd5re0WWS%Hi|qGP^pO32ie9qcPti~I z`zZ#=em})9+3%+qAs6}nBH8b!7$f`r6lJpCPccFE`zfZ#em})D+3%;Qko|s&IvM+i zMBjnz_fss8{eFrivfod!O!oUJ*2sQ8#X8yVr)XtA;`dXull?n*p6vHibdddiicYfM zPtiqwIrFcF?DtdjlKp;)ezM~Q86jNmX&Oc9nA=6VKzkpmPKc75Deja(5{9N(^xsSX^ehztwjC}*LE=vAc+OLqG zOrKhtdEc}9?SgISjQLt>H5BZpZ4!$+3(ajSvOC< zPuq-C+#g-C_zZ}Sq5hKZ)Ed~E%xL3xxyxau@7?fy`g{cFa*VxSjC7s-fv^6M?@_xE zp8CW68WR|&yD{D;asWRqDC>7LUsunrZ#RC|*L84x|7Z5dIzQzF|L*Jgaw*eu<(X&a zE|qYz;i-RJAJ2=qeJ}U}-5-GXc{tH5;_2Vd&b>k$%P+dW-JZ$48uv>?WgJ!MkyJ|XK_-#qY zu|a(It@Yb;;Ees>(|nC;_^uJ{V*Fi?oZrbsKC<%h^LRymB8zAFiF^gF%vrsP9))!J z`B|DSjgRk}^?eeN8pRo9>}}4AZb3dqcfq}f=if1saJBx*FYdt8_mOWpFZv9m zGdeSG4ohdjL#Y`NDdl)h?~Xo8S2*+>Jo|d>8F%;KSztS!Wc!`zfVrOwyKmUSkNg}n zTltYTB=OXwyZpQD{RY>W_nfvE!(tc4%>`F8tZf1>c>A@o1-^^M_u8sVMK{CI5M z9F*FaAFa%f^OzsOxVaB^M0gI3*)#4d;@Lfd=jgCK<@=)52mf9b7y4mdSw=lMi}mD2 zrsE9e3-hP3T$B33_Li0_^gW_8*xm~0f1}GzE?ilcL_8-K5wAM@dp%0u^E-(DN!K5o zV;c?~Gk;-U-JWrG1<%4Xo|9Adl>K9fM_~fy{O%i#F`w=_$@Gjee@k$`IUV=meQ#j9 zdeupWJA-jAegfR5`SNyzcL(cHm^TNd*Rvko$$C`ucJ&>bSA|30#PZ|;Sw{c(mIL_T_p*QP!Sew9 zOT5MVL%ttt;EWrZq^Zcc7ieF}zM=!DC&@WAJf}I@*AUJH;HZZ3O#D+HDDlsIEKvpZ z(%WBRkLr`|ioXBI*H4H}z(aQC5aB`m7H4G=Q2k+zi_7_@g zooL^ANbmmO(Z;3viaq7~g+2XyespZjI2#Ys^Qfiq&~veLJY5zet&e{#nuorB?l!G| zVlL-Me^=|>zAE0gKX|HzyRVA)><>COy{Az=)AwfI^GSJ+oHLI4e%_o#C^_%qY>o%= zQi;N*`vWu_&A)+$a|WWL2rqsb!i!2B7OtP;8kL5@=h-6{ar}!pensb_V#nPa$9Udg z+&zeXj{ba|ZBxF^B3vDpZNG)c#8a$SUGY3tDoys+Jk;yzK`2`OM5ULh#YCOxb5kDS@8LKi`KG_P zZwc{z4R}B*2-5#Sr2j0Y|JkrVQGDV8`YE}O1L3~9G2GurxMwpS=j6>nsRi*YozW;K zc4HhX+<@m~7sjt~uBVQ2owbkauS4x-AJv#H>gmhAO^Z)h*g<>bPgr;q8SxGaEeO9m zhbQ+>%YG-MC;1MFepvQBSiAIni?Z)wQ#;K|JIaou)<4WLKhMN|X_ecx{j1!nPwglE zUfulpn|ER|N-zGi}Hy$T?f5`D}Uk&}_{#{y&CI4#ZNB8fNjFn%^ zb5VSsyPt2T{i5b?ww$zo&Gx5x=}((;AGdJ!)o?D&{=&P_Z`H1~XIyv(`AOtoAzwkp zdFcDM*msz3(5om*25UXI_%E~{&!Zo&b>KORa&0^}Cfsk)6Za=qKTcR492b-F-i7d! z^58g}+Ot0Jd&rMmAGUq}J1iou|JnHd=G+wQ5C4dA+#$64L=M@<`Y-jx>c7izdyp@Q z{6@Jaa=ES2Ah&HN2T8d4OTt0-EA1WqR}zn=hIstD$$jV_qHWTj#CN;&?rumg*QExU zo{oCHyCI#F7n*ZVgZ-`v3qa;~#+U5W-c$Nf$w$q~=GZA}M^ zHC<}6Kfw2mY<()~ci^Mu%=BS;lNRf8U2M`SfFKIV*OIOT$nKU0QeY`JAIWKRLeU(U`@Wyj!n7*n-$NFPSANQffqmXyx9s={< zm_A+4Z#;+Q%iq;@^Jt`Rmf=dIL_PgSI?w6Z|HSol>0kVOIoZF;evSDMU_CLaq8`Y8 zRoWMkPu%w|dXZ$#&yw>}vHqy}hI4JOj;3t&p6l4k&yb|;=Q_6XrNX|Bt@-k28_qlB zdi*HX^Ct$$ST8HJYp%fGLHi;Z?J_Qm zk$2F(Onwx3f{gxK@{f$KcapzkbVPBXLdF7t+@D3}e55c(*4|0eGf&o5rMy6vhGV=4 zMs`TMS_1DudCPZC&;>V42MF4{$C(X%EXks93!(?P2)`bu!C8m?N|NgLyK`KfpL$+Qae> zFn*Wzu>6B1x@Y+Z%Vd^+utH|}^IW?U=UBQvRLBa-OX@@bA^BzR9YUSE_HaLiYN*3{LA4xHPd%cvv4v z!^_$D=kqZ6zSwZ;>Q`dCjp~EQ*U6>C-9|mjiPU_9o@F^P->7E^`9a^eQO~ky?z8Dq zd8%=I&+1vKe5>m(+A_3!5B;5v@ADRp^mC|p$#@UBQ_fMMJ=O(Nc?a@Zs_y`~FV%;D z-0OOcvi{8Q(SGDRD;f1)^h?O7{~}M3QU68%hm86!`ak3@Yp-GOhvXjed&#}zKOpy$ z=g5O(*H0KGyMDq5+4U2OP`=!(IrOVu><4Y&m$CnPWho1+RD)z=x-7iymXWjzx?`ZLL2shm~b1ud~ zKkwvius`v>8RT!=)fiqg!aM1GGuVe5?!f-zaA?HR8}|+4**%EoWIytu%J*^{miYzD zOZkVDKk+E)>Gt{a6@-7v`-)IMH}5O@9Kt*4{K3A}a0m9QhC|clKkl2tvm4`kJX%J$ zRlYYEgM9(xc2uJLcG~t^E#iI2_h7Ww=&2`Lf6)Hp(Lrlh@#L^Qqr)iQ=m^5woPQtS zdoh2B9-FrpZoe<ba=go0Si3-S8mdt@7YI{%Pa>qnydVJ!|Sh&U<7z^cu%AT{NeB zA9TWeyo2V5hwKA3&dRB}?j-&2CUdL@Zr;zNa;x;?o7_`A-(+6V^`Tj$OZ&~dru#71 z=PA*l5lfGzd+KYlpQ%maBtP|+ zgx3j9-gjn0dOG>O3i_4k;rhP`?@8W!ZNqzSYIyIpeD5~-n8f$i27lLq2jpG^ozfn! z^SxrM^>$PHIRJZ|S7}Am`gHSyx}G|QdbA7nvX8;qZMrXcl`J0QC+i+$v|E{H8Xw;W z|HtpbQ{U4nJ)gd(OW(tGx&Hz+)%O-nj*9r+8TK`(w{dn>S`4aLl`C{@Q`ElfaazO4S`}$uO*~=aC z!qV;w=^pd6(r#b>gFIi_jRh3ZGqCiOcKiAt=0&C5=hHvtDW%=M{x?SVzW&$4_j^6W zytuSGS^uN^Wc`nvtpAad^*?g5{zp#M|H#Su9~t#g+5tIP|05^se~fRk{zp#M|H#r% zv?Yai~2E+MlZ&=8QqF;G8(|R7?twou5?j{J=-3I`W4|J_g{Pcf*cVg z@&e?E=pbI?>st}!0{{LJ)sdb{4j>=3AJ803?ls~%QdD2Jc<*iJy+&2$QyuTw+m3$C z=WEds=4&1C+B@=1>-RL>8va1jpIdsOH}>GkbJn6`jL$*T6OT_@)2@x~jvyZ|*@yb; z?)=U-X7No<~t{_Pzn*h3->SC&{`ilAn9wm^shg#(ZmQ8G`>N zFZV}T_)(L$^Cq&F`?pd5`2INfI_jUW8p*x@V`)!c*MK+6b9pltc@@v@7CeV?_LT3S z){dpWT2ucb*ORBo=(psYAu{?k`L0ezzbD_<$>ZRCdqLy4xC;Ai#>KX#OOWsAzGWPKobmCe zAz{ZMF6JWcrz#!zs9Cf%>5M?~p@4Pv=%sAm{cP9Ceh93~N6CJOCCm$ML3@^SqKr#> z@*149mpSsKr2}k8fBXF70u- zd64!lH&2mWZXPDP+>CXM(jJ$ai?F{La&!8&%!pTqiSF+2?y=0e{Tgfgjx0797 z&XZkU?jXCo+(~wMxrOZGHuNJ(d(gp2zx8d6SNgpi`(#UdTwcch+tMDFm+K7AG8nHtW|BvF6A`h)5mnf*r<-~U8!!t6C4j#xk3lJv`3lJdRI?0r6)&F}Sw{h3Afr&nly zTEq7=(Z{fI_x<`VXZyV{y6@oCn!d}~9=o}o=J&96Bi+&Ethe1rcXXNNik1i0$Ib(% zdQRxSQ#~ih2@(5opTGM)4Nu?ZeamQ1z8^2D;r+?|tK63t)ez6UI~)4r8sjmGbnU$y z^OUxxD=or)E@@iNQSK4%_wx9q`$#HQj_JOSX)^PN`=H#PoX-gRw=sWr%v-yRhoEO8 z>*vO8XTAgR;dj*1dAq=O_27B;pglL;yX5y#7dFdlBibGhnK!$4X+k-(o~rdr$KU(D zr0b|f#IrhLPrY|S?VEFNu>iDwUMGLa{p}d9s%C8aL9Lx<+P%t4*>?X?(T`RC@=w}1 z+C|##yV|S+|D4F* z?C-|eKTBak{$~FyoR=txJYoIoX8D`_bCvNH_trlL?4QTkKaX$SKWli6`-q3FyfFS| zzZ+C2uRmP*`$J#K%HNNCzmI*yTlf3gPM#xKCh~bQPF!XAjQ&*frTt4>BsTLgj2GiY zduGRr)osR$S6IDSvvI=rZTP*#G3C)j?mkeo0*q?t*S77i4~)^>l-0wezdlf=Ir_~_ z{q;3gW)6G^Bv+1#M`(ATy{aE?8b^eL^)7JDFvxp}L(cg~F;W>_TpyZqt z$OGI5EbALKo@eD33qRA&w7&X&eO=F&the{hEN`6OYWuqV-eJ7omszrxks|!i;Q!RWZWjBex~Q4Tze9_Jp(`OajV zdn9r>8Rs6!{x&ksJ(6`^GR{4cbzm~ugRB#ian7Brdy#R@o$Mze3Q96pnIJARjT5gyY#$poO37h z0KBh`bM8tBYp8C z&dZC(aZaA-r#z?$@^jKeU)SO%`f7Zl+~ocOGRj%*J0PQ8$o<)5)T5}{OYY}$n9mVD zi+qmpS>|(s&nZ4DeAfA#wrASzaGqbs(QP_ zd2FSsw>zBwC+Ebo9^w4IQq|jC&hocZ^>&Bz+DcV#cdfMdcGph!c9$o6yXzn)?T+m2 zu8ZvLu7~XHu9xiXuAl7fZjkKlZkX)tZiMXZu1NNFH%8`omz-1Y?QVkh-tMNz-tMN! z-tH=7v^(iH$!LEf*MN_r9X7T*pHFGOtRtAVoA?`2pX-CDFK^3h_0F}O`DA-${ZB|c zi|)ew!P}+J!=qj1JbQ0~wbOL|fpIL|caCs?p_%Qek>`!vOlAVWWKNa_3-OBfe$UT;8`r>T9^h&;D{n>bY82O>|1Q{|d zpTGMB9rt^!Uuu*4QgmF5YW?h|zL>;YeJ1f{|CfEAj@ylLb+$bBXn7v!(qNMF@X~o9 z=ACJ|K+aF|8}op)Trf}2{M3>cxxnI?jgQWwWPDEIpEq}C?^$;`|B`V!ao23_&@NOy z+_>KzHhE9JyI4Q2?l$gsha6(&8}_?H9#->>``s}=Q1gxZ-6>a9B~tR!Rm?`Y zO6xczYrapaO8G75F?mVO&!c@88TDS|1@M7Rd%x#@T5cn- zPujsS8SODH43f>etatQ-?~;hgZ~JyS(GYIAA>1)=(!Pqu*>Y{nC#|2FAD91DR?aP0 zJmk9w#?R9z*FN*FH?~LAGnBv9+q}HFQJ%e>=k&<=%2uy_6uI^(^8V-m`lGfctoLp% zKh)E7oeA-as9zKJp~h02 zm~unfZZIA+ws-#?nKf^m|7knS&Obl-Kee6YwHnF&VRI&LY;kYcmi4hYhwmBQKGJ^i z^tLM*pX~jadjGE)-?ZLW$X@TK$zJcL$X@R!$SyCJ$u2LCkzHOcl3iXNA-lXhOm=yB zknHuopX~L%m+bYvhwSyfi|qBjlbqChve)}O+3S5f+3S5P+3S4^+3S6d?Dc;Ao5)|U z_e*52_iJRY_lsn&_p4;D_X}jN_bX(t_w!`0_sif%u-?B;>pkz!Q+e>y(k^@*KT6KM zTC(<__WG0WM;0&9n}=Lp<9x2h`CV-h>tKiK)^4N26?+bxfdJBQmdstLhWUW#CtG-> z8q;5>pr5WWe+tuN=3ilo%=|4(keUC5GMVL57$dX%3Pm!@w=hCx`4@)CtRICzGV4#F zpUnDI=q0oM6?(|5pM@?m>u;fx%=%sEAhZ4#@?^G;LOYr5r_f4f`zo}M+5QSSGTUci z9rc^vbL8GsGTV1ymCW{ESRu22C@hoNe-xI;>|Y9tWcELW1v1ys3iD*HvlZryWnIPO zHi-}9Iqo0!`?=-23hh^D-$|yNQiHrI`tY>xq5YgawV&4=G)cXlT}FKtvtP>Acb=cA z_4C23d2JQ$0kihrI9O8{UWS z%rc)tJE}nrPV}K`y-eS{J!PIoULX&W7s%3H@|nir&>494HQ`yv*;C8y3meL< z3+XN(pVZ#wzXg~_hvu#PqRO1d;U+T1yRg80>@|$XVWAK9hu4uWLpXO);}u)H z5RWuo{frmPH6QGIPXXqMyV@Y!(OlhqQtM{{=Bc}3x`Vm8yH(#?fO+a}gzjLj?%r?V z!8~Fw`}3TJat#5JD97xr(1Y1Pu)$>9n96;T^1h9Q+HEz z2XoD5-7yn)!#r^}I}LX<*YM=?nB*VK6L+-=!-KhoSCsJ5_Bvi>}W2dDn$=^y5D zE_dSo9&w+9*rzcXfou-FnAuh z#oA36`~(^DW*9u*-P8Ut#*9h$|qZ#9ztsGN-TP?|`6CQoMP8!&edHY6C+AHR(fbLgh2zik>}`tmvP8*dee2-X~;L#PR9Fo`WvCY z0y)q8!!x~?ZAqc!t3pG|$uB zQ^~`0hi4dsG;gQ7YsrIjhi4ePp60D|cO7|x?(htQJ89lRch{5q=?>2@cmvIIboVsy zv9h@fXWnQW&w%ASsmViOa{fy%!^1O7&ShDnyBiQ*eH!6SMhI^bEZ=A8t{d)-j=|md zINXhcqv{IXJss{UQ*gHM(47j5nVL0?AxEm^(KlxrvchK*P4lN+OzBj{P zb&>Wz1D>6OefL`sPB&QA0qE|TaK~{wEWFiN*WGkHmHm`#XOt&-u8HiIMYsX(!Itj{ zm}dm52rtoRUm=gtewkb(FOfURQ{*l()`jJqP;!O#oEIhc-}cjfj`oA(c{1lkyx%vf za$dxHfWyKs+Inr+{a^6x`vp9Qejd*qufubE6wk@q?HL_q{TUyD`OIr!UhQZ8{2bZq z_iM<5w0||(+tYsX2<=}*u9NqXJIKT2F7hkMJ>*xATgZFKt>l-J+sQ8@=gC9lPBPZ* zr9E-{7^M9g`8M(*-M@tFgWOMkI(d-XO&%uS zKpr7?k&EP~k;ll_lgs4m$P?si$y4N~lBdbnkSpZf}$B{?K0l7%Nh&)DaCzr_=k|)R)kf+FPiPv?c^qMo}43hkRRfB*Gc{Xxr_XLau4}?$s^$C+Ep)>lMAIXE{FO!GKtK<>#m&ir(7s+GfFObXR&yy#}|3IE1|2=t{{5i6Z zgDcLQcRZ8z!RJ9gL-u*lPm_Hf^bE4kgPu2sb8PcdwBFak$#X;Iqa2xi>HWdc3y-zl>e!}co#_JG2CB`{bHj3Z~2nQX-tQ* z2JPoxWaUBIUt2?XnqJ*Mrtgoh(R(rwu6*yba8Ks`YTtjBmmoEqqcz=+x-pz+7V+G4 ze{}_NXw=+p5lZf{ZkB-Lm)v8``~Tt>b6>n}YBqa3H63|nzuz{PviQf{6R0>r*Z`~KlNIN9f0 z0UsE#_-%I%Z5!*I-)|W4UZ+w%4}W*{+cPdKo4k~qk9nOL=LXI>D@l*mFHM&|qgoI5 ztDb4|f#@RSdvqWC={bFx58K@v9q(AO_xbsS@eO=ma(^`Me>&;&GiR)wp731O8O%Ro zp2HfCLk^9{$I$LsKC+)3`EdZ{FXs$_si%|Z zl=E(~=L~AQ$hx=v+Xs+8>i$x3A5ZqIsfp+nTmFmwn{hnu=ljf?JS6+p>2Ag1DSB>X z#M{s3lyGS8=ldZ2qUUDrv-RKfE~qb_es|iechRAG5VMH4)`yCwt3mG~I)r*)=~DfR zLnx1^)@k)i^s?~0DGf)0c__XXoSYN5&3S*>`e^>Vo}KwSmOs&bXkW>>k~e^xbC55i z15@^*=!ANz({$IUr&^);c6zFH*f;2@wl)2>#V?!hx^G{{jmG=K{_Y>Mdht^>Zh3o; z$EPul{X6PgH^%q9|D4s2zXj#+Z*VRK?mKI-e$&S}KNmx}C?#<^^rHv0-q);HH|W)W z@I%sGYs0M9gX}+FhH`!)+#kOH&-6Ys1k~2_eiH}M`+?idVblTlO27Z&-)>d<(7O)b zcuC7M&BD*oYioI)akf7B`B~Eq=V#r&p+4mr>Qf8rQ!C6R-=t~F_b`0_)_lwhOTS|4 zNh-%|JU^>_(>jyNP14Vpc|4xubIrof=Hr^UGrgdO_>OF-Prr+Nsv>@V9*FE~LA-+z z%6CYY=oOPW?)!Zr$$3}(w8wZW_f{BdI^TAo))$N$X?@Bi_CF)}us^^$pxR$;`GR#h zO-FHqzCFGV#^WoS@~7BPpH_H(UhzXxpN@{9KGln?PfgZ=`MFP8FDmbO@DJsYn|}M> z{>0vv4?%9|u&QFWe0}B}hyFtCzx;Pc{_njlA3*y+H<*hqLp{^~f8s44)+FREf7#LA zy=T17+_kkxLgXjs+Ze~)OEwRSUc__Y`Y|p8~kD4tw|zrp;Px{N1R zF|H0$zi)C4Jb>{i9$Hyfccm-y`jGo<7Ri^AG5(dVd^~x9_Lq>czEHaIVlvhjN>@IP zjQ+oLWk4>||3%~payuF87o{tuQphhJ!g@&QN;GJ>Z-?&NXg@-JEP0rGK6#J~!8{&X zB0~U-hx*CL$9Slh%yX!QddNJ7YN(6MbEt+o$vlT@sDsRNsD|=not$a&YLI974*2tLG#6xp*uf2(eze;-<@Qhc;sBiJmGPv2x zdlmkhy}Z}RUf%0uFYlbmO{Hcp?-sI`cPrV;yPe$5_~gkKk~_#=-koGG?=G^JcMsXi zyO-?c-B0%N9wd8t50kyTN622@MY5Oo7}?9aO!o4gAbWXFk-fa9$zI+SvX^(A?BzX2 z_VS)5dwDOAy}TF6UfxUOq`b+N-BLeRz&9u5Pfp68oRmK~DSzuvN;fCvPfp68d=bmH zot%_EIVpc~QvT$m{K-lAlaul%C*@C0%AcH+KRGFXa#H@}r2NTA`ID3KCnx1kPRgI0 zls`Ese{xd(GO=xrfX{v}?>VO7{V4 z4mRgh`VhTa%9SdAJVkhaFl=eahOcs9cD_2Se200rb&OkO9Yg)=3q)`8dupSsKhe84 z7Wob4@^X_03zP?i^XjfZc~E$RJXoMSSkusC%}eY}9xPBE3@8rwxeFuTkU!Lpk<4c=SM6(DmQj?q0dko zP4|VLP1pZKzuo*vxqM&kW!;pFe3boYIODzh~M|)7ix%&Lb z-rv^r^JlAhX&3G@Y-@T0>tEIU$vHQ8@2+1X^E>pegJj6L(XO|Xkw4Ka-havNpR^9c z>znUuZ_eG0_muJ)on-wrqi1UMI$f9H`WWvu@bx{{PZj-bbFc5w9!>J=2O4g+U1&Ry z`fldxE^qFTzN|ZKKeAqG=~j1|06CAxSj%hUxd}`!?=_S8hs8tPZ9F%j-O9(zH=LV* zcBbYV&rLu(RP&AJCZN4$p+v1ezyHn zF0Z1#$vTqSHX;rv}16o!(Qa|D6M}euk`!?lv8?s0LsVxc|RH#m~Y+8 zuRhNw_iv*r6aEzcVAL;F*$pT18+%kwe+L(3E6rLI?R)VqURt?oDI z!OlYden2Ysvn6P6m(gL!=?{q6Mm<8v_i;DUx~Zu+{GO4G$1LU_njY2TllANd|Cq11xw?Bx)_<)X;fi?jW_^DjIC=k}yxF_C zu4}6vUy=`pFn@~s*1sj*r5@&(z7~6mUKn^s5znCt&5=J*jp>(oeKs3ztrPDptXa6F z+UL-&3d82VRQr4KAo(B2{p8P+5l*T01v27Ws(q1+^p$E~A|t;_HS}XrPc0s$+LvjM z@+j5*k<9sA?JH!?-)dha&oe&%M4lu6Gr3Ow8hM(GepSwgC1amcT$mtZA5>f@ld(@q z?wuxMAC=rwO~yVex%ZlkeOPjD9U1$yENR zD>-kbhW=LKL;rP#$NsB^{#w#Qd-Ug$UNZVuzh_+Z-|4@L_UNA_KgsC7{oZnIcdAF5 zw3}KN>-VCiPwk~?OZ$Pjd`~pFSoESPABzL|MYSIKgFE%NVC^2}NxQA}(jCmzo$8B9 ze9Sy`*H3paS9j1`gn8<2knUiv?rydC!aQ|1Om{F>cdA#JrhA0;cxr!km4uVn&lb&I z{XstwoQ6L}|EW9Z9l|_ySEf6dYk0B67v`zE3A%&1x_f#yKD8;tNBaN0>VF8F_&+=i z|1{TeLT7qOdJb3MUkpuuvk#p3KU9Z*nrr{6dXS0#L-X)2VXD4kyaSy0uPnen&Er0V zr{NT{@i?@|_wd<0Z2Z5udlUG`j{4rW2P2T@<^_2XmKzK`3_L{NkceOhq2%5tj{^}y z78!f&M&Qt9FbJ8Y+s7Ck9b!d&Sl)k6dQ&p$dfBh?-9aZ?wy&FO`)4hLA?nijP{G{Ad zFMrSFlk?)o9rEuhujhfqv_5-I-=n^)@bU`Ro!z7ZaVUj-N7J#Z1O zz@zXh;SziUJPyACuE5vBlW+o0!xQif9K%(39B#lbhv(qy;Cc9E@FILIyaY$^GJFlZ z0+-=cxCE~Sws~n>D=5FSGNbJOz}+yG^;emu(l7}j_p%KixMAsm@e_J=&rg#IJS{s3OVoy;h^!t+kteIH)M zoy;ivJ)Upi?z?aa{!ZX%=eK!Y<@vYZRrs6m3cL)fpNg{IF#GTwMA@&KfB0*#`oSps zRapIGl>G{=9Q;Xm9{vQp2Hy#)eej3jVdDJ|T!23a7vVX0Fs!#m+5PYkJPQxQby(}$QMLvbv9H3T z@a=F3eiy9u?I`upMeJ{d zm*89AW%y=z1-5g8tMD}Tqm;*=!Ts1DFs2=R4O|ND-To*3{wL4-@ORJ{e>cHJ-2WWz z#r+{;+`kr{#QmScIovmlaX$%HNSDkgyT*$7SArpe&BDgUnl)r0=s!qu=nc> ze%uqWzU$JjaecNB=3_2h@G#6gBRd2$&&UqK%rjWOZQf&|^^WHK2VJ;lo{{Z=nP(tJ z;PgThe=qjTGqQa!^9;^0M+1Kno<}=>Ds$u~GPnL1_cP?%k6^1OKa{)t4|s0%bOpBh z{(ZPeINyWqd;2ativ4%s0{m@w82%PK2Y(YDf|ubz_#1FP{B_vI8()KMyzy1o#v5OO zd+`5dI72)BC3pq^}pq!gs+d@S^!={IFp5 z@Tbi`{3+PR7oUW?2=5bc4}2$_gFg=U!t-z+dPKG^!9x53t*&A`?lz7@9q z^ewRU%eTRUw8yu?L+~x|FnlvyfcL^hcp4ss-wc=FH^JlZ8{rE426z&FJvqi1m6fR!>@u@V4X*F`wnmg`!)EL@H%`0yaB%g&d}do z4|l=|+yzg-J#Y-?;BmMYemUF+UkCTYFM|i+YvCa{f`{R2-~wERi*N}ZgV%fg&Xh-;5qpD@H~7Kya+!JUV?YS%kXpI75GYc6)wVS zf!#i17{4^fE$fVL7Ww}FHgM~{$a35LC)z(*58?TJk!yd_JkRRRArQ|R@mjb)3moEg z1E#CF7uVhE#`t6%_pGbherS5%lh$*cyfyB%@96Z7z+GX#u{qx9fo;5#gKfOi8#o$R zCEg|8{~Ne#z+Z>w;jh8d@K@m(_$zP~{xUoce+jO@OYkK8MYsrm0WQIxhezSh!3FrU z@G$%tcn-b`9)cI)L3jb~hd&M5_~=uxjgLMF+xX}ca1Z|PgfsL2QI=DcocpmT!L?a$KhAN75I91 z5>DW0cmke*W4H=S4%p3e;Fn`R2VV!z!!Lsu;cMX~ID(hqYv2`F=j@yPV+s2;>|YA6 z!!Ln1;1|Og+SeDso$%Fg7d!^{z%PVz@F?61zX0xopAYxLSHXku^WY(PH#`hK7cRh8 z!bP|UkHXJ^OYk4V2|o*-hDYET_?d7OF2D`=a(E8D44#K~!He*v@Dh9p zybM1BUV$%$S7DP=xAoT#n0w|!?>G1G`(T?Ny%+AHJ$Vn@1HT*2!H3~qxB>UUhv0tr zAUp^kfQR7y@F+YBkHdAi0@vV4xC&3hx5G2=yWj@=PIwM}2RskI9bSWVzN~r9|83Z3 zXisP0PWY{G7yK4D2j2$w!neYG@GbB#@!t#=;Jt7Wo`yFVM-0KXZZinmx=la4iu=C6 zUVg}aek;r5RgQPg)#Uo!K3J$ZU>d&_-Tz5aLpc(s!Lq%S9sjN5?>TBq{pY@4)?z|)AOye&XjM5stUHyD z>3P9SSNa}q8@YL&wWj$*Jgf2k6=(g8@*g=iC!ZL`*H@hNSK)c6Z!V^If2YRXvm3I% zXf4=xZ~4n$c4VI6lj-DkheCdJWL_&a`QjTxa+~jE`_Fc6*KaPnpF8gm!b_AbnO*5Q z*`F)FPWYUx^wdOK(N8l{2>z3u!!iekWKIn#+#30p?bq{spPrY8Lb^6Pcf8rT-?Uup zd~y07UsJeUu7bH=?CPEW9rqmZi1Is`Qa_ofI%gJCy;}0=E`@)>`7{;WM_XSfb7V4@ z$Jai=%p;FY38{7u`xw?1e>6;Jr4_r-s5k>3q^S!JV^GJ=!#%-l6bM zIG^qe?xU?bHx`Y|2Tpd*$sAC6-93#8m-Ex^UL)DlPRC^>C_aaLicT`0o+S6p@8U+q zce433rSVvNfO@}aKD}JwpKv~H4ef2T^>mpdoxx0YW@HYi{Ya+N&Nz9n(4Hg{YLDD~ zJfYm;y399xQQ`Ep^=DoFJrC%;tY3@wt9|wF`G;;DC_dC5+UvN{ClkG}-u|E8 z;_T}iDvxdMf&2M$ATHQnB*-Z{Js#LAo~FHc*A_K!@ix`>rakrlFy%`Ar}pQ{e>|)9 z&dK{J9y>RGK;L;>RXtAQ+1nP+xx{mETl#cdDU{Y8Z6=`w8eXtxFa(i z>|5)nug`v5+H>b5@$;{P;dNx1;;g$3y$;^WV=4-2QjUPj-AN&TnTnIqx(7Q9my1q@Bqy zK73lJH}SUlF!F1jr+a|8kMch||8}{1>}^brwj=ZWVDHoAr$qPUTx0)# zkb3+pp&qNF?#Mhmy!VOpD-S=``-M|yT zH%|Z0z0t4y{`c=+{mK(Vebsp1*I)ld*!e-9FYi2-UXU@h>#gPP&l9)itLX*#>yNna zwC#LxN9MY)+~(tR|G9Bf&i$Lo`1mrb48q)>emuP0KX-$S()kQ_9Q$$a+gjG)?u-7p zagy!mW_nV-67pl5_OnDkduhlIJNJ_eXk9y*>JRgm_+rgFQavV@XkHNyGq2g&BX`4^ z-;}#^E|>f|&1iUD?tUb!_1SXwBjDaJUN3i_2Wx$|+^z3A8R^6RVc3@lFAMi$uZe)u zD}ucmT&D*GJ_q-cxPK_D_49IfH$08~*|6qs!>?l!#ynrD@}O)r7g%gf!Smq7EXa<}Ov(DYZyjFTqy+LyGS)R{pDs?=e>XgSdYf;aA}-JO`)c4_o;+;B#<43a8}{Tlp7Z zEB{5<%6}fV@?V0j{AWnNm45+yEB^-eR{m?Sm45-Y@~^^H{u{8B|2k~tKMym`N%hWH z`LB~6D}T-Fn|f%pj$M9?mA}T}<;Ph0&k??re;4Iv<-aKV3#`1SVJmO#@02gF^49)N z`2s8N{taJHKtD|R4-CST|G*G@ zuF7{{818`!Fy%i`gem`lQJC@{D8ZEfz&K3#4^&{ve_#@({0F9C%70)6ru+x0Fy%kc zfGPihIhgVvn1?Cfj6O!*IF z)LvXf`E$Q&`69}HpbPu7{Kd-d4C(>gygnD6$D8UkU>!fzYry*W{ZwB?vUM`FYspsa zYxr^F{Z(JZ)4t@!zrVCT3f1qU_cK>Q``_HpT!yKSrjJ6OiyPN3%D$}nvJ3qgagF+M zhWs5J&xZV+W#8Gln03u$=bAW;XEm^$3r_}$|LS8*b{1r2hlAOaQ`EfA$t%fUwg>w; zI0w(ey|CWL>6L|-u3$m{)jc{UgPcXKbg=}Wff-raNk zdu03D+^Ju;=L=U7uKSF=9*Sf@_UZZH*@Du^bAR62w@AsrQ20*M_-DItr{~_?Uxo1W zyy;Hkf@DC?y}KU-cZ#R!E<<>F?%iD);??t}yFuLPx!*tadO4Dvdft4GKHTZKcjxtV zBs=xI>8=-ddhXpl)yKP2&ztU6!}})#dhXNb^>icydfs%mj5|H|?zV^b(DSCdp3t8< zJ&?h@clS8wF4e;_tMQUQAO1W3IqN;~ft>s?e)sk_9AV$1_hCHm?Z4;KIilxjK61aa z)6)^$dv{(RNHd-;(x-IT{K4l>!@GNct8nfY@6QBxKK)1N<1jrVu6sE`|HnbiTaq#S zIs2#h^jmlbHI8-nb*JIJ!rR;X&vsH?a_8gq`ox|4@H~CL*@D_(p8NMZ+?wtK8bAB} zgO|GSlL@7(>0jeMY`xb-0W;pYNqvzh8d$mlm zkLM#Qx2F41+{@mV_n>p1=KpL3d%5%Wzj1{99QJbO>%njN_(t@+8P7QGa6hJY%ZK-m zt?xJ6z@6OR;p*=#{yoR^ycu2F7`Z`P`&i- z{ZOiz4}&2-Uq5&Ia3;iQIEQAG9-e!5LBGd@p8I_9oQB8!p=o=C-W|KIJK0%Od~W#X z_s`S%UmsRHTMM#x_2USA9{Z>D+@wS5iOf~Dd*E5pFQyo^j)+IJi`Uze!kv%JtAp% zhx_$jE*}$TpNxppa1M+s9G?69c3IO*&w)Pqcl9ag{TLIc{tuSqpXUot@~Lp?aPGaH zk2Dm;?A5 zBb}_bCHu%f^cK7O3>5Ax^(0>k;U^QTdS2J}5ZA}UbGJUL_+1)(kCUde+J}49!?>>c z7Sk@qhxDDqvsJk}I4ASKJpLAC9xep)a#x;SZ)LKtH?S{X|4a5Mo;2RWL-LoNw=(@5 znm@UFg&EIj{^af>hBbe3_ZY*O@LulzW4IH(2JV8(a1UI9Cqp`HAJOS43-dE~4>9(d z|3z8TKce|zlr{Y%nmx{o;PmYA zTxOIt{S5`4%Z#$7$DxboGNbH=h!bmpcB5C@Vnr>a1T5U&%vg*M&rdO`~6@ajog7dtp`Qf8MuKz(|@D! zUsGR75BVXpsYhcujMI+R2Vr`3G|n}BEYXDN zj1vFnN%tt>n7)uv!ZCdzOT5473z;WenNju&gi|CO(<4$O9MdB*OudyEWlf)mIIfM8 zt}hZ^f$$o}gf}T}^vnI!T41-Y7ue~YAbm2MdV_`u&-9NB6CV0U4ynJ7CQScGh4g%h z_=oUs`bdWGk3N!veR4l0JtPU^9k>2MdSo{B91Rkl=_wf`JoJ=Q$Cd9}O;3r&8BM)O z{rES%CH?qEZ^`~%rDrF4OLmIg`Vi@n+0@I_M|h^sq>u1SpGisSL7$1czcrL+l>M6J zPvEAWA=7WtOE~B^nJp@u0n=|%QaV%pQDUdpn0jY=PjZBV-jn*M?DOb7IXtLv_I*S3 zVV~IP2P2#<;koUPH}#;*Q!jh|&5xUo)?3oRo^t@{Ibh^y(sR8z{4e3Y7hZ<@;1#$Z zUW5nR{13JHA8zws2pr}AMCQOxWttw8ozjC6ZI%9$Xbin46ViJUO|1}~eUGN^#J+da zcQQ%&d>8lDK79wC#@_UuSbO;`?1#vI(|0n1`(=wCHhm}SxHo+#Yq04%>7<^TzLN}W z`c5`*Z~9KGA2)p`UASK&{v2%jPL@fJ={s44Kacx$*z}zY6QAij=?&%S`UTwg!FR!f z@M7R--vZB7?_IwM+xKO9PV9R%Jtx*4n4S}BUrf(Qg>;&plR0>v@U6WyJtyG>{qZiJtrHm={Z@0P0vXu`DS`fs)T2HPUc|K zbJBoK&xwuy8pJ=3z3DmWC;U{;348$eHvTp}Ck5IkEQM^qg4#VR}xie=_^p25fpxGW18L=cE&U74Ey>J+RGpDzNouuY|3iyaBfU*YuoN z|89CtY`kE4PHa44dQNP7V|q>sq-UJ)i?HcA8HG*HNeO-#?#JP4;R%$@H9b!q3Hh7knk$0~f`IC&Txj?AvG?m#k|%b+A|M!`R;jZj}o>ww{wh za3AkiyX58hzW1G`zLR9%T8K9q`&lrc=?3Z9051D?GCES~SlS$m0ev=jKKZpNm>`lMPGWMq5 zWC%9>CNsESwD@7uZ?cYi({Hi{n|_l{+9lI(l7UUX$p-FCzex}Frr)Fso+thsZ2C=> zNss9_S%po%$vSNMO@@ij^qbgt=tG2W;~~>;V&kDX><0&4Q5Dh zmG@u4-t-%6z^30|4L1D-HZCëi{{RVTe={IP=rr*HEMKi=dkG<(PuyIkU-+*zB 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 A*8l(j literal 0 HcmV?d00001 diff --git a/compression/cutils/anchor-v1/tests/fixtures/mpl_token_metadata.so b/compression/cutils/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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∾C-nB~IidB;5jf!qJ>SXmIzMhZ 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
$e+kT4RQa#L5--zK`m2@gIb}U_T}4g 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

rHiP4k%L10 zj2sl|Z{(m*zguCwyvX}$y?l~d>*W*FS}!k9YrP!yrxo_agMEto;=z8!eeq!5;=XvW zf32`D9_(W)?28Bc*$Vq7t$2Ia3i~H5Q)|6^M6LDmA+^@a`_x)5?@?>Lyi2Y1@&)P} zje~0Ybfqsee0X>cO65-+l**qtD3w2PP%3}opj7_EL8<(SgHrhu2c_~S4oc-u9F)r6 zhtPjsRQdZbwaVW|s8#+()Z2VN;-I#u#X+h3iGx!469=`<^Tk1}QHz68`4b1F@+S^z zndggx8c~abQuz}HrSc~Zs>k!iL3OFcL8<&*JqKlW&^RcYN3r>!9~y##vi_9K&*@_w zrxeqhg-f)X=1;0<{-mtYbRWBqUGmy5$AzZtlP)#9JxGUbpKg`MaU4|fy|~7{?~Yq= zv^y{fRgz&I=^spg3<3>^kQaf?XeB9w6BDA+uqY;^#=7`9MrOpw{rFakB#G?5PvNklpn7@igKv=)Nve?%KMvt>t^7fXfHUfO)p^n zV?Pec>{XtFGJTZ$;`#T|dH@)&0JoS{xMmSIvPqr~>1~L2dK-#6fLQi-X#v76-LKEe>j(S{&3G zwK%9%=&RyZk^tzF0ZsIH-Al zzsN!1{x2sEYRf(6I1Xylj-U0}6Xv(9J=(D2ufuWc+par3j)U^!1lM+H9lPxIXNnwD z!{=K*KP|tXI)CN&$XnCg?ee@ zJU{=J+OY#UDB8uqLDgXY0tZFA z8aOE0-M~T7E(Z>(%rq&O(Hn}I7~yLuAsfZOK|?czza5AOGv)ORwyU23!| zj=Q2pd*l4NQ==V{|KHY0wo{7@#+Us4#&J+~rOh+!zhr_?4Ki>G!yk z+(+x?PrHkZ{Mwm5OV5Ah(qsOh?7pX-wyRvahDgs9=kM?b^>-XBDlW;^i~RiuxZcL; z8}9ivZog&@>J=!b`aWyF-G82gvUFdX$M-(%Uh}x;ydB-5!Yf?9yT`a}`;M3Fy8i~( zsXgECdEe-s_dpJ64qud&`Cg|`?lOM=9X2p`pPlJ=>`VUSvOQ1w0`fimC%7PeU&&4{ zq(3l)@clDB%pR%vc`U~xA)KB=m{fdd^MUqhzOU@VY`W~rZS#HKL_I@2OI@LUBlR5h zebiOz`>AWxZ=$YKKR`WCU7>DJpQUb7KSaQd(`Bhru)=y;rT=A zIqDHL*M+B-skv@Ey+X}(<>^&wt~*b!QFC2-dYzga)bs}QKYOeHzUB{B5q8fZ{HK`6 zYQFz%&_D342;b)>&)lck!#r;Dhv1*2_1r)3@3HmlcjLWIPx-2RMxPwSN&SH5!#`kfqizGoBqJs6j!13XXk_k`z-oD=dRa!$yv z$T=ZDTfyHG^1C%H&I#|MHH~q%^Y6sx!?-*h^ryxFtsz8q%HZTQgox%SDXd;Y%JbeG`*zQ^Z+ z%`0x<`sogiTPC=V<{4l75@@&I8_r8$XC1%H_It!|$gt0_$FR$AfnkSXn_+|DJi|J} z8pA5XIffO6Wri~hrx=zP78y=5oM2dBxb2_kt}ptif54CrH|cZcxu>z^{M+%KZ+`>A z^VOdJBVAng`Ss-F170`J!OlAWU_Sqv=U{)`K7szc<~i79w|^it>~)slJv7h3j=SIW zG9LEb@p9C#`&okb**u5#!0|zhM>~-vc>m3FY)6s`n!R#>HDpV*OgX|0&+@o?H62nZESx?jQG2y$|D& z3pj4wZa*GjJF4#w{-3H9e`5M=s3*JpKRv~Ej_q{j#+mlXc)wWQ*#B5Ud(?Vj!#_*w zJy<7iJ&X16)^lk0TGRi*$ESUi^VTc19*%ktIj3b`o+IakdKCRVp`Jy~3H2~?PN=7m zb3#3ioD=GK^!L=^_h~&GcA}MNJ-osAEu?>Op8C(I>(p8guTg6~yh^S0@Hy(g;Pn;i zzoafxqkrM%YpAywKSljX>Jqiq!;92f51*vgdiVsj*24?bS`SA%@rB>_&Q%2Wv3`-Y zf9VV8C#6I5o6<$}qXO^rMBnE}>phDIpB*54?gGN;47T?sN{xHvPQ-6fIK|P|LrxxE-rxxE-qyBN8U!@k` zG)FDIsX{HjsZ9MMub-h_rk0KXJU5z`m!8bBx#c zrbdy!fXE^(Merl*UR2dPzQTY zEqgyj4SU~u7Iwb%++Ms>(Vwqzw3V~>KX2pY`}}e1mskx*FW|huJ)N>WP3aIZVf%CGxG1mUsJgVI%dpG-M=PlM9cL(jb?kl@>>3{IiexAe6Kiq0(x&9;jaoOKM z{JqX@T0U!DS@Zq3&mrFJuYvMYyx$*47pv45r-b@n#CRoLtS}zqmS8`M7{3JjQY`a+ zb)Nqw>Uru1s2kK3>NfRR>JIgT)C<%PQFp0j-+I(7hL+VqlOi z7I;0z0lk{o^Javy|4y7+kpPSD)b}s&`T@OPt*~fZulEzubW4B zwvO;z&4>AP7F@dA_xbO)_TSQX$E{Y&T|FH5z^C6o=K=dLo+#KXsh=10={U@L@b_i= zo=?}x0r|K70q}Y@J`MTz)&A?9zQ+9f>aM?0_BYHLx##)j4#ID1`!Ju*(vJLdChTRA zesZqa+ z@m1<~Q_n%afOVqg^LSs)i&$4`_TS^rYc63Os`-KULSMkTRday#tmY!tx8zs8RXl}q zO}}-msjq^bUGwVzt@2%7rxz;z`eSRuA(L8uwm8HWgY$vp#OUv1X$+XBQWz{PmacST5eI zyNjQ*R@8-P9^84W{=D-i*ZmFdx%Cgw&vU2M+z~g=;p1QXJ?JOg^*y-$MB#4#N4}l# z<6rmnb$5U3ub*}MiRu1fJ?`{R`tL~xWt4~0%U&BFU^jf~A0i#;pu+fn$@Ax^{}pwW z`lqOC)c-qmo%*M#=c%!R=YB^?y~6l5_5VTLq5c`_1?qoI-KG9n>K^saQTM6;PwFA{ z&r^@6SE-k&e}Q_1`WLBJss9c28uc$xuTy`FdV~6xso9@9{cow+pF6!q&Hmi!U!gAW z`j1mjQ2#3RB=xURPf`CmHRi`!r+&>N z`5s?9uGok5E_djdyM1|Zx0le}_Ve!6a>@Uo8xMIqanG&)r5~@j-#d66)}h?V))TQt9m$`YTivQk}{h)ME zM16YDQtR5+cUWtN^)m}w=zbJhw>kr6`cZEN3$6bi?Ro2cY~Npx_CBl&1m2eYgTULe z9}#%lp-)dM@V4xS1iynl#;f1LeoWwP7Z|U8PlsClqBgbqO$}=GtLCZI@2XR)Usj`5 zzpYBGe%&0k`h64BcrR{#ftvlt#ckww;BB|4*$-XZq-KA0u|$2B&wn=`@)`dgPJR{j zDmD7WF8`@ZKK?}EL!YugG;eM5TlOZ$@wUI1n-9Ml-u9!p>-O+Fc!c|}f8q5bO8d{c-pmv^N?34wn3V^1Q9R$#J}`y>ZLe zo%^qT?%%}qgTwe8wDehewj8Hxysh0g`W-}i^5gjp>u0lG#g)M|1*!E%eH&Gw6Z-QOOzJ_*^-+#vh?Ay+CJobt|xokB(9U$MYzu!Up zz99M?#P18D-$DGoAo?A|?+c>eLHxcT?!P+uY0J0hcM!iXh<*q0`-13q5Wg>o`>*2n z1<~&yeqRvxU&ZeW;{L1neL?fgo9%0z-$VSqpn2w-sqy=Q=9#xpulV}dJcD*Dn_Z^< zn~Wb(lT(@*jZG#@|2s9V|l!zk?O%;CFBi zI`|!|LI=NtHR#}Xunryk4$eadzk?_**>epX4}J$xZqfmsH}bg1kI3U9zao!|{ER&A z5cdr{?uZ)mMCo9en)7Y^{buw#xXO6UL%DfQYVo-1)Z%eBsL8_&HmSwqZc&TJ-KOUJ z-hjWCnHG=B-_uNs$3=Z;O=F(U^>=*zXiZ}t&(&*c%=4uK)VJ22`>NuNhMlV0rj z^yv2!fxmU#BQ>IHiZw6s{8|+qk5P$1Vw=+}n zM(IxeHtb7R_4aTVf9tPy*Duu&U&VT?t&f>q7Jn;V*X^4OyE@xtxZp#ZKevzkmmTbP z5O&qgpR&E4WH`aFz;N5YC%4YQaFgK%!*zyh3|AShFkEIhVmM^jXV_!dWw^kw!?4Y; z!El~ooneh(mEoKZ)1@h&{^)nG!uXr}x%2C>W6SxyC@0bHVA(goyZ2v3K1RQT$lvI9 z5cwYc4&r@8zk_&B(eEJMU-UbO_Zs~U;(bTIgA4wBMZbexYPL5?k6PSqpIY4QkXqdB zh??zPvP{kPFj=8ydzq|Kvpr4LsM+2o>(mdk-fd7nM7>G@Yc-N#1yw{xD}uJin@3&--eJntD7Z|#t^19m9y zchK}<{0{nY0Xd6Z{O#ivcNf=ARZ(Ad@wcI!gWYxWsc1iT`5i?29sLfXJRaG>bG$KsPCIp%e+!D>Ez!9OgWI?hRLm(;kkYa?)+Gc|kJ-tk^*rTz` zUU?n&t0$5D{6q|^eYRp->^M#a>vAR7O(j8+-4wQJYlBqT zTG&=1*xsbzk7V|q^Z%cF-wYZb!x>P+DWD|Y`M>+#>wE9J@7%B7J6GSk*!!m%P#d4s zr#3#TM{RsohuZk8Hns6tEo$Sln$*VQE>L4!=DruEHXgT5ZG2XZ+W4$0weeXMYU6Rs z)W+k^QG?fV-z#fBC0W9F@s8WvfY|*>eRcnHV^mx3LVqS%!g%tj+wAwz-$^*WeCjsj zL#~&H)8BP#c$9r#3FP zM*WX?ewF&Ss4LXQ<(8?9%blaXpyy}jKUTzUXXa%(qL;K9DMu@IQ0j}=Q<>K}`>XUj z=z2;A@jJLK*Q0vx;dc=B@$&jOjK5v~1kxrQwX5+vDB~Q-&)Y79c`<8uG`*5%ch2R0 z2mkVKXU;!?w48G9ofK@~a39u)oqh+W_#BM8El?YGJ3(#S?HILjx1-cw<8#kZ8+Xfb zso#H<<5s`_D#x{c|5c8A{r;;Q7khuQ95?5UyXCmr+w~QUgZ+0F1L`fNuTO1uy+>_! zy+dtwy-jU)y+v(yy-96$y-sa*y+&!0zq(r=XU-z9zr zotE#cAc4`W7`fzO>kczGAtqb?SSlH>lr6y-9tXdW-sQ z>TT*tYWDxV-$9NK=3#)7WsV=_3p^k7Kc2sn8t+HE@BXWJ4-c~c>dev`FZVm>=Xt~~ zPjues{0>g3T@HQ+asStn-@$2@&tZNCr{wqvE#6D=U6AAN#&H=lPB=Zx@1TwoT-#;q z*l&0H0NT1~(t%yI`5|rR+u5sB6@>vZ1Fg*xvi7h}k!|9G0`$?r?Mot(paDdRYu|KojS|5ee4?{~1F_AWVB zN7$<&T&g1MvfuCh4ld~N-Te;Ij_vDrkap4g9h^{m6?+bfcGYuGw7Z^zqFweJ6z#U> zplH{<-$B}a&q1+W7&i`z?S|h!lI@E3JIHotd|aQSy?&VAK}ng+ zGhFU>@a-#Mo@c&T~+4MJ{t(1UN78J1FC!!}B{> z(t4Mk1ZS2O!IRmzCOiL>lkdLqKI^!u_0&HL<$4efO429kdDNvxI4HSq;GmG6Y<^_ipXH!V{>t7Ql-%FO?T5)hNxJvq zpfnxVfP;F6%kN=wP|^;Yzqf18L2YZj4II=K^{o3W3KLqkfpWL;V5jHnnk3Eo!dY&Nit($nzJdv5u9_HmHq* zs#Blj`88_epsLiyK~<=YgDO)S2Q>$M%{Ztn*xTZ#E=mH^*==agLFM%KV$VU1LVFHs z4BB&06VRT6DnNSZbI4G1y;Gj@mfrCPM1`eu*`+5$l zPK|MQ(rr*?MBU=dE;whBby&h82cohI0%{3}+ZlGn`^rU^u~WjNzz;?mK)9JqIEqiVAx<-XINucWmsWYW;n;N#Bhe;G{Y%|1%?w0#~6-k znB|~`)^kkjg#A}P-q82tsoP8Py5yqxl!oan?ia;BOpV`(;wPx_`%(NMYNRWQAE!oo zqxdmuk1lQ4Bu{>Fk{5CyK2-DN|c}Q=zu@s7h_^RgK!(vpTi4cMWQ5 z4;QGdy=+ojd)lJ5_O?xJ?Qw_N+Up**wdZ|mYwritCFXyH`a$Yd>i1KxQ9nSvPJKW1 z2K2M&uS5y@F;U}v8Xv_oJTIr`nH}B1L2-WNWj6s-a92EYESHlJm-)$i#?=-%{v5;G zM=)Vz@iNA7-CVWV?w`4*-FfmS=gU7I<^8kgyJh2{=gUxG*!f$#oGjD7+tmgTnh0IH(o<{lG!t{R*dqbwq8C(ZR_O)YFjU#ptkk$F=|^cAEm~-bp3Ep+uCnT zUfR;|Snfx)UdQH-a90j$gZVKIYMt6Rs5NTipjN4kgIb|B4r)Mc98{m$IH(@AaZnxV zFI-mtzDV6-ym3%XYU7|5sQWy>LH!l#I<;|7HEQFas?^3oRj7@FDpP-z_nV_O4yr_L z9MlZ8aZuCL#z9R{8wXXOHV$fn+Bm2&YU7|rsV``Hvhy}8Vz;~c*!BDQj_4(7Hy#i> zC>)f`qa^f~D)T~{zXTrYPIp}9>FiG~8MY5=Tka#q-u=n_Nd66_ZGF;_a?R3_XTRR?+t3R?{#Xk?=@<(?^SBE?-gpZ?`3MU?{m~<->0d~zE4q` zeJ@a(eV?E<`#wf(_I;Gv?0b&d>^tXM@@C&TACrfD&%Qq!?tOB8YVJo;;M*_s_b0dXm%9>vQkxhov{?!ZXrib>WX_;P%hi(E8x!mk`pQ zm-$C?>lUalU7UBvU3kG?cJG1vUxw!e$Lst@==o2LTRF3Sbk}$sza!VnU()6CTUtl_ zBfo^m)XRi?E(&jjMemz~xt2!Qu@pYcxqQ<;AHDcI!lh3l?0$;(*@At)>-)9dy7vy+^H5WI-}Gco!`Sms zc%JDkqc}eDUR?jtF=)?2&EWd86FBa9sA<&+{Z=I%q(A07LefG0;*n{+Z_+{jNKdyLvF6uSv0`)reozxrD->rJreONo&JP+&L@n!q4o_?&M1$g|X=XHJ9 z<}s9iaz&Y(+tTX;|AhP9@nI|+9?Sif{{EHv0X>$(y#57DtL^W<>V3$kr7v(pn9oXX zE1_Jz1M_&vo61Pn?RCvx`bZ7oy;X$AD;gflJ*nqq?X~v%ot-VYc1Y~(|NOsYxF*`i zGao^@?Mx4TH@S`J`VOY+O-NUIJJaz9({V4-kse1nlNSqG-g|LLIuD0xb;Kn-q>nFm zy>dx1j?#HJj^Bhw5`F8(k?v<)yqgNV=Khy1upjHVD6LOPZyMp!6v8h1-JVA(>G9op zB-)XEc_i8;&m*n#zU*(CUuDlD(e8O3X@%zt<>Bm)`EB+*678zzk!W{4kJRDy#v`?< z-HWXEYf-<6x=B4wy+Ca|QiIxfq&hVwMxDP*YI!Rqy;W*V+4|lc4<`XFFkjsK*O>{;}NO*7fqNUnc424dapi-aiWC ze3|DsD3A2X%ym0?B>1rs9_dr=cMp$8>S#H*eJKB%WIQdxUsjrL>+x(qyPBP!adv;h zoiBF(k5<7Wxha9oK+Idco!QFnJ`g*GU)Ue(iarioVZ*M}oZw zewkn|f?uW*&%fWLO2*AI)DKWkQ@@{jiuyt70(FTR_9ysdg8d18nP7i{Unba};Fk&Z zC-`N;_#*ga+SKJz+VewJ&&|Tjd5?%U8lyl*l~K)7&p6lDr$_YlkOHZ#@%k7iyGtd zq|5fKXgm_zyQ1+(sE={ccqG)kMleCX49*1Rkl1_*v$Ab_V^G*=dGT3=0e=7>+T7-_LY5N4?GaZ86+rxWRCp z;TpqLhARvQ4Eqdw3_A?l3|kDF3>O$S7}goqG|ciyL+klHtml}9%ANi=R@Qd%NVs3% zk?=c#N5bz19tr6RJQC6ycqHT_@JPsC;E|B;z$5iEKY>T;Q(Jp8ptkmCh1%MyRcdR` z)~Kz$Tc@`6aD)1TT0o9RrpCmH@%>T!2;;XI{{d>$izt4W8ucZLF>p?2QIDed1mjV^ zqPRqjdKbmkUqF3~;`cKi^)!kfpho?T;`^yfS}%9?%j9{as;1lQ=s|cS=_=a%%Mp*H z#htsJc_bM}WqBmg2jP))TyWJq(j4sL4j!qZ$IUJW9trhve;x_-JMc)T|A9xs`w@5~ zygz|Q!uu80tMUE?9trPf;F0kD1|BJ==?{LH@cswCOk4V11;0$NAHgpZ>`U;=1p5=` zZM_=yDbCw^HSAZMxAp23-rv@%2h_G+4f`19ZN0k3cw4XTP;w73wu=MQ4w#16{(zs#c~%Vm8|GB5PQzX%>l`c>#P$&=*1s+i{V`v=PU`gV4{%iYfnGluX; zbFhoOil*1<;@e|Gw3 zn&a~@|4b!nv+pfxv+qr6 zv+oPkX5SmsX5Z`7X5VYnX5XvSX5TB+X5Y)yyYWbEjhA}%oj)_oKNI4whDXwI`vG_) ztM51c(;IwhIACopd&+jYry~emmp0sHdp6 zsWEYubWlIyk+(4(^(P)N9trg;9=V(GsDJUuBsJ=1Jn~j*)ZcjIE^5^8c%(p$`X7(n zNnO(V8IOFo>fL#y3eVe(M`~-2Rd}RNxjWhXj_^or*JdZ@%6fg^k#N7)4v*B*{H2dH z5#GCi@OVSRVLX!d`&~P<;mSk$Eq~$mJ@S5*mglrQ&U^&rX60q}aX-IG>FrF%BTUD= zNJn}c=}cb4d$kvjr1Nm7R!2M%rd6+N9!clnGCY##SC2<(tKCX^w6{x5=q~%+o=1Wm z-knFH9od&hqFwSl6781vk3_rXc_i9B&m++;djCihuwR}>qFwbo678<%k#am=dbu*c zLc8t#BhjvV|46j^-aiuCg>g)PCbkd#xbaAASH_J;V!JbLJkkoN}{b)Za~Ap=LX=Sf(y${4gF#`gy~6q+<@I6Z_}zmW$FS zKPZp%^{TQfBRrDaH}FVE&t5#z z+djKDk0kehHFzXR_g*}brsEp$NTV*lhsh(o(d8rQqTH`NkJQldeBhBVKNEN)%+CZK z3G*{ypSTLIf54?u#?hFc3I37h81G&_jW1D`sAs58P)}3a`sEb$!;CLbe}H;|+SW(M zsQ(J%N2xzZoui(k#`kW~q^-~5d$(xP)^9iU{f#DVeRqS})_>QjZGCu++IXZ@=xfF! z)%AXXM`}QO9%%vE^GNiE=Xs|RBz$493<2$FMTc*amL(;8KV_w3&*VM)% z)u?ylkDghTBL_ev9EI!wrV(4A&U0GF)LeVAyBaW7uKX zX4qob)G%2@|0nQBRxZr9j4Xx*xR>}BB z+IF=+m)prBp&SE`gx?7~5`I7MNJv-Uk&xcNBlR_(fk#6A0*{1z2ObIK5qKn&Qxsc! zv(Ecjd$d7q?bRl=wP#z@*4}MXTYHG-7RA-FwWoN_fk(pgk78?&Q7;0Ig!&SA zB-Eq8Bh6?%2|QAX+WHG~)bCfr@Eoi>Yjvj(#K2fk%SYwpQ zR{xAgvifH{lGQ)sk*xk1k7V`FcqFTT#v@t%Gakw6pYcdm|BOf4=JPQgX^Yx;B&&bM zBU$}39%-HD{|3urjoNr5tAEBLS^YB}X~6T1N9t1>k7V`FcqFTT#v`?PzVS#cYU7ct z{#`kbBz91EB$-D^mh1Z7%Dm9;w7?@h=#FD`UEciNd8CO0@klkjf6{Ac`mJ6Lr8XX^LjAj}Pi1Q3 zk>;q4M=DVpk2FJVJkm6^@kmqD#v>J|jYpcG{yKkujN0t`D7D%59JSeZj?X=h#PPf5 zkvP8hJQBzMo=4*RfVc0QKk)XQ^9!Cg?PET`+xH%|*>}!o9y@p>*v~V!VVt>>M?$-*{HC)@&TqTg!@wgU{xEnX?eCs;h2s8p=aG<} z>xoDD)1N;K9trhIcqCmvm`AzTdVAoJR@CkV9;rudJQB()@JJoTW8N<<4ycVs>QiIh zFfHPF2Og=S^&#*`W$OPy?X>&;o!WS$61DM2Gt|Z-O;clDG%Ze1W8O3^7O0I!nxHlw zX^h%qQeCeLJW>PN z^GJBE>B$8g_dF7wXL?H$$32hKg7!QTo^yJ(jpLq2>Z>;Y`bh`r4?Gg`7kDJ(Kk!H> zpTHw+G9B;K3Y&DcsEtS3rZyf4&nF%+9tqDc9x)yX&o>^K;{EXa;}J}pB^}g{z$2ml z1Re?XEAU9De}P9TY5fR1(j4_&{Jk=Dfx1F{Cv}w?>(IONNDZF18;`V|$_>>&l4}@j zen-}6Cw|iPd(YMN`oJUMey<%KX-o5$KC+4M-VKDu*EJl*BWb@svo8J7l`M}`)ABg; z5tN&im)Xbtc_gOe5vJo_q$53!bS5w2z1oXM(s{Te9x3O#l(|P=13Z$>!)16R(XSql z1pAxxXm6Kb&yz0u-JVBUfqfizFTVRTKb^5uHuvZDeTE&`mq(&q@;nmlmgkXZ*F29z zyXSc%+C|SJ&G2`H0+4jju6iDccGvSr1)gs_(gd~C7P)?mT5&|DN2!s~WHCo=JQCXt z&m*y2@jMdS9nT}NUGh8<+b!=OiS63B@kng<#*Ig6^Etek>1|QJg}O<72lWCq+5z{R zsM$^|)~O46{xBX%`gy~6r1&3%asHL?NKa<2^E}eWEBgD#9dG35m%t$v@LZnAIq=8* zC0ENK-IDurxlj5e>Unx{p!s+HFcIdr|4ibu{LYHon8Ew6c6NW^Cd`Zciwoe9q$UI& z3HCY5BMF%{j7JiJZ5WSqKJz`-L3kudpNyY>$)!hlB)MDH(* zu1~skYK;5cesR>bi}JwTesR>#P&cWKM`}@H-XZC>sf|bKP#cfbquz~2Lc5ZjM>~_8 z%jx;M^GKi54%V>!+9bhQ9;xTrp$i4cmFq7~BYf@pM_SQx*`G&(T{S<3X&(KbG>?8y znqOc$j($#>NB<_x*Lb|ju)?s+aE@V#;S9rRhEog+3?~?lF&t%>W4Mj{~gzEsR%=U=j4TjqSXggo?o`OrgtQ~t8)k&)1_`^%Rhdh%uGOVaK9 z^X}jB{fOnm@^{K*Quk}KeBO*Z$-Zm4f4!5EFL}#!|9ZyTda&F_@^LFZv(bItbpLvH zp6*{Sg@`S3^dC?2yyslJe2Me2ie;AROkI{y}Cwi z>(y0iTd%HA+j@1G+SaRKKZ1Xx661|WnxXz9t!r++h5C=Fr>Osgx11Z9Gzr+SaRKe`CL14f`DDZM_=yJI>pBHSBwwxAkh+|2S{!)o34Lzn>4sCzuWL2W!zo%(Z(uTg)Vx=Q^8>I(H2sms*HBh678k5r=W^ZXfV0(o&{*&JMo#?m8`yp?D%)7}rNAmNpz7Xac zt=-XiId|?b4(Z>2IdlFA{N5>du9V0A`?U4+J&XN5Z5?XkklNJ7A+@M~kM*QUZ5+}9 zwQ)!dYS;_MyHXp6RHHV#UZpm>UZFO-UZys?K1XeKy+mys(hRlP^=WFe>r>Qb*9+8U z*C(jWu8&chT_2@3yUzIs&mnQ1!gHpa$MANY^Bmr;a~{OobE)nd*t#=_jGmr7*1)0ose>XcDBqI^GFP7RrS^t(Z-1p0>1BZn8 z!{Cs#pL<%9vj>NS^z6?eb@WEr_N40U@?q@LR{PmQ;E+0~SHdCbx`BHh@@MPpfkQ(3 z9XO;7t$$&kHk4Q3khU3b9MTpw<^$8>Cbe-$c;10SYHNK698!zgIHV>u<}1_U0yX9{ z(_(}Af7JIPE!L?qAL_oFr#23$N^Klcg}Tn`%hZ^UbsQA6aY!X<kKgR2)sf|OL zqBahxKy4h-1a*Vgk5L^hEn4hhfO`Q_JiC(B5GJpXRJPqK{s#q-nD$bUTlE^3rd zJpaAaD8G3Aozy7bc>W#KDF1k#9MUqLPdrZ!X?af55zmuDS}s#h@%jq&J=9fdbhwh` z8uf9;*QxKOZctBBFHpagx=9T~nJl-c3yg15-$~t}-iJe49`L-pUU&IEZ8l$_cK35P zz-u+$qzHLuyJ(c#rnahh8 zP)xaJTqn2S?)MzSr{0I>Y3Vk*l#F9OYq$N{F1UFm`McSLeV5M^ZcQ%9Ur&yozfM=O@MxzFTHboxV$hT=F8?hvXdW zf6}A9UqXB0_GiJk!E;bK*r{DPDB7`oIVjpi&q1|$U!*Uwc^S_^(e8QzuVM!UXH_}HV$f(8tsGg1BG^a{LM@s+w<|aP_w-sHx7#Zf^pdYWO2aj z*-kC?sSA4jv0S1$yHA|-Gly|d|K^Kfp5aP3sDGHbZa4>Z@paxG(>3RyN?NbeCsE(i zlXwqY|6lX%_Mg%C?EI5V+~|CZD+k$!x#a#Yh4&}RLA}|<596TZ zi4NnS-jMNweGm>x(kJQJ{!MUDa^Ju~AwAjrY)Je4VRw@Ilk5KE?A{!d-2c_!pd{UU zaZs9$YrsMMpDw?L$wA4RZ2oJmJqHE595^V$0eP`{8HecdW?Tqs+Z%eI@BMaZc{%(-J&)Qs!9Dp#xGE#eRJPG zQ5y$Ur{=oxY>nDDs4Ddj@O~9)rdr}0|&JY?K!BN{$A`ks8MLo zL5)Fs4r&70b5I3n&p}N=dk$(_b^5|Ij(ZMjOLfvkegg-E@(3Ih$}4bCD9^w_)o@?W zLDi`-?sgm!HOA$RL!!pGJ?S>7F|JR#EozMW9fw4Xc>%{4Qe)o0?Q=(sc?GwQNo^d| zfV!sR7x!HawQ*3Z)W$)rQ5y%fPHi022DNceo7B5;Q0!lwxBga1&woW6)QGc>c&&2x zxHhQf{(qsM)%phDpmJz`XR+>R^NKHj3-b5!8xW>>v}b7^{h&0D{*Uo5#!Hxg#Waup zO`7kqeeW=AGi)(zGF)KTU|45ZV_0QaVOVB3$FRh3hT$~BDTW1x6AZ@~j%t`JZ)zAg zs2t-r7_Kv1W4Ow2h2elcKwI>Q>nD#HrHGQ&BBC5AH$rx{K$ zEHIp4IL2^P!%H}*Vf7r-I>9efz2R#AFb)d$3mg=FCvZ^s{lGyXU4er_dIJZAd;|^( z`HP~mR!HXuOw%7Ys5xrmpvu(7K~<>P9_6dl#zEDn*`DR=)W$(IsM#Lo7pU1@=9|=P zPxCEmwzv59ho_*W<{ zTQ4tD+j{vNwQ*1-YH&hszJ=QSc1%+n2Q@`)98!VWIH(C~d7WSQTjZdefj4yyeLcLVn)9kr|Bpk$mQ`T1VAz9pfqKapF|c{w+SK8%BU z|K~I3pU|XSfj=gW>pTa=abMmzD2@yB#zAr1m^TiJpjLB2i2iAyWXZYyWXNUyWXTWyS_kecD+GucD+t*cD+VzcD+h%cD+JvcD+n(c72Z8 z?D{md+4U)Ev+D(Fv+EPoX4l84&90A9n_bUQn_cHTi|3#?53?%=HKW%{{p$bqVH_0V zuZDxt@%m$^hc=%o>!~tdc;PgT%lxv{_xC%{COOS@kq^6sxxeHL*9m?E=cgyZ=ccnL zN8?!1yzzA_u#;V!cgJ1s2i>1=hVp&~j+f_mSM~g-#;u%LKe}r?j^B~%<hO zh@V7#5IZENn4fMN*CtCPE$2NsD0kr{9F)_C$wBFJp*;y46vmf3Ij9Y_f3of@XV`Z! zHecc9l{Nk_I4JGsp4MXDgM-@E-@l$XsDIWx3=RtIkZ@3WS0pyhv-SDFL81K)92DB) zz(JwB0tbcmJ?a_xro|pL=1U!yM~(SZx1Sw#UEjyF*rLXKY+7tm8wa&OZ5&jC`eVGlPHh}i zjoLV%1@f`-`-zo`a&@^&Hd+&;M2}*TD4{2i0f% zw=up){q58pYU7~V)Es9lwy2GRYEqB$`UPs^pc>Rd3%P#3eb?jtLDd*<98{IsIH(FW z$2W^*YP18%;v6;F2gglOznQ-`Mr|C_D7A4=Icnpe*nb#jJGIFE#dtyQH;jXlUzT}> znI5i@6J@;k?w7(m!(UzwDr?0H>Cdm z@IEUCwc-qjfK6^6$k(w4bDEK?ea!^v!hH+3*Bc)smmzC>B`k`D8!a+&;Bt55G zdS1!?bdUYby*ViLhl}d(>Nm!{srO%oadPVScf@!)_5R&BPUrQvkD{L1xL?|DvB$TM ze3$xF-;0CNbl|nf-R#O;?E1}aoxI?#zwnIvkNdOsJp24E=f2+S@_U#ZlvtwVXn#6= z9_cK&&uH=k)Zjj&N#mfveMXa9x19y|8BKCscQ*GIa$z)yevcdf==*!LKiyAWlyXUb zvIG0>IjA1A=b*p|AMH<9)ADlTS*=g6-u`rGS8QLUWZ(Vi4(<<1{i+wF7P$W6G{V=e zKd1$LF8lj~Li>8d?oYRjeo5e7+rvEk(*}P~@LwB6Y)|v>ZyQC%LBaoR6tO+d7yhdxJc=G>`lqNLqMoKc zK@I=AfrBbB-gVmDpY0PFMaDsu8UFy|E7bQ>qh3eP-luwZ4hrvq+0lb=P}1eJ`J885 zZ7Dc?#6fXBMBg5ihy3%D`_DI<0tbcnE3B8}{R{q}@O}mk3h(dH{&cpE+fjQN{6V#; zZM_`rL+}TM_T&2V2i4GY+dg0i=b)_q83$$c&p0Tnf5t&s{WA{A>R%82=S8c3#z9&A zGY-n?pK(wH)@S3OCa8^r8lyH2YLxoR{Jk7?pBn97oHq^%?PHub4hrpOoHq^%?Q5Jj z4r-mx-#93=&vD*3D74>k-Z-cgoQfsB)uT2J%IcqSP;JH=2W9ooI4G-s zSI$9+9TfgR=9OeV=#M^qW&WTJwl7^>pT{?2U%H=N3iDzI@dx!Q=Q8J?aE0Rjq@9xo zxxYWC8lThAzI0M<#&?8$N7pgWa0Bj3_fJQ!kA3NW<=1Wm4vO}I+^wwLi-&!D743cgF<-)4hrpi;GodH2M!ADd*Gn( zyaNYS(fSZLs4}&2Q0QMpUE`oij5iKyhT1r&X=>x3(7%eh#z7SrZyeMFwQ*2m)W$)f ze-(9&gUT`9IH+xH_oA+GP+Qc-L2XhS2em zpzvIG?n{T~nLgRX`JRJnL3<9WuX^Xcba>u=U%F+aKX6dUU*MpS|G+_^d;$lx$#lF^ z>ua*SMQt3^Hnnk3cs{`&6#K{C9~7Q%JU_+z;rYk&#zCQe#Ph~Mq5j14#zCQe#q)Rb zdepyoev-PR^&_5tEA<@pUDRdj0(FJ@PUW*T&fVwC=}Ujl?Ch0rP@3)`9F(SeNPZ;!+5BjE6p)U+I4GU>Lv=pl zpdLbbUB4U@-b>-2bpG!>NUv~Eq7R>gLi>=MgZ)o>wD(JBPmcD*GY*RF&bYi?G9F~R zG;SOe+b!=8itU=`pxExcX7){9}D;Yv8D=Q7s~<)ALUHvB>T!B-B) zAJp$;zGFKG2PJ&3v}a#+=@AY}dJ6)JOiHq@2^U z{La#IP~cvV{6QH9wW9SUa8Rq%uK|BhZtRlfL-aewf;{ybfrA3Cy*~#9yL#jgYE9dh z8^sUSB^=bSdcK2$!uPs6_r=3^0D*(TcLGQLpp1iRYrP2^6gb+zL4l(^@&^UGD%_O& zpWj!`=7)~<#Y6endbE_2TY|r;eetAgpXH!LAB2O_alut{P@CwlANhmQatQn4El}fo zmt?U)ZGJ=Q)aEy&Ms0pWs?_ikkt|lI|Ff=tI{(|$<~L-H+Wdx;sPX;Hkv}MWw{~z2 zYJ=rx9F*}3#zCPU5$BDATIKo1L9I|52Q{EJ4ysRW98{0mIH(S_aZqh)|wKvJ9%!mEOV&?o4a`Z|#s7;IukNiQ=PFGnTX4fm!X4lKq zX4mJa&8|;Vn_cHTh2Iyi!1zDq?@ds@`u?E4<>#*te^7t%r5k~R+EROVMgE}NyL^d1 zD5sD7K{?~)?7Q(*yK_+6THeM%Gc)T<+ZP#t~VQP()AHnnk3Eo$SSn$*TY zEl?W=)u1*Gs!nYjRE^p=s4BH_P!($9pvu(7LCry5F$aZyZ{VOXuN`|13jM4je^7Y- zfrCQ*2pm*T%Rg{XeQM*N2Go<tYt#kmb!zm*lI0ER{Wz#?o|o7A z?CB3`>Dw;lpxk<~&C4hU)%ms?!ylB(=P(YcCdb*I&E~r*$1@yM#pz)jl#UZzn`-`` zzTx&~3LMmyK8Ngm8}2^Wf`ig@58Cfh;E*jPB$RCt@e)2`5zAWxP7s!1* zjcq@3&$%&?8v^AXz3w?Ey!S``plCO}{}|fUBY#j@#jj_7P~Z6bVV>biIH-S@xo#H@ z>Ja@wfvZTLoC5!Sat2{>8ezVn_O%M9}eHR<3@xxe^3ItT|P>67zscj*xhO70stD5NKwpUeFtjXl3N2POA6 zKhB5g4@%O#7YC*3xCR{5AAjO-IVkb`mUL0>*Per#(SAzU7jK$+*8QrRKbW1OzKnzE6RJTBkM+ zYK_`Bs8wp?pjN1jgBnm92i2!G4ys2@{~CT@KKkF7Z8QD{nZ6b^{ddeZp|9D#c++~n zurJ;WwBHx61nu|5n}hcI;+3KOzIYXAzb{@D+WUj5L3<7g^(B3wj^ln`Jk*=8FCE6U zVP86od&9nT7#D|q=`d~%`_f@t9rmTexZCm6_}wDLgD%>ze!T<(_eMs^GNn zIuai3i{}c#{Tb(V%9YDE+aHvSqp}>7=!0-jIxe_s4hnWR>2e$xOYL#}Y2G)~JN7d= zsE_;mgF^id{-Drq1%FU@KY~9fyg$Jo6yC4k4+`&J@CUV}??vzjh4(l3gW6#H*LBV; zS;YGv=l>%$>_eRYPt>p|@fK z(R5mU9JVjs`X|JKUj4p!(*KkE{C6*ed9h14D91t#&Y1P?@^CZe~mgvZTsSFW1Q;uFXOn??~BKAZT=5C(@HH|Y>iAxbmwNVz|9%(; zh4`!47f;7AkKuQ1KJ{j)yY7(r$A8(S$LjlE``nGdLD61tT$?N{XgOa``{LA9XbsNem`!{DG$uY`lr_s2aC`7=Ky!5?92C@*7LA0AM3Z@m(Mt;CVuaVIjCv9E^tsY(4K?Bb4^c{aNO^Uhv%6- zIfvukA5pU z;13G-e=Yfgns)gd#z9TV@e^81m*l%3$1@z%gww+~C>mwCm&IRZILg(e96nS0m9In!kA5_Qhkn;rI1oyE6VJp3ip2`-5V; zfX$C!#OBdE{C=+ z-h$@WaZu|2FFiSfun7N<&d;sJUo!p>f8*{wl|LD$%7&RTUheh4K}k)@a8P=`EC(eu zX&473BOfW(%lF0mbT^difjB7ci}x{?9^s(mz8MZm)0555(;Zdx6!rZp!EJ34hlMOP|$&cf({%Mbl{+% z0|x~iI4J1ALFw~!92AZR4oZ(Z4hqMM7}q)uiW=kIq}!&(xY%(})EGBA4vHG%YR5rQ zW8CfiN(K&!@t%XC_8b(o=b)%DFW@*RYR^GYdk%`)b5PWtgVKCwI4Ek*K~Z}SirRBf z)SiQ)-j#!b9XOA6#&J-Zo>#&_$s2hIAL81f8;FC_ay$SBrRC{3D28JU;kPs8K4EEo z8~4j^G2CRh!El}78pBnFD+~t=`wV*wI}FcV$Z$}M$AU$g$Mef@ zP>e70dOYt82gP`{CwbJ5DDoT><2?sO?KvoF&p}ap4vL!XVSa_$b5PWtgQE5v6gAu9 z{024K>-;7)+jG7@84il^CFURgaWfp0*53>VMg0KJ$9tRMpb-D;eHy>}zIY}5UB{#7 z`3K>kv_Cnbx6K`KP$-Ay?h(L>(|S-sBOI*?{9{KV!W-FuTy&t zirRBf)V5v@`;y_H7;o$4eQH}T?@`-&d57B8%iGkpUJm;h=WV^b$#`2YU!b=2@&>i7 zm)EIny}U+k>*ZByTQ9Fr+j@DK+SbeGsINN?O4H@I6AiC`gJOO192B+Zpr}0uMeR8# zYR^Hjd^`t5{W+Z%aPw`{o`a(P0^_azc@B#4o`a(PGS9dA=Q$|Ge}(aV>VH7pqy9B& ztAD>vZT0Urs9QY$tJF0`(P$hSs z%%ffI59&ADne$KRZLeToyeU2h&p}ap4vN}yP}FAEN2xsrMQwH+^C*FD-NHE4+jY#N z1iqEy-oQcee6#Co)MnRLsm-phP@7%HJW8(pk~Yt&}ftJG%KE7WG!%hYDq=cvuDm#EFI&rq9PpQhfGgVK1ZXV0G*%0c0J z_A}y#@m?Iuy;tqyR-I&cZ=SduQXBAsm$2-3$jsjrqE?i1NyCP>jcX zUs|kFV?Hn~)~GRGX!Rk(L20@&92B+Zpr|p9NQ)dl2M&t&$9$*bpr|n)>NqHB%$GV2 ziW>8&X%YRasOvc>#$!I#aZuErgQCWKuH&GnJqJaN`C!LEQDeT?aZuErgQ9L|e<>}Z ze-(8-2Zi`6=b-eu3gI91k3nYR5q#Ty7$M z9>7Vm%>HBGpcwxyeL<6Dluy_f59Jrndk%`{dk%`)b5PWtgQE5v6t(A|s4-#YI4Ek* zK~Z}Siu!J*cbj^Wn&VHuFCO$D4U6A9bmO1HDPdGi4gOYx}bhcfaA^n{% zy8W3l9F&%m*;8%j+;u^$-a0~lD=UalpG(DA4z{UKhvTM`ty7GgVOc@ z)%l2ndI;s^T&rN-53hCZIrseKQJ!+4e*Z}R=mO*A`1iR#=~uY_YIIB-ym7kWkFSEIqEy8OVpl&qGmg_I89y9^M`RzVpoQ7P+$DJVV>bi zIH=ENt{culT|7(<>dz#j*TNsv&941841ZAnA@d#EfjB5Pu_W!;zg>D|{-FM4yblNE z?*D3VQ1S-s$w5gvt^o(tclkX`4(iAslDPb5PW_ zUf!Yh92B*!m$#^Gy}U_n>*ZKCjs5;foR`YmdU>7a+j@D8+Sbdf)V5w;p|7^;y2Ne%Y0c)HGR_=thUaLFsci@&~n{ z{e`eE-a2(%-^U|=P#7;9`GfKt6#AF*o`a(H92E7WzR<}s<`u6ie^3v9*JT{kML*9Y zc6p-oT{nh5D3{M++|ZO9KLLAd^IMYdf*j9sP)-l!pk$mNt(*J5*ylHPF5#fmu4eB$ z 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�(lo1^~1{bP#0~#)z(AR9<=-KYWdZ?DX=ka=| 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

E`%epBjsj)!V~ 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

iJETt<*3(1!rC~iiq;FbuogLCY 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 QN-_@5S&pK6mRkxxXRhDA|d> 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%0AifUtiLcv3##f;SzKRK7g@Ugl!PmBN@$;*T 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%0DRO3mr>z{L%4NSq})y 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 literal 0 HcmV?d00001 diff --git a/compression/cutils/anchor-v1/tests/fixtures/spl_noop.so b/compression/cutils/anchor-v1/tests/fixtures/spl_noop.so new file mode 100644 index 0000000000000000000000000000000000000000..e250fa09254f69ad2e39a74a000e01ca5e3825b4 GIT binary patch literal 41056 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 literal 0 HcmV?d00001 diff --git a/compression/cutils/anchor/README.md b/compression/cutils/anchor/README.md index edd5ae69d..073b8d5c2 100644 --- a/compression/cutils/anchor/README.md +++ b/compression/cutils/anchor/README.md @@ -1,5 +1,11 @@ # cNFT Utils +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Example code for working with Metaplex compressed NFTs (cNFTs) inside Solana [Anchor](https://solana.com/docs/terminology#anchor) [programs](https://solana.com/docs/terminology#program). This program shows how to add custom logic around the Bubblegum [mint](https://solana.com/docs/terminology#token-mint) via [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). Two handlers: diff --git a/docs/anchor-v2-migration.md b/docs/anchor-v2-migration.md index f117d063b..85e34b401 100644 --- a/docs/anchor-v2-migration.md +++ b/docs/anchor-v2-migration.md @@ -9,6 +9,12 @@ of how often it bites. The single most important one is **[borrows held across CPIs](#borrows-held-across-cpis-are-what-tests-catch)**: it is the only rule here that the compiler will not catch for you. +Every difference below has a worked example in this repository. Each Anchor example keeps +both versions side by side: `/anchor-v1/` is the program on 1.1.2 and +`/anchor/` is the same program on 2.0.0-rc.1, so diffing the two directories shows +any rule here applied to real code. Both are built and tested in CI, by the Anchor v1 and +Anchor v2 workflows respectively. + ## Manifest Changes Every Crate Needs - `anchor-lang` and `anchor-spl` both move from `1.1.2` to `2.0.0-rc.1`. diff --git a/finance/betting-market/anchor-v1/.gitignore b/finance/betting-market/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/finance/betting-market/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/finance/betting-market/anchor-v1/Anchor.toml b/finance/betting-market/anchor-v1/Anchor.toml new file mode 100644 index 000000000..20f676795 --- /dev/null +++ b/finance/betting-market/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +betting_market = "7LyqAeLR3mK9dfj9LqxWzfKH61VVHzuNpkgW5Y32De74" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/finance/betting-market/anchor-v1/CHANGELOG.md b/finance/betting-market/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/finance/betting-market/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/finance/betting-market/anchor-v1/Cargo.toml b/finance/betting-market/anchor-v1/Cargo.toml new file mode 100644 index 000000000..14a951cee --- /dev/null +++ b/finance/betting-market/anchor-v1/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/betting-market/anchor-v1/README.md b/finance/betting-market/anchor-v1/README.md new file mode 100644 index 000000000..56587c283 --- /dev/null +++ b/finance/betting-market/anchor-v1/README.md @@ -0,0 +1,138 @@ +# Solana Betting Market (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +A parimutuel (pooled) betting market on Solana. An admin opens an **event**, adds the possible +**outcomes**, and bettors stake a token on the outcome they think will win. Every stake across +every outcome goes into one pool. When the admin settles the event to the winning outcome, the +losing stakes - minus a protocol fee - are split among the winners in proportion to their stake. + +This is the pooled model used by Solana prediction-market platforms such as Hedgehog Markets, +where odds are set by the crowd's stakes rather than by an order book or a fixed-odds bookmaker. + +## Purpose + +It solves the core custody problem of pooled betting: collecting stakes from many bettors, holding +them in one place no single bettor controls, and paying winners by a fixed, public formula. Resolution +still requires trusting the admin, who chooses the winning outcome, as described below. The pool is +a token account owned by the event's PDA, so payouts are signed by the program with the event's +seeds - there is no admin key that can move bettors' stakes out of the pool. The admin's only +powers are creating events/outcomes and choosing the winning outcome (or cancelling). + +## Major Concepts + +### Accounts + +- **Config** (`seeds = [b"config"]`) - one per deployment. Holds the `admin` (the only key that can + create events/outcomes, settle, and cancel), the `token_mint` every market accepts, the + `fee_recipient`, and the `fee_bps`. +- **Event** (`seeds = [b"event", event_id]`) - one betting market. Tracks `total_pool`, `status` + (`Open` / `Settled` / `Cancelled`), and - once settled - the `winning_outcome_index`, + `winning_pool`, and `distributable_losing_pool` that the payout formula reads. The `fee_bps` is + snapshotted at creation so later Config changes can't alter a market bettors have already joined. +- **Outcome** (`seeds = [b"outcome", event, index]`) - one possible result. Its `total_amount` is + the outcome's share of the pool and the denominator for pro-rata payouts when it wins. +- **Bet** (`seeds = [b"bet", outcome, bettor]`) - a bettor's total stake on one outcome. Re-betting + the same outcome adds to the existing Bet, so there is exactly one per (outcome, bettor). The + account exists only while the position is open: it closes (rent back to the bettor) via + `claim_winnings`, `claim_refund`, or `close_losing_bet`, which is also what makes a second claim + impossible. +- **User** (`seeds = [b"user", wallet]`) - a per-wallet index listing the bettor's open Bet + addresses, so a client can find someone's positions without scanning every Bet on the program. + `place_bet` adds an entry and every instruction that closes a Bet removes it, so the cap (see + `MAX_BETS_PER_USER`) limits concurrent open positions, not lifetime bets. The fixed cap keeps the + account a constant size; the Bet accounts are the authoritative stake record. + +### The vault + +Each event owns a single vault token account - the associated token account of the Event PDA for +`config.token_mint`. `place_bet` moves the stake from the bettor's token account into this vault. +`settle_event`, `claim_winnings`, and `claim_refund` move tokens back out, with the program signing +as the Event PDA (`seeds = [b"event", event_id, bump]`). + +### Payout formula + +When an event settles to a winning outcome: + +``` +losing_pool = total_pool - winning_pool +fee = losing_pool * fee_bps / 10000 // charged only on the losing side +distributable_losing = losing_pool - fee +``` + +Each winning bet then claims: + +``` +payout = stake + stake * distributable_losing / winning_pool +``` + +A winner always gets their own stake back; the fee is only ever taken from losing stakes. Integer +division floors each share, leaving at most a few minor units of dust in the vault. + +**Example:** Outcome A pool 100, Outcome B pool 50, `fee_bps = 200` (2%). A wins. +`losing_pool = 50`, `fee = 1`, `distributable_losing = 49`. A bettor who staked 40 claims +`40 + 40 * 49 / 100 = 59`. + +### Instruction handlers + +- `initialize_config` - anyone (the signer becomes admin). One-time setup: sets admin, stake + token, fee, fee recipient. +- `initialize_event` - admin. Opens a market and creates its vault. +- `add_outcome` - admin. Adds a possible result. Only before any bet is placed. +- `place_bet` - bettor. Stakes tokens on one outcome; updates the pools and adds the Bet to the + user's index (rejected with `TooManyBets` if all `MAX_BETS_PER_USER` slots hold open positions). +- `settle_event` - admin. Resolves to a winning outcome, takes the fee, records the payout figures. +- `claim_winnings` - winning bettor. Withdraws stake plus pro-rata share of the losing pool, then + closes the Bet account and removes it from the user's index. +- `close_losing_bet` - losing bettor. After settlement, closes a worthless Bet to reclaim its rent + and free the slot in the user's index. +- `cancel_event` - admin. Voids an unresolved market. +- `claim_refund` - bettor. After a cancellation, reclaims the exact stake; the Bet account closes + and leaves the user's index. + +`add_outcome` is locked once betting starts, so the field of choices can't change under existing +bettors. `settle_event` rejects a winning outcome with no bets - use `cancel_event` to unwind an +event that can't be resolved fairly. + +## Setup + +Install the [Solana CLI](https://docs.anza.xyz/cli/install) (provides `cargo-build-sbf`) and +[Anchor](https://www.anchor-lang.com/docs/installation). Build the program so the test binary +exists on disk: + +```sh +anchor build +``` + +## Testing + +Tests are Rust integration tests running against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) +with [solana-kite](https://crates.io/crates/solana-kite) helpers. They cover the full lifecycle +(bet → settle → claim with exact payout and fee assertions), admin authorization, the +bet-after-settle and double-claim guards, settling an outcome with no bets, the cancel/refund +path, the `close_losing_bet` guards, and the User index: claims, refunds, and losing-bet closes +remove the Bet's entry, and a wallet whose index is full can bet again after closing a position. + +```sh +anchor test +``` + +(`Anchor.toml` sets `test = "cargo test"`, so `cargo test` works too.) + +## FAQ + +### How does a prediction market work on Solana? + +This example uses the parimutuel (pooled) model: an admin opens an event with `initialize_event` and `add_outcome`, and bettors stake tokens on an outcome with `place_bet`. Every stake goes into one pool; after `settle_event` names the winning outcome, winners call `claim_winnings` to split the losing stakes, minus a protocol fee, in proportion to their own stake. + +### How are the odds set? + +By the crowd, not a bookmaker: each winner's payout scales with their share of the winning pool, so the implied odds shift as stakes arrive. This is the model used by Solana prediction-market platforms such as Hedgehog Markets and by racetrack tote boards. + +### What happens if an event is cancelled? + +The admin calls `cancel_event` and every bettor reclaims their full stake with `claim_refund`. After a settled event, losers reclaim their bet account's rent with `close_losing_bet`. diff --git a/finance/betting-market/anchor-v1/programs/betting-market/Cargo.toml b/finance/betting-market/anchor-v1/programs/betting-market/Cargo.toml new file mode 100644 index 000000000..a30d1ac15 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "betting-market" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "betting_market" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed: place_bet and the lazy User index create accounts only on first use. +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" + +[dev-dependencies] +# no-entrypoint: solana-kite pulls these SPL program crates into the host test +# build, and their `entrypoint` symbols collide with this program's own +# entrypoint at link time. Feature unification turns their entrypoints off +# across the test build; the dependencies exist only for that. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/betting-market/anchor-v1/programs/betting-market/Xargo.toml b/finance/betting-market/anchor-v1/programs/betting-market/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/error.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/error.rs new file mode 100644 index 000000000..ecf7c14dd --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/error.rs @@ -0,0 +1,37 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum BettingError { + #[msg("Fee in basis points cannot exceed 10000 (100%)")] + FeeTooHigh, + #[msg("Only the admin may perform this action")] + Unauthorized, + #[msg("The event is not open for this action")] + EventNotOpen, + #[msg("The event has not been settled")] + EventNotSettled, + #[msg("The event has not been cancelled")] + EventNotCancelled, + #[msg("The winning outcome has no bets, so the event cannot be settled to it")] + OutcomeHasNoBets, + #[msg("The winning outcome index does not match the provided outcome account")] + InvalidWinningOutcome, + #[msg("This bet did not win, so there is nothing to claim")] + NothingToClaim, + #[msg("This bet won, so it must be closed via claim_winnings")] + BetWon, + #[msg("The bet amount must be greater than zero")] + ZeroAmount, + #[msg("This bettor already holds the maximum number of open positions")] + TooManyBets, + #[msg("This bet is not in the bettor's User index")] + BetNotInUserIndex, + #[msg("Arithmetic overflow")] + MathOverflow, + #[msg("Outcomes can only be added before any bets are placed")] + BettingAlreadyStarted, + #[msg("The event description is too long")] + DescriptionTooLong, + #[msg("The outcome label is too long")] + LabelTooLong, +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/add_outcome.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/add_outcome.rs new file mode 100644 index 000000000..0095688cd --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/add_outcome.rs @@ -0,0 +1,63 @@ +use anchor_lang::prelude::*; + +use crate::{error::BettingError, Config, Event, EventStatus, Outcome}; + +pub const MAX_LABEL_LEN: usize = 64; + +#[derive(Accounts)] +pub struct AddOutcomeAccountConstraints<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + )] + pub config: Account<'info, Config>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + init, + payer = admin, + space = Outcome::DISCRIMINATOR.len() + Outcome::INIT_SPACE, + seeds = [b"outcome", event.key().as_ref(), &[event.outcome_count]], + bump + )] + pub outcome: Account<'info, Outcome>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_add_outcome(context: Context, label: String) -> Result<()> { + require!(label.len() <= MAX_LABEL_LEN, BettingError::LabelTooLong); + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + // Lock the outcome set once betting starts so the field of choices can't + // change out from under existing bettors. + require!( + context.accounts.event.total_pool == 0, + BettingError::BettingAlreadyStarted + ); + + let index = context.accounts.event.outcome_count; + context.accounts.outcome.set_inner(Outcome { + event: context.accounts.event.key(), + index, + label, + total_amount: 0, + bet_count: 0, + bump: context.bumps.outcome, + }); + + context.accounts.event.outcome_count += 1; + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/cancel_event.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/cancel_event.rs new file mode 100644 index 000000000..2bec20497 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/cancel_event.rs @@ -0,0 +1,33 @@ +use anchor_lang::prelude::*; + +use crate::{error::BettingError, Config, Event, EventStatus}; + +// Abandon an event that can't be resolved (e.g. the real-world result is void). +// Bettors then reclaim their exact stakes via `claim_refund`; no fee is taken. +#[derive(Accounts)] +pub struct CancelEventAccountConstraints<'info> { + pub admin: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + )] + pub config: Account<'info, Config>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, +} + +pub fn handle_cancel_event(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + context.accounts.event.status = EventStatus::Cancelled; + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_refund.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_refund.rs new file mode 100644 index 000000000..c922d9cc6 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_refund.rs @@ -0,0 +1,88 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::{error::BettingError, Bet, Event, EventStatus, User}; + +use super::transfer_tokens_from_vault; + +#[derive(Accounts)] +pub struct ClaimRefundAccountConstraints<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + // Closing the Bet ends the position: the rent goes back to the bettor and + // a second refund fails because the account no longer exists. + #[account( + mut, + close = bettor, + has_one = bettor, + has_one = event, + seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], + bump = bet.bump, + )] + pub bet: Account<'info, Bet>, + + #[account( + mut, + seeds = [b"user", bettor.key().as_ref()], + bump = user.bump, + )] + pub user: Account<'info, User>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = bettor, + associated_token::token_program = token_program, + )] + pub bettor_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handle_claim_refund(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Cancelled, + BettingError::EventNotCancelled + ); + + let stake = context.accounts.bet.amount; + + // The position is over, so drop the Bet from the bettor's index before the + // transfer (effects before interactions); the Bet account itself closes + // when the instruction finishes. + let bet_key = context.accounts.bet.key(); + context.accounts.user.remove_bet(&bet_key)?; + + let event_id = context.accounts.event.event_id; + let event_bump = context.accounts.event.bump; + transfer_tokens_from_vault( + &context.accounts.vault, + &context.accounts.bettor_token_account, + stake, + &context.accounts.token_mint, + &context.accounts.event.to_account_info(), + &context.accounts.token_program, + event_id, + event_bump, + )?; + + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_winnings.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_winnings.rs new file mode 100644 index 000000000..912945d0d --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/claim_winnings.rs @@ -0,0 +1,113 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::{error::BettingError, Bet, Event, EventStatus, User}; + +use super::transfer_tokens_from_vault; + +#[derive(Accounts)] +pub struct ClaimWinningsAccountConstraints<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + // Closing the Bet ends the position: the rent goes back to the bettor and + // a second claim fails because the account no longer exists. + #[account( + mut, + close = bettor, + has_one = bettor, + has_one = event, + seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], + bump = bet.bump, + )] + pub bet: Account<'info, Bet>, + + #[account( + mut, + seeds = [b"user", bettor.key().as_ref()], + bump = user.bump, + )] + pub user: Account<'info, User>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = bettor, + associated_token::token_program = token_program, + )] + pub bettor_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handle_claim_winnings(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Settled, + BettingError::EventNotSettled + ); + require!( + context.accounts.bet.outcome_index == context.accounts.event.winning_outcome_index, + BettingError::NothingToClaim + ); + + let stake = context.accounts.bet.amount; + // Total staked on the winning outcome, and the losers' stakes after the fee. + let winning_pool = context.accounts.event.winning_pool; + let distributable_losing_pool = context.accounts.event.distributable_losing_pool; + + // Parimutuel split: winners share the losing pool in proportion to their + // own stake. Work in u128 and divide once, after the multiply, so the + // result is floored a single time - dividing first would throw away + // precision. The floor leaves at most a few minor units of dust in the vault. + let losing_pool_share_numerator = (stake as u128) + .checked_mul(distributable_losing_pool as u128) + .ok_or(BettingError::MathOverflow)?; + let winnings: u64 = losing_pool_share_numerator + .checked_div(winning_pool as u128) + .ok_or(BettingError::MathOverflow)? + .try_into() + .map_err(|_| BettingError::MathOverflow)?; + + // Winners always get their own stake back on top of their winnings. + let payout = stake + .checked_add(winnings) + .ok_or(BettingError::MathOverflow)?; + + // The position is over, so drop the Bet from the bettor's index before the + // transfer (effects before interactions); the Bet account itself closes + // when the instruction finishes. + let bet_key = context.accounts.bet.key(); + context.accounts.user.remove_bet(&bet_key)?; + + let event_id = context.accounts.event.event_id; + let event_bump = context.accounts.event.bump; + transfer_tokens_from_vault( + &context.accounts.vault, + &context.accounts.bettor_token_account, + payout, + &context.accounts.token_mint, + &context.accounts.event.to_account_info(), + &context.accounts.token_program, + event_id, + event_bump, + )?; + + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/close_losing_bet.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/close_losing_bet.rs new file mode 100644 index 000000000..ed533dddc --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/close_losing_bet.rs @@ -0,0 +1,51 @@ +use anchor_lang::prelude::*; + +use crate::{error::BettingError, Bet, Event, EventStatus, User}; + +// A losing bet pays nothing, but it still occupies a slot in the bettor's +// User index and holds rent. Closing it frees the slot (so the bettor can +// open a new position) and returns the rent. Winning bets must go through +// claim_winnings instead, which also pays out the stake and winnings. +#[derive(Accounts)] +pub struct CloseLosingBetAccountConstraints<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account( + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + mut, + close = bettor, + has_one = bettor, + has_one = event, + seeds = [b"bet", bet.outcome.as_ref(), bettor.key().as_ref()], + bump = bet.bump, + )] + pub bet: Account<'info, Bet>, + + #[account( + mut, + seeds = [b"user", bettor.key().as_ref()], + bump = user.bump, + )] + pub user: Account<'info, User>, +} + +pub fn handle_close_losing_bet(context: Context) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Settled, + BettingError::EventNotSettled + ); + require!( + context.accounts.bet.outcome_index != context.accounts.event.winning_outcome_index, + BettingError::BetWon + ); + + let bet_key = context.accounts.bet.key(); + context.accounts.user.remove_bet(&bet_key)?; + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_config.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_config.rs new file mode 100644 index 000000000..ed66deafe --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_config.rs @@ -0,0 +1,45 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenInterface}; + +use crate::{error::BettingError, Config}; + +pub const MAX_FEE_BPS: u16 = 10_000; + +#[derive(Accounts)] +pub struct InitializeConfigAccountConstraints<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = admin, + space = Config::DISCRIMINATOR.len() + Config::INIT_SPACE, + seeds = [b"config"], + bump + )] + pub config: Account<'info, Config>, + + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_config( + context: Context, + fee_bps: u16, + fee_recipient: Pubkey, +) -> Result<()> { + require!(fee_bps <= MAX_FEE_BPS, BettingError::FeeTooHigh); + + context.accounts.config.set_inner(Config { + admin: context.accounts.admin.key(), + token_mint: context.accounts.token_mint.key(), + fee_recipient, + fee_bps, + event_count: 0, + bump: context.bumps.config, + }); + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_event.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_event.rs new file mode 100644 index 000000000..1e90e885a --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/initialize_event.rs @@ -0,0 +1,78 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{error::BettingError, Config, Event, EventStatus}; + +pub const MAX_DESCRIPTION_LEN: usize = 200; + +#[derive(Accounts)] +#[instruction(event_id: u64)] +pub struct InitializeEventAccountConstraints<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account( + mut, + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + has_one = token_mint, + )] + pub config: Account<'info, Config>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = admin, + space = Event::DISCRIMINATOR.len() + Event::INIT_SPACE, + seeds = [b"event", event_id.to_le_bytes().as_ref()], + bump + )] + pub event: Account<'info, Event>, + + // The single pool for the whole market: an ATA owned by the Event PDA. + #[account( + init, + payer = admin, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_event( + context: Context, + event_id: u64, + description: String, +) -> Result<()> { + require!( + description.len() <= MAX_DESCRIPTION_LEN, + BettingError::DescriptionTooLong + ); + + context.accounts.event.set_inner(Event { + event_id, + description, + outcome_count: 0, + total_pool: 0, + status: EventStatus::Open, + fee_bps: context.accounts.config.fee_bps, + winning_outcome_index: 0, + winning_pool: 0, + distributable_losing_pool: 0, + bump: context.bumps.event, + }); + + context.accounts.config.event_count += 1; + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/mod.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/mod.rs new file mode 100644 index 000000000..29a4a92a8 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/mod.rs @@ -0,0 +1,21 @@ +pub mod add_outcome; +pub mod cancel_event; +pub mod claim_refund; +pub mod claim_winnings; +pub mod close_losing_bet; +pub mod initialize_event; +pub mod initialize_config; +pub mod place_bet; +pub mod settle_event; +pub mod shared; + +pub use add_outcome::*; +pub use cancel_event::*; +pub use claim_refund::*; +pub use claim_winnings::*; +pub use close_losing_bet::*; +pub use initialize_event::*; +pub use initialize_config::*; +pub use place_bet::*; +pub use settle_event::*; +pub use shared::*; diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/place_bet.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/place_bet.rs new file mode 100644 index 000000000..b7043e6f0 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/place_bet.rs @@ -0,0 +1,154 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + error::BettingError, Bet, Config, Event, EventStatus, Outcome, User, MAX_BETS_PER_USER, +}; + +use super::transfer_tokens_to_vault; + +#[derive(Accounts)] +pub struct PlaceBetAccountConstraints<'info> { + #[account(mut)] + pub bettor: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = token_mint, + )] + pub config: Account<'info, Config>, + + #[account(mint::token_program = token_program)] + pub token_mint: Box>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Box>, + + #[account( + mut, + has_one = event, + seeds = [b"outcome", event.key().as_ref(), &[outcome.index]], + bump = outcome.bump, + )] + pub outcome: Box>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = bettor, + associated_token::token_program = token_program, + )] + pub bettor_token_account: Box>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: Box>, + + #[account( + init_if_needed, + payer = bettor, + space = Bet::DISCRIMINATOR.len() + Bet::INIT_SPACE, + seeds = [b"bet", outcome.key().as_ref(), bettor.key().as_ref()], + bump + )] + pub bet: Box>, + + #[account( + init_if_needed, + payer = bettor, + space = User::DISCRIMINATOR.len() + User::INIT_SPACE, + seeds = [b"user", bettor.key().as_ref()], + bump + )] + pub user: Box>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_place_bet(context: Context, amount: u64) -> Result<()> { + require!(amount > 0, BettingError::ZeroAmount); + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + + transfer_tokens_to_vault( + &context.accounts.bettor_token_account, + &context.accounts.vault, + amount, + &context.accounts.token_mint, + &context.accounts.bettor, + &context.accounts.token_program, + )?; + + let bettor_key = context.accounts.bettor.key(); + let event_key = context.accounts.event.key(); + let outcome_key = context.accounts.outcome.key(); + let outcome_index = context.accounts.outcome.index; + let bet_key = context.accounts.bet.key(); + let bet_bump = context.bumps.bet; + let user_bump = context.bumps.user; + + let bet = &mut context.accounts.bet; + // A fresh init_if_needed Bet has amount 0; that is how we tell a first bet + // on this outcome from a top-up, and it gates the per-outcome bookkeeping. + let is_new_bet = bet.amount == 0; + if is_new_bet { + bet.bettor = bettor_key; + bet.event = event_key; + bet.outcome = outcome_key; + bet.outcome_index = outcome_index; + bet.bump = bet_bump; + } + bet.amount = bet + .amount + .checked_add(amount) + .ok_or(BettingError::MathOverflow)?; + + let outcome = &mut context.accounts.outcome; + outcome.total_amount = outcome + .total_amount + .checked_add(amount) + .ok_or(BettingError::MathOverflow)?; + if is_new_bet { + outcome.bet_count = outcome + .bet_count + .checked_add(1) + .ok_or(BettingError::MathOverflow)?; + } + + let event = &mut context.accounts.event; + event.total_pool = event + .total_pool + .checked_add(amount) + .ok_or(BettingError::MathOverflow)?; + + let user = &mut context.accounts.user; + if user.authority == Pubkey::default() { + user.authority = bettor_key; + user.bump = user_bump; + } + if is_new_bet { + require!( + user.bets.len() < MAX_BETS_PER_USER, + BettingError::TooManyBets + ); + user.bets.push(bet_key); + } + + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/settle_event.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/settle_event.rs new file mode 100644 index 000000000..debfae8e7 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/settle_event.rs @@ -0,0 +1,113 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{error::BettingError, Config, Event, EventStatus, Outcome}; + +use super::transfer_tokens_from_vault; + +const BPS_DENOMINATOR: u128 = 10_000; + +#[derive(Accounts)] +#[instruction(winning_outcome_index: u8)] +pub struct SettleEventAccountConstraints<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = admin @ BettingError::Unauthorized, + has_one = token_mint, + has_one = fee_recipient, + )] + pub config: Account<'info, Config>, + + #[account(mint::token_program = token_program)] + pub token_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [b"event", event.event_id.to_le_bytes().as_ref()], + bump = event.bump, + )] + pub event: Account<'info, Event>, + + #[account( + has_one = event, + seeds = [b"outcome", event.key().as_ref(), &[winning_outcome_index]], + bump = winning_outcome.bump, + )] + pub winning_outcome: Account<'info, Outcome>, + + #[account( + mut, + associated_token::mint = token_mint, + associated_token::authority = event, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + /// CHECK: validated against config.fee_recipient by the `has_one` above. + pub fee_recipient: UncheckedAccount<'info>, + + #[account( + init_if_needed, + payer = admin, + associated_token::mint = token_mint, + associated_token::authority = fee_recipient, + associated_token::token_program = token_program, + )] + pub fee_recipient_token_account: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_settle_event( + context: Context, + winning_outcome_index: u8, +) -> Result<()> { + require!( + context.accounts.event.status == EventStatus::Open, + BettingError::EventNotOpen + ); + require!( + context.accounts.winning_outcome.total_amount > 0, + BettingError::OutcomeHasNoBets + ); + + let winning_pool = context.accounts.winning_outcome.total_amount; + let total_pool = context.accounts.event.total_pool; + let losing_pool = total_pool - winning_pool; + + // Winners always get their own stake back; the fee is only ever charged on + // the losing side, so a winner can never receive less than they staked. + let fee = (losing_pool as u128 * context.accounts.event.fee_bps as u128 / BPS_DENOMINATOR) as u64; + let distributable_losing_pool = losing_pool - fee; + + if fee > 0 { + let event_id = context.accounts.event.event_id; + let event_bump = context.accounts.event.bump; + transfer_tokens_from_vault( + &context.accounts.vault, + &context.accounts.fee_recipient_token_account, + fee, + &context.accounts.token_mint, + &context.accounts.event.to_account_info(), + &context.accounts.token_program, + event_id, + event_bump, + )?; + } + + let event = &mut context.accounts.event; + event.status = EventStatus::Settled; + event.winning_outcome_index = winning_outcome_index; + event.winning_pool = winning_pool; + event.distributable_losing_pool = distributable_losing_pool; + Ok(()) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/shared.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/shared.rs new file mode 100644 index 000000000..8a6668912 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/instructions/shared.rs @@ -0,0 +1,55 @@ +use anchor_lang::prelude::*; + +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +// Move tokens from a wallet-owned account into the vault. The authority is a +// plain Signer (the bettor), so no PDA seeds are needed. +pub fn transfer_tokens_to_vault<'info>( + from: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: u64, + mint: &InterfaceAccount<'info, Mint>, + authority: &Signer<'info>, + token_program: &Interface<'info, TokenInterface>, +) -> Result<()> { + let transfer_accounts = TransferChecked { + from: from.to_account_info(), + mint: mint.to_account_info(), + to: to.to_account_info(), + authority: authority.to_account_info(), + }; + let cpi_context = CpiContext::new(token_program.key(), transfer_accounts); + transfer_checked(cpi_context, amount, mint.decimals) +} + +// Move tokens out of the vault, signed by the Event PDA. The event vault's +// authority is the Event account, so the program signs with the event's seeds. +pub fn transfer_tokens_from_vault<'info>( + vault: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: u64, + mint: &InterfaceAccount<'info, Mint>, + event: &AccountInfo<'info>, + token_program: &Interface<'info, TokenInterface>, + event_id: u64, + event_bump: u8, +) -> Result<()> { + let event_id_bytes = event_id.to_le_bytes(); + let seeds = &[b"event".as_ref(), event_id_bytes.as_ref(), &[event_bump]]; + let signer_seeds = [&seeds[..]]; + + let transfer_accounts = TransferChecked { + from: vault.to_account_info(), + mint: mint.to_account_info(), + to: to.to_account_info(), + authority: event.clone(), + }; + let cpi_context = CpiContext::new_with_signer( + token_program.key(), + transfer_accounts, + &signer_seeds, + ); + transfer_checked(cpi_context, amount, mint.decimals) +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/lib.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/lib.rs new file mode 100644 index 000000000..731546e4c --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/lib.rs @@ -0,0 +1,73 @@ +pub mod error; +pub mod instructions; +pub mod state; + +use anchor_lang::prelude::*; + +pub use instructions::*; +pub use state::*; + +declare_id!("7LyqAeLR3mK9dfj9LqxWzfKH61VVHzuNpkgW5Y32De74"); + +#[program] +pub mod betting_market { + use super::*; + + // One-time setup: the signer becomes the admin and fixes the stake token and + // the settlement fee (basis points) for every market in this deployment. + pub fn initialize_config( + context: Context, + fee_bps: u16, + fee_recipient: Pubkey, + ) -> Result<()> { + instructions::initialize_config::handle_initialize_config(context, fee_bps, fee_recipient) + } + + // Admin opens a new market and creates its pool vault. + pub fn initialize_event( + context: Context, + event_id: u64, + description: String, + ) -> Result<()> { + instructions::initialize_event::handle_initialize_event(context, event_id, description) + } + + // Admin adds a possible result. Only allowed before betting starts. + pub fn add_outcome(context: Context, label: String) -> Result<()> { + instructions::add_outcome::handle_add_outcome(context, label) + } + + // A bettor stakes tokens on one outcome. The stake joins the event's pool. + pub fn place_bet(context: Context, amount: u64) -> Result<()> { + instructions::place_bet::handle_place_bet(context, amount) + } + + // Admin resolves the market: takes the fee from the losing pool and records + // the figures winners need to claim their share. + pub fn settle_event(context: Context, winning_outcome_index: u8) -> Result<()> { + instructions::settle_event::handle_settle_event(context, winning_outcome_index) + } + + // A winner withdraws their stake plus their pro-rata share of the losing + // pool. The Bet account closes and leaves the bettor's User index. + pub fn claim_winnings(context: Context) -> Result<()> { + instructions::claim_winnings::handle_claim_winnings(context) + } + + // A loser closes their worthless bet after settlement, reclaiming the + // Bet account's rent and freeing the slot in their User index. + pub fn close_losing_bet(context: Context) -> Result<()> { + instructions::close_losing_bet::handle_close_losing_bet(context) + } + + // Admin voids an unresolved market so bettors can be made whole. + pub fn cancel_event(context: Context) -> Result<()> { + instructions::cancel_event::handle_cancel_event(context) + } + + // After a cancellation, a bettor reclaims their exact stake. The Bet + // account closes and leaves the bettor's User index. + pub fn claim_refund(context: Context) -> Result<()> { + instructions::claim_refund::handle_claim_refund(context) + } +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/state/bet.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/state/bet.rs new file mode 100644 index 000000000..65330d78f --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/state/bet.rs @@ -0,0 +1,17 @@ +use anchor_lang::prelude::*; + +// A single bettor's total stake on one outcome. Re-betting the same outcome +// adds to `amount` rather than creating a second account, so there is exactly +// one Bet per (outcome, bettor). The account lives only while the position is +// open: it closes (rent back to the bettor) on claim_winnings, claim_refund, +// or close_losing_bet, which is also what prevents double claims. +#[account] +#[derive(InitSpace)] +pub struct Bet { + pub bettor: Pubkey, + pub event: Pubkey, + pub outcome: Pubkey, + pub outcome_index: u8, + pub amount: u64, + pub bump: u8, +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/state/config.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/state/config.rs new file mode 100644 index 000000000..03cbcfb18 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/state/config.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +// The global, single Config account. Its `admin` is the only key allowed to +// create events, add outcomes, settle, and cancel. `token_mint` fixes the one +// asset every market in this deployment accepts as a stake. +#[account] +#[derive(InitSpace)] +pub struct Config { + pub admin: Pubkey, + pub token_mint: Pubkey, + pub fee_recipient: Pubkey, + // Protocol fee, in basis points, taken from the losing pool at settlement. + pub fee_bps: u16, + pub event_count: u64, + pub bump: u8, +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/state/event.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/state/event.rs new file mode 100644 index 000000000..b88e89180 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/state/event.rs @@ -0,0 +1,34 @@ +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq, InitSpace)] +pub enum EventStatus { + // Accepting bets. + Open, + // Resolved to a winning outcome; winners may claim. + Settled, + // Abandoned; bettors may reclaim their exact stake. + Cancelled, +} + +// One betting market. All stakes across every outcome live in a single vault +// token account whose authority is this Event PDA, so the program signs payouts +// with the event's seeds. +#[account] +#[derive(InitSpace)] +pub struct Event { + pub event_id: u64, + #[max_len(200)] + pub description: String, + pub outcome_count: u8, + // Sum of every stake placed across all outcomes. + pub total_pool: u64, + pub status: EventStatus, + // Fee snapshot taken at creation, so later Config changes can't alter a + // market that bettors have already joined. + pub fee_bps: u16, + // Fields below are written at settlement and read at claim time. + pub winning_outcome_index: u8, + pub winning_pool: u64, + pub distributable_losing_pool: u64, + pub bump: u8, +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/state/mod.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/state/mod.rs new file mode 100644 index 000000000..7d3f7a611 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/state/mod.rs @@ -0,0 +1,11 @@ +pub mod bet; +pub mod config; +pub mod event; +pub mod outcome; +pub mod user; + +pub use bet::*; +pub use config::*; +pub use event::*; +pub use outcome::*; +pub use user::*; diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/state/outcome.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/state/outcome.rs new file mode 100644 index 000000000..de817e540 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/state/outcome.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +// One possible result of an event (e.g. "Yes", "Team A wins"). `total_amount` +// is this outcome's share of the pool and is the denominator for pro-rata +// payouts when this outcome wins. +#[account] +#[derive(InitSpace)] +pub struct Outcome { + pub event: Pubkey, + pub index: u8, + #[max_len(64)] + pub label: String, + pub total_amount: u64, + pub bet_count: u64, + pub bump: u8, +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/src/state/user.rs b/finance/betting-market/anchor-v1/programs/betting-market/src/state/user.rs new file mode 100644 index 000000000..44e41b0f8 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/src/state/user.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; + +use crate::error::BettingError; + +// A bettor can hold at most this many OPEN positions at once (one per outcome +// they currently back). Re-betting an outcome adds to the existing Bet, and +// closing a Bet (claim_winnings, claim_refund, close_losing_bet) removes its +// entry, so this caps concurrent positions, not lifetime bets. A fixed cap +// keeps the account a constant size - no reallocation on each bet. +pub const MAX_BETS_PER_USER: usize = 32; + +// Per-wallet index of a bettor's open Bet accounts, so a client can list +// someone's positions without scanning every Bet account on the program. The +// authoritative stake state lives in the Bet accounts; this is a convenience +// index. Entries are added by place_bet and removed whenever the Bet account +// closes. +#[account] +#[derive(InitSpace)] +pub struct User { + pub authority: Pubkey, + #[max_len(MAX_BETS_PER_USER)] + pub bets: Vec, + pub bump: u8, +} + +impl User { + // Drop a closed Bet's entry from the index. Order is not meaningful, so a + // swap_remove (move the last entry into the gap) is the cheapest removal. + pub fn remove_bet(&mut self, bet_key: &Pubkey) -> Result<()> { + let index = self + .bets + .iter() + .position(|entry| entry == bet_key) + .ok_or(BettingError::BetNotInUserIndex)?; + self.bets.swap_remove(index); + Ok(()) + } +} diff --git a/finance/betting-market/anchor-v1/programs/betting-market/tests/test_betting_market.rs b/finance/betting-market/anchor-v1/programs/betting-market/tests/test_betting_market.rs new file mode 100644 index 000000000..8390c93f0 --- /dev/null +++ b/finance/betting-market/anchor-v1/programs/betting-market/tests/test_betting_market.rs @@ -0,0 +1,894 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + AccountDeserialize, InstructionData, ToAccountMetas, + }, + betting_market::{User, MAX_BETS_PER_USER}, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +const DECIMALS: u8 = 6; +const FEE_BPS: u16 = 200; // 2% + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ) + .0 +} + +fn config_pda() -> Pubkey { + Pubkey::find_program_address(&[b"config"], &betting_market::id()).0 +} + +fn event_pda(event_id: u64) -> Pubkey { + Pubkey::find_program_address(&[b"event", &event_id.to_le_bytes()], &betting_market::id()).0 +} + +fn outcome_pda(event: &Pubkey, index: u8) -> Pubkey { + Pubkey::find_program_address(&[b"outcome", event.as_ref(), &[index]], &betting_market::id()).0 +} + +fn bet_pda(outcome: &Pubkey, bettor: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"bet", outcome.as_ref(), bettor.as_ref()], &betting_market::id()) + .0 +} + +fn user_pda(bettor: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"user", bettor.as_ref()], &betting_market::id()).0 +} + +struct Market { + svm: LiteSVM, + admin: Keypair, + mint: Pubkey, + fee_recipient: Keypair, + fee_recipient_ata: Pubkey, +} + +// Spin up the SVM with the program loaded, an admin wallet, the stake-token mint +// (admin is the mint authority), and a fee-recipient wallet with an ATA. +fn setup() -> Market { + let mut svm = LiteSVM::new(); + let program_bytes = include_bytes!("../../../target/deploy/betting_market.so"); + svm.add_program(betting_market::id(), program_bytes).unwrap(); + + let admin = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let mint = create_token_mint(&mut svm, &admin, DECIMALS, None).unwrap(); + + let fee_recipient = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let fee_recipient_ata = + create_associated_token_account(&mut svm, &fee_recipient.pubkey(), &mint, &admin).unwrap(); + + Market { + svm, + admin, + mint, + fee_recipient, + fee_recipient_ata, + } +} + +// Create a funded bettor with a token ATA holding `amount` of the stake token. +fn create_bettor(market: &mut Market, amount: u64) -> (Keypair, Pubkey) { + let bettor = create_wallet(&mut market.svm, 10_000_000_000).unwrap(); + let ata = create_associated_token_account( + &mut market.svm, + &bettor.pubkey(), + &market.mint, + &market.admin, + ) + .unwrap(); + mint_tokens_to_token_account(&mut market.svm, &market.mint, &ata, amount, &market.admin) + .unwrap(); + (bettor, ata) +} + +fn initialize_config_ix(admin: Pubkey, mint: Pubkey, fee_recipient: Pubkey) -> Instruction { + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::InitializeConfig { + fee_bps: FEE_BPS, + fee_recipient, + } + .data(), + betting_market::accounts::InitializeConfigAccountConstraints { + admin, + token_mint: mint, + config: config_pda(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn initialize_event_ix(admin: Pubkey, mint: Pubkey, event_id: u64, description: &str) -> Instruction { + let event = event_pda(event_id); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::InitializeEvent { + event_id, + description: description.to_string(), + } + .data(), + betting_market::accounts::InitializeEventAccountConstraints { + admin, + config: config_pda(), + token_mint: mint, + event, + vault: derive_ata(&event, &mint), + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn add_outcome_ix(admin: Pubkey, event_id: u64, index: u8, label: &str) -> Instruction { + let event = event_pda(event_id); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::AddOutcome { + label: label.to_string(), + } + .data(), + betting_market::accounts::AddOutcomeAccountConstraints { + admin, + config: config_pda(), + event, + outcome: outcome_pda(&event, index), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn place_bet_ix( + mint: Pubkey, + bettor: &Pubkey, + bettor_ata: &Pubkey, + event_id: u64, + outcome_index: u8, + amount: u64, +) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::PlaceBet { amount }.data(), + betting_market::accounts::PlaceBetAccountConstraints { + bettor: *bettor, + config: config_pda(), + token_mint: mint, + event, + outcome, + bettor_token_account: *bettor_ata, + vault: derive_ata(&event, &mint), + bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn settle_event_ix( + admin: Pubkey, + mint: Pubkey, + fee_recipient: Pubkey, + fee_recipient_ata: Pubkey, + event_id: u64, + winning_outcome_index: u8, +) -> Instruction { + let event = event_pda(event_id); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::SettleEvent { + winning_outcome_index, + } + .data(), + betting_market::accounts::SettleEventAccountConstraints { + admin, + config: config_pda(), + token_mint: mint, + event, + winning_outcome: outcome_pda(&event, winning_outcome_index), + vault: derive_ata(&event, &mint), + fee_recipient, + fee_recipient_token_account: fee_recipient_ata, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn claim_winnings_ix( + mint: Pubkey, + bettor: &Pubkey, + bettor_ata: &Pubkey, + event_id: u64, + outcome_index: u8, +) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::ClaimWinnings {}.data(), + betting_market::accounts::ClaimWinningsAccountConstraints { + bettor: *bettor, + token_mint: mint, + event, + bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), + bettor_token_account: *bettor_ata, + vault: derive_ata(&event, &mint), + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +fn cancel_event_ix(admin: Pubkey, event_id: u64) -> Instruction { + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::CancelEvent {}.data(), + betting_market::accounts::CancelEventAccountConstraints { + admin, + config: config_pda(), + event: event_pda(event_id), + } + .to_account_metas(None), + ) +} + +fn claim_refund_ix( + mint: Pubkey, + bettor: &Pubkey, + bettor_ata: &Pubkey, + event_id: u64, + outcome_index: u8, +) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::ClaimRefund {}.data(), + betting_market::accounts::ClaimRefundAccountConstraints { + bettor: *bettor, + token_mint: mint, + event, + bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), + bettor_token_account: *bettor_ata, + vault: derive_ata(&event, &mint), + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +fn close_losing_bet_ix(bettor: &Pubkey, event_id: u64, outcome_index: u8) -> Instruction { + let event = event_pda(event_id); + let outcome = outcome_pda(&event, outcome_index); + Instruction::new_with_bytes( + betting_market::id(), + &betting_market::instruction::CloseLosingBet {}.data(), + betting_market::accounts::CloseLosingBetAccountConstraints { + bettor: *bettor, + event, + bet: bet_pda(&outcome, bettor), + user: user_pda(bettor), + } + .to_account_metas(None), + ) +} + +// Decode a User account so tests can assert exactly which Bet addresses the +// per-wallet index currently holds. +fn read_user_bets(market: &Market, bettor: &Pubkey) -> Vec { + let account = market.svm.get_account(&user_pda(bettor)).unwrap(); + User::try_deserialize(&mut account.data.as_slice()) + .unwrap() + .bets +} + +fn init_config(market: &mut Market) { + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + send_transaction_from_instructions( + &mut market.svm, + vec![initialize_config_ix(admin, mint, fee_recipient)], + &[&market.admin], + &admin, + ) + .unwrap(); +} + +#[test] +fn test_full_lifecycle() { + let mut market = setup(); + let event_id: u64 = 1; + + // Stakes chosen so the pro-rata split divides evenly (no dust): + // Yes pool 400 (Alice 100 + Bob 300), No pool 200 (Carol). Yes wins. + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (bob, bob_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + + let admin = market.admin.pubkey(); + let mint = market.mint; + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, event_id, "Will it rain tomorrow?"), + add_outcome_ix(admin, event_id, 0, "Yes"), + add_outcome_ix(admin, event_id, 1, "No"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &bob.pubkey(), &bob_ata, event_id, 0, 300)], + &[&bob], + &bob.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 200)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + // Vault holds the entire pool. + let vault = derive_ata(&event_pda(event_id), &mint); + assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 600); + assert_eq!( + read_user_bets(&market, &alice.pubkey()), + vec![bet_pda(&outcome_pda(&event_pda(event_id), 0), &alice.pubkey())] + ); + + // Settle to "Yes" (index 0). Losing pool 200, fee = 2% = 4, distributable = 196. + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + assert_eq!( + get_token_account_balance(&market.svm, &fee_recipient_ata).unwrap(), + 4 + ); + + // Alice: 100 + 100*196/400 = 149. Bob: 300 + 300*196/400 = 447. + send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &bob.pubkey(), &bob_ata, event_id, 0)], + &[&bob], + &bob.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&market.svm, &alice_ata).unwrap(), + 1_000 - 100 + 149 + ); + assert_eq!( + get_token_account_balance(&market.svm, &bob_ata).unwrap(), + 1_000 - 300 + 447 + ); + // Pool fully distributed: 400 stakes + 196 winnings + 4 fee = 600. + assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 0); + + // Claiming closed the winners' Bet accounts and emptied their indexes. + assert!(read_user_bets(&market, &alice.pubkey()).is_empty()); + assert!(read_user_bets(&market, &bob.pubkey()).is_empty()); + + // Carol bet the losing outcome, so she has nothing to claim. + let carol_claim = send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1)], + &[&carol], + &carol.pubkey(), + ); + assert!(carol_claim.is_err(), "loser must not be able to claim winnings"); + + // Her losing position stays in the index until she closes it. + let carol_bet = bet_pda(&outcome_pda(&event_pda(event_id), 1), &carol.pubkey()); + assert_eq!(read_user_bets(&market, &carol.pubkey()), vec![carol_bet]); + send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&carol.pubkey(), event_id, 1)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + assert!(read_user_bets(&market, &carol.pubkey()).is_empty()); +} + +#[test] +fn test_only_admin_can_initialize_event() { + let mut market = setup(); + init_config(&mut market); + + let mint = market.mint; + let mallory = create_wallet(&mut market.svm, 10_000_000_000).unwrap(); + let result = send_transaction_from_instructions( + &mut market.svm, + vec![initialize_event_ix(mallory.pubkey(), mint, 7, "Unauthorized event")], + &[&mallory], + &mallory.pubkey(), + ); + assert!(result.is_err(), "non-admin must not create an event"); +} + +#[test] +fn test_cannot_bet_after_settle() { + let mut market = setup(); + let event_id: u64 = 2; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (bob, bob_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, event_id, "Coin flip"), + add_outcome_ix(admin, event_id, 0, "Heads"), + add_outcome_ix(admin, event_id, 1, "Tails"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + + let late_bet = send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &bob.pubkey(), &bob_ata, event_id, 1, 100)], + &[&bob], + &bob.pubkey(), + ); + assert!(late_bet.is_err(), "betting after settlement must fail"); +} + +#[test] +fn test_double_claim_fails() { + let mut market = setup(); + let event_id: u64 = 3; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, event_id, "Match winner"), + add_outcome_ix(admin, event_id, 0, "Home"), + add_outcome_ix(admin, event_id, 1, "Away"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 100)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + // A fresh blockhash so the second claim is a distinct transaction. + market.svm.expire_blockhash(); + let second = send_transaction_from_instructions( + &mut market.svm, + vec![claim_winnings_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ); + assert!(second.is_err(), "claiming the same bet twice must fail"); +} + +#[test] +fn test_settle_outcome_without_bets_fails() { + let mut market = setup(); + let event_id: u64 = 4; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, event_id, "Two horse race"), + add_outcome_ix(admin, event_id, 0, "Horse A"), + add_outcome_ix(admin, event_id, 1, "Horse B"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + // Everyone bets Horse A; Horse B has no bets. + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + + let result = send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 1)], + &[&market.admin], + &admin, + ); + assert!(result.is_err(), "settling to an outcome with no bets must fail"); +} + +#[test] +fn test_cancel_and_refund() { + let mut market = setup(); + let event_id: u64 = 5; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, event_id, "Voided event"), + add_outcome_ix(admin, event_id, 0, "A"), + add_outcome_ix(admin, event_id, 1, "B"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 250)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 750)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + send_transaction_from_instructions( + &mut market.svm, + vec![cancel_event_ix(admin, event_id)], + &[&market.admin], + &admin, + ) + .unwrap(); + + let alice_bet = bet_pda(&outcome_pda(&event_pda(event_id), 0), &alice.pubkey()); + assert_eq!(read_user_bets(&market, &alice.pubkey()), vec![alice_bet]); + + send_transaction_from_instructions( + &mut market.svm, + vec![claim_refund_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + + // The refund closed Alice's Bet account and removed it from her index. + assert!(read_user_bets(&market, &alice.pubkey()).is_empty()); + + send_transaction_from_instructions( + &mut market.svm, + vec![claim_refund_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + // Both bettors made whole; no fee on a cancelled event. + assert_eq!(get_token_account_balance(&market.svm, &alice_ata).unwrap(), 1_000); + assert_eq!(get_token_account_balance(&market.svm, &carol_ata).unwrap(), 1_000); + let vault = derive_ata(&event_pda(event_id), &mint); + assert_eq!(get_token_account_balance(&market.svm, &vault).unwrap(), 0); +} + +#[test] +fn test_close_losing_bet_only_after_settle_and_only_for_losers() { + let mut market = setup(); + let event_id: u64 = 6; + let (alice, alice_ata) = create_bettor(&mut market, 1_000); + let (carol, carol_ata) = create_bettor(&mut market, 1_000); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + let fee_recipient = market.fee_recipient.pubkey(); + let fee_recipient_ata = market.fee_recipient_ata; + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, event_id, "Derby winner"), + add_outcome_ix(admin, event_id, 0, "Red"), + add_outcome_ix(admin, event_id, 1, "Blue"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, event_id, 0, 100)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &carol.pubkey(), &carol_ata, event_id, 1, 100)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + + // The event is still open, so no position is a losing one yet. + let premature_close = send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&carol.pubkey(), event_id, 1)], + &[&carol], + &carol.pubkey(), + ); + assert!(premature_close.is_err(), "closing before settlement must fail"); + + send_transaction_from_instructions( + &mut market.svm, + vec![settle_event_ix(admin, mint, fee_recipient, fee_recipient_ata, event_id, 0)], + &[&market.admin], + &admin, + ) + .unwrap(); + + // Alice won; her bet must be closed via claim_winnings, not discarded. + let winner_close = send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&alice.pubkey(), event_id, 0)], + &[&alice], + &alice.pubkey(), + ); + assert!(winner_close.is_err(), "a winning bet must not be closed as losing"); + let alice_bet = bet_pda(&outcome_pda(&event_pda(event_id), 0), &alice.pubkey()); + assert_eq!(read_user_bets(&market, &alice.pubkey()), vec![alice_bet]); + + // Carol lost; closing frees her index slot. A fresh blockhash so this is + // a distinct transaction from her premature attempt above. + market.svm.expire_blockhash(); + send_transaction_from_instructions( + &mut market.svm, + vec![close_losing_bet_ix(&carol.pubkey(), event_id, 1)], + &[&carol], + &carol.pubkey(), + ) + .unwrap(); + assert!(read_user_bets(&market, &carol.pubkey()).is_empty()); +} + +// Regression test: closing a Bet must free its User index slot, so a wallet +// that fills all MAX_BETS_PER_USER slots can bet again after unwinding a +// position. Without the removal, a full index rejects every future bet on +// every market, permanently. +#[test] +fn test_closing_a_bet_frees_a_slot_for_a_new_bet() { + const STAKE: u64 = 10; + let mut market = setup(); + let full_event_id: u64 = 7; + let second_event_id: u64 = 8; + // Enough outcomes to fill the index and attempt one more bet. + let outcome_count = (MAX_BETS_PER_USER + 1) as u8; + let (alice, alice_ata) = create_bettor(&mut market, outcome_count as u64 * STAKE); + + init_config(&mut market); + let admin = market.admin.pubkey(); + let mint = market.mint; + + send_transaction_from_instructions( + &mut market.svm, + vec![initialize_event_ix(admin, mint, full_event_id, "Wide field")], + &[&market.admin], + &admin, + ) + .unwrap(); + for index in 0..outcome_count { + send_transaction_from_instructions( + &mut market.svm, + vec![add_outcome_ix(admin, full_event_id, index, &format!("Runner {index}"))], + &[&market.admin], + &admin, + ) + .unwrap(); + } + send_transaction_from_instructions( + &mut market.svm, + vec![ + initialize_event_ix(admin, mint, second_event_id, "Second market"), + add_outcome_ix(admin, second_event_id, 0, "Yes"), + add_outcome_ix(admin, second_event_id, 1, "No"), + ], + &[&market.admin], + &admin, + ) + .unwrap(); + + // Fill every slot in Alice's index. + for index in 0..MAX_BETS_PER_USER as u8 { + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, full_event_id, index, STAKE)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + } + assert_eq!(read_user_bets(&market, &alice.pubkey()).len(), MAX_BETS_PER_USER); + + // With the index full, any new position is rejected - on this event or another. + let one_too_many = send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix( + mint, + &alice.pubkey(), + &alice_ata, + full_event_id, + MAX_BETS_PER_USER as u8, + STAKE, + )], + &[&alice], + &alice.pubkey(), + ); + assert!(one_too_many.is_err(), "a full index must reject a new position"); + let other_market_bet = send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, second_event_id, 0, STAKE)], + &[&alice], + &alice.pubkey(), + ); + assert!(other_market_bet.is_err(), "a full index must reject bets on any market"); + + // Unwind one position: cancel the event and refund the first bet. + send_transaction_from_instructions( + &mut market.svm, + vec![cancel_event_ix(admin, full_event_id)], + &[&market.admin], + &admin, + ) + .unwrap(); + send_transaction_from_instructions( + &mut market.svm, + vec![claim_refund_ix(mint, &alice.pubkey(), &alice_ata, full_event_id, 0)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + let bets_after_refund = read_user_bets(&market, &alice.pubkey()); + assert_eq!(bets_after_refund.len(), MAX_BETS_PER_USER - 1); + let refunded_bet = bet_pda(&outcome_pda(&event_pda(full_event_id), 0), &alice.pubkey()); + assert!( + !bets_after_refund.contains(&refunded_bet), + "the refunded bet must leave the index" + ); + + // The freed slot lets the wallet bet again. A fresh blockhash so this is + // a distinct transaction from the rejected attempt above. + market.svm.expire_blockhash(); + send_transaction_from_instructions( + &mut market.svm, + vec![place_bet_ix(mint, &alice.pubkey(), &alice_ata, second_event_id, 0, STAKE)], + &[&alice], + &alice.pubkey(), + ) + .unwrap(); + let final_bets = read_user_bets(&market, &alice.pubkey()); + assert_eq!(final_bets.len(), MAX_BETS_PER_USER); + let new_bet = bet_pda(&outcome_pda(&event_pda(second_event_id), 0), &alice.pubkey()); + assert!(final_bets.contains(&new_bet), "the new position must appear in the index"); +} diff --git a/finance/betting-market/anchor/README.md b/finance/betting-market/anchor/README.md index 127b39f06..b8a22b84a 100644 --- a/finance/betting-market/anchor/README.md +++ b/finance/betting-market/anchor/README.md @@ -1,5 +1,11 @@ # Solana Betting Market (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + A parimutuel (pooled) betting market on Solana. An admin opens an **event**, adds the possible **outcomes**, and bettors stake a token on the outcome they think will win. Every stake across every outcome goes into one pool. When the admin settles the event to the winning outcome, the diff --git a/finance/escrow/anchor-v1/.gitignore b/finance/escrow/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/finance/escrow/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/finance/escrow/anchor-v1/.prettierignore b/finance/escrow/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/finance/escrow/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/finance/escrow/anchor-v1/Anchor.toml b/finance/escrow/anchor-v1/Anchor.toml new file mode 100644 index 000000000..6f0860d66 --- /dev/null +++ b/finance/escrow/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +escrow = "qbuMdeYxYJXBjU6C6qFKjZKjXmrU83eDQomHdrch826" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/finance/escrow/anchor-v1/CHANGELOG.md b/finance/escrow/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/finance/escrow/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/finance/escrow/anchor-v1/Cargo.toml b/finance/escrow/anchor-v1/Cargo.toml new file mode 100644 index 000000000..14a951cee --- /dev/null +++ b/finance/escrow/anchor-v1/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/escrow/anchor-v1/README.md b/finance/escrow/anchor-v1/README.md new file mode 100644 index 000000000..4ec671d19 --- /dev/null +++ b/finance/escrow/anchor-v1/README.md @@ -0,0 +1,70 @@ +# Solana Escrow (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +This Solana [program](https://solana.com/docs/terminology#program) is an **escrow** - it lets a **maker** swap a specific amount of one token for a desired amount of another token with a **taker**, atomically and without either party having to trust the other. + +For example: Alice offers 10 USDC and wants 100 WIF in return. The program holds Alice's USDC in a vault until someone delivers the WIF, then releases both sides in a single transaction. Neither party can take the other's tokens and run, and there is no spread or middleman fee on the swap. + +See also the [native](../native/) and [Quasar](../quasar/) variants of the same program. + +## Accounts and PDAs + +- **Offer**: a [PDA](https://solana.com/docs/terminology#program-derived-address-pda) with seeds `["offer", maker, id]` storing the offer `id`, the `maker`, the two mints (`token_mint_a` is what the maker offers, `token_mint_b` is what the maker wants), the `token_b_wanted_amount`, and the PDA `bump`. The `id` lets one maker keep multiple offers open at once. +- **Vault**: the offer PDA's associated token account for token A. It holds the maker's offered tokens while the offer is open; only the offer PDA can sign transfers out of it. + +The maker pays the rent for the offer account and the vault, and every path that closes them (`take_offer`, `cancel_offer`) refunds that rent to the maker. + +## Lifecycle + +A maker opens an offer with `make_offer`, passing the `id`, `token_a_offered_amount`, and `token_b_wanted_amount`. The maker signs and pays all rent. The handler creates the offer PDA and the vault, creates the maker's token-B associated token account if needed (paid by the maker, so the eventual taker never funds a maker-owned account), moves the offered token A into the vault with `transfer_checked`, and records the offer state. + +A taker settles the offer with `take_offer`. The taker signs. Anchor's constraints bind every account to the stored offer state (`has_one` on the maker and both mints, associated-token constraints on the vault and all token accounts, and the PDA seeds on the offer itself). The handler sends the wanted token B from the taker to the maker, releases the vault's token A to the taker signed by the offer PDA, and closes both the vault and the offer account back to the maker, who paid their rent. The taker's own token-A account is created on the fly if needed, paid by the taker. + +A maker abandons an offer with `cancel_offer`. Only the maker can call it; without it, an unwanted offer would lock the maker's tokens in the vault forever. The handler returns the vault's token A to the maker and closes the vault and offer accounts, refunding both rents to the maker. + +## Setup + +Prerequisites: Rust, the [Agave](https://docs.anza.xyz/) toolchain, and the Anchor v1 CLI. Build the program with: + +```bash +anchor build +``` + +(or `cargo build-sbf` from `programs/escrow/`). The tests load the resulting `target/deploy/escrow.so`. + +## Testing + +The tests are Rust integration tests running against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) (with [solana-kite](https://crates.io/crates/solana-kite) helpers). After building, run: + +```bash +cargo test +``` + +(`anchor test` runs the same command, per `Anchor.toml`.) The tests cover the make/take flow, the make/cancel flow, rejection of a non-maker cancel, token balances on every leg, and the rent refunds (the maker's lamports recover the offer and vault rent after both take and cancel). + +## FAQ + +### How does an escrow work on Solana? + +A Solana escrow is a program that holds a maker's tokens in a program-controlled vault until a taker delivers the tokens the maker asked for, then releases both sides in one atomic transaction. This example implements the whole lifecycle in three instruction handlers: `make_offer`, `take_offer`, and `cancel_offer`. + +### Is this a good first Solana finance program to learn? + +Yes. Escrow is the smallest complete finance program: one state PDA, one vault, three instruction handlers, and the atomic swap idea that underlies every onchain exchange. Start here before the [AMM](../../token-swap/anchor/), [order book](../../order-book/anchor/), and [lending](../../lending/anchor/) examples. + +### How do I run and test this escrow example? + +Build with `anchor build`, then run `cargo test`. The tests are Rust integration tests against [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm), so no local validator is needed. + +### How is this escrow program verified? + +Two ways: LiteSVM integration tests covering the make, take, and cancel flows, and [Kani](https://github.com/model-checking/kani) proofs in [`../kani-proofs/`](../kani-proofs/) that check the money-math invariants over all possible inputs, not just test cases. + +## Credit + +Based on [Dean Little's Anchor Escrow](https://github.com/deanmlittle/anchor-escrow-2024), restructured for teaching. diff --git a/finance/escrow/anchor-v1/programs/escrow/Cargo.toml b/finance/escrow/anchor-v1/programs/escrow/Cargo.toml new file mode 100644 index 000000000..47a3a726b --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "escrow" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "escrow" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"]} +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/escrow/anchor-v1/programs/escrow/Xargo.toml b/finance/escrow/anchor-v1/programs/escrow/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/escrow/anchor-v1/programs/escrow/src/error.rs b/finance/escrow/anchor-v1/programs/escrow/src/error.rs new file mode 100644 index 000000000..c37199a44 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/error.rs @@ -0,0 +1,7 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum ErrorCode { + #[msg("Custom error message")] + CustomError, +} diff --git a/finance/escrow/anchor-v1/programs/escrow/src/instructions/cancel_offer.rs b/finance/escrow/anchor-v1/programs/escrow/src/instructions/cancel_offer.rs new file mode 100644 index 000000000..c2cd0fb9b --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/instructions/cancel_offer.rs @@ -0,0 +1,83 @@ +use anchor_lang::prelude::*; + +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::Offer; + +use super::{close_token_account, transfer_tokens}; + +// Cancel an outstanding offer. Without this handler, an abandoned offer would +// keep the maker's token-A locked in the vault forever (and the offer +// account's rent unclaimed). The maker signs, the vault tokens flow back to +// the maker, and both the vault and the offer accounts are closed. +#[derive(Accounts)] +pub struct CancelOfferAccountConstraints<'info> { + #[account(mut)] + pub maker: Signer<'info>, + + pub token_mint_a: InterfaceAccount<'info, Mint>, + + #[account( + mut, + associated_token::mint = token_mint_a, + associated_token::authority = maker, + associated_token::token_program = token_program, + )] + pub maker_token_account_a: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + close = maker, + has_one = maker, + has_one = token_mint_a, + seeds = [b"offer", maker.key().as_ref(), offer.id.to_le_bytes().as_ref()], + bump = offer.bump, + )] + pub offer: Account<'info, Offer>, + + #[account( + mut, + associated_token::mint = token_mint_a, + associated_token::authority = offer, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_cancel_offer(context: Context) -> Result<()> { + let maker_key = context.accounts.maker.key(); + let id_bytes = context.accounts.offer.id.to_le_bytes(); + let bump = [context.accounts.offer.bump]; + let offer_seeds: &[&[u8]] = &[b"offer", maker_key.as_ref(), id_bytes.as_ref(), &bump]; + + // Move all tokens back from the vault to the maker. + transfer_tokens( + &context.accounts.vault, + &context.accounts.maker_token_account_a, + &context.accounts.vault.amount, + &context.accounts.token_mint_a, + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + )?; + + // Close the vault, sending its rent lamports back to the maker. + close_token_account( + &context.accounts.vault, + &context.accounts.maker.to_account_info(), + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + )?; + + // The offer account itself is closed by the `close = maker` constraint + // above, which refunds its rent to the maker. + Ok(()) +} diff --git a/finance/escrow/anchor-v1/programs/escrow/src/instructions/make_offer.rs b/finance/escrow/anchor-v1/programs/escrow/src/instructions/make_offer.rs new file mode 100644 index 000000000..cee614335 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/instructions/make_offer.rs @@ -0,0 +1,99 @@ +use anchor_lang::prelude::*; + +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::Offer; + +use super::transfer_tokens; + +// See https://www.anchor-lang.com/docs/references/account-constraints#instruction-attribute +#[derive(Accounts)] +#[instruction(id: u64)] +pub struct MakeOfferAccountConstraints<'info> { + #[account(mut)] + pub maker: Signer<'info>, + + #[account(mint::token_program = token_program)] + pub token_mint_a: InterfaceAccount<'info, Mint>, + + #[account(mint::token_program = token_program)] + pub token_mint_b: InterfaceAccount<'info, Mint>, + + #[account( + mut, + associated_token::mint = token_mint_a, + associated_token::authority = maker, + associated_token::token_program = token_program + )] + pub maker_token_account_a: InterfaceAccount<'info, TokenAccount>, + + // The maker's token-B ATA is initialized here, paid by the maker, so the + // rent burden lives with the party who chose to open the offer (take_offer + // requires this account to already exist). + #[account( + init_if_needed, + payer = maker, + associated_token::mint = token_mint_b, + associated_token::authority = maker, + associated_token::token_program = token_program + )] + pub maker_token_account_b: InterfaceAccount<'info, TokenAccount>, + + #[account( + init, + payer = maker, + space = Offer::DISCRIMINATOR.len() + Offer::INIT_SPACE, + seeds = [b"offer", maker.key().as_ref(), id.to_le_bytes().as_ref()], + bump + )] + pub offer: Account<'info, Offer>, + + #[account( + init, + payer = maker, + associated_token::mint = token_mint_a, + associated_token::authority = offer, + associated_token::token_program = token_program + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +// Move the tokens from the maker's ATA to the vault +pub fn handle_send_offered_tokens_to_vault( + context: &Context, + token_a_offered_amount: u64, +) -> Result<()> { + transfer_tokens( + &context.accounts.maker_token_account_a, + &context.accounts.vault, + &token_a_offered_amount, + &context.accounts.token_mint_a, + &context.accounts.maker.to_account_info(), + &context.accounts.token_program, + None, + ) +} + +// Save the details of the offer to the offer account +pub fn handle_save_offer( + context: Context, + id: u64, + token_b_wanted_amount: u64, +) -> Result<()> { + context.accounts.offer.set_inner(Offer { + id, + maker: context.accounts.maker.key(), + token_mint_a: context.accounts.token_mint_a.key(), + token_mint_b: context.accounts.token_mint_b.key(), + token_b_wanted_amount, + bump: context.bumps.offer, + }); + Ok(()) +} diff --git a/finance/escrow/anchor-v1/programs/escrow/src/instructions/mod.rs b/finance/escrow/anchor-v1/programs/escrow/src/instructions/mod.rs new file mode 100644 index 000000000..d0e3d27d6 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/instructions/mod.rs @@ -0,0 +1,11 @@ +pub mod make_offer; +pub use make_offer::*; + +pub mod take_offer; +pub use take_offer::*; + +pub mod cancel_offer; +pub use cancel_offer::*; + +pub mod shared; +pub use shared::*; diff --git a/finance/escrow/anchor-v1/programs/escrow/src/instructions/shared.rs b/finance/escrow/anchor-v1/programs/escrow/src/instructions/shared.rs new file mode 100644 index 000000000..349c107b3 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/instructions/shared.rs @@ -0,0 +1,63 @@ +use anchor_lang::prelude::*; + +use anchor_spl::token_interface::{ + close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, + TransferChecked, +}; + +// Transfer tokens from one token account to another. +// When transferring out of a token account owned by a PDA, pass the PDA's +// signer seeds via owning_pda_seeds; otherwise pass None. +pub fn transfer_tokens<'info>( + from: &InterfaceAccount<'info, TokenAccount>, + to: &InterfaceAccount<'info, TokenAccount>, + amount: &u64, + mint: &InterfaceAccount<'info, Mint>, + authority: &AccountInfo<'info>, + token_program: &Interface<'info, TokenInterface>, + owning_pda_seeds: Option<&[&[u8]]>, +) -> Result<()> { + let transfer_accounts = TransferChecked { + from: from.to_account_info(), + mint: mint.to_account_info(), + to: to.to_account_info(), + authority: authority.to_account_info(), + }; + + let signer_seeds = owning_pda_seeds.map(|seeds| [seeds]); + let cpi_context = match signer_seeds.as_ref() { + Some(signer_seeds) => { + CpiContext::new_with_signer(token_program.key(), transfer_accounts, signer_seeds) + } + None => CpiContext::new(token_program.key(), transfer_accounts), + }; + + transfer_checked(cpi_context, *amount, mint.decimals) +} + +// Close a token account, sending its rent lamports to destination. +// When the token account is owned by a PDA, pass the PDA's signer seeds via +// owning_pda_seeds; otherwise pass None. +pub fn close_token_account<'info>( + token_account: &InterfaceAccount<'info, TokenAccount>, + destination: &AccountInfo<'info>, + authority: &AccountInfo<'info>, + token_program: &Interface<'info, TokenInterface>, + owning_pda_seeds: Option<&[&[u8]]>, +) -> Result<()> { + let close_accounts = CloseAccount { + account: token_account.to_account_info(), + destination: destination.to_account_info(), + authority: authority.to_account_info(), + }; + + let signer_seeds = owning_pda_seeds.map(|seeds| [seeds]); + let cpi_context = match signer_seeds.as_ref() { + Some(signer_seeds) => { + CpiContext::new_with_signer(token_program.key(), close_accounts, signer_seeds) + } + None => CpiContext::new(token_program.key(), close_accounts), + }; + + close_account(cpi_context) +} diff --git a/finance/escrow/anchor-v1/programs/escrow/src/instructions/take_offer.rs b/finance/escrow/anchor-v1/programs/escrow/src/instructions/take_offer.rs new file mode 100644 index 000000000..a8edc1a13 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/instructions/take_offer.rs @@ -0,0 +1,113 @@ +use anchor_lang::prelude::*; + +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::Offer; + +use super::{close_token_account, transfer_tokens}; + +#[derive(Accounts)] +pub struct TakeOfferAccountConstraints<'info> { + #[account(mut)] + pub taker: Signer<'info>, + + #[account(mut)] + pub maker: SystemAccount<'info>, + + pub token_mint_a: InterfaceAccount<'info, Mint>, + + pub token_mint_b: InterfaceAccount<'info, Mint>, + + #[account( + init_if_needed, + payer = taker, + associated_token::mint = token_mint_a, + associated_token::authority = taker, + associated_token::token_program = token_program, + )] + pub taker_token_account_a: Box>, + + #[account( + mut, + associated_token::mint = token_mint_b, + associated_token::authority = taker, + associated_token::token_program = token_program, + )] + pub taker_token_account_b: Box>, + + // The maker's token-B ATA is initialized in make_offer, paid by the maker. + #[account( + mut, + associated_token::mint = token_mint_b, + associated_token::authority = maker, + associated_token::token_program = token_program, + )] + pub maker_token_account_b: Box>, + + #[account( + mut, + close = maker, + has_one = maker, + has_one = token_mint_a, + has_one = token_mint_b, + seeds = [b"offer", maker.key().as_ref(), offer.id.to_le_bytes().as_ref()], + bump = offer.bump + )] + offer: Account<'info, Offer>, + + #[account( + mut, + associated_token::mint = token_mint_a, + associated_token::authority = offer, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_send_wanted_tokens_to_maker( + context: &Context, +) -> Result<()> { + transfer_tokens( + &context.accounts.taker_token_account_b, + &context.accounts.maker_token_account_b, + &context.accounts.offer.token_b_wanted_amount, + &context.accounts.token_mint_b, + &context.accounts.taker.to_account_info(), + &context.accounts.token_program, + None, + ) +} + +pub fn handle_withdraw_and_close_vault(context: Context) -> Result<()> { + let maker_key = context.accounts.maker.key(); + let id_bytes = context.accounts.offer.id.to_le_bytes(); + let bump = [context.accounts.offer.bump]; + let offer_seeds: &[&[u8]] = &[b"offer", maker_key.as_ref(), id_bytes.as_ref(), &bump]; + + transfer_tokens( + &context.accounts.vault, + &context.accounts.taker_token_account_a, + &context.accounts.vault.amount, + &context.accounts.token_mint_a, + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + )?; + + // The maker paid the vault's rent in make_offer, so the vault closes back + // to the maker (the offer account does the same via `close = maker`). + close_token_account( + &context.accounts.vault, + &context.accounts.maker.to_account_info(), + &context.accounts.offer.to_account_info(), + &context.accounts.token_program, + Some(offer_seeds), + ) +} diff --git a/finance/escrow/anchor-v1/programs/escrow/src/lib.rs b/finance/escrow/anchor-v1/programs/escrow/src/lib.rs new file mode 100644 index 000000000..fd8307da2 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/lib.rs @@ -0,0 +1,38 @@ +pub mod error; +pub mod instructions; +pub mod state; + +use anchor_lang::prelude::*; + +pub use instructions::*; +pub use state::*; + +declare_id!("qbuMdeYxYJXBjU6C6qFKjZKjXmrU83eDQomHdrch826"); + +#[program] +pub mod escrow { + use super::*; + + pub fn make_offer( + context: Context, + id: u64, + token_a_offered_amount: u64, + token_b_wanted_amount: u64, + ) -> Result<()> { + instructions::make_offer::handle_send_offered_tokens_to_vault(&context, token_a_offered_amount)?; + instructions::make_offer::handle_save_offer(context, id, token_b_wanted_amount) + } + + pub fn take_offer(context: Context) -> Result<()> { + instructions::take_offer::handle_send_wanted_tokens_to_maker(&context)?; + instructions::take_offer::handle_withdraw_and_close_vault(context) + } + + // Cancel an outstanding offer. The maker signs, the vault tokens flow back + // to the maker, and both the vault and offer accounts are closed (rent + // refunded to the maker). Without this, abandoned offers would lock funds + // forever. + pub fn cancel_offer(context: Context) -> Result<()> { + instructions::cancel_offer::handle_cancel_offer(context) + } +} diff --git a/finance/escrow/anchor-v1/programs/escrow/src/state/mod.rs b/finance/escrow/anchor-v1/programs/escrow/src/state/mod.rs new file mode 100644 index 000000000..cfaa08e9f --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/state/mod.rs @@ -0,0 +1,3 @@ +pub mod offer; + +pub use offer::*; diff --git a/finance/escrow/anchor-v1/programs/escrow/src/state/offer.rs b/finance/escrow/anchor-v1/programs/escrow/src/state/offer.rs new file mode 100644 index 000000000..65f90af73 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/src/state/offer.rs @@ -0,0 +1,12 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct Offer { + pub id: u64, + pub maker: Pubkey, + pub token_mint_a: Pubkey, + pub token_mint_b: Pubkey, + pub token_b_wanted_amount: u64, + pub bump: u8, +} diff --git a/finance/escrow/anchor-v1/programs/escrow/tests/test_escrow.rs b/finance/escrow/anchor-v1/programs/escrow/tests/test_escrow.rs new file mode 100644 index 000000000..db586e808 --- /dev/null +++ b/finance/escrow/anchor-v1/programs/escrow/tests/test_escrow.rs @@ -0,0 +1,491 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn lamports(svm: &LiteSVM, address: &Pubkey) -> u64 { + svm.get_account(address).map(|a| a.lamports).unwrap_or(0) +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = escrow::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/escrow.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + (svm, program_id, payer) +} + +struct EscrowSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + alice: Keypair, + bob: Keypair, + mint_a: Pubkey, + mint_b: Pubkey, + alice_ata_a: Pubkey, + alice_ata_b: Pubkey, + bob_ata_a: Pubkey, + bob_ata_b: Pubkey, +} + +fn full_setup() -> EscrowSetup { + let (mut svm, program_id, payer) = setup(); + + let alice = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let bob = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let decimals: u8 = 6; + let alice_amount: u64 = 1_000_000_000; + let bob_amount: u64 = 1_000_000_000; + + // Create mints (payer is mint authority) + let mint_a = create_token_mint(&mut svm, &payer, decimals, None).unwrap(); + let mint_b = create_token_mint(&mut svm, &payer, decimals, None).unwrap(); + + // Create ATAs + let alice_ata_a = + create_associated_token_account(&mut svm, &alice.pubkey(), &mint_a, &payer).unwrap(); + let alice_ata_b = + create_associated_token_account(&mut svm, &alice.pubkey(), &mint_b, &payer).unwrap(); + let bob_ata_b = + create_associated_token_account(&mut svm, &bob.pubkey(), &mint_b, &payer).unwrap(); + + // bob_ata_a is derived but not pre-created (program uses init_if_needed) + let bob_ata_a = derive_ata(&bob.pubkey(), &mint_a); + + // Mint tokens: Alice gets token A, Bob gets token B + mint_tokens_to_token_account(&mut svm, &mint_a, &alice_ata_a, alice_amount, &payer).unwrap(); + mint_tokens_to_token_account(&mut svm, &mint_b, &bob_ata_b, bob_amount, &payer).unwrap(); + + EscrowSetup { + svm, + program_id, + payer, + alice, + bob, + mint_a, + mint_b, + alice_ata_a, + alice_ata_b, + bob_ata_a, + bob_ata_b, + } +} + +#[test] +fn test_make_offer() { + let mut es = full_setup(); + + let offer_id: u64 = 1; + let token_a_offered_amount: u64 = 1_000_000; + let token_b_wanted_amount: u64 = 1_000_000; + + // Derive offer PDA + let (offer_pda, _bump) = Pubkey::find_program_address( + &[ + b"offer", + es.alice.pubkey().as_ref(), + &offer_id.to_le_bytes(), + ], + &es.program_id, + ); + + // Vault is the ATA of the offer PDA for mint_a + let vault = derive_ata(&offer_pda, &es.mint_a); + + let make_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::MakeOffer { + id: offer_id, + token_a_offered_amount, + token_b_wanted_amount, + } + .data(), + escrow::accounts::MakeOfferAccountConstraints { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + maker_token_account_a: es.alice_ata_a, + maker_token_account_b: es.alice_ata_b, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut es.svm, + vec![make_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + // Verify vault contains the offered tokens + assert_eq!( + get_token_account_balance(&es.svm, &vault).unwrap(), + token_a_offered_amount + ); + + // Verify offer account data + let offer_data = es.svm.get_account(&offer_pda).expect("Offer should exist"); + let data = &offer_data.data[8..]; // Skip 8-byte discriminator + let stored_id = u64::from_le_bytes(data[0..8].try_into().unwrap()); + assert_eq!(stored_id, offer_id); + let stored_maker = Pubkey::try_from(&data[8..40]).unwrap(); + assert_eq!(stored_maker, es.alice.pubkey()); +} + +#[test] +fn test_take_offer() { + let mut es = full_setup(); + + let offer_id: u64 = 2; + let token_a_offered_amount: u64 = 1_000_000; + let token_b_wanted_amount: u64 = 1_000_000; + + // Derive offer PDA + let (offer_pda, _bump) = Pubkey::find_program_address( + &[ + b"offer", + es.alice.pubkey().as_ref(), + &offer_id.to_le_bytes(), + ], + &es.program_id, + ); + + let vault = derive_ata(&offer_pda, &es.mint_a); + + // Alice pays the offer + vault rent in make_offer and must recover it all + // when the offer is taken. (Alice's token-B ATA already exists, and the + // payer covers transaction fees, so her lamports should round-trip + // exactly.) + let alice_lamports_before_make = lamports(&es.svm, &es.alice.pubkey()); + let bob_lamports_before_take = lamports(&es.svm, &es.bob.pubkey()); + + // Step 1: Alice makes the offer + let make_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::MakeOffer { + id: offer_id, + token_a_offered_amount, + token_b_wanted_amount, + } + .data(), + escrow::accounts::MakeOfferAccountConstraints { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + maker_token_account_a: es.alice_ata_a, + maker_token_account_b: es.alice_ata_b, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut es.svm, + vec![make_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + // Verify vault has tokens + assert_eq!( + get_token_account_balance(&es.svm, &vault).unwrap(), + token_a_offered_amount + ); + + // Step 2: Bob takes the offer + let take_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::TakeOffer {}.data(), + escrow::accounts::TakeOfferAccountConstraints { + taker: es.bob.pubkey(), + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + taker_token_account_a: es.bob_ata_a, + taker_token_account_b: es.bob_ata_b, + maker_token_account_b: es.alice_ata_b, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut es.svm, + vec![take_offer_ix], + &[&es.payer, &es.bob], + &es.payer.pubkey(), + ) + .unwrap(); + + // Verify Bob received token A from vault + assert_eq!( + get_token_account_balance(&es.svm, &es.bob_ata_a).unwrap(), + token_a_offered_amount + ); + + // Verify Alice received token B from Bob + assert_eq!( + get_token_account_balance(&es.svm, &es.alice_ata_b).unwrap(), + token_b_wanted_amount + ); + + // Verify vault is closed + assert!( + es.svm.get_account(&vault).is_none(), + "Vault should be closed after take_offer" + ); + + // Verify offer account is closed + assert!( + es.svm.get_account(&offer_pda).is_none(), + "Offer should be closed after take_offer" + ); + + // Rent destinations: Alice (the maker) recovers the offer + vault rent in + // full. Bob (the taker) only paid the rent of his own new token-A ATA. + assert_eq!( + lamports(&es.svm, &es.alice.pubkey()), + alice_lamports_before_make, + "maker must recover the offer and vault rent after take_offer" + ); + let bob_ata_a_rent = lamports(&es.svm, &es.bob_ata_a); + assert_eq!( + lamports(&es.svm, &es.bob.pubkey()), + bob_lamports_before_take - bob_ata_a_rent, + "taker must only pay the rent of their own token-A ATA" + ); +} + +#[test] +fn test_cancel_offer() { + let mut es = full_setup(); + + let offer_id: u64 = 3; + let token_a_offered_amount: u64 = 500_000; + let token_b_wanted_amount: u64 = 1_000_000; + + let (offer_pda, _bump) = Pubkey::find_program_address( + &[ + b"offer", + es.alice.pubkey().as_ref(), + &offer_id.to_le_bytes(), + ], + &es.program_id, + ); + let vault = derive_ata(&offer_pda, &es.mint_a); + + // Snapshot Alice's token-A balance and lamports before the offer. + let alice_a_before = get_token_account_balance(&es.svm, &es.alice_ata_a).unwrap(); + let alice_lamports_before_make = lamports(&es.svm, &es.alice.pubkey()); + + // Alice makes the offer. + let make_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::MakeOffer { + id: offer_id, + token_a_offered_amount, + token_b_wanted_amount, + } + .data(), + escrow::accounts::MakeOfferAccountConstraints { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + maker_token_account_a: es.alice_ata_a, + maker_token_account_b: es.alice_ata_b, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut es.svm, + vec![make_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&es.svm, &vault).unwrap(), + token_a_offered_amount + ); + + // Alice cancels the offer. + let cancel_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::CancelOffer {}.data(), + escrow::accounts::CancelOfferAccountConstraints { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + maker_token_account_a: es.alice_ata_a, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut es.svm, + vec![cancel_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + // The offer and vault accounts should be closed. + assert!( + es.svm.get_account(&offer_pda).is_none(), + "Offer should be closed after cancel" + ); + assert!( + es.svm.get_account(&vault).is_none(), + "Vault should be closed after cancel" + ); + + // Alice should have her token-A back to its pre-make balance. + let alice_a_after = get_token_account_balance(&es.svm, &es.alice_ata_a).unwrap(); + assert_eq!(alice_a_after, alice_a_before); + + // Rent destination: Alice recovers the offer + vault rent in full. + assert_eq!( + lamports(&es.svm, &es.alice.pubkey()), + alice_lamports_before_make, + "maker must recover the offer and vault rent after cancel_offer" + ); +} + +#[test] +fn test_cancel_offer_rejects_non_maker() { + let mut es = full_setup(); + + let offer_id: u64 = 4; + let token_a_offered_amount: u64 = 500_000; + let token_b_wanted_amount: u64 = 1_000_000; + + let (offer_pda, _bump) = Pubkey::find_program_address( + &[ + b"offer", + es.alice.pubkey().as_ref(), + &offer_id.to_le_bytes(), + ], + &es.program_id, + ); + let vault = derive_ata(&offer_pda, &es.mint_a); + + // Alice makes the offer. + let make_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::MakeOffer { + id: offer_id, + token_a_offered_amount, + token_b_wanted_amount, + } + .data(), + escrow::accounts::MakeOfferAccountConstraints { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + maker_token_account_a: es.alice_ata_a, + maker_token_account_b: es.alice_ata_b, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut es.svm, + vec![make_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + // Bob tries to cancel Alice's offer - the has_one = maker / signer + seeds + // constraints should reject this. + let bob_ata_a = + create_associated_token_account(&mut es.svm, &es.bob.pubkey(), &es.mint_a, &es.payer) + .unwrap(); + let cancel_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::CancelOffer {}.data(), + escrow::accounts::CancelOfferAccountConstraints { + maker: es.bob.pubkey(), + token_mint_a: es.mint_a, + maker_token_account_a: bob_ata_a, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions( + &mut es.svm, + vec![cancel_offer_ix], + &[&es.payer, &es.bob], + &es.payer.pubkey(), + ); + assert!( + result.is_err(), + "Bob must not be able to cancel Alice's offer" + ); +} diff --git a/finance/escrow/anchor/README.md b/finance/escrow/anchor/README.md index 20fd380d5..fa6118177 100644 --- a/finance/escrow/anchor/README.md +++ b/finance/escrow/anchor/README.md @@ -1,5 +1,11 @@ # Solana Escrow (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + This Solana [program](https://solana.com/docs/terminology#program) is an **escrow** - it lets a **maker** swap a specific amount of one token for a desired amount of another token with a **taker**, atomically and without either party having to trust the other. For example: Alice offers 10 USDC and wants 100 WIF in return. The program holds Alice's USDC in a vault until someone delivers the WIF, then releases both sides in a single transaction. Neither party can take the other's tokens and run, and there is no spread or middleman fee on the swap. @@ -23,7 +29,7 @@ A maker abandons an offer with `cancel_offer`. Only the maker can call it; witho ## Setup -Prerequisites: Rust, the [Agave](https://docs.anza.xyz/) toolchain, and the Anchor CLI. Build the program with: +Prerequisites: Rust, the [Agave](https://docs.anza.xyz/) toolchain, and the Anchor v2 CLI. Build the program with: ```bash anchor build diff --git a/finance/lending/anchor-v1/Anchor.toml b/finance/lending/anchor-v1/Anchor.toml new file mode 100644 index 000000000..bd3e3a070 --- /dev/null +++ b/finance/lending/anchor-v1/Anchor.toml @@ -0,0 +1,21 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +# Pinned to match the rest of solana-program-examples (see tokens/token-swap). +# Unpin when the repo-wide Solana version is bumped. +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +lending = "4bvT6A8S7ZVL6bSvK2KoL2nQ4F5H6AF9133kCYbMJj1t" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# Anchor 1.0+ runs Rust + LiteSVM tests via cargo test. +test = "cargo test" diff --git a/finance/lending/anchor-v1/CHANGELOG.md b/finance/lending/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..dab8f1686 --- /dev/null +++ b/finance/lending/anchor-v1/CHANGELOG.md @@ -0,0 +1,55 @@ +# Changelog + +## 2026-08-14 + +Move slots-per-year out of the code and into the reserve config. Turning an APR +into the per-slot rate interest accrues at needs a slots-per-year divisor, and +that divisor is the cluster's slot time in disguise. It was a `SLOTS_PER_YEAR` +constant fixed at a 400ms slot, so a protocol change to the slot time would have +raised the wall-clock rate every borrower pays with no code change and nothing +to show for it. `ReserveConfig` now carries `slots_per_year`, `validate()` +rejects zero, and the market owner retunes it with `update_reserve_config`. +Tested by `slots_per_year_scales_the_per_slot_rate` and +`rejects_zero_slots_per_year`. + +## 2026-08-04 + +Reject oracle prices from before a cluster restart. A halt stops the slot +count but not the wall clock, so after a restart a feed can look fresh in +slots while its price is hours old. `price_scaled` now also requires the +feed's slot to be after the `LastRestartSlot` sysvar's slot +(`PricePredatesRestart`), pausing valuation until the publisher posts again. +Tested by `borrow_with_price_from_before_a_restart_is_rejected`. + +## 0.1.0 + +Initial lending program: a Kamino/Solend-style borrow/lend market. + +- Lending market, per-asset reserves with a program-owned liquidity vault and a + share-token mint, and per-borrower obligations. +- Share-token deposit accounting with an exchange rate driven by accrued interest. +- Utilization-based kinked interest-rate curve compounded through a cumulative + borrow-rate index; per-obligation scaled debt. +- Oracle-priced obligation health with loan-to-value and liquidation-threshold + limits, and close-factor-capped liquidation with a seize bonus. +- Switchboard-On-Demand-shaped price feed with a `set_price` test writer. +- Rust + LiteSVM integration tests covering supply/redeem, borrow/repay, + withdraw, interest accrual, liquidation, the share-inflation guard, and + rounding/stale-input edge cases. +- Lending markets are isolation boundaries: every obligation handler rejects + reserves from another market (`MarketMismatch`). +- Price feed PDAs are seeded by their authority, so no signer can write or + pre-claim a feed another authority's reserves trust. +- Liquidation reads the close factor from the repay reserve, the bonus from the + collateral reserve, and rejects repayments whose seizure would exceed the + posted collateral (`LiquidationTooLarge`). +- Withdraw health checks round the removed borrow power up, so independent + rounding can never let a withdraw pass that an exact recompute would reject. +- Reserve factor: the protocol keeps `reserve_factor_bps` of accrued interest as + fees the market owner withdraws with `collect_protocol_fees`; the fees are + carved out of `total_liquidity` so they never inflate the supplier exchange rate. +- LendingMarket is seeded by a `market_id` index (`["lending_market", market_id]`), + not by any individual; one owner can run several independent markets, and admin + handlers authorize via `has_one = owner`. +- Price feeds are seeded `["price_feed", market, mint]` (scoped to a market, not + to an individual); only the market owner may write one (`has_one = owner`). diff --git a/finance/lending/anchor-v1/Cargo.toml b/finance/lending/anchor-v1/Cargo.toml new file mode 100644 index 000000000..64a260149 --- /dev/null +++ b/finance/lending/anchor-v1/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +# overflow-checks is belt-and-braces: every arithmetic path in the program already +# uses checked_* math, but enabling it means any missed raw op traps instead of wrapping. +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/lending/anchor-v1/README.md b/finance/lending/anchor-v1/README.md new file mode 100644 index 000000000..4c49c51ba --- /dev/null +++ b/finance/lending/anchor-v1/README.md @@ -0,0 +1,212 @@ +# Solana Lending (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +A Kamino/Solend-style borrow/lend program on Solana: suppliers earn interest on deposits, +borrowers post collateral and draw other assets against it, and liquidators keep +the market solvent. It demonstrates the techniques the most-used Solana lending +protocols share: share-token deposit accounting, a utilization-based interest +index, oracle-priced obligation health, and close-factor-capped liquidation. + +## Purpose + +Lending markets let one set of users supply liquidity to earn yield while another +set borrows it against collateral. This program implements that end to end: + +- **Suppliers** deposit a token and receive **share tokens** representing their + slice of the pool. The share-to-liquidity exchange rate rises as borrowers pay + interest, so redeeming later returns more than was deposited. +- **Borrowers** post their share tokens as collateral in an obligation and borrow + a different token, up to a loan-to-value limit. +- **Liquidators** repay part of an unhealthy obligation's debt and seize its + collateral at a discount, pulling the position back to solvency. + +Concrete directional example (a short): supply USDC and post the USDC share +tokens as collateral, borrow NVDAx, and sell it. You are **long your collateral +(USDC) and short the borrowed asset (NVDAx)**. While the loan is open you pay a +variable borrow rate that tracks pool utilization. Buy NVDAx back later, call +`repay_obligation_liquidity`, then `withdraw_obligation_collateral` and +`redeem_reserve_collateral` to exit. If NVDAx instead rises far enough, your debt +crosses the liquidation threshold and a liquidator can close part of the position. + +## Major Concepts + +### Accounts + +- **`LendingMarket`**: top-level config (owner, quote-currency mint). PDA seeds + `["lending_market", market_id]`, where `market_id` is a `u64` index. Seeding by + an index alone (owner is stored as a field for authorization, not baked into the + address) lets one owner run several independent, risk-isolated markets (their + market 0, 1, 2 …) with no cross-owner collisions and no individual's key in a + shared struct's address. +- **`Reserve`**: one per asset. Owns a program-controlled liquidity vault and a + share-token mint, and stores the interest-rate config, the cumulative borrow- + rate index, available liquidity, and scaled total debt. PDA seeds + `["reserve", market, liquidity_mint]`. +- **`Obligation`**: one per borrower per market: the share-token collateral + posted and the liquidity borrowed, with cached quote-currency valuations. PDA + seeds `["obligation", market, owner]`. +- **`PriceFeed`**: a price for one token (see Oracle below). + +### Share tokens (the deposit claim) + +Supplying liquidity mints share tokens; redeeming burns them. The exchange rate +is `total_liquidity / share_supply`, where `total_liquidity = available_liquidity ++ current_debt`. `available_liquidity` (not the vault's raw token balance) is the +source of truth, so a token donated directly to the vault cannot inflate the rate, +closing the classic empty-pool inflation attack. The first deposit mints 1:1. + +### Interest: a kinked curve and a cumulative index + +Each `refresh_reserve` advances `borrow_accumulation_factor` by +`(1 + rate_per_slot * elapsed_slots)`. `rate_per_slot` comes from a kinked +utilization curve: linear from `min_borrow_rate_bps` to `optimal_borrow_rate_bps` +up to `optimal_utilization_bps`, then steeper to `max_borrow_rate_bps` at full +utilization. Each borrow stores its principal as **scaled debt** (principal ÷ +index at borrow time), so every obligation's debt grows automatically as the +index advances: no per-obligation accrual loop. + +Those curve parameters are annual, and the conversion to a per-slot rate divides +by `config.slots_per_year`. That divisor is the cluster's slot time expressed as +a count, which is why it is configuration and not a constant: Solana lowers the +slot time over time, and a reserve left on an old figure charges borrowers more +per day than the APR it advertises, with nothing in the program changed to say +so. Read the current slot time off the cluster you deploy against (two +[`getBlockTime`](https://solana.com/docs/rpc/http/getblocktime) results a known +number of slots apart) and keep the reserve in step with +`update_reserve_config`. + +### Protocol fees (how the market earns) + +Borrowers owe the full interest, but suppliers don't receive all of it. On each +accrual the reserve keeps `config.reserve_factor_bps` of the freshly accrued +interest in `accumulated_protocol_fees`; only the remainder lifts the supplier +exchange rate. Those fees are carved out of `total_liquidity`, so they never +count as a supplier claim, and the market owner withdraws them with +**`collect_protocol_fees`** (paid out of the reserve's available liquidity). +This spread between the borrow rate and the supply rate is the protocol's revenue. + +### Obligation health + +`refresh_obligation` recomputes, from the refreshed reserves and their prices: +`borrowed_value`, `allowed_borrow_value` (Σ collateral value × `loan_to_value_bps`) +and `unhealthy_borrow_value` (Σ collateral value × `liquidation_threshold_bps`). +Borrowing and withdrawing are gated by `allowed_borrow_value`; an obligation is +liquidatable once `borrowed_value > unhealthy_borrow_value`. Collateral is valued +rounding down and debt rounding up, so health is always judged conservatively. + +Every handler that pairs an obligation with a reserve requires both to belong to +the same `LendingMarket` (`MarketMismatch` otherwise), so each market is an +isolation boundary: positions in one market can never be valued or settled +against reserves of another. + +In a liquidation, the close factor (how much of the borrow one call may repay) +comes from the **repay reserve**, because it is a property of the debt being +closed; the liquidation bonus comes from the **collateral reserve**, because it +prices the collateral being seized. A repayment whose seizure would exceed the +posted collateral fails with `LiquidationTooLarge` rather than silently seizing +less, which would make the liquidator overpay. + +### Fixed-point math + +All money math is integer-only `u128`: no floats, no fixed-point crates. Ratios +(rates, the index, the exchange rate, obligation values) are scaled by +`FIXED_POINT_SCALE` (10^18). Every conversion rounds in the protocol's favour +(user output floored, debt ceiled), so dust cannot be extracted by repeated +round-trips. + +### Oracle + +`PriceFeed` mirrors a Switchboard On-Demand pull feed: a signed mantissa, an +exponent (`price = mantissa * 10^exponent`), and the slot the price was written. +Freshness is checked in **slots** (`MAX_PRICE_STALENESS_SLOTS`), not wall-clock +time, plus one check slots alone cannot make: a cluster restart passes hours of +wall-clock time in zero slots, so `price_scaled` also rejects any price stamped +at or before the `LastRestartSlot` sysvar's slot, pausing valuation until the +publisher posts again. The feed PDA is seeded by `[b"price_feed", market, mint]` (scoped to a +market, not to any individual) and only that market's `owner` may write it +(`set_price` checks `has_one = owner`). So prices can't be squatted, a reserve +trusts exactly its own market's feed for the mint, and isolated markets can +price the same asset independently. + +The `set_price` handler writes the feed directly so the LiteSVM tests are +deterministic; in production a reserve points at the real Switchboard feed and the +program decodes `PullFeedAccountData` (`price_mantissa = current_result.value`, +`exponent = -18`, `last_updated_slot = current_result.slot`) instead, and should +also reject results whose confidence interval is too wide. Switchboard is used +rather than Pyth here for its lower compute cost. + +### Custody + +Supplied liquidity sits in program-owned vault PDAs, and posted collateral sits in +per-obligation vault PDAs whose authority is the obligation PDA. The market owner +can update reserve risk parameters (`update_reserve_config`) and withdraw the +protocol's earned fees (`collect_protocol_fees`), but has no path to a supplier's +deposits or a borrower's collateral: there is no admin escape hatch over user funds. + +### Known limits + +- **Tokens with transfer fees are not supported.** The program uses + `token_interface`, so Token Extensions mints are accepted, but a transfer-fee + extension would make the vault receive less than the recorded deposit and the + accounting would overstate `available_liquidity`. Production protocols + whitelist mints; a market owner here must only create reserves for tokens + without transfer fees. +- **Reserve config changes act immediately.** Lowering a reserve's + `liquidation_threshold_bps` can make existing obligations liquidatable at + once; production governance phases such changes in. +- This is an example. Deploying any program that custodies funds calls for a + professional security audit first. + +### Instruction handlers + +Admin: `initialize_lending_market`, `initialize_reserve`, `update_reserve_config`, `set_price`, +`collect_protocol_fees`. +Supply side: `refresh_reserve`, `deposit_reserve_liquidity`, +`redeem_reserve_collateral`. Borrow side: `initialize_obligation`, `refresh_obligation`, +`deposit_obligation_collateral`, `withdraw_obligation_collateral`, +`borrow_obligation_liquidity`, `repay_obligation_liquidity`, `liquidate_obligation`. + +Value-dependent handlers require the reserves and the obligation to have been +refreshed in the same transaction, so a typical action transaction is +`[refresh_reserve …, refresh_obligation, ]`. + +## Setup + +- Rust and the Solana toolchain (`cargo-build-sbf`), Anchor 1.1.2, Solana 3.1.8. +- This program has no client/JavaScript code; tests are Rust + LiteSVM. + +## Testing + +```sh +anchor build # or: cargo build-sbf - produces target/deploy/lending.so +anchor test # or: cargo test - runs the LiteSVM integration tests +``` + +`anchor build` (or `cargo build-sbf`) must run first: the tests load the compiled +`target/deploy/lending.so` via `include_bytes!`. The suite covers the +non-happy-path branches: interest accrual, borrowing at the LTV limit, stale +reserve/price rejection, liquidation of an unhealthy obligation after a price +move, the share-inflation guard, and rounding edges. + +## FAQ + +### How does a lending protocol work on Solana? + +Suppliers deposit a token with `deposit_reserve_liquidity` and receive share tokens that grow in value as borrowers pay interest. Borrowers post those shares as collateral (`deposit_obligation_collateral`) and draw a different token with `borrow_obligation_liquidity`, up to a loan-to-value limit. When a position's collateral no longer covers its debt, anyone can call `liquidate_obligation` to repay part of the debt in exchange for discounted collateral. + +### How does interest accrue without looping over every account? + +Through a cumulative accumulation factor: `refresh_reserve` advances a per-reserve factor along a utilization-based rate curve, and each obligation stores the index value from its last interaction. The gap between the two is the interest owed, so no per-account accrual loop is needed. This is the same technique the most-used Solana lending protocols share. + +### How are prices fed into the protocol? + +The admin `set_price` instruction handler stands in for an oracle feed in this example. `refresh_obligation` re-values collateral and debt at those prices before any borrow, withdraw, or liquidation is allowed, and stale reserves or prices are rejected. + +### How is this lending program tested and verified? + +`anchor build` then `cargo test` runs LiteSVM integration tests covering interest accrual, borrowing at the LTV limit, liquidation after a price move, and the share-inflation guard. The money math also has [Kani](https://github.com/model-checking/kani) proofs in [`../kani-proofs/`](../kani-proofs/). diff --git a/finance/lending/anchor-v1/programs/lending/Cargo.toml b/finance/lending/anchor-v1/programs/lending/Cargo.toml new file mode 100644 index 000000000..2e7be6417 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "lending" +version = "0.1.0" +description = "Kamino/Solend-style borrow/lend program" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "lending" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed: the obligation share vault and the test price feed are created lazily. +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" +# For the LastRestartSlot sysvar (not re-exported by anchor-lang): the price +# feed rejects prices from before a cluster restart. Same major as the +# solana-sysvar anchor-lang itself uses, so only one copy is compiled in. +solana-sysvar = "3" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/lending/anchor-v1/programs/lending/Xargo.toml b/finance/lending/anchor-v1/programs/lending/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/lending/anchor-v1/programs/lending/src/constants.rs b/finance/lending/anchor-v1/programs/lending/src/constants.rs new file mode 100644 index 000000000..5da22e876 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/constants.rs @@ -0,0 +1,43 @@ +// These are plain `pub const`s rather than Anchor `#[constant]`s: `#[constant]` +// only re-exports a value into the IDL, and anchor's idl-build mis-evaluates a +// u128 literal this large as i32 ("literal out of range for i32"). None of these +// need to appear in the IDL, so plain consts both compile and keep the IDL clean. + +/// Fixed-point scale for every ratio in the program: interest rates, the +/// cumulative borrow-rate index, the share-token exchange rate, and obligation +/// values. A ratio `r` is stored as the integer `r * FIXED_POINT_SCALE`. +/// +/// All money math is integer-only (no floats, no fixed-point crates). 10^18 +/// keeps a single slot's interest — which can be a tiny fraction of the index — +/// from truncating to zero, while u128's ~3.4e38 ceiling leaves headroom for the +/// index to grow and for intermediate products before the final narrowing cast. +pub const FIXED_POINT_SCALE: u128 = 1_000_000_000_000_000_000; + +/// log10(FIXED_POINT_SCALE). Used to fold the price exponent and the fixed-point +/// scale into one power of ten so price conversions never form a needless 10^18 +/// intermediate that would overflow for high-priced assets. +pub const FIXED_POINT_SCALE_DECIMALS: i32 = 18; + +/// Denominator for every basis-point config value. 100% == 10_000 bps. +pub const BPS_DENOMINATOR: u128 = 10_000; + +/// Maximum distinct reserves an obligation may use as collateral, and +/// separately as borrows. Bounds the account size and the compute cost of +/// refresh_obligation (which iterates every entry). +pub const MAX_OBLIGATION_RESERVES: usize = 4; + +/// A price feed older than this many slots is rejected as stale. Freshness is +/// measured in slots, not unix time, because the runtime guarantees slot +/// progression while the timestamp is validator-influenced. How long the window +/// is in seconds follows the cluster's slot time, which the protocol lowers over +/// time, so the window tightens on its own and never loosens. +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 25; + +// PDA seeds. +pub const LENDING_MARKET_SEED: &[u8] = b"lending_market"; +pub const RESERVE_SEED: &[u8] = b"reserve"; +pub const LIQUIDITY_VAULT_SEED: &[u8] = b"liquidity_vault"; +pub const SHARE_MINT_SEED: &[u8] = b"share_mint"; +pub const OBLIGATION_SEED: &[u8] = b"obligation"; +pub const OBLIGATION_SHARE_VAULT_SEED: &[u8] = b"obligation_share_vault"; +pub const PRICE_FEED_SEED: &[u8] = b"price_feed"; diff --git a/finance/lending/anchor-v1/programs/lending/src/errors.rs b/finance/lending/anchor-v1/programs/lending/src/errors.rs new file mode 100644 index 000000000..c9c146719 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/errors.rs @@ -0,0 +1,43 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum LendingError { + #[msg("Arithmetic operation overflowed")] + MathOverflow, + #[msg("Reserve config has an invalid value")] + InvalidConfig, + #[msg("Amount must be greater than zero")] + ZeroAmount, + #[msg("Deposit is too small to mint any share tokens")] + DepositTooSmall, + #[msg("Reserve does not have enough available liquidity")] + InsufficientReserveLiquidity, + #[msg("Reserve must be refreshed in this same transaction before use")] + ReserveStale, + #[msg("Obligation must be refreshed in this same transaction before use")] + ObligationStale, + #[msg("Price feed has not been updated recently enough")] + StalePriceFeed, + #[msg("Price feed is stale: it predates the last cluster restart")] + PricePredatesRestart, + #[msg("Price feed reported a non-positive price")] + InvalidOraclePrice, + #[msg("Borrow would exceed the obligation's allowed borrow value")] + BorrowTooLarge, + #[msg("Withdraw would leave the obligation undercollateralized")] + WithdrawTooLarge, + #[msg("Obligation is healthy and cannot be liquidated")] + ObligationHealthy, + #[msg("Obligation already uses the maximum number of reserves")] + TooManyReserves, + #[msg("Reserve is not part of this obligation")] + ReserveNotFound, + #[msg("A refresh account did not match the obligation's stored reserves")] + InvalidObligationAccount, + #[msg("Reserve belongs to a different lending market than the obligation")] + MarketMismatch, + #[msg("Repay amount would seize more collateral than the obligation holds")] + LiquidationTooLarge, + #[msg("No protocol fees are available to collect")] + NothingToCollect, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/admin/collect_protocol_fees.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/collect_protocol_fees.rs new file mode 100644 index 000000000..2e0b00618 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/collect_protocol_fees.rs @@ -0,0 +1,78 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::LendingError; +use crate::state::{reserve_signer_seeds, LendingMarket, Reserve}; + +/// Withdraw the protocol fees accrued in a reserve to the market owner. This is +/// how the owner earns: `reserve_factor_bps` of every interest accrual is set +/// aside in `accumulated_protocol_fees` (never credited to suppliers), and this +/// handler pays it out, capped by the liquidity actually sitting in the vault. +pub fn handle_collect_protocol_fees(context: Context) -> Result<()> { + context.accounts.reserve.require_refreshed()?; + + let reserve = &mut context.accounts.reserve; + // Fees are a claim on liquidity; only what is currently un-borrowed can be paid + // out right now. Any remainder stays owed until borrowers repay. + let amount = reserve.accumulated_protocol_fees.min(reserve.available_liquidity); + require!(amount > 0, LendingError::NothingToCollect); + + reserve.accumulated_protocol_fees = reserve + .accumulated_protocol_fees + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(amount) + .ok_or(LendingError::MathOverflow)?; + + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidity_vault.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.owner_liquidity.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + amount, + reserve.liquidity_decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct CollectProtocolFees<'info> { + // Identified by the reserve's `has_one = lending_market`; we only prove the + // signer owns it. + #[account(has_one = owner)] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + has_one = lending_market, + has_one = liquidity_mint, + has_one = liquidity_vault, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub owner_liquidity: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_lending_market.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_lending_market.rs new file mode 100644 index 000000000..2e6d478cc --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_lending_market.rs @@ -0,0 +1,40 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; + +use crate::constants::LENDING_MARKET_SEED; +use crate::state::LendingMarket; + +pub fn handle_initialize_lending_market( + context: Context, + market_id: u64, +) -> Result<()> { + let market = &mut context.accounts.lending_market; + market.market_id = market_id; + market.owner = context.accounts.owner.key(); + market.quote_currency_mint = context.accounts.quote_currency_mint.key(); + market.bump = context.bumps.lending_market; + Ok(()) +} + +#[derive(Accounts)] +#[instruction(market_id: u64)] +pub struct InitializeLendingMarket<'info> { + // Seeded by `market_id` alone — the market is not identified by any + // individual's address. `owner` is stored as a field and used only for + // authorization (`has_one = owner`) on admin instructions. + #[account( + init, + payer = owner, + space = LendingMarket::DISCRIMINATOR.len() + LendingMarket::INIT_SPACE, + seeds = [LENDING_MARKET_SEED, &market_id.to_le_bytes()], + bump, + )] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + pub quote_currency_mint: InterfaceAccount<'info, Mint>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_reserve.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_reserve.rs new file mode 100644 index 000000000..96478950b --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/initialize_reserve.rs @@ -0,0 +1,82 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::constants::{ + FIXED_POINT_SCALE, LIQUIDITY_VAULT_SEED, PRICE_FEED_SEED, RESERVE_SEED, SHARE_MINT_SEED, +}; +use crate::state::{LendingMarket, PriceFeed, Reserve, ReserveConfig}; + +pub fn handle_initialize_reserve(context: Context, config: ReserveConfig) -> Result<()> { + config.validate()?; + + let reserve = &mut context.accounts.reserve; + reserve.lending_market = context.accounts.lending_market.key(); + reserve.liquidity_mint = context.accounts.liquidity_mint.key(); + reserve.liquidity_vault = context.accounts.liquidity_vault.key(); + reserve.share_mint = context.accounts.share_mint.key(); + reserve.price_feed = context.accounts.price_feed.key(); + reserve.liquidity_decimals = context.accounts.liquidity_mint.decimals; + reserve.available_liquidity = 0; + reserve.share_mint_supply = 0; + reserve.borrowed_principal = 0; + reserve.borrow_accumulation_factor = FIXED_POINT_SCALE; + reserve.last_update_slot = Clock::get()?.slot; + reserve.accumulated_protocol_fees = 0; + reserve.config = config; + reserve.bump = context.bumps.reserve; + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializeReserve<'info> { + // The reserve PDA below is seeded by this market's address, so the market is + // pinned by that seed; we only need to prove the signer owns it. + #[account(has_one = owner)] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + init, + payer = owner, + space = Reserve::DISCRIMINATOR.len() + Reserve::INIT_SPACE, + seeds = [RESERVE_SEED, lending_market.key().as_ref(), liquidity_mint.key().as_ref()], + bump, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = owner, + token::mint = liquidity_mint, + token::authority = reserve, + seeds = [LIQUIDITY_VAULT_SEED, reserve.key().as_ref()], + bump, + )] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account( + init, + payer = owner, + mint::decimals = liquidity_mint.decimals, + mint::authority = reserve, + seeds = [SHARE_MINT_SEED, reserve.key().as_ref()], + bump, + )] + pub share_mint: InterfaceAccount<'info, Mint>, + + // Bound by seeds to this market's feed for this mint — the reserve can only + // trust the price its own market publishes. + #[account( + seeds = [PRICE_FEED_SEED, lending_market.key().as_ref(), liquidity_mint.key().as_ref()], + bump = price_feed.bump, + )] + pub price_feed: Account<'info, PriceFeed>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/admin/mod.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/mod.rs new file mode 100644 index 000000000..2aa254adc --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/mod.rs @@ -0,0 +1,11 @@ +pub mod collect_protocol_fees; +pub mod initialize_lending_market; +pub mod initialize_reserve; +pub mod set_price; +pub mod update_reserve_config; + +pub use collect_protocol_fees::*; +pub use initialize_lending_market::*; +pub use initialize_reserve::*; +pub use set_price::*; +pub use update_reserve_config::*; diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/admin/set_price.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/set_price.rs new file mode 100644 index 000000000..4044c255b --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/set_price.rs @@ -0,0 +1,50 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; + +use crate::constants::PRICE_FEED_SEED; +use crate::state::{LendingMarket, PriceFeed}; + +/// Test stand-in for a Switchboard On-Demand feed: writes a price directly so +/// LiteSVM tests are deterministic. In production the reserve points at a real +/// Switchboard feed instead and this handler is unused. +/// +/// The feed PDA is seeded by `[b"price_feed", market, mint]` and writing it +/// requires the market's `owner` to sign, so a market's prices can only be set +/// by that market and never squatted by an outsider. +pub fn handle_set_price( + context: Context, + price_mantissa: i128, + exponent: i32, +) -> Result<()> { + let feed = &mut context.accounts.price_feed; + feed.market = context.accounts.lending_market.key(); + feed.mint = context.accounts.mint.key(); + feed.bump = context.bumps.price_feed; + feed.price_mantissa = price_mantissa; + feed.exponent = exponent; + feed.last_updated_slot = Clock::get()?.slot; + Ok(()) +} + +#[derive(Accounts)] +pub struct SetPrice<'info> { + // Only the market's owner may publish its prices. + #[account(has_one = owner)] + pub lending_market: Account<'info, LendingMarket>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + init_if_needed, + payer = owner, + space = PriceFeed::DISCRIMINATOR.len() + PriceFeed::INIT_SPACE, + seeds = [PRICE_FEED_SEED, lending_market.key().as_ref(), mint.key().as_ref()], + bump, + )] + pub price_feed: Account<'info, PriceFeed>, + + pub mint: InterfaceAccount<'info, Mint>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/admin/update_reserve_config.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/update_reserve_config.rs new file mode 100644 index 000000000..06df1b1b0 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/admin/update_reserve_config.rs @@ -0,0 +1,28 @@ +use anchor_lang::prelude::*; + +use crate::state::{LendingMarket, Reserve, ReserveConfig}; + +pub fn handle_update_reserve_config( + context: Context, + config: ReserveConfig, +) -> Result<()> { + config.validate()?; + context.accounts.reserve.config = config; + Ok(()) +} + +#[derive(Accounts)] +pub struct UpdateReserveConfig<'info> { + // The market is identified by the reserve's `has_one = lending_market`; we + // only need to prove the signer owns it, not re-derive its address. + #[account(has_one = owner)] + pub lending_market: Account<'info, LendingMarket>, + + pub owner: Signer<'info>, + + #[account( + mut, + has_one = lending_market, + )] + pub reserve: Account<'info, Reserve>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/borrow_obligation_liquidity.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/borrow_obligation_liquidity.rs new file mode 100644 index 000000000..723a29d1b --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/borrow_obligation_liquidity.rs @@ -0,0 +1,121 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::FIXED_POINT_SCALE; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, Rounding}; +use crate::state::{reserve_signer_seeds, Obligation, PriceFeed, Reserve}; + +/// Borrow liquidity against the obligation's collateral. The new debt's value +/// (rounded up) plus the existing debt must stay within the obligation's +/// allowed-borrow value. The borrowed amount is recorded as scaled principal at +/// the reserve's current index (rounded up) so it accrues interest going forward. +pub fn handle_borrow_obligation_liquidity( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let slot = Clock::get()?.slot; + let reserve_key = context.accounts.reserve.key(); + + context.accounts.obligation.require_refreshed()?; + context.accounts.reserve.require_refreshed()?; + + let price_scaled = context.accounts.price_feed.price_scaled(slot)?; + let decimals = context.accounts.reserve.liquidity_decimals; + let borrow_value = market_value(liquidity_amount, decimals, price_scaled, Rounding::Up)?; + + let projected_borrowed_value = context + .accounts + .obligation + .borrowed_value + .checked_add(borrow_value) + .ok_or(LendingError::MathOverflow)?; + require!( + projected_borrowed_value <= context.accounts.obligation.allowed_borrow_value, + LendingError::BorrowTooLarge + ); + require!( + liquidity_amount <= context.accounts.reserve.available_liquidity, + LendingError::InsufficientReserveLiquidity + ); + + let scaled_added = mul_div_ceil( + liquidity_amount as u128, + FIXED_POINT_SCALE, + context.accounts.reserve.borrow_accumulation_factor, + )?; + + { + let reserve = &mut context.accounts.reserve; + reserve.borrowed_principal = reserve + .borrowed_principal + .checked_add(scaled_added) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(liquidity_amount) + .ok_or(LendingError::MathOverflow)?; + } + + { + let obligation = &mut context.accounts.obligation; + let index = obligation.upsert_borrow(reserve_key)?; + obligation.borrows[index].borrowed_principal = obligation.borrows[index] + .borrowed_principal + .checked_add(scaled_added) + .ok_or(LendingError::MathOverflow)?; + obligation.stale = true; + } + + let reserve = &context.accounts.reserve; + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidity_vault.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.user_liquidity.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + liquidity_amount, + decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct BorrowObligationLiquidity<'info> { + #[account(mut, has_one = owner)] + pub obligation: Account<'info, Obligation>, + + pub owner: Signer<'info>, + + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + has_one = price_feed, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] + pub reserve: Account<'info, Reserve>, + + pub price_feed: Account<'info, PriceFeed>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/deposit_obligation_collateral.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/deposit_obligation_collateral.rs new file mode 100644 index 000000000..a33e8bfac --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/deposit_obligation_collateral.rs @@ -0,0 +1,78 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::OBLIGATION_SHARE_VAULT_SEED; +use crate::errors::LendingError; +use crate::state::{Obligation, Reserve}; + +/// Post share tokens as collateral. The shares move into a per-(reserve, +/// obligation) vault owned by the obligation PDA. No health check is needed — +/// adding collateral only improves health — but the obligation is marked stale +/// so its cached values are recomputed before the next health-dependent action. +pub fn handle_deposit_obligation_collateral( + context: Context, + share_amount: u64, +) -> Result<()> { + require!(share_amount > 0, LendingError::ZeroAmount); + + let reserve_key = context.accounts.reserve.key(); + let obligation = &mut context.accounts.obligation; + let index = obligation.upsert_collateral(reserve_key)?; + obligation.deposits[index].deposited_shares = obligation.deposits[index] + .deposited_shares + .checked_add(share_amount) + .ok_or(LendingError::MathOverflow)?; + obligation.stale = true; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.user_share.to_account_info(), + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.obligation_share_vault.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + share_amount, + context.accounts.share_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct DepositObligationCollateral<'info> { + #[account(mut, has_one = owner)] + pub obligation: Account<'info, Obligation>, + + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + has_one = share_mint, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] + pub reserve: Account<'info, Reserve>, + + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account( + init_if_needed, + payer = owner, + token::mint = share_mint, + token::authority = obligation, + seeds = [OBLIGATION_SHARE_VAULT_SEED, reserve.key().as_ref(), obligation.key().as_ref()], + bump, + )] + pub obligation_share_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/deposit_reserve_liquidity.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/deposit_reserve_liquidity.rs new file mode 100644 index 000000000..3425497ca --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/deposit_reserve_liquidity.rs @@ -0,0 +1,100 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + mint_to, transfer_checked, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::LendingError; +use crate::math::mul_div_floor; +use crate::state::{reserve_signer_seeds, Reserve}; + +/// Supply liquidity to a reserve and receive share tokens. The first deposit +/// mints share tokens 1:1; later deposits mint +/// `liquidity_amount * share_supply / total_liquidity`, floored so the protocol +/// keeps any rounding dust. +pub fn handle_deposit_reserve_liquidity( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let reserve = &mut context.accounts.reserve; + reserve.require_refreshed()?; + + let share_supply = reserve.share_mint_supply as u128; + let share_amount = if share_supply == 0 { + liquidity_amount as u128 + } else { + mul_div_floor(liquidity_amount as u128, share_supply, reserve.total_liquidity()?)? + }; + require!(share_amount > 0, LendingError::DepositTooSmall); + let share_amount = u64::try_from(share_amount).map_err(|_| LendingError::MathOverflow)?; + + // Effects before interactions. + reserve.available_liquidity = reserve + .available_liquidity + .checked_add(liquidity_amount) + .ok_or(LendingError::MathOverflow)?; + reserve.share_mint_supply = reserve + .share_mint_supply + .checked_add(share_amount) + .ok_or(LendingError::MathOverflow)?; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.user_liquidity.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.liquidity_vault.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + liquidity_amount, + reserve.liquidity_decimals, + )?; + + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + mint_to( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.user_share.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + share_amount, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct DepositReserveLiquidity<'info> { + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + has_one = share_mint, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub owner: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/initialize_obligation.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/initialize_obligation.rs new file mode 100644 index 000000000..c7a761354 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/initialize_obligation.rs @@ -0,0 +1,40 @@ +use anchor_lang::prelude::*; + +use crate::constants::OBLIGATION_SEED; +use crate::state::{LendingMarket, Obligation}; + +pub fn handle_initialize_obligation(context: Context) -> Result<()> { + let obligation = &mut context.accounts.obligation; + obligation.lending_market = context.accounts.lending_market.key(); + obligation.owner = context.accounts.owner.key(); + obligation.last_update_slot = Clock::get()?.slot; + // Stale until the first refresh; an empty obligation has nothing to value yet. + obligation.stale = true; + obligation.deposited_value = 0; + obligation.borrowed_value = 0; + obligation.allowed_borrow_value = 0; + obligation.unhealthy_borrow_value = 0; + obligation.deposits = Vec::new(); + obligation.borrows = Vec::new(); + obligation.bump = context.bumps.obligation; + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializeObligation<'info> { + pub lending_market: Account<'info, LendingMarket>, + + #[account( + init, + payer = owner, + space = Obligation::DISCRIMINATOR.len() + Obligation::INIT_SPACE, + seeds = [OBLIGATION_SEED, lending_market.key().as_ref(), owner.key().as_ref()], + bump, + )] + pub obligation: Account<'info, Obligation>, + + #[account(mut)] + pub owner: Signer<'info>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/liquidate_obligation.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/liquidate_obligation.rs new file mode 100644 index 000000000..bb24f1369 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/liquidate_obligation.rs @@ -0,0 +1,223 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::{ + BPS_DENOMINATOR, FIXED_POINT_SCALE, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED, +}; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, mul_div_floor, value_to_amount, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Repay part of an unhealthy obligation's debt and seize collateral share +/// tokens worth the repayment plus the liquidation bonus. +/// +/// The close factor caps how much of the borrow one call may repay; it comes +/// from the repay (borrow) reserve because it is a property of the debt being +/// closed. The liquidation bonus comes from the collateral reserve because it +/// prices the collateral being seized. If the requested repayment would seize +/// more collateral than the obligation holds, the call fails with +/// `LiquidationTooLarge` — silently capping the seizure would make the +/// liquidator pay full price for less collateral. +/// +/// Self-liquidation (the owner liquidating their own position) is not blocked: +/// it is only possible while unhealthy and is economically pointless, matching +/// how Solend and Kamino behave. +pub fn handle_liquidate_obligation( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let slot = Clock::get()?.slot; + + context.accounts.obligation.require_refreshed()?; + context.accounts.repay_reserve.require_refreshed()?; + context.accounts.collateral_reserve.require_refreshed()?; + + let obligation = &context.accounts.obligation; + let repay_reserve = &context.accounts.repay_reserve; + let collateral_reserve = &context.accounts.collateral_reserve; + + require!( + obligation.borrowed_value > obligation.unhealthy_borrow_value, + LendingError::ObligationHealthy + ); + + let repay_price = context.accounts.repay_price_feed.price_scaled(slot)?; + let collateral_price = context.accounts.collateral_price_feed.price_scaled(slot)?; + + let borrow_index = obligation.find_borrow(repay_reserve.key())?; + let collateral_index = obligation.find_collateral(collateral_reserve.key())?; + let borrowed_principal = obligation.borrows[borrow_index].borrowed_principal; + let deposited_shares = obligation.deposits[collateral_index].deposited_shares; + + // How much debt this liquidation repays, capped by the close factor. + let accumulation_factor = repay_reserve.borrow_accumulation_factor; + let debt_now = mul_div_ceil(borrowed_principal, accumulation_factor, FIXED_POINT_SCALE)?; + let debt_now = u64::try_from(debt_now).map_err(|_| LendingError::MathOverflow)?; + let max_repay = mul_div_floor( + debt_now as u128, + repay_reserve.config.close_factor_bps as u128, + BPS_DENOMINATOR, + )?; + let repay = liquidity_amount.min(u64::try_from(max_repay).map_err(|_| LendingError::MathOverflow)?); + require!(repay > 0, LendingError::ZeroAmount); + + // Collateral to seize: value of the repayment plus the bonus, converted into + // the collateral token and then into share tokens. Every step rounds down, + // toward the borrower, so the obligation is never over-seized by rounding. + let repay_value = market_value( + repay, + repay_reserve.liquidity_decimals, + repay_price, + Rounding::Down, + )?; + let bonus_value = mul_div_floor( + repay_value, + collateral_reserve.config.liquidation_bonus_bps as u128, + BPS_DENOMINATOR, + )?; + let seize_value = repay_value + .checked_add(bonus_value) + .ok_or(LendingError::MathOverflow)?; + let seize_liquidity = value_to_amount( + seize_value, + collateral_reserve.liquidity_decimals, + collateral_price, + Rounding::Down, + )?; + let seize_shares = mul_div_floor( + seize_liquidity as u128, + collateral_reserve.share_mint_supply as u128, + collateral_reserve.total_liquidity()?.max(1), + )?; + let seize_shares = u64::try_from(seize_shares).map_err(|_| LendingError::MathOverflow)?; + require!(seize_shares > 0, LendingError::ZeroAmount); + require!( + seize_shares <= deposited_shares, + LendingError::LiquidationTooLarge + ); + + let scaled_removed = + mul_div_floor(repay as u128, FIXED_POINT_SCALE, accumulation_factor)?.min(borrowed_principal); + + // Effects: repay side. + { + let repay_reserve = &mut context.accounts.repay_reserve; + repay_reserve.borrowed_principal = repay_reserve + .borrowed_principal + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + repay_reserve.available_liquidity = repay_reserve + .available_liquidity + .checked_add(repay) + .ok_or(LendingError::MathOverflow)?; + } + + // Effects: obligation debt and collateral. + let (lending_market, owner, obligation_bump) = { + let obligation = &mut context.accounts.obligation; + obligation.borrows[borrow_index].borrowed_principal = borrowed_principal + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + if obligation.borrows[borrow_index].borrowed_principal == 0 { + obligation.borrows.remove(borrow_index); + } + obligation.deposits[collateral_index].deposited_shares = deposited_shares + .checked_sub(seize_shares) + .ok_or(LendingError::MathOverflow)?; + if obligation.deposits[collateral_index].deposited_shares == 0 { + obligation.deposits.remove(collateral_index); + } + obligation.stale = true; + (obligation.lending_market, obligation.owner, obligation.bump) + }; + + // Interactions: liquidator repays, then receives the seized share tokens. + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidator_repay_source.to_account_info(), + mint: context.accounts.repay_liquidity_mint.to_account_info(), + to: context.accounts.repay_liquidity_vault.to_account_info(), + authority: context.accounts.liquidator.to_account_info(), + }, + ), + repay, + context.accounts.repay_reserve.liquidity_decimals, + )?; + + let bump = [obligation_bump]; + let seeds: [&[u8]; 4] = [OBLIGATION_SEED, lending_market.as_ref(), owner.as_ref(), &bump]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.obligation_collateral_vault.to_account_info(), + mint: context.accounts.collateral_share_mint.to_account_info(), + to: context.accounts.liquidator_collateral_dest.to_account_info(), + authority: context.accounts.obligation.to_account_info(), + }, + &[&seeds], + ), + seize_shares, + context.accounts.collateral_share_mint.decimals, + )?; + + Ok(()) +} + +// Liquidation touches 13 accounts; every Account/InterfaceAccount is boxed so +// account deserialization happens on the heap and stays within the BPF stack frame. +#[derive(Accounts)] +pub struct LiquidateObligation<'info> { + #[account(mut)] + pub obligation: Box>, + + pub liquidator: Signer<'info>, + + #[account( + mut, + constraint = repay_reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] + pub repay_reserve: Box>, + + #[account( + constraint = collateral_reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] + pub collateral_reserve: Box>, + + #[account(address = repay_reserve.price_feed)] + pub repay_price_feed: Box>, + + #[account(address = collateral_reserve.price_feed)] + pub collateral_price_feed: Box>, + + #[account(address = repay_reserve.liquidity_mint)] + pub repay_liquidity_mint: Box>, + + #[account(address = collateral_reserve.share_mint)] + pub collateral_share_mint: Box>, + + #[account(mut, address = repay_reserve.liquidity_vault)] + pub repay_liquidity_vault: Box>, + + #[account( + mut, + seeds = [OBLIGATION_SHARE_VAULT_SEED, collateral_reserve.key().as_ref(), obligation.key().as_ref()], + bump, + token::mint = collateral_share_mint, + token::authority = obligation, + )] + pub obligation_collateral_vault: Box>, + + #[account(mut)] + pub liquidator_repay_source: Box>, + + #[account(mut)] + pub liquidator_collateral_dest: Box>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/mod.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/mod.rs new file mode 100644 index 000000000..a12366989 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/mod.rs @@ -0,0 +1,23 @@ +pub mod admin; +pub mod borrow_obligation_liquidity; +pub mod deposit_obligation_collateral; +pub mod deposit_reserve_liquidity; +pub mod initialize_obligation; +pub mod liquidate_obligation; +pub mod redeem_reserve_collateral; +pub mod refresh_obligation; +pub mod refresh_reserve; +pub mod repay_obligation_liquidity; +pub mod withdraw_obligation_collateral; + +pub use admin::*; +pub use borrow_obligation_liquidity::*; +pub use deposit_obligation_collateral::*; +pub use deposit_reserve_liquidity::*; +pub use initialize_obligation::*; +pub use liquidate_obligation::*; +pub use redeem_reserve_collateral::*; +pub use refresh_obligation::*; +pub use refresh_reserve::*; +pub use repay_obligation_liquidity::*; +pub use withdraw_obligation_collateral::*; diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/redeem_reserve_collateral.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/redeem_reserve_collateral.rs new file mode 100644 index 000000000..459b56cf8 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/redeem_reserve_collateral.rs @@ -0,0 +1,103 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + burn, transfer_checked, Burn, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::LendingError; +use crate::math::mul_div_floor; +use crate::state::{reserve_signer_seeds, Reserve}; + +/// Burn share tokens and withdraw the underlying liquidity they represent: +/// `share_amount * total_liquidity / share_supply`, floored so the protocol +/// keeps any rounding dust. Capped by the reserve's available (un-borrowed) +/// liquidity. +pub fn handle_redeem_reserve_collateral( + context: Context, + share_amount: u64, +) -> Result<()> { + require!(share_amount > 0, LendingError::ZeroAmount); + let reserve = &mut context.accounts.reserve; + reserve.require_refreshed()?; + + let share_supply = reserve.share_mint_supply as u128; + require!(share_supply > 0, LendingError::InsufficientReserveLiquidity); + let liquidity_amount = mul_div_floor( + share_amount as u128, + reserve.total_liquidity()?, + share_supply, + )?; + let liquidity_amount = u64::try_from(liquidity_amount).map_err(|_| LendingError::MathOverflow)?; + require!( + liquidity_amount <= reserve.available_liquidity, + LendingError::InsufficientReserveLiquidity + ); + + reserve.available_liquidity = reserve + .available_liquidity + .checked_sub(liquidity_amount) + .ok_or(LendingError::MathOverflow)?; + reserve.share_mint_supply = reserve + .share_mint_supply + .checked_sub(share_amount) + .ok_or(LendingError::MathOverflow)?; + + burn( + CpiContext::new( + context.accounts.token_program.key(), + Burn { + mint: context.accounts.share_mint.to_account_info(), + from: context.accounts.user_share.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + share_amount, + )?; + + let bump = [reserve.bump]; + let seeds = reserve_signer_seeds(&reserve.lending_market, &reserve.liquidity_mint, &bump); + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.liquidity_vault.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.user_liquidity.to_account_info(), + authority: reserve.to_account_info(), + }, + &[&seeds], + ), + liquidity_amount, + reserve.liquidity_decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct RedeemReserveCollateral<'info> { + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + has_one = share_mint, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub owner: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/refresh_obligation.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/refresh_obligation.rs new file mode 100644 index 000000000..21460be55 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/refresh_obligation.rs @@ -0,0 +1,144 @@ +use anchor_lang::prelude::*; + +use crate::constants::BPS_DENOMINATOR; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, mul_div_floor, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Recompute the obligation's deposited/borrowed values and its borrow limits +/// from the current state of every reserve it touches. +/// +/// The reserve and price-feed accounts are passed as `remaining_accounts`, two +/// per entry — first the deposit reserves in `obligation.deposits` order, then +/// the borrow reserves in `obligation.borrows` order — each as +/// `[reserve, price_feed]`. Every reserve must already be refreshed this slot. +/// +/// Collateral value is floored and debt value is ceiled, so health is always +/// evaluated conservatively against the borrower. +pub fn handle_refresh_obligation(context: Context) -> Result<()> { + let slot = Clock::get()?.slot; + let obligation = &mut context.accounts.obligation; + let lending_market = obligation.lending_market; + let accounts = context.remaining_accounts; + let mut cursor = 0usize; + + let mut deposited_value: u128 = 0; + let mut allowed_borrow_value: u128 = 0; + let mut unhealthy_borrow_value: u128 = 0; + + for collateral in obligation.deposits.iter_mut() { + let (reserve, price_scaled) = + read_pair(accounts, &mut cursor, collateral.reserve, lending_market, slot)?; + + let liquidity = mul_div_floor( + collateral.deposited_shares as u128, + reserve.total_liquidity()?, + (reserve.share_mint_supply as u128).max(1), + )?; + let liquidity = u64::try_from(liquidity).map_err(|_| LendingError::MathOverflow)?; + let value = market_value(liquidity, reserve.liquidity_decimals, price_scaled, Rounding::Down)?; + + collateral.market_value = value; + deposited_value = deposited_value + .checked_add(value) + .ok_or(LendingError::MathOverflow)?; + allowed_borrow_value = allowed_borrow_value + .checked_add(mul_div_floor( + value, + reserve.config.loan_to_value_bps as u128, + BPS_DENOMINATOR, + )?) + .ok_or(LendingError::MathOverflow)?; + unhealthy_borrow_value = unhealthy_borrow_value + .checked_add(mul_div_floor( + value, + reserve.config.liquidation_threshold_bps as u128, + BPS_DENOMINATOR, + )?) + .ok_or(LendingError::MathOverflow)?; + } + + let mut borrowed_value: u128 = 0; + for borrow in obligation.borrows.iter_mut() { + let (reserve, price_scaled) = + read_pair(accounts, &mut cursor, borrow.reserve, lending_market, slot)?; + + let debt = mul_div_ceil( + borrow.borrowed_principal, + reserve.borrow_accumulation_factor, + crate::constants::FIXED_POINT_SCALE, + )?; + let debt = u64::try_from(debt).map_err(|_| LendingError::MathOverflow)?; + let value = market_value(debt, reserve.liquidity_decimals, price_scaled, Rounding::Up)?; + + borrow.market_value = value; + borrowed_value = borrowed_value + .checked_add(value) + .ok_or(LendingError::MathOverflow)?; + } + + require!( + cursor == accounts.len(), + LendingError::InvalidObligationAccount + ); + + obligation.deposited_value = deposited_value; + obligation.allowed_borrow_value = allowed_borrow_value; + obligation.unhealthy_borrow_value = unhealthy_borrow_value; + obligation.borrowed_value = borrowed_value; + obligation.last_update_slot = slot; + obligation.stale = false; + Ok(()) +} + +/// Read the next `[reserve, price_feed]` pair from `remaining_accounts`, +/// checking it matches the obligation's stored reserve, belongs to the +/// obligation's lending market, and that both the reserve (refreshed this +/// slot) and the price (fresh) are usable. +fn read_pair<'a, 'info>( + accounts: &'a [AccountInfo<'info>], + cursor: &mut usize, + expected_reserve: Pubkey, + lending_market: Pubkey, + slot: u64, +) -> Result<(Reserve, u128)> +where + 'a: 'info, +{ + let reserve_info = accounts + .get(*cursor) + .ok_or(LendingError::InvalidObligationAccount)?; + let price_info = accounts + .get(*cursor + 1) + .ok_or(LendingError::InvalidObligationAccount)?; + *cursor += 2; + + require_keys_eq!( + reserve_info.key(), + expected_reserve, + LendingError::InvalidObligationAccount + ); + let reserve = Account::::try_from(reserve_info)?; + require_keys_eq!( + reserve.lending_market, + lending_market, + LendingError::MarketMismatch + ); + reserve.require_refreshed()?; + + require_keys_eq!( + price_info.key(), + reserve.price_feed, + LendingError::InvalidObligationAccount + ); + let price_feed = Account::::try_from(price_info)?; + let price_scaled = price_feed.price_scaled(slot)?; + + Ok((reserve.into_inner(), price_scaled)) +} + +#[derive(Accounts)] +pub struct RefreshObligation<'info> { + #[account(mut)] + pub obligation: Account<'info, Obligation>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/refresh_reserve.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/refresh_reserve.rs new file mode 100644 index 000000000..151f095ad --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/refresh_reserve.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +use crate::state::Reserve; + +/// Accrue interest up to the current slot. Must run (as its own instruction in +/// the same transaction) before any handler that reads the reserve's value, and +/// before `refresh_obligation` for any reserve the obligation touches. +pub fn handle_refresh_reserve(context: Context) -> Result<()> { + context.accounts.reserve.accrue_interest(Clock::get()?.slot) +} + +#[derive(Accounts)] +pub struct RefreshReserve<'info> { + #[account(mut)] + pub reserve: Account<'info, Reserve>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/repay_obligation_liquidity.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/repay_obligation_liquidity.rs new file mode 100644 index 000000000..d71a4217b --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/repay_obligation_liquidity.rs @@ -0,0 +1,100 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::FIXED_POINT_SCALE; +use crate::errors::LendingError; +use crate::math::{mul_div_ceil, mul_div_floor}; +use crate::state::{Obligation, Reserve}; + +/// Repay borrowed liquidity, clamped to the live debt. The repaid amount removes +/// scaled principal rounded down, so any sub-unit of principal lingers with the +/// borrower rather than being forgiven by rounding. Anyone may repay on behalf +/// of an obligation, so there is no owner check. +pub fn handle_repay_obligation_liquidity( + context: Context, + liquidity_amount: u64, +) -> Result<()> { + require!(liquidity_amount > 0, LendingError::ZeroAmount); + let reserve_key = context.accounts.reserve.key(); + context.accounts.reserve.require_refreshed()?; + + let index = context.accounts.reserve.borrow_accumulation_factor; + let decimals = context.accounts.reserve.liquidity_decimals; + + let borrow_index = context.accounts.obligation.find_borrow(reserve_key)?; + let borrowed_principal = context.accounts.obligation.borrows[borrow_index].borrowed_principal; + + let debt_now = mul_div_ceil(borrowed_principal, index, FIXED_POINT_SCALE)?; + let debt_now = u64::try_from(debt_now).map_err(|_| LendingError::MathOverflow)?; + let repay = liquidity_amount.min(debt_now); + require!(repay > 0, LendingError::ZeroAmount); + + let scaled_removed = mul_div_floor(repay as u128, FIXED_POINT_SCALE, index)?.min(borrowed_principal); + + { + let reserve = &mut context.accounts.reserve; + reserve.borrowed_principal = reserve + .borrowed_principal + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + reserve.available_liquidity = reserve + .available_liquidity + .checked_add(repay) + .ok_or(LendingError::MathOverflow)?; + } + + { + let obligation = &mut context.accounts.obligation; + obligation.borrows[borrow_index].borrowed_principal = borrowed_principal + .checked_sub(scaled_removed) + .ok_or(LendingError::MathOverflow)?; + if obligation.borrows[borrow_index].borrowed_principal == 0 { + obligation.borrows.remove(borrow_index); + } + obligation.stale = true; + } + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.user_liquidity.to_account_info(), + mint: context.accounts.liquidity_mint.to_account_info(), + to: context.accounts.liquidity_vault.to_account_info(), + authority: context.accounts.repayer.to_account_info(), + }, + ), + repay, + decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct RepayObligationLiquidity<'info> { + #[account(mut)] + pub obligation: Account<'info, Obligation>, + + #[account( + mut, + has_one = liquidity_mint, + has_one = liquidity_vault, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] + pub reserve: Account<'info, Reserve>, + + pub liquidity_mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub liquidity_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_liquidity: InterfaceAccount<'info, TokenAccount>, + + pub repayer: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/instructions/withdraw_obligation_collateral.rs b/finance/lending/anchor-v1/programs/lending/src/instructions/withdraw_obligation_collateral.rs new file mode 100644 index 000000000..a38860b85 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/instructions/withdraw_obligation_collateral.rs @@ -0,0 +1,135 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::{BPS_DENOMINATOR, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED}; +use crate::errors::LendingError; +use crate::math::{market_value, mul_div_ceil, Rounding}; +use crate::state::{Obligation, PriceFeed, Reserve}; + +/// Withdraw posted share-token collateral, but only as long as the obligation +/// stays within its borrow limit afterwards. The post-withdraw allowed-borrow +/// value is simulated and the withdraw is rejected if the existing debt would +/// exceed it. +pub fn handle_withdraw_obligation_collateral( + context: Context, + share_amount: u64, +) -> Result<()> { + require!(share_amount > 0, LendingError::ZeroAmount); + let slot = Clock::get()?.slot; + + context.accounts.obligation.require_refreshed()?; + context.accounts.reserve.require_refreshed()?; + let reserve = &context.accounts.reserve; + let price_scaled = context.accounts.price_feed.price_scaled(slot)?; + + let obligation = &mut context.accounts.obligation; + let index = obligation.find_collateral(reserve.key())?; + require!( + obligation.deposits[index].deposited_shares >= share_amount, + LendingError::WithdrawTooLarge + ); + + // Value of the collateral being removed, and the borrow power it backed. + // Every step rounds UP: subtracting an over-estimate of the removed borrow + // power guarantees the resulting allowance is never higher than a full + // recompute would give, so independent flooring can't let a withdraw + // squeak past the health check by a rounding sub-unit. + let removed_liquidity = mul_div_ceil( + share_amount as u128, + reserve.total_liquidity()?, + (reserve.share_mint_supply as u128).max(1), + )?; + let removed_liquidity = u64::try_from(removed_liquidity).map_err(|_| LendingError::MathOverflow)?; + let removed_value = market_value( + removed_liquidity, + reserve.liquidity_decimals, + price_scaled, + Rounding::Up, + )?; + let removed_allowed = mul_div_ceil( + removed_value, + reserve.config.loan_to_value_bps as u128, + BPS_DENOMINATOR, + )?; + // saturating_sub is correct here (and not balance math): the ceil-rounded + // removal can exceed the floor-cached total by a sub-unit when withdrawing + // everything, and zero remaining allowance is the conservative answer. + let new_allowed_borrow_value = obligation + .allowed_borrow_value + .saturating_sub(removed_allowed); + require!( + obligation.borrowed_value <= new_allowed_borrow_value, + LendingError::WithdrawTooLarge + ); + + // Effects. + obligation.deposits[index].deposited_shares = obligation.deposits[index] + .deposited_shares + .checked_sub(share_amount) + .ok_or(LendingError::MathOverflow)?; + if obligation.deposits[index].deposited_shares == 0 { + obligation.deposits.remove(index); + } + obligation.stale = true; + + let lending_market = obligation.lending_market; + let owner = obligation.owner; + let bump = [obligation.bump]; + let seeds: [&[u8]; 4] = [ + OBLIGATION_SEED, + lending_market.as_ref(), + owner.as_ref(), + &bump, + ]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.obligation_share_vault.to_account_info(), + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.user_share.to_account_info(), + authority: obligation.to_account_info(), + }, + &[&seeds], + ), + share_amount, + context.accounts.share_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct WithdrawObligationCollateral<'info> { + #[account(mut, has_one = owner)] + pub obligation: Account<'info, Obligation>, + + pub owner: Signer<'info>, + + #[account( + has_one = share_mint, + has_one = price_feed, + constraint = reserve.lending_market == obligation.lending_market @ LendingError::MarketMismatch, + )] + pub reserve: Account<'info, Reserve>, + + pub price_feed: Account<'info, PriceFeed>, + + pub share_mint: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [OBLIGATION_SHARE_VAULT_SEED, reserve.key().as_ref(), obligation.key().as_ref()], + bump, + token::mint = share_mint, + token::authority = obligation, + )] + pub obligation_share_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub user_share: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/lib.rs b/finance/lending/anchor-v1/programs/lending/src/lib.rs new file mode 100644 index 000000000..462b3be7f --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/lib.rs @@ -0,0 +1,108 @@ +use anchor_lang::prelude::*; + +pub mod constants; +pub mod errors; +pub mod math; +pub mod instructions; +pub mod state; + +use instructions::*; +use state::ReserveConfig; + +declare_id!("4bvT6A8S7ZVL6bSvK2KoL2nQ4F5H6AF9133kCYbMJj1t"); + +#[program] +pub mod lending { + use super::*; + + pub fn initialize_lending_market( + context: Context, + market_id: u64, + ) -> Result<()> { + instructions::handle_initialize_lending_market(context, market_id) + } + + pub fn initialize_reserve(context: Context, config: ReserveConfig) -> Result<()> { + instructions::handle_initialize_reserve(context, config) + } + + pub fn update_reserve_config( + context: Context, + config: ReserveConfig, + ) -> Result<()> { + instructions::handle_update_reserve_config(context, config) + } + + pub fn collect_protocol_fees(context: Context) -> Result<()> { + instructions::handle_collect_protocol_fees(context) + } + + pub fn set_price( + context: Context, + price_mantissa: i128, + exponent: i32, + ) -> Result<()> { + instructions::handle_set_price(context, price_mantissa, exponent) + } + + pub fn refresh_reserve(context: Context) -> Result<()> { + instructions::handle_refresh_reserve(context) + } + + pub fn deposit_reserve_liquidity( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_deposit_reserve_liquidity(context, liquidity_amount) + } + + pub fn redeem_reserve_collateral( + context: Context, + share_amount: u64, + ) -> Result<()> { + instructions::handle_redeem_reserve_collateral(context, share_amount) + } + + pub fn initialize_obligation(context: Context) -> Result<()> { + instructions::handle_initialize_obligation(context) + } + + pub fn refresh_obligation(context: Context) -> Result<()> { + instructions::handle_refresh_obligation(context) + } + + pub fn deposit_obligation_collateral( + context: Context, + share_amount: u64, + ) -> Result<()> { + instructions::handle_deposit_obligation_collateral(context, share_amount) + } + + pub fn withdraw_obligation_collateral( + context: Context, + share_amount: u64, + ) -> Result<()> { + instructions::handle_withdraw_obligation_collateral(context, share_amount) + } + + pub fn borrow_obligation_liquidity( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_borrow_obligation_liquidity(context, liquidity_amount) + } + + pub fn repay_obligation_liquidity( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_repay_obligation_liquidity(context, liquidity_amount) + } + + pub fn liquidate_obligation( + context: Context, + liquidity_amount: u64, + ) -> Result<()> { + instructions::handle_liquidate_obligation(context, liquidity_amount) + } +} diff --git a/finance/lending/anchor-v1/programs/lending/src/math.rs b/finance/lending/anchor-v1/programs/lending/src/math.rs new file mode 100644 index 000000000..26dc107d4 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/math.rs @@ -0,0 +1,101 @@ +use anchor_lang::prelude::*; + +use crate::constants::FIXED_POINT_SCALE_DECIMALS; +use crate::errors::LendingError; + +/// Which way to break ties when a division truncates. Deposits/redeems and +/// collateral valuations round the user's favourable quantity DOWN; debt and +/// protocol-owed quantities round UP. The protocol never loses a base unit to +/// rounding, so dust cannot be extracted by repeated round-trips. +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Rounding { + Down, + Up, +} + +/// 10^exponent as a u128, erroring instead of wrapping. +pub fn ten_pow(exponent: u32) -> Result { + Ok(10u128 + .checked_pow(exponent) + .ok_or(LendingError::MathOverflow)?) +} + +/// floor((a * b) / denominator), computed in u128. +pub fn mul_div_floor(a: u128, b: u128, denominator: u128) -> Result { + require!(denominator > 0, LendingError::MathOverflow); + let product = a.checked_mul(b).ok_or(LendingError::MathOverflow)?; + Ok(product + .checked_div(denominator) + .ok_or(LendingError::MathOverflow)?) +} + +/// ceil((a * b) / denominator), computed in u128. +pub fn mul_div_ceil(a: u128, b: u128, denominator: u128) -> Result { + require!(denominator > 0, LendingError::MathOverflow); + let product = a.checked_mul(b).ok_or(LendingError::MathOverflow)?; + let rounding = denominator + .checked_sub(1) + .ok_or(LendingError::MathOverflow)?; + Ok(product + .checked_add(rounding) + .ok_or(LendingError::MathOverflow)? + .checked_div(denominator) + .ok_or(LendingError::MathOverflow)?) +} + +fn mul_div(a: u128, b: u128, denominator: u128, rounding: Rounding) -> Result { + match rounding { + Rounding::Down => mul_div_floor(a, b, denominator), + Rounding::Up => mul_div_ceil(a, b, denominator), + } +} + +/// Quote-currency value (in FIXED_POINT_SCALE-scaled units) of `amount` base +/// units of a token with `decimals`, given `price_scaled` from a price feed. +/// +/// `price_scaled` already carries the FIXED_POINT_SCALE factor (it is the real +/// price multiplied by FIXED_POINT_SCALE, see `PriceFeed::price_scaled`), so the +/// value is `amount * price_scaled / 10^decimals`. +pub fn market_value( + amount: u64, + decimals: u8, + price_scaled: u128, + rounding: Rounding, +) -> Result { + let divisor = ten_pow(decimals as u32)?; + mul_div(amount as u128, price_scaled, divisor, rounding) +} + +/// Inverse of [`market_value`]: how many base units of a token with `decimals` +/// are worth `value_scaled` quote-currency value at `price_scaled`. +pub fn value_to_amount( + value_scaled: u128, + decimals: u8, + price_scaled: u128, + rounding: Rounding, +) -> Result { + let multiplier = ten_pow(decimals as u32)?; + let amount = mul_div(value_scaled, multiplier, price_scaled, rounding)?; + u64::try_from(amount).map_err(|_| LendingError::MathOverflow.into()) +} + +/// Combine a price feed's exponent with the fixed-point scale into a single net +/// power of ten. `price_scaled = real_price * FIXED_POINT_SCALE`, and +/// `real_price = mantissa * 10^exponent`, so +/// `price_scaled = mantissa * 10^(exponent + FIXED_POINT_SCALE_DECIMALS)`. +/// Folding the two powers avoids forming a 10^18 intermediate that would +/// overflow for high-priced assets. +pub fn price_mantissa_to_scaled(mantissa: u128, exponent: i32) -> Result { + let net_exponent = exponent + .checked_add(FIXED_POINT_SCALE_DECIMALS) + .ok_or(LendingError::MathOverflow)?; + if net_exponent >= 0 { + Ok(mantissa + .checked_mul(ten_pow(net_exponent as u32)?) + .ok_or(LendingError::MathOverflow)?) + } else { + Ok(mantissa + .checked_div(ten_pow((-net_exponent) as u32)?) + .ok_or(LendingError::MathOverflow)?) + } +} diff --git a/finance/lending/anchor-v1/programs/lending/src/state/lending_market.rs b/finance/lending/anchor-v1/programs/lending/src/state/lending_market.rs new file mode 100644 index 000000000..387dff1d6 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/state/lending_market.rs @@ -0,0 +1,22 @@ +use anchor_lang::prelude::*; + +/// Top-level configuration shared by every reserve and obligation under it. +/// The owner is the only account that may create reserves and change their config. +#[account] +#[derive(InitSpace)] +pub struct LendingMarket { + /// Index this market's PDA is derived from (`["lending_market", market_id]`). + /// The market is identified by this id, not by any individual — `owner` below + /// is a stored field used only for authorization, never part of the address. + /// Distinct markets (0, 1, 2 …) give independent, risk-isolated pools. + pub market_id: u64, + + pub owner: Pubkey, + + /// The mint that obligation values are denominated in (for example USDC). + /// Stored for reference; valuations come from each reserve's own price feed, + /// which must report prices in this currency. + pub quote_currency_mint: Pubkey, + + pub bump: u8, +} diff --git a/finance/lending/anchor-v1/programs/lending/src/state/mod.rs b/finance/lending/anchor-v1/programs/lending/src/state/mod.rs new file mode 100644 index 000000000..022855620 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/state/mod.rs @@ -0,0 +1,9 @@ +pub mod lending_market; +pub mod obligation; +pub mod price_feed; +pub mod reserve; + +pub use lending_market::*; +pub use obligation::*; +pub use price_feed::*; +pub use reserve::*; diff --git a/finance/lending/anchor-v1/programs/lending/src/state/obligation.rs b/finance/lending/anchor-v1/programs/lending/src/state/obligation.rs new file mode 100644 index 000000000..20be5b92d --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/state/obligation.rs @@ -0,0 +1,124 @@ +use anchor_lang::prelude::*; + +use crate::constants::MAX_OBLIGATION_RESERVES; +use crate::errors::LendingError; + +/// A borrower's position in one lending market: the share-token collateral they +/// have posted and the liquidity they have borrowed, plus the cached quote- +/// currency valuations that `refresh_obligation` recomputes. +#[account] +#[derive(InitSpace)] +pub struct Obligation { + pub lending_market: Pubkey, + + pub owner: Pubkey, + + pub last_update_slot: u64, + + /// Set whenever deposits/borrows change; cleared by `refresh_obligation`. + /// Health-dependent handlers reject a stale obligation so they never act on + /// cached values that a prior instruction in the same transaction invalidated. + pub stale: bool, + + /// Sum of every deposit's market value, FIXED_POINT_SCALE-scaled. + pub deposited_value: u128, + + /// Sum of every borrow's market value, FIXED_POINT_SCALE-scaled. + pub borrowed_value: u128, + + /// Σ (deposit value * reserve loan_to_value). Borrows may not exceed this. + pub allowed_borrow_value: u128, + + /// Σ (deposit value * reserve liquidation_threshold). Above this the + /// obligation is liquidatable. + pub unhealthy_borrow_value: u128, + + #[max_len(MAX_OBLIGATION_RESERVES)] + pub deposits: Vec, + + #[max_len(MAX_OBLIGATION_RESERVES)] + pub borrows: Vec, + + pub bump: u8, +} + +#[derive(InitSpace, Clone, Copy, AnchorSerialize, AnchorDeserialize, Debug, Default)] +pub struct ObligationCollateral { + pub reserve: Pubkey, + pub deposited_shares: u64, + pub market_value: u128, +} + +#[derive(InitSpace, Clone, Copy, AnchorSerialize, AnchorDeserialize, Debug, Default)] +pub struct ObligationLiquidity { + pub reserve: Pubkey, + /// Borrowed principal, scaled by the reserve's index at borrow time so the + /// live debt grows automatically as that index advances: + /// `debt = borrowed_principal * reserve.borrow_accumulation_factor / FIXED_POINT_SCALE`. + pub borrowed_principal: u128, + pub market_value: u128, +} + +impl Obligation { + /// Reject a health-dependent action when the obligation has not been + /// refreshed in this same transaction. + pub fn require_refreshed(&self) -> Result<()> { + require!(!self.stale, LendingError::ObligationStale); + require_eq!( + self.last_update_slot, + Clock::get()?.slot, + LendingError::ObligationStale + ); + Ok(()) + } + + /// Index of the collateral entry for `reserve`, creating an empty one if the + /// obligation has room. Used when posting collateral. + pub fn upsert_collateral(&mut self, reserve: Pubkey) -> Result { + if let Some(index) = self.deposits.iter().position(|entry| entry.reserve == reserve) { + return Ok(index); + } + require!( + self.deposits.len() < MAX_OBLIGATION_RESERVES, + LendingError::TooManyReserves + ); + self.deposits.push(ObligationCollateral { + reserve, + deposited_shares: 0, + market_value: 0, + }); + Ok(self.deposits.len() - 1) + } + + /// Index of the borrow entry for `reserve`, creating an empty one if the + /// obligation has room. Used when borrowing. + pub fn upsert_borrow(&mut self, reserve: Pubkey) -> Result { + if let Some(index) = self.borrows.iter().position(|entry| entry.reserve == reserve) { + return Ok(index); + } + require!( + self.borrows.len() < MAX_OBLIGATION_RESERVES, + LendingError::TooManyReserves + ); + self.borrows.push(ObligationLiquidity { + reserve, + borrowed_principal: 0, + market_value: 0, + }); + Ok(self.borrows.len() - 1) + } + + pub fn find_collateral(&self, reserve: Pubkey) -> Result { + self.deposits + .iter() + .position(|entry| entry.reserve == reserve) + .ok_or(LendingError::ReserveNotFound.into()) + } + + pub fn find_borrow(&self, reserve: Pubkey) -> Result { + self.borrows + .iter() + .position(|entry| entry.reserve == reserve) + .ok_or(LendingError::ReserveNotFound.into()) + } +} diff --git a/finance/lending/anchor-v1/programs/lending/src/state/price_feed.rs b/finance/lending/anchor-v1/programs/lending/src/state/price_feed.rs new file mode 100644 index 000000000..6d7cc8b82 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/state/price_feed.rs @@ -0,0 +1,65 @@ +use anchor_lang::prelude::*; +use solana_sysvar::last_restart_slot::LastRestartSlot; + +use crate::constants::MAX_PRICE_STALENESS_SLOTS; +use crate::errors::LendingError; +use crate::math::price_mantissa_to_scaled; + +/// A price for one token, denominated in the market's quote currency. +/// PDA seeds: `[b"price_feed", market, mint]` — scoped to a market (not to any +/// individual), so each market prices its own assets and one market can never +/// write another's feed. Only the market's `owner` may write it (`set_price`). +/// +/// The layout mirrors a Switchboard On-Demand pull feed: a signed mantissa plus +/// an exponent (`price = price_mantissa * 10^exponent`) and the slot the value +/// was written. In production this account would be the real Switchboard feed +/// and the program would decode it with the `switchboard-on-demand` crate +/// (`PullFeedAccountData`): `price_mantissa = current_result.value`, +/// `exponent = -18`, `last_updated_slot = current_result.slot`. Here the +/// `set_price` handler writes it directly so LiteSVM tests are deterministic. +/// A production read should also reject results whose confidence interval is +/// too wide; this stand-in has no confidence field to check. +#[account] +#[derive(InitSpace)] +pub struct PriceFeed { + /// The lending market this feed serves; part of the PDA seeds. + pub market: Pubkey, + + pub mint: Pubkey, + + pub price_mantissa: i128, + + pub exponent: i32, + + pub last_updated_slot: u64, + + pub bump: u8, +} + +impl PriceFeed { + /// The price multiplied by FIXED_POINT_SCALE, after asserting the feed is + /// fresh and positive. Combining the price exponent with the fixed-point + /// scale (see `price_mantissa_to_scaled`) keeps the conversion overflow-safe. + pub fn price_scaled(&self, current_slot: u64) -> Result { + let age = current_slot + .checked_sub(self.last_updated_slot) + .ok_or(LendingError::MathOverflow)?; + require!(age <= MAX_PRICE_STALENESS_SLOTS, LendingError::StalePriceFeed); + + // Restart handling. A cluster halt stops the slot count but not the + // wall clock, so after a restart a feed can look fresh in slots while + // its price is hours old. Reject any price stamped at or before the + // restart slot; the market then pauses valuation until the publisher + // posts again, rather than lending against a pre-halt price. Zero + // means the cluster has never restarted. + let last_restart_slot = LastRestartSlot::get()?.last_restart_slot; + require!( + last_restart_slot == 0 || self.last_updated_slot > last_restart_slot, + LendingError::PricePredatesRestart + ); + + require!(self.price_mantissa > 0, LendingError::InvalidOraclePrice); + + price_mantissa_to_scaled(self.price_mantissa as u128, self.exponent) + } +} diff --git a/finance/lending/anchor-v1/programs/lending/src/state/reserve.rs b/finance/lending/anchor-v1/programs/lending/src/state/reserve.rs new file mode 100644 index 000000000..b510a3c1e --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/src/state/reserve.rs @@ -0,0 +1,276 @@ +use anchor_lang::prelude::*; + +use crate::constants::{BPS_DENOMINATOR, FIXED_POINT_SCALE, RESERVE_SEED}; +use crate::errors::LendingError; +use crate::math::{mul_div_ceil, mul_div_floor}; + +/// Signer seeds for a reserve PDA, which is the authority over its liquidity +/// vault and the mint authority of its share token. +pub fn reserve_signer_seeds<'a>( + lending_market: &'a Pubkey, + liquidity_mint: &'a Pubkey, + bump: &'a [u8; 1], +) -> [&'a [u8]; 4] { + [ + RESERVE_SEED, + lending_market.as_ref(), + liquidity_mint.as_ref(), + bump, + ] +} + +/// One asset's lending pool. Suppliers deposit `liquidity_mint` tokens into +/// `liquidity_vault` and receive share tokens (`share_mint`); the share-to- +/// liquidity exchange rate rises as borrowers pay interest. Borrowers draw +/// `liquidity_mint` out against collateral held in their obligation. +#[account] +#[derive(InitSpace)] +pub struct Reserve { + pub lending_market: Pubkey, + + pub liquidity_mint: Pubkey, + + /// Program-owned token account holding the un-borrowed liquidity. Its + /// authority is this reserve PDA. + pub liquidity_vault: Pubkey, + + /// Share-token mint. Supply equals `share_mint_supply`. Mint authority is + /// this reserve PDA. + pub share_mint: Pubkey, + + pub price_feed: Pubkey, + + pub liquidity_decimals: u8, + + /// Base units sitting in `liquidity_vault`, available to borrow or redeem. + /// This is the source of truth for the pool size, not the vault's token + /// balance, so a raw token donation cannot move the exchange rate. + pub available_liquidity: u64, + + /// Outstanding share-token supply, tracked here so valuations need only the + /// reserve account (not the mint) to convert shares to liquidity. A holder + /// burning share tokens directly via the token program (outside this + /// program) makes the real mint supply drift below this mirror; that drift + /// only lowers what the burner could have redeemed, so the pool never pays + /// out more than it holds. + pub share_mint_supply: u64, + + /// Total borrowed principal. The live debt is + /// `borrowed_principal * borrow_accumulation_factor / FIXED_POINT_SCALE`. + pub borrowed_principal: u128, + + /// Monotonically increasing accumulation factor, FIXED_POINT_SCALE-scaled. + /// Starts at FIXED_POINT_SCALE (1.0) and only ever multiplies by factors >= 1. + pub borrow_accumulation_factor: u128, + + pub last_update_slot: u64, + + /// Liquidity owed to the market owner: the protocol's cut of accrued + /// interest (`config.reserve_factor_bps`). It is carved out of + /// `total_liquidity` so it never inflates the share exchange rate, and the + /// owner withdraws it with `collect_protocol_fees`. + pub accumulated_protocol_fees: u64, + + pub config: ReserveConfig, + + pub bump: u8, +} + +/// Risk and interest-rate parameters. All ratios are basis points (10_000 = 100%). +#[derive(InitSpace, Clone, Copy, AnchorSerialize, AnchorDeserialize, Debug, Default)] +pub struct ReserveConfig { + /// Fraction of deposited collateral value a borrower may borrow against. + pub loan_to_value_bps: u16, + /// Above this fraction the obligation may be liquidated. + pub liquidation_threshold_bps: u16, + /// Extra collateral a liquidator receives, as a fraction of the repaid value. + pub liquidation_bonus_bps: u16, + /// Maximum fraction of a borrow that one liquidation may repay. + pub close_factor_bps: u16, + /// Share of accrued borrow interest kept by the protocol (the rest lifts the + /// supplier exchange rate). This is how the market owner earns. + pub reserve_factor_bps: u16, + /// Utilization at which the borrow rate reaches `optimal_borrow_rate_bps`. + pub optimal_utilization_bps: u16, + /// Borrow APR at 0% utilization. + pub min_borrow_rate_bps: u16, + /// Borrow APR at `optimal_utilization_bps`. + pub optimal_borrow_rate_bps: u16, + /// Borrow APR at 100% utilization. + pub max_borrow_rate_bps: u16, + /// Slots in a year: the divisor that turns the APR fields above into the + /// per-slot rate interest actually accrues at. This is the cluster's slot + /// time expressed as a count, so it belongs in configuration rather than in + /// a constant. The protocol lowers the slot time over time, and a value left + /// behind here charges borrowers at the wrong wall-clock rate while every + /// other number in this struct still reads correctly. The owner updates it + /// with `update_reserve_config` when the slot time changes. + pub slots_per_year: u64, +} + +impl ReserveConfig { + pub fn validate(&self) -> Result<()> { + let within_bps = |value: u16| (value as u128) <= BPS_DENOMINATOR; + require!( + within_bps(self.loan_to_value_bps) + && within_bps(self.liquidation_threshold_bps) + && within_bps(self.liquidation_bonus_bps) + && within_bps(self.close_factor_bps) + && within_bps(self.reserve_factor_bps) + && within_bps(self.optimal_utilization_bps), + LendingError::InvalidConfig + ); + // A zero close factor would make every liquidation a no-op. + require!(self.close_factor_bps > 0, LendingError::InvalidConfig); + // The kink must be strictly inside (0, 100%) so neither rate slope divides by zero. + require!( + self.optimal_utilization_bps > 0 + && (self.optimal_utilization_bps as u128) < BPS_DENOMINATOR, + LendingError::InvalidConfig + ); + // You cannot be allowed to borrow past the point you'd be liquidated. + require!( + self.loan_to_value_bps <= self.liquidation_threshold_bps, + LendingError::InvalidConfig + ); + require!( + self.min_borrow_rate_bps <= self.optimal_borrow_rate_bps + && self.optimal_borrow_rate_bps <= self.max_borrow_rate_bps, + LendingError::InvalidConfig + ); + // Zero would divide by zero when converting the APR to a per-slot rate. + require!(self.slots_per_year > 0, LendingError::InvalidConfig); + Ok(()) + } +} + +impl Reserve { + /// Live total debt owed to the pool, rounded up (protocol-favourable). + pub fn current_borrowed_amount(&self) -> Result { + let amount = mul_div_ceil( + self.borrowed_principal, + self.borrow_accumulation_factor, + FIXED_POINT_SCALE, + )?; + u64::try_from(amount).map_err(|_| LendingError::MathOverflow.into()) + } + + /// Available liquidity plus live debt, before the protocol's fee is removed. + /// Used for the utilization ratio, which is about how much of the pool is lent + /// out, independent of who owns the interest. + pub fn gross_liquidity(&self) -> Result { + (self.available_liquidity as u128) + .checked_add(self.current_borrowed_amount()? as u128) + .ok_or(LendingError::MathOverflow.into()) + } + + /// The pool size the share token is a claim on: gross liquidity minus the + /// protocol fees owed to the owner, which belong to no supplier. + pub fn total_liquidity(&self) -> Result { + self.gross_liquidity()? + .checked_sub(self.accumulated_protocol_fees as u128) + .ok_or(LendingError::MathOverflow.into()) + } + + /// Borrowed fraction of the pool, in basis points (0..=10_000). + pub fn utilization_bps(&self) -> Result { + let gross = self.gross_liquidity()?; + if gross == 0 { + return Ok(0); + } + mul_div_floor(self.current_borrowed_amount()? as u128, BPS_DENOMINATOR, gross) + } + + /// Per-slot borrow rate (FIXED_POINT_SCALE-scaled) from the kinked curve: + /// linear from `min` to `optimal` up to the kink, then steeper from `optimal` + /// to `max` between the kink and full utilization. + pub fn current_borrow_rate_per_slot(&self) -> Result { + let utilization = self.utilization_bps()?; + let optimal_utilization = self.config.optimal_utilization_bps as u128; + + let apr_bps = if utilization <= optimal_utilization { + let rate_range = (self.config.optimal_borrow_rate_bps as u128) + .checked_sub(self.config.min_borrow_rate_bps as u128) + .ok_or(LendingError::MathOverflow)?; + let climbed = mul_div_floor(rate_range, utilization, optimal_utilization)?; + (self.config.min_borrow_rate_bps as u128) + .checked_add(climbed) + .ok_or(LendingError::MathOverflow)? + } else { + let rate_range = (self.config.max_borrow_rate_bps as u128) + .checked_sub(self.config.optimal_borrow_rate_bps as u128) + .ok_or(LendingError::MathOverflow)?; + let utilization_above = utilization + .checked_sub(optimal_utilization) + .ok_or(LendingError::MathOverflow)?; + let utilization_range = BPS_DENOMINATOR + .checked_sub(optimal_utilization) + .ok_or(LendingError::MathOverflow)?; + let climbed = mul_div_floor(rate_range, utilization_above, utilization_range)?; + (self.config.optimal_borrow_rate_bps as u128) + .checked_add(climbed) + .ok_or(LendingError::MathOverflow)? + }; + + // apr_bps / (BPS_DENOMINATOR * slots_per_year), carried at FIXED_POINT_SCALE. + let per_year_denominator = BPS_DENOMINATOR + .checked_mul(self.config.slots_per_year as u128) + .ok_or(LendingError::MathOverflow)?; + mul_div_floor(apr_bps, FIXED_POINT_SCALE, per_year_denominator) + } + + /// Advance the accumulation factor for the slots elapsed since the last refresh. + /// `new_factor = old_factor * (1 + rate_per_slot * elapsed_slots)`, a single + /// multiply per refresh that compounds across refreshes (Solend's approach). + pub fn accrue_interest(&mut self, current_slot: u64) -> Result<()> { + let elapsed = current_slot + .checked_sub(self.last_update_slot) + .ok_or(LendingError::MathOverflow)?; + + if elapsed > 0 && self.borrowed_principal > 0 { + let borrowed_before = self.current_borrowed_amount()?; + let rate_per_slot = self.current_borrow_rate_per_slot()?; + let accrued = rate_per_slot + .checked_mul(elapsed as u128) + .ok_or(LendingError::MathOverflow)?; + let growth_factor = FIXED_POINT_SCALE + .checked_add(accrued) + .ok_or(LendingError::MathOverflow)?; + self.borrow_accumulation_factor = mul_div_floor( + self.borrow_accumulation_factor, + growth_factor, + FIXED_POINT_SCALE, + )?; + + // Borrowers owe the full interest (the factor grew for all of it); the + // protocol keeps `reserve_factor_bps` of the newly accrued interest, + // and the remainder lifts the supplier exchange rate. Flooring the fee + // rounds the owner's cut down, in the suppliers' favour. + let interest = self + .current_borrowed_amount()? + .saturating_sub(borrowed_before); + let fee = mul_div_floor( + interest as u128, + self.config.reserve_factor_bps as u128, + BPS_DENOMINATOR, + )?; + self.accumulated_protocol_fees = self + .accumulated_protocol_fees + .checked_add(u64::try_from(fee).map_err(|_| LendingError::MathOverflow)?) + .ok_or(LendingError::MathOverflow)?; + } + + self.last_update_slot = current_slot; + Ok(()) + } + + /// Reject use of a reserve whose interest has not been accrued this slot. + pub fn require_refreshed(&self) -> Result<()> { + require_eq!( + self.last_update_slot, + Clock::get()?.slot, + LendingError::ReserveStale + ); + Ok(()) + } +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/common/mod.rs b/finance/lending/anchor-v1/programs/lending/tests/common/mod.rs new file mode 100644 index 000000000..dcf51deb7 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/common/mod.rs @@ -0,0 +1,755 @@ +#![allow(dead_code)] +//! Shared LiteSVM harness for the lending program tests. +//! +//! Sets up a lending market with reserves, funds users, and exposes one method +//! per protocol action. Actions that read value (deposit/redeem/borrow/withdraw/ +//! liquidate) bundle the required `refresh_reserve` / `refresh_obligation` +//! instructions into the same transaction, exactly as a real client must. + +use anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + system_program, + }, + AccountDeserialize, InstructionData, ToAccountMetas, +}; +use anchor_spl::token::ID as TOKEN_PROGRAM_ID; +use litesvm::LiteSVM; +use solana_keypair::Keypair; +use solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, get_token_account_balance, + mint_tokens_to_token_account, send_transaction_from_instructions, +}; +use solana_signer::Signer; + +use lending::constants::{ + LENDING_MARKET_SEED, LIQUIDITY_VAULT_SEED, OBLIGATION_SEED, OBLIGATION_SHARE_VAULT_SEED, + PRICE_FEED_SEED, RESERVE_SEED, SHARE_MINT_SEED, +}; +use lending::state::{Obligation, Reserve, ReserveConfig}; + +pub use anchor_lang::prelude::Pubkey; + +/// A FIXED_POINT_SCALE-scaled price exponent: prices are passed as +/// `mantissa * 10^-18`, matching a Switchboard On-Demand feed's 1e18 result. +pub const PRICE_EXPONENT: i32 = -18; + +pub fn dollars(whole: u64) -> i128 { + // price mantissa for `whole` dollars at exponent -18. + (whole as i128) * 1_000_000_000_000_000_000 +} + +pub fn cents(amount: u64) -> i128 { + (amount as i128) * 10_000_000_000_000_000 +} + +pub fn ata(owner: &Pubkey, mint: &Pubkey) -> Pubkey { + let ata_program: Pubkey = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap(); + Pubkey::find_program_address( + &[owner.as_ref(), TOKEN_PROGRAM_ID.as_ref(), mint.as_ref()], + &ata_program, + ) + .0 +} + +fn pda(seeds: &[&[u8]]) -> Pubkey { + Pubkey::find_program_address(seeds, &lending::id()).0 +} + +/// Map kite's transaction result to a String so tests can assert on the program +/// error message embedded in failed-transaction logs. +fn send( + svm: &mut LiteSVM, + instructions: Vec, + signers: &[&Keypair], + payer: &Pubkey, +) -> Result<(), String> { + send_transaction_from_instructions(svm, instructions, signers, payer) + .map_err(|thrown| format!("{thrown:?}")) +} + +/// Handle to one reserve and its associated PDAs. +#[derive(Clone, Copy)] +pub struct ReserveHandle { + pub mint: Pubkey, + pub decimals: u8, + pub reserve: Pubkey, + pub share_mint: Pubkey, + pub liquidity_vault: Pubkey, + pub price_feed: Pubkey, +} + +pub struct Env { + pub svm: LiteSVM, + /// Market owner; also the mint authority for every test mint and the price + /// feed authority. + pub owner: Keypair, + pub market: Pubkey, +} + +impl Env { + pub fn new() -> Self { + let mut svm = LiteSVM::new(); + let program_bytes = include_bytes!("../../../../target/deploy/lending.so"); + svm.add_program(lending::id(), program_bytes).unwrap(); + + let owner = create_wallet(&mut svm, 1_000_000_000_000).unwrap(); + let quote_mint = create_token_mint(&mut svm, &owner, 6, None).unwrap(); + // The market is seeded by its market_id index alone (no owner). Market 0. + let market_id: u64 = 0; + let market = pda(&[LENDING_MARKET_SEED, &market_id.to_le_bytes()]); + + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitializeLendingMarket { + lending_market: market, + owner: owner.pubkey(), + quote_currency_mint: quote_mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitializeLendingMarket { market_id }.data(), + }; + send(&mut svm, vec![instruction], &[&owner], &owner.pubkey()).unwrap(); + + Env { svm, owner, market } + } + + pub fn current_slot(&self) -> u64 { + self.svm.get_sysvar::().slot + } + + /// Create a second lending market owned by `market_owner`, for tests that + /// exercise cross-market isolation. + pub fn init_market_for(&mut self, market_owner: &Keypair) -> Pubkey { + let env_owner = self.owner.insecure_clone(); + let quote_mint = create_token_mint(&mut self.svm, &env_owner, 6, None).unwrap(); + // A distinct id from the env's market 0, since the id is the market's + // global identifier (the owner is not part of the seed). + let market_id: u64 = 1; + let market = pda(&[LENDING_MARKET_SEED, &market_id.to_le_bytes()]); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitializeLendingMarket { + lending_market: market, + owner: market_owner.pubkey(), + quote_currency_mint: quote_mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitializeLendingMarket { market_id }.data(), + }; + send(&mut self.svm, vec![instruction], &[market_owner], &market_owner.pubkey()).unwrap(); + market + } + + /// Add a reserve to a market other than the default one. The mint and price + /// feed are still created/written by the env owner (a reserve trusts + /// whichever feed its market owner registers; the writer need not match). + pub fn add_reserve_to( + &mut self, + market_owner: &Keypair, + market: Pubkey, + decimals: u8, + price_mantissa: i128, + config: ReserveConfig, + ) -> ReserveHandle { + let env_owner = self.owner.insecure_clone(); + let mint = create_token_mint(&mut self.svm, &env_owner, decimals, None).unwrap(); + self.set_price_for(market_owner, market, mint, price_mantissa); + + let reserve = pda(&[RESERVE_SEED, market.as_ref(), mint.as_ref()]); + let share_mint = pda(&[SHARE_MINT_SEED, reserve.as_ref()]); + let liquidity_vault = pda(&[LIQUIDITY_VAULT_SEED, reserve.as_ref()]); + let price_feed = self.price_feed_address(market, mint); + + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitializeReserve { + lending_market: market, + owner: market_owner.pubkey(), + reserve, + liquidity_mint: mint, + liquidity_vault, + share_mint, + price_feed, + token_program: TOKEN_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitializeReserve { config }.data(), + }; + send(&mut self.svm, vec![instruction], &[market_owner], &market_owner.pubkey()).unwrap(); + + ReserveHandle { + mint, + decimals, + reserve, + share_mint, + liquidity_vault, + price_feed, + } + } + + /// Advance time so interest accrues and blockhashes differ. + pub fn warp_slots(&mut self, slots: u64) { + let target = self.current_slot() + slots; + self.svm.warp_to_slot(target); + self.svm.expire_blockhash(); + } + + /// Simulate a cluster restart at `slot`: prices stamped at or before it + /// must be rejected until the publisher posts again. + pub fn set_last_restart_slot(&mut self, slot: u64) { + self.svm.set_sysvar(&solana_sysvar::last_restart_slot::LastRestartSlot { + last_restart_slot: slot, + }); + } + + /// The feed PDA the market owner writes for `mint`: seeded by the owner's + /// key, so it is the feed `add_reserve` registers reserves against. + /// The feed PDA for a given market and mint (seeds `["price_feed", market, mint]`). + pub fn price_feed_address(&self, market: Pubkey, mint: Pubkey) -> Pubkey { + pda(&[PRICE_FEED_SEED, market.as_ref(), mint.as_ref()]) + } + + pub fn set_price(&mut self, mint: Pubkey, price_mantissa: i128) { + let owner = self.owner.insecure_clone(); + let market = self.market; + self.set_price_for(&owner, market, mint, price_mantissa); + } + + /// Publish a price for `mint` in `market`, signed by that market's `owner`. + pub fn set_price_for( + &mut self, + owner: &Keypair, + market: Pubkey, + mint: Pubkey, + price_mantissa: i128, + ) { + let price_feed = self.price_feed_address(market, mint); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::SetPrice { + lending_market: market, + owner: owner.pubkey(), + price_feed, + mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::SetPrice { + price_mantissa, + exponent: PRICE_EXPONENT, + } + .data(), + }; + send(&mut self.svm, vec![instruction], &[owner], &owner.pubkey()).unwrap(); + } + + pub fn add_reserve( + &mut self, + decimals: u8, + price_mantissa: i128, + config: ReserveConfig, + ) -> ReserveHandle { + let owner = self.owner.insecure_clone(); + let market = self.market; + self.add_reserve_to(&owner, market, decimals, price_mantissa, config) + } + + pub fn try_update_config( + &mut self, + handle: &ReserveHandle, + config: ReserveConfig, + ) -> Result<(), String> { + let owner = self.owner.insecure_clone(); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::UpdateReserveConfig { + lending_market: self.market, + owner: owner.pubkey(), + reserve: handle.reserve, + } + .to_account_metas(None), + data: lending::instruction::UpdateReserveConfig { config }.data(), + }; + send(&mut self.svm, vec![instruction], &[&owner], &owner.pubkey()) + } + + pub fn create_user(&mut self) -> Keypair { + create_wallet(&mut self.svm, 1_000_000_000_000).unwrap() + } + + /// Create the user's token account for a mint and mint `amount` into it. + pub fn fund(&mut self, user: &Keypair, mint: Pubkey, amount: u64) -> Pubkey { + let owner = self.owner.insecure_clone(); + let token_account = + create_associated_token_account(&mut self.svm, &user.pubkey(), &mint, user).unwrap(); + if amount > 0 { + mint_tokens_to_token_account(&mut self.svm, &mint, &token_account, amount, &owner) + .unwrap(); + } + token_account + } + + fn refresh_reserve_ix(&self, handle: &ReserveHandle) -> Instruction { + Instruction { + program_id: lending::id(), + accounts: lending::accounts::RefreshReserve { + reserve: handle.reserve, + } + .to_account_metas(None), + data: lending::instruction::RefreshReserve {}.data(), + } + } + + /// Supply liquidity to a reserve, receiving share tokens. Returns the user's + /// share-token account. + pub fn try_supply( + &mut self, + user: &Keypair, + handle: &ReserveHandle, + amount: u64, + ) -> Result { + let user_liquidity = ata(&user.pubkey(), &handle.mint); + let user_share = create_associated_token_account( + &mut self.svm, + &user.pubkey(), + &handle.share_mint, + user, + ) + .unwrap(); + + let deposit = Instruction { + program_id: lending::id(), + accounts: lending::accounts::DepositReserveLiquidity { + reserve: handle.reserve, + liquidity_mint: handle.mint, + liquidity_vault: handle.liquidity_vault, + share_mint: handle.share_mint, + user_liquidity, + user_share, + owner: user.pubkey(), + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::DepositReserveLiquidity { + liquidity_amount: amount, + } + .data(), + }; + let refresh = self.refresh_reserve_ix(handle); + send(&mut self.svm, vec![refresh, deposit], &[user], &user.pubkey())?; + Ok(user_share) + } + + pub fn supply(&mut self, user: &Keypair, handle: &ReserveHandle, amount: u64) -> Pubkey { + self.try_supply(user, handle, amount).unwrap() + } + + pub fn try_redeem( + &mut self, + user: &Keypair, + handle: &ReserveHandle, + share_amount: u64, + ) -> Result<(), String> { + let user_liquidity = ata(&user.pubkey(), &handle.mint); + let user_share = ata(&user.pubkey(), &handle.share_mint); + let redeem = Instruction { + program_id: lending::id(), + accounts: lending::accounts::RedeemReserveCollateral { + reserve: handle.reserve, + liquidity_mint: handle.mint, + liquidity_vault: handle.liquidity_vault, + share_mint: handle.share_mint, + user_liquidity, + user_share, + owner: user.pubkey(), + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::RedeemReserveCollateral { share_amount }.data(), + }; + let refresh = self.refresh_reserve_ix(handle); + send(&mut self.svm, vec![refresh, redeem], &[user], &user.pubkey()) + } + + pub fn initialize_obligation(&mut self, user: &Keypair) -> Pubkey { + let obligation = pda(&[OBLIGATION_SEED, self.market.as_ref(), user.pubkey().as_ref()]); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::InitializeObligation { + lending_market: self.market, + obligation, + owner: user.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::InitializeObligation {}.data(), + }; + send(&mut self.svm, vec![instruction], &[user], &user.pubkey()).unwrap(); + obligation + } + + pub fn obligation_share_vault(&self, handle: &ReserveHandle, obligation: Pubkey) -> Pubkey { + pda(&[ + OBLIGATION_SHARE_VAULT_SEED, + handle.reserve.as_ref(), + obligation.as_ref(), + ]) + } + + pub fn try_post_collateral( + &mut self, + user: &Keypair, + obligation: Pubkey, + handle: &ReserveHandle, + share_amount: u64, + ) -> Result<(), String> { + let user_share = ata(&user.pubkey(), &handle.share_mint); + let vault = self.obligation_share_vault(handle, obligation); + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::DepositObligationCollateral { + obligation, + owner: user.pubkey(), + reserve: handle.reserve, + share_mint: handle.share_mint, + obligation_share_vault: vault, + user_share, + token_program: TOKEN_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::DepositObligationCollateral { share_amount }.data(), + }; + send(&mut self.svm, vec![instruction], &[user], &user.pubkey()) + } + + pub fn post_collateral( + &mut self, + user: &Keypair, + obligation: Pubkey, + handle: &ReserveHandle, + share_amount: u64, + ) { + self.try_post_collateral(user, obligation, handle, share_amount) + .unwrap() + } + + fn refresh_obligation_ix( + &self, + obligation: Pubkey, + deposit_reserves: &[&ReserveHandle], + borrow_reserves: &[&ReserveHandle], + ) -> Instruction { + let mut accounts = lending::accounts::RefreshObligation { obligation }.to_account_metas(None); + for handle in deposit_reserves.iter().chain(borrow_reserves.iter()) { + accounts.push(AccountMeta::new_readonly(handle.reserve, false)); + accounts.push(AccountMeta::new_readonly(handle.price_feed, false)); + } + Instruction { + program_id: lending::id(), + accounts, + data: lending::instruction::RefreshObligation {}.data(), + } + } + + /// All reserves an obligation touches must be refreshed before + /// refresh_obligation; this collects the de-duplicated refresh instructions. + fn refresh_all_ix(&self, reserves: &[&ReserveHandle]) -> Vec { + let mut seen: Vec = Vec::new(); + let mut instructions = Vec::new(); + for handle in reserves { + if !seen.contains(&handle.reserve) { + seen.push(handle.reserve); + instructions.push(self.refresh_reserve_ix(handle)); + } + } + instructions + } + + /// `existing_deposits` / `existing_borrows` must list the obligation's + /// CURRENT positions (what `refresh_obligation` will value). The reserve + /// being borrowed is refreshed too, but is only added to `refresh_obligation` + /// once it actually has a borrow entry — so the first borrow of a new reserve + /// passes it only via `borrow`, not via `existing_borrows`. + #[allow(clippy::too_many_arguments)] + pub fn try_borrow( + &mut self, + user: &Keypair, + obligation: Pubkey, + existing_deposits: &[&ReserveHandle], + existing_borrows: &[&ReserveHandle], + borrow: &ReserveHandle, + amount: u64, + ) -> Result<(), String> { + let mut refresh_set: Vec<&ReserveHandle> = existing_deposits.to_vec(); + refresh_set.extend_from_slice(existing_borrows); + refresh_set.push(borrow); + + let mut instructions = self.refresh_all_ix(&refresh_set); + instructions.push(self.refresh_obligation_ix(obligation, existing_deposits, existing_borrows)); + instructions.push(self.borrow_ix(user, obligation, borrow, amount)); + send(&mut self.svm, instructions, &[user], &user.pubkey()) + } + + fn borrow_ix( + &self, + user: &Keypair, + obligation: Pubkey, + borrow: &ReserveHandle, + amount: u64, + ) -> Instruction { + let user_liquidity = ata(&user.pubkey(), &borrow.mint); + Instruction { + program_id: lending::id(), + accounts: lending::accounts::BorrowObligationLiquidity { + obligation, + owner: user.pubkey(), + reserve: borrow.reserve, + price_feed: borrow.price_feed, + liquidity_mint: borrow.mint, + liquidity_vault: borrow.liquidity_vault, + user_liquidity, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::BorrowObligationLiquidity { + liquidity_amount: amount, + } + .data(), + } + } + + /// Borrow while deliberately skipping the `refresh_obligation` instruction, + /// to exercise the `ObligationStale` guard. + pub fn try_borrow_skip_obligation_refresh( + &mut self, + user: &Keypair, + obligation: Pubkey, + all_reserves: &[&ReserveHandle], + borrow: &ReserveHandle, + amount: u64, + ) -> Result<(), String> { + let mut instructions = self.refresh_all_ix(all_reserves); + instructions.push(self.borrow_ix(user, obligation, borrow, amount)); + send(&mut self.svm, instructions, &[user], &user.pubkey()) + } + + pub fn repay( + &mut self, + user: &Keypair, + obligation: Pubkey, + borrow: &ReserveHandle, + amount: u64, + ) { + let user_liquidity = ata(&user.pubkey(), &borrow.mint); + let instructions = vec![ + self.refresh_reserve_ix(borrow), + Instruction { + program_id: lending::id(), + accounts: lending::accounts::RepayObligationLiquidity { + obligation, + reserve: borrow.reserve, + liquidity_mint: borrow.mint, + liquidity_vault: borrow.liquidity_vault, + user_liquidity, + repayer: user.pubkey(), + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::RepayObligationLiquidity { + liquidity_amount: amount, + } + .data(), + }, + ]; + send(&mut self.svm, instructions, &[user], &user.pubkey()).unwrap(); + } + + #[allow(clippy::too_many_arguments)] + pub fn try_withdraw_collateral( + &mut self, + user: &Keypair, + obligation: Pubkey, + deposit_reserves: &[&ReserveHandle], + borrow_reserves: &[&ReserveHandle], + collateral: &ReserveHandle, + share_amount: u64, + ) -> Result<(), String> { + let user_share = ata(&user.pubkey(), &collateral.share_mint); + let vault = self.obligation_share_vault(collateral, obligation); + let mut all: Vec<&ReserveHandle> = deposit_reserves.to_vec(); + all.extend_from_slice(borrow_reserves); + + let mut instructions = self.refresh_all_ix(&all); + instructions.push(self.refresh_obligation_ix(obligation, deposit_reserves, borrow_reserves)); + instructions.push(Instruction { + program_id: lending::id(), + accounts: lending::accounts::WithdrawObligationCollateral { + obligation, + owner: user.pubkey(), + reserve: collateral.reserve, + price_feed: collateral.price_feed, + share_mint: collateral.share_mint, + obligation_share_vault: vault, + user_share, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::WithdrawObligationCollateral { share_amount }.data(), + }); + send(&mut self.svm, instructions, &[user], &user.pubkey()) + } + + #[allow(clippy::too_many_arguments)] + pub fn try_liquidate( + &mut self, + liquidator: &Keypair, + obligation: Pubkey, + deposit_reserves: &[&ReserveHandle], + borrow_reserves: &[&ReserveHandle], + repay: &ReserveHandle, + collateral: &ReserveHandle, + amount: u64, + ) -> Result<(), String> { + let repay_source = ata(&liquidator.pubkey(), &repay.mint); + // Create the destination ATA only on the first call, so a test can + // attempt several liquidations. + let collateral_dest = ata(&liquidator.pubkey(), &collateral.share_mint); + if self.svm.get_account(&collateral_dest).is_none() { + create_associated_token_account( + &mut self.svm, + &liquidator.pubkey(), + &collateral.share_mint, + liquidator, + ) + .unwrap(); + } + let vault = self.obligation_share_vault(collateral, obligation); + + let mut all: Vec<&ReserveHandle> = deposit_reserves.to_vec(); + all.extend_from_slice(borrow_reserves); + let mut instructions = self.refresh_all_ix(&all); + instructions.push(self.refresh_obligation_ix(obligation, deposit_reserves, borrow_reserves)); + instructions.push(Instruction { + program_id: lending::id(), + accounts: lending::accounts::LiquidateObligation { + obligation, + liquidator: liquidator.pubkey(), + repay_reserve: repay.reserve, + collateral_reserve: collateral.reserve, + repay_price_feed: repay.price_feed, + collateral_price_feed: collateral.price_feed, + repay_liquidity_mint: repay.mint, + collateral_share_mint: collateral.share_mint, + repay_liquidity_vault: repay.liquidity_vault, + obligation_collateral_vault: vault, + liquidator_repay_source: repay_source, + liquidator_collateral_dest: collateral_dest, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::LiquidateObligation { + liquidity_amount: amount, + } + .data(), + }); + send(&mut self.svm, instructions, &[liquidator], &liquidator.pubkey()) + } + + /// Send a lone `refresh_reserve` so accrued interest lands in the index. + pub fn refresh_reserve_only(&mut self, payer: &Keypair, handle: &ReserveHandle) { + let instruction = self.refresh_reserve_ix(handle); + send(&mut self.svm, vec![instruction], &[payer], &payer.pubkey()).unwrap(); + } + + /// Refresh the listed reserves and then the obligation, recomputing its values. + pub fn refresh_obligation_only( + &mut self, + payer: &Keypair, + obligation: Pubkey, + deposits: &[&ReserveHandle], + borrows: &[&ReserveHandle], + ) { + let mut all: Vec<&ReserveHandle> = deposits.to_vec(); + all.extend_from_slice(borrows); + let mut instructions = self.refresh_all_ix(&all); + instructions.push(self.refresh_obligation_ix(obligation, deposits, borrows)); + send(&mut self.svm, instructions, &[payer], &payer.pubkey()).unwrap(); + } + + /// Market owner collects accrued protocol fees from a reserve to their own + /// token account. Bundles `refresh_reserve` so fees are current. Returns the + /// owner's fee-receiving token account. + pub fn collect_protocol_fees(&mut self, handle: &ReserveHandle) -> Pubkey { + let owner = self.owner.insecure_clone(); + let owner_liquidity = ata(&owner.pubkey(), &handle.mint); + if self.svm.get_account(&owner_liquidity).is_none() { + create_associated_token_account(&mut self.svm, &owner.pubkey(), &handle.mint, &owner) + .unwrap(); + } + let refresh = self.refresh_reserve_ix(handle); + let collect = Instruction { + program_id: lending::id(), + accounts: lending::accounts::CollectProtocolFees { + lending_market: self.market, + owner: owner.pubkey(), + reserve: handle.reserve, + liquidity_mint: handle.mint, + liquidity_vault: handle.liquidity_vault, + owner_liquidity, + token_program: TOKEN_PROGRAM_ID, + } + .to_account_metas(None), + data: lending::instruction::CollectProtocolFees {}.data(), + }; + send(&mut self.svm, vec![refresh, collect], &[&owner], &owner.pubkey()).unwrap(); + owner_liquidity + } + + // --- state readers --- + + pub fn reserve(&self, handle: &ReserveHandle) -> Reserve { + let account = self.svm.get_account(&handle.reserve).unwrap(); + Reserve::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + pub fn obligation(&self, obligation: Pubkey) -> Obligation { + let account = self.svm.get_account(&obligation).unwrap(); + Obligation::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + pub fn token_balance(&self, token_account: Pubkey) -> u64 { + get_token_account_balance(&self.svm, &token_account).unwrap() + } +} + +/// A reasonable default reserve config: 75% LTV, 80% liquidation threshold, +/// 5% bonus, 50% close factor, 10% reserve factor (protocol's cut of interest), +/// kink at 80% utilization, 2%/20%/150% APR curve. +/// Slots in a year, which is how a reserve turns an APR into a per-slot rate. +/// 78_840_000 is a 400ms slot: 2.5 slots/second * 60 * 60 * 24 * 365. It is a +/// test fixture, not a law: a deployment reads the slot time off the cluster it +/// points at (two `getBlockTime` results a known number of slots apart) and +/// updates the reserve when the protocol changes it. +pub const SLOTS_PER_YEAR: u64 = 78_840_000; + +pub fn default_config() -> ReserveConfig { + ReserveConfig { + loan_to_value_bps: 7_500, + liquidation_threshold_bps: 8_000, + liquidation_bonus_bps: 500, + close_factor_bps: 5_000, + reserve_factor_bps: 1_000, + optimal_utilization_bps: 8_000, + min_borrow_rate_bps: 200, + optimal_borrow_rate_bps: 2_000, + max_borrow_rate_bps: 15_000, + slots_per_year: SLOTS_PER_YEAR, + } +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_borrow_repay.rs b/finance/lending/anchor-v1/programs/lending/tests/test_borrow_repay.rs new file mode 100644 index 000000000..9d829e4aa --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_borrow_repay.rs @@ -0,0 +1,152 @@ +mod common; + +use common::{ata, default_config, dollars, Env, ReserveHandle}; +use solana_keypair::Keypair; +use solana_signer::Signer; + +/// One market with a collateral reserve and a separately-supplied borrow +/// reserve, plus a borrower who has posted 1000 units of collateral (value +/// $1000, so 75% LTV => $750 borrow power). Both tokens priced at $1, 6 decimals. +fn setup() -> (Env, ReserveHandle, ReserveHandle, Keypair, anchor_lang::prelude::Pubkey) { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + // A different supplier funds the borrow reserve's liquidity. + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); // create the borrowed-token account + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + + (env, collateral, borrow, borrower, obligation) +} + +#[test] +fn borrow_up_to_max_ltv_then_one_more_fails() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + + // $750 of borrow power, borrowing a $1 token => 750 units exactly. + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 750_000_000) + .unwrap(); + assert_eq!( + env.token_balance(ata(&borrower.pubkey(), &borrow.mint)), + 750_000_000 + ); + + // One more unit exceeds the allowed borrow value. + let result = env.try_borrow(&borrower, obligation, &[&collateral], &[&borrow], &borrow, 1); + assert!( + result.unwrap_err().contains("BorrowTooLarge"), + "borrowing past the LTV limit must be rejected" + ); +} + +#[test] +fn borrow_without_obligation_refresh_is_rejected() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + let result = env.try_borrow_skip_obligation_refresh( + &borrower, + obligation, + &[&collateral, &borrow], + &borrow, + 100_000_000, + ); + assert!(result.unwrap_err().contains("ObligationStale")); +} + +#[test] +fn borrow_with_stale_price_feed_is_rejected() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + // Advance well past the staleness window without re-publishing prices. + env.warp_slots(50); + let result = env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 100_000_000); + assert!(result.unwrap_err().contains("StalePriceFeed")); +} + +/// A cluster restart passes hours of wall-clock time in zero slots, so a price +/// published before the halt can still look fresh by slot count. The feed must +/// reject it until the publisher posts again. +#[test] +fn borrow_with_price_from_before_a_restart_is_rejected() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + + // The prices were published at the current slot. Simulate a halt: the + // cluster restarts a few slots later, well inside the staleness window, + // so only the restart check can catch the pre-halt price. + let restart_slot = env.current_slot() + 3; + env.warp_slots(5); + env.set_last_restart_slot(restart_slot); + + let result = env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 100_000_000); + assert!( + result.unwrap_err().contains("PricePredatesRestart"), + "a pre-restart price must be rejected even inside the staleness window" + ); + + // Publishing after the restart reopens the market. Warp first: the retry is + // otherwise byte-identical to the rejected borrow, so it would carry the + // same signature and be dropped as already processed. The failed borrow + // recorded nothing, so the obligation still has no borrows to refresh. + env.warp_slots(1); + env.set_price(collateral.mint, dollars(1)); + env.set_price(borrow.mint, dollars(1)); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 100_000_000) + .expect("a freshly published price must be accepted after a restart"); +} + +#[test] +fn repay_reduces_debt_and_over_repay_clamps() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + assert_eq!(env.reserve(&borrow).borrowed_principal > 0, true); + + env.repay(&borrower, obligation, &borrow, 200_000_000); + let obligation_state = env.obligation(obligation); + assert_eq!(obligation_state.borrows.len(), 1); + + // Over-repay: ask to repay far more than owed; it clamps to the remaining debt. + env.repay(&borrower, obligation, &borrow, 1_000_000_000); + assert_eq!(env.reserve(&borrow).borrowed_principal, 0); + assert!(env.obligation(obligation).borrows.is_empty()); +} + +#[test] +fn withdraw_blocked_while_borrowed_then_allowed_after_repay() { + let (mut env, collateral, borrow, borrower, obligation) = setup(); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 750_000_000) + .unwrap(); + + // At the LTV limit, withdrawing any collateral would undercollateralize. + let blocked = env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[&borrow], + &collateral, + 100_000_000, + ); + assert!(blocked.unwrap_err().contains("WithdrawTooLarge")); + + // Repay everything, then the collateral is free to withdraw. + env.repay(&borrower, obligation, &borrow, 750_000_000); + env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[], + &collateral, + 1_000_000_000, + ) + .unwrap(); + assert_eq!( + env.token_balance(ata(&borrower.pubkey(), &collateral.share_mint)), + 1_000_000_000 + ); +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_deposit_redeem.rs b/finance/lending/anchor-v1/programs/lending/tests/test_deposit_redeem.rs new file mode 100644 index 000000000..f52f3cf88 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_deposit_redeem.rs @@ -0,0 +1,61 @@ +mod common; + +use common::{default_config, Env}; +use solana_kite::mint_tokens_to_token_account; + +#[test] +fn first_deposit_mints_shares_one_to_one() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let supplier = env.create_user(); + let deposit = 1_000_000_000; // 1000 USDC + env.fund(&supplier, usdc.mint, deposit); + let share_account = env.supply(&supplier, &usdc, deposit); + + assert_eq!(env.token_balance(share_account), deposit); + let reserve = env.reserve(&usdc); + assert_eq!(reserve.available_liquidity, deposit); + assert_eq!(reserve.share_mint_supply, deposit); +} + +#[test] +fn raw_token_donation_does_not_inflate_exchange_rate() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let first = env.create_user(); + let amount = 1_000_000_000; + env.fund(&first, usdc.mint, amount); + env.supply(&first, &usdc, amount); + + // Attacker donates raw tokens straight into the reserve vault. available_liquidity + // is the source of truth, so this must NOT change the share exchange rate. + let owner = env.owner.insecure_clone(); + mint_tokens_to_token_account(&mut env.svm, &usdc.mint, &usdc.liquidity_vault, amount, &owner) + .unwrap(); + + let second = env.create_user(); + env.fund(&second, usdc.mint, amount); + let second_shares = env.supply(&second, &usdc, amount); + + // Despite the donation, the second supplier still gets 1:1 shares. + assert_eq!(env.token_balance(second_shares), amount); +} + +#[test] +fn redeem_returns_underlying_liquidity() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let supplier = env.create_user(); + let amount = 1_000_000_000; + let liquidity_account = env.fund(&supplier, usdc.mint, amount); + let share_account = env.supply(&supplier, &usdc, amount); + assert_eq!(env.token_balance(liquidity_account), 0); + + env.try_redeem(&supplier, &usdc, amount).unwrap(); + assert_eq!(env.token_balance(liquidity_account), amount); + assert_eq!(env.token_balance(share_account), 0); + assert_eq!(env.reserve(&usdc).share_mint_supply, 0); +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_interest.rs b/finance/lending/anchor-v1/programs/lending/tests/test_interest.rs new file mode 100644 index 000000000..15d6be350 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_interest.rs @@ -0,0 +1,109 @@ +mod common; + +use common::{default_config, dollars, ata, Env, SLOTS_PER_YEAR}; +use lending::constants::FIXED_POINT_SCALE; +use solana_signer::Signer; + +/// Borrowing at non-zero utilization, then letting slots pass, must grow the +/// reserve's accumulation factor, the borrower's debt, and the share exchange rate. +#[test] +fn interest_accrues_on_borrows_over_time() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + // Supplier funds 1000 units of borrow liquidity. + let supplier = env.create_user(); + let supplied = 1_000_000_000; + env.fund(&supplier, borrow.mint, supplied); + let supplier_liquidity = ata(&supplier.pubkey(), &borrow.mint); + env.supply(&supplier, &borrow, supplied); + + // Borrower posts collateral and borrows 500 units => 50% utilization. + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + + assert_eq!(env.reserve(&borrow).borrow_accumulation_factor, FIXED_POINT_SCALE); + + // Let a tenth of a year pass, counted at the reserve's own slots-per-year + // figure, then re-publish prices and refresh. + env.warp_slots(SLOTS_PER_YEAR / 10); + env.set_price(collateral.mint, dollars(1)); + env.set_price(borrow.mint, dollars(1)); + env.refresh_reserve_only(&borrower, &borrow); + + let index_after = env.reserve(&borrow).borrow_accumulation_factor; + assert!( + index_after > FIXED_POINT_SCALE, + "accumulation factor must grow once time passes with outstanding borrows" + ); + + // The borrower now owes more than the principal. + env.refresh_obligation_only(&borrower, obligation, &[&collateral], &[&borrow]); + let owed_value = env.obligation(obligation).borrowed_value; + let principal_value = 500u128 * FIXED_POINT_SCALE; // $500 at FIXED_POINT_SCALE per dollar + assert!( + owed_value > principal_value, + "debt value {owed_value} should exceed the $500 principal {principal_value}" + ); + + // The share exchange rate rose: redeeming shares returns more liquidity than + // was deposited per share. Redeem a slice that fits in available liquidity. + env.try_redeem(&supplier, &borrow, 100_000_000).unwrap(); + let returned = env.token_balance(supplier_liquidity); + assert!( + returned > 100_000_000, + "100M shares should redeem for more than 100M liquidity after interest, got {returned}" + ); +} + +/// The protocol keeps `reserve_factor_bps` of accrued interest as fees the +/// market owner can withdraw, while the rest lifts the supplier exchange rate. +#[test] +fn protocol_fees_accrue_and_owner_can_collect() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + + // No interest has accrued yet, so no fees. + assert_eq!(env.reserve(&borrow).accumulated_protocol_fees, 0); + + env.warp_slots(7_884_000); + env.refresh_reserve_only(&borrower, &borrow); + + // Fees accrued, and they are ~10% (the reserve factor) of total interest. + let reserve = env.reserve(&borrow); + let fees = reserve.accumulated_protocol_fees; + assert!(fees > 0, "protocol fees should accrue once interest does"); + let total_interest = reserve.current_borrowed_amount().unwrap() - 500_000_000; + let expected_fee = total_interest / 10; // 1000 bps = 10% + // Allow a 1-unit rounding tolerance from flooring. + assert!( + fees.abs_diff(expected_fee) <= 1, + "fees {fees} should be ~10% of interest {total_interest}" + ); + + // Maria withdraws the fees to her own account. + let owner_account = env.collect_protocol_fees(&borrow); + assert_eq!(env.token_balance(owner_account), fees); + assert_eq!(env.reserve(&borrow).accumulated_protocol_fees, 0); +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_liquidation.rs b/finance/lending/anchor-v1/programs/lending/tests/test_liquidation.rs new file mode 100644 index 000000000..2024369d0 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_liquidation.rs @@ -0,0 +1,138 @@ +mod common; + +use common::{ata, cents, default_config, dollars, Env, ReserveHandle}; +use solana_keypair::Keypair; +use solana_signer::Signer; + +/// A borrower with $1000 of collateral who has borrowed $700 (healthy at 80% +/// liquidation threshold), plus a liquidator funded with the borrow token. +fn setup() -> ( + Env, + ReserveHandle, + ReserveHandle, + Keypair, + anchor_lang::prelude::Pubkey, + Keypair, +) { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 700_000_000) + .unwrap(); + + let liquidator = env.create_user(); + env.fund(&liquidator, borrow.mint, 1_000_000_000); + + (env, collateral, borrow, borrower, obligation, liquidator) +} + +#[test] +fn healthy_obligation_cannot_be_liquidated() { + let (mut env, collateral, borrow, _borrower, obligation, liquidator) = setup(); + let result = env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 100_000_000, + ); + assert!(result.unwrap_err().contains("ObligationHealthy")); +} + +#[test] +fn unhealthy_obligation_liquidated_with_bonus_capped_by_close_factor() { + let (mut env, collateral, borrow, _borrower, obligation, liquidator) = setup(); + + // Collateral price falls to $0.80: collateral value $800, liquidation + // threshold 80% => $640, while debt is $700 => liquidatable. + env.set_price(collateral.mint, cents(80)); + + let liquidator_repay_account = ata(&liquidator.pubkey(), &borrow.mint); + let liquidator_collateral_account = ata(&liquidator.pubkey(), &collateral.share_mint); + let vault_before = env.reserve(&borrow).available_liquidity; + + // Offer to repay far more than the close factor allows; it caps at 50% of the + // $700 debt = $350. + env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 1_000_000_000, + ) + .unwrap(); + + // Exactly $350 (350M base units) was repaid — close-factor cap, not the full offer. + assert_eq!( + env.token_balance(liquidator_repay_account), + 1_000_000_000 - 350_000_000 + ); + assert_eq!( + env.reserve(&borrow).available_liquidity, + vault_before + 350_000_000 + ); + + // Liquidator seized collateral shares worth repay + 5% bonus, priced at $0.80: + // (350 * 1.05) / 0.80 = 459.375 collateral units => 459_375_000 shares (1:1 here). + assert_eq!( + env.token_balance(liquidator_collateral_account), + 459_375_000 + ); + + // The borrower's debt and collateral both dropped. + let obligation_state = env.obligation(obligation); + assert_eq!(obligation_state.deposits[0].deposited_shares, 1_000_000_000 - 459_375_000); +} + +/// A repayment whose seizure would exceed the posted collateral is rejected +/// rather than silently capped — silently capping would make the liquidator +/// pay full price for less collateral. A smaller repayment still works. +#[test] +fn over_seizing_liquidation_rejected_smaller_succeeds() { + let (mut env, collateral, borrow, _borrower, obligation, liquidator) = setup(); + + // Collateral crashes to $0.10: $100 of collateral against $700 of debt. + // The close-factor max repay ($350, plus 5% bonus => $367.50 of collateral) + // would seize far more than the $100 posted. + env.set_price(collateral.mint, cents(10)); + + let over_seize = env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 350_000_000, + ); + assert!(over_seize.unwrap_err().contains("LiquidationTooLarge")); + + // Repaying $50 seizes $52.50 of collateral = 525 units at $0.10 — fits. + env.try_liquidate( + &liquidator, + obligation, + &[&collateral], + &[&borrow], + &borrow, + &collateral, + 50_000_000, + ) + .unwrap(); + let liquidator_collateral_account = ata(&liquidator.pubkey(), &collateral.share_mint); + assert_eq!(env.token_balance(liquidator_collateral_account), 525_000_000); +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_reserve.rs b/finance/lending/anchor-v1/programs/lending/tests/test_reserve.rs new file mode 100644 index 000000000..ac4439091 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_reserve.rs @@ -0,0 +1,133 @@ +mod common; + +use common::{default_config, Env, SLOTS_PER_YEAR}; +use lending::constants::FIXED_POINT_SCALE; + +#[test] +fn init_market_and_reserve() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let reserve = env.reserve(&usdc); + assert_eq!(reserve.lending_market, env.market); + assert_eq!(reserve.liquidity_mint, usdc.mint); + assert_eq!(reserve.liquidity_decimals, 6); + assert_eq!(reserve.available_liquidity, 0); + assert_eq!(reserve.share_mint_supply, 0); + assert_eq!(reserve.borrowed_principal, 0); + // The accumulation factor starts at 1.0. + assert_eq!(reserve.borrow_accumulation_factor, FIXED_POINT_SCALE); +} + +#[test] +fn rejects_ltv_above_liquidation_threshold() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut bad = default_config(); + bad.loan_to_value_bps = 9_000; + bad.liquidation_threshold_bps = 8_000; + let result = env.try_update_config(&usdc, bad); + assert!( + result.unwrap_err().contains("InvalidConfig"), + "LTV above the liquidation threshold must be rejected" + ); +} + +#[test] +fn rejects_misordered_interest_rate_curve() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut bad = default_config(); + bad.min_borrow_rate_bps = 5_000; + bad.optimal_borrow_rate_bps = 2_000; // optimal below min + bad.max_borrow_rate_bps = 15_000; + let result = env.try_update_config(&usdc, bad); + assert!(result.unwrap_err().contains("InvalidConfig")); +} + +#[test] +fn accepts_valid_config_update() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut updated = default_config(); + updated.loan_to_value_bps = 6_000; + env.try_update_config(&usdc, updated).unwrap(); + assert_eq!(env.reserve(&usdc).config.loan_to_value_bps, 6_000); +} + +#[test] +fn rejects_zero_slots_per_year() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, common::dollars(1), default_config()); + + let mut bad = default_config(); + bad.slots_per_year = 0; + let result = env.try_update_config(&usdc, bad); + assert!( + result.unwrap_err().contains("InvalidConfig"), + "a zero slots-per-year divisor must be rejected, not divided by" + ); +} + +/// The rate fields are annual; what a borrower is charged per slot is the APR +/// divided by `slots_per_year`. Two reserves differing only in that divisor +/// accrue in proportion to it over the same elapsed slots. This is why the +/// cluster's slot time has to be configured rather than compiled in: leave a +/// stale figure in place after the protocol shortens the slot and every +/// borrower pays more per day than the advertised APR, with nothing in the +/// program changed to say so. +#[test] +fn slots_per_year_scales_the_per_slot_rate() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, common::dollars(1), default_config()); + + let baseline = env.add_reserve(6, common::dollars(1), default_config()); + let mut halved_config = default_config(); + halved_config.slots_per_year = SLOTS_PER_YEAR / 2; + let halved = env.add_reserve(6, common::dollars(1), halved_config); + + // Identical supply and borrow in both, so both sit at 50% utilization and + // therefore resolve to the same APR from the same kinked curve. + for reserve in [&baseline, &halved] { + let supplier = env.create_user(); + env.fund(&supplier, reserve.mint, 1_000_000_000); + env.supply(&supplier, reserve, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, reserve.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], reserve, 500_000_000) + .unwrap(); + } + + let elapsed = SLOTS_PER_YEAR / 100; + env.warp_slots(elapsed); + env.set_price(collateral.mint, common::dollars(1)); + env.set_price(baseline.mint, common::dollars(1)); + env.set_price(halved.mint, common::dollars(1)); + + let refresher = env.create_user(); + env.refresh_reserve_only(&refresher, &baseline); + env.refresh_reserve_only(&refresher, &halved); + + let baseline_growth = env.reserve(&baseline).borrow_accumulation_factor - FIXED_POINT_SCALE; + let halved_growth = env.reserve(&halved).borrow_accumulation_factor - FIXED_POINT_SCALE; + assert!( + baseline_growth > 0, + "the baseline reserve must have accrued something to compare against" + ); + + // The per-slot rate is floored, so the two rates can differ by one unit in + // the last place; over `elapsed` slots that is an `elapsed`-sized gap. + let doubled = baseline_growth * 2; + assert!( + halved_growth.abs_diff(doubled) <= elapsed as u128, + "halving slots_per_year should double the accrual: got {halved_growth}, expected about {doubled}" + ); +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_rounding.rs b/finance/lending/anchor-v1/programs/lending/tests/test_rounding.rs new file mode 100644 index 000000000..7cebb803c --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_rounding.rs @@ -0,0 +1,106 @@ +mod common; + +use common::{ata, default_config, dollars, Env}; +use solana_signer::Signer; + +/// After interest makes the pool worth more than its share supply, a deposit so +/// small it would mint zero shares is rejected rather than silently giving the +/// depositor nothing. +#[test] +fn deposit_that_would_mint_zero_shares_is_rejected() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 500_000_000) + .unwrap(); + + // Accrue enough interest that total liquidity exceeds the share supply. + env.warp_slots(7_884_000); + env.refresh_reserve_only(&borrower, &borrow); + assert!(env.reserve(&borrow).borrow_accumulation_factor > lending::constants::FIXED_POINT_SCALE); + + let dust_depositor = env.create_user(); + env.fund(&dust_depositor, borrow.mint, 1); + let result = env.try_supply(&dust_depositor, &borrow, 1); + assert!( + result.unwrap_err().contains("DepositTooSmall"), + "a 1-unit deposit into an appreciated pool mints zero shares and must be rejected" + ); +} + +#[test] +fn deposit_redeem_round_trip_creates_no_value() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, dollars(1), default_config()); + + let user = env.create_user(); + let amount = 777_777_777; + let liquidity_account = env.fund(&user, usdc.mint, amount); + let share_account = env.supply(&user, &usdc, amount); + + let shares = env.token_balance(share_account); + env.try_redeem(&user, &usdc, shares).unwrap(); + + // The round trip must never return more than was put in. + assert!(env.token_balance(liquidity_account) <= amount); +} + +#[test] +fn withdraw_at_health_boundary_then_one_more_unit_fails() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + let borrow = env.add_reserve(6, dollars(1), default_config()); + + let supplier = env.create_user(); + env.fund(&supplier, borrow.mint, 1_000_000_000); + env.supply(&supplier, &borrow, 1_000_000_000); + + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.fund(&borrower, borrow.mint, 0); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + env.post_collateral(&borrower, obligation, &collateral, 1_000_000_000); + + // Borrow $600 against $1000 collateral (75% LTV => $750 power). + env.try_borrow(&borrower, obligation, &[&collateral], &[], &borrow, 600_000_000) + .unwrap(); + + // Withdrawing $200 of collateral lands exactly on the limit: new power + // $750 - 0.75*$200 = $600 == debt. This must pass. + env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[&borrow], + &collateral, + 200_000_000, + ) + .unwrap(); + assert_eq!( + env.token_balance(ata(&borrower.pubkey(), &collateral.share_mint)), + 200_000_000 + ); + + // One more unit now pushes the obligation past its limit. + let result = env.try_withdraw_collateral( + &borrower, + obligation, + &[&collateral], + &[&borrow], + &collateral, + 1, + ); + assert!(result.unwrap_err().contains("WithdrawTooLarge")); +} diff --git a/finance/lending/anchor-v1/programs/lending/tests/test_security.rs b/finance/lending/anchor-v1/programs/lending/tests/test_security.rs new file mode 100644 index 000000000..d928d7e09 --- /dev/null +++ b/finance/lending/anchor-v1/programs/lending/tests/test_security.rs @@ -0,0 +1,78 @@ +mod common; + +use anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, +}; +use common::{default_config, dollars, Env}; +use solana_signer::Signer; + +/// A reserve from one lending market cannot be used with an obligation from +/// another: lending markets are isolation boundaries. +#[test] +fn cross_market_reserve_is_rejected() { + let mut env = Env::new(); + let collateral = env.add_reserve(6, dollars(1), default_config()); + + // A second market with its own reserve. + let other_owner = env.create_user(); + let other_market = env.init_market_for(&other_owner); + let foreign_reserve = + env.add_reserve_to(&other_owner, other_market, 6, dollars(1), default_config()); + + // A borrower set up in the FIRST market. + let borrower = env.create_user(); + env.fund(&borrower, collateral.mint, 1_000_000_000); + env.supply(&borrower, &collateral, 1_000_000_000); + let obligation = env.initialize_obligation(&borrower); + + // Posting collateral via the second market's reserve must fail before any + // token movement. + env.fund(&borrower, foreign_reserve.share_mint, 0); // create the share ATA + let result = env.try_post_collateral(&borrower, obligation, &foreign_reserve, 1); + assert!( + result.unwrap_err().contains("MarketMismatch"), + "a reserve from another lending market must be rejected" + ); +} + +/// A market's price feed can only be written by that market's owner: an +/// outsider cannot publish (or squat) prices for a market they don't own. +#[test] +fn non_owner_cannot_write_market_price_feed() { + let mut env = Env::new(); + let usdc = env.add_reserve(6, dollars(1), default_config()); + + let attacker = env.create_user(); + // The market's feed for this mint (seeds ["price_feed", market, mint]). + let market_feed = env.price_feed_address(env.market, usdc.mint); + + // The attacker passes the real market but signs as themself; `has_one = owner` + // on the market rejects them before any write. + let instruction = Instruction { + program_id: lending::id(), + accounts: lending::accounts::SetPrice { + lending_market: env.market, + owner: attacker.pubkey(), + price_feed: market_feed, + mint: usdc.mint, + system_program: system_program::id(), + } + .to_account_metas(None), + data: lending::instruction::SetPrice { + price_mantissa: common::dollars(1_000_000), // an absurd price + exponent: common::PRICE_EXPONENT, + } + .data(), + }; + let result = solana_kite::send_transaction_from_instructions( + &mut env.svm, + vec![instruction], + &[&attacker], + &attacker.pubkey(), + ); + assert!( + result.is_err(), + "only the market owner may write its price feed" + ); +} diff --git a/finance/lending/anchor/README.md b/finance/lending/anchor/README.md index ad81df63c..f3376a85f 100644 --- a/finance/lending/anchor/README.md +++ b/finance/lending/anchor/README.md @@ -1,5 +1,11 @@ # Solana Lending (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + A Kamino/Solend-style borrow/lend program on Solana: suppliers earn interest on deposits, borrowers post collateral and draw other assets against it, and liquidators keep the market solvent. It demonstrates the techniques the most-used Solana lending diff --git a/finance/order-book/anchor-v1/.gitignore b/finance/order-book/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/finance/order-book/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/finance/order-book/anchor-v1/Anchor.toml b/finance/order-book/anchor-v1/Anchor.toml new file mode 100644 index 000000000..0505fe40d --- /dev/null +++ b/finance/order-book/anchor-v1/Anchor.toml @@ -0,0 +1,22 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +# Pin Solana to the version used across the repo's Anchor 1.0 examples so the +# bundled test validator and BPF toolchain stay in lock-step. +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +order_book = "C69UJ8irfmHq5ysyLek7FKApHR86FBeupiz4JnoyPzzx" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# LiteSVM Rust tests live under `programs/order-book/tests/` and include the built +# `.so` via `include_bytes!`, so a fresh `anchor build` must run first. +test = "cargo test" diff --git a/finance/order-book/anchor-v1/CHANGELOG.md b/finance/order-book/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/finance/order-book/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/finance/order-book/anchor-v1/Cargo.toml b/finance/order-book/anchor-v1/Cargo.toml new file mode 100644 index 000000000..68da9ddd2 --- /dev/null +++ b/finance/order-book/anchor-v1/Cargo.toml @@ -0,0 +1,13 @@ +[workspace] +members = ["programs/*"] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/order-book/anchor-v1/README.md b/finance/order-book/anchor-v1/README.md new file mode 100644 index 000000000..3f1e516d1 --- /dev/null +++ b/finance/order-book/anchor-v1/README.md @@ -0,0 +1,1635 @@ +# Solana Order Book Exchange (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +This Solana program is an **[order book](https://www.investopedia.com/terms/o/order-book.asp)** exchange: specifically, a **[central limit order +book (CLOB)](https://www.investopedia.com/terms/l/limitorderbook.asp)**, the standard piece of market infrastructure used by +NYSE, NASDAQ, LSE, CME, and crypto venues like Phoenix, Cube, and OpenBook. Written with Anchor, it runs an onchain order book for a single pair of token mints: +users post buy or sell offers at the prices they want, the program +matches crossing offers in price-time priority, and settles the +resulting token movements. + +If you already know what an order book, a limit order, and a taker fee +are, skip to [Accounts and PDAs](#2-accounts-and-pdas) or +[Instruction lifecycle walkthrough](#3-instruction-lifecycle-walkthrough). + +--- + +## Table of contents + +1. [What does this program do?](#1-what-does-this-program-do) +- [A real-world walkthrough: NVDAx/USDC](#a-real-world-walkthrough-nvdaxusdc) +2. [Accounts and PDAs](#2-accounts-and-pdas) +3. [Instruction lifecycle walkthrough](#3-instruction-lifecycle-walkthrough) +4. [The matching engine - step by step](#4-the-matching-engine--step-by-step) +- [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance) +5. [Full-lifecycle worked examples](#5-full-lifecycle-worked-examples) +6. [Safety and edge cases](#6-safety-and-edge-cases) +7. [Running the tests](#7-running-the-tests) +8. [Extending the program](#8-extending-the-program) + +--- + +## 1. What does this program do? + +Two users want to swap tokens at prices they each picked: + +- Alice holds **USDC** (the *[quote](https://www.investopedia.com/terms/q/quotecurrency.asp)* mint - the pricing unit, the way USD + is the pricing unit in "NVDAx is $950") and wants to buy **NVDAx** + (the *[base](https://www.investopedia.com/terms/b/basecurrency.asp)* mint - the asset being priced), but only if she can + get NVDAx at 900 USDC per share or lower. +- Bob holds **NVDAx** and wants USDC, but only if he can get at least + 950 USDC per NVDAx share he sells. + +They post their offers - Alice a *bid* (a buy offer at a limit price), +Bob an *ask* (a sell offer at a limit price) - and wait. Alice's bid +sits on the book. Bob's ask sits on the book. Neither crosses the +other, so nothing happens yet. + +Later, Carol shows up holding NVDAx and willing to sell at any price ≥ 900 +USDC. She posts an ask at 900. Now Alice's bid (900 USDC) *crosses* +Carol's new ask (900 USDC) - the bid is ≥ the ask. The program: + +1. Pairs them up. +2. Locks Carol's NVDAx in the program's base vault (Carol signed this + transaction, so only her funds move). +3. Allocates Alice's USDC - already sitting in the quote vault since + Alice placed her bid - to Carol. +4. Credits each party's unsettled balance with what they're owed, minus + a fee for the market operator. Tokens don't leave the vaults yet; + Alice and Carol each call `settle_funds` later to pull them out. + +At no point does either of them transfer directly to the other - all +token flows go through two program-owned vaults, and both users later +call `settle_funds` to pull their balances out. + +### The onchain pieces, in plain terms + +- A **Market** PDA - one per base/quote pair. Stores fee rate, tick + size, minimum order size, the addresses of the four related accounts + (base vault, quote vault, fee vault, order book), and the pubkey + that can withdraw accumulated fees. +- An **OrderBook** account - two stores: bids sorted highest-first, + asks sorted lowest-first, each holding up to 1024 entries. Rather + than a plain list of orders, each side uses a depth-bounded tree (a + critbit trie) for fast lookup - see [Ensuring fast order matching performance](#ensuring-fast-order-matching-performance). + Each entry stores enough to drive matching (price, quantity, + `order_id`); the full `Order` PDA holds the authoritative state. +- A **MarketUser** PDA - one per `(market, wallet)` pair. Tracks the + order_ids this user has open and two running tallies + (`unsettled_base`, `unsettled_quote`) of tokens owed back to this + user from fills or cancellations. +- An **Order** PDA - one per placed order. Stores price, quantity, + side (bid or ask), fill status, and the owner. +- Three token accounts held by the Market PDA: `base_vault` (all + sellers' locked base + buyers' bought base waiting to be withdrawn), + `quote_vault` (mirror for quote), and `fee_vault` (accumulated taker + fees). + +### Finance background, briefly + +For readers new to trading terms - these are the same concepts every +equity, futures, and crypto exchange uses. They're optional; +everything above describes the program mechanically. + +- **A [limit order](https://www.investopedia.com/terms/l/limitorder.asp)** is an order to trade an amount of an asset at a + specific price *or better*. A *[bid](https://www.investopedia.com/terms/b/bid.asp)* is a limit order to buy, an + *[ask](https://www.investopedia.com/terms/a/ask.asp)* is a limit order to sell. The "limit" part means: don't trade + at a worse price than the one I named. + +- **An order book** is the set of currently-open bids and asks, + sorted so the best price on each side sits at the top. The "top of + book" on the bid side is the highest-priced buy offer; the top of + book on the ask side is the lowest-priced sell offer. + +- **A [maker](https://www.investopedia.com/terms/m/marketmaker.asp)** is whoever posts an order that doesn't immediately + match - they "make" [liquidity](https://www.investopedia.com/terms/l/liquidity.asp) by leaving their offer on the book + for others to trade against. A **[taker](https://www.investopedia.com/terms/m/maker_taker.asp)** is whoever walks into the + book and hits the resting orders - they "take" liquidity. + +- **A [taker fee](https://www.investopedia.com/terms/m/maker_taker.asp)** is a cut of each trade taken by the venue from the + taker's leg of the trade, expressed in *[basis points](https://www.investopedia.com/terms/b/basispoint.asp)* (bps). One + bps is 0.01%; 10 000 bps is 100%. A 50 bps fee is 0.5%. + +- **Price-time priority** is the universal matching rule on every + limit order book: best price first, and at the same price level, + whoever posted first fills first. + +- **[Settlement](https://www.investopedia.com/terms/s/settlement.asp)** is the step that actually moves tokens out of the + venue's custody account and back to the user. This program splits + matching and settlement into two instruction handlers (`place_order` + and `settle_funds`) so a taker crossing a long list of makers + doesn't have to pay for a token CPI per maker. + +### What this example is not + +- **Not deployed, not audited.** Treat as a learning example, not + production-ready code. +- **No [immediate-or-cancel](https://www.investopedia.com/terms/i/immediateorcancel.asp) (IOC), [fill-or-kill](https://www.investopedia.com/terms/f/fill-or-kill.asp) (FOK), or post-only orders** - every + order matches what it can at the limit price and rests any remainder + on the book. IOC would discard the remainder instead of resting it; + FOK would reject the whole order unless it fills entirely; post-only + would reject the order if it would cross immediately. +- **No circuit breakers, no oracles, no price bands.** + +Solana terminology (account, PDA, CPI, bump, discriminator, signer, +lamport, ATA) is defined at . + +**Base asset, quote asset.** In "BASE/QUOTE", the base is the asset +being priced and the quote is the pricing unit. Bids spend quote and +receive base; asks spend base and receive quote. + +**Limit price.** The worst price at which an order is allowed to +trade - for a bid, the *highest* the buyer will pay; for an ask, the +*lowest* the seller will accept. A bid at 900 won't fill against an +ask at 950. + +**Tick size.** Smallest allowable price increment. A market with +`tick_size = 10` accepts prices 10, 20, 30, …, but rejects 15. Stops +the book filling up with 1-unit-apart orders. + +**Minimum order size.** Smallest allowable `quantity` on any order. +Keeps dust orders from polluting the book. + +**Match / fill / cross.** Two orders *cross* when the bid's price is +≥ the ask's price; they *match* (are paired up) and a *fill* is the +result - one crossing event with a fill quantity and a fill price. +One call to `place_order` can produce many fills. + +**[Price improvement](https://www.investopedia.com/terms/p/priceimprovement.asp).** When a taker's limit is better than the best +resting price on the opposite side, the fill happens at the resting +(maker's) price. The taker gets a better deal than they named; the +difference is refunded to the taker's `unsettled_quote`. + +**Unsettled balance.** Two `u64` counters on each `MarketUser`: +`unsettled_base` and `unsettled_quote`. Fills, price-improvement +rebates, and cancellations all increase these counters. The physical +tokens still sit in the market's vaults. `settle_funds` moves them +to the user's own token accounts and zeroes the counters. + +**Fee vault.** A separate token account (quote mint) owned by the +Market PDA. Every taker fee - `ceil(gross * fee_bps / 10_000)` per fill - +moves here in one batched CPI at the end of `place_order`. + +**Remaining accounts.** Solana lets the caller pass a tail of extra +`AccountInfo`s beyond the ones named in `#[derive(Accounts)]`. The +`place_order` handler uses them for the resting orders the taker +wants to cross: for each one, the caller supplies +`(maker_order_pda, maker_user_account_pda)` in the book's price-time +order. + +--- + +## A real-world walkthrough: NVDAx/USDC + +This section walks through a complete sequence of trades using four real participants and two example tokens. Every instruction handler is shown with the exact accounts it creates or mutates. Read this before the technical reference sections if you are new to order books or to Solana. + +### The tokens + +- **NVDAx** (**Base asset** - the thing being bought and sold): An onchain NVIDIA share (xStock). Its price tracks the underlying stock. +- **USDC** (**Quote asset** - the currency used for pricing and payment): A stablecoin redeemable 1:1 for US dollars + +A price of **960** means "960 USDC per NVDAx". The same program logic - identical instruction handlers and account structure - works for any other pair, such as **TSLAx/USDC** (Tesla xStock). + +### The participants + +- **Maria** (Market authority): Earns 0.25 % ([25 basis points](https://www.investopedia.com/terms/b/basispoint.asp)) on every fill. Her revenue scales with market volume, so she wants a liquid, trusted venue. +- **Alice** (Retail investor - buyer): Bullish thesis: she expects NVDAx to rise from ~960 USDC to ~1 100 as demand for NVIDIA's AI chips grows. She wants to accumulate NVDAx at a good price before that move. +- **Bob** ([Market maker](https://www.investopedia.com/terms/m/marketmaker.asp)): No directional view on NVDAx. Profits from the [bid-ask spread](https://www.investopedia.com/terms/b/bid-askspread.asp): he simultaneously quotes a buy price (bid) below fair value and a sell price (ask) above it. If both sides fill, the difference is his gross revenue. He provides [liquidity](https://www.investopedia.com/terms/l/liquidity.asp) to the market in exchange for that spread. +- **Carol** (Retail investor - seller): Bought NVDAx at 800 USDC six months ago. It is now trading around 960. She wants to sell some to [realise her profit](https://www.investopedia.com/terms/r/realizedprofit.asp) in USDC. + +--- + +### Step 1 - Maria creates the market + +**Instruction: `initialize_market(fee_basis_points=25, tick_size=1, min_order_size=1)`** +**Key accounts: `base_mint = NVDAx`, `quote_mint = USDC`** + +Maria's wallet signs. Five accounts are created: + +- `Market` PDA: type Program data, seeds `["market", NVDAx_mint, USDC_mint]`, state after `fee_bps=25`, `tick_size=1`, `is_active=true`; vault addresses recorded +- `OrderBook`: type Zero-copy slab (~180 KB), seeds Client-allocated (not a PDA), state after Both critbit trees empty +- `base_vault`: type Token account (NVDAx), seeds Authority = Market PDA, state after 0 NVDAx +- `quote_vault`: type Token account (USDC), seeds Authority = Market PDA, state after 0 USDC +- `fee_vault`: type Token account (USDC), seeds Authority = Market PDA, state after 0 USDC + +**No tokens move.** Maria pays the SOL rent for all five accounts. + +--- + +### Step 2 - Alice, Bob, and Carol register as traders + +**Instruction: `initialize_market_user`** (called once by each trader) + +Each call creates one `MarketUser` PDA - a per-(trader, market) account that tracks their open orders and any tokens owed to them: + +- Alice's `MarketUser` PDA: seeds `["market_user", market, alice_pubkey]`; `unsettled_base=0`, `unsettled_quote=0`, `open_orders=[]` +- Bob's `MarketUser` PDA: seeds `["market_user", market, bob_pubkey]`; same +- Carol's `MarketUser` PDA: seeds `["market_user", market, carol_pubkey]`; same + +--- + +### Step 3 - Bob posts a sell offer (ask) at 965 USDC + +Bob estimates NVDAx fair value at 960 USDC. He quotes a 10-USDC spread - ask at 965, bid at 955. He starts by posting the ask. + +**Instruction: `place_order(side=Ask, price=965, quantity=10)`** (no `remaining_accounts` - book is empty) + +**Token flow:** +``` +bob_nvdax_ata --[10 NVDAx]--> base_vault +``` + +**Accounts changed:** + +- `base_vault`: +10 NVDAx +- New `Order` PDA (id=1): `side=Ask, price=965, qty=10, status=Open` +- `OrderBook.asks`: Leaf inserted at price 965 +- Bob's `MarketUser.open_orders`: `[1]` + +**Book state:** +``` +asks [(id=1, price=965, qty=10)] ← Bob +bids [] +``` + +--- + +### Step 4 - Alice places a buy offer (bid) at 950 USDC + +Alice places a [limit order](https://www.investopedia.com/terms/l/limitorder.asp): she will buy 5 NVDAx but pay no more than 950 USDC each. Her bid (950) does not cross Bob's ask (965), so nothing fills and her bid rests on the book. + +**Instruction: `place_order(side=Bid, price=950, quantity=5)`** (no `remaining_accounts`) + +**Token flow:** +``` +alice_usdc_ata --[950 × 5 = 4 750 USDC]--> quote_vault +``` + +**Accounts changed:** + +- `quote_vault`: +4 750 USDC +- New `Order` PDA (id=2): `side=Bid, price=950, qty=5, status=Open` +- `OrderBook.bids`: Leaf inserted at price 950 +- Alice's `MarketUser.open_orders`: `[2]` + +**Book state:** +``` +asks [(id=1, price=965, qty=10)] ← Bob +bids [(id=2, price=950, qty=5)] ← Alice +``` + +The [bid-ask spread](https://www.investopedia.com/terms/b/bid-askspread.asp) is 965 − 950 = 15 USDC. No trade yet. + +--- + +### Step 5 - Carol sells into Alice's bid + +Carol wants to sell 3 NVDAx. Alice is bidding 950 USDC - above Carol's floor of 945. Carol sends an [ask](https://www.investopedia.com/terms/a/ask.asp) at 945 and passes Alice's resting order as a maker. + +**Instruction: `place_order(side=Ask, price=945, quantity=3, remaining_accounts=[alice_order_pda, alice_market_user_pda])`** + +**Crossing check:** Carol's ask (945) ≤ Alice's bid (950) ✓ - the orders cross. Fill price = 950 (Alice's price - the resting [maker](https://www.investopedia.com/terms/m/marketmaker.asp) always sets the execution price). Carol named 945 but receives 950 - that is [price improvement](https://www.investopedia.com/terms/p/priceimprovement.asp). + +**Token flow (Carol's NVDAx locked up front):** +``` +carol_nvdax_ata --[3 NVDAx]--> base_vault +``` + +**Fill accounting (fill price = 950, fill qty = 3):** + +- **Gross quote exchanged**: 950 × 3; 2 850 USDC +- **Taker fee (25 bps)**: ceil(2 850 × 25 / 10 000) = ceil(7.125); 8 USDC +- **Carol's net proceeds**: 2 850 − 8; 2 842 USDC → `carol.MarketUser.unsettled_quote` +- **Alice's base received**: 3 NVDAx; → `alice.MarketUser.unsettled_base` + +**Accounts changed:** + +- `base_vault`: +3 NVDAx (Carol's lock) +- `fee_vault`: +8 USDC (fee CPI from quote_vault) +- Alice's `Order` PDA (id=2): `filled_quantity=3`, `status=PartiallyFilled` +- Alice's `MarketUser.unsettled_base`: +3 NVDAx +- Alice's `MarketUser.open_orders`: `[2]` (still open - 2 of 5 NVDAx remain) +- Carol's `MarketUser.unsettled_quote`: +2 842 USDC +- New Carol's `Order` PDA (id=3): `side=Ask, price=945, qty=3, status=Filled` +- `OrderBook.bids`: Alice's leaf quantity: 5 → 2 + +**Book state:** +``` +asks [(id=1, price=965, qty=10)] ← Bob (untouched) +bids [(id=2, price=950, qty=2)] ← Alice (3 filled, 2 still resting) +``` + +Alice has 3 NVDAx credited to her (tracked in `unsettled_base`). Carol has 2 993 USDC credited (tracked in `unsettled_quote`). Neither amount has left the vaults yet - that happens on `settle_funds`. + +--- + +### Step 6 - Settlement: tokens move to wallets + +[Settlement](https://www.investopedia.com/terms/s/settlement.asp) is when the program pays out what it owes. + +**Alice calls `settle_funds`:** +``` +base_vault --[3 NVDAx]--> alice_nvdax_ata +``` +`alice.MarketUser.unsettled_base = 0` + +**Carol calls `settle_funds`:** +``` +quote_vault --[2 842 USDC]--> carol_usdc_ata +``` +`carol.MarketUser.unsettled_quote = 0` + +--- + +### Step 7 - Maria sweeps fees + +**Maria calls `withdraw_fees`:** +``` +fee_vault --[8 USDC]--> maria_usdc_ata +``` +`fee_vault.balance = 0` + +--- + +### Final position + +- **Alice**: paid / locked 4 750 USDC (for 5 NVDAx); received 3 NVDAx + 1 900 USDC still in `quote_vault` (2-NVDAx bid resting at 950); outcome Thesis running; waiting for a seller at 950 to fill the rest +- **Carol**: paid / locked 3 NVDAx (cost 800 each); received 2 842 USDC; outcome Locked in ≈ 147 USDC/NVDAx profit net of fee +- **Bob**: paid / locked 10 NVDAx locked; received Nothing yet - ask at 965 unfilled; outcome Earns the spread when a buyer at 965 arrives +- **Maria**: paid / locked -; received 8 USDC; outcome Fee revenue + +Alice's remaining 2-NVDAx [bid](https://www.investopedia.com/terms/b/bid.asp) stays on the book. The next seller willing to part with NVDAx at 950 or below will fill it automatically. A **TSLAx/USDC** market runs the same seven steps with different mint addresses. + +--- + +## 2. Accounts and PDAs + +### State / data accounts + +- `Market`: PDA yes, seeds `["market", base_mint, quote_mint]`, authority program, holds fee rate, tick size, min order size, base/quote mint pubkeys, vault pubkeys, order book pubkey, `authority` wallet (allowed to withdraw fees) +- `OrderBook`: PDA no (client-allocated keypair), seeds n/a: too large (~180 KB) for an `init`/CPI PDA, so created via `create_account` (which needs a signing key a PDA lacks); tied to its market via `has_one`; authority program, holds two critbit trees (bids highest-first, asks lowest-first, 1024 leaves each), `next_order_id` +- `Order`: PDA yes, seeds `["order", market, order_id.to_le_bytes()]`, authority program, holds owner, side, price, original_quantity, filled_quantity, status, timestamp +- `MarketUser`: PDA yes, seeds `["market_user", market, owner]`, authority program, holds `unsettled_base`, `unsettled_quote`, `open_orders: Vec` (max 20) + +### Token accounts (owned by the Token Program, authority = Market PDA) + +- `base_vault`: PDA no (regular token account), authority Market PDA, mint base, holds bids' locked base IS NOT STORED HERE - only asks' locked base sits here pre-match, plus base owed to bid-takers waiting for `settle_funds` +- `quote_vault`: PDA no, authority Market PDA, mint quote, holds bids' locked quote pre-match, plus quote owed to ask-takers and bid-makers waiting for settlement +- `fee_vault`: PDA no, authority Market PDA, mint quote, holds taker fees accumulated across all fills; drained by `withdraw_fees` + +Note: the **token vaults are not PDAs**. They are regular token +accounts created with `init` in `initialize_market.rs`; their +*authority* is the Market PDA, so only the program can move funds out. +Their addresses are computed by the caller (e.g. generated Keypairs in +the tests) and then written to `market.base_vault` / `quote_vault` / +`fee_vault` for the program to validate them on later calls via +`has_one = fee_vault` etc. + +### Leaf layout in the `OrderBook` slab + +Each side of the book is a critbit tree whose leaves are 88-byte +`LeafNode`s: + +```rust +pub struct LeafNode { + pub key: u128, // high 64 bits = price; low 64 = seq_num (time priority) + pub owner: Pubkey, + pub quantity: u64, // remaining quantity on this resting order + pub order_id: u64, // links to the full Order PDA + pub timestamp: i64, +} +``` + +The full order state (`filled_quantity`, `status`, `original_quantity`) +lives on the `Order` PDA. The leaf holds just enough to drive matching +(price via the key, remaining quantity) and to let offchain tooling +display age and link back to the order. + +### `Order` state + +From [`state/order.rs`](programs/order-book/src/state/order.rs): + +```rust +pub struct Order { + pub market: Pubkey, + pub owner: Pubkey, + pub order_id: u64, + pub side: OrderSide, // Bid | Ask + pub price: u64, + pub original_quantity: u64, + pub filled_quantity: u64, + pub status: OrderStatus, // Open | PartiallyFilled | Filled | Cancelled + pub timestamp: i64, + pub bump: u8, +} +``` + +`remaining_quantity(order) = original_quantity - filled_quantity`. Used +by `cancel_order` to decide how much to credit back to the user. + +### `MarketUser` state + +```rust +pub struct MarketUser { + pub market: Pubkey, + pub owner: Pubkey, + pub unsettled_base: u64, + pub unsettled_quote: u64, + pub open_orders: Vec, // capped at 20 via Anchor max_len + pub bump: u8, +} +``` + +The `open_orders` cap (20 per user) is mirrored by a +`MAX_OPEN_ORDERS_PER_USER` check in `place_order`. One user cannot +flood the book. + +**Why per-(user, market) and not per-user?** A `MarketUser` is keyed +by both the human `owner` and the `market`, not by `owner` alone. +Three reasons: + +1. **Unsettled balances are per-market by definition.** Different + markets use different `base_mint` / `quote_mint` pairs, so the + scalar `unsettled_base` / `unsettled_quote` fields can't be + shared across markets - they'd refer to different tokens. + +2. **Open-order indexing is local to one book.** `open_orders` + holds `order_id`s that index into a specific market's + `OrderBook`. Mixing ids from different books would force a + per-entry market discriminator and a wider lookup path. + +3. **Lock-contention isolation.** A user trading on multiple + markets in parallel would otherwise serialise every + `place_order` / `settle_funds` on a single shared account. + Per-(user, market) lets independent markets run independently. + +This matches the standard pattern: Openbook v2 calls it +`OpenOrdersAccount`, Phoenix calls it `Trader`, Serum called it +`OpenOrders`. We named ours `MarketUser` to be explicit about what +it actually scopes to. + +### How vault balances evolve + +At any point in time: + +- `base_vault.balance` = sum of all resting asks' `remaining_quantity` + + every user's `unsettled_base`. +- `quote_vault.balance` = sum of all resting bids' + `price * remaining_quantity` + + every user's `unsettled_quote`. + +(Plus the bit of quote that the matching engine has already taken out +as fee and batched into `fee_vault`.) + +This is not a hard invariant the program enforces - it emerges from +the flows. The invariant worth caring about is the per-event balance: +every fill moves tokens from the loser's locked pool to the winner's +`unsettled_*`, plus the fee cut to `fee_vault`. The unit tests check +this directly (`settle_funds_after_match_pays_out_both_unsettled_balances`). + +--- + +## 3. Instruction lifecycle walkthrough + +The program has six instruction handlers. The order a user encounters +them is: + +1. `initialize_market` (market operator - once) +2. `initialize_market_user` (every user, once per market) +3. `place_order` (a user - as many times as they want) +4. `cancel_order` (a user - to remove a resting order) +5. `settle_funds` (a user - to collect winnings) +6. `withdraw_fees` (market authority - to collect protocol revenue) + +For each, the shape is: who signs, what accounts go in, what PDAs get +created, what token flows happen, what state mutates, what checks are +run. + +Token flow shorthand: + +``` + --[amount of ]--> +``` + +### 3.1 `initialize_market` + +**Who calls it:** the market operator. They create a new trading pair. + +**Signers:** `authority`. + +**Parameters:** + +```rust +pub fn initialize_market( + context: Context, + fee_basis_points: u16, + tick_size: u64, + min_order_size: u64, +) -> Result<()> +``` + +**Accounts in:** + +- `authority` (signer, mut - pays account rent for all five new + accounts) +- `market` (PDA, **init**, seeds `["market", base_mint, quote_mint]`) +- `order_book` (not a PDA - client calls `system_program::create_account` + first, sized to `ORDER_BOOK_ACCOUNT_SIZE`; verified here with + `#[account(zero)]`) +- `base_mint`, `quote_mint` (read-only) +- `base_vault`, `quote_vault`, `fee_vault` (all **init** as + `TokenAccount`s, authority = `market`) +- `token_program`, `system_program` + +**Checks:** + +- `tick_size > 0` → `InvalidTickSize` +- `min_order_size > 0` → `BelowMinOrderSize` +- `fee_basis_points <= 10_000` → `InvalidFeeBasisPoints` + +**Token movements:** none (the vaults are empty after init). + +**State changes:** `market` and `order_book` accounts are written with +the supplied parameters plus all the derived fields +(`market.authority`, the vault pubkeys, `is_active = true`, +`next_order_id = 1`). + +The vaults are regular token accounts, *not* PDAs - their +addresses are chosen by the caller (typically fresh keypairs) and +captured on the market's state so later instruction handlers can +validate them. + +### 3.2 `initialize_market_user` + +**Who calls it:** every user, exactly once per market they want to +trade on. + +**Signers:** `owner`. + +**Accounts in:** + +- `owner` (signer, mut - pays rent) +- `market` (read-only) +- `market_user` (PDA, **init**, seeds `["market_user", market, owner]`) +- `system_program` + +**Token movements:** none. + +**State changes:** new `MarketUser` with all counters zero and no +open orders. + +### 3.3 `place_order` + +**Who calls it:** anyone with a `MarketUser` for this market. + +**Signers:** `owner`. + +**Parameters:** + +```rust +pub fn place_order<'info>( + context: Context<'info, PlaceOrder<'info>>, + side: OrderSide, // Bid | Ask + price: u64, + quantity: u64, +) -> Result<()> +``` + +**Accounts in (named):** + +- `market` (mut, `has_one = fee_vault`) +- `order_book` (mut, PDA seeds-checked) +- `order` (PDA, **init**, seeds + `["order", market, next_order_id.to_le_bytes()]`) +- `market_user` (mut, PDA seeds-checked) +- `base_vault`, `quote_vault`, `fee_vault` (all mut, boxed) +- `user_base_account`, `user_quote_account` (mut - the caller's ATAs) +- `base_mint`, `quote_mint` (read-only) +- `owner` (signer, mut) +- `token_program`, `system_program` + +**Accounts in (remaining):** a list of `AccountInfo`s passed via the +transaction's remaining accounts, grouped in pairs. For each resting +order the caller wants the taker to cross, in the book's price-time +order: + +``` +remaining_accounts[2*i] = maker_order_pda (Order account) +remaining_accounts[2*i + 1] = maker_user_account_pda (MarketUser) +``` + +If the caller doesn't pass any pairs, the order is treated as +pure-maker: whatever part of it is allowed by the book state becomes a +resting order. + +**Checks (top of handler):** + +- `market.is_active` → `MarketPaused` +- `price > 0` → `InvalidPrice` +- `price % tick_size == 0` → `InvalidTickSize` +- `quantity >= min_order_size` → `BelowMinOrderSize` +- `open_orders.len() < 20` (mirror of the max_len on the struct) → + `TooManyOpenOrders` +- `remaining_accounts.len() % 2 == 0` → `MissingMakerAccounts` + +**Checks (per maker pair, during planning):** + +- Maker order's `order_id` exists in the relevant book side → + `MakerAccountMismatch` +- Maker order's `market == market.key()` → `MakerAccountMismatch` +- Maker pair index == the maker's slot position on the book + (i.e. caller walked the book sorted by price) → `MakerAccountMismatch` + +**Checks (per fill, during execution):** + +- Maker order and user account have matching `owner` → + `MakerOwnerMismatch` +- Maker user account's `market == market.key()` → + `MakerAccountMismatch` + +**Checks (before resting remainder):** + +- the taker's side of the book isn't at its 1024-leaf capacity → + `OrderBookFull` +- Integer math throughout: every multiplication uses + `checked_mul`; every addition on balances uses `checked_add`; + every product of two `u64` money values is computed in `u128` + to avoid intermediate overflow and then narrowed back to `u64` + with `try_into` → `NumericalOverflow`. After each per-fill fee + calculation an invariant check enforces `fee_quote <= gross_quote`. + +**Token movements (up front):** + +For a **bid**: +``` + user_quote_account --[price * quantity of quote_mint]--> quote_vault +``` + +For an **ask**: +``` + user_base_account --[quantity of base_mint]--> base_vault +``` + +The full lock happens regardless of whether the order will fully fill +immediately. That keeps the vault invariant simple: the token account +always holds *exactly* what's needed to fulfil every open trading +position plus every unsettled balance. + +**Token movements (during matching, per fill):** see +[§4. The matching engine - step by step](#4-the-matching-engine--step-by-step). +Summary: + +- For a taker bid crossing a resting ask at price `p`: + ``` + quote_vault --[p * fill_qty * fee_bps / 10_000]--> fee_vault + (everything else stays in quote_vault as unsettled_quote for maker) + (base_vault provides the taker's base via unsettled_base - the base + was pre-locked when the maker placed their ask) + ``` + +- For a taker ask crossing a resting bid at price `p`: + ``` + quote_vault --[p * fill_qty * fee_bps / 10_000]--> fee_vault + ``` + +No user's ATA is touched during matching - all movements happen +between vaults or inside `MarketUser` counters. Physical payouts wait +for `settle_funds`. + +**PDAs created:** `order` (always; even fully-crossed takers get an +Order PDA, marked `Filled` immediately, for consistency with +indexers). + +**State changes:** + +On the taker's `MarketUser`: + +- `unsettled_base += sum of fill.fill_quantity` (taker bid side) +- `unsettled_quote += sum of price_improvement_rebate` + (taker bid side, per fill) +- `unsettled_quote += sum of (gross - fee)` (taker ask side) + +On each maker's `Order` (via `Account::try_from` + `exit`): + +- `filled_quantity += fill.fill_quantity` +- `status = PartiallyFilled` or `Filled` + +On each maker's `MarketUser`: + +- `unsettled_quote += gross - fee` (maker was an ask) +- `unsettled_base += fill.fill_quantity` (maker was a bid) +- `open_orders` list: maker's order removed if fully filled + +On `order_book`: + +- `next_order_id += 1` +- Fully-filled makers removed from the relevant side (bids or asks) in + reverse-index order +- Taker's remainder (if any) inserted into the correct side in price + order + +On the caller's new `order`: + +- All fields populated +- `status = Filled` if taker fully matched; otherwise + `PartiallyFilled` (if some fills) or `Open` (if no fills) + +### 3.4 `cancel_order` + +**Who calls it:** the order's owner. + +**Signers:** `owner`. + +**Accounts in:** + +- `market` +- `order_book` (mut) +- `order` (mut, PDA seeds-checked via stored bump) +- `market_user` (mut) +- `owner` (signer) + +**Checks:** + +- `order.owner == owner.key()` → `Unauthorized` +- `order.status ∈ {Open, PartiallyFilled}` → `OrderNotCancellable` +- The order's `order_id` is present in `order_book` → `OrderNotFound` + (sanity - shouldn't normally fire since fully-filled orders aren't + cancellable) + +**Token movements:** none. Cancellation is an accounting-only step. + +**State changes:** + +- For a cancelled bid: `unsettled_quote += price * remaining_quantity` + (the quote the bid had locked in the vault is now owed back to the + owner). +- For a cancelled ask: `unsettled_base += remaining_quantity`. +- Remove from `order_book.bids` or `order_book.asks`. +- Remove from `market_user.open_orders`. +- `order.status = Cancelled`. + +The actual token move happens on the next `settle_funds` call. + +### 3.5 `settle_funds` + +**Who calls it:** any user. No-op when both unsettled counters are +zero, so it is safe to call on a heartbeat/cron. + +**Signers:** `owner`. + +**Accounts in:** + +- `market` (mut) +- `market_user` (mut) +- `base_vault`, `quote_vault` (mut, boxed) +- `user_base_account`, `user_quote_account` (mut, boxed - caller's + ATAs; caller must create them before calling) +- `base_mint`, `quote_mint` (boxed, read-only) +- `owner` (signer) +- `token_program` + +**Checks:** none beyond Anchor's account-validation (ownership, +mint checks on token accounts, PDA seeds). + +**Token movements:** + +``` + base_vault --[market_user.unsettled_base of base_mint]--> user_base_account + quote_vault --[market_user.unsettled_quote of quote_mint]--> user_quote_account +``` + +Both transfers are CPIs to the Token program, signed by the +`Market` PDA using seeds `["market", base_mint, quote_mint, bump]`. + +Order of operations is checks-effects-interactions: the +`unsettled_*` counters are zeroed *before* the transfer CPIs, then +the transfers run. Solana CPIs aren't reentrant in the EVM sense, +but zeroing state first means no future token-program extension or +transfer hook can observe stale unsettled balances mid-CPI and +double-withdraw. + +**State changes:** + +- `market_user.unsettled_base = 0` +- `market_user.unsettled_quote = 0` + +### 3.6 `withdraw_fees` + +**Who calls it:** the market authority (whichever pubkey was set as +`market.authority` at initialisation). + +**Signers:** `authority`. + +**Accounts in:** + +- `market` (mut, `has_one = fee_vault`) +- `fee_vault` (mut, boxed) +- `authority_quote_account` (mut, boxed - destination) +- `quote_mint` (boxed) +- `authority` (signer) +- `token_program` + +**Checks:** + +- `authority.key() == market.authority` → `NotMarketAuthority` +- If `fee_vault.amount == 0`, returns `Ok(())` silently (so this call + is cheap to schedule) + +**Token movements:** + +``` + fee_vault --[fee_vault.balance of quote_mint]--> authority_quote_account +``` + +Signed by the Market PDA. + +**State changes:** none on program state (the vault balance drops to +zero as a side effect of the transfer). + +--- + +## 4. The matching engine - step by step + +This is the heart of the program. Everything in `place_order` after +the initial fund lock is matching-engine work. Follow along with +[`place_order.rs`](programs/order-book/src/instructions/place_order.rs) and +[`state/matching.rs`](programs/order-book/src/state/matching.rs) - it'll +read more easily once you've gone through this section. + +### Ensuring fast order matching performance + +The book must find the best-priced resting order on every `place_order` +call. Storing orders in a plain list (`Vec`) would work at small +scale, but finding the best price requires scanning every entry - in +formal notation that's **O(n)**: double the number of open orders, +double the work. + +A [balanced binary search tree](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree) +keeps both sides of the book sorted at all times, so the best price is +always at the root. Worst-case lookup, insert, and delete are +**O(log₂ n)**: at 1 024 open orders per side that's at most 10 comparisons +instead of 1 024. + +The specific data structure used here is a +[critbit tree](https://cr.yp.to/critbit.html) (short for *critical-bit +tree*) - a compact binary radix trie where each internal node splits on +the first bit where two keys disagree. Unlike a self-balancing BST it +never rotates or recolours nodes; its depth is instead bounded by the +*bit width of the key* rather than the number of orders, so it stays +shallow no matter what order keys arrive in. This implementation is ported from +[Openbook v2](https://github.com/openbook-dex/openbook-v2); +[Phoenix](https://github.com/Ellipsis-Labs/phoenix-v1) uses the same +approach. Both are production Solana CLOBs worth reading alongside this +example. + +### 4.1 The plan + +1. Caller passes `(side, price, quantity)` and, in remaining_accounts, + the maker pairs to cross against. +2. The handler locks the required funds into the vault (done up + front, before any matching - see §3.3). +3. **Plan the fills** (pure logic, no mutations): walk the opposite + side of the book sorted by price (best price first). For each + entry whose price + crosses the taker's limit, record a `Fill { resting_index, + resting_order_id, fill_quantity, fill_price }`. Stop when either + the taker's quantity is exhausted or the next entry fails to + cross. +4. **Apply the fills** (mutate state): for each fill, update the + maker's `Order` (increment `filled_quantity`, flip status), update + the maker's `MarketUser` (credit `unsettled_base` or + `unsettled_quote`), and accumulate deltas for the taker. +5. **Clean the book**: remove fully-filled makers from the relevant + side of `order_book.bids`/`asks`, in reverse-index order. +6. **Pay the fee**: one batched CPI from `quote_vault` to `fee_vault` + for the sum of per-fill fees. +7. **Apply the taker deltas**: single mutation of the taker's + `MarketUser`. +8. **Rest the remainder**: if `taker_remaining > 0`, insert the + new `Order` into the book at the taker's limit price, add its + `order_id` to the taker's `open_orders`, set status to + `PartiallyFilled` (if any fills) or `Open` (if none). + +### 4.2 Why bids spend quote, asks spend base - the full accounting + +Pick a taker **bid** at price `bp` and quantity `bq`, crossing a +resting **ask** at `ap ≤ bp` with remaining quantity `aq`. Let +`fill_qty = min(bq, aq)` and `fill_price = ap` (maker's price wins). + +Per-fill quantities: + +``` +gross = fill_price * fill_qty (quote tokens) +fee = ceil(gross * fee_bps / 10_000) (quote tokens) +net_to_maker = gross - fee (quote tokens) +locked = bp * fill_qty (quote tokens the taker had locked for this fill) +rebate = locked - gross (quote the taker locked but doesn't need to spend) +``` + +Token flows: + +``` + quote_vault --[fee]---------> fee_vault (CPI signed by Market PDA, batched across all fills) + + # No physical transfer for the base and net-quote legs - they stay in the + # vaults, accounted for via unsettled_* counters: + + maker.unsettled_quote += net_to_maker (maker collects gross - fee) + taker.unsettled_base += fill_qty (taker gets the base) + taker.unsettled_quote += rebate (price improvement refund) +``` + +The *base* that the taker now owns was already in `base_vault` - +remember, the maker locked it there when placing the ask. The *quote* +that the maker now owns was already in `quote_vault` - the taker +locked `bp * bq` there at the top of this call. Nothing leaves the +vaults except the fee. Everything else gets paid out later, on +`settle_funds`. + +For the opposite direction - a taker **ask** at `ap` crossing a +resting **bid** at `bp ≥ ap`: + +``` +fill_qty = min(taker_remaining, bp_remaining) +fill_price = bp +gross = bp * fill_qty +fee = ceil(gross * fee_bps / 10_000) +net_to_taker = gross - fee + +Token flows: + quote_vault --[fee]------> fee_vault + + taker.unsettled_quote += net_to_taker + maker.unsettled_base += fill_qty +``` + +No rebate on this side: the maker's bid locked exactly `bp * +bid_original_qty` of quote up front, and of that, `bp * fill_qty` is +being spent right now at exactly that price - no leftover. + +### 4.3 Worked example - taker bid crosses two resting asks + +Start with an empty book. Fees 10 bps (0.1%). Tick size 1. + +1. Maker Dan posts an ask at price 900, quantity 5. `place_order(Ask, + 900, 5)`. Dan's token account loses 5 base; base_vault gains 5 + base. `order_book.asks = [(id=1, price=900)]`. + +2. Maker Erin posts an ask at price 950, quantity 5. Same mechanism. + `base_vault.balance = 10`. `order_book.asks = [(1, 900), (2, 950)]` + (ascending). + +3. Taker Faye places a bid at 1000 for quantity 7. She passes both + makers as remaining_accounts: `(order_1, dan_user), (order_2, + erin_user)`. + + Step A - lock. Faye's quote ATA loses `1000 * 7 = 7000` quote; + `quote_vault.balance += 7000`. + + Step B - plan: + - Fill 0: resting index 0 (Dan's ask), order_id 1, qty = min(7, + 5) = 5, price = 900. `taker_remaining = 7 - 5 = 2`. + - Fill 1: resting index 1 (Erin's ask), order_id 2, qty = min(2, + 5) = 2, price = 950. `taker_remaining = 0`. + + Step C - apply fills: + + For Fill 0 (Dan): + - gross = 900 * 5 = 4500; fee = ceil(4500 * 10 / 10 000) = ceil(4.5) = 5; + net_to_maker = 4495. + - `dan_market_user.unsettled_quote += 4495` + - `faye_market_user.unsettled_base += 5` + - Faye's rebate = 1000*5 − 4500 = 500. + `faye_market_user.unsettled_quote += 500` + - `dan_order.filled_quantity = 5`, status = Filled, + remove from `dan_market_user.open_orders`. + + For Fill 1 (Erin): + - gross = 950 * 2 = 1900; fee = ceil(1.9) = 2; net_to_maker = 1898. + - `erin_market_user.unsettled_quote += 1898` + - `faye_market_user.unsettled_base += 2` + - Faye's rebate = 1000*2 − 1900 = 100. + `faye_market_user.unsettled_quote += 100` + - `erin_order.filled_quantity = 2`, status = PartiallyFilled + (original 5, filled 2), **stays** in `erin_market_user.open_orders`. + + Step D - clean book. Dan's ask was fully filled → leaf removed from + the asks critbit tree. Erin's ask was partially filled → leaf's + `quantity` decremented in place to 3 (no tree rebalancing needed). + The `Order` PDA carries `filled_quantity`; the leaf just holds the + remaining quantity the matching engine needs to plan future fills. + The next taker who wants to hit Erin's ask will pass `order_2` as a + maker and see `leaf.quantity = 3`. + + Step E - pay the fee. `total_fee_quote = 5 + 2 = 7`. One CPI: + ``` + quote_vault --[7 quote]--> fee_vault + ``` + + Step F - apply Faye's deltas. `faye_market_user.unsettled_base = + 0 + 7 = 7`. `faye_market_user.unsettled_quote = 0 + (500 + 100) = + 600`. + + Step G - rest the remainder. `taker_remaining = 0` → Faye's new + Order is marked `Filled` immediately, not added to the book. + +4. Later, each user calls `settle_funds`: + - Dan's settle: `base_vault` loses 0 base; `quote_vault` loses + 4495 quote → Dan's quote ATA gains 4495. + - Erin's settle: 1898 quote to Erin's ATA. + - Faye's settle: 7 base to Faye's base ATA; 600 quote refund to + Faye's quote ATA (unused from her 7000 lock). + +5. At some point the market authority calls `withdraw_fees`: + `fee_vault.balance = 7` → drained to authority's quote ATA. + +**Post-settlement invariant check**: +- `base_vault.balance` should equal sum of remaining ask quantities = + 3 (Erin's remainder). ✓ +- `quote_vault.balance` should equal sum of resting bids = 0. ✓ + +### 4.4 Partial fill with a remainder + +Same scenario, but Faye bids at 920 (not 1000) and quantity 8. + +- Fill 0: index 0 (Dan, 900), qty 5, price 900. Taker remaining 3. +- Attempt Fill 1: index 1 (Erin, 950). Crossing check: incoming bid at + 920, resting ask at 950 → `920 >= 950` is **false**. Matching + stops. + +After applying Fill 0 and the fee, `taker_remaining = 3 > 0`. The +book-capacity check runs (still fine). Faye's new Order is marked +`PartiallyFilled` (filled 5 of 8) and inserted into `order_book.bids` +at price 920. Her `open_orders` list now includes the new order_id. + +Erin's ask was untouched; the book now looks like: + +``` +asks [(2, 950)] ← Erin, original 5 left +bids [(3, 920)] ← Faye, remaining 3 +``` + +### 4.5 Cancel + settle round trip + +Taker Gael places a bid at 910 for quantity 4 on an empty book (no +maker pairs passed). The bid rests. + +- Step A (lock): `910 * 4 = 3640` quote moved from Gael's ATA to + quote_vault. `order_book.bids = [(4, 910)]`. +- Step B–F: no fills, no fee, no maker mutations. +- Step G: `taker_remaining = 4 = quantity` → status `Open`, added + to the book, `gael_market_user.open_orders = [4]`. + +Gael decides to cancel. `cancel_order` on order_id 4: + +- `remaining_quantity(order) = 4 - 0 = 4`. +- `gael_market_user.unsettled_quote += 910 * 4 = 3640`. +- `order_book.bids` cleared. `gael_market_user.open_orders = []`. +- `order.status = Cancelled`. + +No tokens moved - `quote_vault.balance` still holds the 3640. + +Gael calls `settle_funds`: + +- `quote_vault --[3640 quote]--> gael_user_quote_account` +- `gael_market_user.unsettled_quote = 0`. + +Net effect: Gael's balance sheet is exactly where it started; the +program earned nothing (no fill means no fee). + +--- + +## 5. Full-lifecycle worked examples + +Three scenarios with end-to-end numbers. Both mints are 6-decimal SPL +tokens. 1 BASE = 1 000 000 base units; 1 QUOTE = 1 000 000 quote +units. Where a number in the narrative looks like "price 900", read +that as "900 quote units per 1 base unit" (so for a 1-full-BASE trade +you'd move 900 * 1 000 000 quote units). + +Market configuration: +- `fee_basis_points = 50` (0.5%) +- `tick_size = 1` +- `min_order_size = 1` +- `base_vault`, `quote_vault`, `fee_vault` all start empty. + +### 5.1 A clean match: taker bid consumes a resting ask + +Cast: **Maria** (market authority + Alice/Bob's broker), **Alice** +(seller), **Bob** (buyer). + +1. `initialize_market` - Maria runs it. Rent for five accounts comes + out of her wallet. Market is now `is_active`. +2. `initialize_market_user` - Alice and Bob each run it once. +3. Alice posts an ask: `place_order(Ask, 1000, 5)`, no + remaining_accounts (empty book). + - Lock: `alice_base_account --[5 base]--> base_vault`. + - Plan: nothing to cross. + - Rest: new Order PDA with `original_quantity = 5`, status `Open`, + added to `order_book.asks` at index 0. `alice.open_orders = [1]`. +4. Bob posts a bid: `place_order(Bid, 1000, 5)`, with Alice's Order + and MarketUser as remaining_accounts. + - Lock: `bob_quote_account --[5 * 1000 = 5000 quote]--> + quote_vault`. + - Plan: one fill at (resting_index 0, order_id 1, qty 5, price + 1000). + - Apply: + - gross = 5000, fee = 5000 * 50 / 10 000 = 25, net_to_maker = + 4975. + - `alice.unsettled_quote += 4975` + - `bob.unsettled_base += 5` + - Bob's rebate = 0 (he bid at the resting price exactly). + - Alice's Order: filled 5, status Filled. Removed from + `alice.open_orders`. + - Clean book: drop index 0. `order_book.asks = []`. + - Fee CPI: `quote_vault --[25 quote]--> fee_vault`. + - Apply Bob's deltas. + - Rest remainder: `taker_remaining = 0`, so Bob's new Order is + marked Filled immediately, not booked. + +**Balances at this point (in vault land):** +- `base_vault`: 5 base (waiting for Bob's settle). +- `quote_vault`: 4975 quote (waiting for Alice's settle). The other + 25 is now in fee_vault. +- `alice.unsettled_quote = 4975`, `alice.unsettled_base = 0`. +- `bob.unsettled_base = 5`, `bob.unsettled_quote = 0`. + +5. Alice calls `settle_funds`: + ``` + quote_vault --[4975 quote]--> alice_quote_account + ``` + `alice.unsettled_quote = 0`. + +6. Bob calls `settle_funds`: + ``` + base_vault --[5 base]--> bob_base_account + ``` + `bob.unsettled_base = 0`. + +7. Maria calls `withdraw_fees`: + ``` + fee_vault --[25 quote]--> maria_quote_account + ``` + +**Final balance sheet (deltas from start):** +- Alice: −5 base, +4975 quote. +- Bob: +5 base, −5000 quote. +- Maria: +25 quote (minus whatever lamports she spent on rent for + accounts). +- All three vaults empty. + +### 5.2 Partial fill with remainder on the book + +Cast: Alice (ask maker), Bob (bid maker, then remainder rests), Carol +(new taker). + +1. `initialize_market` by Maria (same config). +2. `initialize_market_user` × 3. +3. Alice posts `Ask, 1000, 3`. Locks 3 base. +4. Bob posts `Bid, 1100, 10` with Alice's pair as a maker. + - Lock: `10 * 1100 = 11_000 quote` from Bob to quote_vault. + - Plan one fill: qty = min(10, 3) = 3, price = 1000. + - gross = 3000, fee = 15, net_to_maker = 2985. + - `alice.unsettled_quote += 2985` + - `bob.unsettled_base += 3` + - Rebate: `1100*3 − 3000 = 300` → `bob.unsettled_quote += 300`. + - Alice's order fully filled. + - Clean book: drop Alice's ask. `asks = []`. + - Fee CPI: 15 quote to fee_vault. + - `taker_remaining = 10 − 3 = 7`. Capacity OK. Bob's new Order + marked PartiallyFilled (filled 3 of 10), added to + `order_book.bids` at price 1100. `bob.open_orders = [2]`. + + Book state now: `asks=[], bids=[(2, 1100)]`. `quote_vault` holds + the locked portion for Bob's remainder: + `11000 − (3000 + 300 + 2985) = 4715`? Let's double-check: 2985 is + *inside* quote_vault (alice's unsettled). 300 is *inside* + quote_vault (bob's rebate unsettled). 15 went to fee_vault. 3000 + minus fee = 2985 net_to_maker sits in quote_vault waiting for + Alice's settle. So `quote_vault.balance = 11000 − 15 = 10985`, + composed of: alice.unsettled_quote (2985) + bob.unsettled_quote + (300) + bob's remaining lock for the resting bid (1100 * 7 = + 7700). 2985 + 300 + 7700 = 10 985. ✓ + +5. Alice settles: `quote_vault --[2985]--> alice_quote_account`. + `quote_vault = 10985 − 2985 = 8000` (= 7700 Bob-lock + 300 + Bob-rebate). +6. Carol posts `Ask, 1100, 4` with Bob's Order/MarketUser as a + maker pair. + - Lock: 4 base from Carol to base_vault. + - Plan: fill at (index 0, order_id 2, qty min(4, 7) = 4, price + 1100). + - gross = 4400, fee = 22, net_to_taker = 4378. + - `carol.unsettled_quote += 4378` + - `bob.unsettled_base += 4` (he's the maker-bid; base flows to + the bid side) + - No rebate on ask-taker side. + - Bob's order: filled_quantity 3 → 7, status PartiallyFilled + (still not fully filled - original 10, filled 7). + - Clean book: Bob's book remaining = 10 − 7 = 3 > 0, so his + entry stays. `order_book.bids = [(2, 1100)]`. + - Fee CPI: 22 quote → fee_vault. + - `taker_remaining = 0` → Carol's new Order marked Filled. + + Mid-state: `base_vault = 0 + 4 = 4` (from Carol's lock; was 0 + after Bob's settle made it flow - wait, no: Bob's base never + settled yet. Let's re-check:) + + After step 4 Bob's `unsettled_base = 3` (from the 3-base fill + against Alice). `base_vault.balance = 3 + 0 = 3` (Alice's + original lock after the fill; asks had drained out with the + match). After step 6, Carol added 4 base and 4 went to Bob as + unsettled. So `base_vault.balance = 3 + 4 = 7`. `bob.unsettled_base + = 3 + 4 = 7`. + +### 5.3 Cancel round-trip + +Cast: Alice (bid maker), nobody else. + +1. `initialize_market`, `initialize_market_user(Alice)`. +2. Alice posts `Bid, 900, 10` - rests on an empty book. + - Lock: 9000 quote from Alice to quote_vault. + - No fills. `alice.open_orders = [1]`. `bids = [(1, 900)]`. +3. Alice reconsiders and calls `cancel_order` on her bid. + - `remaining_quantity = 10 − 0 = 10`. + - `alice.unsettled_quote += 900 * 10 = 9000`. + - `bids = []`, `alice.open_orders = []`. + - `order.status = Cancelled`. +4. Alice calls `settle_funds`: + ``` + quote_vault --[9000 quote]--> alice_quote_account + ``` + `alice.unsettled_quote = 0`. + +Net delta: Alice is exactly where she started. The vaults are empty. +The Order account is still onchain in `Cancelled` state (one could +imagine a future instruction handler to reclaim its rent - see §8). + +--- + +## 6. Safety and edge cases + +### 6.1 What the program refuses to do + +From [`errors.rs`](programs/order-book/src/errors.rs): + +- `InvalidPrice`: `place_order` called with `price == 0` +- `OrderNotFound`: `cancel_order` failed to locate the order in the book (sanity path) +- `MarketPaused`: `place_order` on a market with `is_active = false` (no handler flips this today, but the field is there) +- `Unauthorized`: `cancel_order` by someone other than the order owner +- `OrderBookFull`: `place_order` remainder would push the taker's side past 1024 leaves +- `TooManyOpenOrders`: User already has 20 open orders on this market +- `InvalidTickSize`: `tick_size == 0` at init, or `price % tick_size != 0` on place +- `BelowMinOrderSize`: `min_order_size == 0` at init, or `quantity < min_order_size` on place +- `OrderNotCancellable`: `cancel_order` on a Filled or Cancelled order +- `NumericalOverflow`: Any checked arithmetic returned `None` +- `InvalidFeeBasisPoints`: `fee_basis_points > 10_000` at init +- `InvalidFeeVault`: `market.fee_vault` on the struct does not match the passed `fee_vault` (Anchor `has_one`) +- `MakerAccountMismatch`: Wrong number of maker accounts, wrong order, wrong market, or caller walked the book out of order +- `MissingMakerAccounts`: `remaining_accounts.len()` not a multiple of 2 +- `MakerOwnerMismatch`: Maker Order and MarketUser have different owners +- `NotMarketAuthority`: `withdraw_fees` called by wrong signer + +### 6.2 Guarded design choices worth knowing + +- **Full lock on place.** The handler always moves the full locked + amount into the vault before matching. This keeps the + vault-balance invariant simple and makes `cancel_order` / partial + fills straightforward: the vault already has everything it could + owe. + +- **Caller supplies maker pairs.** The matching engine does not + iterate the whole book looking for counterparties - the caller + tells it which resting orders to cross. This is what Openbook v2 + does and it's the only way to fit the matching work within a + transaction's account budget when the book is large. The cost is + that an off-book client needs to read the `OrderBook` account + first, pick the crossings, and pass the right accounts. The + program still enforces order (price-time priority) and ownership + on what the caller passes, so a malicious caller cannot cross a + non-top-of-book maker to hurt someone else - they can only *fail + to cross* orders they should have crossed, which only hurts + themselves. + +- **Matching applies at the maker's price, not the taker's.** The + fill price is always the resting order's price. Takers that cross + deeper into the book get price improvement, refunded to + `unsettled_quote` (for taker bids). This is the standard + order-book rule. + +- **Fees come out of the gross.** The maker receives `gross - fee`, + not `gross`; the fee lives on for a while in `quote_vault` before + being moved to `fee_vault` in one batched CPI at the end of + `place_order`. An alternative model - the taker paying `gross + + fee` on top of the lock - is discussed in a comment in + `place_order.rs` and left as an exercise. + +- **Unsettled balances are pure accounting.** No token physically + moves to or from a user during matching or cancellation. Both + events just bump `unsettled_*` counters. The user collects by + calling `settle_funds`. This means one `place_order` call that + crosses many makers only costs one token CPI (the fee move), not + one-per-fill. Large orders stay within the CU budget. + +- **`settle_funds` no-ops on zero.** Both legs are guarded by `if + base_amount > 0` / `if quote_amount > 0`. Safe to schedule on a + cron or heartbeat. + +- **`withdraw_fees` no-ops on empty.** Likewise. + +- **Boxed InterfaceAccounts.** Several handlers use `Box< + InterfaceAccount<...>>` for mint/token accounts. That's a BPF + stack-size workaround - each `InterfaceAccount` is ~1 KB on the + stack and the Solana VM gives handlers a tight budget. Don't + unbox these without testing the compute output size. + +- **Discriminator + `has_one`.** Every state account carries an 8- + byte discriminator that Anchor checks. `Market` has + `has_one = fee_vault`, so the `place_order` handler can trust the + `fee_vault` account without re-checking its mint or authority. + +- **Book capacity check after matching.** The taker's remainder + check happens at the end. A bid that clears enough asks to free + up 3 slots can then rest its own 1-slot remainder even on a + previously-full book - matching the "liquidity-positive" spirit + of an order book. + +### 6.3 Things this example does *not* do + +A production order book would add: + +- **Rent reclamation on `cancel_order`.** Cancelled `Order` accounts + persist onchain indefinitely; a `close_order` instruction would let + owners reclaim that rent after a cancel. +- **Cancel-on-expiry / GTC vs IOC vs FOK.** All orders here are + implicitly GTC (good 'til cancelled). +- **Post-only / reject-if-cross.** No way to guarantee your order + will be a maker. +- **Self-trade protection.** Nothing stops a single user from + crossing their own resting order. +- **Rent reclamation for closed orders.** `Order` accounts persist + onchain in `Filled` or `Cancelled` state forever; a real program + would either close them in the same handler or provide a + `close_order` to reclaim rent later. +- **Partial taker-funded fees.** The fee comes out of the maker's + gross today (see `place_order.rs` comment). If you want + maker-neutral fees, take an additional transfer from the taker's + ATA at match time. +- **Minimum-tick for quantities.** `min_order_size` is a floor, but + there's no "round lot" constraint. +- **Pause / admin / upgrade.** `is_active` exists but no handler + flips it. +- **Oracle-aware price bands.** A taker bid 10 000× higher than the + best ask will happily sweep the book. + +--- + +## 7. Running the tests + +All tests are LiteSVM Rust integration tests under +[`programs/order-book/tests/test_order_book.rs`](programs/order-book/tests/test_order_book.rs). +They load the built `.so` via +`include_bytes!("../../../target/deploy/order_book.so")`, so a build must +run first. + +### Prerequisites + +- Anchor 1.1.2 +- Solana CLI (`solana -V`) +- Rust stable (pinned at the repo root) + +### Commands + +From `finance/order-book/anchor/`: + +```bash +# 1. Build the .so - target/deploy/order_book.so +anchor build + +# 2. Run the LiteSVM tests +cargo test --manifest-path programs/order-book/Cargo.toml + +# Or equivalently (Anchor.toml scripts.test = "cargo test"): +anchor test --skip-local-validator +``` + +Expected: + +``` +running 23 tests +test authority_can_withdraw_fees_after_match ... ok +test cancel_and_settle_bid_refunds_full_quote ... ok +test cancel_ask_credits_unsettled_base ... ok +test cancel_order_rejects_non_owner ... ok +test initialize_market_user_tracks_market_and_owner ... ok +test fee_vault_receives_exactly_bps_of_taker_gross ... ok +test initialize_market_rejects_oversized_fee ... ok +test initialize_market_rejects_zero_tick_size ... ok +test initialize_market_sets_market_and_order_book ... ok +test place_ask_locks_base_in_vault ... ok +test place_bid_locks_quote_in_vault ... ok +test place_order_rejects_below_min_order_size ... ok +test place_order_rejects_unaligned_tick ... ok +test place_order_rejects_zero_price ... ok +test resting_orders_at_same_price_fill_by_time_priority ... ok +test settle_funds_after_match_pays_out_both_unsettled_balances ... ok +test settle_funds_moves_unsettled_base_to_user ... ok +test taker_ask_fully_crosses_best_bid ... ok +test taker_bid_fully_crosses_best_ask ... ok +test taker_bid_gets_price_improvement_from_resting_ask ... ok +test taker_crosses_multiple_resting_orders_best_price_first ... ok +test taker_partially_filled_remainder_rests_on_book ... ok +test taker_partially_fills_resting_order_rest_stays_on_book ... ok +``` + +### What each test exercises + +**Setup / happy path (pre-matching):** + +- `initialize_market_sets_market_and_order_book`: PDA creation, vault setup, initial field values +- `initialize_market_user_tracks_market_and_owner`: Per-user PDA derivation and zero-initialised counters +- `place_bid_locks_quote_in_vault`: Fund lock on bid +- `place_ask_locks_base_in_vault`: Fund lock on ask +- `settle_funds_moves_unsettled_base_to_user`: Vault → user ATA transfer via market PDA signer + +**Validation:** + +- `place_order_rejects_zero_price`: `price > 0` +- `place_order_rejects_unaligned_tick`: `price % tick_size == 0` +- `place_order_rejects_below_min_order_size`: `quantity >= min_order_size` +- `cancel_order_rejects_non_owner`: Ownership check on cancel +- `initialize_market_rejects_zero_tick_size`: Init constraint +- `initialize_market_rejects_oversized_fee`: `fee_bps <= 10_000` + +**Cancel + settle flow:** + +- `cancel_ask_credits_unsettled_base`: Ask cancel → `unsettled_base += remaining` +- `cancel_and_settle_bid_refunds_full_quote`: Round trip of a Bob-style cancellation + +**Matching engine:** + +- `taker_bid_fully_crosses_best_ask`: Full-fill crossing, fee routed correctly +- `taker_ask_fully_crosses_best_bid`: Symmetric path +- `taker_partially_fills_resting_order_rest_stays_on_book`: Resting order's `filled_quantity` updated, not removed +- `taker_partially_filled_remainder_rests_on_book`: Taker's remainder inserted in correct price order +- `taker_crosses_multiple_resting_orders_best_price_first`: Walks multiple makers in price priority +- `resting_orders_at_same_price_fill_by_time_priority`: Tie-break at same price is first-in-first-out +- `taker_bid_gets_price_improvement_from_resting_ask`: Rebate → `unsettled_quote` +- `fee_vault_receives_exactly_bps_of_taker_gross`: Fee math in a single batched CPI +- `authority_can_withdraw_fees_after_match`: Fee drain after fills, authority-gated +- `settle_funds_after_match_pays_out_both_unsettled_balances`: Both legs paid in one call + +### CI note + +The repo's `.github/workflows/anchor-v1.yml` runs `anchor build` before +`anchor test` for every changed anchor project. That matters here: +the integration tests include the BPF artefact via `include_bytes!`, +so a stale or missing `.so` would break the tests. CI is already +covered. + +--- + +## 8. Extending the program + +Ordered by difficulty. + +### Easy + +- **Close-on-terminal `Order`.** After a `place_order` fully fills a + maker, close its `Order` account in the same handler and refund + rent to the owner. Same for `cancel_order` on an `Open` order. + Saves onchain storage. + +- **IOC flag.** Add `post_only: bool` and `ioc: bool` parameters. + `ioc` means "match what you can and discard the remainder instead + of resting it". `post_only` means "reject the order if it would + cross". Both are one-line checks around the existing matching + logic. + +- **Self-trade guard.** Reject a fill where `maker_order.owner == + owner.key()`. Alternative: auto-cancel the maker side. + +### Moderate + +- **Taker-funded fees.** Pull the fee from the taker's ATA in a + second transfer at match time, instead of netting it out of the + maker's gross. Preserves strict "maker pays nothing" semantics. + +- **Order expiry.** Add `expires_at: i64` to `Order`. In + `place_order`, skip resting entries whose `expires_at` is past; + add a permissionless `sweep_expired` instruction. + +### Why a depth-bounded tree (critbit)? + +**Worst-case depth must be bounded, not assumed.** A plain binary +search tree only keeps a roughly-balanced shape when its inputs arrive +in random order. In an order book an attacker chooses the inputs - the +prices of their orders - so nothing they choose can be allowed to +inflate the tree's depth. Two families of structure defend against +this: *self-balancing* BSTs (red-black, AVL, …) that restore a bounded +height with rotations on every insert and delete, and *radix tries* +like critbit whose depth is capped by the key's bit width no matter +which keys are present. Both keep every operation cheap regardless of +input order; this example uses the second. + +**Concrete attack on a plain BST.** An attacker posts orders at +monotonically increasing prices ($100, $101, $102, $103, …). Each new +price is greater than every previous one, so each new node attaches as +the right child of the previous one. After N such orders the tree has +degenerated into a linked list of length N. Lookups, inserts, and +matches all walk O(N) instead of O(log N). + +**Why this matters on Solana specifically.** Solana transactions have +a ~1.4M compute-unit budget. If `place_order` walks a degenerate book +and exceeds the CU limit mid-match, the transaction aborts and the +placer pays fees for nothing. Worse, *legitimate users' orders fail +because an adversary skewed the tree shape*. A depth-bounded tree keeps +every operation cheap regardless of input, so the attack is +structurally impossible. + +**Why critbit specifically.** Critbit is a binary radix trie keyed on +the order's sort bits - *not* a self-balancing BST, so it never rotates +or recolours nodes. Its shape is a deterministic function of which keys +are present, and its depth can never exceed the *bit width of the sort +key* (128 bits here - price in the high 64, sequence number in the low +64), so it cannot degenerate into a long chain under any insert order. +An insert splits exactly one leaf and adds exactly one inner node; a +delete splices one out. This example uses the critbit slab from +Openbook v2 (`src/state/slab/`). + +### Harder + +- **Event queue.** Mirror Openbook's `EventQueue` - `place_order` + writes "fill" events, and a separate `consume_events` instruction + processes them in batches for the maker side. Makes matching O(1) + in CU cost regardless of the taker's depth. + +- **Market-makers as CPI users.** Formalise the `remaining_accounts` + protocol so a market-making program can call `place_order` on + behalf of its users, pre-computing the crossings offchain and + rewriting the book in one transaction. + +- **Cross-market swaps.** Chain two `place_order` calls (e.g. + base→USDC then USDC→quote2) with an outer helper that routes + through `unsettled_*` balances without a settle in between. + +--- + +## Code layout + +``` +finance/order-book/anchor/ +├── Anchor.toml +├── Cargo.toml +├── README.md (this file) +└── programs/order-book/ + ├── Cargo.toml + ├── src/ + │ ├── errors.rs + │ ├── lib.rs #[program] entry points + │ ├── instructions/ + │ │ ├── mod.rs + │ │ ├── initialize_market.rs + │ │ ├── initialize_market_user.rs + │ │ ├── place_order.rs (matching engine lives here) + │ │ ├── cancel_order.rs + │ │ ├── settle_funds.rs + │ │ └── withdraw_fees.rs + │ └── state/ + │ ├── mod.rs + │ ├── market.rs + │ ├── order.rs + │ ├── order_book.rs (critbit wrappers, allocation, apply_fill) + │ ├── market_user.rs + │ ├── matching.rs (pure fill-planning logic) + │ └── slab/ (critbit tree, ported from Openbook v2) + │ ├── mod.rs + │ ├── nodes.rs + │ ├── ordertree.rs + │ └── iterator.rs + └── tests/ + └── test_order_book.rs LiteSVM tests +``` + +## FAQ + +### How does an order book exchange work on Solana? + +Traders post limit orders with `place_order`: bids to buy and asks to sell, each at a named price. The program matches crossing orders in price-time priority, holds all funds in program-owned vaults, and pays out matched balances when a trader calls `settle_funds`. This is the same central limit order book (CLOB) design used by NYSE and by Solana venues like Phoenix and OpenBook. + +### How can order matching be fast enough onchain? + +Each side of the book is a critbit tree, so finding the best price takes O(log n) comparisons instead of a full scan; at 1024 resting orders that is at most 10 steps. The implementation is ported from [Openbook v2](https://github.com/openbook-dex/openbook-v2), a production Solana CLOB. + +### Why are matching and settlement separate steps? + +A taker crossing many makers would otherwise pay for a token transfer CPI per maker. Instead, fills only update the `unsettled_base` and `unsettled_quote` counters, and one later `settle_funds` call moves the tokens. Cancelling with `cancel_order` works the same way: it credits the counters, and the tokens move at settlement. + +### How does the exchange operator earn fees? + +Every fill charges the taker a fee in basis points, batched into a fee vault during `place_order`. The market authority sweeps it with `withdraw_fees`. diff --git a/finance/order-book/anchor-v1/programs/order-book/Cargo.toml b/finance/order-book/anchor-v1/programs/order-book/Cargo.toml new file mode 100644 index 000000000..e2aabd9aa --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "order_book" +version = "0.1.0" +description = "Order book example (CLOB) on Solana" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "order_book" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" +# Used by the ported Openbook slab - `bytemuck::Pod` / `Zeroable` on every node +# variant + `min_const_generics` so `[AnyNode; 1024]` can derive Pod without +# hitting bytemuck's default-32 array cap. `static_assertions` keeps the slab +# layout asserts (node size, alignment) compile-time, matching upstream. +bytemuck = { version = "1.18", features = ["derive", "min_const_generics"] } +static_assertions = "1.1" + +[dev-dependencies] +# Match the test stack used by finance/escrow and the other LiteSVM-based +# Anchor examples so contributors can move between them without version drift. +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/order-book/anchor-v1/programs/order-book/src/errors.rs b/finance/order-book/anchor-v1/programs/order-book/src/errors.rs new file mode 100644 index 000000000..b3738c775 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/errors.rs @@ -0,0 +1,73 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum ErrorCode { + #[msg("Invalid price provided")] + InvalidPrice, + + #[msg("Order not found")] + OrderNotFound, + + #[msg("Market is currently paused")] + MarketPaused, + + #[msg("Unauthorized action")] + Unauthorized, + + #[msg("Order book is full")] + OrderBookFull, + + #[msg("MarketUser has too many open orders")] + TooManyOpenOrders, + + #[msg("Price does not align with tick size")] + InvalidTickSize, + + #[msg("Base lot size must be greater than zero")] + InvalidBaseLotSize, + + #[msg("Quote lot size must be greater than zero")] + InvalidQuoteLotSize, + + #[msg("Quantity is below minimum order size")] + BelowMinOrderSize, + + #[msg("Order is not cancellable in current status")] + OrderNotCancellable, + + #[msg("Numerical overflow occurred")] + NumericalOverflow, + + #[msg("Fee basis points out of range")] + InvalidFeeBasisPoints, + + #[msg("Fee vault does not match the market's fee vault")] + InvalidFeeVault, + + #[msg("Base vault does not match the market's base vault")] + InvalidBaseVault, + + #[msg("Quote vault does not match the market's quote vault")] + InvalidQuoteVault, + + #[msg("Base mint does not match the market's base mint")] + InvalidBaseMint, + + #[msg("Quote mint does not match the market's quote mint")] + InvalidQuoteMint, + + #[msg("Maker account provided does not correspond to a resting order on the book")] + MakerAccountMismatch, + + #[msg("Not enough maker accounts supplied to cross the incoming order")] + MissingMakerAccounts, + + #[msg("Maker order and maker MarketUser owner mismatch")] + MakerOwnerMismatch, + + #[msg("Only the market authority can withdraw fees")] + NotMarketAuthority, + + #[msg("Order book account does not match the market's order book")] + InvalidOrderBook, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/mod.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/mod.rs new file mode 100644 index 000000000..ef5bf86ce --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/mod.rs @@ -0,0 +1,3 @@ +pub mod withdraw_fees; + +pub use withdraw_fees::*; diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/withdraw_fees.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/withdraw_fees.rs new file mode 100644 index 000000000..2afc31834 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/admin/withdraw_fees.rs @@ -0,0 +1,77 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::ErrorCode; +use crate::state::{Market, MARKET_SEED}; + +/// Drain the market's accumulated taker fees into the authority's token +/// account. Authority-only - arbitrary callers must not be able to siphon +/// the fee vault. Transfers the current balance of the fee vault in full; +/// a partial-withdraw flavour could take an amount parameter, left out here +/// to keep the example focused. +pub fn handle_withdraw_fees(context: Context) -> Result<()> { + let market = &context.accounts.market; + + require!( + context.accounts.authority.key() == market.authority, + ErrorCode::NotMarketAuthority + ); + + let fee_balance = context.accounts.fee_vault.amount; + if fee_balance == 0 { + // Nothing to do - exit quietly rather than failing, so this + // instruction is safe to call on a cron/heartbeat even when there + // haven't been any fills since the last run. + return Ok(()); + } + + let market_bump = [market.bump]; + let signer_seeds: [&[u8]; 4] = [ + MARKET_SEED, + market.base_mint.as_ref(), + market.quote_mint.as_ref(), + &market_bump, + ]; + let signer_seeds = &[&signer_seeds[..]]; + + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.fee_vault.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.authority_quote_account.to_account_info(), + authority: market.to_account_info(), + }, + signer_seeds, + ), + fee_balance, + context.accounts.quote_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct WithdrawFeesAccountConstraints<'info> { + #[account( + mut, + has_one = fee_vault @ ErrorCode::InvalidFeeVault, + )] + pub market: Account<'info, Market>, + + // Boxed to keep the struct under the BPF stack limit (see PlaceOrderAccountConstraints). + #[account(mut)] + pub fee_vault: Box>, + + #[account(mut)] + pub authority_quote_account: Box>, + + pub quote_mint: Box>, + + pub authority: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/cancel_order.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/cancel_order.rs new file mode 100644 index 000000000..e03064d12 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/cancel_order.rs @@ -0,0 +1,98 @@ +use anchor_lang::prelude::*; + +use crate::errors::ErrorCode; +use crate::state::{ + remaining_quantity, remove_open_order, Market, Order, OrderBook, OrderSide, OrderStatus, + MarketUser, ORDER_SEED, MARKET_USER_SEED, +}; + +pub fn handle_cancel_order(context: Context) -> Result<()> { + let order = &mut context.accounts.order; + + require!( + order.owner == context.accounts.owner.key(), + ErrorCode::Unauthorized + ); + + require!( + order.status == OrderStatus::Open || order.status == OrderStatus::PartiallyFilled, + ErrorCode::OrderNotCancellable + ); + + // Funds the order had locked in the vault are now owed back to the + // owner. Credit the appropriate unsettled balance; settle_funds moves + // those funds from the vault to the owner's token account. + let remaining = remaining_quantity(order); + if remaining > 0 { + let market_user = &mut context.accounts.market_user; + match order.side { + OrderSide::Bid => { + // u128 intermediates mirror the bid-lock formula in place_order: + // raw_quote = price × remaining × quote_lot_size + let quote_amount: u64 = (order.price as u128) + .checked_mul(remaining as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(context.accounts.market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + market_user.unsettled_quote = market_user + .unsettled_quote + .checked_add(quote_amount) + .ok_or(ErrorCode::NumericalOverflow)?; + } + OrderSide::Ask => { + let base_amount: u64 = (remaining as u128) + .checked_mul(context.accounts.market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + market_user.unsettled_base = market_user + .unsettled_base + .checked_add(base_amount) + .ok_or(ErrorCode::NumericalOverflow)?; + } + } + } + + // Remove the leaf from the slab. The current cancel API doesn't tell us + // which side the order is on without reading the Order PDA - which we + // already have, so use it. + let mut order_book = context.accounts.order_book.load_mut()?; + let removed = order_book.remove_from(order.side, order.order_id).is_some(); + require!(removed, ErrorCode::OrderNotFound); + drop(order_book); + + let market_user = &mut context.accounts.market_user; + remove_open_order(market_user, order.order_id); + + order.status = OrderStatus::Cancelled; + + Ok(()) +} + +#[derive(Accounts)] +pub struct CancelOrderAccountConstraints<'info> { + #[account(has_one = order_book @ ErrorCode::InvalidOrderBook)] + pub market: Account<'info, Market>, + + // Not a PDA (see initialize_market.rs); bound to `market` via has_one. + #[account(mut)] + pub order_book: AccountLoader<'info, OrderBook>, + + #[account( + mut, + seeds = [ORDER_SEED, market.key().as_ref(), order.order_id.to_le_bytes().as_ref()], + bump = order.bump + )] + pub order: Account<'info, Order>, + + #[account( + mut, + seeds = [MARKET_USER_SEED, market.key().as_ref(), owner.key().as_ref()], + bump = market_user.bump + )] + pub market_user: Account<'info, MarketUser>, + + pub owner: Signer<'info>, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market.rs new file mode 100644 index 000000000..0361fc696 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market.rs @@ -0,0 +1,124 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +use crate::errors::ErrorCode; +use crate::state::{Market, OrderBook, MARKET_SEED}; + +// Basis points are hundredths of a percent; 10000 bps == 100%. Fees above 100% +// would be nonsensical, so we cap here. +const MAX_FEE_BASIS_POINTS: u16 = 10_000; + +pub fn handle_initialize_market( + context: Context, + fee_basis_points: u16, + tick_size: u64, + base_lot_size: u64, + quote_lot_size: u64, + min_order_size: u64, +) -> Result<()> { + require!(tick_size > 0, ErrorCode::InvalidTickSize); + require!(base_lot_size > 0, ErrorCode::InvalidBaseLotSize); + require!(quote_lot_size > 0, ErrorCode::InvalidQuoteLotSize); + require!(min_order_size > 0, ErrorCode::BelowMinOrderSize); + require!( + fee_basis_points <= MAX_FEE_BASIS_POINTS, + ErrorCode::InvalidFeeBasisPoints + ); + + let market = &mut context.accounts.market; + market.authority = context.accounts.authority.key(); + market.base_mint = context.accounts.base_mint.key(); + market.quote_mint = context.accounts.quote_mint.key(); + market.base_vault = context.accounts.base_vault.key(); + market.quote_vault = context.accounts.quote_vault.key(); + market.fee_vault = context.accounts.fee_vault.key(); + market.order_book = context.accounts.order_book.key(); + market.fee_basis_points = fee_basis_points; + market.tick_size = tick_size; + market.base_lot_size = base_lot_size; + market.quote_lot_size = quote_lot_size; + market.min_order_size = min_order_size; + market.is_active = true; + market.bump = context.bumps.market; + + // Zero-copy account: initialize the slab in place. `load_init` is the + // first-write path - every subsequent handler uses `load` / `load_mut`. + // The order book is not a PDA (see the comment on the `order_book` + // account below), so `bump` is unused and stored as 0. + let mut order_book = context.accounts.order_book.load_init()?; + order_book.initialize(context.accounts.market.key(), 0); + + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializeMarketAccountConstraints<'info> { + #[account( + init, + payer = authority, + space = Market::DISCRIMINATOR.len() + Market::INIT_SPACE, + seeds = [MARKET_SEED, base_mint.key().as_ref(), quote_mint.key().as_ref()], + bump + )] + pub market: Account<'info, Market>, + + // The order book is a zero-copy account (~180 KB: two 1024-slot critbit + // slabs back to back). Solana's BPF runtime caps inner-CPI account + // allocations at 10 KB, so we can't use Anchor's `init` here - the + // client must call system_program::create_account directly before this + // instruction, sizing the account to ORDER_BOOK_ACCOUNT_SIZE, owned by + // this program, and zero-initialized. + // + // `#[account(zero)]` verifies the account is owned by this program + // and has its discriminator unset, which is exactly what a freshly + // create_account-d account looks like. The handler then stamps the + // discriminator + struct via `load_init()`. + // + // This is not a PDA. create_account requires the new account to sign + // its own creation, and a PDA has no private key to sign with, so the + // client must generate a real keypair for it. The program ties this + // account to its market via `has_one = order_book` on `market`, not via + // seeds. + #[account(zero)] + pub order_book: AccountLoader<'info, OrderBook>, + + pub base_mint: InterfaceAccount<'info, Mint>, + + pub quote_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = authority, + token::mint = base_mint, + token::authority = market, + token::token_program = token_program + )] + pub base_vault: InterfaceAccount<'info, TokenAccount>, + + #[account( + init, + payer = authority, + token::mint = quote_mint, + token::authority = market, + token::token_program = token_program + )] + pub quote_vault: InterfaceAccount<'info, TokenAccount>, + + // Taker fees accumulate here (quote mint). Separate from quote_vault so + // maker-owed balances and market-earned fees can't be confused. + #[account( + init, + payer = authority, + token::mint = quote_mint, + token::authority = market, + token::token_program = token_program + )] + pub fee_vault: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market_user.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market_user.rs new file mode 100644 index 000000000..25b885c37 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/initialize_market_user.rs @@ -0,0 +1,34 @@ +use anchor_lang::prelude::*; + +use crate::state::{Market, MarketUser, MARKET_USER_SEED}; + +pub fn handle_initialize_market_user(context: Context) -> Result<()> { + let market_user = &mut context.accounts.market_user; + market_user.market = context.accounts.market.key(); + market_user.owner = context.accounts.owner.key(); + market_user.unsettled_base = 0; + market_user.unsettled_quote = 0; + market_user.open_orders = Vec::new(); + market_user.bump = context.bumps.market_user; + + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializeMarketUserAccountConstraints<'info> { + #[account( + init, + payer = owner, + space = MarketUser::DISCRIMINATOR.len() + MarketUser::INIT_SPACE, + seeds = [MARKET_USER_SEED, market.key().as_ref(), owner.key().as_ref()], + bump + )] + pub market_user: Account<'info, MarketUser>, + + pub market: Account<'info, Market>, + + #[account(mut)] + pub owner: Signer<'info>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/mod.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/mod.rs new file mode 100644 index 000000000..1ed385342 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/mod.rs @@ -0,0 +1,13 @@ +pub mod admin; +pub mod cancel_order; +pub mod initialize_market_user; +pub mod initialize_market; +pub mod place_order; +pub mod settle_funds; + +pub use admin::*; +pub use cancel_order::*; +pub use initialize_market_user::*; +pub use initialize_market::*; +pub use place_order::*; +pub use settle_funds::*; diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/place_order.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/place_order.rs new file mode 100644 index 000000000..a00ccfbfa --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/place_order.rs @@ -0,0 +1,511 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::ErrorCode; +use crate::state::{ + add_open_order, plan_fills, remove_open_order, Market, Order, OrderBook, OrderSide, + OrderStatus, MarketUser, MARKET_SEED, ORDER_SEED, MARKET_USER_SEED, +}; + +// Mirror of MarketUser.open_orders max_len. Kept as a constant so the +// PlaceOrderAccountConstraints check reads clearly and the limit is documented in one place. +const MAX_OPEN_ORDERS_PER_USER: usize = 20; + +// Basis-points denominator. 10_000 bps == 100% - the universal rate convention +// on every major exchange (NYSE, CME, Binance, Coinbase, ...). +const BASIS_POINTS_DENOMINATOR: u128 = 10_000; + +// Remaining accounts are passed in groups of 2 per resting order we intend +// to cross: [maker_order, maker_market_user]. We keep it at 2 (instead of +// also threading the maker's ATAs) because fills land in the maker's +// unsettled_* balance - the maker drains them later via settle_funds. This +// mirrors how Openbook v2 works and keeps the per-fill account footprint +// small. +const ACCOUNTS_PER_MAKER: usize = 2; + +pub fn handle_place_order<'info>( + context: Context<'info, PlaceOrderAccountConstraints<'info>>, + side: OrderSide, + price: u64, + quantity: u64, +) -> Result<()> { + let market = &context.accounts.market; + + require!(market.is_active, ErrorCode::MarketPaused); + require!(price > 0, ErrorCode::InvalidPrice); + require!(price % market.tick_size == 0, ErrorCode::InvalidTickSize); + require!( + quantity >= market.min_order_size, + ErrorCode::BelowMinOrderSize + ); + + require!( + context.accounts.market_user.open_orders.len() < MAX_OPEN_ORDERS_PER_USER, + ErrorCode::TooManyOpenOrders + ); + + // Lock up the funds the order would need if filled. Bids lock quote + // (price * quantity); asks lock base (quantity). This always happens - + // matching consumes from the locked pot (already in the vault), and any + // unmatched remainder rests as a maker order with its lock still in place. + // + // The bid lock multiplies two u64s. A plain `u64::checked_mul` would + // refuse anything that overflows u64 (~1.8e19) - which is a perfectly + // legal lock once you scale by token decimals (e.g. 18-decimal quote + // mint * mid-cap price * mid-cap quantity). Promote to u128 for the + // multiplication, then narrow back to u64 with try_into so the failure + // mode is "can't fit the onchain transfer" not "silently rejected at + // the math step". + let (source_account, mint_account_info, decimals, transfer_amount, destination_vault) = + match side { + OrderSide::Bid => ( + context.accounts.user_quote_account.to_account_info(), + context.accounts.quote_mint.to_account_info(), + context.accounts.quote_mint.decimals, + (price as u128) + .checked_mul(quantity as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?, + context.accounts.quote_vault.to_account_info(), + ), + OrderSide::Ask => ( + context.accounts.user_base_account.to_account_info(), + context.accounts.base_mint.to_account_info(), + context.accounts.base_mint.decimals, + (quantity as u128) + .checked_mul(market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?, + context.accounts.base_vault.to_account_info(), + ), + }; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: source_account, + mint: mint_account_info, + to: destination_vault, + authority: context.accounts.owner.to_account_info(), + }, + ), + transfer_amount, + decimals, + )?; + + // --------------------------------------------------------------- + // Matching plan + // --------------------------------------------------------------- + // + // Caller passes pairs of `(maker_order, maker_market_user)` in the + // transaction's remaining_accounts, in the same price-time-priority + // order the book would walk. We plan fills against the resting tree, + // then verify the caller's account list matches the plan, then apply. + let maker_accounts = &context.remaining_accounts; + require!( + maker_accounts.len() % ACCOUNTS_PER_MAKER == 0, + ErrorCode::MissingMakerAccounts + ); + + let order_book_loader = &context.accounts.order_book; + + // Plan in an immutable load scope, copy the fills out, then drop the + // borrow before we re-borrow for mutations. AccountLoader::load() is a + // RefCell-based runtime borrow, so the loaded ref must not outlive the + // plan we copy out of it. + let (fills, taker_remaining) = { + let order_book = order_book_loader.load()?; + plan_fills(&order_book, side, price, quantity) + }; + + require!( + maker_accounts.len() >= fills.len() * ACCOUNTS_PER_MAKER, + ErrorCode::MissingMakerAccounts + ); + + // Sanity-check the caller-supplied maker account list against the plan. + // Each fill's maker_order_id must match the order_id stored on the + // corresponding `Order` PDA, and that PDA's `market` must match this + // market. + for (fill_index, fill) in fills.iter().enumerate() { + let maker_order_info = &maker_accounts[fill_index * ACCOUNTS_PER_MAKER]; + let maker_order = Account::::try_from(maker_order_info)?; + require!( + maker_order.order_id == fill.maker_order_id, + ErrorCode::MakerAccountMismatch + ); + require!( + maker_order.market == market.key(), + ErrorCode::MakerAccountMismatch + ); + } + + // --------------------------------------------------------------- + // Apply fills + // --------------------------------------------------------------- + + let taker_market_user = &mut context.accounts.market_user; + let mut taker_base_received: u64 = 0; + let mut taker_quote_rebate: u64 = 0; + let mut taker_quote_received: u64 = 0; + // Aggregate the per-fill fee into a single transfer at the end - + // halves CU cost vs one CPI per fill. + let mut total_fee_quote: u64 = 0; + + for (fill_index, fill) in fills.iter().enumerate() { + let maker_order_info = &maker_accounts[fill_index * ACCOUNTS_PER_MAKER]; + let maker_user_info = &maker_accounts[fill_index * ACCOUNTS_PER_MAKER + 1]; + + let mut maker_order = Account::::try_from(maker_order_info)?; + let mut maker_market_user = Account::::try_from(maker_user_info)?; + + require!( + maker_order.owner == maker_market_user.owner, + ErrorCode::MakerOwnerMismatch + ); + require!( + maker_market_user.market == market.key(), + ErrorCode::MakerAccountMismatch + ); + + // Fee model (simple, maker-funded, no extra taker deposit): + // + // gross = fill_price * fill_quantity (quote tokens per fill) + // fee = gross * fee_bps / 10_000 (rounded up) + // maker gets gross - fee, + // fee_vault gets fee, + // taker pays 'gross' net (out of their pre-locked quote). + // + // Strictly "makers pay nothing" would require the taker to bring + // (gross + fee) which means pulling more from the taker's ATA on + // every fill - a per-fill CPI that inflates CU cost and account + // lists. Real CLOBs (Openbook v2, Phoenix) use a similar + // deduct-from-gross pattern for simplicity; the fee can be thought + // of as the maker pricing their ask a fraction higher to cover it. + // fill_price * fill_quantity in u128 to avoid u64-overflow on big + // fills (high-decimal mints scale this product fast). Narrow back + // to u64 with try_into so the transfer/balance step gets a real + // u64 and the failure mode is explicit. + let gross_quote: u64 = (fill.fill_price as u128) + .checked_mul(fill.fill_quantity as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + + // Ceiling division: round the fee in the protocol's favour. Flooring + // would leak up to 1 minor unit of quote per fill to the maker, which + // an attacker could industrialise with many tiny fills. + let fee_quote: u64 = (gross_quote as u128) + .checked_mul(market.fee_basis_points as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_add(BASIS_POINTS_DENOMINATOR - 1) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_div(BASIS_POINTS_DENOMINATOR) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + + // Defensive invariant: fees are a fraction of gross, never more. + // `fee_basis_points <= 10_000` is enforced at market init, so this + // should be unreachable - but a stale assumption here would let a + // misconfigured market overdraw the maker's net payout. Cheap check. + require!(fee_quote <= gross_quote, ErrorCode::NumericalOverflow); + + match side { + // Taker Bid, resting Ask. Taker pays quote, gets base. + OrderSide::Bid => { + let net_quote_to_maker = gross_quote + .checked_sub(fee_quote) + .ok_or(ErrorCode::NumericalOverflow)?; + maker_market_user.unsettled_quote = maker_market_user + .unsettled_quote + .checked_add(net_quote_to_maker) + .ok_or(ErrorCode::NumericalOverflow)?; + + let base_from_fill: u64 = (fill.fill_quantity as u128) + .checked_mul(market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + taker_base_received = taker_base_received + .checked_add(base_from_fill) + .ok_or(ErrorCode::NumericalOverflow)?; + + // Price improvement: taker locked (price * quantity) but + // only needs (fill_price * fill_quantity) for this fill. + // u128 intermediate for the same reason as the bid lock + // and gross_quote above - the original lock is already + // bounded to u64, so this product narrows back cleanly. + let locked_for_this_fill: u64 = (price as u128) + .checked_mul(fill.fill_quantity as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_mul(market.quote_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + let rebate: u64 = locked_for_this_fill + .checked_sub(gross_quote) + .ok_or(ErrorCode::NumericalOverflow)?; + taker_quote_rebate = taker_quote_rebate + .checked_add(rebate) + .ok_or(ErrorCode::NumericalOverflow)?; + } + // Taker Ask, resting Bid. Taker gives base, gets quote. + OrderSide::Ask => { + let base_from_fill: u64 = (fill.fill_quantity as u128) + .checked_mul(market.base_lot_size as u128) + .ok_or(ErrorCode::NumericalOverflow)? + .try_into() + .map_err(|_| error!(ErrorCode::NumericalOverflow))?; + maker_market_user.unsettled_base = maker_market_user + .unsettled_base + .checked_add(base_from_fill) + .ok_or(ErrorCode::NumericalOverflow)?; + + let net_quote_to_taker = gross_quote + .checked_sub(fee_quote) + .ok_or(ErrorCode::NumericalOverflow)?; + taker_quote_received = taker_quote_received + .checked_add(net_quote_to_taker) + .ok_or(ErrorCode::NumericalOverflow)?; + } + } + + total_fee_quote = total_fee_quote + .checked_add(fee_quote) + .ok_or(ErrorCode::NumericalOverflow)?; + + // Update the maker Order: bump filled_quantity, flip status. + maker_order.filled_quantity = maker_order + .filled_quantity + .checked_add(fill.fill_quantity) + .ok_or(ErrorCode::NumericalOverflow)?; + + let maker_fully_filled = + maker_order.filled_quantity >= maker_order.original_quantity; + maker_order.status = if maker_fully_filled { + OrderStatus::Filled + } else { + OrderStatus::PartiallyFilled + }; + if maker_fully_filled { + remove_open_order(&mut maker_market_user, maker_order.order_id); + } + + maker_order.exit(context.program_id)?; + maker_market_user.exit(context.program_id)?; + } + + // --------------------------------------------------------------- + // Apply book-side updates from the planned fills (decrement remaining + // qty / remove fully-filled leaves), then insert any taker remainder. + // --------------------------------------------------------------- + let maker_side = match side { + OrderSide::Bid => OrderSide::Ask, + OrderSide::Ask => OrderSide::Bid, + }; + + { + let mut order_book = order_book_loader.load_mut()?; + for fill in &fills { + order_book.apply_fill_to_maker( + maker_side, + fill.maker_order_id, + fill.fill_price, + fill.fill_quantity, + )?; + } + } + + // Move accumulated fee from quote_vault → fee_vault (one CPI signed + // by the market PDA). + if total_fee_quote > 0 { + let market_bump = [market.bump]; + let signer_seeds: [&[u8]; 4] = [ + MARKET_SEED, + market.base_mint.as_ref(), + market.quote_mint.as_ref(), + &market_bump, + ]; + let signer_seeds = &[&signer_seeds[..]]; + + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.quote_vault.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.fee_vault.to_account_info(), + authority: market.to_account_info(), + }, + signer_seeds, + ), + total_fee_quote, + context.accounts.quote_mint.decimals, + )?; + } + + // Apply taker accounting deltas in a single mutation. + taker_market_user.unsettled_base = taker_market_user + .unsettled_base + .checked_add(taker_base_received) + .ok_or(ErrorCode::NumericalOverflow)?; + taker_market_user.unsettled_quote = taker_market_user + .unsettled_quote + .checked_add(taker_quote_rebate) + .ok_or(ErrorCode::NumericalOverflow)? + .checked_add(taker_quote_received) + .ok_or(ErrorCode::NumericalOverflow)?; + + // --------------------------------------------------------------- + // Stamp the taker's Order PDA. Either Filled (no remainder) or rested. + // + // The seq_num we baked into the order_id (via `next_order_id` at the + // top of the planning section) is what the slab uses as the time- + // priority tie-break. We allocate it inside the load_mut scope below + // so the counter and the leaf insert happen against the same view of + // the book. + // --------------------------------------------------------------- + let timestamp = Clock::get()?.unix_timestamp; + let order_id = { + let mut order_book = order_book_loader.load_mut()?; + let id = order_book.allocate_order_id()?; + if taker_remaining > 0 { + require!( + !order_book.is_side_full(side), + ErrorCode::OrderBookFull + ); + order_book.place_resting( + side, + price, + taker_remaining, + context.accounts.owner.key(), + id, + timestamp, + )?; + } + id + }; + + let order = &mut context.accounts.order; + order.market = market.key(); + order.owner = context.accounts.owner.key(); + order.order_id = order_id; + order.side = side; + order.price = price; + order.original_quantity = quantity; + // checked_sub, not saturating_sub: a silent clamp on filled_quantity + // would be a real correctness bug (the matching engine should never + // hand us a remainder larger than the original). saturating_* belongs + // on cosmetic/UX paths, not on a field the matching engine relies on. + order.filled_quantity = quantity + .checked_sub(taker_remaining) + .ok_or(ErrorCode::NumericalOverflow)?; + order.timestamp = timestamp; + order.bump = context.bumps.order; + + if taker_remaining == 0 { + order.status = OrderStatus::Filled; + } else { + order.status = if taker_remaining < quantity { + OrderStatus::PartiallyFilled + } else { + OrderStatus::Open + }; + add_open_order(taker_market_user, order_id); + } + + Ok(()) +} + +#[derive(Accounts)] +#[instruction(side: OrderSide, price: u64, quantity: u64)] +pub struct PlaceOrderAccountConstraints<'info> { + // `has_one` ties every market-owned account on this struct to the + // addresses recorded on the Market PDA. Crucially, without + // has_one on base_vault / quote_vault / base_mint / quote_mint a caller + // could swap fee_vault in for quote_vault (same mint, same authority) + // and steer the per-fill fee transfer to drain real fees instead of + // routing them in. + #[account( + mut, + has_one = fee_vault @ ErrorCode::InvalidFeeVault, + has_one = base_vault @ ErrorCode::InvalidBaseVault, + has_one = quote_vault @ ErrorCode::InvalidQuoteVault, + has_one = base_mint @ ErrorCode::InvalidBaseMint, + has_one = quote_mint @ ErrorCode::InvalidQuoteMint, + has_one = order_book @ ErrorCode::InvalidOrderBook, + )] + pub market: Account<'info, Market>, + + // Zero-copy: AccountLoader streams the slab in/out without paying + // borsh (de)serialization on every instruction. See order_book.rs for + // the layout. Not a PDA - the client created it directly via + // system_program::create_account (see initialize_market.rs for why); + // `has_one = order_book` on `market` is what ties this specific account + // to this specific market. + #[account(mut)] + pub order_book: AccountLoader<'info, OrderBook>, + + // The order PDA seed uses the book's `next_order_id` *before* this + // instruction increments it - i.e. the id this new order will receive. + // Read via `load()` so Anchor can derive the PDA at verification time. + #[account( + init, + payer = owner, + space = Order::DISCRIMINATOR.len() + Order::INIT_SPACE, + seeds = [ + ORDER_SEED, + market.key().as_ref(), + order_book.load()?.next_order_id.to_le_bytes().as_ref() + ], + bump + )] + pub order: Account<'info, Order>, + + #[account( + mut, + seeds = [MARKET_USER_SEED, market.key().as_ref(), owner.key().as_ref()], + bump = market_user.bump + )] + pub market_user: Account<'info, MarketUser>, + + // InterfaceAccount on the stack is ~1 KB each; with 7 of them this struct + // blows the 4 KB stack-offset limit on BPF. Boxing moves each to the heap. + #[account(mut)] + pub base_vault: Box>, + + #[account(mut)] + pub quote_vault: Box>, + + // Taker fees are routed here. Constrained via `has_one = fee_vault` on + // `market` above so the program can trust it without re-checking. + #[account(mut)] + pub fee_vault: Box>, + + #[account(mut)] + pub user_base_account: Box>, + + #[account(mut)] + pub user_quote_account: Box>, + + pub base_mint: Box>, + + pub quote_mint: Box>, + + #[account(mut)] + pub owner: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/instructions/settle_funds.rs b/finance/order-book/anchor-v1/programs/order-book/src/instructions/settle_funds.rs new file mode 100644 index 000000000..4a9f53ad0 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/instructions/settle_funds.rs @@ -0,0 +1,118 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::errors::ErrorCode; +use crate::state::{Market, MarketUser, MARKET_SEED, MARKET_USER_SEED}; + +pub fn handle_settle_funds(context: Context) -> Result<()> { + let market_user = &mut context.accounts.market_user; + let market = &context.accounts.market; + + // Snapshot the amounts the user is owed, then zero the counters + // BEFORE the token transfers. Checks-effects-interactions: even though + // Solana CPIs don't reenter in the EVM sense, if either transfer ever + // gained a path that called back into this program (custom token + // hooks, transfer-fee extensions with side effects, ...), having stale + // unsettled_* values readable mid-transfer would let a re-entry double- + // withdraw. Updating state first makes that class of bug impossible. + let base_amount = market_user.unsettled_base; + let quote_amount = market_user.unsettled_quote; + market_user.unsettled_base = 0; + market_user.unsettled_quote = 0; + + // Seeds to sign as the market PDA (the authority of both vaults). Built + // once and reused for the two possible transfers. + let market_bump = [market.bump]; + let signer_seeds: [&[u8]; 4] = [ + MARKET_SEED, + market.base_mint.as_ref(), + market.quote_mint.as_ref(), + &market_bump, + ]; + let signer_seeds = &[&signer_seeds[..]]; + + if base_amount > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.base_vault.to_account_info(), + mint: context.accounts.base_mint.to_account_info(), + to: context.accounts.user_base_account.to_account_info(), + authority: market.to_account_info(), + }, + signer_seeds, + ), + base_amount, + context.accounts.base_mint.decimals, + )?; + } + + if quote_amount > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.quote_vault.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.user_quote_account.to_account_info(), + authority: market.to_account_info(), + }, + signer_seeds, + ), + quote_amount, + context.accounts.quote_mint.decimals, + )?; + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct SettleFundsAccountConstraints<'info> { + // `has_one` constraints bind these vaults/mints to the addresses stored + // on the Market PDA at initialise_market time. Without them a caller + // could substitute the fee_vault (same mint + same authority as + // quote_vault) for `quote_vault` and drain accumulated taker fees, + // since transfer_checked only verifies mint + authority on the source + // account, not its identity. + #[account( + mut, + has_one = base_vault @ ErrorCode::InvalidBaseVault, + has_one = quote_vault @ ErrorCode::InvalidQuoteVault, + has_one = base_mint @ ErrorCode::InvalidBaseMint, + has_one = quote_mint @ ErrorCode::InvalidQuoteMint, + )] + pub market: Account<'info, Market>, + + #[account( + mut, + seeds = [MARKET_USER_SEED, market.key().as_ref(), owner.key().as_ref()], + bump = market_user.bump + )] + pub market_user: Account<'info, MarketUser>, + + // Boxed for the same reason as in PlaceOrderAccountConstraints - + // InterfaceAccount is too large to keep on the BPF stack in bulk. + #[account(mut)] + pub base_vault: Box>, + + #[account(mut)] + pub quote_vault: Box>, + + #[account(mut)] + pub user_base_account: Box>, + + #[account(mut)] + pub user_quote_account: Box>, + + pub base_mint: Box>, + + pub quote_mint: Box>, + + pub owner: Signer<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/lib.rs b/finance/order-book/anchor-v1/programs/order-book/src/lib.rs new file mode 100644 index 000000000..edb913309 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/lib.rs @@ -0,0 +1,80 @@ +use anchor_lang::prelude::*; + +pub mod errors; +pub mod instructions; +pub mod state; + +use instructions::*; + +declare_id!("C69UJ8irfmHq5ysyLek7FKApHR86FBeupiz4JnoyPzzx"); + +#[program] +pub mod order_book { + use super::*; + + /// Create a new market for a (base, quote) pair. Deploys the market PDA, + /// the order book PDA, and the two PDA-authority vaults that hold locked + /// funds while orders are open. + pub fn initialize_market( + context: Context, + fee_basis_points: u16, + tick_size: u64, + base_lot_size: u64, + quote_lot_size: u64, + min_order_size: u64, + ) -> Result<()> { + instructions::initialize_market::handle_initialize_market( + context, + fee_basis_points, + tick_size, + base_lot_size, + quote_lot_size, + min_order_size, + ) + } + + /// Create a per-user, per-market account that tracks a user's open orders + /// and unsettled balances. + pub fn initialize_market_user(context: Context) -> Result<()> { + instructions::initialize_market_user::handle_initialize_market_user(context) + } + + /// Place a bid or ask. Locks the required funds (quote for bids, base + /// for asks) into the market vault, crosses against the opposing side + /// of the book using price-time priority (best price first, earliest + /// timestamp at a tie), credits fills to maker/taker `unsettled_*` + /// balances, routes the taker fee to the fee vault, and rests any + /// unmatched remainder on the book at the caller's limit price. + /// + /// Callers supply resting orders to cross against as + /// `remaining_accounts`, in pairs of + /// `(maker_order_pda, maker_user_account_pda)`, ordered by the + /// book's price-time priority (i.e. best ask first for a taker bid). + pub fn place_order<'info>( + context: Context<'info, PlaceOrderAccountConstraints<'info>>, + side: state::OrderSide, + price: u64, + quantity: u64, + ) -> Result<()> { + instructions::place_order::handle_place_order(context, side, price, quantity) + } + + /// Cancel an open (or partially filled) order. Credits the remaining + /// locked amount back to the owner's unsettled balance; the actual token + /// transfer happens on settle_funds. + pub fn cancel_order(context: Context) -> Result<()> { + instructions::cancel_order::handle_cancel_order(context) + } + + /// Move accumulated unsettled balances out of the market vault and into + /// the user's token accounts. No-op if both balances are zero. + pub fn settle_funds(context: Context) -> Result<()> { + instructions::settle_funds::handle_settle_funds(context) + } + + /// Drain the fee vault into the market authority's token account. + /// Authority-gated - only the market's stored `authority` may call this. + pub fn withdraw_fees(context: Context) -> Result<()> { + instructions::withdraw_fees::handle_withdraw_fees(context) + } +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/market.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/market.rs new file mode 100644 index 000000000..f8db55790 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/market.rs @@ -0,0 +1,68 @@ +use anchor_lang::prelude::*; + +pub const MARKET_SEED: &[u8] = b"market"; + +// A Market is one trading pair (base/quote) with its own vaults and order book. +// The market PDA itself is the authority of the token vaults, so funds can only +// move out via program-signed CPIs (place/cancel/settle). +#[derive(InitSpace)] +#[account] +pub struct Market { + pub authority: Pubkey, + + pub base_mint: Pubkey, + + pub quote_mint: Pubkey, + + pub base_vault: Pubkey, + + pub quote_vault: Pubkey, + + // Dedicated token account (quote mint) that accumulates taker fees. + // Kept separate from `quote_vault` so user-owed balances and + // market-earned fees cannot be confused. The market PDA signs transfers + // out of it, so only program instruction handlers (notably `withdraw_fees`) + // can drain it. + pub fee_vault: Pubkey, + + pub order_book: Pubkey, + + pub fee_basis_points: u16, + + pub tick_size: u64, + + // Two-lot model (mirrors Serum/Openbook): both sides of the book are + // denominated in their respective lots rather than raw token units. + // This makes `price` and `quantity` human-readable regardless of the + // individual mints' decimal counts. + // + // raw_base = quantity × base_lot_size + // raw_quote = quantity × price × quote_lot_size + // + // Choose: + // base_lot_size = 10^max(d_base − d_quote, 0) + // quote_lot_size = 10^max(d_quote − d_base, 0) + // + // so that exactly one of the two is > 1 (or both are 1 when d_base == d_quote). + // With those values `price` equals the human-readable quote/base rate and + // `tick_size = 1` is a single atomic increment. + // + // Examples: + // NVDAx (8 dec) / USDC (6 dec): base_lot_size=100, quote_lot_size=1 + // price=130, qty=1 lot → 130 × 1 × 1 = 130 raw USDC per 100 raw NVDAx + // = $130.00 per NVDAx share ✓ + // + // WBTC (8 dec) / HD-USDC (18 dec): base_lot_size=1, quote_lot_size=10^10 + // price=60_000, qty=1 satoshi-lot → 60_000 × 1 × 10^10 = 6×10^14 raw HD-USDC + // = $60,000 per BTC ✓ + pub base_lot_size: u64, + + // Raw quote-token units per quote lot. See base_lot_size comment above. + pub quote_lot_size: u64, + + pub min_order_size: u64, + + pub is_active: bool, + + pub bump: u8, +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/market_user.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/market_user.rs new file mode 100644 index 000000000..14d80ac9b --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/market_user.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; + +pub const MARKET_USER_SEED: &[u8] = b"market_user"; + +// Per-user, per-market account. Tracks open order ids and amounts owed back +// to the user (unsettled_*). Settlement moves those amounts from the vaults +// to the user's token accounts in settle_funds. +#[derive(InitSpace)] +#[account] +pub struct MarketUser { + pub market: Pubkey, + + pub owner: Pubkey, + + pub unsettled_base: u64, + + pub unsettled_quote: u64, + + // 20 is chosen to match the matching engine's upper bound: a single user + // shouldn't be able to spam the book. Keep the cap in sync with the + // TooManyOpenOrders check in place_order. + #[max_len(20)] + pub open_orders: Vec, + + pub bump: u8, +} + +pub fn add_open_order(account: &mut MarketUser, order_id: u64) { + if !account.open_orders.contains(&order_id) { + account.open_orders.push(order_id); + } +} + +pub fn remove_open_order(account: &mut MarketUser, order_id: u64) { + if let Some(position) = account.open_orders.iter().position(|&id| id == order_id) { + account.open_orders.remove(position); + } +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/matching.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/matching.rs new file mode 100644 index 000000000..11b32e998 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/matching.rs @@ -0,0 +1,95 @@ +//! Matching engine helpers. Pure logic (no CPIs) that walks the resting side +//! of the book in price-time priority and produces a list of fills the +//! caller should apply. +//! +//! Walking the tree returns leaves in best-price-first order (asks +//! ascending, bids descending), and within a single price level the leaf +//! key's seq_num half preserves time priority, so a straight `next()` walk +//! is the right traversal for matching. Stop as soon as either the taker is +//! exhausted or the next leaf no longer crosses the taker's limit price. + +use crate::state::slab::OrderTreeIter; +use crate::state::{OrderBook, OrderSide}; + +/// One matched fill between the incoming taker order and a resting maker +/// order. `place_order` turns these into token movements and account +/// mutations. +/// +/// Deliberately does NOT carry the slab handle of the maker leaf: removing +/// any leaf rebalances the tree, which invalidates other handles in the +/// same plan. We look the leaf up by its tree key (built from price + +/// order_id) at apply time instead. +pub struct Fill { + /// order_id of the resting order being filled. Used both to sanity- + /// check the maker `Order` PDA the caller passed in remaining_accounts, + /// and to reconstruct the tree key for the apply-time lookup. + pub maker_order_id: u64, + + /// Quantity filled (in base tokens). + pub fill_quantity: u64, + + /// Price at which the fill clears. Always the resting (maker) order's + /// price - standard order-book rule: maker's posted price wins; the taker + /// gets price improvement vs their limit on bids, and a higher payout + /// vs their limit on asks. Also the high 64 bits of the tree key when + /// we look the leaf up again at apply time. + pub fill_price: u64, +} + +/// Walk the opposite side of the book and produce the list of fills that +/// should occur for the incoming taker order. Does not mutate the book. +/// +/// Returns `(fills, taker_remaining)` - `taker_remaining` is what's left +/// over after crossing, to be rested on the book at the taker's limit price. +pub fn plan_fills( + order_book: &OrderBook, + incoming_side: OrderSide, + incoming_price: u64, + incoming_quantity: u64, +) -> (Vec, u64) { + // Resting side is the opposite of the taker's side. + let (root, nodes) = match incoming_side { + OrderSide::Bid => (&order_book.asks_root, &order_book.asks), + OrderSide::Ask => (&order_book.bids_root, &order_book.bids), + }; + + let mut fills: Vec = Vec::new(); + let mut taker_remaining = incoming_quantity; + + for (_handle, leaf) in OrderTreeIter::new(nodes, root) { + if taker_remaining == 0 { + break; + } + + // Crossing condition: bid takes when its limit is >= the resting + // ask's price; ask takes when its limit is <= the resting bid's + // price. The tree walk is in best-price-first order on the resting + // side, so the first leaf that fails to cross means every + // subsequent leaf also fails - break, don't continue. + let resting_price = leaf.price(); + let crosses = match incoming_side { + OrderSide::Bid => incoming_price >= resting_price, + OrderSide::Ask => incoming_price <= resting_price, + }; + if !crosses { + break; + } + + if leaf.quantity == 0 { + // Defensive: fully-filled leaves are removed, but if one ever + // slips through with zero quantity, skip it rather than emit a + // zero-size fill. + continue; + } + + let fill_quantity = taker_remaining.min(leaf.quantity); + fills.push(Fill { + maker_order_id: leaf.order_id, + fill_quantity, + fill_price: resting_price, + }); + taker_remaining = taker_remaining.saturating_sub(fill_quantity); + } + + (fills, taker_remaining) +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/mod.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/mod.rs new file mode 100644 index 000000000..b1c058ee8 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/mod.rs @@ -0,0 +1,12 @@ +pub mod market; +pub mod matching; +pub mod order; +pub mod order_book; +pub mod slab; +pub mod market_user; + +pub use market::*; +pub use matching::*; +pub use order::*; +pub use order_book::*; +pub use market_user::*; diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/order.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/order.rs new file mode 100644 index 000000000..24e4d264e --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/order.rs @@ -0,0 +1,45 @@ +use anchor_lang::prelude::*; + +pub const ORDER_SEED: &[u8] = b"order"; + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq, InitSpace)] +pub enum OrderSide { + Bid, + Ask, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq, InitSpace)] +pub enum OrderStatus { + Open, + PartiallyFilled, + Filled, + Cancelled, +} + +#[derive(InitSpace)] +#[account] +pub struct Order { + pub market: Pubkey, + + pub owner: Pubkey, + + pub order_id: u64, + + pub side: OrderSide, + + pub price: u64, + + pub original_quantity: u64, + + pub filled_quantity: u64, + + pub status: OrderStatus, + + pub timestamp: i64, + + pub bump: u8, +} + +pub fn remaining_quantity(order: &Order) -> u64 { + order.original_quantity.saturating_sub(order.filled_quantity) +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/order_book.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/order_book.rs new file mode 100644 index 000000000..1786d5ac5 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/order_book.rs @@ -0,0 +1,258 @@ +use anchor_lang::prelude::*; + +use crate::errors::ErrorCode; +use crate::state::slab::{ + new_node_key, AnyNode, LeafNode, OrderTreeIter, OrderTreeNodes, OrderTreeRoot, OrderTreeType, + MAX_TREE_NODES, NODE_SIZE, +}; +use crate::state::OrderSide; + +pub const ORDER_BOOK_SEED: &[u8] = b"order_book"; + +/// Per-side capacity. 1024 leaves is enough for any realistic depth a single +/// market quotes; at 88 bytes per node that's ~90 KB per side, so the whole +/// OrderBook account fits in ~180 KB - well under Solana's per-account ceiling +/// and well within the rent budget a market authority is happy to fund once. +pub const MAX_ORDERS_PER_SIDE: usize = MAX_TREE_NODES; + +/// Combined order book: two critbit trees plus a shared monotonic seq_num +/// counter that gives every order a unique tie-break and acts as the public +/// `order_id`. +/// +/// Stored as one `AccountLoader` (zero-copy). The account is far +/// larger than Anchor's borsh `Account` would happily deserialize on every +/// instruction - zero-copy gives us per-field memory access without paying +/// the (de)serialization cost. +#[account(zero_copy(unsafe))] +#[repr(C)] +pub struct OrderBook { + /// Market PDA this book belongs to. Constrained onchain via the + /// `market` `has_one = order_book` (and vice-versa) bindings. + pub market: Pubkey, + + /// Tree roots for the two sides. Kept on this struct (rather than inside + /// the OrderTreeNodes blobs) so each side's `leaf_count` is cheap to read + /// without iterating. + pub bids_root: OrderTreeRoot, + pub asks_root: OrderTreeRoot, + + /// Monotonic order id. Incremented on every successful place_order, used + /// both as the public `order_id` and as the seq_num tie-break baked into + /// each leaf's tree key. + pub next_order_id: u64, + + pub bump: u8, + pub _padding: [u8; 7], + + /// The two slabs. Layout-wise they're back-to-back so the whole struct + /// is one contiguous zero-copy region. + pub bids: OrderTreeNodes, + pub asks: OrderTreeNodes, +} + +// Sanity check: catch any accidental layout drift if someone adds a field +// without recomputing space. Account discriminator + struct itself. +pub const ORDER_BOOK_ACCOUNT_SIZE: usize = 8 + std::mem::size_of::(); + +// Compile-time check: the struct shouldn't quietly balloon past its expected +// ~180 KB if anyone adds fields. 32 (market) + 8 (bids_root) + 8 (asks_root) +// + 8 (next_order_id) + 1 (bump) + 7 (pad) + 2 * (12 + 88*1024) +// = 64 + 2 * 90124 = 180312 bytes for the struct itself. +const _: () = { + assert!(std::mem::size_of::() == 32 + 8 + 8 + 8 + 1 + 7 + 2 * (1 + 3 + 4 + 4 + 4 + NODE_SIZE * MAX_TREE_NODES)); +}; + +/// A compact view of one resting order for the matching engine. Returned +/// from the tree iterator so callers don't have to hand-roll slab access. +pub struct RestingOrderView { + pub order_id: u64, + pub price: u64, + pub quantity: u64, + pub owner: Pubkey, +} + +impl OrderBook { + /// First-time initialization. Sets the market binding, the order-id + /// counter, and stamps each slab with its side tag so the iterator knows + /// which way to walk. + pub fn initialize(&mut self, market: Pubkey, bump: u8) { + self.market = market; + self.bids_root = OrderTreeRoot::default(); + self.asks_root = OrderTreeRoot::default(); + // Order ids start at 1 so 0 can stand for "no order" in clients. + self.next_order_id = 1; + self.bump = bump; + self._padding = [0; 7]; + + // Slab regions arrive zeroed (Anchor zero_copy guarantees that on + // first init). We only need to write the side tag - every other + // field already reads as "empty" (bump_index=0, free_list_len=0, + // free_list_head=0, all node slots Uninitialized). + self.bids.order_tree_type = OrderTreeType::Bids as u8; + self.asks.order_tree_type = OrderTreeType::Asks as u8; + } + + /// Allocate the next order id and roll the counter. Returns the id the + /// caller should stamp into the new Order PDA. + pub fn allocate_order_id(&mut self) -> Result { + let id = self.next_order_id; + self.next_order_id = self + .next_order_id + .checked_add(1) + .ok_or_else(|| error!(ErrorCode::NumericalOverflow))?; + Ok(id) + } + + /// Insert a resting order at `price` on `side`. The seq_num baked into + /// the leaf's tree key gives price-time priority: at any single price, + /// earlier orders sort before later ones when the iterator walks the + /// tree. + pub fn place_resting( + &mut self, + side: OrderSide, + price: u64, + quantity: u64, + owner: Pubkey, + order_id: u64, + timestamp: i64, + ) -> Result<()> { + let key = new_node_key(side, price, order_id); + let leaf = LeafNode::new(key, owner, quantity, order_id, timestamp); + let (root, nodes) = match side { + OrderSide::Bid => (&mut self.bids_root, &mut self.bids), + OrderSide::Ask => (&mut self.asks_root, &mut self.asks), + }; + nodes.insert_leaf(root, &leaf)?; + Ok(()) + } + + /// Remove a resting order by `order_id`. Returns `true` if it was found + /// and removed on either side. + pub fn remove(&mut self, order_id: u64) -> bool { + // We don't know which side the order is on without scanning, so try + // both. Each side does a linear scan over its node arena to find the + // full key (price is not known at cancellation time), then removes + // by key - see `remove_from`. + if self.remove_from(OrderSide::Bid, order_id).is_some() { + return true; + } + if self.remove_from(OrderSide::Ask, order_id).is_some() { + return true; + } + false + } + + /// Remove a resting order from a specific side. Returns the removed leaf + /// if found, so callers can read its quantity/owner without re-fetching + /// the Order account. + pub fn remove_from(&mut self, side: OrderSide, order_id: u64) -> Option { + // Tree keys embed price in the high 64 bits - we don't have the price + // at cancellation time, so we can't reconstruct the exact key without + // scanning. Linear scan to find the full key, then remove by key. + let (root, nodes) = match side { + OrderSide::Bid => (&mut self.bids_root, &mut self.bids), + OrderSide::Ask => (&mut self.asks_root, &mut self.asks), + }; + + // Linear scan to find the full key (price + seq_num) for this + // order_id. Cheap relative to a CPI - and only happens at + // cancellation, not in the hot matching path. + let mut found_key: Option = None; + for (_, leaf) in OrderTreeIter::new(nodes, root) { + if leaf.order_id == order_id { + found_key = Some(leaf.key); + break; + } + } + let key = found_key?; + nodes.remove_by_key(root, key) + } + + /// Resting-order view of the best (best-priced) leaf on `side`, if any. + pub fn best(&self, side: OrderSide) -> Option { + let (root, nodes) = match side { + OrderSide::Bid => (&self.bids_root, &self.bids), + OrderSide::Ask => (&self.asks_root, &self.asks), + }; + let (_handle, leaf) = nodes.best_leaf(root)?; + Some(RestingOrderView { + order_id: leaf.order_id, + price: leaf.price(), + quantity: leaf.quantity, + owner: leaf.owner, + }) + } + + /// Number of resting orders on a side. O(1). + pub fn count(&self, side: OrderSide) -> u32 { + match side { + OrderSide::Bid => self.bids_root.leaf_count, + OrderSide::Ask => self.asks_root.leaf_count, + } + } + + /// Decrease the remaining quantity on a resting leaf, or remove it if the + /// fill consumes everything. Used by the matching engine to apply fills + /// against the maker side of the book without reinserting leaves. + /// + /// Leaves are looked up by (price, order_id) instead of a cached slab + /// handle because removing any leaf rebalances the tree - every other + /// handle in the same plan would be stale after the first removal. + /// (price, order_id) reconstructs the exact tree key the leaf was + /// inserted with, so the tree walk lands on the right slot every time. + pub fn apply_fill_to_maker( + &mut self, + maker_side: OrderSide, + maker_order_id: u64, + fill_price: u64, + fill_quantity: u64, + ) -> Result<()> { + let key = new_node_key(maker_side, fill_price, maker_order_id); + let (root, nodes) = match maker_side { + OrderSide::Bid => (&mut self.bids_root, &mut self.bids), + OrderSide::Ask => (&mut self.asks_root, &mut self.asks), + }; + + // Look up the leaf to read its remaining quantity. We need to know + // whether to mutate-in-place (partial fill) or remove (full fill). + let (handle, remaining_after) = { + let (handle, leaf) = nodes + .find_by_key(root, key) + .ok_or_else(|| error!(ErrorCode::OrderNotFound))?; + let remaining = leaf + .quantity + .checked_sub(fill_quantity) + .ok_or_else(|| error!(ErrorCode::NumericalOverflow))?; + (handle, remaining) + }; + if remaining_after == 0 { + nodes.remove_by_key(root, key); + } else { + // Partial: mutate the leaf's quantity in place. The slab slot + // index does not change here, so no tree rebalancing occurs and + // the other leaves' slot positions in the slab stay valid. + let leaf = nodes + .node_mut(handle) + .and_then(AnyNode::as_leaf_mut) + .ok_or_else(|| error!(ErrorCode::OrderNotFound))?; + leaf.quantity = remaining_after; + } + Ok(()) + } + + pub fn is_side_full(&self, side: OrderSide) -> bool { + match side { + OrderSide::Bid => self.bids.is_full(), + OrderSide::Ask => self.asks.is_full(), + } + } +} + +impl Default for OrderTreeRoot { + fn default() -> Self { + Self { + maybe_node: 0, + leaf_count: 0, + } + } +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/slab/LICENSE-OPENBOOK b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/LICENSE-OPENBOOK new file mode 100644 index 000000000..c1b4c8818 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/LICENSE-OPENBOOK @@ -0,0 +1,26 @@ +The slab and order-tree code in this directory is adapted from +openbook-dex/openbook-v2 (https://github.com/openbook-dex/openbook-v2), +specifically the files under programs/openbook-v2/src/state/orderbook/. +Those upstream files are licensed under the MIT License reproduced below. + +MIT License + +Copyright (c) 2023 GluonicLedger Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/slab/iterator.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/iterator.rs new file mode 100644 index 000000000..1fcfa7338 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/iterator.rs @@ -0,0 +1,88 @@ +// Adapted from openbook-dex/openbook-v2 (commit f3e17421e675b083b584867594bf3cf4f675d156), +// MIT-licensed. See LICENSE-OPENBOOK in this directory. +// +// This iterator yields (handle, leaf) pairs in best-price-first order. +// Matching uses pure price-time priority - no oracle peg or time-in-force +// filtering needed here. + +use super::nodes::{InnerNode, LeafNode, NodeHandle, NodeRef}; +use super::ordertree::{OrderTreeNodes, OrderTreeRoot, OrderTreeType}; + +/// In-order walk of one side of the book. +/// +/// Visits leaves in best-price-first order: +/// - asks: ascending (lowest price first) +/// - bids: descending (highest price first) +/// +/// Within a single price level, earlier orders come first (price-time +/// priority) - that ordering is encoded in the leaf key, so it falls out of +/// the in-order walk automatically. +pub struct OrderTreeIter<'a> { + nodes: &'a OrderTreeNodes, + + /// Inner nodes whose "right" branch (in walk direction) we still owe a + /// visit to. + stack: Vec<&'a InnerNode>, + + /// Cached next leaf so `peek` and `next` can share work. + next_leaf: Option<(NodeHandle, &'a LeafNode)>, + + /// Child indexes to walk: (first, second). For asks we go (0, 1) - i.e. + /// down the left child first, then right; for bids we go (1, 0). + first: usize, + second: usize, +} + +impl<'a> OrderTreeIter<'a> { + pub fn new(nodes: &'a OrderTreeNodes, root: &OrderTreeRoot) -> Self { + let (first, second) = if nodes.order_tree_type() == OrderTreeType::Bids { + (1, 0) + } else { + (0, 1) + }; + let mut iter = Self { + nodes, + stack: vec![], + next_leaf: None, + first, + second, + }; + if let Some(handle) = root.node() { + iter.next_leaf = iter.walk_to_first_leaf(handle); + } + iter + } + + pub fn peek(&self) -> Option<(NodeHandle, &'a LeafNode)> { + self.next_leaf + } + + fn walk_to_first_leaf(&mut self, start: NodeHandle) -> Option<(NodeHandle, &'a LeafNode)> { + let mut current = start; + loop { + match self.nodes.node(current)?.case()? { + NodeRef::Inner(inner) => { + self.stack.push(inner); + current = inner.children[self.first]; + } + NodeRef::Leaf(leaf) => return Some((current, leaf)), + } + } + } +} + +impl<'a> Iterator for OrderTreeIter<'a> { + type Item = (NodeHandle, &'a LeafNode); + + fn next(&mut self) -> Option { + let current = self.next_leaf?; + self.next_leaf = match self.stack.pop() { + None => None, + Some(inner) => { + let start = inner.children[self.second]; + self.walk_to_first_leaf(start) + } + }; + Some(current) + } +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/slab/mod.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/mod.rs new file mode 100644 index 000000000..285ab292f --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/mod.rs @@ -0,0 +1,18 @@ +// Slab + order-tree port of openbook-dex/openbook-v2 (commit +// f3e17421e675b083b584867594bf3cf4f675d156), MIT-licensed. See +// LICENSE-OPENBOOK in this directory. +// +// Public surface is intentionally small: the OrderBook wrapper in +// `state/order_book.rs` calls insert/best/remove/iter; nothing else in the +// program needs to know the tree exists. + +pub mod iterator; +pub mod nodes; +pub mod ordertree; + +pub use iterator::OrderTreeIter; +pub use nodes::{ + new_node_key, price_from_key, AnyNode, InnerNode, LeafNode, NodeHandle, NodeRef, NodeTag, + NODE_SIZE, +}; +pub use ordertree::{OrderTreeNodes, OrderTreeRoot, OrderTreeType, MAX_TREE_NODES}; diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/slab/nodes.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/nodes.rs new file mode 100644 index 000000000..2067f6eed --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/nodes.rs @@ -0,0 +1,337 @@ +// Adapted from openbook-dex/openbook-v2 (commit f3e17421e675b083b584867594bf3cf4f675d156), +// MIT-licensed. See LICENSE-OPENBOOK in this directory. +// +// This port covers fixed-price-only orders (no oracle-pegged prices, no +// time-in-force / expiry). Order identity lives in the onchain `Order` PDA +// rather than inline fields. The slab/tree mechanics (NodeTag, +// InnerNode/LeafNode/FreeNode, AnyNode, walk_down, new_node_key) are +// preserved as-is so future contributors can diff against upstream cleanly. + +use std::mem::{align_of, size_of}; + +use anchor_lang::prelude::*; +use bytemuck::{cast_mut, cast_ref}; +use static_assertions::const_assert_eq; + +use crate::state::OrderSide; + +/// Index into `OrderTreeNodes::nodes`. u32 is plenty for 1024 slots; the type +/// is kept wide to match upstream so the layout stays compatible. +pub type NodeHandle = u32; + +/// Every node - Inner, Leaf, Free - is padded to the same 88 bytes so the +/// underlying `[AnyNode; N]` array is a true slab: we can swap a Leaf for an +/// Inner in place without reallocating. Matches the upstream Openbook layout. +pub const NODE_SIZE: usize = 88; + +/// Tag stored in the first byte of every slab slot. +/// +/// `Uninitialized` (the zero value) is what fresh account memory looks like +/// before any insert, so a freshly-zeroed slab is automatically empty. +#[repr(u8)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum NodeTag { + Uninitialized = 0, + InnerNode = 1, + LeafNode = 2, + FreeNode = 3, + LastFreeNode = 4, +} + +impl NodeTag { + pub fn from_u8(tag: u8) -> Option { + match tag { + 0 => Some(NodeTag::Uninitialized), + 1 => Some(NodeTag::InnerNode), + 2 => Some(NodeTag::LeafNode), + 3 => Some(NodeTag::FreeNode), + 4 => Some(NodeTag::LastFreeNode), + _ => None, + } + } +} + +/// Build the 128-bit tree key for a new leaf. +/// +/// Layout: `[price_data : u64][seq_num_bits : u64]`. +/// +/// For asks the seq_num is stored as-is, so earlier (smaller) seq_num sorts +/// before a later one at the same price → time priority is preserved when +/// walking the tree ascending. +/// +/// For bids we invert the seq_num so that *earlier* still sorts first when +/// the tree is walked descending. (Reading bids in descending order means +/// largest key first; inverting seq_num makes the earlier order's seq_num +/// the larger one at any given price.) +pub fn new_node_key(side: OrderSide, price_data: u64, seq_num: u64) -> u128 { + let seq_num = if side == OrderSide::Bid { !seq_num } else { seq_num }; + ((price_data as u128) << 64) | (seq_num as u128) +} + +/// Extract the price half of a tree key. Same shape on both sides because the +/// price is stored in the high 64 bits unmodified. +#[inline(always)] +pub fn price_from_key(key: u128) -> u64 { + (key >> 64) as u64 +} + +/// One internal tree node. Two children (referenced by slab handle), a key +/// holding the shared prefix bits, and `prefix_len` telling consumers how many +/// of the high bits of `key` are meaningful. +/// +/// `tag` is the first byte at offset 0 - same offset as on `LeafNode` and +/// `FreeNode` - so `AnyNode::tag` reads the variant tag from a fixed offset +/// regardless of which variant is in the slot. +/// +/// `repr(C, packed(8))` caps field alignment at 8 bytes. Without this, u128 +/// (which has 16-byte alignment on x86_64) would force the struct to align +/// to 16, mismatching `AnyNode`'s 8-byte alignment and tripping both the +/// `align_of` const-asserts and bytemuck's `Pod` derive. Capping at 8 is +/// safe: every field is still naturally 8-aligned within the struct, so +/// references and reads work normally. +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C, packed(8))] +pub struct InnerNode { + /// `NodeTag::InnerNode` + pub tag: u8, + pub padding: [u8; 3], + + /// Number of high `key` bits that all descendants share. + pub prefix_len: u32, + + /// Only the top `prefix_len` bits of `key` are meaningful - the rest is + /// whichever leaf happened to be inserted first below this node. + pub key: u128, + + /// Slab handles for the left (`children[0]`) and right (`children[1]`) + /// subtree. Left = 0 critbit, right = 1 critbit. + pub children: [NodeHandle; 2], + + /// Pads to NODE_SIZE so InnerNode / LeafNode / FreeNode are + /// interchangeable in the slab. 88 - 1 - 3 - 4 - 16 - 8 = 56. + pub reserved: [u8; 56], +} +const_assert_eq!(size_of::(), NODE_SIZE); +const_assert_eq!(size_of::() % 8, 0); + +impl InnerNode { + pub fn new(prefix_len: u32, key: u128) -> Self { + Self { + tag: NodeTag::InnerNode as u8, + padding: [0; 3], + prefix_len, + key, + children: [0; 2], + reserved: [0; 56], + } + } + + /// Given a search key, return the child the key would descend into and + /// the critbit (0 or 1) that decision was based on. + /// + /// The critbit is the bit immediately *after* the shared prefix + /// (i.e. the first bit at which the search key can disagree with this + /// node's stored prefix). + #[inline(always)] + pub fn walk_down(&self, search_key: u128) -> (NodeHandle, bool) { + let crit_bit_mask = 1u128 << (127 - self.prefix_len); + let crit_bit = (search_key & crit_bit_mask) != 0; + (self.children[crit_bit as usize], crit_bit) + } +} + +/// One resting order in the slab. +/// +/// All the per-order metadata callers care about lives on the corresponding +/// `Order` PDA - the slab leaf only stores what the matching engine needs: +/// the tree key (price + tie-break), the remaining quantity, the owner, and +/// the order_id (which the handler uses to verify the matching `Order` +/// account the caller passed in). +/// +/// `tag` is at offset 0 to match `InnerNode` (see comment there). +/// `repr(C, packed(8))` for the same reason as `InnerNode`. +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C, packed(8))] +pub struct LeafNode { + /// `NodeTag::LeafNode` + pub tag: u8, + pub padding: [u8; 7], + + /// The 128-bit tree key. See `new_node_key`. + pub key: u128, + + /// Owner of this resting order. Same as the corresponding `Order` + /// account's `owner`; cached here so the matching loop doesn't have to + /// deserialize the maker account just to read the owner. + pub owner: Pubkey, + + /// Quantity remaining (in base tokens). Decremented as fills consume the + /// order; the leaf is removed when it hits 0. + pub quantity: u64, + + /// Public order identifier. The handler uses this both to look up the + /// owner's `Order` PDA and to sanity-check the maker account list passed + /// as `remaining_accounts`. + pub order_id: u64, + + /// Unix timestamp at which the order rested. Not used by matching (the + /// seq_num inside `key` is the tie-break) - kept so offchain tooling + /// can show an "age" without re-deriving it from a different account. + pub timestamp: i64, + + /// Pads to NODE_SIZE. 88 - 1 - 7 - 16 - 32 - 8 - 8 - 8 = 8. + pub reserved: [u8; 8], +} +const_assert_eq!(size_of::(), NODE_SIZE); +const_assert_eq!(size_of::() % 8, 0); + +impl LeafNode { + pub fn new( + key: u128, + owner: Pubkey, + quantity: u64, + order_id: u64, + timestamp: i64, + ) -> Self { + Self { + tag: NodeTag::LeafNode as u8, + padding: [0; 7], + key, + owner, + quantity, + order_id, + timestamp, + reserved: [0; 8], + } + } + + /// Price half of the tree key - convenience for callers. + #[inline(always)] + pub fn price(&self) -> u64 { + price_from_key(self.key) + } +} + +/// Free-list link in the slab. When a leaf is removed its slot is replaced by +/// a FreeNode that points to the previous free slot, so subsequent inserts +/// reuse the slot in O(1). +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub(crate) struct FreeNode { + pub(crate) tag: u8, + pub(crate) padding: [u8; 3], + /// Next free slot in the chain, or unused when this is the last. + pub(crate) next: NodeHandle, + pub(crate) reserved: [u8; NODE_SIZE - 16], + /// Forces 8-byte alignment so all node variants share the same alignment. + pub(crate) force_align: u64, +} +const_assert_eq!(size_of::(), NODE_SIZE); +const_assert_eq!(size_of::() % 8, 0); + +/// Type-erased node. The slab is an array of these; the leading `tag` byte +/// tells callers which variant the slot actually holds. +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub struct AnyNode { + pub tag: u8, + pub data: [u8; 79], + /// See FreeNode::force_align. + pub force_align: u64, +} +const_assert_eq!(size_of::(), NODE_SIZE); +const_assert_eq!(size_of::() % 8, 0); +const_assert_eq!(align_of::(), 8); +const_assert_eq!(size_of::(), size_of::()); +const_assert_eq!(align_of::(), align_of::()); +const_assert_eq!(size_of::(), size_of::()); +const_assert_eq!(align_of::(), align_of::()); +const_assert_eq!(size_of::(), size_of::()); +const_assert_eq!(align_of::(), align_of::()); + +pub enum NodeRef<'a> { + Inner(&'a InnerNode), + Leaf(&'a LeafNode), +} + +pub enum NodeRefMut<'a> { + Inner(&'a mut InnerNode), + Leaf(&'a mut LeafNode), +} + +impl AnyNode { + pub fn case(&self) -> Option { + match NodeTag::from_u8(self.tag)? { + NodeTag::InnerNode => Some(NodeRef::Inner(cast_ref(self))), + NodeTag::LeafNode => Some(NodeRef::Leaf(cast_ref(self))), + _ => None, + } + } + + pub fn case_mut(&mut self) -> Option { + match NodeTag::from_u8(self.tag)? { + NodeTag::InnerNode => Some(NodeRefMut::Inner(cast_mut(self))), + NodeTag::LeafNode => Some(NodeRefMut::Leaf(cast_mut(self))), + _ => None, + } + } + + pub fn key(&self) -> Option { + Some(match self.case()? { + NodeRef::Inner(inner) => inner.key, + NodeRef::Leaf(leaf) => leaf.key, + }) + } + + pub fn children(&self) -> Option<[NodeHandle; 2]> { + match self.case()? { + NodeRef::Inner(inner) => Some(inner.children), + NodeRef::Leaf(_) => None, + } + } + + pub fn as_leaf(&self) -> Option<&LeafNode> { + match self.case() { + Some(NodeRef::Leaf(leaf)) => Some(leaf), + _ => None, + } + } + + pub fn as_leaf_mut(&mut self) -> Option<&mut LeafNode> { + match self.case_mut() { + Some(NodeRefMut::Leaf(leaf)) => Some(leaf), + _ => None, + } + } + + pub fn as_inner_mut(&mut self) -> Option<&mut InnerNode> { + match self.case_mut() { + Some(NodeRefMut::Inner(inner)) => Some(inner), + _ => None, + } + } +} + +impl AsRef for InnerNode { + fn as_ref(&self) -> &AnyNode { + cast_ref(self) + } +} + +impl AsRef for LeafNode { + fn as_ref(&self) -> &AnyNode { + cast_ref(self) + } +} + +impl FreeNode { + pub(crate) fn new(tag: NodeTag, next: NodeHandle) -> Self { + Self { + tag: tag as u8, + padding: [0; 3], + next, + reserved: [0; NODE_SIZE - 16], + force_align: 0, + } + } +} diff --git a/finance/order-book/anchor-v1/programs/order-book/src/state/slab/ordertree.rs b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/ordertree.rs new file mode 100644 index 000000000..ea6e983e1 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/src/state/slab/ordertree.rs @@ -0,0 +1,346 @@ +// Adapted from openbook-dex/openbook-v2 (commit f3e17421e675b083b584867594bf3cf4f675d156), +// MIT-licensed. See LICENSE-OPENBOOK in this directory. +// +// This port covers fixed-price orders with no expiry tracking (no +// time-in-force orders). Error type is rebased to this crate's `ErrorCode`. +// The tree mechanics (critbit / radix-trie insert + remove, min/max walks) +// are preserved so future contributors can diff against upstream cleanly. + +use anchor_lang::prelude::*; +use bytemuck::{cast, cast_ref}; +use static_assertions::const_assert_eq; + +use super::nodes::{AnyNode, FreeNode, InnerNode, LeafNode, NodeHandle, NodeRef, NodeTag}; +use crate::errors::ErrorCode; + +/// Per-side slab capacity. 1024 leaves easily covers any realistic depth at +/// the prices a single market quotes; the 88-byte node size keeps each side +/// at ~90 KB, well under Solana's 10 MB per-account ceiling. +pub const MAX_TREE_NODES: usize = 1024; + +/// Root pointer + leaf count for one side of the book. +/// +/// `maybe_node` is only meaningful when `leaf_count > 0` - a freshly-zeroed +/// root represents an empty tree. +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub struct OrderTreeRoot { + pub maybe_node: NodeHandle, + pub leaf_count: u32, +} +const_assert_eq!(std::mem::size_of::(), 8); + +// These types are internal slab implementation details that don't need a +// rich IDL representation. The default IdlBuild impls (create_type → None, +// insert_types → no-op) satisfy anchor build's IDL generation without +// exposing the raw slab internals to clients. +#[cfg(feature = "idl-build")] +impl anchor_lang::IdlBuild for OrderTreeRoot {} + +#[cfg(feature = "idl-build")] +impl anchor_lang::IdlBuild for OrderTreeNodes {} + +impl OrderTreeRoot { + pub fn node(&self) -> Option { + if self.leaf_count == 0 { + None + } else { + Some(self.maybe_node) + } + } +} + +/// Which side of the book this tree represents. +/// +/// Iteration order is determined by this: bids walk highest-key-first (best +/// bid first), asks walk lowest-key-first (best ask first). Since price is +/// stored in the high bits of the key, that's also best-price-first on both +/// sides. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[repr(u8)] +pub enum OrderTreeType { + Bids = 0, + Asks = 1, +} + +/// The slab itself. A fixed-size array of nodes plus the bookkeeping needed +/// to allocate and free slots in O(1): +/// - `bump_index` is the next never-used slot (used when the free list is +/// empty) +/// - `free_list_head` + `free_list_len` chain reclaimed slots, so cancels +/// reuse memory without compaction. +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub struct OrderTreeNodes { + /// `OrderTreeType`, as a u8 so the struct stays Pod. + pub order_tree_type: u8, + pub padding: [u8; 3], + pub bump_index: u32, + pub free_list_len: u32, + pub free_list_head: NodeHandle, + pub nodes: [AnyNode; MAX_TREE_NODES], +} +const_assert_eq!( + std::mem::size_of::(), + 1 + 3 + 4 + 4 + 4 + 88 * MAX_TREE_NODES +); + +impl OrderTreeNodes { + pub fn order_tree_type(&self) -> OrderTreeType { + match self.order_tree_type { + 0 => OrderTreeType::Bids, + 1 => OrderTreeType::Asks, + _ => panic!("invalid order_tree_type"), + } + } + + pub fn node(&self, handle: NodeHandle) -> Option<&AnyNode> { + let node = &self.nodes[handle as usize]; + match NodeTag::from_u8(node.tag) { + Some(NodeTag::InnerNode) | Some(NodeTag::LeafNode) => Some(node), + _ => None, + } + } + + pub fn node_mut(&mut self, handle: NodeHandle) -> Option<&mut AnyNode> { + let node = &mut self.nodes[handle as usize]; + match NodeTag::from_u8(node.tag) { + Some(NodeTag::InnerNode) | Some(NodeTag::LeafNode) => Some(node), + _ => None, + } + } + + /// Best-priced leaf for this tree. + /// + /// For asks ("min" means lowest price) this is the leftmost leaf; for + /// bids ("max" means highest price) this is the rightmost leaf. + pub fn best_leaf(&self, root: &OrderTreeRoot) -> Option<(NodeHandle, &LeafNode)> { + let find_max = self.order_tree_type() == OrderTreeType::Bids; + self.leaf_min_max(find_max, root) + } + + fn leaf_min_max( + &self, + find_max: bool, + root: &OrderTreeRoot, + ) -> Option<(NodeHandle, &LeafNode)> { + let mut node_handle: NodeHandle = root.node()?; + let critbit = usize::from(find_max); + loop { + match self.node(node_handle)?.case()? { + NodeRef::Inner(inner) => node_handle = inner.children[critbit], + NodeRef::Leaf(leaf) => return Some((node_handle, leaf)), + } + } + } + + /// Look up a leaf by its full 128-bit key. + pub fn find_by_key(&self, root: &OrderTreeRoot, search_key: u128) -> Option<(NodeHandle, &LeafNode)> { + let mut handle = root.node()?; + loop { + let node = self.node(handle)?; + match node.case()? { + NodeRef::Inner(inner) => { + let (next, _) = inner.walk_down(search_key); + handle = next; + } + NodeRef::Leaf(leaf) => { + if leaf.key == search_key { + return Some((handle, leaf)); + } + return None; + } + } + } + } + + pub fn remove_by_key( + &mut self, + root: &mut OrderTreeRoot, + search_key: u128, + ) -> Option { + // Stack of (handle, critbit) pairs so we can walk back up to the + // root after splicing the leaf out - same trick the upstream uses. + let mut stack: Vec<(NodeHandle, bool)> = vec![]; + + let mut parent_h = root.node()?; + let (mut child_h, mut crit_bit) = match self.node(parent_h)?.case()? { + NodeRef::Leaf(&leaf) if leaf.key == search_key => { + // Special case: the root is the matching leaf. Clear root, + // free the slot. + assert_eq!(root.leaf_count, 1); + root.maybe_node = 0; + root.leaf_count = 0; + let _ = self.free(parent_h)?; + return Some(leaf); + } + NodeRef::Leaf(_) => return None, + NodeRef::Inner(inner) => inner.walk_down(search_key), + }; + stack.push((parent_h, crit_bit)); + + loop { + match self.node(child_h)?.case()? { + NodeRef::Inner(inner) => { + parent_h = child_h; + let (next, bit) = inner.walk_down(search_key); + child_h = next; + crit_bit = bit; + stack.push((parent_h, crit_bit)); + } + NodeRef::Leaf(leaf) => { + if leaf.key != search_key { + return None; + } + break; + } + } + } + + // Replace the parent inner-node with its remaining child. We free + // both the old parent slot's content and the child slot. + let other_child_h = self.node(parent_h)?.children()?[!crit_bit as usize]; + let other_child = self.free(other_child_h)?; + *self.nodes.get_mut(parent_h as usize)? = other_child; + + root.leaf_count -= 1; + let removed: LeafNode = cast(self.free(child_h)?); + Some(removed) + } + + /// Move the slot at `handle` onto the free list, return whatever was + /// there. + fn free(&mut self, handle: NodeHandle) -> Option { + let val = *self.node(handle)?; + let tag = if self.free_list_len == 0 { + NodeTag::LastFreeNode + } else { + NodeTag::FreeNode + }; + self.nodes[handle as usize] = cast(FreeNode::new(tag, self.free_list_head)); + self.free_list_len += 1; + self.free_list_head = handle; + Some(val) + } + + /// Allocate a slot and write `val` into it. Reuses a free-list slot when + /// one's available, otherwise consumes the next bump slot. + fn alloc(&mut self, val: &AnyNode) -> Result { + match NodeTag::from_u8(val.tag) { + Some(NodeTag::InnerNode) | Some(NodeTag::LeafNode) => (), + _ => return err!(ErrorCode::OrderBookFull), + }; + + if self.free_list_len == 0 { + require!( + (self.bump_index as usize) < self.nodes.len() && self.bump_index < u32::MAX, + ErrorCode::OrderBookFull + ); + self.nodes[self.bump_index as usize] = *val; + let handle = self.bump_index; + self.bump_index += 1; + return Ok(handle); + } + + let handle = self.free_list_head; + let next = cast_ref::(&self.nodes[handle as usize]).next; + self.free_list_head = next; + self.free_list_len -= 1; + self.nodes[handle as usize] = *val; + Ok(handle) + } + + /// Insert `new_leaf` into the tree rooted at `root`. + /// + /// Returns the handle of the new leaf and, when a duplicate key collided, + /// the leaf that got overwritten. (Callers in this order book embed a + /// monotonically increasing seq_num in every key, so collisions cannot + /// actually happen - the case is kept just to match the upstream API.) + pub fn insert_leaf( + &mut self, + root: &mut OrderTreeRoot, + new_leaf: &LeafNode, + ) -> Result<(NodeHandle, Option)> { + // Empty tree: leaf becomes the root. + let mut parent_handle: NodeHandle = match root.node() { + Some(h) => h, + None => { + let handle = self.alloc(new_leaf.as_ref())?; + root.maybe_node = handle; + root.leaf_count = 1; + return Ok((handle, None)); + } + }; + + let mut stack: Vec<(NodeHandle, bool)> = vec![]; + + loop { + let parent_contents = *self + .node(parent_handle) + .ok_or_else(|| error!(ErrorCode::OrderBookFull))?; + let parent_key = parent_contents.key().unwrap(); + + // Exact-key collision: only possible if the existing slot is a + // leaf (inner nodes' `key` is just a shared prefix). Overwrite + // and bail. + if parent_key == new_leaf.key { + if let Some(NodeRef::Leaf(&old_leaf)) = parent_contents.case() { + *self.node_mut(parent_handle).unwrap() = *new_leaf.as_ref(); + return Ok((parent_handle, Some(old_leaf))); + } + } + + let shared_prefix_len: u32 = (parent_key ^ new_leaf.key).leading_zeros(); + + if let Some(NodeRef::Inner(inner)) = parent_contents.case() { + if shared_prefix_len >= inner.prefix_len { + // The new key shares at least this node's prefix - + // descend. + let (child, crit_bit) = inner.walk_down(new_leaf.key); + stack.push((parent_handle, crit_bit)); + parent_handle = child; + continue; + } + } + + // Split: parent (leaf or inner with shorter shared prefix) and + // new leaf disagree at bit `shared_prefix_len`. Replace parent + // in place with a new InnerNode that has them both as children. + let crit_bit_mask: u128 = 1u128 << (127 - shared_prefix_len); + let new_leaf_crit_bit = (crit_bit_mask & new_leaf.key) != 0; + let old_parent_crit_bit = !new_leaf_crit_bit; + + let new_leaf_handle = self.alloc(new_leaf.as_ref())?; + let moved_parent_handle = match self.alloc(&parent_contents) { + Ok(h) => h, + Err(error) => { + // alloc rolled back from the failed half-insert. + let _ = self.free(new_leaf_handle); + return Err(error); + } + }; + + // The slot at `parent_handle` currently holds a LeafNode (or an + // InnerNode whose prefix is too long for the new key). We're + // replacing it with a freshly-built InnerNode that has the new + // leaf and the moved-aside old node as children. We can't go via + // `node_mut().as_inner_mut()` here because that would refuse the + // slot when its tag is still LeafNode - instead, write a complete + // new InnerNode bit-pattern into the slot via AnyNode. + let mut new_inner = InnerNode::new(shared_prefix_len, new_leaf.key); + new_inner.children[new_leaf_crit_bit as usize] = new_leaf_handle; + new_inner.children[old_parent_crit_bit as usize] = moved_parent_handle; + self.nodes[parent_handle as usize] = *new_inner.as_ref(); + + // `stack` not needed past this point; suppress unused-mut. + let _ = stack; + + root.leaf_count += 1; + return Ok((new_leaf_handle, None)); + } + } + + pub fn is_full(&self) -> bool { + self.free_list_len <= 1 && (self.bump_index as usize) >= self.nodes.len() - 1 + } +} diff --git a/finance/order-book/anchor-v1/programs/order-book/tests/test_order_book.rs b/finance/order-book/anchor-v1/programs/order-book/tests/test_order_book.rs new file mode 100644 index 000000000..0d25dbb54 --- /dev/null +++ b/finance/order-book/anchor-v1/programs/order-book/tests/test_order_book.rs @@ -0,0 +1,2100 @@ +//! LiteSVM tests for the order-book program. +//! +//! Covers the full lifecycle that the program supports: initialise a market, +//! create user accounts, place bids/asks (locking the appropriate vault), +//! reject invalid prices / tick-aligned prices / undersized quantities, +//! cancel orders (which credits unsettled balances), settle funds out of +//! the vaults, and - in the matching block near the bottom - cross incoming +//! orders against resting orders using price-time priority, charge the +//! configured taker fee to a fee vault, and drain the fee vault via +//! `withdraw_fees`. + +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_instruction, system_program, + }, + Discriminator, InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, + send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +// Keep test-side seeds in sync with `programs/order_book/src/state/*`. Duplicated +// rather than imported so tests stay self-contained and exercise the same +// byte strings a client SDK would use. +const MARKET_SEED: &[u8] = b"market"; +const ORDER_SEED: &[u8] = b"order"; +const MARKET_USER_SEED: &[u8] = b"market_user"; + +// Size of the zero-copy OrderBook account, including Anchor's 8-byte +// discriminator. Mirrors `order_book::state::ORDER_BOOK_ACCOUNT_SIZE` - duplicated +// here so tests are self-contained and stay closer to what an SDK does. +// Two 1024-leaf critbit slabs at 88 bytes per node, plus header. If you +// change this, bump the constant in `state/order_book.rs` too - the +// `#[account(zero)]` check fails if the account size is wrong. +const ORDER_BOOK_ACCOUNT_SIZE: u64 = order_book::state::ORDER_BOOK_ACCOUNT_SIZE as u64; + +// NVDAx has 8 decimals onchain; USDC has 6. +const BASE_DECIMALS: u8 = 8; // NVDAx (https://explorer.solana.com/address/Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh) +const QUOTE_DECIMALS: u8 = 6; // USDC + +// Two-lot model for NVDAx/USDC (d_base=8, d_quote=6): +// base_lot_size = 10^max(8-6, 0) = 100 → 1 lot = 100 raw NVDAx +// quote_lot_size = 10^max(6-8, 0) = 1 → 1 quote-lot = 1 raw USDC +// raw_base = quantity × 100 +// raw_quote = price × quantity × 1 (= human USDC/share × lots) +// tick_size = 1 → $1.00 minimum price increment +const FEE_BASIS_POINTS: u16 = 10; + +// Mirror of the program's fee rounding: ceiling division so the fee rounds +// in the protocol's favour (flooring would leak dust to the maker per fill). +const fn fee_ceil(gross: u64) -> u64 { + ((gross as u128 * FEE_BASIS_POINTS as u128 + 9_999) / 10_000) as u64 +} +const TICK_SIZE: u64 = 1; +const BASE_LOT_SIZE: u64 = 100; +const QUOTE_LOT_SIZE: u64 = 1; +const MIN_ORDER_SIZE: u64 = 1; + +// Funding for each trader's token accounts. Large enough to cover every +// order placed in the tests with room to spare. +const TRADER_STARTING_BALANCE: u64 = 1_000_000_000; + +// Shared order sizing - chosen so price * quantity stays well inside u64 +// and the seller's ask sits at the same price as the buyer's bid (matching +// is not implemented, they just coexist in the book). +const BID_PRICE: u64 = 100; +const BID_QUANTITY: u64 = 10; +const ASK_PRICE: u64 = 100; +const ASK_QUANTITY: u64 = 5; + +fn token_program_id() -> Pubkey { + // The program accepts either the Classic Token Program or the Token + // Extensions Program via `TokenInterface`; we use the Classic Token + // Program for tests because solana-kite's helpers create classic mints. + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn market_pda(program_id: &Pubkey, base_mint: &Pubkey, quote_mint: &Pubkey) -> Pubkey { + let (market, _) = Pubkey::find_program_address( + &[MARKET_SEED, base_mint.as_ref(), quote_mint.as_ref()], + program_id, + ); + market +} + +fn market_user_pda(program_id: &Pubkey, market: &Pubkey, owner: &Pubkey) -> Pubkey { + let (market_user, _) = Pubkey::find_program_address( + &[MARKET_USER_SEED, market.as_ref(), owner.as_ref()], + program_id, + ); + market_user +} + +fn order_pda(program_id: &Pubkey, market: &Pubkey, order_id: u64) -> Pubkey { + let (order, _) = Pubkey::find_program_address( + &[ORDER_SEED, market.as_ref(), &order_id.to_le_bytes()], + program_id, + ); + order +} + +// --------------------------------------------------------------------------- +// Scenario: a market with a buyer and a seller, both funded in both mints. +// --------------------------------------------------------------------------- + +struct Scenario { + svm: LiteSVM, + program_id: Pubkey, + // `payer` funds the mint authority + ATA creations during setup but is + // not used directly by the tests afterwards. + #[allow(dead_code)] + payer: Keypair, + authority: Keypair, + buyer: Keypair, + seller: Keypair, + base_mint: Pubkey, + quote_mint: Pubkey, + base_vault: Keypair, + quote_vault: Keypair, + // Fees accumulate here (quote mint). Created fresh per Scenario; the + // market PDA is the signer, same as the other two vaults. + fee_vault: Keypair, + market: Pubkey, + // The order book is a ~180 KB zero-copy account owned by the program. + // It's NOT a PDA - the BPF runtime caps inner-CPI allocations at 10 KB, + // so the client must allocate it directly via system_program::CreateAccount + // and pass it in as a signer. See `build_initialize_market_tx` for the + // full setup. + order_book: Keypair, + buyer_base_ata: Pubkey, + buyer_quote_ata: Pubkey, + seller_base_ata: Pubkey, + seller_quote_ata: Pubkey, + buyer_market_user: Pubkey, + seller_market_user: Pubkey, +} + +fn full_setup() -> Scenario { + let program_id = order_book::id(); + let mut svm = LiteSVM::new(); + let program_bytes = include_bytes!("../../../target/deploy/order_book.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // 100 SOL for the payer is overkill, but rent + a few init-ATA hops add + // up and a generous balance keeps setup logic simple. + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let authority = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let buyer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let seller = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let base_mint = create_token_mint(&mut svm, &authority, BASE_DECIMALS, None).unwrap(); + let quote_mint = create_token_mint(&mut svm, &authority, QUOTE_DECIMALS, None).unwrap(); + + // Create and fund every trader's ATAs up-front so individual tests do + // not need to worry about mint/ATA side effects, only about order-book state. + let buyer_base_ata = + create_associated_token_account(&mut svm, &buyer.pubkey(), &base_mint, &payer).unwrap(); + let buyer_quote_ata = + create_associated_token_account(&mut svm, &buyer.pubkey(), "e_mint, &payer).unwrap(); + let seller_base_ata = + create_associated_token_account(&mut svm, &seller.pubkey(), &base_mint, &payer).unwrap(); + let seller_quote_ata = + create_associated_token_account(&mut svm, &seller.pubkey(), "e_mint, &payer).unwrap(); + + mint_tokens_to_token_account( + &mut svm, + &base_mint, + &seller_base_ata, + TRADER_STARTING_BALANCE, + &authority, + ) + .unwrap(); + mint_tokens_to_token_account( + &mut svm, + "e_mint, + &buyer_quote_ata, + TRADER_STARTING_BALANCE, + &authority, + ) + .unwrap(); + + let market = market_pda(&program_id, &base_mint, "e_mint); + let buyer_market_user = market_user_pda(&program_id, &market, &buyer.pubkey()); + let seller_market_user = market_user_pda(&program_id, &market, &seller.pubkey()); + + // Vaults are plain token accounts created in-line by initialize_market + // (not PDAs). Tests generate fresh keypairs to serve as their addresses. + let base_vault = Keypair::new(); + let quote_vault = Keypair::new(); + let fee_vault = Keypair::new(); + let order_book = Keypair::new(); + + Scenario { + svm, + program_id, + payer, + authority, + buyer, + seller, + base_mint, + quote_mint, + base_vault, + quote_vault, + fee_vault, + market, + order_book, + buyer_base_ata, + buyer_quote_ata, + seller_base_ata, + seller_quote_ata, + buyer_market_user, + seller_market_user, + } +} + +// --------------------------------------------------------------------------- +// Instruction builders - one per program entry point. +// --------------------------------------------------------------------------- + +/// Build the `system_program::CreateAccount` instruction the client must run +/// to allocate the ~180 KB OrderBook account before calling +/// `initialize_market`. The new account is owned by the order-book program and +/// zero-initialized; the program then runs `load_init` against it in the +/// next instruction. +/// +/// Rent is whatever LiteSVM's bank quotes for that size at the current +/// rent rate; we use `minimum_balance` so the account is rent-exempt. +fn build_create_order_book_account_ix( + sc: &Scenario, + payer: &Pubkey, +) -> Instruction { + // LiteSVM uses the default rent schedule; minimum_balance() on the + // 180 KB account is around 1.25 SOL - well within the 100 SOL we fund + // the test payer with in `full_setup`. + let rent_lamports = sc + .svm + .minimum_balance_for_rent_exemption(ORDER_BOOK_ACCOUNT_SIZE as usize); + system_instruction::create_account( + payer, + &sc.order_book.pubkey(), + rent_lamports, + ORDER_BOOK_ACCOUNT_SIZE, + &sc.program_id, + ) +} + +fn build_initialize_market_ix( + sc: &Scenario, + fee_basis_points: u16, + tick_size: u64, + base_lot_size: u64, + quote_lot_size: u64, + min_order_size: u64, +) -> Instruction { + Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::InitializeMarket { + fee_basis_points, + tick_size, + base_lot_size, + quote_lot_size, + min_order_size, + } + .data(), + order_book::accounts::InitializeMarketAccountConstraints { + market: sc.market, + order_book: sc.order_book.pubkey(), + base_mint: sc.base_mint, + quote_mint: sc.quote_mint, + base_vault: sc.base_vault.pubkey(), + quote_vault: sc.quote_vault.pubkey(), + fee_vault: sc.fee_vault.pubkey(), + authority: sc.authority.pubkey(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn build_initialize_market_user_ix(sc: &Scenario, owner: &Pubkey) -> Instruction { + let market_user = market_user_pda(&sc.program_id, &sc.market, owner); + Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::InitializeMarketUser {}.data(), + order_book::accounts::InitializeMarketUserAccountConstraints { + market_user, + market: sc.market, + owner: *owner, + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +#[allow(clippy::too_many_arguments)] +fn build_place_order_ix( + sc: &Scenario, + owner: &Keypair, + market_user: Pubkey, + user_base_account: Pubkey, + user_quote_account: Pubkey, + side: order_book::state::OrderSide, + order_id: u64, + price: u64, + quantity: u64, +) -> Instruction { + let order = order_pda(&sc.program_id, &sc.market, order_id); + Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::PlaceOrder { + side, + price, + quantity, + } + .data(), + order_book::accounts::PlaceOrderAccountConstraints { + market: sc.market, + order_book: sc.order_book.pubkey(), + order, + market_user, + base_vault: sc.base_vault.pubkey(), + quote_vault: sc.quote_vault.pubkey(), + fee_vault: sc.fee_vault.pubkey(), + user_base_account, + user_quote_account, + base_mint: sc.base_mint, + quote_mint: sc.quote_mint, + owner: owner.pubkey(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// Build a `place_order` instruction with maker (order, market_user) PDA +/// pairs appended as remaining accounts. The order-book program expects them in the same +/// order the resting book will be walked - best-priced first (lowest ask +/// for a taker bid, highest bid for a taker ask), and within a price level +/// earliest-first. Every maker pair must be writable: the program mutates +/// the maker's Order (filled_quantity, status) and their MarketUser +/// (unsettled_* and open_orders). +#[allow(clippy::too_many_arguments)] +fn build_place_order_with_makers_ix( + sc: &Scenario, + owner: &Keypair, + market_user: Pubkey, + user_base_account: Pubkey, + user_quote_account: Pubkey, + side: order_book::state::OrderSide, + order_id: u64, + price: u64, + quantity: u64, + maker_pairs: &[(u64, Pubkey)], +) -> Instruction { + let mut ix = build_place_order_ix( + sc, + owner, + market_user, + user_base_account, + user_quote_account, + side, + order_id, + price, + quantity, + ); + + for (maker_order_id, maker_market_user) in maker_pairs { + let maker_order = order_pda(&sc.program_id, &sc.market, *maker_order_id); + ix.accounts + .push(AccountMeta::new(maker_order, false)); + ix.accounts + .push(AccountMeta::new(*maker_market_user, false)); + } + + ix +} + +fn build_withdraw_fees_ix( + sc: &Scenario, + authority_quote_account: Pubkey, +) -> Instruction { + Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::WithdrawFees {}.data(), + order_book::accounts::WithdrawFeesAccountConstraints { + market: sc.market, + fee_vault: sc.fee_vault.pubkey(), + authority_quote_account, + quote_mint: sc.quote_mint, + authority: sc.authority.pubkey(), + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +fn build_cancel_order_ix( + sc: &Scenario, + owner: &Pubkey, + market_user: Pubkey, + order_id: u64, +) -> Instruction { + let order = order_pda(&sc.program_id, &sc.market, order_id); + Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::CancelOrder {}.data(), + order_book::accounts::CancelOrderAccountConstraints { + market: sc.market, + order_book: sc.order_book.pubkey(), + order, + market_user, + owner: *owner, + } + .to_account_metas(None), + ) +} + +fn build_settle_funds_ix( + sc: &Scenario, + owner: &Pubkey, + market_user: Pubkey, + user_base_account: Pubkey, + user_quote_account: Pubkey, +) -> Instruction { + Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::SettleFunds {}.data(), + order_book::accounts::SettleFundsAccountConstraints { + market: sc.market, + market_user, + base_vault: sc.base_vault.pubkey(), + quote_vault: sc.quote_vault.pubkey(), + user_base_account, + user_quote_account, + base_mint: sc.base_mint, + quote_mint: sc.quote_mint, + owner: *owner, + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +// Convenience: run `initialize_market` with the shared test parameters and +// both user-account creations so tests that just want a ready-to-trade +// market do not have to repeat the boilerplate. +fn initialize_market_and_users(sc: &mut Scenario) { + // Allocate the OrderBook account first - it has to exist (owned by the + // program, zero-initialized) before initialize_market's `#[account(zero)]` + // check passes. + let create_ix = build_create_order_book_account_ix(sc, &sc.authority.pubkey()); + let init_ix = build_initialize_market_ix(sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, init_ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ) + .unwrap(); + + let buyer_ix = build_initialize_market_user_ix(sc, &sc.buyer.pubkey()); + send_transaction_from_instructions( + &mut sc.svm, + vec![buyer_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + let seller_ix = build_initialize_market_user_ix(sc, &sc.seller.pubkey()); + send_transaction_from_instructions( + &mut sc.svm, + vec![seller_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[test] +fn initialize_market_sets_market_and_order_book() { + let mut sc = full_setup(); + + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ) + .unwrap(); + + // The market PDA is owned by the program and non-empty. + let market_account = sc.svm.get_account(&sc.market).expect("market PDA missing"); + assert_eq!(market_account.owner, sc.program_id); + assert!(!market_account.data.is_empty()); + + let order_book_account = sc + .svm + .get_account(&sc.order_book.pubkey()) + .expect("order book account missing"); + assert_eq!(order_book_account.owner, sc.program_id); + // The 8-byte discriminator should now be set (init handler ran). + assert_eq!( + &order_book_account.data[..8], + order_book::state::OrderBook::DISCRIMINATOR + ); + + // Vaults were created with the market as authority; easiest check is + // simply that they exist with a zero balance. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), + 0 + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.quote_vault.pubkey()).unwrap(), + 0 + ); +} + +#[test] +fn initialize_market_user_tracks_market_and_owner() { + let mut sc = full_setup(); + + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let init_ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, init_ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ) + .unwrap(); + + let create_ix = build_initialize_market_user_ix(&sc, &sc.buyer.pubkey()); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + let market_user = sc + .svm + .get_account(&sc.buyer_market_user) + .expect("user account PDA missing"); + assert_eq!(market_user.owner, sc.program_id); +} + +#[test] +fn place_bid_locks_quote_in_vault() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // The first order ever placed gets id = 1 (see initialize_market.rs). + let bid_order_id = 1u64; + let ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + bid_order_id, + BID_PRICE, + BID_QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![ix], &[&sc.buyer], &sc.buyer.pubkey()) + .unwrap(); + + // A bid locks price * quantity * quote_lot_size raw quote tokens. + let locked_quote = BID_PRICE * BID_QUANTITY * QUOTE_LOT_SIZE; + assert_eq!( + get_token_account_balance(&sc.svm, &sc.quote_vault.pubkey()).unwrap(), + locked_quote + ); + // Buyer's quote ATA dropped by exactly that. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.buyer_quote_ata).unwrap(), + TRADER_STARTING_BALANCE - locked_quote + ); + // Base vault untouched - bids never move base tokens. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), + 0 + ); + + // Order PDA exists and is owned by the program. + let order_account = sc + .svm + .get_account(&order_pda(&sc.program_id, &sc.market, bid_order_id)) + .expect("order PDA missing"); + assert_eq!(order_account.owner, sc.program_id); +} + +#[test] +fn place_ask_locks_base_in_vault() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + let ask_order_id = 1u64; + let ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + ask_order_id, + ASK_PRICE, + ASK_QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![ix], &[&sc.seller], &sc.seller.pubkey()) + .unwrap(); + + // An ask locks quantity * base_lot_size raw base tokens in the base vault. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), + ASK_QUANTITY * BASE_LOT_SIZE + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), + TRADER_STARTING_BALANCE - ASK_QUANTITY * BASE_LOT_SIZE + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.quote_vault.pubkey()).unwrap(), + 0 + ); +} + +#[test] +fn place_order_rejects_zero_price() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + let order_id = 1u64; + let ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + order_id, + // Price 0 trips InvalidPrice before tick-size is even considered. + 0, + BID_QUANTITY, + ); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ); + assert!(result.is_err(), "order at price 0 must be rejected"); +} + +#[test] +fn place_order_rejects_unaligned_tick() { + let mut sc = full_setup(); + + // Override default TICK_SIZE for this test so we can place a mis-aligned + // price and see the tick check fire. + let unusual_tick_size: u64 = 50; + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let init_ix = + build_initialize_market_ix(&sc, FEE_BASIS_POINTS, unusual_tick_size, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, init_ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ) + .unwrap(); + + let create_ix = build_initialize_market_user_ix(&sc, &sc.buyer.pubkey()); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // 75 is not a multiple of 50 - must be rejected by the tick check. + let unaligned_price: u64 = 75; + let ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + 1, + unaligned_price, + BID_QUANTITY, + ); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ); + assert!( + result.is_err(), + "unaligned price must be rejected by tick check" + ); +} + +#[test] +fn place_order_rejects_below_min_order_size() { + let mut sc = full_setup(); + + // Force a higher min_order_size so we can place an order below it. + let elevated_min_order_size: u64 = 10; + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let init_ix = + build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, QUOTE_LOT_SIZE, elevated_min_order_size); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, init_ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ) + .unwrap(); + + let create_ix = build_initialize_market_user_ix(&sc, &sc.seller.pubkey()); + send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + let too_small_quantity: u64 = 1; + let ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + 1, + ASK_PRICE, + too_small_quantity, + ); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![ix], + &[&sc.seller], + &sc.seller.pubkey(), + ); + assert!( + result.is_err(), + "quantity below min_order_size must be rejected" + ); +} + +#[test] +fn cancel_ask_credits_unsettled_base() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // Seller places an ask, then cancels it. The full locked base should be + // credited to unsettled_base (no settlement yet). + let ask_order_id = 1u64; + let place_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + ask_order_id, + ASK_PRICE, + ASK_QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![place_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + let cancel_ix = build_cancel_order_ix( + &sc, + &sc.seller.pubkey(), + sc.seller_market_user, + ask_order_id, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![cancel_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + // Funds are still in the vault - cancel does not move tokens, it only + // updates the unsettled balance. Settlement is a separate step. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), + ASK_QUANTITY * BASE_LOT_SIZE + ); + // Seller's ATA hasn't received anything back yet. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), + TRADER_STARTING_BALANCE - ASK_QUANTITY * BASE_LOT_SIZE + ); +} + +#[test] +fn cancel_order_rejects_non_owner() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // Buyer places a bid; seller tries to cancel it using their own user + // account. The program's `order.owner == signer` check must reject. + let bid_order_id = 1u64; + let place_ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + bid_order_id, + BID_PRICE, + BID_QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![place_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + let attack_ix = build_cancel_order_ix( + &sc, + &sc.seller.pubkey(), + sc.seller_market_user, + bid_order_id, + ); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![attack_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ); + assert!( + result.is_err(), + "non-owner must not be able to cancel an order" + ); +} + +#[test] +fn settle_funds_moves_unsettled_base_to_user() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // Seller places + cancels an ask → credits unsettled_base. + let ask_order_id = 1u64; + let place_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + ask_order_id, + ASK_PRICE, + ASK_QUANTITY, + ); + let cancel_ix = build_cancel_order_ix( + &sc, + &sc.seller.pubkey(), + sc.seller_market_user, + ask_order_id, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![place_ix, cancel_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + let settle_ix = build_settle_funds_ix( + &sc, + &sc.seller.pubkey(), + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![settle_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + // Vault drained, seller got their base tokens back in full. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), + 0 + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), + TRADER_STARTING_BALANCE + ); +} + +#[test] +fn cancel_and_settle_bid_refunds_full_quote() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + let bid_order_id = 1u64; + let place_ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + bid_order_id, + BID_PRICE, + BID_QUANTITY, + ); + let cancel_ix = build_cancel_order_ix( + &sc, + &sc.buyer.pubkey(), + sc.buyer_market_user, + bid_order_id, + ); + let settle_ix = build_settle_funds_ix( + &sc, + &sc.buyer.pubkey(), + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![place_ix, cancel_ix, settle_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Vault drained, buyer got the full price*quantity of quote back. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.quote_vault.pubkey()).unwrap(), + 0 + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.buyer_quote_ata).unwrap(), + TRADER_STARTING_BALANCE + ); +} + +// Regression test for the fee-drain attack on settle_funds. Pre-fix, +// `SettleFundsAccountConstraints` did not bind `quote_vault` to `market.quote_vault` via +// `has_one`, so a caller could pass `market.fee_vault` (same mint and +// same authority) where `quote_vault` was expected and drain accumulated +// taker fees while spending their own unsettled_quote credit. The +// has_one constraint now bound on the `market` field must surface this +// as `ConstraintHasOne` (anchor error 2001) before any transfer runs. +#[test] +fn settle_funds_rejects_fee_vault_substituted_for_quote_vault() { + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // Earn the buyer some unsettled_quote: place a bid (locks quote in + // the real quote_vault) and immediately cancel it (credits the + // buyer's unsettled_quote). settle_funds would normally drain the + // quote_vault to the buyer's ATA. + let bid_order_id = 1u64; + let place_ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + bid_order_id, + BID_PRICE, + BID_QUANTITY, + ); + let cancel_ix = build_cancel_order_ix( + &sc, + &sc.buyer.pubkey(), + sc.buyer_market_user, + bid_order_id, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![place_ix, cancel_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Build a settle_funds ix but swap fee_vault in for quote_vault. + // Everything else (base_vault, mints, user accounts, owner) stays + // correct, so the only thing that should reject this is the new + // has_one constraint on the market PDA. + let attack_ix = Instruction::new_with_bytes( + sc.program_id, + &order_book::instruction::SettleFunds {}.data(), + order_book::accounts::SettleFundsAccountConstraints { + market: sc.market, + market_user: sc.buyer_market_user, + base_vault: sc.base_vault.pubkey(), + // Attack: route the quote-side transfer at the fee_vault. + quote_vault: sc.fee_vault.pubkey(), + user_base_account: sc.buyer_base_ata, + user_quote_account: sc.buyer_quote_ata, + base_mint: sc.base_mint, + quote_mint: sc.quote_mint, + owner: sc.buyer.pubkey(), + token_program: token_program_id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![attack_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ); + assert!( + result.is_err(), + "settle_funds must reject fee_vault substituted for quote_vault" + ); +} + +#[test] +fn initialize_market_rejects_zero_tick_size() { + let mut sc = full_setup(); + + let zero_tick_size: u64 = 0; + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, zero_tick_size, BASE_LOT_SIZE, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ); + assert!(result.is_err(), "tick_size == 0 must be rejected"); +} + +#[test] +fn initialize_market_rejects_zero_base_lot_size() { + let mut sc = full_setup(); + + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, 0, QUOTE_LOT_SIZE, MIN_ORDER_SIZE); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ); + assert!(result.is_err(), "base_lot_size == 0 must be rejected"); +} + +#[test] +fn initialize_market_rejects_zero_quote_lot_size() { + let mut sc = full_setup(); + + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix(&sc, FEE_BASIS_POINTS, TICK_SIZE, BASE_LOT_SIZE, 0, MIN_ORDER_SIZE); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ); + assert!(result.is_err(), "quote_lot_size == 0 must be rejected"); +} + +#[test] +fn initialize_market_rejects_oversized_fee() { + let mut sc = full_setup(); + + // 10_000 bps == 100% is the cap; anything higher must fail. + let over_cap_fee_basis_points: u16 = 10_001; + let create_ix = build_create_order_book_account_ix(&sc, &sc.authority.pubkey()); + let ix = build_initialize_market_ix( + &sc, + over_cap_fee_basis_points, + TICK_SIZE, + BASE_LOT_SIZE, + QUOTE_LOT_SIZE, + MIN_ORDER_SIZE, + ); + let result = send_transaction_from_instructions( + &mut sc.svm, + vec![create_ix, ix], + &[ + &sc.authority, + &sc.order_book, + &sc.base_vault, + &sc.quote_vault, + &sc.fee_vault, + ], + &sc.authority.pubkey(), + ); + assert!( + result.is_err(), + "fee_basis_points above 10_000 must be rejected" + ); +} + +// --------------------------------------------------------------------------- +// Matching-engine tests +// +// These exercise the price-time priority crossing logic added to place_order. +// Constants are named per-test (rather than shared at the top of the file) +// so each test reads self-contained and the maths is easy to follow. +// --------------------------------------------------------------------------- + +// MarketUser field offsets after the 8-byte Anchor discriminator. Layout +// (see programs/order_book/src/state/market_user.rs): +// market: Pubkey (32) +// owner: Pubkey (32) +// unsettled_base: u64 (8) +// unsettled_quote: u64 (8) +// ... +// Borsh-decoding manually (rather than pulling MarketUser via try_from) +// keeps the tests readable and side-steps rent-checked deserialise paths. +const USER_ACCOUNT_UNSETTLED_BASE_OFFSET: usize = 8 + 32 + 32; +const USER_ACCOUNT_UNSETTLED_QUOTE_OFFSET: usize = USER_ACCOUNT_UNSETTLED_BASE_OFFSET + 8; + +// Order layout after 8-byte discriminator (see state/order.rs): +// market: Pubkey (32) +// owner: Pubkey (32) +// order_id: u64 (8) +// side: u8 (Borsh-encoded enum tag) (1) +// price: u64 (8) +// original_quantity: u64 (8) +// filled_quantity: u64 (8) +const ORDER_FILLED_QUANTITY_OFFSET: usize = 8 + 32 + 32 + 8 + 1 + 8 + 8; +const ORDER_STATUS_OFFSET: usize = ORDER_FILLED_QUANTITY_OFFSET + 8; +const ORDER_STATUS_OPEN: u8 = 0; +const ORDER_STATUS_PARTIALLY_FILLED: u8 = 1; +const ORDER_STATUS_FILLED: u8 = 2; + +fn read_user_unsettled(svm: &LiteSVM, market_user: &Pubkey) -> (u64, u64) { + let data = svm + .get_account(market_user) + .expect("user account missing") + .data + .clone(); + let base = u64::from_le_bytes( + data[USER_ACCOUNT_UNSETTLED_BASE_OFFSET..USER_ACCOUNT_UNSETTLED_BASE_OFFSET + 8] + .try_into() + .unwrap(), + ); + let quote = u64::from_le_bytes( + data[USER_ACCOUNT_UNSETTLED_QUOTE_OFFSET..USER_ACCOUNT_UNSETTLED_QUOTE_OFFSET + 8] + .try_into() + .unwrap(), + ); + (base, quote) +} + +fn read_order_fill_and_status(svm: &LiteSVM, order: &Pubkey) -> (u64, u8) { + let data = svm + .get_account(order) + .expect("order account missing") + .data + .clone(); + let filled = u64::from_le_bytes( + data[ORDER_FILLED_QUANTITY_OFFSET..ORDER_FILLED_QUANTITY_OFFSET + 8] + .try_into() + .unwrap(), + ); + let status = data[ORDER_STATUS_OFFSET]; + (filled, status) +} + +#[test] +fn taker_bid_fully_crosses_best_ask() { + // Seller rests an ask, buyer's bid fully eats it. Check base flows to + // buyer's unsettled_base, quote net-of-fee flows to seller's + // unsettled_quote, and fee_vault receives the expected bps. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + // 1000 * 100 = 100_000 quote flows, and 100_000 * 10 bps / 10_000 = 100 + // fee - big enough to be non-zero after integer division, tiny enough + // that trader starting balances easily cover it. + const PRICE: u64 = 1000; + const QUANTITY: u64 = 100; + const EXPECTED_GROSS_QUOTE: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = EXPECTED_GROSS_QUOTE * FEE_BASIS_POINTS as u64 / 10_000; + const EXPECTED_NET_TO_MAKER: u64 = EXPECTED_GROSS_QUOTE - EXPECTED_FEE; + + // Seller posts the resting ask. + let maker_ask_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![maker_ask_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + // Buyer's taker bid at the same price, same qty - fully crosses. + const TAKER_BID_ID: u64 = 2; + let taker_bid_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![taker_bid_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Fee vault received exactly fee_bps of the gross. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + EXPECTED_FEE + ); + + let (buyer_base, buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); + assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); + // No price improvement here - buyer's limit == maker's price - so no + // quote rebate lands in the taker's unsettled_quote. + assert_eq!(buyer_quote, 0); + + let (_seller_base, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); + assert_eq!(seller_quote, EXPECTED_NET_TO_MAKER); + + // The resting maker order should have been removed from the book and + // marked Filled. + let maker_order = order_pda(&sc.program_id, &sc.market, MAKER_ASK_ID); + let (filled, status) = read_order_fill_and_status(&sc.svm, &maker_order); + assert_eq!(filled, QUANTITY); + assert_eq!(status, ORDER_STATUS_FILLED); +} + +#[test] +fn taker_ask_fully_crosses_best_bid() { + // Mirror of the bid test. Buyer rests a bid, seller's ask fully eats it. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_BID_ID: u64 = 1; + const PRICE: u64 = 1000; + const QUANTITY: u64 = 100; + const EXPECTED_GROSS_QUOTE: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = EXPECTED_GROSS_QUOTE * FEE_BASIS_POINTS as u64 / 10_000; + const EXPECTED_NET_TO_TAKER: u64 = EXPECTED_GROSS_QUOTE - EXPECTED_FEE; + + let maker_bid_ix = build_place_order_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + MAKER_BID_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![maker_bid_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + const TAKER_ASK_ID: u64 = 2; + let taker_ask_ix = build_place_order_with_makers_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + TAKER_ASK_ID, + PRICE, + QUANTITY, + &[(MAKER_BID_ID, sc.buyer_market_user)], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![taker_ask_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + EXPECTED_FEE + ); + // Maker (buyer) received the base tokens they paid for. + let (buyer_base, _buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); + assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); + + // Taker (seller) received the net-of-fee quote. + let (_seller_base, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); + assert_eq!(seller_quote, EXPECTED_NET_TO_TAKER); +} + +#[test] +fn taker_partially_fills_resting_order_rest_stays_on_book() { + // Seller rests ask qty=100. Buyer bids qty=40 at the same price. + // The ask stays on the book with qty=60 remaining; the taker fully + // matches and rests nothing. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const MAKER_ASK_QUANTITY: u64 = 100; + const TAKER_BID_QUANTITY: u64 = 40; + const PRICE: u64 = 1000; + + let ask_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + MAKER_ASK_QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![ask_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + const TAKER_BID_ID: u64 = 2; + let bid_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + TAKER_BID_QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![bid_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Maker order: still PartiallyFilled, filled_quantity == TAKER_BID_QUANTITY. + let maker_order = order_pda(&sc.program_id, &sc.market, MAKER_ASK_ID); + let (filled, status) = read_order_fill_and_status(&sc.svm, &maker_order); + assert_eq!(filled, TAKER_BID_QUANTITY); + assert_eq!(status, ORDER_STATUS_PARTIALLY_FILLED); + + // Base vault still holds the un-filled portion (seller's lock, minus + // what was delivered to the taker's unsettled_base - which never left + // the vault, just got re-tagged as owed to the buyer). + // + // Total base in vault stays == MAKER_ASK_QUANTITY * BASE_LOT_SIZE, because + // fills are bucket-accounting inside the single vault. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.base_vault.pubkey()).unwrap(), + MAKER_ASK_QUANTITY * BASE_LOT_SIZE + ); + + // Taker received TAKER_BID_QUANTITY lots = TAKER_BID_QUANTITY * BASE_LOT_SIZE raw base tokens. + let (buyer_base, _) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); + assert_eq!(buyer_base, TAKER_BID_QUANTITY * BASE_LOT_SIZE); +} + +#[test] +fn taker_partially_filled_remainder_rests_on_book() { + // Seller rests ask qty=40. Buyer bids qty=100 at the same price. + // Buyer eats the whole ask and the remaining 60 rests on the book as a + // new bid. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const MAKER_ASK_QUANTITY: u64 = 40; + const TAKER_BID_QUANTITY: u64 = 100; + const PRICE: u64 = 1000; + + let ask_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + MAKER_ASK_QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![ask_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + const TAKER_BID_ID: u64 = 2; + let bid_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + TAKER_BID_QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![bid_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Maker ask is fully filled. + let maker_order = order_pda(&sc.program_id, &sc.market, MAKER_ASK_ID); + let (filled, status) = read_order_fill_and_status(&sc.svm, &maker_order); + assert_eq!(filled, MAKER_ASK_QUANTITY); + assert_eq!(status, ORDER_STATUS_FILLED); + + // Taker's own order is PartiallyFilled with `filled_quantity` equal + // to what the maker supplied. + let taker_order = order_pda(&sc.program_id, &sc.market, TAKER_BID_ID); + let (taker_filled, taker_status) = read_order_fill_and_status(&sc.svm, &taker_order); + assert_eq!(taker_filled, MAKER_ASK_QUANTITY); + assert_eq!(taker_status, ORDER_STATUS_PARTIALLY_FILLED); + + // The taker's own Order PDA holds the true remaining-on-book quantity + // (original_quantity - filled_quantity). On-book quantity isn't stored + // on OrderEntry directly - see state/order_book.rs - so this is the + // source of truth both here and at runtime. + assert_eq!( + TAKER_BID_QUANTITY - taker_filled, + TAKER_BID_QUANTITY - MAKER_ASK_QUANTITY + ); +} + +#[test] +fn taker_crosses_multiple_resting_orders_best_price_first() { + // Two resting asks at different prices: 900 and 1000. A taker bid big + // enough to chew through both must hit 900 first (best price for the + // taker), then 1000. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const BEST_ASK_ID: u64 = 1; + const BEST_ASK_PRICE: u64 = 900; + const BEST_ASK_QUANTITY: u64 = 30; + + const SECOND_ASK_ID: u64 = 2; + const SECOND_ASK_PRICE: u64 = 1000; + const SECOND_ASK_QUANTITY: u64 = 50; + + // Taker bids at the worse of the two resting prices so both cross. + const TAKER_BID_ID: u64 = 3; + const TAKER_BID_PRICE: u64 = 1000; + const TAKER_BID_QUANTITY: u64 = BEST_ASK_QUANTITY + SECOND_ASK_QUANTITY; + + // Need to post both asks and both rest - seller places two in sequence. + let ask_one_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + BEST_ASK_ID, + BEST_ASK_PRICE, + BEST_ASK_QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![ask_one_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + let ask_two_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + SECOND_ASK_ID, + SECOND_ASK_PRICE, + SECOND_ASK_QUANTITY, + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![ask_two_ix], + &[&sc.seller], + &sc.seller.pubkey(), + ) + .unwrap(); + + // Taker walks in book order: best ask (900) then second (1000). + let taker_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + TAKER_BID_PRICE, + TAKER_BID_QUANTITY, + &[ + (BEST_ASK_ID, sc.seller_market_user), + (SECOND_ASK_ID, sc.seller_market_user), + ], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![taker_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Both resting asks are fully filled. + let order_one = order_pda(&sc.program_id, &sc.market, BEST_ASK_ID); + let order_two = order_pda(&sc.program_id, &sc.market, SECOND_ASK_ID); + assert_eq!(read_order_fill_and_status(&sc.svm, &order_one).1, ORDER_STATUS_FILLED); + assert_eq!(read_order_fill_and_status(&sc.svm, &order_two).1, ORDER_STATUS_FILLED); + + // Taker got TAKER_BID_QUANTITY lots = TAKER_BID_QUANTITY * BASE_LOT_SIZE raw base tokens. + let (buyer_base, buyer_quote_rebate) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); + assert_eq!(buyer_base, TAKER_BID_QUANTITY * BASE_LOT_SIZE); + + // Price-improvement rebate: taker locked at 1000/unit but 30 units + // filled at 900. Rebate = (1000 - 900) * 30 * quote_lot_size. + const PRICE_IMPROVEMENT_REBATE: u64 = (TAKER_BID_PRICE - BEST_ASK_PRICE) * BEST_ASK_QUANTITY * QUOTE_LOT_SIZE; + assert_eq!(buyer_quote_rebate, PRICE_IMPROVEMENT_REBATE); + + // Seller's net unsettled_quote = sum of (fill_price * fill_qty * quote_lot_size - fee). + let gross_one: u64 = BEST_ASK_PRICE * BEST_ASK_QUANTITY * QUOTE_LOT_SIZE; + let gross_two: u64 = SECOND_ASK_PRICE * SECOND_ASK_QUANTITY * QUOTE_LOT_SIZE; + let fee_one: u64 = fee_ceil(gross_one); + let fee_two: u64 = fee_ceil(gross_two); + let expected_seller_quote = (gross_one - fee_one) + (gross_two - fee_two); + let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); + assert_eq!(seller_quote, expected_seller_quote); +} + +#[test] +fn resting_orders_at_same_price_fill_by_time_priority() { + // Two resting asks at price 1000: first from seller, then from a second + // seller. Taker only buys enough to cross the first one. The second + // must stay on the book untouched. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // Bootstrap a third wallet (second seller) with base tokens. + let second_seller = create_wallet(&mut sc.svm, 10_000_000_000).unwrap(); + let second_seller_base_ata = create_associated_token_account( + &mut sc.svm, + &second_seller.pubkey(), + &sc.base_mint, + &sc.payer, + ) + .unwrap(); + let second_seller_quote_ata = create_associated_token_account( + &mut sc.svm, + &second_seller.pubkey(), + &sc.quote_mint, + &sc.payer, + ) + .unwrap(); + mint_tokens_to_token_account( + &mut sc.svm, + &sc.base_mint, + &second_seller_base_ata, + TRADER_STARTING_BALANCE, + &sc.authority, + ) + .unwrap(); + let second_seller_market_user = market_user_pda(&sc.program_id, &sc.market, &second_seller.pubkey()); + let __ix1 = build_initialize_market_user_ix(&sc, &second_seller.pubkey()); + send_transaction_from_instructions(&mut sc.svm, vec![__ix1], &[&second_seller], + &second_seller.pubkey()).unwrap(); + + const FIRST_ASK_ID: u64 = 1; + const SECOND_ASK_ID: u64 = 2; + const ASK_PRICE_SHARED: u64 = 1000; + const ASK_QUANTITY_EACH: u64 = 20; + + // Seller 1 first in. + let __ix2 = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + FIRST_ASK_ID, + ASK_PRICE_SHARED, + ASK_QUANTITY_EACH, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix2], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + // Seller 2 second in at the same price. + let __ix3 = build_place_order_ix( + &sc, + &second_seller, + second_seller_market_user, + second_seller_base_ata, + second_seller_quote_ata, + order_book::state::OrderSide::Ask, + SECOND_ASK_ID, + ASK_PRICE_SHARED, + ASK_QUANTITY_EACH, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix3], &[&second_seller], + &second_seller.pubkey()).unwrap(); + + // Taker bid buys only enough to cross seller 1's ask. + const TAKER_BID_ID: u64 = 3; + let taker_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + ASK_PRICE_SHARED, + ASK_QUANTITY_EACH, + &[(FIRST_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![taker_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Time priority: seller 1 filled, seller 2 still open. + let order_one = order_pda(&sc.program_id, &sc.market, FIRST_ASK_ID); + let order_two = order_pda(&sc.program_id, &sc.market, SECOND_ASK_ID); + assert_eq!(read_order_fill_and_status(&sc.svm, &order_one).1, ORDER_STATUS_FILLED); + assert_eq!(read_order_fill_and_status(&sc.svm, &order_two).1, ORDER_STATUS_OPEN); +} + +#[test] +fn taker_bid_gets_price_improvement_from_resting_ask() { + // Taker limit 1000, resting ask at 900. Taker pays 900 (maker's price), + // gets 100-per-unit price improvement rebated to their unsettled_quote. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const MAKER_ASK_PRICE: u64 = 900; + const TAKER_BID_PRICE: u64 = 1000; + const QUANTITY: u64 = 50; + + // Maker ask. + let __ix4 = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + MAKER_ASK_PRICE, + QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix4], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + + // Taker bid - limit 1000. + const TAKER_BID_ID: u64 = 2; + let taker_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + TAKER_BID_PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions( + &mut sc.svm, + vec![taker_ix], + &[&sc.buyer], + &sc.buyer.pubkey(), + ) + .unwrap(); + + // Maker got 900-per-unit (minus fee), not 1000. + let gross_to_maker: u64 = MAKER_ASK_PRICE * QUANTITY * QUOTE_LOT_SIZE; + let fee: u64 = fee_ceil(gross_to_maker); + let expected_net_to_maker: u64 = gross_to_maker - fee; + let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); + assert_eq!(seller_quote, expected_net_to_maker); + + // Taker locked (TAKER_BID_PRICE * QUANTITY * QUOTE_LOT_SIZE) up front; + // only (MAKER_ASK_PRICE * QUANTITY * QUOTE_LOT_SIZE) was spent. + let expected_rebate: u64 = (TAKER_BID_PRICE - MAKER_ASK_PRICE) * QUANTITY * QUOTE_LOT_SIZE; + let (buyer_base, buyer_quote) = read_user_unsettled(&sc.svm, &sc.buyer_market_user); + assert_eq!(buyer_base, QUANTITY * BASE_LOT_SIZE); + assert_eq!(buyer_quote, expected_rebate); +} + +#[test] +fn fee_rounds_up_when_gross_is_not_a_bps_multiple() { + // Rounding regression: with fee_bps = 10, a gross of 501 quote tokens + // gives 501 * 10 / 10_000 = 0.501, which must round UP to 1 (protocol- + // favouring ceiling), not down to 0. A floor here would let makers + // fill fee-free with many small orders. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const PRICE: u64 = 501; + const QUANTITY: u64 = 1; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); + // Prove this case actually exercises the rounding edge. + assert!(GROSS * FEE_BASIS_POINTS as u64 % 10_000 != 0); + assert_eq!(EXPECTED_FEE, GROSS * FEE_BASIS_POINTS as u64 / 10_000 + 1); + + let maker_ix = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![maker_ix], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + + const TAKER_BID_ID: u64 = 2; + let taker_ix = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions(&mut sc.svm, vec![taker_ix], &[&sc.buyer], + &sc.buyer.pubkey()).unwrap(); + + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + EXPECTED_FEE + ); + // Maker's unsettled quote is gross minus the rounded-up fee. + let (_, seller_quote) = read_user_unsettled(&sc.svm, &sc.seller_market_user); + assert_eq!(seller_quote, GROSS - EXPECTED_FEE); +} + +#[test] +fn fee_vault_receives_exactly_bps_of_taker_gross() { + // Simpler standalone check of the fee maths: fee_vault must equal + // ceil((taker gross quote) * fee_bps / 10_000) after a single fill. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const PRICE: u64 = 500; + const QUANTITY: u64 = 200; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); + + let __ix5 = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix5], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + + const TAKER_BID_ID: u64 = 2; + let __ix6 = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix6], &[&sc.buyer], &sc.buyer.pubkey()).unwrap(); + + + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + EXPECTED_FEE + ); +} + +#[test] +fn authority_can_withdraw_fees_after_match() { + // Run a fill, confirm fee vault has something, withdraw to authority. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + // Authority needs a quote ATA to receive the withdrawn fees. + let authority_quote_ata = create_associated_token_account( + &mut sc.svm, + &sc.authority.pubkey(), + &sc.quote_mint, + &sc.payer, + ) + .unwrap(); + + const MAKER_ASK_ID: u64 = 1; + const PRICE: u64 = 2000; + const QUANTITY: u64 = 50; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); + + let __ix7 = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix7], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + + const TAKER_BID_ID: u64 = 2; + let __ix8 = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix8], &[&sc.buyer], &sc.buyer.pubkey()).unwrap(); + + + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + EXPECTED_FEE + ); + + let withdraw_ix = build_withdraw_fees_ix(&sc, authority_quote_ata); + send_transaction_from_instructions( + &mut sc.svm, + vec![withdraw_ix], + &[&sc.authority], + &sc.authority.pubkey(), + ) + .unwrap(); + + // Fee vault drained, authority received the fees. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.fee_vault.pubkey()).unwrap(), + 0 + ); + assert_eq!( + get_token_account_balance(&sc.svm, &authority_quote_ata).unwrap(), + EXPECTED_FEE + ); +} + +#[test] +fn settle_funds_after_match_pays_out_both_unsettled_balances() { + // End-to-end: match, then call settle_funds for both sides. Both + // traders must receive the tokens the match credited to their + // unsettled_* balances. + let mut sc = full_setup(); + initialize_market_and_users(&mut sc); + + const MAKER_ASK_ID: u64 = 1; + const PRICE: u64 = 1000; + const QUANTITY: u64 = 100; + const GROSS: u64 = PRICE * QUANTITY * QUOTE_LOT_SIZE; + const EXPECTED_FEE: u64 = fee_ceil(GROSS); + const EXPECTED_NET_QUOTE_TO_SELLER: u64 = GROSS - EXPECTED_FEE; + + // Maker posts and taker crosses. + let __ix9 = build_place_order_ix( + &sc, + &sc.seller, + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + order_book::state::OrderSide::Ask, + MAKER_ASK_ID, + PRICE, + QUANTITY, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix9], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + const TAKER_BID_ID: u64 = 2; + let __ix10 = build_place_order_with_makers_ix( + &sc, + &sc.buyer, + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + order_book::state::OrderSide::Bid, + TAKER_BID_ID, + PRICE, + QUANTITY, + &[(MAKER_ASK_ID, sc.seller_market_user)], + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix10], &[&sc.buyer], &sc.buyer.pubkey()).unwrap(); + + + // Settle both sides. + let __ix11 = build_settle_funds_ix( + &sc, + &sc.buyer.pubkey(), + sc.buyer_market_user, + sc.buyer_base_ata, + sc.buyer_quote_ata, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix11], &[&sc.buyer], + &sc.buyer.pubkey()).unwrap(); + let __ix12 = build_settle_funds_ix( + &sc, + &sc.seller.pubkey(), + sc.seller_market_user, + sc.seller_base_ata, + sc.seller_quote_ata, + ); + send_transaction_from_instructions(&mut sc.svm, vec![__ix12], &[&sc.seller], + &sc.seller.pubkey()).unwrap(); + + // Buyer should now hold `QUANTITY` lots of extra base tokens + // (QUANTITY * BASE_LOT_SIZE raw minor units) and have paid the gross + // quote (starting balance minus gross). No price improvement here, so + // nothing else to refund. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.buyer_base_ata).unwrap(), + QUANTITY * BASE_LOT_SIZE + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.buyer_quote_ata).unwrap(), + TRADER_STARTING_BALANCE - GROSS + ); + + // Seller should now hold (starting - QUANTITY lots) base and + // EXPECTED_NET_QUOTE_TO_SELLER quote. + assert_eq!( + get_token_account_balance(&sc.svm, &sc.seller_base_ata).unwrap(), + TRADER_STARTING_BALANCE - QUANTITY * BASE_LOT_SIZE + ); + assert_eq!( + get_token_account_balance(&sc.svm, &sc.seller_quote_ata).unwrap(), + EXPECTED_NET_QUOTE_TO_SELLER + ); +} + diff --git a/finance/order-book/anchor/README.md b/finance/order-book/anchor/README.md index 0fa7f2f5b..2029f130d 100644 --- a/finance/order-book/anchor/README.md +++ b/finance/order-book/anchor/README.md @@ -1,5 +1,11 @@ # Solana Order Book Exchange (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + This Solana program is an **[order book](https://www.investopedia.com/terms/o/order-book.asp)** exchange: specifically, a **[central limit order book (CLOB)](https://www.investopedia.com/terms/l/limitorderbook.asp)**, the standard piece of market infrastructure used by NYSE, NASDAQ, LSE, CME, and crypto venues like Phoenix, Cube, and OpenBook. Written with Anchor, it runs an onchain order book for a single pair of token mints: diff --git a/finance/perpetual-futures/anchor-v1/.gitignore b/finance/perpetual-futures/anchor-v1/.gitignore new file mode 100644 index 000000000..be06d3aa9 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/.gitignore @@ -0,0 +1,6 @@ +.anchor +target +**/*.rs.bk +node_modules +test-ledger +.DS_Store diff --git a/finance/perpetual-futures/anchor-v1/Anchor.toml b/finance/perpetual-futures/anchor-v1/Anchor.toml new file mode 100644 index 000000000..e16a2097e --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/Anchor.toml @@ -0,0 +1,26 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +perpetual_futures = "3uCm8Jep469pHUpYQCh6eA6dpYV3ogvTvaRDZBPtw5So" +mock_switchboard = "FnisQqhF56BxVYh5Wt8xW8wuTVN6STAGnk13MM5SRM7b" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +# Non-default: the LiteSVM Rust tests load both programs' .so files via +# include_bytes!, so they must be built before `cargo test` runs. CI calls +# `anchor build` first; these waits only matter for the legacy validator path. +[test] +startup_wait = 5000 +shutdown_wait = 2000 diff --git a/finance/perpetual-futures/anchor-v1/CHANGELOG.md b/finance/perpetual-futures/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..61622503a --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +## 2026-08-14 + +Add `set_funding_rate`, so the pool authority can retune `funding_rate_per_slot` +after the pool is created. The rate is quoted per slot, so what a position costs +per hour depends on the cluster's slot time as well as on the rate; Solana lowers +the slot time over time, and a pool created before a reduction charges the +heavier side more per hour than it was set up to. The handler advances the +funding index at the old rate before storing the new one, so slots already +elapsed are charged at the rate that was in force for them. Tested by +`test_set_funding_rate_settles_at_the_old_rate_first` and +`test_only_authority_can_set_funding_rate`. + +Also drop the "at 400ms/slot" gloss from the price-staleness constant: the +window is counted in slots on purpose, and what it comes to in seconds follows +the cluster. + +## 2026-08-04 + +Reject oracle prices from before a cluster restart. A halt stops the slot +count but not the wall clock, so after a restart a feed can look fresh in +slots while its price is hours old; with leverage that error is amplified +market-wide. `read_oracle_price` now also requires the feed's slot to be +after the `LastRestartSlot` sysvar's slot (`PricePredatesRestart`). Tested +by `test_open_rejects_price_from_before_a_restart`. + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/finance/perpetual-futures/anchor-v1/Cargo.toml b/finance/perpetual-futures/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/perpetual-futures/anchor-v1/README.md b/finance/perpetual-futures/anchor-v1/README.md new file mode 100644 index 000000000..5c498cb5d --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/README.md @@ -0,0 +1,241 @@ +# Solana Perpetual Futures (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +A perpetual futures exchange on Solana: a venue for making leveraged bets on an asset's price without ever owning the asset. It is modelled on the oracle-priced, pool-collateralized design used by [Jupiter Perpetuals](https://station.jup.ag/guides/perpetual-exchange/overview) and GMX (and the open-source [`solana-labs/perpetuals`](https://github.com/solana-labs/perpetuals) reference that [Adrena](https://github.com/AdrenaFoundation/adrena-program) and [Flash Trade](https://github.com/flash-trade/flash-perpetuals) fork), rather than the order-book design used by [Drift](https://docs.drift.trade/). + +The collateral is **USDC** (a dollar stablecoin), and the market tracks the price of **NVDAx**, a tokenised Nvidia share whose [oracle](#oracle) price follows the real stock. A second market could track **TSLAx** (Tesla); each market is one collateral token plus one price feed. In the tests these are mock [SPL tokens](https://solana.com/docs/terminology#token). + +A [perpetual future](https://www.investopedia.com/terms/f/futurescontract.asp) ("perp") is a [derivative](https://www.investopedia.com/terms/d/derivative.asp) with no expiry: profit and loss is paid in the collateral token as the price moves, and no stock or coin ever changes hands. + +[⚓ Anchor](.) · [💫 Quasar](../quasar) + +--- + +## Programs + +- `perpetual-futures`: The exchange: pool creation, liquidity provision, opening/closing leveraged positions, funding, liquidation, and fee collection. +- `mock-switchboard`: Test-only price feed. Stores a price, scale, last-update slot, and confidence band that tests write directly. Replaced by a real [Switchboard](https://docs.switchboard.xyz/) On-Demand feed in production. + +All money math is integer `u128` with `checked_*` operations, multiplying before dividing and rounding in the pool's favour: no floats, no fixed-point library. + +--- + +## Key Financial Concepts + +### Long and short, leverage, collateral + +A trader goes [long](https://www.investopedia.com/terms/l/long.asp) if they think the price will rise or [short](https://www.investopedia.com/terms/s/short.asp) if they think it will fall. They post [collateral](https://www.investopedia.com/terms/c/collateral.asp) and choose a position size up to the pool's maximum [leverage](https://www.investopedia.com/terms/l/leverage.asp) (borrowing power). The [notional size](https://www.investopedia.com/terms/n/notionalvalue.asp) is the full exposure (e.g. $5,000 even if only $1,000 of collateral was posted) and profit or loss is the notional times the percentage change in price: + +``` +long profit/loss = size * (price - entry_price) / entry_price +short profit/loss = size * (entry_price - price) / entry_price +``` + +### The liquidity pool and provider shares + +There is no order book. Every trade is against one shared [liquidity pool](https://www.investopedia.com/terms/l/liquidity.asp) that other users fund; the pool is the counterparty to all of them: it pays trader profits and keeps trader losses. Providers receive shares priced against [mark-to-market](https://www.investopedia.com/terms/m/marktomarket.asp) assets-under-management (the pool's value if every open position were settled now), derived from running per-side accumulators rather than by iterating positions. Pricing against the marked value stops a provider exiting just before an in-flight trader profit is realized. The first deposit mints `deposit - MINIMUM_LIQUIDITY` shares (the Uniswap V2 convention) so the share supply never starts at a dust amount. + +### Reserved liquidity + +So a winning trader can always be paid, the pool **reserves** liquidity to back each open position's maximum recoverable profit (its notional `size`). An open is allowed only while `reserved + size <= liquidity`, which doubles as an open-interest cap. `close_position` caps a winner's payout at the reserved `size` (for a long, profit is capped on a more-than-doubling move; a short's profit is naturally within `size`), and provider withdrawals can take only the *free* remainder (`liquidity - reserved`). This is the simplified, single-collateral form of the reserve accounting in `solana-labs/perpetuals`. The reserve covers price profit only: funding owed *to* a position (the lighter side receives funding) is not reserved, so in the extreme a payout the pool cannot cover makes the close fail closed (revert) rather than leave the pool insolvent. + +### Funding + +[Funding](https://www.investopedia.com/terms/f/futurescontract.asp) anchors the pool's risk: the heavier side of [open interest](https://www.investopedia.com/terms/o/openinterest.asp) pays the pool over time. A cumulative funding index rises while longs are the larger side and falls while shorts are, advancing by `funding_rate_per_slot` each [slot](https://solana.com/docs/terminology#slot); a position records the index at open and settles the change when it closes. In a pool-based perp this is the equivalent of the borrow fee Jupiter Perpetuals charges. + +Because the rate is quoted per slot, what a position costs per hour depends on the cluster's slot time as well as on the rate. Solana lowers the slot time over time, so a pool that outlives a reduction charges the heavier side more per hour than it was set up to. `set_funding_rate(funding_rate_per_slot)` lets the pool authority bring it back in line; it advances the index at the old rate first, so slots already elapsed are charged at the rate that was in force for them. + +### Maintenance margin and liquidation + +A position's *equity* is its net collateral plus profit/loss minus funding. Once equity falls to or below the [maintenance margin](https://www.investopedia.com/terms/m/maintenancemargin.asp) (`maintenance_margin_bps` of notional), the position can be [liquidated](https://www.investopedia.com/terms/l/liquidation.asp). Liquidation is permissionless: anyone can crank it and earn the liquidation fee. + +### Oracle + +The mark price comes from an oracle feed. This example validates the price for staleness (by slot), publication after the most recent cluster restart (the `LastRestartSlot` sysvar, because a halt passes hours of wall-clock time in zero slots), positivity, scale, and a [confidence band](https://docs.pyth.network/price-feeds/best-practices#confidence-intervals) that must stay within `max_confidence_bps` of the price: rejecting an uncertain price is one of the most common oracle-safety checks. + +### Fees and slippage + +Open and close fees are charged in [basis points](https://www.investopedia.com/terms/b/basispoint.asp) (1 bp = 0.01%) of notional and accrue to the protocol. Every state-changing handler takes a `minimum_*` / acceptable-price bound (protection against [slippage](https://www.investopedia.com/terms/s/slippage.asp), the gap between the expected and actual fill) and reverts if the bound is breached. Pass `0` to opt out. + +--- + +## Program Flow + +### Participants + +- **Admin** (Pool authority): Operate the market and collect the protocol's slice of trading fees. +- **Carol** (Liquidity provider): Earn fees by funding the pool and being the counterparty to traders. +- **Alice** (Long trader): She has a thesis that NVDA will rise and wants leveraged upside without buying the stock. +- **Bob** (Short trader): He thinks NVDA will fall and wants to profit from the downside. +- **Dave** (Liquidator): Runs a bot that closes under-margined positions to earn the liquidation fee. + +Amounts below are shown in whole USDC; onchain they are base units (× 10⁶). The pool is configured with 10× max leverage, 0.1% open/close fees, a 5% maintenance margin, a 1% liquidation fee, and a 1% maximum oracle confidence band. + +--- + +### Step 1: Admin opens the market + +**Instruction:** `initialize_pool(parameters)` + +**Accounts created:** + +- `Pool` [PDA](https://solana.com/docs/terminology#program-derived-address-pda), seeds `["pool", collateral_mint, oracle_feed]`: parameters, liquidity, reserved liquidity, collateral total, per-side open-interest accumulators, funding index, protocol fees +- `pool_authority` PDA, seeds `["authority", pool]`: nothing; signs vault and mint CPIs +- `custody_vault` [token account](https://solana.com/docs/terminology#token-account) PDA, seeds `["vault", pool]`: all USDC, both provider liquidity and trader collateral +- `lp_mint` PDA, seeds `["lp_mint", pool]`: the share [mint](https://solana.com/docs/terminology#mint-account); `pool_authority` is the mint authority + +--- + +### Step 2: Carol provides liquidity + +**Instruction:** `add_liquidity(amount = 100_000 USDC, minimum_shares_out)` + +**Accounts modified:** + +- `carol_usdc`: −100,000 USDC +- `custody_vault`: +100,000 USDC +- `lp_mint` → `carol_lp` (created): mints ≈100,000 shares to Carol +- `Pool.liquidity`: 0 → 100,000 + +The pool can now pay trader winnings, and Carol holds shares representing her slice of it. + +--- + +### Step 3: Alice opens a 5× long + +**Instruction:** `open_position(side = Long, collateral_amount = 1,000 USDC, size = 5,000 USDC, acceptable_price)` + +NVDAx is at $100. The 0.1% open fee ($5) comes out of her collateral, leaving $995 of net collateral backing the position. + +**Accounts modified:** + +- `Position` PDA `["position", pool, alice, Long]` (created): side Long, collateral $995, size $5,000, entry price $100 +- `alice_usdc`: −1,000 USDC +- `custody_vault`: +1,000 USDC +- `Pool.total_collateral`: +$995 +- `Pool.protocol_fees`: +$5 +- `Pool.reserved_liquidity`: +$5,000 (must stay ≤ liquidity) +- `Pool` long open-interest accumulators: += this position + +--- + +### Step 4: Bob opens a 5× short + +**Instruction:** `open_position(side = Short, collateral_amount = 1,000 USDC, size = 5,000 USDC, acceptable_price)` + +**Accounts modified:** a `Position` PDA `["position", pool, bob, Short]` is created; `custody_vault` +1,000 USDC; `Pool.total_collateral` +$995; `Pool.protocol_fees` +$5; `Pool.reserved_liquidity` +$5,000 (now $10,000 of the $100,000 reserved); short open-interest accumulators rise. + +While both are open, **funding** accrues to the pool from the heavier side; it is settled when each position closes. + +--- + +### Step 5: NVDA rises to $116. Alice closes in profit + +**Instruction:** `close_position(minimum_payout)` + +Her profit is `5,000 × (116 − 100) / 100 = $800` (well under the $5,000 reserve cap), minus the $5 close fee. + +**Accounts modified:** + +- `Pool.liquidity`: −$800 (providers pay her profit) +- `Pool.reserved_liquidity`: −$5,000 (reserve released) +- `Pool.total_collateral`: −$995 +- `Pool.protocol_fees`: +$5 +- long open-interest accumulators: −= this position +- `custody_vault` → `alice_usdc`: pays out $1,790 (net collateral + profit − close fee) +- `Position` (Alice): closed; rent returned to Alice + +--- + +### Step 6: Bob's short is underwater. Dave liquidates it + +**Instruction:** `liquidate_position()` + +At $116 Bob's short has lost $800; his equity ($995 − $800 = $195) has fallen below the 5% maintenance margin ($250), so anyone may close it. + +**Accounts modified:** + +- short open-interest accumulators: −= Bob's position +- `Pool.reserved_liquidity`: −$5,000 (reserve released) +- `Pool.total_collateral`: −$995 +- `Pool.liquidity`: +$800 (the loss accrues to providers) +- `custody_vault` → `dave_usdc` (created): $50 liquidation fee +- `custody_vault` → `bob_usdc`: $145 remaining equity refunded +- `Position` (Bob): closed; rent returned to Bob + +--- + +### Step 7: Admin collects the protocol's fees + +**Instruction:** `collect_fees()` + +**Accounts modified:** `Pool.protocol_fees` → 0; `custody_vault` pays that amount to `admin_usdc`. + +--- + +### Step 8: Carol withdraws + +**Instruction:** `remove_liquidity(shares, minimum_amount_out)` + +Carol burns her shares and redeems USDC. Her balance now reflects the fees the pool earned plus the net of traders' wins and losses while she was in. She can withdraw only the *free* liquidity: while a position is open, the part backing it is reserved and cannot be pulled out. + +**Accounts modified:** `lp_mint` burns Carol's shares; `Pool.liquidity` falls; `custody_vault` pays out USDC to `carol_usdc`. + +--- + +## Design notes and further reading + +The genuinely hard part of a perpetual-futures venue is keeping it solvent and permissionless *without* re-evaluating the entire market on every action. For a rigorous, formally-verified (Kani) treatment, see Anatoly Yakovenko's [percolator](https://github.com/aeyakovenko/percolator), an educational perp risk engine. It states three invariants this example also leans on, in simplified form: + +- **Realizable credit**: "protected principal is senior, positive PnL is junior, and source-domain positive credit cannot exceed realizable backing reserved for that domain." Here, provider capital is senior and trader profit is a junior claim against it: shares are priced against marked assets-under-management, and the pool reserves each position's payout up front (capping recoverable profit at the reserve) so a winner's price profit can always be paid. +- **Account-local safety**: "every favorable action refreshes the account's full active portfolio first; … stale … legs fail closed." Here, every position and liquidity action reads a fresh oracle (stale or wide-confidence prices are rejected) and recomputes pool exposure before any payout. +- **Bounded progress**: "no public instruction needs to evaluate the whole market." Here, assets-under-management comes from running per-side accumulators, and liquidation acts on one position at a time, so no handler's cost grows with the number of open positions. + +What production pool-perps (`solana-labs/perpetuals`) add that this example still leaves out: multi-asset custody with reserves in the payout token, utilization-based borrow fees, auto-deleveraging (ADL) and an insurance fund for the bad-debt tail, and using the oracle's EMA for a less manipulable mark. + +--- + +## Limitations + +This is a teaching example, not an audited exchange. Notably: + +- A single position per side per trader, and one collateral token per pool. +- Recoverable profit is capped at the reserved notional, so the cap binds on a more-than-doubling move; a production venue would let profit run and absorb extreme moves with ADL, an insurance fund, and bankruptcy-residual accounting. +- The liquidation reward is paid from the position's remaining equity, so a position that gaps straight through zero equity pays the liquidator nothing: production venues fund the reward from collateral or an insurance fund so the worst positions are still worth liquidating. +- Funding is a single time-decay index on the heavier side rather than a skew-weighted rate. + +--- + +## Testing + +The tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) and [solana-kite](https://solanakite.org); no local validator is needed. They deploy both programs, drive the mock oracle, and cover liquidity round-trips, opening and closing longs and shorts in profit and loss, leverage and slippage rejection, stale-price, pre-restart-price, and wide-confidence rejection, funding accrual, funding-rate retuning (including that it settles elapsed slots at the old rate, and that only the authority may call it), liquidation (and the refusal to liquidate a healthy position), reserved-liquidity behaviour (profit capped at the reserve, opens rejected when the pool can't back them, withdrawals blocked by reserved liquidity), and fee collection. + +```bash +anchor build +cargo test --manifest-path programs/perpetual-futures/Cargo.toml +``` + +`anchor build` first, so the LiteSVM tests can load each program's compiled `.so` via `include_bytes!`. + +## FAQ + +### How do perpetual futures work on Solana? + +A perp is a derivative with no expiry: traders post USDC collateral and open a leveraged long or short with `open_position`, and their profit or loss tracks an oracle price, paid in the collateral token when they `close_position`. No stock or coin ever changes hands. + +### Who is the counterparty to each trade? + +A shared liquidity pool. Providers fund it with `add_liquidity` and earn the trading and funding fees; the pool pays winners and keeps losers' collateral. This is the pool-collateralized design used by Jupiter Perpetuals and GMX, as opposed to the order-book design used by Drift. + +### How does liquidation work? + +When a position's collateral can no longer cover its loss past the maintenance margin, anyone can call `liquidate_position` to close it. Prices come from the oracle feed on every check. + +### How do I run this example? + +`anchor build`, then `cargo test --manifest-path programs/perpetual-futures/Cargo.toml`. The tests run against LiteSVM with a mock price feed (`initialize_feed`, `set_price`) to drive deterministic price scenarios. diff --git a/finance/perpetual-futures/anchor-v1/TERMINOLOGY.md b/finance/perpetual-futures/anchor-v1/TERMINOLOGY.md new file mode 100644 index 000000000..9ef81ba16 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/TERMINOLOGY.md @@ -0,0 +1,36 @@ +# Perpetual Futures Terminology + +Terms used in this example, in the sense they carry here. + +- **Perpetual future (perp)** — a leveraged derivative position with no expiry + and no settlement date. Profit and loss is paid in the collateral token as the + oracle price moves. +- **Long / short** — a long profits when the price rises, a short when it falls. + Each is the opposite side of the pool's exposure. +- **Collateral** — the token a trader posts to back a position, and the token + liquidity providers deposit. One pool uses one collateral token. +- **Notional size** — the position's exposure in collateral units. Profit and + loss scales with the notional, not with the collateral posted. +- **Leverage** — notional size divided by collateral. A pool caps it at + `max_leverage`. +- **Equity** — a position's current worth: net collateral plus unrealized profit + and loss, minus accrued funding. When equity falls to the maintenance margin, + the position is liquidatable. +- **Maintenance margin** — the minimum equity, as a fraction of notional size, + a position must keep to avoid liquidation. +- **Liquidation** — closing an under-margined position. Permissionless here: any + caller can trigger it and earns the liquidation fee. +- **Funding** — a periodic payment that anchors the pool's risk. The heavier + side of open interest pays funding to the pool over time. +- **Open interest** — the total notional size currently open on a side. +- **Liquidity provider** — a depositor who funds the pool and is the counterparty + to every trade, earning fees in exchange for taking the other side of trader + profit and loss. +- **Assets-under-management** — the marked value of liquidity-provider holdings: + pool liquidity minus the aggregate unrealized profit traders are owed. +- **Liquidity-provider share** — a token representing a pro-rata claim on + assets-under-management. +- **Oracle feed** — the account the pool reads its price from. This example uses + a mock Switchboard On-Demand feed; production points at a real one. +- **Mark price** — the price positions are valued at. Here it is the oracle + price directly, with no separate mark/index distinction. diff --git a/finance/perpetual-futures/anchor-v1/programs/mock-switchboard/Cargo.toml b/finance/perpetual-futures/anchor-v1/programs/mock-switchboard/Cargo.toml new file mode 100644 index 000000000..275ec0d52 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/mock-switchboard/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "mock_switchboard" +version = "0.1.0" +description = "Mock Switchboard On-Demand feed for testing the perpetual-futures program" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "mock_switchboard" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/perpetual-futures/anchor-v1/programs/mock-switchboard/src/lib.rs b/finance/perpetual-futures/anchor-v1/programs/mock-switchboard/src/lib.rs new file mode 100644 index 000000000..2a3f79232 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/mock-switchboard/src/lib.rs @@ -0,0 +1,105 @@ +//! Mock Switchboard On-Demand feed for testing the perpetual-futures program. +//! +//! Real Switchboard On-Demand feeds are program-owned accounts whose data is +//! produced by an offchain oracle network and verified onchain via Ed25519 +//! signatures over the latest price update. That verification path is +//! out-of-scope for this teaching example, so this mock stores a single price +//! the test harness writes directly, plus the slot the update happened in. +//! +//! The perpetual-futures program reads this feed the same way it would read a +//! real feed: load the account, decode the layout, read `price`, `scale`, and +//! `last_update_slot` (see `perpetual_futures::state::oracle`). Swap this +//! program ID for `SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv` (Switchboard +//! On-Demand) and adapt the layout to consume real feeds in production. +//! +//! NOT FOR PRODUCTION. +use anchor_lang::prelude::*; + +declare_id!("FnisQqhF56BxVYh5Wt8xW8wuTVN6STAGnk13MM5SRM7b"); + +#[program] +pub mod mock_switchboard { + use super::*; + + /// Initialize the mock feed with an initial price. The signer becomes the + /// authority allowed to push later price updates. + pub fn initialize_feed( + context: Context, + price: i128, + scale: u32, + confidence: u64, + ) -> Result<()> { + let feed = &mut context.accounts.feed; + feed.authority = context.accounts.authority.key(); + feed.price = price; + feed.scale = scale; + feed.last_update_slot = Clock::get()?.slot; + feed.confidence = confidence; + Ok(()) + } + + /// Push a new price (and confidence band) to the mock feed. In real + /// Switchboard this would be a signed update from the oracle network; here it + /// is an authority-gated write, because the goal is to drive deterministic + /// test scenarios. + pub fn set_price( + context: Context, + price: i128, + confidence: u64, + ) -> Result<()> { + let feed = &mut context.accounts.feed; + feed.price = price; + feed.last_update_slot = Clock::get()?.slot; + feed.confidence = confidence; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeFeedAccountConstraints<'info> { + #[account( + init, + payer = authority, + space = MockFeed::DISCRIMINATOR.len() + MockFeed::INIT_SPACE, + )] + pub feed: Account<'info, MockFeed>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub system_program: Program<'info, System>, +} + +#[derive(Accounts)] +pub struct SetPriceAccountConstraints<'info> { + #[account( + mut, + has_one = authority, + )] + pub feed: Account<'info, MockFeed>, + + pub authority: Signer<'info>, +} + +/// Mock of a Switchboard On-Demand feed. Real feeds carry many more fields +/// (median, range, sample window, signatures) — this is the bare minimum the +/// perpetual-futures program needs to do a price comparison. +#[derive(InitSpace)] +#[account] +pub struct MockFeed { + pub authority: Pubkey, + + /// Signed 128-bit fixed-point price. Real Switchboard prices are also i128. + pub price: i128, + + /// Number of decimal places implied by `price`. E.g. `scale = 8` means + /// `price = 200 * 10^8` represents $200.00000000. + pub scale: u32, + + pub last_update_slot: u64, + + /// Uncertainty band around `price`, in the same fixed point. Real feeds + /// report a standard-deviation-like confidence; consumers reject the price + /// when this is too wide relative to `price`. + pub confidence: u64, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/Cargo.toml b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/Cargo.toml new file mode 100644 index 000000000..5c8300a5d --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/Cargo.toml @@ -0,0 +1,50 @@ +[package] +name = "perpetual_futures" +version = "0.1.0" +description = "Oracle-priced, LP-pool perpetual futures example (Jupiter Perps / GMX-style)" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "perpetual_futures" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed lets add_liquidity create the provider's liquidity-provider +# token account on their first deposit. The provider is the payer, so this does +# not let one party fund another's rent. +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" +# Not used directly. Declared so Cargo feature unification turns on +# `no-entrypoint` for the spl-token that anchor-spl pulls in; without it the +# integration-test binary links two `entrypoint` symbols (this program's and +# spl-token's) and fails. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } +# For the LastRestartSlot sysvar (not re-exported by anchor-lang): the oracle +# reader rejects prices from before a cluster restart. Same major as the +# solana-sysvar anchor-lang itself uses, so only one copy is compiled in. +solana-sysvar = "3" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" +# The LiteSVM tests load the compiled mock oracle program; depending on the +# crate here lets the tests reuse its instruction-argument types and program ID. +mock_switchboard = { path = "../mock-switchboard", features = ["no-entrypoint"] } + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/constants.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/constants.rs new file mode 100644 index 000000000..1d71245f7 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/constants.rs @@ -0,0 +1,51 @@ +use anchor_lang::prelude::*; + +/// Basis-point denominator: 100% = 10_000 bps. All fee and margin parameters are +/// expressed in basis points and divided by this. +#[constant] +pub const BASIS_POINTS_DENOMINATOR: u64 = 10_000; + +/// Fixed-point precision for the cumulative funding index. The index is carried +/// as `i128` scaled by this factor so per-slot funding (a tiny ratio) keeps its +/// precision when integrated over many slots. +pub const FUNDING_PRECISION: i128 = 1_000_000_000; + +/// Fixed-point precision for the aggregate `size / entry_price` accumulators the +/// pool keeps per side. Lets mark-to-market assets-under-management be computed +/// from two running sums instead of iterating every open position. +pub const SIZE_PRECISION: u128 = 1_000_000_000; + +/// Liquidity-provider shares withheld from the first deposit. The first +/// depositor receives `deposit - MINIMUM_LIQUIDITY` shares rather than the full +/// amount, the same convention Uniswap V2 uses, so the share supply can never be +/// driven to a dust amount that rounding could exploit. (Share value here is +/// priced off tracked liquidity, not the vault token balance, so a direct +/// donation to the vault cannot move it.) +#[constant] +pub const MINIMUM_LIQUIDITY: u64 = 1_000; + +/// Reject an oracle price older than this many slots. Slot count is what the +/// runtime guarantees; unix timestamps are validator-influenced. How long the +/// window is in seconds follows the cluster's slot time, which the protocol +/// lowers over time, so the window tightens on its own and never loosens. +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 150; + +/// Upper bound on the per-pool `max_leverage` parameter, so a pool cannot be +/// configured with an absurd leverage that makes every position instantly +/// liquidatable on the smallest price move. +pub const MAX_LEVERAGE_CEILING: u16 = 100; + +#[constant] +pub const POOL_SEED: &[u8] = b"pool"; + +#[constant] +pub const AUTHORITY_SEED: &[u8] = b"authority"; + +#[constant] +pub const LP_MINT_SEED: &[u8] = b"lp_mint"; + +#[constant] +pub const VAULT_SEED: &[u8] = b"vault"; + +#[constant] +pub const POSITION_SEED: &[u8] = b"position"; diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/errors.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/errors.rs new file mode 100644 index 000000000..94509f063 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/errors.rs @@ -0,0 +1,61 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum PerpError { + #[msg("Amount must be greater than zero")] + ZeroAmount, + + #[msg("First deposit must exceed the locked minimum liquidity")] + DepositTooSmall, + + #[msg("Computed share or token amount rounded down to zero")] + AmountRoundsToZero, + + #[msg("Arithmetic overflow")] + MathOverflow, + + #[msg("Requested leverage exceeds the pool maximum")] + LeverageTooHigh, + + #[msg("Pool parameter is outside the allowed range")] + InvalidParameter, + + #[msg("Oracle price has not been updated recently enough")] + StalePrice, + + #[msg("Oracle price must be positive")] + NonPositivePrice, + + #[msg("Oracle feed scale does not match the pool configuration")] + OracleScaleMismatch, + + #[msg("Oracle feed account data is too short to decode")] + OracleDataTooShort, + + #[msg("Oracle price confidence band is too wide to trust")] + OracleConfidenceTooWide, + + #[msg("Fill price is worse than the caller's acceptable price")] + SlippageExceeded, + + #[msg("Pool does not have enough free liquidity to satisfy this request")] + InsufficientLiquidity, + + #[msg("Posted collateral does not cover the open fee")] + InsufficientCollateral, + + #[msg("Pool is insolvent: liabilities exceed assets")] + PoolInsolvent, + + #[msg("Position is still healthy and cannot be liquidated")] + PositionHealthy, + + #[msg("Position equity is below maintenance margin; it must be liquidated, not closed")] + PositionNotHealthy, + + #[msg("No protocol fees are available to collect")] + NothingToClaim, + + #[msg("Oracle price is stale: it predates the last cluster restart")] + PricePredatesRestart, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/add_liquidity.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/add_liquidity.rs new file mode 100644 index 000000000..5b174f7ec --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/add_liquidity.rs @@ -0,0 +1,144 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + mint_to, transfer_checked, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::constants::{AUTHORITY_SEED, MINIMUM_LIQUIDITY, POOL_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{liquidity_provider_aum, refresh_price_and_funding}; +use crate::state::Pool; + +pub fn handle_add_liquidity( + context: Context, + amount: u64, + minimum_shares_out: u64, +) -> Result<()> { + require!(amount > 0, PerpError::ZeroAmount); + + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let lp_supply = context.accounts.lp_mint.supply; + let shares: u64 = if lp_supply == 0 { + // Bootstrap: shares track collateral one-for-one, less the withheld + // minimum, so the share supply can never start at a dust amount. + amount + .checked_sub(MINIMUM_LIQUIDITY) + .ok_or(PerpError::DepositTooSmall)? + } else { + // shares = amount * supply / assets-under-management, floored so the + // depositor never receives more than their pro-rata claim. + let aum = liquidity_provider_aum(pool, price)?; + require!(aum > 0, PerpError::PoolInsolvent); + (amount as u128) + .checked_mul(lp_supply as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(aum as u128) + .ok_or(PerpError::MathOverflow)? + .try_into() + .map_err(|_| PerpError::MathOverflow)? + }; + + require!(shares > 0, PerpError::AmountRoundsToZero); + require!(shares >= minimum_shares_out, PerpError::SlippageExceeded); + + // Effects before interactions: record the new liquidity, then move tokens. + pool.liquidity = pool + .liquidity + .checked_add(amount) + .ok_or(PerpError::MathOverflow)?; + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.provider_collateral.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.custody_vault.to_account_info(), + authority: context.accounts.provider.to_account_info(), + }, + ), + amount, + context.accounts.collateral_mint.decimals, + )?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + mint_to( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.lp_mint.to_account_info(), + to: context.accounts.provider_lp.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + shares, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct AddLiquidityAccountConstraints<'info> { + #[account(mut)] + pub provider: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = lp_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + /// CHECK: PDA authority over the vault and liquidity-provider mint. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account(mut)] + pub lp_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_collateral: Box>, + + #[account( + init_if_needed, + payer = provider, + associated_token::mint = lp_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_lp: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/close_position.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/close_position.rs new file mode 100644 index 000000000..fd50ea002 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/close_position.rs @@ -0,0 +1,144 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, POSITION_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{basis_points_of, refresh_price_and_funding, settle_position}; +use crate::state::{Pool, Position}; + +pub fn handle_close_position( + context: Context, + minimum_payout: u64, +) -> Result<()> { + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let position = &context.accounts.position; + let position_size = position.size; + let settlement = settle_position(pool, position, price)?; + let close_fee = basis_points_of(position_size, pool.close_fee_bps)?; + + // Recoverable profit is capped at the reserved amount (the position's + // notional `size`), so the pool can always cover a winner. Losses are not + // capped. + let realized_pnl = settlement.profit_and_loss.min(position_size as i128); + let equity = settlement + .equity + .checked_sub(settlement.profit_and_loss) + .ok_or(PerpError::MathOverflow)? + .checked_add(realized_pnl) + .ok_or(PerpError::MathOverflow)?; + + // The trader receives their equity minus the close fee. A non-positive + // payout means the position is underwater and must go through liquidation, + // not a voluntary close. + let payout = equity + .checked_sub(close_fee as i128) + .ok_or(PerpError::MathOverflow)?; + require!(payout > 0, PerpError::PositionNotHealthy); + let payout: u64 = payout.try_into().map_err(|_| PerpError::MathOverflow)?; + require!(payout >= minimum_payout, PerpError::SlippageExceeded); + + // Release the position's reserved liquidity now that it is closing. + pool.reserved_liquidity = pool + .reserved_liquidity + .checked_sub(position_size) + .ok_or(PerpError::MathOverflow)?; + + // Liquidity providers are the counterparty: they pay the trader's (capped) + // profit and receive their loss, and collect the funding the trader owed. + let liquidity_delta = settlement + .funding + .checked_sub(realized_pnl) + .ok_or(PerpError::MathOverflow)?; + let new_liquidity = (pool.liquidity as i128) + .checked_add(liquidity_delta) + .ok_or(PerpError::MathOverflow)?; + require!(new_liquidity >= 0, PerpError::PoolInsolvent); + pool.liquidity = new_liquidity + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + pool.protocol_fees = pool + .protocol_fees + .checked_add(close_fee) + .ok_or(PerpError::MathOverflow)?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.trader_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + payout, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct ClosePositionAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + #[account( + mut, + close = owner, + seeds = [POSITION_SEED, pool.key().as_ref(), owner.key().as_ref(), position.side.as_seed()], + bump = position.bump, + has_one = owner, + has_one = pool, + )] + pub position: Box>, + + /// CHECK: PDA authority over the vault. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = owner, + associated_token::token_program = token_program, + )] + pub trader_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/collect_fees.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/collect_fees.rs new file mode 100644 index 000000000..e97c68853 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/collect_fees.rs @@ -0,0 +1,82 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::state::Pool; + +pub fn handle_collect_fees(context: Context) -> Result<()> { + let pool = &mut context.accounts.pool; + let amount = pool.protocol_fees; + require!(amount > 0, PerpError::NothingToClaim); + + // Effects before interaction: zero the balance, then transfer. + pool.protocol_fees = 0; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.authority_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + amount, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct CollectFeesAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = authority, + has_one = collateral_mint, + has_one = custody_vault, + )] + pub pool: Box>, + + /// CHECK: PDA authority over the vault. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + init_if_needed, + payer = authority, + associated_token::mint = collateral_mint, + associated_token::authority = authority, + associated_token::token_program = token_program, + )] + pub authority_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/initialize_pool.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/initialize_pool.rs new file mode 100644 index 000000000..3699414cb --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/initialize_pool.rs @@ -0,0 +1,162 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::constants::{ + AUTHORITY_SEED, BASIS_POINTS_DENOMINATOR, LP_MINT_SEED, MAX_LEVERAGE_CEILING, POOL_SEED, + VAULT_SEED, +}; +use crate::errors::PerpError; +use crate::state::Pool; + +/// Trading parameters set once at pool creation. Bundled into one struct so the +/// instruction signature stays readable. +#[derive(AnchorSerialize, AnchorDeserialize, Clone)] +pub struct PoolParameters { + /// Decimal places the oracle quotes its price in (e.g. 8). + pub oracle_scale: u32, + + /// Funding accrued per slot, in `FUNDING_PRECISION` units, charged to the + /// heavier side. + pub funding_rate_per_slot: u64, + + pub open_fee_bps: u16, + pub close_fee_bps: u16, + pub max_leverage: u16, + pub maintenance_margin_bps: u16, + pub liquidation_fee_bps: u16, + + /// Maximum oracle confidence band tolerated, in basis points of the price. + pub max_confidence_bps: u16, +} + +pub fn handle_initialize_pool( + context: Context, + parameters: PoolParameters, +) -> Result<()> { + let denominator = BASIS_POINTS_DENOMINATOR as u16; + require!( + parameters.max_leverage >= 1 && parameters.max_leverage <= MAX_LEVERAGE_CEILING, + PerpError::InvalidParameter + ); + require!( + parameters.open_fee_bps < denominator, + PerpError::InvalidParameter + ); + require!( + parameters.close_fee_bps < denominator, + PerpError::InvalidParameter + ); + require!( + parameters.liquidation_fee_bps < denominator, + PerpError::InvalidParameter + ); + // Maintenance margin must leave room above zero and below full notional; + // a position is liquidatable once equity drops to this fraction of size. + require!( + parameters.maintenance_margin_bps > 0 && parameters.maintenance_margin_bps < denominator, + PerpError::InvalidParameter + ); + // close_position deducts the close fee from equity and refuses a + // non-positive payout, while liquidation only acts at or below the + // maintenance margin. The margin must therefore exceed the close fee, or a + // position could be stranded in between: too healthy to liquidate, too poor + // to pay the fee to close. + require!( + parameters.maintenance_margin_bps > parameters.close_fee_bps, + PerpError::InvalidParameter + ); + // Zero would reject every real feed (which always reports some uncertainty); + // above 100% is meaningless. Anything in between is a valid risk choice. + require!( + parameters.max_confidence_bps > 0 && parameters.max_confidence_bps < denominator, + PerpError::InvalidParameter + ); + + let pool = &mut context.accounts.pool; + pool.authority = context.accounts.authority.key(); + pool.collateral_mint = context.accounts.collateral_mint.key(); + pool.oracle_feed = context.accounts.oracle_feed.key(); + pool.oracle_scale = parameters.oracle_scale; + pool.custody_vault = context.accounts.custody_vault.key(); + pool.lp_mint = context.accounts.lp_mint.key(); + pool.liquidity = 0; + pool.reserved_liquidity = 0; + pool.total_collateral = 0; + pool.protocol_fees = 0; + pool.long_size = 0; + pool.short_size = 0; + pool.long_size_scaled = 0; + pool.short_size_scaled = 0; + pool.cumulative_funding = 0; + pool.last_funding_slot = Clock::get()?.slot; + pool.funding_rate_per_slot = parameters.funding_rate_per_slot; + pool.open_fee_bps = parameters.open_fee_bps; + pool.close_fee_bps = parameters.close_fee_bps; + pool.max_leverage = parameters.max_leverage; + pool.maintenance_margin_bps = parameters.maintenance_margin_bps; + pool.liquidation_fee_bps = parameters.liquidation_fee_bps; + pool.max_confidence_bps = parameters.max_confidence_bps; + pool.bump = context.bumps.pool; + pool.authority_bump = context.bumps.pool_authority; + + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializePoolAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + init, + payer = authority, + space = Pool::DISCRIMINATOR.len() + Pool::INIT_SPACE, + seeds = [POOL_SEED, collateral_mint.key().as_ref(), oracle_feed.key().as_ref()], + bump, + )] + pub pool: Box>, + + pub collateral_mint: Box>, + + /// CHECK: The oracle feed account. Its key is stored on the pool and every + /// read validates the layout, scale, and freshness; it is never trusted by + /// type. Swap for a real Switchboard feed in production. + pub oracle_feed: UncheckedAccount<'info>, + + /// CHECK: PDA that owns the vault and the liquidity-provider mint. Holds no + /// data; used only to sign vault and mint CPIs. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + #[account( + init, + payer = authority, + seeds = [LP_MINT_SEED, pool.key().as_ref()], + bump, + mint::decimals = collateral_mint.decimals, + mint::authority = pool_authority, + mint::token_program = token_program, + )] + pub lp_mint: Box>, + + #[account( + init, + payer = authority, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + token::mint = collateral_mint, + token::authority = pool_authority, + token::token_program = token_program, + )] + pub custody_vault: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/liquidate_position.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/liquidate_position.rs new file mode 100644 index 000000000..26c87d25e --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/liquidate_position.rs @@ -0,0 +1,172 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, POSITION_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{basis_points_of, refresh_price_and_funding, settle_position}; +use crate::state::{Pool, Position}; + +pub fn handle_liquidate_position( + context: Context, +) -> Result<()> { + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let position = &context.accounts.position; + let position_size = position.size; + let settlement = settle_position(pool, position, price)?; + + // Release the position's reserved liquidity now that it is closing. + pool.reserved_liquidity = pool + .reserved_liquidity + .checked_sub(position_size) + .ok_or(PerpError::MathOverflow)?; + + // Liquidatable only once equity has fallen to or below the maintenance + // margin. A healthy position can only be closed by its owner. + let maintenance = basis_points_of(position_size, pool.maintenance_margin_bps)?; + require!( + settlement.equity <= maintenance as i128, + PerpError::PositionHealthy + ); + + // The liquidator's reward comes out of whatever equity remains, capped so a + // position already past zero equity cannot pay out more than it has. + let remaining_equity: u64 = settlement + .equity + .max(0) + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + let liquidation_fee = basis_points_of(position.size, pool.liquidation_fee_bps)?; + let liquidator_payout = liquidation_fee.min(remaining_equity); + let trader_refund = remaining_equity + .checked_sub(liquidator_payout) + .ok_or(PerpError::MathOverflow)?; + + // Everything the trader does not get back stays with the liquidity + // providers. Derived from vault conservation: the pool keeps the position's + // collateral minus whatever is paid out as equity. + let liquidity_delta = (position.collateral as i128) + .checked_sub(remaining_equity as i128) + .ok_or(PerpError::MathOverflow)?; + let new_liquidity = (pool.liquidity as i128) + .checked_add(liquidity_delta) + .ok_or(PerpError::MathOverflow)?; + require!(new_liquidity >= 0, PerpError::PoolInsolvent); + pool.liquidity = new_liquidity + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + + if liquidator_payout > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.liquidator_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + liquidator_payout, + context.accounts.collateral_mint.decimals, + )?; + } + + if trader_refund > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.trader_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + trader_refund, + context.accounts.collateral_mint.decimals, + )?; + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct LiquidatePositionAccountConstraints<'info> { + #[account(mut)] + pub liquidator: Signer<'info>, + + /// CHECK: the position owner, validated by the position's `has_one = owner`. + /// Receives the position account's rent and any equity refund. + #[account(mut)] + pub owner: UncheckedAccount<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + #[account( + mut, + close = owner, + seeds = [POSITION_SEED, pool.key().as_ref(), owner.key().as_ref(), position.side.as_seed()], + bump = position.bump, + has_one = owner, + has_one = pool, + )] + pub position: Box>, + + /// CHECK: PDA authority over the vault. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = owner, + associated_token::token_program = token_program, + )] + pub trader_collateral: Box>, + + #[account( + init_if_needed, + payer = liquidator, + associated_token::mint = collateral_mint, + associated_token::authority = liquidator, + associated_token::token_program = token_program, + )] + pub liquidator_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/mod.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/mod.rs new file mode 100644 index 000000000..9a7210c28 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/mod.rs @@ -0,0 +1,18 @@ +pub mod add_liquidity; +pub mod close_position; +pub mod collect_fees; +pub mod initialize_pool; +pub mod liquidate_position; +pub mod open_position; +pub mod remove_liquidity; +pub mod set_funding_rate; +pub mod shared; + +pub use add_liquidity::*; +pub use close_position::*; +pub use collect_fees::*; +pub use initialize_pool::*; +pub use liquidate_position::*; +pub use open_position::*; +pub use remove_liquidity::*; +pub use set_funding_rate::*; diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/open_position.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/open_position.rs new file mode 100644 index 000000000..8c3ec8dc9 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/open_position.rs @@ -0,0 +1,176 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{POOL_SEED, POSITION_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{basis_points_of, refresh_price_and_funding, scale_size}; +use crate::state::{Pool, Position, Side}; + +pub fn handle_open_position( + context: Context, + side: Side, + collateral_amount: u64, + size: u64, + acceptable_price: u64, +) -> Result<()> { + require!(collateral_amount > 0 && size > 0, PerpError::ZeroAmount); + + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + // Slippage: a long must not fill above the caller's limit, a short not + // below it. `0` opts out. + if acceptable_price != 0 { + let acceptable = match side { + Side::Long => price <= acceptable_price, + Side::Short => price >= acceptable_price, + }; + require!(acceptable, PerpError::SlippageExceeded); + } + + // The open fee is taken out of the posted collateral; the rest backs the + // position. Leverage and margin are measured against this net collateral. + let open_fee = basis_points_of(size, pool.open_fee_bps)?; + let net_collateral = collateral_amount + .checked_sub(open_fee) + .ok_or(PerpError::InsufficientCollateral)?; + require!(net_collateral > 0, PerpError::ZeroAmount); + + let max_notional = (net_collateral as u128) + .checked_mul(pool.max_leverage as u128) + .ok_or(PerpError::MathOverflow)?; + require!(size as u128 <= max_notional, PerpError::LeverageTooHigh); + + // Refuse a position that would open already inside the liquidation band. + let maintenance = basis_points_of(size, pool.maintenance_margin_bps)?; + require!(net_collateral > maintenance, PerpError::PositionNotHealthy); + + // Reserve liquidity to cover this position's maximum recoverable profit + // (its notional `size`). The reserve must be backed by liquidity-provider + // capital, which also caps total open interest at the pool's liquidity. + let new_reserved = pool + .reserved_liquidity + .checked_add(size) + .ok_or(PerpError::MathOverflow)?; + require!( + new_reserved <= pool.liquidity, + PerpError::InsufficientLiquidity + ); + pool.reserved_liquidity = new_reserved; + + let size_scaled = scale_size(size, price)?; + + // Effects: record the position and the pool's new aggregates before moving + // any tokens. + let position = &mut context.accounts.position; + position.owner = context.accounts.owner.key(); + position.pool = pool.key(); + position.side = side; + position.collateral = net_collateral; + position.size = size; + position.entry_price = price; + position.size_scaled = size_scaled; + position.entry_funding = pool.cumulative_funding; + position.bump = context.bumps.position; + + pool.total_collateral = pool + .total_collateral + .checked_add(net_collateral) + .ok_or(PerpError::MathOverflow)?; + pool.protocol_fees = pool + .protocol_fees + .checked_add(open_fee) + .ok_or(PerpError::MathOverflow)?; + + match side { + Side::Long => { + pool.long_size = pool + .long_size + .checked_add(size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.long_size_scaled = pool + .long_size_scaled + .checked_add(size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + Side::Short => { + pool.short_size = pool + .short_size + .checked_add(size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.short_size_scaled = pool + .short_size_scaled + .checked_add(size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + } + + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.trader_collateral.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.custody_vault.to_account_info(), + authority: context.accounts.owner.to_account_info(), + }, + ), + collateral_amount, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +#[instruction(side: Side)] +pub struct OpenPositionAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + #[account( + init, + payer = owner, + space = Position::DISCRIMINATOR.len() + Position::INIT_SPACE, + seeds = [POSITION_SEED, pool.key().as_ref(), owner.key().as_ref(), side.as_seed()], + bump, + )] + pub position: Box>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = owner, + associated_token::token_program = token_program, + )] + pub trader_collateral: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/remove_liquidity.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/remove_liquidity.rs new file mode 100644 index 000000000..2426c556c --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/remove_liquidity.rs @@ -0,0 +1,148 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + burn, transfer_checked, Burn, Mint, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::constants::{AUTHORITY_SEED, POOL_SEED, VAULT_SEED}; +use crate::errors::PerpError; +use crate::instructions::shared::{liquidity_provider_aum, refresh_price_and_funding}; +use crate::state::Pool; + +pub fn handle_remove_liquidity( + context: Context, + shares: u64, + minimum_amount_out: u64, +) -> Result<()> { + require!(shares > 0, PerpError::ZeroAmount); + + let pool = &mut context.accounts.pool; + let price = refresh_price_and_funding(pool, &context.accounts.oracle_feed)?; + + let lp_supply = context.accounts.lp_mint.supply; + let aum = liquidity_provider_aum(pool, price)?; + require!(aum > 0, PerpError::PoolInsolvent); + + // amount_out = shares * assets-under-management / supply, floored. + let amount_out: u64 = (shares as u128) + .checked_mul(aum as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(lp_supply as u128) + .ok_or(PerpError::MathOverflow)? + .try_into() + .map_err(|_| PerpError::MathOverflow)?; + + require!(amount_out > 0, PerpError::AmountRoundsToZero); + // Only free liquidity can leave: the portion reserved to cover open + // positions' payouts stays put, so a winning trader can always be paid. A + // provider wanting more must wait for positions to close. + let free_liquidity = pool + .liquidity + .checked_sub(pool.reserved_liquidity) + .ok_or(PerpError::MathOverflow)?; + require!( + amount_out <= free_liquidity, + PerpError::InsufficientLiquidity + ); + require!( + amount_out >= minimum_amount_out, + PerpError::SlippageExceeded + ); + + pool.liquidity = pool + .liquidity + .checked_sub(amount_out) + .ok_or(PerpError::MathOverflow)?; + + burn( + CpiContext::new( + context.accounts.token_program.key(), + Burn { + mint: context.accounts.lp_mint.to_account_info(), + from: context.accounts.provider_lp.to_account_info(), + authority: context.accounts.provider.to_account_info(), + }, + ), + shares, + )?; + + let pool_key = pool.key(); + let authority_seeds: &[&[u8]] = &[AUTHORITY_SEED, pool_key.as_ref(), &[pool.authority_bump]]; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.custody_vault.to_account_info(), + mint: context.accounts.collateral_mint.to_account_info(), + to: context.accounts.provider_collateral.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + &[authority_seeds], + ), + amount_out, + context.accounts.collateral_mint.decimals, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct RemoveLiquidityAccountConstraints<'info> { + #[account(mut)] + pub provider: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = collateral_mint, + has_one = lp_mint, + has_one = custody_vault, + has_one = oracle_feed, + )] + pub pool: Box>, + + /// CHECK: PDA authority over the vault and liquidity-provider mint. + #[account( + seeds = [AUTHORITY_SEED, pool.key().as_ref()], + bump = pool.authority_bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the pool. + pub oracle_feed: UncheckedAccount<'info>, + + pub collateral_mint: Box>, + + #[account(mut)] + pub lp_mint: Box>, + + #[account( + mut, + seeds = [VAULT_SEED, pool.key().as_ref()], + bump, + )] + pub custody_vault: Box>, + + #[account( + mut, + associated_token::mint = collateral_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_collateral: Box>, + + #[account( + mut, + associated_token::mint = lp_mint, + associated_token::authority = provider, + associated_token::token_program = token_program, + )] + pub provider_lp: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/set_funding_rate.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/set_funding_rate.rs new file mode 100644 index 000000000..03a98fb05 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/set_funding_rate.rs @@ -0,0 +1,37 @@ +use anchor_lang::prelude::*; + +use crate::constants::POOL_SEED; +use crate::instructions::shared::accrue_funding; +use crate::state::Pool; + +/// Retune the pool's funding rate. The rate is quoted per slot, so the wall-clock +/// cost of holding a position depends on the cluster's slot time as well as on +/// this number: shorten the slot and the same rate charges the heavier side more +/// per hour. Solana lowers the slot time over time, so a pool that outlives a +/// reduction needs its rate brought back in line. +/// +/// Funding is accrued at the old rate first, so the slots already elapsed are +/// charged at the rate that was in force for them rather than repriced by the +/// new one. +pub fn handle_set_funding_rate( + context: Context, + funding_rate_per_slot: u64, +) -> Result<()> { + let pool = &mut context.accounts.pool; + accrue_funding(pool, Clock::get()?.slot)?; + pool.funding_rate_per_slot = funding_rate_per_slot; + Ok(()) +} + +#[derive(Accounts)] +pub struct SetFundingRateAccountConstraints<'info> { + pub authority: Signer<'info>, + + #[account( + mut, + seeds = [POOL_SEED, pool.collateral_mint.as_ref(), pool.oracle_feed.as_ref()], + bump = pool.bump, + has_one = authority, + )] + pub pool: Box>, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/shared.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/shared.rs new file mode 100644 index 000000000..e8e322092 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/instructions/shared.rs @@ -0,0 +1,224 @@ +use anchor_lang::prelude::*; + +use crate::constants::{BASIS_POINTS_DENOMINATOR, FUNDING_PRECISION, SIZE_PRECISION}; +use crate::errors::PerpError; +use crate::state::{Pool, Position, Side}; + +/// Result of removing a position from the pool's aggregates. All figures are in +/// collateral base units; `equity` is what the trader's position is worth +/// before any close or liquidation fee. +pub struct Settlement { + pub profit_and_loss: i128, + pub funding: i128, + pub equity: i128, +} + +/// Settle a position against the current `price`: compute its profit/loss, +/// funding owed, and equity, then remove its open interest and collateral from +/// the pool's aggregates. Does not touch `pool.liquidity` or move tokens — the +/// caller applies the side that differs between closing and liquidating. +pub fn settle_position(pool: &mut Pool, position: &Position, price: u64) -> Result { + let profit_and_loss = position_pnl(position.side, position.size, position.entry_price, price)?; + let funding = position_funding( + position.side, + position.size, + position.entry_funding, + pool.cumulative_funding, + )?; + + let equity = (position.collateral as i128) + .checked_add(profit_and_loss) + .ok_or(PerpError::MathOverflow)? + .checked_sub(funding) + .ok_or(PerpError::MathOverflow)?; + + match position.side { + Side::Long => { + pool.long_size = pool + .long_size + .checked_sub(position.size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.long_size_scaled = pool + .long_size_scaled + .checked_sub(position.size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + Side::Short => { + pool.short_size = pool + .short_size + .checked_sub(position.size as u128) + .ok_or(PerpError::MathOverflow)?; + pool.short_size_scaled = pool + .short_size_scaled + .checked_sub(position.size_scaled) + .ok_or(PerpError::MathOverflow)?; + } + } + + pool.total_collateral = pool + .total_collateral + .checked_sub(position.collateral) + .ok_or(PerpError::MathOverflow)?; + + Ok(Settlement { + profit_and_loss, + funding, + equity, + }) +} + +/// Advance the pool's cumulative funding index to `current_slot`. +/// +/// The heavier open-interest side pays funding to the pool: while longs are +/// larger the index rises (longs owe), while shorts are larger it falls (shorts +/// owe). No positions means no one to charge, so the index is left untouched and +/// only the timestamp moves forward. +pub fn accrue_funding(pool: &mut Pool, current_slot: u64) -> Result<()> { + let elapsed = current_slot.saturating_sub(pool.last_funding_slot); + if elapsed == 0 { + return Ok(()); + } + + if pool.long_size != 0 || pool.short_size != 0 { + let magnitude = (pool.funding_rate_per_slot as i128) + .checked_mul(elapsed as i128) + .ok_or(PerpError::MathOverflow)?; + let delta = if pool.long_size >= pool.short_size { + magnitude + } else { + -magnitude + }; + pool.cumulative_funding = pool + .cumulative_funding + .checked_add(delta) + .ok_or(PerpError::MathOverflow)?; + } + + pool.last_funding_slot = current_slot; + Ok(()) +} + +/// A position's contribution to the pool's `*_size_scaled` accumulator. +/// `entry_price` is always positive (oracle prices are validated `> 0`). +pub fn scale_size(size: u64, entry_price: u64) -> Result { + (size as u128) + .checked_mul(SIZE_PRECISION) + .ok_or(PerpError::MathOverflow)? + .checked_div(entry_price as u128) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Signed profit/loss of one position at `price`, in collateral base units. +/// Longs profit when price rises, shorts when it falls. +pub fn position_pnl(side: Side, size: u64, entry_price: u64, price: u64) -> Result { + let size = size as i128; + let entry = entry_price as i128; + let price = price as i128; + + let price_change = match side { + Side::Long => price.checked_sub(entry), + Side::Short => entry.checked_sub(price), + } + .ok_or(PerpError::MathOverflow)?; + + // Multiply before dividing to keep precision; `entry > 0` is guaranteed. + size.checked_mul(price_change) + .ok_or(PerpError::MathOverflow)? + .checked_div(entry) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Aggregate unrealized profit/loss of every open trader at `price`, derived +/// from the pool's running accumulators rather than iterating positions. +/// Positive means traders are collectively up (and the pool is down). +/// +/// Profit is marked uncapped here: a position already past the reserved-profit +/// cap is carried at more than the pool will actually pay out, so +/// assets-under-management reads slightly low until that position closes. +pub fn traders_unrealized_pnl(pool: &Pool, price: u64) -> Result { + let price = price as i128; + let size_precision = SIZE_PRECISION as i128; + + let long_value = price + .checked_mul(pool.long_size_scaled as i128) + .ok_or(PerpError::MathOverflow)? + .checked_div(size_precision) + .ok_or(PerpError::MathOverflow)?; + let long_pnl = long_value + .checked_sub(pool.long_size as i128) + .ok_or(PerpError::MathOverflow)?; + + let short_value = price + .checked_mul(pool.short_size_scaled as i128) + .ok_or(PerpError::MathOverflow)? + .checked_div(size_precision) + .ok_or(PerpError::MathOverflow)?; + let short_pnl = (pool.short_size as i128) + .checked_sub(short_value) + .ok_or(PerpError::MathOverflow)?; + + long_pnl + .checked_add(short_pnl) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Liquidity-provider assets-under-management at `price`: pool liquidity minus +/// what traders are collectively owed. This is what liquidity-provider shares +/// are priced against, so it marks open positions to the current price and an +/// exiting provider cannot dodge an in-progress trader profit. +pub fn liquidity_provider_aum(pool: &Pool, price: u64) -> Result { + let traders = traders_unrealized_pnl(pool, price)?; + (pool.liquidity as i128) + .checked_sub(traders) + .ok_or(PerpError::MathOverflow.into()) +} + +/// Funding a position owes since it opened, in collateral base units. Positive +/// means the trader pays the pool; negative means the pool pays the trader. +pub fn position_funding( + side: Side, + size: u64, + entry_funding: i128, + pool_funding: i128, +) -> Result { + let funding_change = pool_funding + .checked_sub(entry_funding) + .ok_or(PerpError::MathOverflow)?; + let long_owed = (size as i128) + .checked_mul(funding_change) + .ok_or(PerpError::MathOverflow)? + .checked_div(FUNDING_PRECISION) + .ok_or(PerpError::MathOverflow)?; + + Ok(match side { + Side::Long => long_owed, + Side::Short => -long_owed, + }) +} + +/// `basis_points` of `amount`, rounded down — used for fees and for the +/// maintenance-margin threshold alike. Widened to `u128` so a large amount +/// cannot overflow the intermediate product. +pub fn basis_points_of(amount: u64, basis_points: u16) -> Result { + (amount as u128) + .checked_mul(basis_points as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(BASIS_POINTS_DENOMINATOR as u128) + .ok_or(PerpError::MathOverflow)? + .try_into() + .map_err(|_| PerpError::MathOverflow.into()) +} + +/// The preamble every price-sensitive handler runs: read a validated oracle +/// price, then bring the pool's funding index up to the current slot, so the +/// settlement that follows uses fresh numbers for both. Centralized so no +/// handler can settle a position against a stale funding index. +pub fn refresh_price_and_funding(pool: &mut Pool, oracle_feed: &AccountInfo) -> Result { + let price = crate::state::oracle::read_oracle_price( + oracle_feed, + pool.oracle_scale, + pool.max_confidence_bps, + )?; + accrue_funding(pool, Clock::get()?.slot)?; + Ok(price) +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/lib.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/lib.rs new file mode 100644 index 000000000..2923d6a16 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/lib.rs @@ -0,0 +1,91 @@ +use anchor_lang::prelude::*; + +mod constants; +mod errors; +// Public so the LiteSVM integration tests can build instruction arguments +// (`PoolParameters`, `Side`) against the program's own types. +pub mod instructions; +pub mod state; + +use instructions::*; +use state::Side; + +declare_id!("3uCm8Jep469pHUpYQCh6eA6dpYV3ogvTvaRDZBPtw5So"); + +#[program] +pub mod perpetual_futures { + use super::*; + + /// Create a perpetual-futures pool for one collateral token, priced by one + /// oracle feed. Sets the trading parameters and creates the custody vault + /// and liquidity-provider mint. + pub fn initialize_pool( + context: Context, + parameters: PoolParameters, + ) -> Result<()> { + instructions::handle_initialize_pool(context, parameters) + } + + /// Deposit collateral into the pool and receive liquidity-provider shares. + /// `minimum_shares_out` is slippage protection; pass `0` to opt out. + pub fn add_liquidity( + context: Context, + amount: u64, + minimum_shares_out: u64, + ) -> Result<()> { + instructions::handle_add_liquidity(context, amount, minimum_shares_out) + } + + /// Burn liquidity-provider shares and withdraw the matching collateral. + /// `minimum_amount_out` is slippage protection; pass `0` to opt out. + pub fn remove_liquidity( + context: Context, + shares: u64, + minimum_amount_out: u64, + ) -> Result<()> { + instructions::handle_remove_liquidity(context, shares, minimum_amount_out) + } + + /// Open a leveraged long or short position against the pool at the current + /// oracle price. `acceptable_price` bounds the fill (longs reject above it, + /// shorts reject below it); pass `0` to opt out. + pub fn open_position( + context: Context, + side: Side, + collateral_amount: u64, + size: u64, + acceptable_price: u64, + ) -> Result<()> { + instructions::handle_open_position(context, side, collateral_amount, size, acceptable_price) + } + + /// Close the caller's own position, settling profit/loss, accrued funding, + /// and the close fee. `minimum_payout` is slippage protection; pass `0` to + /// opt out. + pub fn close_position( + context: Context, + minimum_payout: u64, + ) -> Result<()> { + instructions::handle_close_position(context, minimum_payout) + } + + /// Permissionlessly close a position whose equity has fallen to or below + /// the maintenance margin. The caller earns the liquidation fee. + pub fn liquidate_position(context: Context) -> Result<()> { + instructions::handle_liquidate_position(context) + } + + /// Pool authority sweeps the accumulated protocol fees from the vault. + pub fn collect_fees(context: Context) -> Result<()> { + instructions::handle_collect_fees(context) + } + + /// Pool authority retunes the per-slot funding rate, accruing at the old + /// rate first. + pub fn set_funding_rate( + context: Context, + funding_rate_per_slot: u64, + ) -> Result<()> { + instructions::handle_set_funding_rate(context, funding_rate_per_slot) + } +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/mod.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/mod.rs new file mode 100644 index 000000000..be7291189 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/mod.rs @@ -0,0 +1,6 @@ +pub mod oracle; +pub mod pool; +pub mod position; + +pub use pool::*; +pub use position::*; diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/oracle.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/oracle.rs new file mode 100644 index 000000000..e05b7ce32 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/oracle.rs @@ -0,0 +1,112 @@ +use anchor_lang::prelude::*; +use solana_sysvar::last_restart_slot::LastRestartSlot; + +use crate::constants::{BASIS_POINTS_DENOMINATOR, MAX_PRICE_STALENESS_SLOTS}; +use crate::errors::PerpError; + +// Byte layout of the feed account this program reads. It matches the +// `mock_switchboard::MockFeed` account: an 8-byte Anchor discriminator followed +// by `authority: Pubkey (32)`, `price: i128 (16)`, `scale: u32 (4)`, +// `last_update_slot: u64 (8)`, `confidence: u64 (8)`. +// +// We read the raw bytes rather than deserializing the mock account type so this +// program stays decoupled from the mock. To consume a real Switchboard +// On-Demand feed, replace the offsets below with a call to +// `switchboard_on_demand::PullFeedAccountData::parse_and_verify(...)`, which +// also checks the Ed25519 signatures over the price update — the only other +// change is the feed account's owning program ID. +// +// A real feed reports a value plus a `confidence` band (a standard-deviation-like +// uncertainty). This reader rejects a price whose band is too wide relative to +// the price — skipping that check is the most common oracle footgun. Production +// venues (see solana-labs/perpetuals) often also use the feed's EMA rather than +// the spot price for a less manipulable mark; the mock omits the EMA to stay +// minimal. +// +// The feed account's owning program is NOT checked here: the pool trusts +// whatever feed address its creator configured, which is inside the trust model +// (the creator picks the oracle). A production reader must also verify the +// account owner is the oracle program, which `parse_and_verify` does. +const PRICE_OFFSET: usize = 8 + 32; +const SCALE_OFFSET: usize = PRICE_OFFSET + 16; +const LAST_UPDATE_SLOT_OFFSET: usize = SCALE_OFFSET + 4; +const CONFIDENCE_OFFSET: usize = LAST_UPDATE_SLOT_OFFSET + 8; +const FEED_MINIMUM_LENGTH: usize = CONFIDENCE_OFFSET + 8; + +/// Read and validate the oracle price from `feed`. +/// +/// Returns the price as a `u64` in the pool's `expected_scale` fixed point. +/// Rejects a stale price (older than `MAX_PRICE_STALENESS_SLOTS`), a +/// non-positive price, a feed whose scale differs from the pool's pinned scale, +/// and a price whose confidence band exceeds `max_confidence_bps` of the price. +pub fn read_oracle_price( + feed: &AccountInfo, + expected_scale: u32, + max_confidence_bps: u16, +) -> Result { + let data = feed.try_borrow_data()?; + require!( + data.len() >= FEED_MINIMUM_LENGTH, + PerpError::OracleDataTooShort + ); + + let price = i128::from_le_bytes( + data[PRICE_OFFSET..PRICE_OFFSET + 16] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + let scale = u32::from_le_bytes( + data[SCALE_OFFSET..SCALE_OFFSET + 4] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + let last_update_slot = u64::from_le_bytes( + data[LAST_UPDATE_SLOT_OFFSET..LAST_UPDATE_SLOT_OFFSET + 8] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + let confidence = u64::from_le_bytes( + data[CONFIDENCE_OFFSET..CONFIDENCE_OFFSET + 8] + .try_into() + .map_err(|_| PerpError::OracleDataTooShort)?, + ); + + require!(price > 0, PerpError::NonPositivePrice); + require_eq!(scale, expected_scale, PerpError::OracleScaleMismatch); + + // `saturating_sub` floors the age at zero, so a feed slot momentarily ahead + // of the local clock reads as fresh rather than wrapping to a huge age. + let current_slot = Clock::get()?.slot; + require!( + current_slot.saturating_sub(last_update_slot) <= MAX_PRICE_STALENESS_SLOTS, + PerpError::StalePrice + ); + + // Restart handling. A cluster halt stops the slot count but not the wall + // clock, so after a restart a feed can look fresh in slots while its + // price is hours old. With leverage a stale price is amplified into a + // market-wide equity error, so reject any price stamped at or before the + // restart slot; the pool pauses valuation until the publisher posts + // again. Zero means the cluster has never restarted. + let last_restart_slot = LastRestartSlot::get()?.last_restart_slot; + require!( + last_restart_slot == 0 || last_update_slot > last_restart_slot, + PerpError::PricePredatesRestart + ); + + // Reject an untrustworthy price: confidence band as a fraction of price, + // in basis points, must not exceed the pool's limit. Widen to u128 so the + // product cannot overflow, and `price > 0` is already guaranteed. + let confidence_bps = (confidence as u128) + .checked_mul(BASIS_POINTS_DENOMINATOR as u128) + .ok_or(PerpError::MathOverflow)? + .checked_div(price as u128) + .ok_or(PerpError::MathOverflow)?; + require!( + confidence_bps <= max_confidence_bps as u128, + PerpError::OracleConfidenceTooWide + ); + + let price: u64 = price.try_into().map_err(|_| PerpError::MathOverflow)?; + Ok(price) +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/pool.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/pool.rs new file mode 100644 index 000000000..eae178c51 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/pool.rs @@ -0,0 +1,99 @@ +use anchor_lang::prelude::*; + +/// One perpetual-futures market: a single collateral token priced by a single +/// oracle feed. Liquidity providers fund the pool and are the counterparty to +/// every trader; the pool absorbs trader profit and loss. +/// +/// Money fields are raw base units of the collateral token. The pool never +/// assumes decimals — `transfer_checked` carries them through every CPI. +#[account] +#[derive(InitSpace)] +pub struct Pool { + /// Admin: configures the pool and sweeps protocol fees. Not a custody + /// escape hatch — it cannot touch liquidity-provider or trader funds. + pub authority: Pubkey, + + pub collateral_mint: Pubkey, + + /// Oracle feed this market reads its price from. Stored so handlers can + /// reject any substituted feed account. + pub oracle_feed: Pubkey, + + /// Decimal places the oracle price is quoted in. Pinned at creation so a + /// feed that silently changes scale is rejected rather than mis-read. + pub oracle_scale: u32, + + pub custody_vault: Pubkey, + + pub lp_mint: Pubkey, + + /// Liquidity-provider-owned assets, in collateral base units. Grows with + /// deposits, trader losses, fees-to-LPs; shrinks with withdrawals and + /// trader profits. Trader collateral is tracked separately in + /// `total_collateral` and is not part of this figure. + pub liquidity: u64, + + /// Portion of `liquidity` reserved to cover open positions' maximum + /// recoverable profit (one notional `size` per position). Liquidity-provider + /// withdrawals can only take the free remainder (`liquidity - reserved`), so + /// a winning trader can always be paid. Also caps total exposure: a position + /// can only open while `reserved + size <= liquidity`. + pub reserved_liquidity: u64, + + /// Sum of every open position's posted collateral, held in the same vault. + pub total_collateral: u64, + + /// Protocol fees accrued from open/close fees, awaiting `collect_fees`. + pub protocol_fees: u64, + + /// Aggregate long open interest (sum of position `size`), in collateral + /// base units of notional. + pub long_size: u128, + + pub short_size: u128, + + /// Running sum of `size * SIZE_PRECISION / entry_price` for each side. + /// Lets mark-to-market assets-under-management be derived from the current + /// price without iterating positions: aggregate long profit/loss equals + /// `price * long_size_scaled / SIZE_PRECISION - long_size`. + pub long_size_scaled: u128, + + pub short_size_scaled: u128, + + /// Cumulative funding index, scaled by `FUNDING_PRECISION`. Rises while + /// longs are the heavier side (longs pay), falls while shorts are heavier. + /// A position pays funding proportional to the change in this index between + /// open and close. + pub cumulative_funding: i128, + + pub last_funding_slot: u64, + + /// Funding accrued per slot, in `FUNDING_PRECISION` units, applied to the + /// heavier side. The funding paid by traders accrues to the pool. + pub funding_rate_per_slot: u64, + + /// Fee charged on notional when opening a position, in basis points. + pub open_fee_bps: u16, + + pub close_fee_bps: u16, + + /// Highest leverage a position may open at (`size <= collateral * max`). + pub max_leverage: u16, + + /// Equity threshold, in basis points of notional, below which a position is + /// liquidatable. + pub maintenance_margin_bps: u16, + + /// Reward paid to a liquidator, in basis points of the liquidated notional. + pub liquidation_fee_bps: u16, + + /// Maximum oracle confidence band, in basis points of the price, that the + /// pool will trade against. A wider band is rejected as untrustworthy. + pub max_confidence_bps: u16, + + pub bump: u8, + + /// Bump for the vault/LP-mint authority PDA, stored so CPIs can sign without + /// re-deriving it. + pub authority_bump: u8, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/position.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/position.rs new file mode 100644 index 000000000..29a0d7080 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/src/state/position.rs @@ -0,0 +1,52 @@ +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize, InitSpace, Clone, Copy, PartialEq, Eq, Debug)] +pub enum Side { + Long, + Short, +} + +impl Side { + /// Seed fragment used in the position PDA, so one owner can hold a long and + /// a short in the same pool simultaneously. Returns a `'static` slice so it + /// can be used directly in the `seeds` constraint without a temporary. + pub fn as_seed(&self) -> &'static [u8] { + match self { + Side::Long => b"long", + Side::Short => b"short", + } + } +} + +/// A single trader's leveraged position. One PDA per (pool, owner, side). +#[account] +#[derive(InitSpace)] +pub struct Position { + pub owner: Pubkey, + + pub pool: Pubkey, + + pub side: Side, + + /// Collateral the trader posted, in collateral base units. Part of the + /// pool's `total_collateral` while the position is open. + pub collateral: u64, + + /// Notional position size, in collateral base units. `size / collateral` is + /// the leverage. + pub size: u64, + + /// Oracle price at open, in the pool's `oracle_scale` fixed point. Always + /// positive, so stored unsigned. + pub entry_price: u64, + + /// This position's contribution to the pool's `*_size_scaled` accumulator + /// (`size * SIZE_PRECISION / entry_price`). Stored so it can be subtracted + /// exactly on close without recomputing and re-rounding. + pub size_scaled: u128, + + /// Pool `cumulative_funding` at open. Funding owed is the change since. + pub entry_funding: i128, + + pub bump: u8, +} diff --git a/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/tests/test_perpetual_futures.rs b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/tests/test_perpetual_futures.rs new file mode 100644 index 000000000..0610d1df0 --- /dev/null +++ b/finance/perpetual-futures/anchor-v1/programs/perpetual-futures/tests/test_perpetual_futures.rs @@ -0,0 +1,1203 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + AccountDeserialize, InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + perpetual_futures::{instructions::initialize_pool::PoolParameters, state::Pool, state::Side}, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, + send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +// Collateral token has 6 decimals (like USDC), so one whole unit is 1_000_000 +// base units. +const ONE_USDC: u64 = 1_000_000; +const DECIMALS: u8 = 6; + +// The oracle quotes prices with 8 decimals, so $100 is 100 * 10^8. +const ORACLE_SCALE: u32 = 8; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ) + .0 +} + +/// Oracle price for a whole-dollar amount, in the feed's fixed point. +fn dollars(whole: i128) -> i128 { + whole * 10i128.pow(ORACLE_SCALE) +} + +/// One deployed market plus the keys needed to drive it. +struct Market { + svm: LiteSVM, + payer: Keypair, + admin: Keypair, + collateral_mint: Pubkey, + feed: Pubkey, + pool: Pubkey, + pool_authority: Pubkey, + lp_mint: Pubkey, + custody_vault: Pubkey, +} + +impl Market { + /// Stand up a market with the given starting oracle price and per-slot + /// funding rate. The admin is both the pool authority and the oracle feed + /// authority. + fn new(initial_price: i128, funding_rate_per_slot: u64) -> Market { + let parameters = PoolParameters { + oracle_scale: ORACLE_SCALE, + funding_rate_per_slot, + open_fee_bps: 10, + close_fee_bps: 10, + max_leverage: 10, + maintenance_margin_bps: 500, + liquidation_fee_bps: 100, + max_confidence_bps: 100, + }; + Market::try_new(initial_price, parameters).expect("pool initialization should succeed") + } + + /// Like `new`, but takes the full parameter set and surfaces an + /// `initialize_pool` rejection instead of panicking, so tests can probe the + /// parameter validation. + fn try_new(initial_price: i128, parameters: PoolParameters) -> Result { + let mut svm = LiteSVM::new(); + svm.add_program( + perpetual_futures::id(), + include_bytes!("../../../target/deploy/perpetual_futures.so"), + ) + .unwrap(); + // Use std::fs::read() instead of include_bytes!() for the switchboard program because + // include_bytes!() runs at compile time, and during `anchor build` the IDL generation + // step compiles tests before the .so files exist. Since this is a cross-program + // dependency (not our own program), mock_switchboard.so may not be built yet at compile time. + let switchboard_bytes = std::fs::read(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../target/deploy/mock_switchboard.so" + )) + .expect("mock_switchboard.so not found - run `anchor build` first"); + svm.add_program(mock_switchboard::id(), &switchboard_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let admin = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let collateral_mint = create_token_mint(&mut svm, &admin, DECIMALS, None).unwrap(); + + // Create the mock oracle feed as a fresh account owned by the mock + // program; the admin is its update authority. + let feed_keypair = Keypair::new(); + let initialize_feed = Instruction::new_with_bytes( + mock_switchboard::id(), + &mock_switchboard::instruction::InitializeFeed { + price: initial_price, + scale: ORACLE_SCALE, + confidence: 0, + } + .data(), + mock_switchboard::accounts::InitializeFeedAccountConstraints { + feed: feed_keypair.pubkey(), + authority: admin.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_feed], + &[&admin, &feed_keypair], + &admin.pubkey(), + ) + .unwrap(); + let feed = feed_keypair.pubkey(); + + let pool = Pubkey::find_program_address( + &[b"pool", collateral_mint.as_ref(), feed.as_ref()], + &perpetual_futures::id(), + ) + .0; + let pool_authority = + Pubkey::find_program_address(&[b"authority", pool.as_ref()], &perpetual_futures::id()) + .0; + let lp_mint = + Pubkey::find_program_address(&[b"lp_mint", pool.as_ref()], &perpetual_futures::id()).0; + let custody_vault = + Pubkey::find_program_address(&[b"vault", pool.as_ref()], &perpetual_futures::id()).0; + + let initialize_pool = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::InitializePool { parameters }.data(), + perpetual_futures::accounts::InitializePoolAccountConstraints { + authority: admin.pubkey(), + pool, + collateral_mint, + oracle_feed: feed, + pool_authority, + lp_mint, + custody_vault, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_pool], + &[&admin], + &admin.pubkey(), + ) + .map_err(|_| ())?; + + Ok(Market { + svm, + payer, + admin, + collateral_mint, + feed, + pool, + pool_authority, + lp_mint, + custody_vault, + }) + } + + fn default_market() -> Market { + // Funding off by default so profit/loss assertions are exact. + Market::new(dollars(100), 0) + } + + fn pool_state(&self) -> Pool { + let account = self.svm.get_account(&self.pool).unwrap(); + Pool::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + fn set_price(&mut self, price: i128) { + self.set_price_with_confidence(price, 0); + } + + fn set_price_with_confidence(&mut self, price: i128, confidence: u64) { + let set_price = Instruction::new_with_bytes( + mock_switchboard::id(), + &mock_switchboard::instruction::SetPrice { price, confidence }.data(), + mock_switchboard::accounts::SetPriceAccountConstraints { + feed: self.feed, + authority: self.admin.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![set_price], + &[&self.admin], + &self.admin.pubkey(), + ) + .unwrap(); + } + + fn warp(&mut self, slot: u64) { + self.svm.warp_to_slot(slot); + self.svm.expire_blockhash(); + } + + fn current_slot(&self) -> u64 { + self.svm.get_sysvar::().slot + } + + /// Simulate a cluster restart at `slot`: prices stamped at or before it + /// must be rejected until the publisher posts again. + fn set_last_restart_slot(&mut self, slot: u64) { + self.svm.set_sysvar(&solana_sysvar::last_restart_slot::LastRestartSlot { + last_restart_slot: slot, + }); + } + + /// Create a wallet holding `amount` collateral tokens in its associated + /// token account. + fn funded_trader(&mut self, amount: u64) -> (Keypair, Pubkey) { + let trader = create_wallet(&mut self.svm, 100_000_000_000).unwrap(); + let token_account = create_associated_token_account( + &mut self.svm, + &trader.pubkey(), + &self.collateral_mint, + &self.payer, + ) + .unwrap(); + mint_tokens_to_token_account( + &mut self.svm, + &self.collateral_mint, + &token_account, + amount, + &self.admin, + ) + .unwrap(); + (trader, token_account) + } + + fn add_liquidity( + &mut self, + provider: &Keypair, + provider_collateral: Pubkey, + amount: u64, + minimum_shares_out: u64, + ) -> Result<(), ()> { + let provider_lp = derive_ata(&provider.pubkey(), &self.lp_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::AddLiquidity { + amount, + minimum_shares_out, + } + .data(), + perpetual_futures::accounts::AddLiquidityAccountConstraints { + provider: provider.pubkey(), + pool: self.pool, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + lp_mint: self.lp_mint, + custody_vault: self.custody_vault, + provider_collateral, + provider_lp, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[provider], + &provider.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn remove_liquidity( + &mut self, + provider: &Keypair, + provider_collateral: Pubkey, + shares: u64, + minimum_amount_out: u64, + ) -> Result<(), ()> { + let provider_lp = derive_ata(&provider.pubkey(), &self.lp_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::RemoveLiquidity { + shares, + minimum_amount_out, + } + .data(), + perpetual_futures::accounts::RemoveLiquidityAccountConstraints { + provider: provider.pubkey(), + pool: self.pool, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + lp_mint: self.lp_mint, + custody_vault: self.custody_vault, + provider_collateral, + provider_lp, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[provider], + &provider.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn position_pda(&self, owner: &Pubkey, side: Side) -> Pubkey { + let side_seed: &[u8] = match side { + Side::Long => b"long", + Side::Short => b"short", + }; + Pubkey::find_program_address( + &[b"position", self.pool.as_ref(), owner.as_ref(), side_seed], + &perpetual_futures::id(), + ) + .0 + } + + fn open_position( + &mut self, + trader: &Keypair, + trader_collateral: Pubkey, + side: Side, + collateral_amount: u64, + size: u64, + acceptable_price: u64, + ) -> Result<(), ()> { + let position = self.position_pda(&trader.pubkey(), side); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::OpenPosition { + side, + collateral_amount, + size, + acceptable_price, + } + .data(), + perpetual_futures::accounts::OpenPositionAccountConstraints { + owner: trader.pubkey(), + pool: self.pool, + position, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + trader_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[trader], + &trader.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn close_position( + &mut self, + trader: &Keypair, + trader_collateral: Pubkey, + side: Side, + minimum_payout: u64, + ) -> Result<(), ()> { + let position = self.position_pda(&trader.pubkey(), side); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::ClosePosition { minimum_payout }.data(), + perpetual_futures::accounts::ClosePositionAccountConstraints { + owner: trader.pubkey(), + pool: self.pool, + position, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + trader_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[trader], + &trader.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn liquidate( + &mut self, + liquidator: &Keypair, + owner: &Pubkey, + owner_collateral: Pubkey, + side: Side, + ) -> Result<(), ()> { + let position = self.position_pda(owner, side); + let liquidator_collateral = derive_ata(&liquidator.pubkey(), &self.collateral_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::LiquidatePosition {}.data(), + perpetual_futures::accounts::LiquidatePositionAccountConstraints { + liquidator: liquidator.pubkey(), + owner: *owner, + pool: self.pool, + position, + pool_authority: self.pool_authority, + oracle_feed: self.feed, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + trader_collateral: owner_collateral, + liquidator_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[liquidator], + &liquidator.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn collect_fees(&mut self, authority: &Keypair) -> Result<(), ()> { + let authority_collateral = derive_ata(&authority.pubkey(), &self.collateral_mint); + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::CollectFees {}.data(), + perpetual_futures::accounts::CollectFeesAccountConstraints { + authority: authority.pubkey(), + pool: self.pool, + pool_authority: self.pool_authority, + collateral_mint: self.collateral_mint, + custody_vault: self.custody_vault, + authority_collateral, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[authority], + &authority.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + fn set_funding_rate(&mut self, authority: &Keypair, rate: u64) -> Result<(), ()> { + let instruction = Instruction::new_with_bytes( + perpetual_futures::id(), + &perpetual_futures::instruction::SetFundingRate { + funding_rate_per_slot: rate, + } + .data(), + perpetual_futures::accounts::SetFundingRateAccountConstraints { + authority: authority.pubkey(), + pool: self.pool, + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![instruction], + &[authority], + &authority.pubkey(), + ) + .map(|_| ()) + .map_err(|_| ()) + } + + /// Deposit a large amount of liquidity so the pool can pay trader profits, + /// returning the provider and its collateral account. + fn seed_liquidity(&mut self, amount: u64) -> (Keypair, Pubkey) { + let (provider, provider_collateral) = self.funded_trader(amount); + self.add_liquidity(&provider, provider_collateral, amount, 0) + .unwrap(); + (provider, provider_collateral) + } +} + +#[test] +fn test_initialize_pool() { + let market = Market::default_market(); + let pool = market.pool_state(); + + assert_eq!(pool.authority, market.admin.pubkey()); + assert_eq!(pool.collateral_mint, market.collateral_mint); + assert_eq!(pool.oracle_feed, market.feed); + assert_eq!(pool.oracle_scale, ORACLE_SCALE); + assert_eq!(pool.max_leverage, 10); + assert_eq!(pool.liquidity, 0); + assert_eq!(pool.total_collateral, 0); +} + +#[test] +fn test_add_liquidity_first_deposit_withholds_minimum() { + let mut market = Market::default_market(); + let deposit = 10_000 * ONE_USDC; + let (provider, provider_collateral) = market.funded_trader(deposit); + + market + .add_liquidity(&provider, provider_collateral, deposit, 0) + .unwrap(); + + // The pool holds the full deposit; the provider's shares are the deposit + // minus the withheld minimum. + assert_eq!(market.pool_state().liquidity, deposit); + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + assert_eq!(shares, deposit - 1_000); +} + +#[test] +fn test_first_deposit_below_minimum_fails() { + let mut market = Market::default_market(); + let (provider, provider_collateral) = market.funded_trader(10_000); + // 500 base units is below the 1_000 locked minimum. + assert!(market + .add_liquidity(&provider, provider_collateral, 500, 0) + .is_err()); +} + +#[test] +fn test_add_liquidity_subsequent_is_proportional() { + let mut market = Market::default_market(); + let first = 10_000 * ONE_USDC; + market.seed_liquidity(first); + + // With no open positions and an unchanged price, assets-under-management + // equals liquidity, so a second equal deposit mints ~the same shares. + let second = 10_000 * ONE_USDC; + let (provider, provider_collateral) = market.funded_trader(second); + market + .add_liquidity(&provider, provider_collateral, second, 0) + .unwrap(); + + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + // supply before second deposit was `first - 1_000`; second shares = + // second * supply / aum = second * (first - 1_000) / first. + let expected = ((second as u128) * ((first - 1_000) as u128) / (first as u128)) as u64; + assert_eq!(shares, expected); +} + +#[test] +fn test_add_and_remove_liquidity_round_trip() { + let mut market = Market::default_market(); + let deposit = 10_000 * ONE_USDC; + let (provider, provider_collateral) = market.funded_trader(deposit); + market + .add_liquidity(&provider, provider_collateral, deposit, 0) + .unwrap(); + + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + market + .remove_liquidity(&provider, provider_collateral, shares, 0) + .unwrap(); + + // As the only liquidity provider, they reclaim the full deposit: their + // shares carry the whole pool, since the withheld minimum was never minted + // to anyone else to hold it back. + let returned = get_token_account_balance(&market.svm, &provider_collateral).unwrap(); + assert_eq!(returned, deposit); + assert_eq!(market.pool_state().liquidity, 0); +} + +#[test] +fn test_open_long_updates_pool() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let pool = market.pool_state(); + assert_eq!(pool.long_size, size as u128); + assert_eq!(pool.short_size, 0); + // Collateral minus the 0.1% open fee is now tracked as trader collateral. + let open_fee = size / 1_000; + assert_eq!(pool.total_collateral, collateral - open_fee); + assert_eq!(pool.protocol_fees, open_fee); +} + +#[test] +fn test_close_long_in_profit() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + // Price rises 20%: a $5,000 long earns $1,000. + market.set_price(dollars(120)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let profit = size / 5; // 20% of notional + let expected_payout = net_collateral + profit - close_fee; + let balance = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + assert_eq!(balance, expected_payout); +} + +#[test] +fn test_close_long_in_loss() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let liquidity_before = market.pool_state().liquidity; + + // Price falls 10%: a $5,000 long loses $500. + market.set_price(dollars(90)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let loss = size / 10; // 10% of notional + let expected_payout = net_collateral - loss - close_fee; + let balance = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + assert_eq!(balance, expected_payout); + + // The trader's loss accrued to the liquidity providers. + assert_eq!(market.pool_state().liquidity, liquidity_before + loss); +} + +#[test] +fn test_close_short_in_profit() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Short, collateral, size, 0) + .unwrap(); + + // Price falls 10%: a $5,000 short earns $500. + market.set_price(dollars(90)); + market + .close_position(&trader, trader_collateral, Side::Short, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let profit = size / 10; + let expected_payout = net_collateral + profit - close_fee; + let balance = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + assert_eq!(balance, expected_payout); +} + +#[test] +fn test_open_rejects_zero_amounts() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let (trader, trader_collateral) = market.funded_trader(1_000 * ONE_USDC); + + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + 0, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + 1_000 * ONE_USDC, + 0, + 0 + ) + .is_err()); +} + +#[test] +fn test_open_rejects_excess_leverage() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // max_leverage is 10x; 11x must be rejected. + let size = 11_000 * ONE_USDC; + assert!(market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .is_err()); +} + +#[test] +fn test_open_long_slippage_guard() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // Current price is $100 (10^10 in scale 8). A long willing to pay at most + // $99 must be rejected. + let acceptable_price = (dollars(99)) as u64; + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + acceptable_price + ) + .is_err()); +} + +#[test] +fn test_stale_price_rejected() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // Move far past the staleness window without refreshing the feed. + market.warp(10_000); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); +} + +/// A cluster restart passes hours of wall-clock time in zero slots, so a +/// price published before the halt can still look fresh by slot count. With +/// leverage a stale price is amplified into a market-wide equity error, so +/// the pool must refuse it until the publisher posts again. +#[test] +fn test_open_rejects_price_from_before_a_restart() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // Simulate a halt: the cluster restarts a few slots after the price was + // published, well inside the staleness window, so only the restart check + // can catch the pre-halt price. + market.set_price(dollars(100)); + let published_at = market.current_slot(); + market.warp(published_at + 5); + market.set_last_restart_slot(published_at + 3); + + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + u64::MAX + ) + .is_err()); + + // Publishing after the restart reopens the pool. Warp first: the retry is + // otherwise byte-identical to the rejected open, so it would carry the same + // signature and be dropped as already processed. + market.warp(published_at + 6); + market.set_price(dollars(100)); + market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + u64::MAX + ) + .expect("a freshly published price must be accepted after a restart"); +} + +#[test] +fn test_wide_oracle_confidence_rejected() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + + // The pool tolerates a 1% confidence band (max_confidence_bps = 100). Widen + // the feed's band to 2% of the price and the open must be rejected. + market.set_price_with_confidence(dollars(100), dollars(2) as u64); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); +} + +#[test] +fn test_funding_charged_to_long() { + // Funding on: longs are the only side, so they pay funding to the pool. + let mut market = Market::new(dollars(100), 5_000); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let liquidity_before = market.pool_state().liquidity; + + // Let funding accrue, then refresh the feed so the price is fresh again and + // close at the same price (no profit/loss). + market.warp(2_000); + market.set_price(dollars(100)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let payout = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + + // The trader received less than collateral-minus-close-fee; the shortfall + // is the funding they paid, which went to the liquidity providers. + assert!(payout < net_collateral - close_fee); + let funding_paid = (net_collateral - close_fee) - payout; + assert!(funding_paid > 0); + assert_eq!( + market.pool_state().liquidity, + liquidity_before + funding_paid + ); +} + +/// The funding rate is quoted per slot, so what a position costs per hour also +/// depends on the cluster's slot time. When the protocol shortens the slot, the +/// pool authority retunes the rate, and the retune must settle the slots already +/// elapsed at the old rate rather than repricing them at the new one. +#[test] +fn test_set_funding_rate_settles_at_the_old_rate_first() { + let rate = 5_000; + let window = 2_000; + + // Same position and the same total elapsed slots in both runs. The only + // difference is that the second doubles the rate halfway through, so it + // should pay 1x for the first window and 2x for the second: 1.5x overall. + let funding_for = |retune: bool| -> u64 { + let mut market = Market::new(dollars(100), rate); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let opened_at = market.current_slot(); + market.warp(opened_at + window); + if retune { + let admin = market.admin.insecure_clone(); + market.set_funding_rate(&admin, rate * 2).unwrap(); + } + market.warp(opened_at + 2 * window); + market.set_price(dollars(100)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let fee = size / 1_000; + let payout = get_token_account_balance(&market.svm, &trader_collateral).unwrap(); + (collateral - fee - fee) - payout + }; + + let flat = funding_for(false); + let retuned = funding_for(true); + assert!(flat > 0, "the flat run must pay some funding to compare against"); + + // Half the elapsed slots at 1x and half at 2x is 1.5x the flat run. Had the + // handler skipped its accrual, the new rate would have applied to every + // slot and this would be 2x. + assert_eq!( + retuned * 2, + flat * 3, + "retuning halfway should cost 1.5x the flat run: flat {flat}, retuned {retuned}" + ); +} + +#[test] +fn test_only_authority_can_set_funding_rate() { + let mut market = Market::new(dollars(100), 5_000); + let (impostor, _) = market.funded_trader(ONE_USDC); + assert!( + market.set_funding_rate(&impostor, 1).is_err(), + "a non-authority must not be able to retune the funding rate" + ); +} + +#[test] +fn test_liquidation_of_underwater_long() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + // High leverage: a ~9x long, so a small adverse move erodes the margin. + // Collateral leaves room above the notional after the open fee (10,000 of + // notional needs at least 1,000 of net collateral at 10x). + let collateral = 1_100 * ONE_USDC; + let size = 10_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + // Price falls 9%: a $10,000 long loses $900, dropping equity below the 5% + // maintenance margin. + market.set_price(dollars(91)); + + let liquidator = create_wallet(&mut market.svm, 100_000_000_000).unwrap(); + let liquidator_collateral = create_associated_token_account( + &mut market.svm, + &liquidator.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + + market + .liquidate(&liquidator, &trader.pubkey(), trader_collateral, Side::Long) + .unwrap(); + + // The liquidator earned a fee and the position is gone. + let reward = get_token_account_balance(&market.svm, &liquidator_collateral).unwrap(); + assert!(reward > 0); + assert!(market + .svm + .get_account(&market.position_pda(&trader.pubkey(), Side::Long)) + .is_none()); + assert_eq!(market.pool_state().long_size, 0); +} + +#[test] +fn test_healthy_position_cannot_be_liquidated() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 2_000 * ONE_USDC; // 2x leverage, plenty of margin + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let liquidator = create_wallet(&mut market.svm, 100_000_000_000).unwrap(); + create_associated_token_account( + &mut market.svm, + &liquidator.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + + // Price barely moves; the position stays healthy. + market.set_price(dollars(99)); + assert!(market + .liquidate(&liquidator, &trader.pubkey(), trader_collateral, Side::Long) + .is_err()); +} + +#[test] +fn test_collect_fees() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + + let collateral = 1_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + let fees = market.pool_state().protocol_fees; + assert!(fees > 0); + + let admin = market.admin.insecure_clone(); + let admin_collateral = create_associated_token_account( + &mut market.svm, + &admin.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + market.collect_fees(&admin).unwrap(); + + assert_eq!( + get_token_account_balance(&market.svm, &admin_collateral).unwrap(), + fees + ); + assert_eq!(market.pool_state().protocol_fees, 0); + + // Nothing left to claim on a second sweep. + assert!(market.collect_fees(&admin).is_err()); +} + +#[test] +fn test_collect_fees_requires_authority() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 1_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position( + &trader, + trader_collateral, + Side::Long, + collateral, + 5_000 * ONE_USDC, + 0, + ) + .unwrap(); + + let imposter = create_wallet(&mut market.svm, 100_000_000_000).unwrap(); + create_associated_token_account( + &mut market.svm, + &imposter.pubkey(), + &market.collateral_mint, + &market.payer, + ) + .unwrap(); + assert!(market.collect_fees(&imposter).is_err()); +} + +#[test] +fn test_open_rejects_when_pool_cannot_back_it() { + let mut market = Market::default_market(); + // Only 3,000 of liquidity, but a 5,000 position must reserve 5,000. + market.seed_liquidity(3_000 * ONE_USDC); + let (trader, trader_collateral) = market.funded_trader(1_000 * ONE_USDC); + assert!(market + .open_position( + &trader, + trader_collateral, + Side::Long, + 1_000 * ONE_USDC, + 5_000 * ONE_USDC, + 0 + ) + .is_err()); +} + +#[test] +fn test_profit_capped_at_reserved_notional() { + let mut market = Market::default_market(); + market.seed_liquidity(100_000 * ONE_USDC); + let collateral = 2_000 * ONE_USDC; + let size = 5_000 * ONE_USDC; + let (trader, trader_collateral) = market.funded_trader(collateral); + market + .open_position(&trader, trader_collateral, Side::Long, collateral, size, 0) + .unwrap(); + + // Price triples: uncapped profit would be 2x the notional, but recoverable + // profit is capped at the reserved notional (`size`). + market.set_price(dollars(300)); + market + .close_position(&trader, trader_collateral, Side::Long, 0) + .unwrap(); + + let open_fee = size / 1_000; + let close_fee = size / 1_000; + let net_collateral = collateral - open_fee; + let expected = net_collateral + size - close_fee; + assert_eq!( + get_token_account_balance(&market.svm, &trader_collateral).unwrap(), + expected + ); +} + +#[test] +fn test_remove_liquidity_blocked_by_reserved() { + let mut market = Market::default_market(); + let (provider, provider_collateral) = market.seed_liquidity(10_000 * ONE_USDC); + let (trader, trader_collateral) = market.funded_trader(1_000 * ONE_USDC); + market + .open_position( + &trader, + trader_collateral, + Side::Long, + 1_000 * ONE_USDC, + 5_000 * ONE_USDC, + 0, + ) + .unwrap(); + + // 5,000 of the 10,000 liquidity is now reserved. Pulling everything fails, + // but withdrawing within the free half succeeds. + let provider_lp = derive_ata(&provider.pubkey(), &market.lp_mint); + let shares = get_token_account_balance(&market.svm, &provider_lp).unwrap(); + assert!(market + .remove_liquidity(&provider, provider_collateral, shares, 0) + .is_err()); + assert!(market + .remove_liquidity(&provider, provider_collateral, shares / 2, 0) + .is_ok()); +} + +#[test] +fn test_initialize_pool_rejects_close_fee_at_or_above_maintenance_margin() { + // A pool whose close fee reached the maintenance margin could strand a + // position that is too healthy to liquidate but too poor to pay the fee to + // close, so initialize_pool refuses the configuration. + let parameters = PoolParameters { + oracle_scale: ORACLE_SCALE, + funding_rate_per_slot: 0, + open_fee_bps: 10, + close_fee_bps: 600, + max_leverage: 10, + maintenance_margin_bps: 500, + liquidation_fee_bps: 100, + max_confidence_bps: 100, + }; + assert!(Market::try_new(dollars(100), parameters).is_err()); +} diff --git a/finance/perpetual-futures/anchor/README.md b/finance/perpetual-futures/anchor/README.md index 63a28c486..360db5d88 100644 --- a/finance/perpetual-futures/anchor/README.md +++ b/finance/perpetual-futures/anchor/README.md @@ -1,5 +1,11 @@ # Solana Perpetual Futures (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + A perpetual futures exchange on Solana: a venue for making leveraged bets on an asset's price without ever owning the asset. It is modelled on the oracle-priced, pool-collateralized design used by [Jupiter Perpetuals](https://station.jup.ag/guides/perpetual-exchange/overview) and GMX (and the open-source [`solana-labs/perpetuals`](https://github.com/solana-labs/perpetuals) reference that [Adrena](https://github.com/AdrenaFoundation/adrena-program) and [Flash Trade](https://github.com/flash-trade/flash-perpetuals) fork), rather than the order-book design used by [Drift](https://docs.drift.trade/). The collateral is **USDC** (a dollar stablecoin), and the market tracks the price of **NVDAx**, a tokenised Nvidia share whose [oracle](#oracle) price follows the real stock. A second market could track **TSLAx** (Tesla); each market is one collateral token plus one price feed. In the tests these are mock [SPL tokens](https://solana.com/docs/terminology#token). diff --git a/finance/prop-amm/anchor-v1/.gitignore b/finance/prop-amm/anchor-v1/.gitignore new file mode 100644 index 000000000..be06d3aa9 --- /dev/null +++ b/finance/prop-amm/anchor-v1/.gitignore @@ -0,0 +1,6 @@ +.anchor +target +**/*.rs.bk +node_modules +test-ledger +.DS_Store diff --git a/finance/prop-amm/anchor-v1/Anchor.toml b/finance/prop-amm/anchor-v1/Anchor.toml new file mode 100644 index 000000000..4284d903d --- /dev/null +++ b/finance/prop-amm/anchor-v1/Anchor.toml @@ -0,0 +1,26 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +prop_amm = "9ZMtJFtn5n4wwpEeXXG5paFQakcDtrd3ova5ptJL4VT1" +mock_switchboard = "BdFYarCfgMJhC26dFN6JXKVx4kUEM3k2wYaNjyjFrvAD" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +# Non-default: the LiteSVM Rust tests load both programs' .so files, so they +# must be built before `cargo test` runs. CI calls `anchor build` first; these +# waits only matter for the legacy validator path. +[test] +startup_wait = 5000 +shutdown_wait = 2000 diff --git a/finance/prop-amm/anchor-v1/CHANGELOG.md b/finance/prop-amm/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..a011befe1 --- /dev/null +++ b/finance/prop-amm/anchor-v1/CHANGELOG.md @@ -0,0 +1,25 @@ +# Changelog + +## 2026-08-04 + +Reject oracle prices from before a cluster restart. A halt stops the slot +count but not the wall clock, so after a restart a feed can look fresh in +slots while its price is hours old; for a market maker that is a free option +for whoever trades first. `read_oracle_price` now also requires the feed's +slot to be after the `LastRestartSlot` sysvar's slot +(`PricePredatesRestart`). Tested by +`test_swap_rejects_price_from_before_a_restart`. + +## 2026-07-11 (later) + +Retuned the walkthrough trade to 5 NVDAx (825.825 USDC at the ask, +824.175 back at the bid, 1.65 round-trip spread) so the numbers match the +book's convention that every character starts with 1,000 USDC. Same math, +same gates; only the amounts changed. + +## 2026-07-11 + +Initial version: an oracle-quoted proprietary AMM. One operator funds the +market's inventory and quotes both sides of it at the oracle price plus a +spread; anyone can swap against the quotes. Includes the `mock-switchboard` +oracle program for deterministic tests. diff --git a/finance/prop-amm/anchor-v1/Cargo.toml b/finance/prop-amm/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/finance/prop-amm/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/prop-amm/anchor-v1/README.md b/finance/prop-amm/anchor-v1/README.md new file mode 100644 index 000000000..82d16073a --- /dev/null +++ b/finance/prop-amm/anchor-v1/README.md @@ -0,0 +1,182 @@ +# Solana Prop AMM (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +An oracle-quoted **proprietary AMM** on Solana: a market-making firm funds a +trading venue with its own capital and quotes both sides of it. Anyone can buy +the base token at the oracle price plus a spread, or sell at the oracle price +minus it. There is no pricing curve, there are no liquidity providers, and +there are no pool shares: the operator is the only capital in the market, +which is the property that gives the design its name. This is the +architecture behind venues like Lifinity (the pioneer), SolFi, HumidiFi, +ZeroFi, Tessera, and Obric, which collectively fill most Solana swap volume +via Jupiter routing rather than their own user interfaces. + +## Programs + +- **`prop-amm`**: the market. One operator, one base/quote pair, one oracle + feed, two vaults, five instruction handlers. +- **`mock-switchboard`**: a minimal stand-in for a Switchboard On-Demand + price feed, so tests can drive deterministic price scenarios. Not for + production. + +## Key Financial Concepts + +### Proprietary market making + +A constant-product AMM crowdsources its capital from liquidity providers and +pays them fees; its price is a function of its reserves. A prop AMM inverts +all of it: the firm quotes prices taken from an oracle, earns the spread +instead of a fee, and risks only its own inventory. Because the price does +not depend on the pool's balances, big trades pay the same unit price as +small ones (no price impact), and there is nothing for a sandwich attacker to +squeeze: the classic front-run/back-run pattern needs a price that moves +with each trade. + +### The quote: oracle, spread, bid and ask + +The market pins an oracle feed at creation. Every swap reads the current +price and applies the operator's `spread_bps` each way: buyers of the base +token pay the **ask** (oracle plus spread, rounded up), sellers receive the +**bid** (oracle minus spread, rounded down). Output amounts floor. Every +rounding direction favors the market, and after the math the handler asserts +the invariant those roundings guarantee: the value leaving the vaults, at the +raw oracle price, never exceeds the value coming in. + +### Inventory, not liquidity + +The vault balances are not a pricing input; they only bound what the market +can deliver. A swap bigger than the inventory is rejected whole +(`InsufficientInventory`) rather than partially filled or mispriced. The +operator deposits and withdraws inventory freely, including all of it, at any +time. Nobody else has a claim on the vaults, so there is no share mint, no +pro-rata withdrawal math, and no inflation attack surface: the empty-pool +games that plague shared pools need shares to dilute, and there are none. + +### Adverse selection and pulled quotes + +A market maker's enemy is informed flow: traders who know the price is about +to move and hit the stale side of the quote. The two defenses this program +ships are the oracle gates (below) and `set_quote`, which lets the operator +widen the spread or pause quoting entirely. Real prop AMMs do exactly this: +during fast markets their quotes vanish and return minutes later. + +### Oracle staleness and confidence + +Every swap re-validates the feed: the price must be positive, at the pinned +scale, no older than 150 slots (~1 minute), stamped after the most recent +cluster restart (the `LastRestartSlot` sysvar; a halt passes hours of +wall-clock time in zero slots), and its confidence band must be inside +`max_confidence_bps`. For this design the staleness bound is not +hygiene, it is the business: a quote priced off an old number is a free +option for whoever notices first. + +## Program Flow + +### Participants + +- **Maria** operates the market-making firm. +- **Alice** and **Bob** trade NVDAx (tokenized NVIDIA stock, 6 decimals) + against USDC. +- The oracle quotes NVDAx at **$165** with 8 decimals of scale. + +### Step 1: Maria opens the market + +`initialize_market` creates the `Market` account (PDA of the mint pair), a +dataless vault-authority PDA, and the two vaults, and pins the oracle feed, +its scale, a 10 bps spread, and a 1% confidence limit. One market per pair: +the deployment is the firm. + +### Step 2: Maria stocks the inventory + +`deposit_inventory` moves 1,000 NVDAx and 200,000 USDC of the firm's own +tokens into the vaults. No shares are minted to anyone, because there is +nobody else to account for. + +### Step 3: Alice buys 5 NVDAx at the ask + +At $165 with a 10 bps spread the ask is $165.165. Alice's `swap` +(`Direction::BuyBase`) spends exactly 1,651.65 USDC for 10 NVDAx; +whether she bought 1 or 500, the unit price would be the same. + +### Step 4: Bob sells 5 NVDAx at the bid + +The bid is $164.835, so Bob's `swap` (`Direction::SellBase`) receives +exactly 1,648.35 USDC. A round trip through both sides costs exactly the +3.30 USDC spread: the spread is the fee, and it lands in the inventory, +not in a fee ledger. + +### Step 5: The oracle reprices; the quote follows + +The feed moves to $170 and the very next swap prices at $170.17 ask. No +arbitrageur had to walk the price there trade by trade, which is how a curve +AMM gets from one price to another. + +### Step 6: Volatility: Maria widens the spread, then pulls quotes + +`set_quote(50, false)` re-prices the market at a 50 bps spread; +`set_quote(50, true)` pauses it entirely, and swaps fail with +`MarketPaused` until she returns. + +### Step 7: Maria withdraws her inventory + +`withdraw_inventory` returns every token in both vaults to the firm. The +market still exists but rejects fills: an empty prop AMM refuses rather than +misprices. + +## Design notes and further reading + +- Production prop AMMs on Solana are closed-source and considerably more + sophisticated: they blend multiple price sources, run inventory-skewed + quoting (shading the quote to reduce a lopsided inventory), and integrate + with aggregators via quote APIs. The skeleton (operator capital, oracle + price, spread, hard oracle gates) is this program. +- Lifinity's public design notes and the Helius write-up + "Solana's Proprietary AMM Revolution" are good next reads. +- The oracle reader deliberately reads raw bytes at fixed offsets and + documents how to swap in `switchboard_on_demand::PullFeedAccountData:: + parse_and_verify(...)` for production. + +## Limitations + +- The oracle feed's owning program is not verified: the operator picks the + feed, and a bad choice loses the operator's money, not the traders'. A + production reader must still check the account owner. +- One flat spread both ways; no inventory skew, no size-dependent pricing. +- `paused` is the only circuit breaker; production venues also bound + per-slot volume and single-fill size. + +## Testing + +```bash +anchor build +cargo test +``` + +The LiteSVM suite (`programs/prop-amm/tests/test_prop_amm.rs`) verifies the +quote math to the minor unit in both directions, the exact round-trip spread, +oracle repricing and re-quoting, and that every gate shuts: slippage, +staleness, confidence, pause, zero amounts, inventory bounds, and operator +access control. + +## FAQ + +### What is a proprietary AMM on Solana? + +A venue where a single market-making firm supplies all the capital and quotes both sides from an oracle price plus a spread, instead of pricing from pool reserves. The operator stocks it with `deposit_inventory`, traders call `swap`, and the operator adjusts or pauses the quote with `set_quote`. Venues like Lifinity, SolFi, and HumidiFi use this design. + +### Why do trades have no price impact? + +The price comes from the oracle, not from the pool's balances, so a large swap pays the same unit price as a small one. That also removes the sandwich-attack surface: front-running only pays when each trade moves the price. + +### How does the operator make money? + +The spread is the fee: buyers pay the oracle price plus `spread_bps`, sellers receive the oracle price minus it, and the difference accumulates in the operator's inventory. There is no separate fee ledger, and `withdraw_inventory` returns everything to the firm. + +### What stops the venue from quoting a stale price? + +Every `swap` re-validates the feed: the price must be fresh (no older than 150 slots), stamped after the most recent cluster restart, at the pinned scale, and inside the configured confidence band. A stale quote is a free option for whoever notices first, so the staleness checks are the business model, not hygiene. diff --git a/finance/prop-amm/anchor-v1/programs/mock-switchboard/Cargo.toml b/finance/prop-amm/anchor-v1/programs/mock-switchboard/Cargo.toml new file mode 100644 index 000000000..5374a001c --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/mock-switchboard/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "mock_switchboard" +version = "0.1.0" +description = "Mock Switchboard On-Demand feed for testing the prop-amm program" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "mock_switchboard" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/prop-amm/anchor-v1/programs/mock-switchboard/src/lib.rs b/finance/prop-amm/anchor-v1/programs/mock-switchboard/src/lib.rs new file mode 100644 index 000000000..66d29a659 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/mock-switchboard/src/lib.rs @@ -0,0 +1,105 @@ +//! Mock Switchboard On-Demand feed for testing the prop-amm program. +//! +//! Real Switchboard On-Demand feeds are program-owned accounts whose data is +//! produced by an offchain oracle network and verified onchain via Ed25519 +//! signatures over the latest price update. That verification path is +//! out-of-scope for this teaching example, so this mock stores a single price +//! the test harness writes directly, plus the slot the update happened in. +//! +//! The prop-amm program reads this feed the same way it would read a real +//! feed: load the account, decode the layout, read `price`, `scale`, and +//! `last_update_slot` (see `prop_amm::state::oracle`). Swap this program ID +//! for `SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv` (Switchboard On-Demand) +//! and adapt the layout to consume real feeds in production. +//! +//! NOT FOR PRODUCTION. +use anchor_lang::prelude::*; + +declare_id!("BdFYarCfgMJhC26dFN6JXKVx4kUEM3k2wYaNjyjFrvAD"); + +#[program] +pub mod mock_switchboard { + use super::*; + + /// Initialize the mock feed with an initial price. The signer becomes the + /// authority allowed to push later price updates. + pub fn initialize_feed( + context: Context, + price: i128, + scale: u32, + confidence: u64, + ) -> Result<()> { + let feed = &mut context.accounts.feed; + feed.authority = context.accounts.authority.key(); + feed.price = price; + feed.scale = scale; + feed.last_update_slot = Clock::get()?.slot; + feed.confidence = confidence; + Ok(()) + } + + /// Push a new price (and confidence band) to the mock feed. In real + /// Switchboard this would be a signed update from the oracle network; here it + /// is an authority-gated write, because the goal is to drive deterministic + /// test scenarios. + pub fn set_price( + context: Context, + price: i128, + confidence: u64, + ) -> Result<()> { + let feed = &mut context.accounts.feed; + feed.price = price; + feed.last_update_slot = Clock::get()?.slot; + feed.confidence = confidence; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeFeedAccountConstraints<'info> { + #[account( + init, + payer = authority, + space = MockFeed::DISCRIMINATOR.len() + MockFeed::INIT_SPACE, + )] + pub feed: Account<'info, MockFeed>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub system_program: Program<'info, System>, +} + +#[derive(Accounts)] +pub struct SetPriceAccountConstraints<'info> { + #[account( + mut, + has_one = authority, + )] + pub feed: Account<'info, MockFeed>, + + pub authority: Signer<'info>, +} + +/// Mock of a Switchboard On-Demand feed. Real feeds carry many more fields +/// (median, range, sample window, signatures) — this is the bare minimum the +/// prop-amm program needs to price a quote. +#[derive(InitSpace)] +#[account] +pub struct MockFeed { + pub authority: Pubkey, + + /// Signed 128-bit fixed-point price. Real Switchboard prices are also i128. + pub price: i128, + + /// Number of decimal places implied by `price`. E.g. `scale = 8` means + /// `price = 200 * 10^8` represents $200.00000000. + pub scale: u32, + + pub last_update_slot: u64, + + /// Uncertainty band around `price`, in the same fixed point. Real feeds + /// report a standard-deviation-like confidence; consumers reject the price + /// when this is too wide relative to `price`. + pub confidence: u64, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/Cargo.toml b/finance/prop-amm/anchor-v1/programs/prop-amm/Cargo.toml new file mode 100644 index 000000000..fb8a4f9a5 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/Cargo.toml @@ -0,0 +1,47 @@ +[package] +name = "prop_amm" +version = "0.1.0" +description = "Oracle-quoted proprietary AMM example (Lifinity / SolFi / HumidiFi-style)" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "prop_amm" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +# init-if-needed: swap creates the trader's destination token account when it +# doesn't exist yet, so a first-time buyer needs no separate setup transaction. +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" +# For the LastRestartSlot sysvar (not re-exported by anchor-lang): the oracle +# reader rejects prices from before a cluster restart. Same major as the +# solana-sysvar anchor-lang itself uses, so only one copy is compiled in. +solana-sysvar = "3" +# Declared only so Cargo feature-unification turns on `no-entrypoint`; without +# these the test binary links two `entrypoint` symbols and fails to build. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" +# The LiteSVM tests load the compiled mock oracle program; depending on the +# crate here lets the tests reuse its instruction-argument types and program ID. +mock_switchboard = { path = "../mock-switchboard", features = ["no-entrypoint"] } + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/constants.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/constants.rs new file mode 100644 index 000000000..459fb845c --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/constants.rs @@ -0,0 +1,26 @@ +use anchor_lang::prelude::*; + +/// Basis-point denominator: 100% = 10_000 bps. The spread and the oracle +/// confidence limit are expressed in basis points and divided by this. +#[constant] +pub const BASIS_POINTS_DENOMINATOR: u64 = 10_000; + +/// Reject an oracle price older than this many slots. Slot count is what the +/// runtime guarantees; unix timestamps are validator-influenced. How long the +/// window is in seconds follows the cluster's slot time, which the protocol +/// lowers over time, so the window tightens on its own and never loosens. For a +/// market maker this bound is not a nicety: a stale quote is a free option for +/// whoever notices first. +pub const MAX_PRICE_STALENESS_SLOTS: u64 = 150; + +#[constant] +pub const MARKET_SEED: &[u8] = b"market"; + +#[constant] +pub const AUTHORITY_SEED: &[u8] = b"authority"; + +#[constant] +pub const BASE_VAULT_SEED: &[u8] = b"base_vault"; + +#[constant] +pub const QUOTE_VAULT_SEED: &[u8] = b"quote_vault"; diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/errors.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/errors.rs new file mode 100644 index 000000000..1f622fc1e --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/errors.rs @@ -0,0 +1,46 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum PropAmmError { + #[msg("Market parameter is outside the allowed range")] + InvalidParameter, + + #[msg("Amount must be greater than zero")] + ZeroAmount, + + #[msg("Computed output amount rounded down to zero")] + AmountRoundsToZero, + + #[msg("Arithmetic overflow")] + MathOverflow, + + #[msg("The operator has paused this market's quotes")] + MarketPaused, + + #[msg("Output is below the caller's minimum")] + SlippageExceeded, + + #[msg("The market does not hold enough inventory to fill this swap")] + InsufficientInventory, + + #[msg("Swap output exceeds the input's value at the oracle price")] + InvariantViolated, + + #[msg("Oracle price has not been updated recently enough")] + StalePrice, + + #[msg("Oracle price must be positive")] + NonPositivePrice, + + #[msg("Oracle feed scale does not match the market configuration")] + OracleScaleMismatch, + + #[msg("Oracle feed account data is too short to decode")] + OracleDataTooShort, + + #[msg("Oracle price confidence band is too wide to trust")] + OracleConfidenceTooWide, + + #[msg("Oracle price is stale: it predates the last cluster restart")] + PricePredatesRestart, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/deposit_inventory.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/deposit_inventory.rs new file mode 100644 index 000000000..7cd7b6817 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/deposit_inventory.rs @@ -0,0 +1,108 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::{BASE_VAULT_SEED, MARKET_SEED, QUOTE_VAULT_SEED}; +use crate::errors::PropAmmError; +use crate::state::Market; + +pub fn handle_deposit_inventory( + context: Context, + base_amount: u64, + quote_amount: u64, +) -> Result<()> { + require!( + base_amount > 0 || quote_amount > 0, + PropAmmError::ZeroAmount + ); + + if base_amount > 0 { + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.operator_base.to_account_info(), + mint: context.accounts.base_mint.to_account_info(), + to: context.accounts.base_vault.to_account_info(), + authority: context.accounts.operator.to_account_info(), + }, + ), + base_amount, + context.accounts.base_mint.decimals, + )?; + } + + if quote_amount > 0 { + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.operator_quote.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.quote_vault.to_account_info(), + authority: context.accounts.operator.to_account_info(), + }, + ), + quote_amount, + context.accounts.quote_mint.decimals, + )?; + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct DepositInventoryAccountConstraints<'info> { + // `has_one = operator` on the market is the whole access control: only the + // firm's key can stock the market. + #[account(mut)] + pub operator: Signer<'info>, + + #[account( + seeds = [MARKET_SEED, market.base_mint.as_ref(), market.quote_mint.as_ref()], + bump = market.bump, + has_one = operator, + has_one = base_mint, + has_one = quote_mint, + has_one = base_vault, + has_one = quote_vault, + )] + pub market: Box>, + + pub base_mint: Box>, + + pub quote_mint: Box>, + + #[account( + mut, + seeds = [BASE_VAULT_SEED, market.key().as_ref()], + bump, + )] + pub base_vault: Box>, + + #[account( + mut, + seeds = [QUOTE_VAULT_SEED, market.key().as_ref()], + bump, + )] + pub quote_vault: Box>, + + #[account( + mut, + associated_token::mint = base_mint, + associated_token::authority = operator, + associated_token::token_program = token_program, + )] + pub operator_base: Box>, + + #[account( + mut, + associated_token::mint = quote_mint, + associated_token::authority = operator, + associated_token::token_program = token_program, + )] + pub operator_quote: Box>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/initialize_market.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/initialize_market.rs new file mode 100644 index 000000000..056fc96ac --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/initialize_market.rs @@ -0,0 +1,131 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::constants::{ + AUTHORITY_SEED, BASE_VAULT_SEED, BASIS_POINTS_DENOMINATOR, MARKET_SEED, QUOTE_VAULT_SEED, +}; +use crate::errors::PropAmmError; +use crate::state::Market; + +/// Quote parameters set at market creation. Bundled into one struct so the +/// instruction signature stays readable. +#[derive(AnchorSerialize, AnchorDeserialize, Clone)] +pub struct MarketParameters { + /// Decimal places the oracle quotes its price in (e.g. 8). + pub oracle_scale: u32, + + /// Half-spread in basis points: ask = oracle + spread, bid = oracle - spread. + pub spread_bps: u16, + + /// Maximum oracle confidence band tolerated, in basis points of the price. + pub max_confidence_bps: u16, +} + +pub fn handle_initialize_market( + context: Context, + parameters: MarketParameters, +) -> Result<()> { + let denominator = BASIS_POINTS_DENOMINATOR as u16; + // A market quoting the same token against itself prices nothing. + require_keys_neq!( + context.accounts.base_mint.key(), + context.accounts.quote_mint.key(), + PropAmmError::InvalidParameter + ); + // Zero spread means quoting the oracle price for free while paying adverse + // selection on every fill — almost certainly a configuration mistake, so + // it is rejected rather than allowed to bleed. At or above 100% the bid + // goes to zero or below and the quote stops meaning anything. + require!( + parameters.spread_bps > 0 && parameters.spread_bps < denominator, + PropAmmError::InvalidParameter + ); + // Zero would reject every real feed (which always reports some uncertainty); + // above 100% is meaningless. Anything in between is a valid risk choice. + require!( + parameters.max_confidence_bps > 0 && parameters.max_confidence_bps < denominator, + PropAmmError::InvalidParameter + ); + + let market = &mut context.accounts.market; + market.operator = context.accounts.operator.key(); + market.base_mint = context.accounts.base_mint.key(); + market.quote_mint = context.accounts.quote_mint.key(); + market.oracle_feed = context.accounts.oracle_feed.key(); + market.base_vault = context.accounts.base_vault.key(); + market.quote_vault = context.accounts.quote_vault.key(); + market.oracle_scale = parameters.oracle_scale; + market.base_decimals = context.accounts.base_mint.decimals; + market.quote_decimals = context.accounts.quote_mint.decimals; + market.spread_bps = parameters.spread_bps; + market.max_confidence_bps = parameters.max_confidence_bps; + market.paused = false; + market.bump = context.bumps.market; + market.authority_bump = context.bumps.market_authority; + + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializeMarketAccountConstraints<'info> { + #[account(mut)] + pub operator: Signer<'info>, + + // One market per pair: the deployment IS the firm. A real prop AMM is a + // closed program deployed by the market-making firm itself, so there is no + // reason for two markets in the same pair to coexist in one deployment. + #[account( + init, + payer = operator, + space = Market::DISCRIMINATOR.len() + Market::INIT_SPACE, + seeds = [MARKET_SEED, base_mint.key().as_ref(), quote_mint.key().as_ref()], + bump, + )] + pub market: Box>, + + pub base_mint: Box>, + + pub quote_mint: Box>, + + /// CHECK: The oracle feed account. Its key is stored on the market and + /// every read validates the layout, scale, and freshness; it is never + /// trusted by type. Swap for a real Switchboard feed in production. + pub oracle_feed: UncheckedAccount<'info>, + + /// CHECK: PDA that owns both vaults. Holds no data; used only to sign + /// vault CPIs. + #[account( + seeds = [AUTHORITY_SEED, market.key().as_ref()], + bump, + )] + pub market_authority: UncheckedAccount<'info>, + + #[account( + init, + payer = operator, + seeds = [BASE_VAULT_SEED, market.key().as_ref()], + bump, + token::mint = base_mint, + token::authority = market_authority, + token::token_program = token_program, + )] + pub base_vault: Box>, + + #[account( + init, + payer = operator, + seeds = [QUOTE_VAULT_SEED, market.key().as_ref()], + bump, + token::mint = quote_mint, + token::authority = market_authority, + token::token_program = token_program, + )] + pub quote_vault: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/mod.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/mod.rs new file mode 100644 index 000000000..8d4b5cafb --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/mod.rs @@ -0,0 +1,11 @@ +pub mod deposit_inventory; +pub mod initialize_market; +pub mod set_quote; +pub mod swap; +pub mod withdraw_inventory; + +pub use deposit_inventory::*; +pub use initialize_market::*; +pub use set_quote::*; +pub use swap::*; +pub use withdraw_inventory::*; diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/set_quote.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/set_quote.rs new file mode 100644 index 000000000..0b00ce17c --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/set_quote.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; + +use crate::constants::{BASIS_POINTS_DENOMINATOR, MARKET_SEED}; +use crate::errors::PropAmmError; +use crate::state::Market; + +/// Re-quote the market: change the spread, pull the quotes, or restore them. +/// +/// For a market-making firm this is the most-used instruction in the program. +/// A fixed spread is only safe while the world is calm; when volatility rises +/// (or the firm's models disagree with the oracle), the rational moves are to +/// widen the spread or stop quoting entirely. Onchain prop AMMs do exactly +/// this — during fast markets their quotes vanish and return minutes later. +pub fn handle_set_quote( + context: Context, + spread_bps: u16, + paused: bool, +) -> Result<()> { + // Same bounds as at creation: a quote must charge something and the bid + // must stay positive. + require!( + spread_bps > 0 && spread_bps < BASIS_POINTS_DENOMINATOR as u16, + PropAmmError::InvalidParameter + ); + + let market = &mut context.accounts.market; + market.spread_bps = spread_bps; + market.paused = paused; + + Ok(()) +} + +#[derive(Accounts)] +pub struct SetQuoteAccountConstraints<'info> { + pub operator: Signer<'info>, + + #[account( + mut, + seeds = [MARKET_SEED, market.base_mint.as_ref(), market.quote_mint.as_ref()], + bump = market.bump, + has_one = operator, + )] + pub market: Box>, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/swap.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/swap.rs new file mode 100644 index 000000000..ea0f26f97 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/swap.rs @@ -0,0 +1,251 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::constants::{AUTHORITY_SEED, BASE_VAULT_SEED, MARKET_SEED, QUOTE_VAULT_SEED}; +use crate::errors::PropAmmError; +use crate::quote_math; +use crate::state::oracle::read_oracle_price; +use crate::state::{Direction, Market}; + +/// Fill a swap against the operator's quote. +/// +/// The price does not depend on the vault balances, on the size of the trade, +/// or on who traded before you: it is the oracle price plus or minus the +/// spread, full stop. The balances only decide whether the market *can* fill +/// you — a curve AMM's reserves are its pricing input, a prop AMM's inventory +/// is just its ammunition. +pub fn handle_swap( + context: Context, + direction: Direction, + amount_in: u64, + minimum_amount_out: u64, +) -> Result<()> { + let market = &context.accounts.market; + require!(!market.paused, PropAmmError::MarketPaused); + require!(amount_in > 0, PropAmmError::ZeroAmount); + + // Freshness, scale, and confidence are all enforced inside the read. For a + // market maker the staleness bound is the business itself: a quote priced + // off an old number is a free option for whoever notices first. + let oracle_price = read_oracle_price( + &context.accounts.oracle_feed, + market.oracle_scale, + market.max_confidence_bps, + )?; + + let (amount_out, respects_oracle_value) = match direction { + Direction::BuyBase => { + let ask = quote_math::ask_price(oracle_price, market.spread_bps) + .ok_or(PropAmmError::MathOverflow)?; + let base_out = quote_math::base_out_for_quote_in( + amount_in, + ask, + market.oracle_scale, + market.base_decimals, + market.quote_decimals, + ) + .ok_or(PropAmmError::MathOverflow)?; + let respects = quote_math::buy_respects_oracle_value( + amount_in, + base_out, + oracle_price, + market.oracle_scale, + market.base_decimals, + market.quote_decimals, + ) + .ok_or(PropAmmError::MathOverflow)?; + (base_out, respects) + } + Direction::SellBase => { + let bid = quote_math::bid_price(oracle_price, market.spread_bps) + .ok_or(PropAmmError::MathOverflow)?; + let quote_out = quote_math::quote_out_for_base_in( + amount_in, + bid, + market.oracle_scale, + market.base_decimals, + market.quote_decimals, + ) + .ok_or(PropAmmError::MathOverflow)?; + let respects = quote_math::sell_respects_oracle_value( + amount_in, + quote_out, + oracle_price, + market.oracle_scale, + market.base_decimals, + market.quote_decimals, + ) + .ok_or(PropAmmError::MathOverflow)?; + (quote_out, respects) + } + }; + + require!(amount_out > 0, PropAmmError::AmountRoundsToZero); + require!( + amount_out >= minimum_amount_out, + PropAmmError::SlippageExceeded + ); + + // Assert after the math, not just before: whatever the quoting arithmetic + // above produced, the market must never hand out more value than it took + // in, measured at the raw oracle price. The spread and the rounding + // directions make this true by construction; this check makes it true even + // if a refactor breaks one of them. + require!(respects_oracle_value, PropAmmError::InvariantViolated); + + let (vault_out_balance, out_mint_decimals) = match direction { + Direction::BuyBase => ( + context.accounts.base_vault.amount, + context.accounts.base_mint.decimals, + ), + Direction::SellBase => ( + context.accounts.quote_vault.amount, + context.accounts.quote_mint.decimals, + ), + }; + require!( + amount_out <= vault_out_balance, + PropAmmError::InsufficientInventory + ); + + let market_key = market.key(); + let authority_seeds: &[&[u8]] = &[ + AUTHORITY_SEED, + market_key.as_ref(), + &[market.authority_bump], + ]; + + // The trader pays in, then the vault pays out, atomically or not at all. + match direction { + Direction::BuyBase => { + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.trader_quote.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.quote_vault.to_account_info(), + authority: context.accounts.trader.to_account_info(), + }, + ), + amount_in, + context.accounts.quote_mint.decimals, + )?; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.base_vault.to_account_info(), + mint: context.accounts.base_mint.to_account_info(), + to: context.accounts.trader_base.to_account_info(), + authority: context.accounts.market_authority.to_account_info(), + }, + &[authority_seeds], + ), + amount_out, + out_mint_decimals, + )?; + } + Direction::SellBase => { + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.trader_base.to_account_info(), + mint: context.accounts.base_mint.to_account_info(), + to: context.accounts.base_vault.to_account_info(), + authority: context.accounts.trader.to_account_info(), + }, + ), + amount_in, + context.accounts.base_mint.decimals, + )?; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.quote_vault.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.trader_quote.to_account_info(), + authority: context.accounts.market_authority.to_account_info(), + }, + &[authority_seeds], + ), + amount_out, + out_mint_decimals, + )?; + } + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct SwapAccountConstraints<'info> { + #[account(mut)] + pub trader: Signer<'info>, + + #[account( + seeds = [MARKET_SEED, market.base_mint.as_ref(), market.quote_mint.as_ref()], + bump = market.bump, + has_one = base_mint, + has_one = quote_mint, + has_one = oracle_feed, + has_one = base_vault, + has_one = quote_vault, + )] + pub market: Box>, + + /// CHECK: PDA authority over both vaults; holds no data, only signs. + #[account( + seeds = [AUTHORITY_SEED, market.key().as_ref()], + bump = market.authority_bump, + )] + pub market_authority: UncheckedAccount<'info>, + + /// CHECK: validated by the `has_one = oracle_feed` constraint on the market. + pub oracle_feed: UncheckedAccount<'info>, + + pub base_mint: Box>, + + pub quote_mint: Box>, + + #[account( + mut, + seeds = [BASE_VAULT_SEED, market.key().as_ref()], + bump, + )] + pub base_vault: Box>, + + #[account( + mut, + seeds = [QUOTE_VAULT_SEED, market.key().as_ref()], + bump, + )] + pub quote_vault: Box>, + + #[account( + init_if_needed, + payer = trader, + associated_token::mint = base_mint, + associated_token::authority = trader, + associated_token::token_program = token_program, + )] + pub trader_base: Box>, + + #[account( + init_if_needed, + payer = trader, + associated_token::mint = quote_mint, + associated_token::authority = trader, + associated_token::token_program = token_program, + )] + pub trader_quote: Box>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/withdraw_inventory.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/withdraw_inventory.rs new file mode 100644 index 000000000..6caa3649c --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/instructions/withdraw_inventory.rs @@ -0,0 +1,137 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::constants::{AUTHORITY_SEED, BASE_VAULT_SEED, MARKET_SEED, QUOTE_VAULT_SEED}; +use crate::errors::PropAmmError; +use crate::state::Market; + +/// The operator takes inventory back out — up to every token in both vaults, +/// at any time, with nobody's permission. This is the property that separates +/// a prop AMM from the pooled venues earlier in the companion repository: +/// there are no liquidity-provider shares because there are no liquidity +/// providers. The capital being quoted is the firm's own, so its exit needs no +/// waterfall, no share burn, and no pro-rata math. +pub fn handle_withdraw_inventory( + context: Context, + base_amount: u64, + quote_amount: u64, +) -> Result<()> { + require!( + base_amount > 0 || quote_amount > 0, + PropAmmError::ZeroAmount + ); + require!( + base_amount <= context.accounts.base_vault.amount, + PropAmmError::InsufficientInventory + ); + require!( + quote_amount <= context.accounts.quote_vault.amount, + PropAmmError::InsufficientInventory + ); + + let market = &context.accounts.market; + let market_key = market.key(); + let authority_seeds: &[&[u8]] = &[ + AUTHORITY_SEED, + market_key.as_ref(), + &[market.authority_bump], + ]; + + if base_amount > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.base_vault.to_account_info(), + mint: context.accounts.base_mint.to_account_info(), + to: context.accounts.operator_base.to_account_info(), + authority: context.accounts.market_authority.to_account_info(), + }, + &[authority_seeds], + ), + base_amount, + context.accounts.base_mint.decimals, + )?; + } + + if quote_amount > 0 { + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.quote_vault.to_account_info(), + mint: context.accounts.quote_mint.to_account_info(), + to: context.accounts.operator_quote.to_account_info(), + authority: context.accounts.market_authority.to_account_info(), + }, + &[authority_seeds], + ), + quote_amount, + context.accounts.quote_mint.decimals, + )?; + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct WithdrawInventoryAccountConstraints<'info> { + #[account(mut)] + pub operator: Signer<'info>, + + #[account( + seeds = [MARKET_SEED, market.base_mint.as_ref(), market.quote_mint.as_ref()], + bump = market.bump, + has_one = operator, + has_one = base_mint, + has_one = quote_mint, + has_one = base_vault, + has_one = quote_vault, + )] + pub market: Box>, + + /// CHECK: PDA authority over both vaults; holds no data, only signs. + #[account( + seeds = [AUTHORITY_SEED, market.key().as_ref()], + bump = market.authority_bump, + )] + pub market_authority: UncheckedAccount<'info>, + + pub base_mint: Box>, + + pub quote_mint: Box>, + + #[account( + mut, + seeds = [BASE_VAULT_SEED, market.key().as_ref()], + bump, + )] + pub base_vault: Box>, + + #[account( + mut, + seeds = [QUOTE_VAULT_SEED, market.key().as_ref()], + bump, + )] + pub quote_vault: Box>, + + #[account( + mut, + associated_token::mint = base_mint, + associated_token::authority = operator, + associated_token::token_program = token_program, + )] + pub operator_base: Box>, + + #[account( + mut, + associated_token::mint = quote_mint, + associated_token::authority = operator, + associated_token::token_program = token_program, + )] + pub operator_quote: Box>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/lib.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/lib.rs new file mode 100644 index 000000000..0706dfb43 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/lib.rs @@ -0,0 +1,83 @@ +use anchor_lang::prelude::*; + +mod constants; +mod errors; +// Public so the LiteSVM integration tests can build instruction arguments +// (`MarketParameters`, `Direction`) against the program's own types. +pub mod instructions; +pub mod quote_math; +pub mod state; + +use instructions::*; +use state::Direction; + +declare_id!("9ZMtJFtn5n4wwpEeXXG5paFQakcDtrd3ova5ptJL4VT1"); + +/// An oracle-quoted proprietary AMM ("prop AMM"). +/// +/// One operator — a market-making firm — funds a market's inventory with its +/// own capital and quotes both sides of it: anyone may buy the base token at +/// the oracle price plus a spread, or sell it at the oracle price minus the +/// spread. There is no pricing curve, there are no liquidity providers, and +/// there are no shares: the operator is the only capital in the pool, which is +/// the property that gives the design its name. This is the architecture +/// behind venues like Lifinity, SolFi, and HumidiFi, which fill most Solana +/// swaps via aggregator routing. +#[program] +pub mod prop_amm { + use super::*; + + /// Create a market for one base/quote pair, priced by one oracle feed. + /// The signer becomes the market's operator: the only party allowed to + /// move inventory or change the quote. + pub fn initialize_market( + context: Context, + parameters: MarketParameters, + ) -> Result<()> { + instructions::handle_initialize_market(context, parameters) + } + + /// Operator moves inventory into the market's vaults. Either amount may be + /// zero, but not both. + pub fn deposit_inventory( + context: Context, + base_amount: u64, + quote_amount: u64, + ) -> Result<()> { + instructions::handle_deposit_inventory(context, base_amount, quote_amount) + } + + /// Operator withdraws inventory from the market's vaults — up to all of + /// it, at any time. The capital is the operator's own; nobody else has a + /// claim on it. + pub fn withdraw_inventory( + context: Context, + base_amount: u64, + quote_amount: u64, + ) -> Result<()> { + instructions::handle_withdraw_inventory(context, base_amount, quote_amount) + } + + /// Operator re-quotes the market: a new spread, or a pause. Pulling quotes + /// during volatility is not an emergency measure for a market maker; it is + /// Tuesday. + pub fn set_quote( + context: Context, + spread_bps: u16, + paused: bool, + ) -> Result<()> { + instructions::handle_set_quote(context, spread_bps, paused) + } + + /// Swap against the operator's quote: buy the base token at oracle plus + /// spread, or sell it at oracle minus spread. Permissionless. + /// `minimum_amount_out` is slippage protection; pass `0` to opt out. + pub fn swap( + context: Context, + direction: Direction, + amount_in: u64, + minimum_amount_out: u64, + ) -> Result<()> { + instructions::handle_swap(context, direction, amount_in, minimum_amount_out) + } +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/quote_math.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/quote_math.rs new file mode 100644 index 000000000..849e1c303 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/quote_math.rs @@ -0,0 +1,141 @@ +//! The market's pure pricing arithmetic, separated from account handling so it +//! can be unit-tested and model-checked (see `finance/prop-amm/kani-proofs`) +//! without the Solana machinery. +//! +//! Every function returns `None` on the paths the program maps to +//! `PropAmmError::MathOverflow`. Rounding always favors the market: the ask is +//! rounded up, the bid is rounded down, and both output amounts floor. The +//! trader-favoring direction never appears, so the invariant "output value at +//! the oracle price never exceeds input value" holds by construction — and the +//! swap handler still asserts it after the fact. +//! +//! Unit conventions: `oracle_price` is quote tokens per whole base token, as a +//! fixed-point integer with `oracle_scale` decimals (e.g. scale 8 makes $165 +//! into 165 * 10^8). Amounts in and out are minor units of their own token, +//! with `base_decimals` / `quote_decimals` decimal places. Nothing assumes the +//! two tokens have the same decimals. + +/// Basis-point denominator, mirroring `constants::BASIS_POINTS_DENOMINATOR`. +const BASIS_POINTS: u128 = 10_000; + +/// The price a buyer of the base token pays: oracle plus the spread, rounded +/// UP so the rounding penny goes to the market, not the buyer. +pub fn ask_price(oracle_price: u64, spread_bps: u16) -> Option { + let numerator = + (oracle_price as u128).checked_mul(BASIS_POINTS.checked_add(spread_bps as u128)?)?; + Some(numerator.div_ceil(BASIS_POINTS)) +} + +/// The price a seller of the base token receives: oracle minus the spread, +/// rounded DOWN — the same coin, the other face. +pub fn bid_price(oracle_price: u64, spread_bps: u16) -> Option { + let numerator = + (oracle_price as u128).checked_mul(BASIS_POINTS.checked_sub(spread_bps as u128)?)?; + Some(numerator / BASIS_POINTS) +} + +/// Base tokens out for `quote_in` at the ask, floored. +/// +/// Derivation: whole base out = (quote_in / 10^quote_decimals) / (ask / 10^scale), +/// then scaled to base minor units by 10^base_decimals. Multiply everything +/// before the one division so the floor happens exactly once, at the end. +pub fn base_out_for_quote_in( + quote_in: u64, + ask: u128, + oracle_scale: u32, + base_decimals: u8, + quote_decimals: u8, +) -> Option { + let numerator = (quote_in as u128) + .checked_mul(10u128.checked_pow(oracle_scale)?)? + .checked_mul(10u128.checked_pow(base_decimals as u32)?)?; + let denominator = ask.checked_mul(10u128.checked_pow(quote_decimals as u32)?)?; + if denominator == 0 { + return None; + } + u64::try_from(numerator / denominator).ok() +} + +/// Quote tokens out for `base_in` at the bid, floored. +pub fn quote_out_for_base_in( + base_in: u64, + bid: u128, + oracle_scale: u32, + base_decimals: u8, + quote_decimals: u8, +) -> Option { + let numerator = (base_in as u128) + .checked_mul(bid)? + .checked_mul(10u128.checked_pow(quote_decimals as u32)?)?; + let denominator = + 10u128.checked_pow(oracle_scale)?.checked_mul(10u128.checked_pow(base_decimals as u32)?)?; + if denominator == 0 { + return None; + } + u64::try_from(numerator / denominator).ok() +} + +/// Both sides of a swap valued in the same fixed-point unit +/// (quote minor units × 10^scale × 10^base_decimals), cross-multiplied so no +/// division — and therefore no second rounding — is involved. `None` on +/// overflow. +fn values_at_oracle( + base_amount: u64, + quote_amount: u64, + oracle_price: u64, + oracle_scale: u32, + base_decimals: u8, + quote_decimals: u8, +) -> Option<(u128, u128)> { + let base_value = (base_amount as u128) + .checked_mul(oracle_price as u128)? + .checked_mul(10u128.checked_pow(quote_decimals as u32)?)?; + let quote_value = (quote_amount as u128) + .checked_mul(10u128.checked_pow(oracle_scale)?)? + .checked_mul(10u128.checked_pow(base_decimals as u32)?)?; + Some((base_value, quote_value)) +} + +/// The swap handler's post-math invariant for a buy: the base tokens handed +/// out must be worth no more, at the raw oracle price (no spread), than the +/// quote tokens taken in. Whatever the quoting arithmetic above produced, the +/// market never pays out more value than it received. +pub fn buy_respects_oracle_value( + quote_in: u64, + base_out: u64, + oracle_price: u64, + oracle_scale: u32, + base_decimals: u8, + quote_decimals: u8, +) -> Option { + let (base_value, quote_value) = values_at_oracle( + base_out, + quote_in, + oracle_price, + oracle_scale, + base_decimals, + quote_decimals, + )?; + Some(base_value <= quote_value) +} + +/// The same invariant for a sell: the quote tokens handed out must be worth no +/// more, at the raw oracle price, than the base tokens taken in. +pub fn sell_respects_oracle_value( + base_in: u64, + quote_out: u64, + oracle_price: u64, + oracle_scale: u32, + base_decimals: u8, + quote_decimals: u8, +) -> Option { + let (base_value, quote_value) = values_at_oracle( + base_in, + quote_out, + oracle_price, + oracle_scale, + base_decimals, + quote_decimals, + )?; + Some(quote_value <= base_value) +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/market.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/market.rs new file mode 100644 index 000000000..8aac7c7b0 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/market.rs @@ -0,0 +1,70 @@ +use anchor_lang::prelude::*; + +/// Which side of the quote a swap takes. +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq, Debug)] +pub enum Direction { + /// Spend the quote token, receive the base token, priced at the ask + /// (oracle plus spread). + BuyBase, + /// Spend the base token, receive the quote token, priced at the bid + /// (oracle minus spread). + SellBase, +} + +/// One quoted market: a base/quote token pair priced by one oracle feed, with +/// inventory owned entirely by one operator. +/// +/// Note what this account does NOT hold, compared to a curve AMM's pool: no +/// liquidity-provider mint, no fee ledger, no reserves that pricing depends +/// on. The price comes from the oracle; the vault balances only bound how much +/// of a fill is possible. And because nobody but the operator has a claim on +/// the vaults, the token balances themselves are the complete accounting. +#[account] +#[derive(InitSpace)] +pub struct Market { + /// The market-making firm. Deposits and withdraws inventory, sets the + /// spread, pauses quoting. Cannot touch anyone else's funds, because the + /// market never holds anyone else's funds. + pub operator: Pubkey, + + pub base_mint: Pubkey, + + pub quote_mint: Pubkey, + + /// Oracle feed this market quotes from. Stored so handlers can reject any + /// substituted feed account. + pub oracle_feed: Pubkey, + + pub base_vault: Pubkey, + + pub quote_vault: Pubkey, + + /// Decimal places the oracle price is quoted in. Pinned at creation so a + /// feed that silently changes scale is rejected rather than mis-read. + pub oracle_scale: u32, + + /// Decimals of the two mints, pinned at creation so the quote math never + /// has to trust a passed-in mint account for them. + pub base_decimals: u8, + + pub quote_decimals: u8, + + /// Half-spread in basis points: the ask is the oracle price plus this, the + /// bid is the oracle price minus it. The spread is the operator's entire + /// revenue — there is no separate fee. + pub spread_bps: u16, + + /// Maximum oracle confidence band, in basis points of the price, that the + /// market will quote against. A wider band is rejected as untrustworthy. + pub max_confidence_bps: u16, + + /// True while the operator has pulled its quotes. Swaps are rejected; + /// inventory operations still work. + pub paused: bool, + + pub bump: u8, + + /// Bump for the vault authority PDA, stored so CPIs can sign without + /// re-deriving it. + pub authority_bump: u8, +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/mod.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/mod.rs new file mode 100644 index 000000000..cf6914558 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/mod.rs @@ -0,0 +1,4 @@ +pub mod market; +pub mod oracle; + +pub use market::*; diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/oracle.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/oracle.rs new file mode 100644 index 000000000..83479816a --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/src/state/oracle.rs @@ -0,0 +1,114 @@ +use anchor_lang::prelude::*; +use solana_sysvar::last_restart_slot::LastRestartSlot; + +use crate::constants::{BASIS_POINTS_DENOMINATOR, MAX_PRICE_STALENESS_SLOTS}; +use crate::errors::PropAmmError; + +// Byte layout of the feed account this program reads. It matches the +// `mock_switchboard::MockFeed` account: an 8-byte Anchor discriminator followed +// by `authority: Pubkey (32)`, `price: i128 (16)`, `scale: u32 (4)`, +// `last_update_slot: u64 (8)`, `confidence: u64 (8)`. +// +// We read the raw bytes rather than deserializing the mock account type so this +// program stays decoupled from the mock. To consume a real Switchboard +// On-Demand feed, replace the offsets below with a call to +// `switchboard_on_demand::PullFeedAccountData::parse_and_verify(...)`, which +// also checks the Ed25519 signatures over the price update — the only other +// change is the feed account's owning program ID. +// +// A real feed reports a value plus a `confidence` band (a standard-deviation-like +// uncertainty). This reader rejects a price whose band is too wide relative to +// the price — skipping that check is the most common oracle footgun, and for a +// market maker it is existential: quoting a tight spread around a price the +// oracle itself is unsure of is how inventory walks out the door. +// +// The feed account's owning program is NOT checked here: the market trusts +// whatever feed address its operator configured, which is inside the trust +// model (the operator quotes its own capital against its own oracle choice; a +// bad feed loses the operator's money, not the traders'). A production reader +// must still verify the account owner is the oracle program, which +// `parse_and_verify` does. +const PRICE_OFFSET: usize = 8 + 32; +const SCALE_OFFSET: usize = PRICE_OFFSET + 16; +const LAST_UPDATE_SLOT_OFFSET: usize = SCALE_OFFSET + 4; +const CONFIDENCE_OFFSET: usize = LAST_UPDATE_SLOT_OFFSET + 8; +const FEED_MINIMUM_LENGTH: usize = CONFIDENCE_OFFSET + 8; + +/// Read and validate the oracle price from `feed`. +/// +/// Returns the price as a `u64` in the market's `expected_scale` fixed point. +/// Rejects a stale price (older than `MAX_PRICE_STALENESS_SLOTS`), a +/// non-positive price, a feed whose scale differs from the market's pinned +/// scale, and a price whose confidence band exceeds `max_confidence_bps` of +/// the price. +pub fn read_oracle_price( + feed: &AccountInfo, + expected_scale: u32, + max_confidence_bps: u16, +) -> Result { + let data = feed.try_borrow_data()?; + require!( + data.len() >= FEED_MINIMUM_LENGTH, + PropAmmError::OracleDataTooShort + ); + + let price = i128::from_le_bytes( + data[PRICE_OFFSET..PRICE_OFFSET + 16] + .try_into() + .map_err(|_| PropAmmError::OracleDataTooShort)?, + ); + let scale = u32::from_le_bytes( + data[SCALE_OFFSET..SCALE_OFFSET + 4] + .try_into() + .map_err(|_| PropAmmError::OracleDataTooShort)?, + ); + let last_update_slot = u64::from_le_bytes( + data[LAST_UPDATE_SLOT_OFFSET..LAST_UPDATE_SLOT_OFFSET + 8] + .try_into() + .map_err(|_| PropAmmError::OracleDataTooShort)?, + ); + let confidence = u64::from_le_bytes( + data[CONFIDENCE_OFFSET..CONFIDENCE_OFFSET + 8] + .try_into() + .map_err(|_| PropAmmError::OracleDataTooShort)?, + ); + + require!(price > 0, PropAmmError::NonPositivePrice); + require_eq!(scale, expected_scale, PropAmmError::OracleScaleMismatch); + + // `saturating_sub` floors the age at zero, so a feed slot momentarily ahead + // of the local clock reads as fresh rather than wrapping to a huge age. + let current_slot = Clock::get()?.slot; + require!( + current_slot.saturating_sub(last_update_slot) <= MAX_PRICE_STALENESS_SLOTS, + PropAmmError::StalePrice + ); + + // Restart handling. A cluster halt stops the slot count but not the wall + // clock, so after a restart a feed can look fresh in slots while its + // price is hours old. For a market maker that is a free option for + // whoever trades first, so reject any price stamped at or before the + // restart slot; the market refuses to quote until the publisher posts + // again. Zero means the cluster has never restarted. + let last_restart_slot = LastRestartSlot::get()?.last_restart_slot; + require!( + last_restart_slot == 0 || last_update_slot > last_restart_slot, + PropAmmError::PricePredatesRestart + ); + + // Reject an untrustworthy price: confidence band as a fraction of price, + // in basis points, must not exceed the market's limit. Widen to u128 so the + // product cannot overflow, and `price > 0` is already guaranteed. + let confidence_bps = (confidence as u128) + .checked_mul(BASIS_POINTS_DENOMINATOR as u128) + .ok_or(PropAmmError::MathOverflow)? + .checked_div(price as u128) + .ok_or(PropAmmError::MathOverflow)?; + require!( + confidence_bps <= max_confidence_bps as u128, + PropAmmError::OracleConfidenceTooWide + ); + + let price: u64 = price.try_into().map_err(|_| PropAmmError::MathOverflow)?; + Ok(price) +} diff --git a/finance/prop-amm/anchor-v1/programs/prop-amm/tests/test_prop_amm.rs b/finance/prop-amm/anchor-v1/programs/prop-amm/tests/test_prop_amm.rs new file mode 100644 index 000000000..5f10fb4a6 --- /dev/null +++ b/finance/prop-amm/anchor-v1/programs/prop-amm/tests/test_prop_amm.rs @@ -0,0 +1,758 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + AccountDeserialize, InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + prop_amm::{ + instructions::initialize_market::MarketParameters, + state::{Direction, Market as MarketState}, + }, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, + send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +// Both tokens have 6 decimals: the base is NVDAx (tokenized NVIDIA stock) and +// the quote is USDC, so one whole unit of either is 1_000_000 minor units. +const ONE_TOKEN: u64 = 1_000_000; +const DECIMALS: u8 = 6; + +// The oracle quotes prices with 8 decimals, so $165 is 165 * 10^8. +const ORACLE_SCALE: u32 = 8; + +// 10 basis points each side of the oracle price. +const SPREAD_BPS: u16 = 10; +const MAX_CONFIDENCE_BPS: u16 = 100; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ) + .0 +} + +/// Oracle price for a whole-dollar amount, in the feed's fixed point. +fn dollars(whole: i128) -> i128 { + whole * 10i128.pow(ORACLE_SCALE) +} + +/// One deployed market plus the keys needed to drive it. +struct Market { + svm: LiteSVM, + payer: Keypair, + operator: Keypair, + operator_base: Pubkey, + operator_quote: Pubkey, + base_mint: Pubkey, + quote_mint: Pubkey, + feed: Pubkey, + market: Pubkey, + market_authority: Pubkey, + base_vault: Pubkey, + quote_vault: Pubkey, +} + +impl Market { + /// Stand up a market at the given starting oracle price. The operator is + /// also the oracle feed authority and holds funded inventory accounts. + fn new(initial_price: i128) -> Market { + let parameters = MarketParameters { + oracle_scale: ORACLE_SCALE, + spread_bps: SPREAD_BPS, + max_confidence_bps: MAX_CONFIDENCE_BPS, + }; + Market::try_new(initial_price, parameters).expect("market initialization should succeed") + } + + /// Like `new`, but takes the full parameter set and surfaces an + /// `initialize_market` rejection instead of panicking, so tests can probe + /// the parameter validation. + fn try_new(initial_price: i128, parameters: MarketParameters) -> Result { + let mut svm = LiteSVM::new(); + svm.add_program( + prop_amm::id(), + include_bytes!("../../../target/deploy/prop_amm.so"), + ) + .unwrap(); + // Use std::fs::read() instead of include_bytes!() for the switchboard program because + // include_bytes!() runs at compile time, and during `anchor build` the IDL generation + // step compiles tests before the .so files exist. Since this is a cross-program + // dependency (not our own program), mock_switchboard.so may not be built yet at compile time. + let switchboard_bytes = std::fs::read(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../target/deploy/mock_switchboard.so" + )) + .expect("mock_switchboard.so not found - run `anchor build` first"); + svm.add_program(mock_switchboard::id(), &switchboard_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let operator = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let base_mint = create_token_mint(&mut svm, &operator, DECIMALS, None).unwrap(); + let quote_mint = create_token_mint(&mut svm, &operator, DECIMALS, None).unwrap(); + + // Create the mock oracle feed as a fresh account owned by the mock + // program; the operator is its update authority. + let feed_keypair = Keypair::new(); + let initialize_feed = Instruction::new_with_bytes( + mock_switchboard::id(), + &mock_switchboard::instruction::InitializeFeed { + price: initial_price, + scale: ORACLE_SCALE, + confidence: 0, + } + .data(), + mock_switchboard::accounts::InitializeFeedAccountConstraints { + feed: feed_keypair.pubkey(), + authority: operator.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_feed], + &[&operator, &feed_keypair], + &operator.pubkey(), + ) + .unwrap(); + let feed = feed_keypair.pubkey(); + + let market = Pubkey::find_program_address( + &[b"market", base_mint.as_ref(), quote_mint.as_ref()], + &prop_amm::id(), + ) + .0; + let market_authority = + Pubkey::find_program_address(&[b"authority", market.as_ref()], &prop_amm::id()).0; + let base_vault = + Pubkey::find_program_address(&[b"base_vault", market.as_ref()], &prop_amm::id()).0; + let quote_vault = + Pubkey::find_program_address(&[b"quote_vault", market.as_ref()], &prop_amm::id()).0; + + let initialize_market = Instruction::new_with_bytes( + prop_amm::id(), + &prop_amm::instruction::InitializeMarket { parameters }.data(), + prop_amm::accounts::InitializeMarketAccountConstraints { + operator: operator.pubkey(), + market, + base_mint, + quote_mint, + oracle_feed: feed, + market_authority, + base_vault, + quote_vault, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_market], + &[&operator], + &operator.pubkey(), + ) + .map_err(|_| ())?; + + // Fund the operator's inventory accounts. + let operator_base = create_associated_token_account( + &mut svm, + &operator.pubkey(), + &base_mint, + &payer, + ) + .unwrap(); + let operator_quote = create_associated_token_account( + &mut svm, + &operator.pubkey(), + "e_mint, + &payer, + ) + .unwrap(); + mint_tokens_to_token_account( + &mut svm, + &base_mint, + &operator_base, + 10_000 * ONE_TOKEN, + &operator, + ) + .unwrap(); + mint_tokens_to_token_account( + &mut svm, + "e_mint, + &operator_quote, + 10_000_000 * ONE_TOKEN, + &operator, + ) + .unwrap(); + + Ok(Market { + svm, + payer, + operator, + operator_base, + operator_quote, + base_mint, + quote_mint, + feed, + market, + market_authority, + base_vault, + quote_vault, + }) + } + + /// A market at $165 stocked with 1,000 NVDAx and 200,000 USDC. + fn default_market() -> Market { + let mut market = Market::new(dollars(165)); + market + .deposit_inventory(1_000 * ONE_TOKEN, 200_000 * ONE_TOKEN) + .unwrap(); + market + } + + fn market_state(&self) -> MarketState { + let account = self.svm.get_account(&self.market).unwrap(); + MarketState::try_deserialize(&mut account.data.as_slice()).unwrap() + } + + fn set_price(&mut self, price: i128) { + self.set_price_with_confidence(price, 0); + } + + fn set_price_with_confidence(&mut self, price: i128, confidence: u64) { + let set_price = Instruction::new_with_bytes( + mock_switchboard::id(), + &mock_switchboard::instruction::SetPrice { price, confidence }.data(), + mock_switchboard::accounts::SetPriceAccountConstraints { + feed: self.feed, + authority: self.operator.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut self.svm, + vec![set_price], + &[&self.operator], + &self.operator.pubkey(), + ) + .unwrap(); + } + + fn warp(&mut self, slot: u64) { + self.svm.warp_to_slot(slot); + self.svm.expire_blockhash(); + } + + fn current_slot(&self) -> u64 { + self.svm.get_sysvar::().slot + } + + /// Simulate a cluster restart at `slot`: prices stamped at or before it + /// must be rejected until the publisher posts again. + fn set_last_restart_slot(&mut self, slot: u64) { + self.svm.set_sysvar(&solana_sysvar::last_restart_slot::LastRestartSlot { + last_restart_slot: slot, + }); + } + + /// Create a wallet holding `base` and `quote` minor units in associated + /// token accounts. + fn funded_trader(&mut self, base: u64, quote: u64) -> (Keypair, Pubkey, Pubkey) { + let trader = create_wallet(&mut self.svm, 100_000_000_000).unwrap(); + let base_account = create_associated_token_account( + &mut self.svm, + &trader.pubkey(), + &self.base_mint, + &self.payer, + ) + .unwrap(); + let quote_account = create_associated_token_account( + &mut self.svm, + &trader.pubkey(), + &self.quote_mint, + &self.payer, + ) + .unwrap(); + if base > 0 { + mint_tokens_to_token_account( + &mut self.svm, + &self.base_mint, + &base_account, + base, + &self.operator, + ) + .unwrap(); + } + if quote > 0 { + mint_tokens_to_token_account( + &mut self.svm, + &self.quote_mint, + "e_account, + quote, + &self.operator, + ) + .unwrap(); + } + (trader, base_account, quote_account) + } + + /// Inventory movement signed by `signer` (the operator in honest tests, an + /// imposter in the access-control tests). + fn move_inventory_as( + &mut self, + signer: &Keypair, + deposit: bool, + base_amount: u64, + quote_amount: u64, + ) -> Result<(), ()> { + let signer_base = derive_ata(&signer.pubkey(), &self.base_mint); + let signer_quote = derive_ata(&signer.pubkey(), &self.quote_mint); + let instruction = if deposit { + Instruction::new_with_bytes( + prop_amm::id(), + &prop_amm::instruction::DepositInventory { + base_amount, + quote_amount, + } + .data(), + prop_amm::accounts::DepositInventoryAccountConstraints { + operator: signer.pubkey(), + market: self.market, + base_mint: self.base_mint, + quote_mint: self.quote_mint, + base_vault: self.base_vault, + quote_vault: self.quote_vault, + operator_base: signer_base, + operator_quote: signer_quote, + token_program: token_program_id(), + } + .to_account_metas(None), + ) + } else { + Instruction::new_with_bytes( + prop_amm::id(), + &prop_amm::instruction::WithdrawInventory { + base_amount, + quote_amount, + } + .data(), + prop_amm::accounts::WithdrawInventoryAccountConstraints { + operator: signer.pubkey(), + market: self.market, + market_authority: self.market_authority, + base_mint: self.base_mint, + quote_mint: self.quote_mint, + base_vault: self.base_vault, + quote_vault: self.quote_vault, + operator_base: signer_base, + operator_quote: signer_quote, + token_program: token_program_id(), + } + .to_account_metas(None), + ) + }; + send_transaction_from_instructions(&mut self.svm, vec![instruction], &[signer], &signer.pubkey()) + .map(|_| ()) + .map_err(|_| ()) + } + + fn deposit_inventory(&mut self, base_amount: u64, quote_amount: u64) -> Result<(), ()> { + let operator = self.operator.insecure_clone(); + self.move_inventory_as(&operator, true, base_amount, quote_amount) + } + + fn withdraw_inventory(&mut self, base_amount: u64, quote_amount: u64) -> Result<(), ()> { + let operator = self.operator.insecure_clone(); + self.move_inventory_as(&operator, false, base_amount, quote_amount) + } + + fn set_quote_as(&mut self, signer: &Keypair, spread_bps: u16, paused: bool) -> Result<(), ()> { + let instruction = Instruction::new_with_bytes( + prop_amm::id(), + &prop_amm::instruction::SetQuote { spread_bps, paused }.data(), + prop_amm::accounts::SetQuoteAccountConstraints { + operator: signer.pubkey(), + market: self.market, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut self.svm, vec![instruction], &[signer], &signer.pubkey()) + .map(|_| ()) + .map_err(|_| ()) + } + + fn set_quote(&mut self, spread_bps: u16, paused: bool) -> Result<(), ()> { + let operator = self.operator.insecure_clone(); + self.set_quote_as(&operator, spread_bps, paused) + } + + fn swap( + &mut self, + trader: &Keypair, + direction: Direction, + amount_in: u64, + minimum_amount_out: u64, + ) -> Result<(), ()> { + let trader_base = derive_ata(&trader.pubkey(), &self.base_mint); + let trader_quote = derive_ata(&trader.pubkey(), &self.quote_mint); + let instruction = Instruction::new_with_bytes( + prop_amm::id(), + &prop_amm::instruction::Swap { + direction, + amount_in, + minimum_amount_out, + } + .data(), + prop_amm::accounts::SwapAccountConstraints { + trader: trader.pubkey(), + market: self.market, + market_authority: self.market_authority, + oracle_feed: self.feed, + base_mint: self.base_mint, + quote_mint: self.quote_mint, + base_vault: self.base_vault, + quote_vault: self.quote_vault, + trader_base, + trader_quote, + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut self.svm, vec![instruction], &[trader], &trader.pubkey()) + .map(|_| ()) + .map_err(|_| ()) + } + + fn balance(&self, token_account: &Pubkey) -> u64 { + get_token_account_balance(&self.svm, token_account).unwrap() + } +} + +// =========================================================================== +// Happy paths: exact quote math in both directions +// =========================================================================== + +/// Alice buys 5 NVDAx. At $165 with a 10 bps spread the ask is $165.165, so +/// 5 NVDAx costs exactly 825.825 USDC. +#[test] +fn test_swap_buys_base_at_the_ask() { + let mut market = Market::default_market(); + let quote_in = 825_825_000; // 825.825 USDC + let (alice, alice_base, alice_quote) = market.funded_trader(0, quote_in); + + market + .swap(&alice, Direction::BuyBase, quote_in, 5 * ONE_TOKEN) + .unwrap(); + + assert_eq!(market.balance(&alice_base), 5 * ONE_TOKEN); + assert_eq!(market.balance(&alice_quote), 0); + // Conservation: the vaults moved by exactly the two legs of the fill. + assert_eq!(market.balance(&market.base_vault), 995 * ONE_TOKEN); + assert_eq!( + market.balance(&market.quote_vault), + 200_000 * ONE_TOKEN + quote_in + ); +} + +/// Bob sells 5 NVDAx. At $165 with a 10 bps spread the bid is $164.835, so +/// he receives exactly 824.175 USDC. +#[test] +fn test_swap_sells_base_at_the_bid() { + let mut market = Market::default_market(); + let (bob, bob_base, bob_quote) = market.funded_trader(5 * ONE_TOKEN, 0); + + market + .swap(&bob, Direction::SellBase, 5 * ONE_TOKEN, 824_175_000) + .unwrap(); + + assert_eq!(market.balance(&bob_base), 0); + assert_eq!(market.balance(&bob_quote), 824_175_000); // 824.175 USDC + assert_eq!(market.balance(&market.base_vault), 1_005 * ONE_TOKEN); + assert_eq!( + market.balance(&market.quote_vault), + 200_000 * ONE_TOKEN - 824_175_000 + ); +} + +/// A buy immediately followed by a sell of the same 5 NVDAx costs exactly the +/// round-trip spread: 1.65 USDC on an $825 position, all of which stays in +/// the market's inventory. The spread IS the fee; there is no other one. +#[test] +fn test_round_trip_costs_exactly_the_spread() { + let mut market = Market::default_market(); + let quote_in = 825_825_000; + let (carol, carol_base, carol_quote) = market.funded_trader(0, quote_in); + + market + .swap(&carol, Direction::BuyBase, quote_in, 0) + .unwrap(); + market + .swap(&carol, Direction::SellBase, 5 * ONE_TOKEN, 0) + .unwrap(); + + assert_eq!(market.balance(&carol_base), 0); + // 825.825 in, 824.175 back: the market kept 1.65 USDC. + assert_eq!(market.balance(&carol_quote), quote_in - 1_650_000); + assert_eq!(market.balance(&market.base_vault), 1_000 * ONE_TOKEN); + assert_eq!( + market.balance(&market.quote_vault), + 200_000 * ONE_TOKEN + 1_650_000 + ); +} + +/// When the oracle reprices, the quote follows instantly — no trade has to +/// drag the price there through a curve. At $170 the ask is $170.17, so 5 +/// NVDAx costs exactly 850.85 USDC. +#[test] +fn test_quote_follows_the_oracle() { + let mut market = Market::default_market(); + market.set_price(dollars(170)); + + let quote_in = 850_850_000; // 850.85 USDC + let (alice, alice_base, _) = market.funded_trader(0, quote_in); + market + .swap(&alice, Direction::BuyBase, quote_in, 5 * ONE_TOKEN) + .unwrap(); + + assert_eq!(market.balance(&alice_base), 5 * ONE_TOKEN); +} + +/// The operator re-quotes to a 50 bps spread; the next fill prices at +/// $165.825, so 5 NVDAx costs exactly 829.125 USDC. +#[test] +fn test_set_quote_changes_the_spread() { + let mut market = Market::default_market(); + market.set_quote(50, false).unwrap(); + assert_eq!(market.market_state().spread_bps, 50); + + let quote_in = 829_125_000; // 829.125 USDC + let (alice, alice_base, _) = market.funded_trader(0, quote_in); + market + .swap(&alice, Direction::BuyBase, quote_in, 5 * ONE_TOKEN) + .unwrap(); + + assert_eq!(market.balance(&alice_base), 5 * ONE_TOKEN); +} + +// =========================================================================== +// The operator's capital: deposit, withdraw, and the full exit +// =========================================================================== + +/// The operator can withdraw every token in both vaults at any time — its +/// capital, its exit. Afterwards the market still exists but cannot fill, +/// which is exactly what an empty prop AMM should do: reject, not misprice. +#[test] +fn test_operator_can_withdraw_everything_and_swaps_then_fail() { + let mut market = Market::default_market(); + market + .withdraw_inventory(1_000 * ONE_TOKEN, 200_000 * ONE_TOKEN) + .unwrap(); + + assert_eq!(market.balance(&market.base_vault), 0); + assert_eq!(market.balance(&market.quote_vault), 0); + let operator_base = market.operator_base; + let operator_quote = market.operator_quote; + assert_eq!(market.balance(&operator_base), 10_000 * ONE_TOKEN); + assert_eq!(market.balance(&operator_quote), 10_000_000 * ONE_TOKEN); + + let (alice, _, _) = market.funded_trader(0, 825_825_000); + assert!(market + .swap(&alice, Direction::BuyBase, 825_825_000, 0) + .is_err()); +} + +#[test] +fn test_withdraw_more_than_inventory_fails() { + let mut market = Market::default_market(); + assert!(market + .withdraw_inventory(1_001 * ONE_TOKEN, 0) + .is_err()); +} + +#[test] +fn test_deposit_inventory_rejects_non_operator() { + let mut market = Market::default_market(); + let (mallory, _, _) = market.funded_trader(ONE_TOKEN, ONE_TOKEN); + assert!(market + .move_inventory_as(&mallory, true, ONE_TOKEN, 0) + .is_err()); +} + +#[test] +fn test_withdraw_inventory_rejects_non_operator() { + let mut market = Market::default_market(); + let (mallory, _, _) = market.funded_trader(0, 0); + assert!(market + .move_inventory_as(&mallory, false, ONE_TOKEN, 0) + .is_err()); +} + +#[test] +fn test_set_quote_rejects_non_operator() { + let mut market = Market::default_market(); + let (mallory, _, _) = market.funded_trader(0, 0); + assert!(market.set_quote_as(&mallory, 500, true).is_err()); +} + +// =========================================================================== +// Swap rejections: every gate has a test that proves it shuts +// =========================================================================== + +/// A fill below the caller's minimum is rejected, not filled worse. +#[test] +fn test_swap_rejects_slippage() { + let mut market = Market::default_market(); + let quote_in = 825_825_000; + let (alice, _, _) = market.funded_trader(0, quote_in); + // The fill would be exactly 5 NVDAx; demand one minor unit more. + assert!(market + .swap(&alice, Direction::BuyBase, quote_in, 5 * ONE_TOKEN + 1) + .is_err()); +} + +/// An oracle price older than the staleness bound cannot be traded against. +/// A lagging quote is a free option for arbitrageurs, so the market refuses to +/// quote at all rather than quote wrong. +#[test] +fn test_swap_rejects_stale_price() { + let mut market = Market::default_market(); + let (alice, _, _) = market.funded_trader(0, 825_825_000); + // The feed was last updated near slot 0; 200 slots later it is stale + // (the bound is 150 slots). + market.warp(200); + assert!(market + .swap(&alice, Direction::BuyBase, 825_825_000, 0) + .is_err()); +} + +/// A cluster restart passes hours of wall-clock time in zero slots, so a price +/// published before the halt can still look fresh by slot count. The market +/// must refuse to quote against it until the publisher posts again. +#[test] +fn test_swap_rejects_price_from_before_a_restart() { + let mut market = Market::default_market(); + market.set_price(dollars(165)); + let (alice, _, _) = market.funded_trader(0, 825_825_000); + + // Simulate a halt: the cluster restarts a few slots after the price was + // published, well inside the 150-slot staleness bound, so only the + // restart check can catch the pre-halt price. + let published_at = market.current_slot(); + market.warp(published_at + 5); + market.set_last_restart_slot(published_at + 3); + + assert!(market + .swap(&alice, Direction::BuyBase, 825_825_000, 0) + .is_err()); + + // Publishing after the restart reopens the market. Warp first: the retry is + // otherwise byte-identical to the rejected swap, so it would carry the same + // signature and be dropped as already processed. + market.warp(published_at + 6); + market.set_price(dollars(165)); + market + .swap(&alice, Direction::BuyBase, 825_825_000, 0) + .expect("a freshly published price must be accepted after a restart"); +} + +/// A price the oracle itself is unsure about is rejected: the confidence band +/// (about 1.2% here) exceeds the market's 1% limit. +#[test] +fn test_swap_rejects_wide_confidence() { + let mut market = Market::default_market(); + market.set_price_with_confidence(dollars(165), 200_000_000); + let (alice, _, _) = market.funded_trader(0, 825_825_000); + assert!(market + .swap(&alice, Direction::BuyBase, 825_825_000, 0) + .is_err()); +} + +/// While the operator has pulled its quotes, nobody can swap. +#[test] +fn test_swap_rejects_when_paused() { + let mut market = Market::default_market(); + market.set_quote(SPREAD_BPS, true).unwrap(); + let (alice, _, _) = market.funded_trader(0, 825_825_000); + assert!(market + .swap(&alice, Direction::BuyBase, 825_825_000, 0) + .is_err()); + + // Unpausing restores the exact same quote. + market.set_quote(SPREAD_BPS, false).unwrap(); + market + .swap(&alice, Direction::BuyBase, 825_825_000, 5 * ONE_TOKEN) + .unwrap(); +} + +#[test] +fn test_swap_rejects_zero_amount() { + let mut market = Market::default_market(); + let (alice, _, _) = market.funded_trader(0, ONE_TOKEN); + assert!(market.swap(&alice, Direction::BuyBase, 0, 0).is_err()); +} + +/// A buy bigger than the base inventory is rejected whole — a prop AMM never +/// partially fills, and never prices what it cannot deliver. +#[test] +fn test_swap_rejects_insufficient_inventory() { + let mut market = Market::default_market(); + // 1,100 NVDAx at $165.165 ≈ 181,681.50 USDC — affordable for the trader, + // but the vault only holds 1,000 NVDAx. + let quote_in = 181_681_500_000; + let (whale, _, _) = market.funded_trader(0, quote_in); + assert!(market.swap(&whale, Direction::BuyBase, quote_in, 0).is_err()); +} + +// =========================================================================== +// Parameter validation +// =========================================================================== + +#[test] +fn test_initialize_market_rejects_zero_spread() { + let parameters = MarketParameters { + oracle_scale: ORACLE_SCALE, + spread_bps: 0, + max_confidence_bps: MAX_CONFIDENCE_BPS, + }; + assert!(Market::try_new(dollars(165), parameters).is_err()); +} + +#[test] +fn test_initialize_market_rejects_full_spread() { + let parameters = MarketParameters { + oracle_scale: ORACLE_SCALE, + spread_bps: 10_000, + max_confidence_bps: MAX_CONFIDENCE_BPS, + }; + assert!(Market::try_new(dollars(165), parameters).is_err()); +} + +#[test] +fn test_set_quote_rejects_invalid_spread() { + let mut market = Market::default_market(); + assert!(market.set_quote(0, false).is_err()); + assert!(market.set_quote(10_000, false).is_err()); +} diff --git a/finance/prop-amm/anchor/README.md b/finance/prop-amm/anchor/README.md index 9b94124f0..3f6722fc4 100644 --- a/finance/prop-amm/anchor/README.md +++ b/finance/prop-amm/anchor/README.md @@ -1,5 +1,11 @@ # Solana Prop AMM (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + An oracle-quoted **proprietary AMM** on Solana: a market-making firm funds a trading venue with its own capital and quotes both sides of it. Anyone can buy the base token at the oracle price plus a spread, or sell at the oracle price diff --git a/finance/token-fundraiser/anchor-v1/Anchor.toml b/finance/token-fundraiser/anchor-v1/Anchor.toml new file mode 100644 index 000000000..ebdd5291a --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/Anchor.toml @@ -0,0 +1,21 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +fundraiser = "Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC" + +[programs.devnet] +fundraiser = "Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/finance/token-fundraiser/anchor-v1/CHANGELOG.md b/finance/token-fundraiser/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/finance/token-fundraiser/anchor-v1/Cargo.toml b/finance/token-fundraiser/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/token-fundraiser/anchor-v1/README.md b/finance/token-fundraiser/anchor-v1/README.md new file mode 100644 index 000000000..7d5b0c0e9 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/README.md @@ -0,0 +1,165 @@ +# Solana Token Fundraiser (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Onchain crowdfunding on Solana: a program that collects tokens toward a target amount, like Kickstarter without a payment processor. A **maker** creates a fundraiser [account](https://solana.com/docs/terminology#account), specifies the [mint](https://solana.com/docs/terminology#token-mint) they want to receive, the target amount, and a duration in days. **Contributors** contribute while the window is open. If the target is reached, the maker claims the funds; if it is not reached by the deadline, contributors can refund, and once refunds are complete the maker can retire the fundraiser and open a new one. + +## Architecture + +The fundraiser state account: + +```rust +#[account] +#[derive(InitSpace)] +pub struct Fundraiser { + pub maker: Pubkey, + pub mint_to_raise: Pubkey, + pub amount_to_raise: u64, + pub current_amount: u64, + pub time_started: i64, + pub duration: u16, + pub bump: u8, +} +``` + +Fields: + +- `maker` - the person starting the fundraiser. +- `mint_to_raise` - the mint the maker wants to receive. +- `amount_to_raise` - the target amount, in minor units. +- `current_amount` - total amount contributed through the `contribute` handler. This tracked total, not the vault balance, is what `check_contributions` and `refund` compare against the target, so tokens sent directly to the vault cannot trigger an early release or block refunds. +- `time_started` - when the fundraiser was created. +- `duration` - fundraising window in days. +- `bump` - canonical bump for the Fundraiser [PDA](https://solana.com/docs/terminology#program-derived-address-pda). + +The `InitSpace` derive macro implements the `Space` trait, which calculates the size of the account (not counting the [Anchor](https://solana.com/docs/terminology#anchor) discriminator). + +A per-contributor record: + +```rust +#[account] +#[derive(InitSpace)] +pub struct Contributor { + pub amount: u64, + pub bump: u8, +} +``` + +- `amount` - total amount contributed by this contributor. +- `bump` - canonical bump for the Contributor PDA. + +The Contributor PDA uses `init_if_needed`, which only runs the init branch on first call. The handler stores `bumps.contributor_account` into `bump` on first init (when `bump == 0`); see [`instructions/contribute.rs`](programs/fundraiser/src/instructions/contribute.rs). + +### Constants + +From [`constants.rs`](programs/fundraiser/src/constants.rs): + +```rust +pub const MIN_AMOUNT_TO_RAISE: u64 = 3; +pub const SECONDS_TO_DAYS: i64 = 86400; +pub const MAX_CONTRIBUTION_PERCENTAGE: u64 = 10; +pub const PERCENTAGE_SCALER: u64 = 100; +``` + +`MAX_CONTRIBUTION_PERCENTAGE / PERCENTAGE_SCALER` = 10%, the per-contributor cap. `MIN_AMOUNT_TO_RAISE` is the minimum target in major units. + +### Code layout + +Each [instruction handler](https://solana.com/docs/terminology#instruction-handler) is a free function (`pub fn handle_(accounts: &mut , ...)`) called from the `#[program]` module in `lib.rs`. The matching `#[derive(Accounts)]` struct (named `AccountConstraints`) sits in the same file as the handler. + +### Token program compatibility + +All token accounts use `anchor_spl::token_interface` types (`InterfaceAccount`, `InterfaceAccount`, `Interface`), and every token movement uses `transfer_checked`, which carries the mint and decimals through the [CPI](https://solana.com/docs/terminology#cross-program-invocation-cpi). The same code works against the Classic Token Program and the Token Extensions Program. + +### Onchain math + +All balance arithmetic uses `checked_*` operations and returns `FundraiserError::MathOverflow` on overflow. The per-contributor cap is computed in `u128` so the percentage product cannot overflow `u64`. Both handlers that move tokens out of the vault update program state before issuing the transfer CPI (checks-effects-interactions). + +## Lifecycle + +### `initialize` + +[`programs/fundraiser/src/instructions/initialize.rs`](programs/fundraiser/src/instructions/initialize.rs), account constraints `InitializeFundraiserAccountConstraints`. + +The maker signs and pays for two new accounts: + +- `fundraiser` - the state account, derived from `b"fundraiser"` and the maker's public key. Anchor calculates the canonical bump and the handler stores it. +- `vault` - the [ATA](https://solana.com/docs/terminology#associated-token-account-ata) that receives contributions, owned by the Fundraiser PDA. + +The handler requires `amount >= MIN_AMOUNT_TO_RAISE * 10^decimals` (the target must be at least 3 major units of the mint, expressed in minor units), then initializes the Fundraiser state with `current_amount = 0` and `time_started` from the `Clock` sysvar. A target below the minimum fails with `InvalidAmount`. + +### `contribute` + +[`programs/fundraiser/src/instructions/contribute.rs`](programs/fundraiser/src/instructions/contribute.rs), account constraints `ContributeAccountConstraints`. + +A contributor signs and the handler performs four checks in order: + +1. Minimum contribution: `amount >= 10^decimals` (one major unit of the mint), else `ContributionTooSmall`. +2. Per-call cap: `amount <= amount_to_raise * MAX_CONTRIBUTION_PERCENTAGE / PERCENTAGE_SCALER` (10% of the target), else `ContributionTooBig`. +3. Time window: contributions are allowed while `elapsed_days < duration`, where `elapsed_days = (now - time_started) / SECONDS_TO_DAYS`. Once `elapsed_days` reaches `duration` the handler fails with `FundraiserEnded`. +4. Cumulative cap: the contributor's running total (existing + new) must not exceed the same 10% cap, else `MaximumContributionsReached`. + +If all checks pass, `Fundraiser.current_amount` and `Contributor.amount` are updated, then `amount` is transferred from `contributor_ata` to `vault` with `transfer_checked`. + +### `check_contributions` + +[`programs/fundraiser/src/instructions/checker.rs`](programs/fundraiser/src/instructions/checker.rs), account constraints `CheckContributionsAccountConstraints`. + +Lets the maker claim the funds once the target is met. Requires `fundraiser.current_amount >= amount_to_raise` (the state-tracked total, so direct donations to the vault cannot unlock the claim early), else `TargetNotMet`. The handler then, signing both CPIs with the Fundraiser PDA's seeds: + +1. Transfers the entire vault balance (including any direct donations) to `maker_ata` with `transfer_checked`. +2. Closes the empty vault token account with `close_account`, returning its rent to the maker. + +The Fundraiser state account is closed via the `close = maker` constraint, so the maker also recovers that [rent](https://solana.com/docs/terminology#rent). + +### `refund` + +[`programs/fundraiser/src/instructions/refund.rs`](programs/fundraiser/src/instructions/refund.rs), account constraints `RefundAccountConstraints`. + +Lets a contributor reclaim their contribution after a failed fundraiser. Two checks: + +1. Refunds are allowed only after the fundraiser has ended: `elapsed_days >= duration`, else `FundraiserNotEnded`. +2. The target was not met: `fundraiser.current_amount < amount_to_raise` (again the state-tracked total, so donated tokens cannot block refunds), else `TargetMet`. + +The handler subtracts the contributor's recorded amount from `current_amount` and zeroes the Contributor record before the transfer CPI, then sends the tokens from the vault back to `contributor_ata` with `transfer_checked` (PDA signer). The Contributor account is closed via `close = contributor`, refunding its rent to the contributor. + +### `close_fundraiser` + +[`programs/fundraiser/src/instructions/close.rs`](programs/fundraiser/src/instructions/close.rs), account constraints `CloseFundraiserAccountConstraints`. + +Retires a failed fundraiser so the maker can raise again. The Fundraiser PDA is derived from `b"fundraiser"` and the maker's public key alone, so while a failed fundraiser's account exists the maker can never initialize another one. Three checks: + +1. The fundraiser has ended: `elapsed_days >= duration`, else `FundraiserNotEnded`. +2. The target was not met: `fundraiser.current_amount < amount_to_raise`, else `TargetMet` (a successful raise exits through `check_contributions`, which already closes these accounts). +3. Every contribution has been refunded: `fundraiser.current_amount == 0`, else `RefundsOutstanding` (closing the vault earlier would strand the remaining refunds). + +Anything still in the vault at this point is a direct donation outside the program's accounting; the handler sweeps it to `maker_ata` with `transfer_checked` rather than burning it, then closes the vault with `close_account` (both CPIs signed with the Fundraiser PDA's seeds). The Fundraiser state account is closed via `close = maker`. + +## Testing + +The tests are Rust integration tests using [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm) and [solana-kite](https://crates.io/crates/solana-kite), in [`programs/fundraiser/tests/test_fundraiser.rs`](programs/fundraiser/tests/test_fundraiser.rs). They load the compiled program with `include_bytes!`, so build the program first and rebuild after every program change: + +```sh +cargo build-sbf +cargo test +``` + +The suite uses a nonzero duration and warps the LiteSVM `Clock` sysvar to exercise both sides of every deadline: contributing inside the window succeeds, contributing after the deadline fails, refunding before the deadline fails, and refunding after the deadline succeeds when the target was not met. It exercises both contribution caps (a single contribution over the 10% cap, and contributions that cumulatively exceed it), and verifies that the claim pays the maker and closes the vault, that direct vault donations do not unlock the claim, and that `close_fundraiser` retires a failed raise (only after the deadline, only when the target was missed, only once refunds are complete, sweeping direct donations to the maker) and lets the same maker initialize a fresh fundraiser. Assertions check token balances and decoded account state rather than just transaction success. + +## FAQ + +### How do I build crowdfunding on Solana? + +A maker opens a fundraiser with `initialize`, naming the token, target amount, and duration. Contributors deposit with `contribute` while the window is open, and the funds sit in a program-controlled vault that neither side can raid. When the target is reached, the maker claims the raise with `check_contributions`, which pays out the vault and closes the fundraiser. + +### What happens if the fundraiser misses its target? + +Contributors call `refund` after the deadline to reclaim exactly what they put in. Once refunds are complete, the maker calls `close_fundraiser` to retire the failed raise and can then open a new one. + +### How is this fundraiser tested and verified? + +`anchor build` then `cargo test` runs LiteSVM tests that warp the clock across the deadline to exercise contribution windows, per-contributor caps, claims, refunds, and closing. The money math has [Kani](https://github.com/model-checking/kani) proofs in [`../kani-proofs/`](../kani-proofs/). diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/Cargo.toml b/finance/token-fundraiser/anchor-v1/programs/fundraiser/Cargo.toml new file mode 100644 index 000000000..66991a7cf --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "fundraiser" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "fundraiser" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" +# solana-kite depends on these SPL program crates without "no-entrypoint", +# so the host test binary would link their `entrypoint` symbols alongside +# this program's and fail with a duplicate-symbol error. Enabling +# "no-entrypoint" here removes theirs via feature unification. +spl-token = { version = "9.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "8.0.0", features = ["no-entrypoint"] } + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/Xargo.toml b/finance/token-fundraiser/anchor-v1/programs/fundraiser/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/constants.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/constants.rs new file mode 100644 index 000000000..fc0697b02 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/constants.rs @@ -0,0 +1,4 @@ +pub const MIN_AMOUNT_TO_RAISE: u64 = 3; +pub const SECONDS_TO_DAYS: i64 = 86400; +pub const MAX_CONTRIBUTION_PERCENTAGE: u64 = 10; +pub const PERCENTAGE_SCALER: u64 = 100; \ No newline at end of file diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/error.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/error.rs new file mode 100644 index 000000000..31a745947 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/error.rs @@ -0,0 +1,25 @@ +use anchor_lang::error_code; + +#[error_code] +pub enum FundraiserError { + #[msg("The amount to raise has not been met")] + TargetNotMet, + #[msg("The amount to raise has been achieved")] + TargetMet, + #[msg("The contribution is too big")] + ContributionTooBig, + #[msg("The contribution is too small")] + ContributionTooSmall, + #[msg("The maximum amount to contribute has been reached")] + MaximumContributionsReached, + #[msg("The fundraiser has not ended yet")] + FundraiserNotEnded, + #[msg("The fundraiser has ended")] + FundraiserEnded, + #[msg("The amount to raise is below the minimum of 3 major units")] + InvalidAmount, + #[msg("Contributions have not all been refunded yet")] + RefundsOutstanding, + #[msg("Arithmetic overflow")] + MathOverflow, +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/checker.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/checker.rs new file mode 100644 index 000000000..333bae498 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/checker.rs @@ -0,0 +1,101 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, + TransferChecked, + }, +}; + +use crate::{state::Fundraiser, FundraiserError}; + +#[derive(Accounts)] +pub struct CheckContributionsAccountConstraints<'info> { + #[account(mut)] + pub maker: Signer<'info>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + + #[account( + mut, + seeds = [b"fundraiser".as_ref(), maker.key().as_ref()], + bump = fundraiser.bump, + close = maker, + )] + pub fundraiser: Account<'info, Fundraiser>, + + #[account( + mut, + associated_token::mint = mint_to_raise, + associated_token::authority = fundraiser, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + #[account( + init_if_needed, + payer = maker, + associated_token::mint = mint_to_raise, + associated_token::authority = maker, + associated_token::token_program = token_program, + )] + pub maker_ata: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, + + pub associated_token_program: Program<'info, AssociatedToken>, +} + +pub fn handle_check_contributions( + accounts: &mut CheckContributionsAccountConstraints, +) -> Result<()> { + // Compare the state-tracked total, not the vault balance, so tokens + // donated directly to the vault cannot trigger an early release. + require!( + accounts.fundraiser.current_amount >= accounts.fundraiser.amount_to_raise, + FundraiserError::TargetNotMet + ); + + // The vault is owned by the fundraiser PDA, so both CPIs are signed with + // its seeds. + let signer_seeds: [&[&[u8]]; 1] = [&[ + b"fundraiser".as_ref(), + accounts.maker.to_account_info().key.as_ref(), + &[accounts.fundraiser.bump], + ]]; + + // Drain the whole vault (including any direct donations) to the maker. + let transfer_accounts = TransferChecked { + from: accounts.vault.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.maker_ata.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let transfer_context = CpiContext::new_with_signer( + accounts.token_program.key(), + transfer_accounts, + &signer_seeds, + ); + transfer_checked( + transfer_context, + accounts.vault.amount, + accounts.mint_to_raise.decimals, + )?; + + // Close the empty vault so its rent goes back to the maker. + let close_accounts = CloseAccount { + account: accounts.vault.to_account_info(), + destination: accounts.maker.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let close_context = CpiContext::new_with_signer( + accounts.token_program.key(), + close_accounts, + &signer_seeds, + ); + close_account(close_context)?; + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/close.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/close.rs new file mode 100644 index 000000000..c888cbc26 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/close.rs @@ -0,0 +1,131 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + close_account, transfer_checked, CloseAccount, Mint, TokenAccount, TokenInterface, + TransferChecked, + }, +}; + +use crate::{state::Fundraiser, FundraiserError, SECONDS_TO_DAYS}; + +#[derive(Accounts)] +pub struct CloseFundraiserAccountConstraints<'info> { + #[account(mut)] + pub maker: Signer<'info>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + + #[account( + mut, + has_one = mint_to_raise, + seeds = [b"fundraiser".as_ref(), maker.key().as_ref()], + bump = fundraiser.bump, + close = maker, + )] + pub fundraiser: Account<'info, Fundraiser>, + + #[account( + mut, + associated_token::mint = mint_to_raise, + associated_token::authority = fundraiser, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + #[account( + init_if_needed, + payer = maker, + associated_token::mint = mint_to_raise, + associated_token::authority = maker, + associated_token::token_program = token_program, + )] + pub maker_ata: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, + + pub associated_token_program: Program<'info, AssociatedToken>, +} + +/// Retires a failed fundraiser so the maker can raise again. +/// +/// The fundraiser PDA is derived from the maker's key alone, so while a +/// failed fundraiser's account exists the maker can never initialize +/// another one. This handler closes it once the deadline has passed, the +/// target was missed, and every contribution has been refunded. +pub fn handle_close_fundraiser(accounts: &mut CloseFundraiserAccountConstraints) -> Result<()> { + // Closing is allowed only after the fundraiser has ended: + // elapsed_days >= duration. + let current_time = Clock::get()?.unix_timestamp; + let elapsed_days = current_time + .checked_sub(accounts.fundraiser.time_started) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(SECONDS_TO_DAYS) + .ok_or(FundraiserError::MathOverflow)?; + require!( + elapsed_days >= accounts.fundraiser.duration as i64, + FundraiserError::FundraiserNotEnded + ); + + // A successful fundraiser exits through check_contributions, which + // already closes these accounts. + require!( + accounts.fundraiser.current_amount < accounts.fundraiser.amount_to_raise, + FundraiserError::TargetMet + ); + + // Closing the vault while contributions remain would strand the + // refunds, so every contributor must have taken theirs first. + require!( + accounts.fundraiser.current_amount == 0, + FundraiserError::RefundsOutstanding + ); + + // The vault is owned by the fundraiser PDA, so both CPIs are signed with + // its seeds. + let signer_seeds: [&[&[u8]]; 1] = [&[ + b"fundraiser".as_ref(), + accounts.maker.to_account_info().key.as_ref(), + &[accounts.fundraiser.bump], + ]]; + + // Refunds have already drained every tracked contribution, so anything + // left in the vault is a direct donation; sweep it to the maker rather + // than burn it with the account. + if accounts.vault.amount > 0 { + let transfer_accounts = TransferChecked { + from: accounts.vault.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.maker_ata.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let transfer_context = CpiContext::new_with_signer( + accounts.token_program.key(), + transfer_accounts, + &signer_seeds, + ); + transfer_checked( + transfer_context, + accounts.vault.amount, + accounts.mint_to_raise.decimals, + )?; + } + + // Close the empty vault so its rent goes back to the maker. The + // fundraiser account itself is closed by its close = maker constraint. + let close_accounts = CloseAccount { + account: accounts.vault.to_account_info(), + destination: accounts.maker.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let close_context = CpiContext::new_with_signer( + accounts.token_program.key(), + close_accounts, + &signer_seeds, + ); + close_account(close_context)?; + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/contribute.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/contribute.rs new file mode 100644 index 000000000..67e73d2f6 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/contribute.rs @@ -0,0 +1,136 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::{ + state::{Contributor, Fundraiser}, + FundraiserError, MAX_CONTRIBUTION_PERCENTAGE, PERCENTAGE_SCALER, SECONDS_TO_DAYS, +}; + +#[derive(Accounts)] +pub struct ContributeAccountConstraints<'info> { + #[account(mut)] + pub contributor: Signer<'info>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + + #[account( + mut, + has_one = mint_to_raise, + seeds = [b"fundraiser".as_ref(), fundraiser.maker.as_ref()], + bump = fundraiser.bump, + )] + pub fundraiser: Account<'info, Fundraiser>, + + #[account( + init_if_needed, + payer = contributor, + seeds = [b"contributor", fundraiser.key().as_ref(), contributor.key().as_ref()], + bump, + space = Contributor::DISCRIMINATOR.len() + Contributor::INIT_SPACE, + )] + pub contributor_account: Account<'info, Contributor>, + + #[account( + mut, + associated_token::mint = mint_to_raise, + associated_token::authority = contributor, + associated_token::token_program = token_program, + )] + pub contributor_ata: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = fundraiser.mint_to_raise, + associated_token::authority = fundraiser, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} + +/// Caps a single contributor at MAX_CONTRIBUTION_PERCENTAGE percent of the +/// target. Multiplies in u128 so the product cannot overflow u64. +fn calculate_max_contribution(amount_to_raise: u64) -> Result { + (amount_to_raise as u128) + .checked_mul(MAX_CONTRIBUTION_PERCENTAGE as u128) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(PERCENTAGE_SCALER as u128) + .ok_or(FundraiserError::MathOverflow)? + .try_into() + .map_err(|_| error!(FundraiserError::MathOverflow)) +} + +pub fn handle_contribute( + accounts: &mut ContributeAccountConstraints, + amount: u64, + bumps: &ContributeAccountConstraintsBumps, +) -> Result<()> { + // The minimum contribution is one major unit, which is 10^decimals minor units. + let one_major_unit = 10_u64 + .checked_pow(accounts.mint_to_raise.decimals as u32) + .ok_or(FundraiserError::MathOverflow)?; + require!( + amount >= one_major_unit, + FundraiserError::ContributionTooSmall + ); + + let max_contribution = calculate_max_contribution(accounts.fundraiser.amount_to_raise)?; + require!( + amount <= max_contribution, + FundraiserError::ContributionTooBig + ); + + // Contributions are allowed while elapsed_days < duration. + let current_time = Clock::get()?.unix_timestamp; + let elapsed_days = current_time + .checked_sub(accounts.fundraiser.time_started) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(SECONDS_TO_DAYS) + .ok_or(FundraiserError::MathOverflow)?; + require!( + elapsed_days < accounts.fundraiser.duration as i64, + FundraiserError::FundraiserEnded + ); + + // The contributor's cumulative total must also stay within the cap. + let cumulative_contribution = accounts + .contributor_account + .amount + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?; + require!( + cumulative_contribution <= max_contribution, + FundraiserError::MaximumContributionsReached + ); + + // Checks-effects-interactions: update state before the transfer CPI. + accounts.fundraiser.current_amount = accounts + .fundraiser + .current_amount + .checked_add(amount) + .ok_or(FundraiserError::MathOverflow)?; + accounts.contributor_account.amount = cumulative_contribution; + + // Save the contributor PDA bump on first init (init_if_needed only + // runs the init branch once; stored bump is zero until set). + if accounts.contributor_account.bump == 0 { + accounts.contributor_account.bump = bumps.contributor_account; + } + + // Transfer the funds from the contributor to the vault. + let cpi_accounts = TransferChecked { + from: accounts.contributor_ata.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.vault.to_account_info(), + authority: accounts.contributor.to_account_info(), + }; + let cpi_context = CpiContext::new(accounts.token_program.key(), cpi_accounts); + transfer_checked(cpi_context, amount, accounts.mint_to_raise.decimals)?; + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/initialize_fundraiser.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/initialize_fundraiser.rs new file mode 100644 index 000000000..b105d17a5 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/initialize_fundraiser.rs @@ -0,0 +1,71 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{state::Fundraiser, FundraiserError, MIN_AMOUNT_TO_RAISE}; + +#[derive(Accounts)] +pub struct InitializeFundraiserAccountConstraints<'info> { + #[account(mut)] + pub maker: Signer<'info>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = maker, + seeds = [b"fundraiser", maker.key().as_ref()], + bump, + space = Fundraiser::DISCRIMINATOR.len() + Fundraiser::INIT_SPACE, + )] + pub fundraiser: Account<'info, Fundraiser>, + + #[account( + init, + payer = maker, + associated_token::mint = mint_to_raise, + associated_token::authority = fundraiser, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub system_program: Program<'info, System>, + + pub token_program: Interface<'info, TokenInterface>, + + pub associated_token_program: Program<'info, AssociatedToken>, +} + +pub fn handle_initialize_fundraiser( + accounts: &mut InitializeFundraiserAccountConstraints, + amount: u64, + duration: u16, + bumps: &InitializeFundraiserAccountConstraintsBumps, +) -> Result<()> { + // The target must be at least MIN_AMOUNT_TO_RAISE major units, expressed + // in minor units: MIN_AMOUNT_TO_RAISE * 10^decimals. + let one_major_unit = 10_u64 + .checked_pow(accounts.mint_to_raise.decimals as u32) + .ok_or(FundraiserError::MathOverflow)?; + let minimum_amount_to_raise = MIN_AMOUNT_TO_RAISE + .checked_mul(one_major_unit) + .ok_or(FundraiserError::MathOverflow)?; + require!( + amount >= minimum_amount_to_raise, + FundraiserError::InvalidAmount + ); + + accounts.fundraiser.set_inner(Fundraiser { + maker: accounts.maker.key(), + mint_to_raise: accounts.mint_to_raise.key(), + amount_to_raise: amount, + current_amount: 0, + time_started: Clock::get()?.unix_timestamp, + duration, + bump: bumps.fundraiser, + }); + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/mod.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/mod.rs new file mode 100644 index 000000000..7ae564501 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/mod.rs @@ -0,0 +1,11 @@ +pub mod initialize_fundraiser; +pub mod contribute; +pub mod checker; +pub mod refund; +pub mod close; + +pub use initialize_fundraiser::*; +pub use contribute::*; +pub use checker::*; +pub use refund::*; +pub use close::*; \ No newline at end of file diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/refund.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/refund.rs new file mode 100644 index 000000000..61fb2babe --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/instructions/refund.rs @@ -0,0 +1,113 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::{ + state::{Contributor, Fundraiser}, + FundraiserError, SECONDS_TO_DAYS, +}; + +#[derive(Accounts)] +pub struct RefundAccountConstraints<'info> { + #[account(mut)] + pub contributor: Signer<'info>, + + pub maker: SystemAccount<'info>, + + pub mint_to_raise: InterfaceAccount<'info, Mint>, + + #[account( + mut, + has_one = mint_to_raise, + seeds = [b"fundraiser", maker.key().as_ref()], + bump = fundraiser.bump, + )] + pub fundraiser: Account<'info, Fundraiser>, + + #[account( + mut, + seeds = [b"contributor", fundraiser.key().as_ref(), contributor.key().as_ref()], + bump = contributor_account.bump, + close = contributor, + )] + pub contributor_account: Account<'info, Contributor>, + + #[account( + mut, + associated_token::mint = mint_to_raise, + associated_token::authority = contributor, + associated_token::token_program = token_program, + )] + pub contributor_ata: InterfaceAccount<'info, TokenAccount>, + + #[account( + mut, + associated_token::mint = mint_to_raise, + associated_token::authority = fundraiser, + associated_token::token_program = token_program, + )] + pub vault: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_refund(accounts: &mut RefundAccountConstraints) -> Result<()> { + // Refunds are allowed only after the fundraiser has ended: + // elapsed_days >= duration. + let current_time = Clock::get()?.unix_timestamp; + let elapsed_days = current_time + .checked_sub(accounts.fundraiser.time_started) + .ok_or(FundraiserError::MathOverflow)? + .checked_div(SECONDS_TO_DAYS) + .ok_or(FundraiserError::MathOverflow)?; + require!( + elapsed_days >= accounts.fundraiser.duration as i64, + FundraiserError::FundraiserNotEnded + ); + + // Refunds are allowed only when the target was not met. Compare the + // state-tracked total, not the vault balance, so tokens donated directly + // to the vault cannot block refunds. + require!( + accounts.fundraiser.current_amount < accounts.fundraiser.amount_to_raise, + FundraiserError::TargetMet + ); + + // Checks-effects-interactions: update state before the transfer CPI. + let refund_amount = accounts.contributor_account.amount; + accounts.fundraiser.current_amount = accounts + .fundraiser + .current_amount + .checked_sub(refund_amount) + .ok_or(FundraiserError::MathOverflow)?; + accounts.contributor_account.amount = 0; + + // Transfer the funds from the vault back to the contributor. The vault is + // owned by the fundraiser PDA, so the CPI is signed with its seeds. + let cpi_accounts = TransferChecked { + from: accounts.vault.to_account_info(), + mint: accounts.mint_to_raise.to_account_info(), + to: accounts.contributor_ata.to_account_info(), + authority: accounts.fundraiser.to_account_info(), + }; + let signer_seeds: [&[&[u8]]; 1] = [&[ + b"fundraiser".as_ref(), + accounts.maker.to_account_info().key.as_ref(), + &[accounts.fundraiser.bump], + ]]; + let cpi_context = CpiContext::new_with_signer( + accounts.token_program.key(), + cpi_accounts, + &signer_seeds, + ); + transfer_checked( + cpi_context, + refund_amount, + accounts.mint_to_raise.decimals, + )?; + + Ok(()) +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/lib.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/lib.rs new file mode 100644 index 000000000..ccbee926a --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/lib.rs @@ -0,0 +1,56 @@ +use anchor_lang::prelude::*; + +declare_id!("Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC"); + +mod constants; +mod error; +mod instructions; +mod state; + +pub use constants::*; +use error::*; +use instructions::*; + +#[program] +pub mod fundraiser { + use super::*; + + pub fn initialize_fundraiser( + mut context: Context, + amount: u64, + duration: u16, + ) -> Result<()> { + handle_initialize_fundraiser(&mut context.accounts, amount, duration, &context.bumps)?; + + Ok(()) + } + + pub fn contribute( + mut context: Context, + amount: u64, + ) -> Result<()> { + handle_contribute(&mut context.accounts, amount, &context.bumps)?; + + Ok(()) + } + + pub fn check_contributions( + mut context: Context, + ) -> Result<()> { + handle_check_contributions(&mut context.accounts)?; + + Ok(()) + } + + pub fn refund(mut context: Context) -> Result<()> { + handle_refund(&mut context.accounts)?; + + Ok(()) + } + + pub fn close_fundraiser(mut context: Context) -> Result<()> { + handle_close_fundraiser(&mut context.accounts)?; + + Ok(()) + } +} diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/contributor.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/contributor.rs new file mode 100644 index 000000000..33b0c00e4 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/contributor.rs @@ -0,0 +1,9 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct Contributor { + pub amount: u64, + /// Canonical bump for this PDA. + pub bump: u8, +} \ No newline at end of file diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/fundraiser.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/fundraiser.rs new file mode 100644 index 000000000..cab7d1c60 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/fundraiser.rs @@ -0,0 +1,13 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct Fundraiser { + pub maker: Pubkey, + pub mint_to_raise: Pubkey, + pub amount_to_raise: u64, + pub current_amount: u64, + pub time_started: i64, + pub duration: u16, + pub bump: u8, +} \ No newline at end of file diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/mod.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/mod.rs new file mode 100644 index 000000000..3e6b07fdb --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/src/state/mod.rs @@ -0,0 +1,5 @@ +pub mod fundraiser; +pub mod contributor; + +pub use fundraiser::*; +pub use contributor::*; \ No newline at end of file diff --git a/finance/token-fundraiser/anchor-v1/programs/fundraiser/tests/test_fundraiser.rs b/finance/token-fundraiser/anchor-v1/programs/fundraiser/tests/test_fundraiser.rs new file mode 100644 index 000000000..c32e479e0 --- /dev/null +++ b/finance/token-fundraiser/anchor-v1/programs/fundraiser/tests/test_fundraiser.rs @@ -0,0 +1,963 @@ +use { + anchor_lang::{ + solana_program::{clock::Clock, instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + fundraiser::SECONDS_TO_DAYS, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +const MINT_DECIMALS: u8 = 6; +/// One major unit of the test mint in minor units (10^MINT_DECIMALS). +const ONE_TOKEN: u64 = 1_000_000; +/// Comfortably above the program's 3-major-unit minimum target. +const AMOUNT_TO_RAISE: u64 = 30 * ONE_TOKEN; +/// The per-contributor cap is 10% of the target. +const MAX_CONTRIBUTION: u64 = AMOUNT_TO_RAISE / 10; +const DURATION_DAYS: u16 = 7; +const CONTRIBUTOR_STARTING_BALANCE: u64 = 10 * ONE_TOKEN; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +/// Mirror of the onchain Fundraiser struct for borsh-decoding account data +/// in tests. Pubkeys are read as raw 32-byte arrays. +#[derive(BorshDeserialize)] +struct FundraiserState { + _maker: [u8; 32], + _mint_to_raise: [u8; 32], + amount_to_raise: u64, + current_amount: u64, + _time_started: i64, + duration: u16, + _bump: u8, +} + +/// Mirror of the onchain Contributor struct. +#[derive(BorshDeserialize)] +struct ContributorState { + amount: u64, + _bump: u8, +} + +const ANCHOR_DISCRIMINATOR_LENGTH: usize = 8; + +fn read_fundraiser_state(svm: &LiteSVM, fundraiser_pda: &Pubkey) -> FundraiserState { + let account = svm.get_account(fundraiser_pda).unwrap(); + FundraiserState::try_from_slice(&account.data[ANCHOR_DISCRIMINATOR_LENGTH..]).unwrap() +} + +fn read_contributor_state(svm: &LiteSVM, contributor_pda: &Pubkey) -> ContributorState { + let account = svm.get_account(contributor_pda).unwrap(); + ContributorState::try_from_slice(&account.data[ANCHOR_DISCRIMINATOR_LENGTH..]).unwrap() +} + +/// Moves the LiteSVM clock forward by the given number of days. +fn warp_days_forward(svm: &mut LiteSVM, days: i64) { + let mut clock: Clock = svm.get_sysvar(); + clock.unix_timestamp += days * SECONDS_TO_DAYS; + svm.set_sysvar(&clock); +} + +struct FundraiserSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + maker: Keypair, + mint: Pubkey, + fundraiser_pda: Pubkey, + vault: Pubkey, +} + +fn full_setup() -> FundraiserSetup { + let program_id = fundraiser::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/fundraiser.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let maker = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + // The payer is the mint authority. + let mint = create_token_mint(&mut svm, &payer, MINT_DECIMALS, None).unwrap(); + + let (fundraiser_pda, _bump) = + Pubkey::find_program_address(&[b"fundraiser", maker.pubkey().as_ref()], &program_id); + + // The vault is the ATA of the fundraiser PDA for the mint. + let vault = derive_ata(&fundraiser_pda, &mint); + + FundraiserSetup { + svm, + program_id, + payer, + maker, + mint, + fundraiser_pda, + vault, + } +} + +fn initialize_fundraiser(setup: &mut FundraiserSetup, amount: u64, duration: u16) { + let initialize_instruction = Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::InitializeFundraiser { amount, duration }.data(), + fundraiser::accounts::InitializeFundraiserAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![initialize_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ) + .unwrap(); +} + +/// Creates a contributor wallet with a funded ATA and returns +/// (contributor keypair, contributor ATA, contributor account PDA). +fn create_funded_contributor(setup: &mut FundraiserSetup) -> (Keypair, Pubkey, Pubkey) { + let contributor = create_wallet(&mut setup.svm, 10_000_000_000).unwrap(); + + let contributor_ata = create_associated_token_account( + &mut setup.svm, + &contributor.pubkey(), + &setup.mint, + &setup.payer, + ) + .unwrap(); + + mint_tokens_to_token_account( + &mut setup.svm, + &setup.mint, + &contributor_ata, + CONTRIBUTOR_STARTING_BALANCE, + &setup.payer, + ) + .unwrap(); + + let (contributor_account_pda, _bump) = Pubkey::find_program_address( + &[ + b"contributor", + setup.fundraiser_pda.as_ref(), + contributor.pubkey().as_ref(), + ], + &setup.program_id, + ); + + (contributor, contributor_ata, contributor_account_pda) +} + +fn build_contribute_instruction( + setup: &FundraiserSetup, + contributor: &Pubkey, + contributor_ata: &Pubkey, + contributor_account_pda: &Pubkey, + amount: u64, +) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::Contribute { amount }.data(), + fundraiser::accounts::ContributeAccountConstraints { + contributor: *contributor, + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + contributor_account: *contributor_account_pda, + contributor_ata: *contributor_ata, + vault: setup.vault, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn build_refund_instruction( + setup: &FundraiserSetup, + contributor: &Pubkey, + contributor_ata: &Pubkey, + contributor_account_pda: &Pubkey, +) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::Refund {}.data(), + fundraiser::accounts::RefundAccountConstraints { + contributor: *contributor, + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + contributor_account: *contributor_account_pda, + contributor_ata: *contributor_ata, + vault: setup.vault, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +fn build_check_contributions_instruction( + setup: &FundraiserSetup, + maker_ata: &Pubkey, +) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::CheckContributions {}.data(), + fundraiser::accounts::CheckContributionsAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, + maker_ata: *maker_ata, + token_program: token_program_id(), + system_program: system_program::id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ) +} + +fn build_close_fundraiser_instruction(setup: &FundraiserSetup, maker_ata: &Pubkey) -> Instruction { + Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::CloseFundraiser {}.data(), + fundraiser::accounts::CloseFundraiserAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, + maker_ata: *maker_ata, + token_program: token_program_id(), + system_program: system_program::id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ) +} + +#[test] +fn test_initialize_fundraiser() { + let mut setup = full_setup(); + + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.amount_to_raise, AMOUNT_TO_RAISE); + assert_eq!(fundraiser_state.current_amount, 0); + assert_eq!(fundraiser_state.duration, DURATION_DAYS); + + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); +} + +#[test] +fn test_initialize_below_minimum_target_fails() { + let mut setup = full_setup(); + + // 3 major units is the minimum; one minor unit below it must fail. + let below_minimum_target = 3 * ONE_TOKEN - 1; + let initialize_instruction = Instruction::new_with_bytes( + setup.program_id, + &fundraiser::instruction::InitializeFundraiser { + amount: below_minimum_target, + duration: DURATION_DAYS, + } + .data(), + fundraiser::accounts::InitializeFundraiserAccountConstraints { + maker: setup.maker.pubkey(), + mint_to_raise: setup.mint, + fundraiser: setup.fundraiser_pda, + vault: setup.vault, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![initialize_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!(result.is_err(), "Target below 3 major units must be rejected"); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_none(), + "Fundraiser account must not exist after a failed initialize" + ); +} + +#[test] +fn test_contribute_inside_window_succeeds() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + // One day in: well inside the 7-day window. + warp_days_forward(&mut setup.svm, 1); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + MAX_CONTRIBUTION + ); + assert_eq!( + get_token_account_balance(&setup.svm, &contributor_ata).unwrap(), + CONTRIBUTOR_STARTING_BALANCE - MAX_CONTRIBUTION + ); + + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, MAX_CONTRIBUTION); + + let contributor_state = read_contributor_state(&setup.svm, &contributor_account_pda); + assert_eq!(contributor_state.amount, MAX_CONTRIBUTION); +} + +#[test] +fn test_contribute_after_deadline_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + // One day past the deadline. + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ONE_TOKEN, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ); + assert!(result.is_err(), "Contributing after the deadline must fail"); + + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); + assert_eq!( + get_token_account_balance(&setup.svm, &contributor_ata).unwrap(), + CONTRIBUTOR_STARTING_BALANCE + ); +} + +#[test] +fn test_contribute_below_one_major_unit_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ONE_TOKEN - 1, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ); + assert!( + result.is_err(), + "Contributions below one major unit must fail" + ); + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); +} + +#[test] +fn test_refund_before_deadline_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ONE_TOKEN, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Still inside the window: refund must fail with FundraiserNotEnded. + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[&contributor], + &contributor.pubkey(), + ); + assert!(result.is_err(), "Refunding before the deadline must fail"); + + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + ONE_TOKEN + ); + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, ONE_TOKEN); +} + +#[test] +fn test_refund_after_deadline_target_not_met_succeeds() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Past the deadline, target not met: refund must succeed. + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); + assert_eq!( + get_token_account_balance(&setup.svm, &contributor_ata).unwrap(), + CONTRIBUTOR_STARTING_BALANCE + ); + + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, 0); + + assert!( + setup.svm.get_account(&contributor_account_pda).is_none(), + "Contributor account must be closed after refund" + ); +} + +#[test] +fn test_refund_when_target_met_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // 10 contributors at the 10% cap reach the target exactly. + let mut contributors = Vec::new(); + for _ in 0..10 { + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + contributors.push((contributor, contributor_ata, contributor_account_pda)); + } + + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + let (contributor, contributor_ata, contributor_account_pda) = &contributors[0]; + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + contributor_ata, + contributor_account_pda, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[contributor], + &contributor.pubkey(), + ); + assert!( + result.is_err(), + "Refunding must fail once the target has been met" + ); + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + AMOUNT_TO_RAISE + ); +} + +#[test] +fn test_check_contributions_success_pays_maker_and_closes_vault() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // 10 contributors at the 10% cap reach the target exactly. + for _ in 0..10 { + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + } + + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + AMOUNT_TO_RAISE + ); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let check_instruction = build_check_contributions_instruction(&setup, &maker_ata); + send_transaction_from_instructions( + &mut setup.svm, + vec![check_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&setup.svm, &maker_ata).unwrap(), + AMOUNT_TO_RAISE + ); + assert!( + setup.svm.get_account(&setup.vault).is_none(), + "Vault token account must be closed after a successful claim" + ); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_none(), + "Fundraiser account must be closed after a successful claim" + ); +} + +#[test] +fn test_contribute_above_cap_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + // One minor unit over the 10% cap must fail with ContributionTooBig. + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION + 1, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ); + assert!( + result.is_err(), + "A single contribution above the 10% cap must fail" + ); + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); +} + +#[test] +fn test_cumulative_contributions_above_cap_fail() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + + // Each call is under the cap on its own; the second pushes the + // cumulative total over it and must fail with + // MaximumContributionsReached. + let first_contribution = 2 * ONE_TOKEN; + let second_contribution = MAX_CONTRIBUTION - ONE_TOKEN; + + let first_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + first_contribution, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![first_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + let second_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + second_contribution, + ); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![second_instruction], + &[&contributor], + &contributor.pubkey(), + ); + assert!( + result.is_err(), + "Contributions that cumulatively exceed the 10% cap must fail" + ); + + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + first_contribution + ); + let contributor_state = read_contributor_state(&setup.svm, &contributor_account_pda); + assert_eq!(contributor_state.amount, first_contribution); +} + +#[test] +fn test_close_fundraiser_after_failed_raise_allows_a_new_raise() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // The raise fails; the contributor takes their refund. + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + let refund_instruction = build_refund_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![refund_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // The maker retires the failed fundraiser. + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let close_instruction = build_close_fundraiser_instruction(&setup, &maker_ata); + send_transaction_from_instructions( + &mut setup.svm, + vec![close_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ) + .unwrap(); + + assert!( + setup.svm.get_account(&setup.vault).is_none(), + "Vault token account must be closed with the fundraiser" + ); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_none(), + "Fundraiser account must be closed after a failed raise is retired" + ); + + // The same maker can now open a fresh fundraiser at the same PDA. The + // retry would otherwise be byte-identical to the first initialize (same + // accounts, data, and blockhash), which LiteSVM rejects as already + // processed. + setup.svm.expire_blockhash(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + let fundraiser_state = read_fundraiser_state(&setup.svm, &setup.fundraiser_pda); + assert_eq!(fundraiser_state.current_amount, 0); + assert_eq!(fundraiser_state.amount_to_raise, AMOUNT_TO_RAISE); + assert_eq!(get_token_account_balance(&setup.svm, &setup.vault).unwrap(), 0); +} + +#[test] +fn test_close_fundraiser_before_deadline_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let close_instruction = build_close_fundraiser_instruction(&setup, &maker_ata); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![close_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!( + result.is_err(), + "Closing a fundraiser before its deadline must fail" + ); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_some(), + "Fundraiser account must stay open after a failed close" + ); +} + +#[test] +fn test_close_fundraiser_with_unrefunded_contributions_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Past the deadline but the contribution has not been refunded, so + // closing would strand it in the vault. + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let close_instruction = build_close_fundraiser_instruction(&setup, &maker_ata); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![close_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!( + result.is_err(), + "Closing must fail while contributions remain unrefunded" + ); + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + MAX_CONTRIBUTION + ); +} + +#[test] +fn test_close_fundraiser_when_target_met_fails() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // 10 contributors at the 10% cap reach the target exactly. + for _ in 0..10 { + let (contributor, contributor_ata, contributor_account_pda) = + create_funded_contributor(&mut setup); + let contribute_instruction = build_contribute_instruction( + &setup, + &contributor.pubkey(), + &contributor_ata, + &contributor_account_pda, + MAX_CONTRIBUTION, + ); + send_transaction_from_instructions( + &mut setup.svm, + vec![contribute_instruction], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + } + + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + // A successful raise exits through check_contributions, never close. + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let close_instruction = build_close_fundraiser_instruction(&setup, &maker_ata); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![close_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!( + result.is_err(), + "Closing must fail when the target was met; the claim is the exit" + ); + assert_eq!( + get_token_account_balance(&setup.svm, &setup.vault).unwrap(), + AMOUNT_TO_RAISE + ); +} + +#[test] +fn test_close_fundraiser_sweeps_direct_donations_to_maker() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // Tokens sent straight to the vault are outside the program's + // accounting; on close they go to the maker instead of being burned + // with the account. + let donation = 5 * ONE_TOKEN; + mint_tokens_to_token_account(&mut setup.svm, &setup.mint, &setup.vault, donation, &setup.payer) + .unwrap(); + + warp_days_forward(&mut setup.svm, DURATION_DAYS as i64 + 1); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let close_instruction = build_close_fundraiser_instruction(&setup, &maker_ata); + send_transaction_from_instructions( + &mut setup.svm, + vec![close_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&setup.svm, &maker_ata).unwrap(), + donation + ); + assert!(setup.svm.get_account(&setup.fundraiser_pda).is_none()); + assert!(setup.svm.get_account(&setup.vault).is_none()); +} + +#[test] +fn test_check_contributions_ignores_direct_vault_donations() { + let mut setup = full_setup(); + initialize_fundraiser(&mut setup, AMOUNT_TO_RAISE, DURATION_DAYS); + + // Mint the full target straight into the vault, bypassing contribute. + // The state-tracked current_amount stays 0, so the claim must fail. + mint_tokens_to_token_account( + &mut setup.svm, + &setup.mint, + &setup.vault, + AMOUNT_TO_RAISE, + &setup.payer, + ) + .unwrap(); + + let maker_ata = derive_ata(&setup.maker.pubkey(), &setup.mint); + let check_instruction = build_check_contributions_instruction(&setup, &maker_ata); + let result = send_transaction_from_instructions( + &mut setup.svm, + vec![check_instruction], + &[&setup.maker], + &setup.maker.pubkey(), + ); + assert!( + result.is_err(), + "Direct donations to the vault must not unlock the claim" + ); + assert!( + setup.svm.get_account(&setup.fundraiser_pda).is_some(), + "Fundraiser account must stay open after a failed claim" + ); +} diff --git a/finance/token-fundraiser/anchor/README.md b/finance/token-fundraiser/anchor/README.md index 32a247525..f3a0c0521 100644 --- a/finance/token-fundraiser/anchor/README.md +++ b/finance/token-fundraiser/anchor/README.md @@ -1,5 +1,11 @@ # Solana Token Fundraiser (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Onchain crowdfunding on Solana: a program that collects tokens toward a target amount, like Kickstarter without a payment processor. A **maker** creates a fundraiser [account](https://solana.com/docs/terminology#account), specifies the [mint](https://solana.com/docs/terminology#token-mint) they want to receive, the target amount, and a duration in days. **Contributors** contribute while the window is open. If the target is reached, the maker claims the funds; if it is not reached by the deadline, contributors can refund, and once refunds are complete the maker can retire the fundraiser and open a new one. ## Architecture diff --git a/finance/token-swap/anchor-v1/Anchor.toml b/finance/token-swap/anchor-v1/Anchor.toml new file mode 100644 index 000000000..432990a43 --- /dev/null +++ b/finance/token-swap/anchor-v1/Anchor.toml @@ -0,0 +1,23 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.devnet] +swap_example = "AsGVFxWqEn8icRBFQApxJe68x3r9zvfSbmiEzYFATGYn" + + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +[test] +startup_wait = 5000 +shutdown_wait = 2000 diff --git a/finance/token-swap/anchor-v1/CHANGELOG.md b/finance/token-swap/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/finance/token-swap/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/finance/token-swap/anchor-v1/Cargo.toml b/finance/token-swap/anchor-v1/Cargo.toml new file mode 100644 index 000000000..29c7a9a19 --- /dev/null +++ b/finance/token-swap/anchor-v1/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 + diff --git a/finance/token-swap/anchor-v1/README.md b/finance/token-swap/anchor-v1/README.md new file mode 100644 index 000000000..2a75001c0 --- /dev/null +++ b/finance/token-swap/anchor-v1/README.md @@ -0,0 +1,55 @@ +# Solana Token Swap AMM (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +A constant-product AMM (automated market maker) on Solana: create pools, deposit liquidity, swap with slippage guards, and withdraw. This is the exchange design behind Solana venues like Raydium and Orca. + +See also: [Token Swap overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Liquidity pool PDA +- LP tokens and swap invariant +- See [finance/token-swap/README.md](../README.md) for the full walkthrough + +## Setup + +From this directory (`finance/token-swap/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. + +## FAQ + +### How does an AMM work on Solana? + +An automated market maker replaces the order book with a liquidity pool: anyone can create a pool with `initialize_pool`, fund it with `deposit_liquidity`, and trade against it with `swap_tokens`. Prices come from the constant-product invariant on the pool's balances, and liquidity providers earn a share of trading fees. Solana exchanges like Raydium and Orca use this design. + +### How is slippage handled? + +`swap_tokens` takes a `min_output_amount` guard: if the pool's balances move so the trade would return less than that minimum, the transaction fails instead of filling at a worse price. + +### Where is the full walkthrough for this example? + +The example-level [Token Swap overview](../README.md) covers the pool math, LP tokens, and lifecycle; this page covers the Anchor build and test commands. The money math has [Kani](https://github.com/model-checking/kani) proofs in [`../kani-proofs/`](../kani-proofs/). diff --git a/finance/token-swap/anchor-v1/programs/token-swap/Cargo.toml b/finance/token-swap/anchor-v1/programs/token-swap/Cargo.toml new file mode 100644 index 000000000..18f746194 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "swap_example" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "swap_example" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata", "spl-token-interface"] } +# `fixed` removed: all financial math is now u128 + checked_*, matching how +# production Solana AMMs (Orca, Raydium, Meteora, Saber) do it. Floats / +# fixed-point types are not used for money in this program. + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/token-swap/anchor-v1/programs/token-swap/Xargo.toml b/finance/token-swap/anchor-v1/programs/token-swap/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/constants.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/constants.rs new file mode 100644 index 000000000..09e43a1bc --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/constants.rs @@ -0,0 +1,20 @@ +use anchor_lang::prelude::*; + +#[constant] +pub const MINIMUM_LIQUIDITY: u64 = 100; + +/// Basis-points denominator. Fees and the admin's fee share are stored in +/// basis points (1 bp = 1/10_000), so dividing by this converts a bp value to +/// a fraction. Using the named constant keeps the 10_000 out of the math as a +/// bare literal. +#[constant] +pub const BASIS_POINTS_DIVISOR: u64 = 10_000; + +#[constant] +pub const CONFIG_SEED: &[u8] = b"config"; + +#[constant] +pub const AUTHORITY_SEED: &[u8] = b"authority"; + +#[constant] +pub const LIQUIDITY_SEED: &[u8] = b"liquidity"; diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/errors.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/errors.rs new file mode 100644 index 000000000..887ee82a5 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/errors.rs @@ -0,0 +1,88 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum AmmError { + #[msg("Invalid fee value")] + InvalidFee, + + // Returned when `initialize_config` is called with `admin_share_bps >= 10_000`. + // The admin share is a basis-points fraction of the trading fee, so values + // at or above 10_000 are nonsensical (the admin can't take more than the + // whole fee). + #[msg("Admin share must be less than 10000 basis points")] + AdminShareTooHigh, + + #[msg("Depositing too little liquidity")] + DepositTooSmall, + + // Returned by `deposit_liquidity` when clamping the caller's amounts to the + // current pool ratio rounds one side down to zero. That happens when the + // deposit is so small (or so lopsided) that the pool can't issue meaningful + // LP shares without rounding one of the contributions away. We fail rather + // than mint zero-priced LP tokens. + #[msg("Deposit amount too small for current pool ratio")] + DepositAmountTooSmall, + + // Returned by `swap_tokens` when the computed `output_amount` is strictly + // below the trader's `min_output_amount`. This is the trader's slippage + // guard: between quoting and landing, the pool can shift (other traders, + // sandwich attempts), so the trader passes the lowest output they're + // willing to accept and the program reverts if reality is worse. + #[msg("Swap output below minimum (slippage exceeded)")] + SlippageExceeded, + + // Returned by `withdraw_liquidity` when either side of the proportional + // withdrawal falls below the LP's specified minimum. This is the LP's + // slippage guard: if a big swap drains one side of the pool between the + // LP quoting their exit and the tx landing, the LP gets a different + // mix than expected and can bail. + #[msg("Withdrawal amount below minimum (slippage exceeded)")] + WithdrawalBelowMinimum, + + // Returned by `deposit_liquidity` when the computed LP-token amount + // falls below the depositor's specified minimum. This is the + // *lower-bound* slippage guard on what the depositor receives. The + // ratio clamp is the *upper-bound* guard (don't over-spend either + // token); both are needed for full deposit slippage protection. + #[msg("LP tokens minted below minimum (slippage exceeded)")] + DepositBelowMinimum, + + #[msg("Invariant does not hold")] + InvariantViolated, + + // Returned when a caller asks to deposit or swap more tokens than they hold. + // Previously the program silently clamped to the available balance, which broke + // slippage protection for callers (they expected their input to be the actual + // amount used). We now fail fast so callers can react. + #[msg("Requested amount exceeds available balance")] + InsufficientBalance, + + // Returned by `claim_admin_fees` when both accumulators are zero. Reverting + // (rather than silently no-op'ing) gives the admin a clear signal that the + // call was wasted, and avoids the litesvm gotcha where two byte-identical + // claim txs share a signature and the runtime rejects the second as + // `AlreadyProcessed`. Callers should check the accumulators offchain + // before submitting a claim. + #[msg("No admin fees to claim")] + NothingToClaim, + + // Returned by arithmetic helpers when a checked_* operation overflows or + // underflows. We treat these as hard failures rather than masking them + // with `.unwrap()` so the onchain logs name the failure mode. + #[msg("Math overflow")] + MathOverflow, + + // Returned by `initialize_pool` when `mint_a >= mint_b`. Requiring a strict + // ascending order ensures each (mint_a, mint_b) pair has exactly one + // canonical pool PDA - without it, a (X, Y) pool and a (Y, X) pool would + // both be valid, fragmenting liquidity. + #[msg("mint_a must be less than mint_b for canonical pool ordering")] + InvalidMintOrder, + + // Returned by `swap_tokens` when either LP-claimable (effective) reserve is + // zero. Swapping against an empty reserve would let the constant-product + // curve drain the opposite side while the invariant check passes vacuously + // (k = 0 >= 0), so the swap is rejected outright. + #[msg("Pool reserves must both be positive to swap")] + EmptyPoolReserve, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/claim_admin_fees.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/claim_admin_fees.rs new file mode 100644 index 000000000..78ddb1795 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/claim_admin_fees.rs @@ -0,0 +1,184 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{self, Mint, TokenAccount, TokenInterface, TransferChecked}; + +use crate::{ + constants::{AUTHORITY_SEED, CONFIG_SEED}, + errors::AmmError, + state::{Config, PoolConfig}, +}; + +/// Sweep the admin's accumulated trading-fee claims for both sides of a pool +/// into the admin's token accounts. +/// +/// During each swap, the admin's slice of the fee accumulates as a virtual +/// claim on the input-side reserve (`pool_config.admin_fees_owed_a` / +/// `admin_fees_owed_b`). This handler transfers those amounts out of the +/// pool reserves into the admin's ATAs and resets the accumulators to zero. +/// +/// Authorisation: the `has_one = admin` constraint on `config` plus the +/// `Signer` constraint on `admin` together mean only the address stored in +/// `Config.admin` can call this. Any other signer will be rejected by +/// Anchor's built-in `has_one` check. +pub fn handle_claim_admin_fees(context: Context) -> Result<()> { + let owed_a = context.accounts.pool_config.admin_fees_owed_a; + let owed_b = context.accounts.pool_config.admin_fees_owed_b; + + // Revert if there's nothing to claim. Two reasons: + // 1. It tells the admin offchain that the call did nothing - silent + // no-ops mask wasted txs. + // 2. Under litesvm, two byte-identical claim txs (same payer, same + // accounts, same recent_blockhash) produce the same signature and + // the runtime rejects the second as `AlreadyProcessed`. Failing + // explicitly here gives callers a real error to handle. + if owed_a == 0 && owed_b == 0 { + return err!(AmmError::NothingToClaim); + } + + // Pre-copy seed bytes before the mutable borrow of pool_config. + let authority_bump = context.bumps.pool_authority; + let config_bytes = context.accounts.pool_config.config.to_bytes(); + let mint_a_bytes = context.accounts.mint_a.key().to_bytes(); + let mint_b_bytes = context.accounts.mint_b.key().to_bytes(); + + // Effects: zero the accumulators before the CPIs (Checks-Effects-Interactions). + // If a CPI fails the whole transaction reverts, so the state reset is safe. + { + let pool_config = &mut context.accounts.pool_config; + pool_config.admin_fees_owed_a = 0; + pool_config.admin_fees_owed_b = 0; + } + + // Interactions: transfer the owed fees out of the pool reserves. + let authority_seeds = &[ + config_bytes.as_ref(), + mint_a_bytes.as_ref(), + mint_b_bytes.as_ref(), + AUTHORITY_SEED, + &[authority_bump], + ]; + let signer_seeds = &[&authority_seeds[..]]; + + if owed_a > 0 { + token_interface::transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.pool_a.to_account_info(), + mint: context.accounts.mint_a.to_account_info(), + to: context.accounts.admin_token_a.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + owed_a, + context.accounts.mint_a.decimals, + )?; + } + + if owed_b > 0 { + token_interface::transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.pool_b.to_account_info(), + mint: context.accounts.mint_b.to_account_info(), + to: context.accounts.admin_token_b.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + owed_b, + context.accounts.mint_b.decimals, + )?; + } + + msg!("Admin swept fees: {} of mint_a, {} of mint_b", owed_a, owed_b); + + Ok(()) +} + +#[derive(Accounts)] +pub struct ClaimAdminFeesAccountConstraints<'info> { + #[account( + seeds = [CONFIG_SEED], + bump, + has_one = admin, + )] + pub config: Account<'info, Config>, + + #[account( + mut, + seeds = [ + pool_config.config.as_ref(), + pool_config.mint_a.key().as_ref(), + pool_config.mint_b.key().as_ref(), + ], + bump, + has_one = config, + has_one = mint_a, + has_one = mint_b, + )] + pub pool_config: Account<'info, PoolConfig>, + + /// CHECK: PDA that owns the pool reserves; signs the outbound transfers. + #[account( + seeds = [ + pool_config.config.as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + AUTHORITY_SEED, + ], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + pub mint_a: Box>, + + pub mint_b: Box>, + + /// The pool's token-A reserve. The admin's owed token-A fees are paid out + /// of this account. + #[account( + mut, + associated_token::mint = mint_a, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_a: Box>, + + /// The pool's token-B reserve. The admin's owed token-B fees are paid out + /// of this account. + #[account( + mut, + associated_token::mint = mint_b, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_b: Box>, + + /// Must match the address stored in `Config.admin` (enforced by + /// `has_one = admin` above). + pub admin: Signer<'info>, + + /// Admin's token-A receiving account. Must already exist; the admin is + /// expected to create it themselves before calling. Keeps this handler + /// small (no `init_if_needed`). + #[account( + mut, + token::mint = mint_a, + token::authority = admin, + token::token_program = token_program, + )] + pub admin_token_a: Box>, + + /// Admin's token-B receiving account. Same constraints as `admin_token_a`. + #[account( + mut, + token::mint = mint_b, + token::authority = admin, + token::token_program = token_program, + )] + pub admin_token_b: Box>, + + pub token_program: Interface<'info, TokenInterface>, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/mod.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/mod.rs new file mode 100644 index 000000000..0c1d5c221 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/admin/mod.rs @@ -0,0 +1,3 @@ +mod claim_admin_fees; + +pub use claim_admin_fees::*; diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/deposit_liquidity.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/deposit_liquidity.rs new file mode 100644 index 000000000..a6d97ff26 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/deposit_liquidity.rs @@ -0,0 +1,346 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{self, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::{ + constants::{AUTHORITY_SEED, LIQUIDITY_SEED, MINIMUM_LIQUIDITY}, + errors::AmmError, + state::PoolConfig, +}; + +/// Integer sqrt via Newton's method. Operates on `u128` so it can handle the +/// product `amount_a * amount_b` (each is a `u64`, product can fill the full +/// `u128`). Floors the result, which matches Uniswap V2's `Math.sqrt` and +/// keeps the initial-deposit LP-mint rounding in the pool's favour. +fn integer_sqrt(n: u128) -> u128 { + if n < 2 { + return n; + } + let mut x = n; + let mut y = (x + 1) / 2; + while y < x { + x = y; + y = (x + n / x) / 2; + } + x +} + +pub fn handle_deposit_liquidity( + context: Context, + amount_a: u64, + amount_b: u64, + minimum_lp_tokens_out: u64, +) -> Result<()> { + // Fail fast if the depositor lacks the requested balance. Previously this + // silently clamped to the available balance, which broke slippage protection + // for callers building on top - they expected their input amount to be the + // amount actually deposited. + if amount_a > context.accounts.token_a.amount + || amount_b > context.accounts.token_b.amount + { + return err!(AmmError::InsufficientBalance); + } + let mut amount_a = amount_a; + let mut amount_b = amount_b; + + // Clamp the caller's (amount_a, amount_b) to the current pool ratio. + // + // Callers pass `amount_a` / `amount_b` as *upper bounds* (their available + // balance, or the most they want to commit). The pool is at a fixed + // ratio, so at most one of the two amounts can be used in full; the other + // is scaled down to match the current price. This mirrors Uniswap V2's + // `mint()` pattern (UniswapV2Router._addLiquidity): try the first side at + // its requested amount, compute what the other side needs at the current + // ratio, and if it fits we're done - otherwise swap roles and try the + // other side. + // + // We use the *effective* (LP-claimable) reserves, not the raw vault + // balances, so the admin's accumulated fees don't drag the deposit ratio + // off the LP-relevant price. + // + // All ratio math is in u128 with checked arithmetic - no floats for + // money. The intermediate `amount_a * pool_b` can overflow u64 (both + // factors are u64), but u128 absorbs that with room to spare. + let pool_a = &context.accounts.pool_a; + let pool_b = &context.accounts.pool_b; + let pool_config = &context.accounts.pool_config; + // checked_sub: admin_fees_owed is an invariant subset of the vault balance; + // a raw `-` would wrap silently on a BPF release build if that ever broke. + let effective_pool_a = pool_a + .amount + .checked_sub(pool_config.admin_fees_owed_a) + .ok_or(AmmError::MathOverflow)?; + let effective_pool_b = pool_b + .amount + .checked_sub(pool_config.admin_fees_owed_b) + .ok_or(AmmError::MathOverflow)?; + // Defining pool creation like this allows attackers to frontrun pool creation with bad ratios + let pool_creation = effective_pool_a == 0 && effective_pool_b == 0; + (amount_a, amount_b) = if pool_creation { + // Add as is if there is no liquidity. Admin fees can't be owed yet + // (no swap has happened), so the initial-deposit math is unchanged. + (amount_a, amount_b) + } else { + // amount_b_required = amount_a * effective_pool_b / effective_pool_a. + // Round down: this can only ever ask the depositor for *less* token B + // than perfect-ratio, which favours the pool by a sub-base-unit and + // matches Uniswap V2. + let amount_b_required = (amount_a as u128) + .checked_mul(effective_pool_b as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(effective_pool_a as u128) + .ok_or(AmmError::MathOverflow)?; + if amount_b_required <= amount_b as u128 { + // The depositor's `amount_b` is enough to cover the ratio; use + // the full `amount_a` and clamp `amount_b` down. + let amount_b_required = + u64::try_from(amount_b_required).map_err(|_| AmmError::MathOverflow)?; + (amount_a, amount_b_required) + } else { + // `amount_b` is the binding side; use the full `amount_b` and + // clamp `amount_a` down to what the ratio needs. + let amount_a_required = (amount_b as u128) + .checked_mul(effective_pool_a as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(effective_pool_b as u128) + .ok_or(AmmError::MathOverflow)?; + let amount_a_required = + u64::try_from(amount_a_required).map_err(|_| AmmError::MathOverflow)?; + (amount_a_required, amount_b) + } + }; + + // After clamping, both sides must contribute something. If either side + // rounds to zero the deposit is too small to register at the current + // ratio (e.g. a depositor offering 1 base unit of A against a pool where + // 1 A is worth less than 1 base unit of B). Fail rather than letting an + // LP mint zero-priced shares. + if !pool_creation && (amount_a == 0 || amount_b == 0) { + return err!(AmmError::DepositAmountTooSmall); + } + + // LP-mint math. Two branches: + // - Initial deposit (pool creation): `liquidity = sqrt(a * b) - MINIMUM_LIQUIDITY`. + // The `MINIMUM_LIQUIDITY` floor is never minted to anyone: the first + // depositor receives `sqrt(a * b) - MINIMUM_LIQUIDITY` LP tokens, and + // withdraw_liquidity adds the floor back into its supply denominator, + // so the floor's share of the reserves stays in the pool, claimable by + // nobody while any LP supply exists. This stops the first depositor + // from draining the pool to a sub-minor-unit ratio. (Uniswap V2 + // instead mints the floor to the zero address; here, if every LP + // token is burned, the floor's leftover reserves simply seed the next + // bootstrap deposit.) + // - Subsequent deposit: `liquidity = min(a * supply / pool_a, b * supply / pool_b)`. + // This is the canonical Uniswap V2 formula: mint LP tokens in + // proportion to the depositor's share of each reserve, taking the + // smaller side as the binding constraint. After the ratio clamp + // above, both sides give the same result; `min` is kept as an + // invariant safety net and to match the published formula. + // + // All math is in `u128` with checked arithmetic. `amount * supply` can + // overflow `u64` (both are `u64`), but `u128` absorbs it: max product + // is `(2^64 - 1)^2 < 2^128`. We multiply before dividing to keep + // precision, then round down (floor) so the pool keeps any sub-unit + // rounding dust - protocol-favouring rounding, per the financial-math + // rules. + let liquidity: u64 = if pool_creation { + let product = (amount_a as u128) + .checked_mul(amount_b as u128) + .ok_or(AmmError::MathOverflow)?; + let sqrt_product = integer_sqrt(product); + let sqrt_product_u64 = u64::try_from(sqrt_product) + .map_err(|_| AmmError::MathOverflow)?; + if sqrt_product_u64 < MINIMUM_LIQUIDITY { + return err!(AmmError::DepositTooSmall); + } + sqrt_product_u64 + .checked_sub(MINIMUM_LIQUIDITY) + .ok_or(AmmError::MathOverflow)? + } else { + let total_supply = context.accounts.liquidity_provider_mint.supply as u128; + let liquidity_from_a = (amount_a as u128) + .checked_mul(total_supply) + .ok_or(AmmError::MathOverflow)? + .checked_div(effective_pool_a as u128) + .ok_or(AmmError::MathOverflow)?; + let liquidity_from_b = (amount_b as u128) + .checked_mul(total_supply) + .ok_or(AmmError::MathOverflow)? + .checked_div(effective_pool_b as u128) + .ok_or(AmmError::MathOverflow)?; + let liquidity = liquidity_from_a.min(liquidity_from_b); + u64::try_from(liquidity).map_err(|_| AmmError::MathOverflow)? + }; + + if liquidity == 0 { + // Subsequent deposit too small relative to existing LP supply. + // (Initial deposits hit the `MINIMUM_LIQUIDITY` check above.) + return err!(AmmError::DepositTooSmall); + } + + // Depositor's slippage protection: the caller passes the lowest LP + // amount they're willing to receive (computed offchain at quote time). + // If the pool ratio shifted between quoting and landing, the clamp will + // have used a smaller pair of amounts and the LP-mint amount drops. + // Revert rather than mint fewer LP tokens than the caller expects. + // + // This is the *lower-bound* slippage guard. The ratio clamp above is + // the *upper-bound* guard (caps how much of each token can be spent). + require!( + liquidity >= minimum_lp_tokens_out, + AmmError::DepositBelowMinimum + ); + + // Transfer tokens to the pool using transfer_checked. transfer_checked + // includes the mint and decimals in the CPI, which guards callers against + // decimal-mismatch bugs (and is the modern recommended path). + token_interface::transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.token_a.to_account_info(), + mint: context.accounts.mint_a.to_account_info(), + to: context.accounts.pool_a.to_account_info(), + authority: context.accounts.depositor.to_account_info(), + }, + ), + amount_a, + context.accounts.mint_a.decimals, + )?; + token_interface::transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.token_b.to_account_info(), + mint: context.accounts.mint_b.to_account_info(), + to: context.accounts.pool_b.to_account_info(), + authority: context.accounts.depositor.to_account_info(), + }, + ), + amount_b, + context.accounts.mint_b.decimals, + )?; + + // Mint the liquidity to user + let authority_bump = context.bumps.pool_authority; + let authority_seeds = &[ + &context.accounts.pool_config.config.to_bytes(), + &context.accounts.mint_a.key().to_bytes(), + &context.accounts.mint_b.key().to_bytes(), + AUTHORITY_SEED, + &[authority_bump], + ]; + let signer_seeds = &[&authority_seeds[..]]; + token_interface::mint_to( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.liquidity_provider_mint.to_account_info(), + to: context.accounts.liquidity_provider_token.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + liquidity, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct DepositLiquidityAccountConstraints<'info> { + #[account( + seeds = [ + pool_config.config.as_ref(), + pool_config.mint_a.key().as_ref(), + pool_config.mint_b.key().as_ref(), + ], + bump, + has_one = mint_a, + has_one = mint_b, + )] + pub pool_config: Box>, + + /// CHECK: Read only authority + #[account( + seeds = [ + pool_config.config.as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + AUTHORITY_SEED, + ], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// The account paying for all rents + pub depositor: Signer<'info>, + + #[account( + mut, + seeds = [ + pool_config.config.as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + LIQUIDITY_SEED, + ], + bump, + )] + pub liquidity_provider_mint: Box>, + + pub mint_a: Box>, + + pub mint_b: Box>, + + #[account( + mut, + associated_token::mint = mint_a, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_a: Box>, + + #[account( + mut, + associated_token::mint = mint_b, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_b: Box>, + + #[account( + init_if_needed, + payer = payer, + associated_token::mint = liquidity_provider_mint, + associated_token::authority = depositor, + associated_token::token_program = token_program, + )] + pub liquidity_provider_token: Box>, + + #[account( + mut, + associated_token::mint = mint_a, + associated_token::authority = depositor, + associated_token::token_program = token_program, + )] + pub token_a: Box>, + + #[account( + mut, + associated_token::mint = mint_b, + associated_token::authority = depositor, + associated_token::token_program = token_program, + )] + pub token_b: Box>, + + /// The account paying for all rents + #[account(mut)] + pub payer: Signer<'info>, + + /// Solana ecosystem accounts + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_config.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_config.rs new file mode 100644 index 000000000..b5739d3e5 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_config.rs @@ -0,0 +1,48 @@ +use anchor_lang::prelude::*; + +use crate::{ + constants::{BASIS_POINTS_DIVISOR, CONFIG_SEED}, + errors::*, + state::Config, +}; + +pub fn handle_initialize_config( + context: Context, + fee: u16, + admin_share_bps: u16, +) -> Result<()> { + let bump = context.bumps.config; + let config = &mut context.accounts.config; + config.admin = context.accounts.admin.key(); + config.fee = fee; + config.admin_share_bps = admin_share_bps; + config.bump = bump; + + Ok(()) +} + +#[derive(Accounts)] +#[instruction(fee: u16, admin_share_bps: u16)] +pub struct InitializeConfigAccountConstraints<'info> { + #[account( + init, + payer = payer, + space = Config::DISCRIMINATOR.len() + Config::INIT_SPACE, + seeds = [CONFIG_SEED], + bump, + constraint = (fee as u64) < BASIS_POINTS_DIVISOR @ AmmError::InvalidFee, + constraint = (admin_share_bps as u64) < BASIS_POINTS_DIVISOR @ AmmError::AdminShareTooHigh, + )] + pub config: Account<'info, Config>, + + /// The admin of the AMM + /// CHECK: Read only, delegatable creation + pub admin: UncheckedAccount<'info>, + + /// The account paying for all rents + #[account(mut)] + pub payer: Signer<'info>, + + /// Solana ecosystem accounts + pub system_program: Program<'info, System>, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_pool.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_pool.rs new file mode 100644 index 000000000..4a869c743 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/initialize_pool.rs @@ -0,0 +1,103 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::{ + constants::{AUTHORITY_SEED, CONFIG_SEED, LIQUIDITY_SEED}, + errors::AmmError, + state::{Config, PoolConfig}, +}; + +pub fn handle_initialize_pool(context: Context) -> Result<()> { + let bump = context.bumps.pool_config; + let pool_config = &mut context.accounts.pool_config; + pool_config.config = context.accounts.config.key(); + pool_config.mint_a = context.accounts.mint_a.key(); + pool_config.mint_b = context.accounts.mint_b.key(); + pool_config.bump = bump; + + Ok(()) +} + +#[derive(Accounts)] +pub struct InitializePoolAccountConstraints<'info> { + #[account( + seeds = [CONFIG_SEED], + bump, + )] + pub config: Box>, + + #[account( + init, + payer = payer, + space = PoolConfig::DISCRIMINATOR.len() + PoolConfig::INIT_SPACE, + seeds = [ + config.key().as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + ], + bump, + constraint = mint_a.key() < mint_b.key() @ AmmError::InvalidMintOrder, + )] + pub pool_config: Box>, + + /// CHECK: Read only authority + #[account( + seeds = [ + config.key().as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + AUTHORITY_SEED, + ], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + #[account( + init, + payer = payer, + seeds = [ + config.key().as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + LIQUIDITY_SEED, + ], + bump, + mint::decimals = 6, + mint::authority = pool_authority, + )] + pub liquidity_provider_mint: Box>, + + pub mint_a: Box>, + + pub mint_b: Box>, + + #[account( + init, + payer = payer, + associated_token::mint = mint_a, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_a: Box>, + + #[account( + init, + payer = payer, + associated_token::mint = mint_b, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_b: Box>, + + /// The account paying for all rents + #[account(mut)] + pub payer: Signer<'info>, + + /// Solana ecosystem accounts + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/mod.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/mod.rs new file mode 100644 index 000000000..fd4e825c8 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/mod.rs @@ -0,0 +1,13 @@ +mod admin; +mod initialize_config; +mod initialize_pool; +mod deposit_liquidity; +mod swap_tokens; +mod withdraw_liquidity; + +pub use admin::*; +pub use initialize_config::*; +pub use initialize_pool::*; +pub use deposit_liquidity::*; +pub use swap_tokens::*; +pub use withdraw_liquidity::*; diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/swap_tokens.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/swap_tokens.rs new file mode 100644 index 000000000..c9b4b2b8e --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/swap_tokens.rs @@ -0,0 +1,360 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{self, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::{ + constants::{AUTHORITY_SEED, BASIS_POINTS_DIVISOR, CONFIG_SEED}, + errors::*, + state::{Config, PoolConfig}, +}; + +pub fn handle_swap_tokens( + context: Context, + input_is_token_a: bool, + input_amount: u64, + min_output_amount: u64, +) -> Result<()> { + // Fail fast if the trader lacks the requested input balance. Previously this + // silently clamped to the available balance, which broke slippage protection + // for callers - their min_output_amount is computed against the requested + // input, not the clamped one, so the trade could succeed with worse terms + // than expected. + if input_is_token_a && input_amount > context.accounts.token_a.amount { + return err!(AmmError::InsufficientBalance); + } + if !input_is_token_a && input_amount > context.accounts.token_b.amount { + return err!(AmmError::InsufficientBalance); + } + // Split the trading fee between LPs and the admin. The full fee is taken + // off the input first (this is the standard Uniswap V2 mechanic). The + // admin's slice is *not* transferred immediately - it accumulates as a + // virtual claim on the input-side reserve, swept later by + // `claim_admin_fees`. This saves a CPI per swap. + // + // u128 + checked arithmetic: `input * fee` can overflow u64 (both are + // u64-sized in practice; fee is u16 but the multiplication grows fast). + // Multiply before divide to preserve precision; floor on the divide is + // protocol-favouring (the trader pays slightly more fee on rounding, + // not less). + let config = &context.accounts.config; + let fee_amount = (input_amount as u128) + .checked_mul(config.fee as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(BASIS_POINTS_DIVISOR as u128) + .ok_or(AmmError::MathOverflow)?; + let admin_portion = fee_amount + .checked_mul(config.admin_share_bps as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(BASIS_POINTS_DIVISOR as u128) + .ok_or(AmmError::MathOverflow)?; + // Narrow back to u64 for storage / transfer. The fee can never exceed + // `input` (`fee_amount <= input * 9999 / 10_000 < input`, and `input` + // is u64), so the cast is safe - but use try_into anyway to make the + // invariant explicit in the type system. + let fee_amount: u64 = u64::try_from(fee_amount).map_err(|_| AmmError::MathOverflow)?; + let admin_portion: u64 = + u64::try_from(admin_portion).map_err(|_| AmmError::MathOverflow)?; + // The LP portion stays in the pool reserves (as today - it's "less output + // for the same input"), boosting the LP curve. The admin portion is + // accounted for separately so it does *not* grow LP yield. + let taxed_input = input_amount.checked_sub(fee_amount).ok_or(AmmError::MathOverflow)?; + + // Effective reserves = raw vault balance - admin's accumulated claim. + // The constant-product curve runs on the LP-claimable portion only, so + // the admin's outstanding fees do not contribute to LP yield and do not + // distort the price. + let pool_a = &context.accounts.pool_a; + let pool_b = &context.accounts.pool_b; + let pool_config = &context.accounts.pool_config; + // checked_sub: admin_fees_owed is an invariant subset of the vault balance, + // but a raw `-` would wrap silently on a BPF release build if that invariant + // were ever violated, handing the curve a giant effective reserve. + let effective_pool_a = pool_a + .amount + .checked_sub(pool_config.admin_fees_owed_a) + .ok_or(AmmError::MathOverflow)?; + let effective_pool_b = pool_b + .amount + .checked_sub(pool_config.admin_fees_owed_b) + .ok_or(AmmError::MathOverflow)?; + + // Both LP-claimable reserves must be positive. Defence in depth: if an input + // reserve were 0, the constant-product formula below would output the ENTIRE + // opposite reserve (output = taxed_input * other / (0 + taxed_input) = other), + // draining that side - and the end-of-swap `new_invariant >= invariant` check + // would NOT catch it, because the pre-trade product k = 0 * other = 0 makes + // `0 >= 0` hold vacuously. A bootstrapped pool keeps both sides positive (the + // MINIMUM_LIQUIDITY floor on the first deposit, and swaps preserve the + // product), so this is not reachable in normal operation, but the curve's + // solvency must not rest on that argument alone. + require!( + effective_pool_a > 0 && effective_pool_b > 0, + AmmError::EmptyPoolReserve + ); + + // Constant-product output formula: + // output = taxed_input * other_reserve / (this_reserve + taxed_input) + // (where `this_reserve` is the input side, `other_reserve` the output + // side, both using *effective* reserves). + // + // u128 + checked: the numerator `taxed_input * reserve` can fill the + // full u128 (both factors are u64). Multiply before divide to keep + // precision. Floor on the divide is protocol-favouring (the pool keeps + // sub-base-unit rounding, the trader gets slightly less output) - same + // direction as Uniswap V2. + let (this_reserve, other_reserve) = if input_is_token_a { + (effective_pool_a, effective_pool_b) + } else { + (effective_pool_b, effective_pool_a) + }; + let numerator = (taxed_input as u128) + .checked_mul(other_reserve as u128) + .ok_or(AmmError::MathOverflow)?; + let denominator = (this_reserve as u128) + .checked_add(taxed_input as u128) + .ok_or(AmmError::MathOverflow)?; + let output_u128 = numerator + .checked_div(denominator) + .ok_or(AmmError::MathOverflow)?; + let output: u64 = u64::try_from(output_u128).map_err(|_| AmmError::MathOverflow)?; + + // Trader's slippage protection: the caller passes the lowest output + // they're willing to accept (computed offchain at quote time). If the + // pool shifted between quoting and landing, we revert rather than fill + // at the worse rate. + require!( + output >= min_output_amount, + AmmError::SlippageExceeded + ); + + // Compute the invariant on the *effective* reserves before the trade. + // Using raw balances here would let the admin's accumulated fees count + // toward LP yield (wrong) and would cause the invariant check to pass + // trivially even when the LP-claimable reserves shrunk. + // + // u128 + checked: each side is u64, so the product can fill the full + // u128. Raw `*` on u64 would overflow at ~1.8e19 base units. + let invariant = (effective_pool_a as u128) + .checked_mul(effective_pool_b as u128) + .ok_or(AmmError::MathOverflow)?; + + // Pre-copy seed bytes before the mutable borrow of pool_config below. + // to_bytes() returns an owned [u8; 32] copy so there are no borrow conflicts. + let authority_bump = context.bumps.pool_authority; + let config_bytes = context.accounts.pool_config.config.to_bytes(); + let mint_a_bytes = context.accounts.mint_a.key().to_bytes(); + let mint_b_bytes = context.accounts.mint_b.key().to_bytes(); + + // Effects: update admin_fees before CPIs (Checks-Effects-Interactions). + // The fee always comes off the input side, so the admin's claim accumulates + // in the same token. + { + let pool_config = &mut context.accounts.pool_config; + if input_is_token_a { + pool_config.admin_fees_owed_a = pool_config + .admin_fees_owed_a + .checked_add(admin_portion) + .ok_or(AmmError::MathOverflow)?; + } else { + pool_config.admin_fees_owed_b = pool_config + .admin_fees_owed_b + .checked_add(admin_portion) + .ok_or(AmmError::MathOverflow)?; + } + } + + // Interactions: CPIs after state has been updated. + let authority_seeds = &[ + config_bytes.as_ref(), + mint_a_bytes.as_ref(), + mint_b_bytes.as_ref(), + AUTHORITY_SEED, + &[authority_bump], + ]; + let signer_seeds = &[&authority_seeds[..]]; + if input_is_token_a { + token_interface::transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.token_a.to_account_info(), + mint: context.accounts.mint_a.to_account_info(), + to: context.accounts.pool_a.to_account_info(), + authority: context.accounts.trader.to_account_info(), + }, + ), + input_amount, + context.accounts.mint_a.decimals, + )?; + token_interface::transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.pool_b.to_account_info(), + mint: context.accounts.mint_b.to_account_info(), + to: context.accounts.token_b.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + output, + context.accounts.mint_b.decimals, + )?; + } else { + token_interface::transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.pool_a.to_account_info(), + mint: context.accounts.mint_a.to_account_info(), + to: context.accounts.token_a.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + output, + context.accounts.mint_a.decimals, + )?; + token_interface::transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.token_b.to_account_info(), + mint: context.accounts.mint_b.to_account_info(), + to: context.accounts.pool_b.to_account_info(), + authority: context.accounts.trader.to_account_info(), + }, + ), + input_amount, + context.accounts.mint_b.decimals, + )?; + } + + msg!( + "Traded {} tokens ({} after fees) for {} (admin slice {})", + input_amount, + taxed_input, + output, + admin_portion + ); + + // Verify the invariant still holds on the LP-claimable (effective) + // reserves. This is THE most important defensive check: it catches + // "I screwed up the swap math and accidentally gave the user too much" + // bugs that no other test would catch. Defence in depth - runs *after* + // the math (and after the transfers, once balances have been reloaded). + // + // We tolerate the new invariant being higher because it means a + // rounding gain for LPs (and/or the LP portion of the fee enriching + // the pool). + // + // u128 + checked: same overflow concern as the pre-trade invariant. + context.accounts.pool_a.reload()?; + context.accounts.pool_b.reload()?; + let pool_config = &context.accounts.pool_config; + let effective_pool_a_after = context + .accounts + .pool_a + .amount + .checked_sub(pool_config.admin_fees_owed_a) + .ok_or(AmmError::MathOverflow)?; + let effective_pool_b_after = context + .accounts + .pool_b + .amount + .checked_sub(pool_config.admin_fees_owed_b) + .ok_or(AmmError::MathOverflow)?; + let new_invariant = (effective_pool_a_after as u128) + .checked_mul(effective_pool_b_after as u128) + .ok_or(AmmError::MathOverflow)?; + require!(new_invariant >= invariant, AmmError::InvariantViolated); + + Ok(()) +} + +#[derive(Accounts)] +pub struct SwapTokensAccountConstraints<'info> { + #[account( + seeds = [CONFIG_SEED], + bump, + )] + pub config: Account<'info, Config>, + + #[account( + mut, + seeds = [ + pool_config.config.as_ref(), + pool_config.mint_a.key().as_ref(), + pool_config.mint_b.key().as_ref(), + ], + bump, + has_one = config, + has_one = mint_a, + has_one = mint_b, + )] + pub pool_config: Account<'info, PoolConfig>, + + /// CHECK: Read only authority + #[account( + seeds = [ + pool_config.config.as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + AUTHORITY_SEED, + ], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + /// The account doing the swap + pub trader: Signer<'info>, + + pub mint_a: Box>, + + pub mint_b: Box>, + + #[account( + mut, + associated_token::mint = mint_a, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_a: Box>, + + #[account( + mut, + associated_token::mint = mint_b, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_b: Box>, + + #[account( + init_if_needed, + payer = payer, + associated_token::mint = mint_a, + associated_token::authority = trader, + associated_token::token_program = token_program, + )] + pub token_a: Box>, + + #[account( + init_if_needed, + payer = payer, + associated_token::mint = mint_b, + associated_token::authority = trader, + associated_token::token_program = token_program, + )] + pub token_b: Box>, + + /// The account paying for all rents + #[account(mut)] + pub payer: Signer<'info>, + + /// Solana ecosystem accounts + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/withdraw_liquidity.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/withdraw_liquidity.rs new file mode 100644 index 000000000..db8ef01e9 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/instructions/withdraw_liquidity.rs @@ -0,0 +1,244 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{self, Burn, Mint, TokenAccount, TokenInterface, TransferChecked}, +}; + +use crate::{ + constants::{AUTHORITY_SEED, CONFIG_SEED, LIQUIDITY_SEED, MINIMUM_LIQUIDITY}, + errors::AmmError, + state::{Config, PoolConfig}, +}; + +pub fn handle_withdraw_liquidity( + context: Context, + amount: u64, + minimum_token_a_out: u64, + minimum_token_b_out: u64, +) -> Result<()> { + let authority_bump = context.bumps.pool_authority; + let authority_seeds = &[ + &context.accounts.pool_config.config.to_bytes(), + &context.accounts.mint_a.key().to_bytes(), + &context.accounts.mint_b.key().to_bytes(), + AUTHORITY_SEED, + &[authority_bump], + ]; + let signer_seeds = &[&authority_seeds[..]]; + + // LPs withdraw a proportional share of the *effective* reserves + // (vault balance minus the admin's accumulated fee claim). The admin's + // owed slice physically remains in the vaults but is not distributed to + // exiting LPs - it's claimed separately via `claim_admin_fees`. + let pool_config = &context.accounts.pool_config; + // checked_sub: admin_fees_owed is an invariant subset of the vault balance; + // a raw `-` would wrap silently on a BPF release build if that ever broke. + let effective_pool_a = context + .accounts + .pool_a + .amount + .checked_sub(pool_config.admin_fees_owed_a) + .ok_or(AmmError::MathOverflow)?; + let effective_pool_b = context + .accounts + .pool_b + .amount + .checked_sub(pool_config.admin_fees_owed_b) + .ok_or(AmmError::MathOverflow)?; + + // Proportional-withdraw formula: + // amount_out = lp_amount * effective_reserve / (lp_supply + MINIMUM_LIQUIDITY) + // The `+ MINIMUM_LIQUIDITY` accounts for the bootstrap floor that was + // locked away on the first deposit and is *not* part of the LP supply + // counter (mint::supply doesn't include it) but *is* part of the + // reserves - so the divisor needs the same adjustment to keep shares + // honest. + // + // u128 + checked: `lp_amount * reserve` can fill the full u128 (both + // factors are u64). Multiply before divide to preserve precision; floor + // is protocol-favouring (sub-base-unit rounding stays with the pool, + // grows LP value for everyone still in). + // + // Both amounts are computed up-front (before the slippage checks) so + // the LP gets a consistent error regardless of which side trips first, + // and so we don't transfer one side then revert. + let divisor = (context.accounts.liquidity_provider_mint.supply as u128) + .checked_add(MINIMUM_LIQUIDITY as u128) + .ok_or(AmmError::MathOverflow)?; + let amount_a_u128 = (amount as u128) + .checked_mul(effective_pool_a as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(divisor) + .ok_or(AmmError::MathOverflow)?; + let amount_a: u64 = u64::try_from(amount_a_u128).map_err(|_| AmmError::MathOverflow)?; + let amount_b_u128 = (amount as u128) + .checked_mul(effective_pool_b as u128) + .ok_or(AmmError::MathOverflow)? + .checked_div(divisor) + .ok_or(AmmError::MathOverflow)?; + let amount_b: u64 = u64::try_from(amount_b_u128).map_err(|_| AmmError::MathOverflow)?; + + // LP's slippage protection: if the pool ratio shifted between the LP + // quoting their exit and this tx landing (e.g. a big swap drained one + // side), the proportional share comes back with a different mix than + // expected. Revert so the LP can bail / requote. + require!( + amount_a >= minimum_token_a_out, + AmmError::WithdrawalBelowMinimum + ); + require!( + amount_b >= minimum_token_b_out, + AmmError::WithdrawalBelowMinimum + ); + + // transfer_checked verifies the mint + decimals at the token program. + token_interface::transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.pool_a.to_account_info(), + mint: context.accounts.mint_a.to_account_info(), + to: context.accounts.token_a.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + amount_a, + context.accounts.mint_a.decimals, + )?; + + token_interface::transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.pool_b.to_account_info(), + mint: context.accounts.mint_b.to_account_info(), + to: context.accounts.token_b.to_account_info(), + authority: context.accounts.pool_authority.to_account_info(), + }, + signer_seeds, + ), + amount_b, + context.accounts.mint_b.decimals, + )?; + + // Burn the liquidity tokens + // It will fail if the amount is invalid + token_interface::burn( + CpiContext::new( + context.accounts.token_program.key(), + Burn { + mint: context.accounts.liquidity_provider_mint.to_account_info(), + from: context.accounts.liquidity_provider_token.to_account_info(), + authority: context.accounts.withdrawer.to_account_info(), + }, + ), + amount, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct WithdrawLiquidityAccountConstraints<'info> { + #[account( + seeds = [CONFIG_SEED], + bump, + )] + pub config: Account<'info, Config>, + + #[account( + seeds = [ + pool_config.config.as_ref(), + pool_config.mint_a.key().as_ref(), + pool_config.mint_b.key().as_ref(), + ], + bump, + has_one = mint_a, + has_one = mint_b, + )] + pub pool_config: Account<'info, PoolConfig>, + + /// CHECK: Read only authority + #[account( + seeds = [ + pool_config.config.as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + AUTHORITY_SEED, + ], + bump, + )] + pub pool_authority: UncheckedAccount<'info>, + + pub withdrawer: Signer<'info>, + + #[account( + mut, + seeds = [ + pool_config.config.as_ref(), + mint_a.key().as_ref(), + mint_b.key().as_ref(), + LIQUIDITY_SEED, + ], + bump, + )] + pub liquidity_provider_mint: Box>, + + #[account(mut)] + pub mint_a: Box>, + + #[account(mut)] + pub mint_b: Box>, + + #[account( + mut, + associated_token::mint = mint_a, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_a: Box>, + + #[account( + mut, + associated_token::mint = mint_b, + associated_token::authority = pool_authority, + associated_token::token_program = token_program, + )] + pub pool_b: Box>, + + #[account( + mut, + associated_token::mint = liquidity_provider_mint, + associated_token::authority = withdrawer, + associated_token::token_program = token_program, + )] + pub liquidity_provider_token: Box>, + + #[account( + init_if_needed, + payer = payer, + associated_token::mint = mint_a, + associated_token::authority = withdrawer, + associated_token::token_program = token_program, + )] + pub token_a: Box>, + + #[account( + init_if_needed, + payer = payer, + associated_token::mint = mint_b, + associated_token::authority = withdrawer, + associated_token::token_program = token_program, + )] + pub token_b: Box>, + + /// The account paying for all rents + #[account(mut)] + pub payer: Signer<'info>, + + /// Solana ecosystem accounts + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/lib.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/lib.rs new file mode 100644 index 000000000..780516598 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/lib.rs @@ -0,0 +1,72 @@ +use anchor_lang::prelude::*; + +mod constants; +mod errors; +mod instructions; +mod state; + +declare_id!("GahM6PrXesrBkHiGJ5no4EskLNnVBCaSwVKbM4UtzyK6"); + +#[program] +pub mod swap_example { + pub use super::instructions::*; + use super::*; + + pub fn initialize_config( + context: Context, + fee: u16, + admin_share_bps: u16, + ) -> Result<()> { + instructions::handle_initialize_config(context, fee, admin_share_bps) + } + + pub fn initialize_pool(context: Context) -> Result<()> { + instructions::handle_initialize_pool(context) + } + + pub fn deposit_liquidity( + context: Context, + amount_a: u64, + amount_b: u64, + minimum_lp_tokens_out: u64, + ) -> Result<()> { + instructions::handle_deposit_liquidity( + context, + amount_a, + amount_b, + minimum_lp_tokens_out, + ) + } + + pub fn withdraw_liquidity( + context: Context, + amount: u64, + minimum_token_a_out: u64, + minimum_token_b_out: u64, + ) -> Result<()> { + instructions::handle_withdraw_liquidity( + context, + amount, + minimum_token_a_out, + minimum_token_b_out, + ) + } + + pub fn swap_tokens( + context: Context, + input_is_token_a: bool, + input_amount: u64, + min_output_amount: u64, + ) -> Result<()> { + instructions::handle_swap_tokens( + context, + input_is_token_a, + input_amount, + min_output_amount, + ) + } + + pub fn claim_admin_fees(context: Context) -> Result<()> { + instructions::handle_claim_admin_fees(context) + } +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/state/config.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/state/config.rs new file mode 100644 index 000000000..ff005d9d0 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/state/config.rs @@ -0,0 +1,34 @@ +use anchor_lang::prelude::*; + +/// Shared configuration for the AMM (admin + trading fee). +/// +/// `Config` is a singleton: one account per deployed program, seeded by the +/// fixed byte string `b"config"`. This mirrors how real DEXs are deployed in +/// practice (e.g. Phoenix and Raydium ship one program per market/AMM, so the +/// program-level config is global by construction). Parameterising the config +/// by an `id` was leftover complexity from the original example; removing it +/// makes the onchain layout simpler and matches realistic deployment. +#[account] +#[derive(Default, InitSpace)] +pub struct Config { + /// Account that has admin authority over the AMM. + pub admin: Pubkey, + + /// The trading fee taken on each swap, in basis points (out of 10_000). + /// + /// This is the *total* fee charged on a swap. It is split between LPs and + /// the admin according to `admin_share_bps`. + pub fee: u16, + + /// Fraction of the trading fee that goes to the admin, in basis points + /// (out of 10_000). The remainder goes to LPs (it stays in the pool + /// reserves and grows the LP-claimable balance). + /// + /// Modelled on Uniswap V2 / Raydium: the AMM operator takes a slice of + /// every fee, LPs keep the rest. Set in `initialize_config`; fixed for the + /// lifetime of the program. Must be `< 10_000`. + pub admin_share_bps: u16, + + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/state/mod.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/state/mod.rs new file mode 100644 index 000000000..b30866742 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/state/mod.rs @@ -0,0 +1,5 @@ +pub mod config; +pub mod pool_config; + +pub use config::*; +pub use pool_config::*; diff --git a/finance/token-swap/anchor-v1/programs/token-swap/src/state/pool_config.rs b/finance/token-swap/anchor-v1/programs/token-swap/src/state/pool_config.rs new file mode 100644 index 000000000..d39a93e59 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/src/state/pool_config.rs @@ -0,0 +1,42 @@ +use anchor_lang::prelude::*; + +/// Per-pool configuration / identity record. +/// +/// Holds the metadata that identifies a single pool: which `Config` it belongs +/// to, which two mints it trades, and its canonical bump. The actual pool +/// reserves live in separate token accounts (`pool_a`, `pool_b`) owned by the +/// pool authority PDA - they are not stored here. This struct is the pool's +/// *configuration*, not its state. +/// +/// In addition to the identity fields, this account tracks the admin's +/// accumulated trading-fee claim on each side (`admin_fees_owed_a` / +/// `admin_fees_owed_b`). Those fees physically sit in the existing `pool_a` / +/// `pool_b` reserves; the accumulators are a *virtual* obligation against +/// those balances. LP-facing math (deposit, withdraw, swap curve) uses +/// `pool_X.amount - admin_fees_owed_X` so the admin's owed slice is not +/// counted toward LP yield. +#[account] +#[derive(Default, InitSpace)] +pub struct PoolConfig { + /// Address of the parent `Config` account this pool belongs to. + pub config: Pubkey, + + /// Mint of token A. + pub mint_a: Pubkey, + + /// Mint of token B. + pub mint_b: Pubkey, + + /// Admin's accumulated fee claim on token A, in base units. Sits + /// physically in `pool_a` but is excluded from the LP curve and from + /// LP-withdrawable amounts. Swept by `claim_admin_fees`. + pub admin_fees_owed_a: u64, + + /// Admin's accumulated fee claim on token B, in base units. Sits + /// physically in `pool_b` but is excluded from the LP curve and from + /// LP-withdrawable amounts. Swept by `claim_admin_fees`. + pub admin_fees_owed_b: u64, + + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/finance/token-swap/anchor-v1/programs/token-swap/tests/test_swap.rs b/finance/token-swap/anchor-v1/programs/token-swap/tests/test_swap.rs new file mode 100644 index 000000000..14820efa3 --- /dev/null +++ b/finance/token-swap/anchor-v1/programs/token-swap/tests/test_swap.rs @@ -0,0 +1,1574 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = swap_example::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/swap_example.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + (svm, program_id, payer) +} + +/// Ensure mint_a < mint_b by pubkey ordering (the program may require this). +fn ordered_mints(svm: &mut LiteSVM, authority: &Keypair, decimals: u8) -> (Pubkey, Pubkey) { + loop { + let a = create_token_mint(svm, authority, decimals, None).unwrap(); + let b = create_token_mint(svm, authority, decimals, None).unwrap(); + if a.as_ref() < b.as_ref() { + return (a, b); + } + } +} + +struct TestSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + admin: Keypair, + config_key: Pubkey, + mint_a: Pubkey, + mint_b: Pubkey, + pool_config_key: Pubkey, + pool_authority: Pubkey, + liquidity_provider_mint: Pubkey, + pool_a: Pubkey, + pool_b: Pubkey, + holder_account_a: Pubkey, + holder_account_b: Pubkey, + liquidity_account: Pubkey, +} + +fn full_setup() -> TestSetup { + let (mut svm, program_id, payer) = setup(); + let admin = create_wallet(&mut svm, 100_000_000_000).unwrap(); + + let decimals: u8 = 6; + let minted_amount: u64 = 100 * 10u64.pow(decimals as u32); + + let (mint_a, mint_b) = ordered_mints(&mut svm, &admin, decimals); + let fee: u16 = 500; + // Uniswap V2's classic 1/6 split: admin keeps ~1/6 of the trading fee, + // LPs keep ~5/6 (1667 / 10_000 ≈ 0.1667). + let admin_share_bps: u16 = 1667; + + // Derive the singleton Config PDA (seeds = [b"config"]). One config per + // deployed program. + let (config_key, _) = Pubkey::find_program_address(&[b"config"], &program_id); + let (pool_config_key, _) = Pubkey::find_program_address( + &[config_key.as_ref(), mint_a.as_ref(), mint_b.as_ref()], + &program_id, + ); + let (pool_authority, _) = Pubkey::find_program_address( + &[ + config_key.as_ref(), + mint_a.as_ref(), + mint_b.as_ref(), + b"authority", + ], + &program_id, + ); + let (liquidity_provider_mint, _) = Pubkey::find_program_address( + &[ + config_key.as_ref(), + mint_a.as_ref(), + mint_b.as_ref(), + b"liquidity", + ], + &program_id, + ); + + let pool_a = derive_ata(&pool_authority, &mint_a); + let pool_b = derive_ata(&pool_authority, &mint_b); + let liquidity_account = derive_ata(&admin.pubkey(), &liquidity_provider_mint); + + // Create ATAs for admin and mint tokens + let holder_account_a = + create_associated_token_account(&mut svm, &admin.pubkey(), &mint_a, &payer).unwrap(); + let holder_account_b = + create_associated_token_account(&mut svm, &admin.pubkey(), &mint_b, &payer).unwrap(); + + mint_tokens_to_token_account(&mut svm, &mint_a, &holder_account_a, minted_amount, &admin).unwrap(); + mint_tokens_to_token_account(&mut svm, &mint_b, &holder_account_b, minted_amount, &admin).unwrap(); + + // Create AMM + let initialize_config_ix = Instruction::new_with_bytes( + program_id, + &swap_example::instruction::InitializeConfig { fee, admin_share_bps }.data(), + swap_example::accounts::InitializeConfigAccountConstraints { + config: config_key, + admin: admin.pubkey(), + payer: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_config_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Create Pool + let initialize_pool_ix = Instruction::new_with_bytes( + program_id, + &swap_example::instruction::InitializePool {}.data(), + swap_example::accounts::InitializePoolAccountConstraints { + config: config_key, + pool_config: pool_config_key, + pool_authority, + liquidity_provider_mint, + mint_a, + mint_b, + pool_a, + pool_b, + payer: payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_pool_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + TestSetup { + svm, + program_id, + payer, + admin, + config_key, + mint_a, + mint_b, + pool_config_key, + pool_authority, + liquidity_provider_mint, + pool_a, + pool_b, + holder_account_a, + holder_account_b, + liquidity_account, + } +} + +#[test] +fn test_initialize_config() { + let (mut svm, program_id, payer) = setup(); + let fee: u16 = 500; + let admin_share_bps: u16 = 1667; + let admin = Keypair::new(); + + let (config_key, _) = Pubkey::find_program_address(&[b"config"], &program_id); + + let initialize_config_ix = Instruction::new_with_bytes( + program_id, + &swap_example::instruction::InitializeConfig { fee, admin_share_bps }.data(), + swap_example::accounts::InitializeConfigAccountConstraints { + config: config_key, + admin: admin.pubkey(), + payer: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![initialize_config_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the Config account exists + let config_account = svm + .get_account(&config_key) + .expect("Config account should exist"); + assert!(!config_account.data.is_empty()); +} + +#[test] +fn test_deposit_liquidity() { + let mut ts = full_setup(); + let deposit_amount_a: u64 = 4_000_000; + let deposit_amount_b: u64 = 1_000_000; + + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: deposit_amount_a, + amount_b: deposit_amount_b, + // 0 = no slippage floor for this baseline test + minimum_lp_tokens_out: 0, + } + .data(), + swap_example::accounts::DepositLiquidityAccountConstraints { + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Verify liquidity tokens were minted + let liq_amount = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + assert!(liq_amount > 0, "Should have received liquidity tokens"); +} + +#[test] +fn test_swap_a_to_b() { + let mut ts = full_setup(); + + // Deposit liquidity first + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: 4_000_000, + amount_b: 1_000_000, + // 0 = no slippage floor for this setup deposit + minimum_lp_tokens_out: 0, + } + .data(), + swap_example::accounts::DepositLiquidityAccountConstraints { + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Get balances before swap + let before_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + // Swap 1M of token A for token B + let swap_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: true, + input_amount: 1_000_000, + min_output_amount: 100, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // After swap, token B balance should have increased + let after_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + assert!( + after_b > before_b, + "Token B balance should increase after swap A->B" + ); +} + +#[test] +fn test_withdraw_liquidity() { + let mut ts = full_setup(); + + // Deposit liquidity + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: 4_000_000, + amount_b: 4_000_000, + // 0 = no slippage floor for this setup deposit + minimum_lp_tokens_out: 0, + } + .data(), + swap_example::accounts::DepositLiquidityAccountConstraints { + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Get liquidity token balance + let liq_amount = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + assert!(liq_amount > 0); + + // Withdraw all liquidity + let withdraw_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::WithdrawLiquidity { + amount: liq_amount, + // 0 = no slippage floor for this baseline test + minimum_token_a_out: 0, + minimum_token_b_out: 0, + } + .data(), + swap_example::accounts::WithdrawLiquidityAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + withdrawer: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![withdraw_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Liquidity balance should be 0 + let liq_amount = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + assert_eq!(liq_amount, 0, "Liquidity should be fully withdrawn"); +} + +/// Helper: do a deposit and one A->B swap on top of `full_setup`. +/// Returns the swap input amount (token A base units) for fee-arithmetic checks. +fn deposit_and_swap_a_to_b(ts: &mut TestSetup, deposit_a: u64, deposit_b: u64, swap_in_a: u64) -> u64 { + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: deposit_a, + amount_b: deposit_b, + // 0 = no slippage floor for setup deposits in helpers + minimum_lp_tokens_out: 0, + } + .data(), + swap_example::accounts::DepositLiquidityAccountConstraints { + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + let swap_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: true, + input_amount: swap_in_a, + min_output_amount: 1, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + swap_in_a +} + +/// Helper: build a `claim_admin_fees` instruction for the standard setup. +fn claim_admin_fees_ix(ts: &TestSetup) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::ClaimAdminFees {}.data(), + swap_example::accounts::ClaimAdminFeesAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + admin: ts.admin.pubkey(), + admin_token_a: ts.holder_account_a, + admin_token_b: ts.holder_account_b, + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +/// Helper: do an A->B swap of `input_amount` on the standard setup. +fn swap_a_to_b(ts: &mut TestSetup, input_amount: u64) { + let swap_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: true, + input_amount, + min_output_amount: 1, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); +} + +#[test] +fn test_claim_admin_fees() { + let mut ts = full_setup(); + // fee = 500 bps (5%), admin_share_bps = 1667 (~1/6). + // Per the swap: fee_amount = input * 500 / 10_000 = input * 5 / 100 + // admin_portion = fee_amount * 1667 / 10_000 + // Swap input is on the A side, so admin's claim accumulates in mint A. + let swap_in = 1_000_000u64; + deposit_and_swap_a_to_b(&mut ts, 4_000_000, 1_000_000, swap_in); + + let fee_amount = swap_in * 500 / 10_000; + let expected_admin_a = fee_amount * 1667 / 10_000; + assert!(expected_admin_a > 0, "expected admin portion > 0"); + + // ---- Phase 1: first claim transfers the accumulated A-side fees ---- + let admin_balance_a_before = + get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let admin_balance_b_before = + get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + let claim_ix_first = claim_admin_fees_ix(&ts); + send_transaction_from_instructions( + &mut ts.svm, + vec![claim_ix_first], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + let admin_balance_a_after = + get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let admin_balance_b_after = + get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + assert_eq!( + admin_balance_a_after - admin_balance_a_before, + expected_admin_a, + "admin should receive the accumulated A-side fee" + ); + // No swap on the B side, so no B-side fees were owed. + assert_eq!( + admin_balance_b_after, admin_balance_b_before, + "admin should receive zero B-side fees (no B-input swaps happened)" + ); + + // ---- Phase 2: swap more, claim again, verify the new fee is paid ---- + // This proves the accumulators were truly reset (not just zeroed in + // memory): a fresh swap accrues new fees from a clean baseline, and the + // next claim transfers exactly that new amount. + let swap_in_2 = 500_000u64; + swap_a_to_b(&mut ts, swap_in_2); + let fee_amount_2 = swap_in_2 * 500 / 10_000; + let expected_admin_a_2 = fee_amount_2 * 1667 / 10_000; + assert!(expected_admin_a_2 > 0, "expected second admin portion > 0"); + + let balance_a_pre_claim_2 = + get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + + // Bump the blockhash so this claim-ix tx isn't byte-identical to the + // earlier one (same accounts + same payload → same signature → + // `AlreadyProcessed` in litesvm). + ts.svm.expire_blockhash(); + let claim_ix_second = claim_admin_fees_ix(&ts); + send_transaction_from_instructions( + &mut ts.svm, + vec![claim_ix_second], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + let balance_a_post_claim_2 = + get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + assert_eq!( + balance_a_post_claim_2 - balance_a_pre_claim_2, + expected_admin_a_2, + "second claim should transfer only the fees from the second swap" + ); + + // ---- Phase 3: third claim with zero owed reverts with NothingToClaim ---- + // Bump the blockhash so this tx isn't byte-identical to the previous + // claim - otherwise litesvm short-circuits with `AlreadyProcessed` + // before the program even runs and we'd never see our error. + ts.svm.expire_blockhash(); + let claim_ix_again = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::ClaimAdminFees {}.data(), + swap_example::accounts::ClaimAdminFeesAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + admin: ts.admin.pubkey(), + admin_token_a: ts.holder_account_a, + admin_token_b: ts.holder_account_b, + token_program: token_program_id(), + } + .to_account_metas(None), + ); + let balance_a_before_third_claim = + get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let result = send_transaction_from_instructions( + &mut ts.svm, + vec![claim_ix_again], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ); + assert!( + result.is_err(), + "claim with both accumulators at zero must revert" + ); + let err_msg = format!("{:?}", result.unwrap_err()); + assert!( + err_msg.contains("NothingToClaim") || err_msg.contains("0x1777") || err_msg.contains("6007"), + "expected NothingToClaim error, got: {err_msg}" + ); + + // Balance unchanged - the revert rolled back any partial state. + let balance_a_after_third_claim = + get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + assert_eq!( + balance_a_after_third_claim, balance_a_before_third_claim, + "failed claim must not move tokens" + ); +} + +#[test] +fn test_claim_admin_fees_rejects_non_admin() { + let mut ts = full_setup(); + // Need at least one swap so the program has a reason to reach the claim + // handler (not strictly required, but matches the realistic flow). + deposit_and_swap_a_to_b(&mut ts, 4_000_000, 1_000_000, 1_000_000); + + // Create a non-admin actor with their own ATAs and try to claim. + let attacker = create_wallet(&mut ts.svm, 100_000_000_000).unwrap(); + let attacker_token_a = + create_associated_token_account(&mut ts.svm, &attacker.pubkey(), &ts.mint_a, &ts.payer) + .unwrap(); + let attacker_token_b = + create_associated_token_account(&mut ts.svm, &attacker.pubkey(), &ts.mint_b, &ts.payer) + .unwrap(); + + let claim_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::ClaimAdminFees {}.data(), + swap_example::accounts::ClaimAdminFeesAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + admin: attacker.pubkey(), + admin_token_a: attacker_token_a, + admin_token_b: attacker_token_b, + token_program: token_program_id(), + } + .to_account_metas(None), + ); + + // Should fail because the signer (attacker) does not match Config.admin + // (enforced by Anchor's `has_one = admin` constraint). + let result = send_transaction_from_instructions( + &mut ts.svm, + vec![claim_ix], + &[&ts.payer, &attacker], + &ts.payer.pubkey(), + ); + assert!( + result.is_err(), + "claim_admin_fees by a non-admin signer must fail" + ); +} + +/// Helper: issue a `deposit_liquidity` ix with the given amounts. Lets a test +/// fund the pool to any state without copy-pasting the full account list. +fn deposit_ix(ts: &TestSetup, amount_a: u64, amount_b: u64) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a, + amount_b, + // 0 = no slippage floor; slippage-specific tests build their + // own ix with a non-zero floor. + minimum_lp_tokens_out: 0, + } + .data(), + swap_example::accounts::DepositLiquidityAccountConstraints { + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// Wrap `send_transaction_from_instructions` so tests can call `?` / +/// `.expect()` on a deposit without re-stating the boilerplate. We don't +/// care about the success payload (`Ok` only signals "tx landed"), and the +/// concrete error type is `solana_kite::SolanaKiteError`. Returning a +/// `Result<(), String>` keeps tests insulated from the kite crate's error +/// type - they just need success/failure plus a message for `.expect()`. +fn send_deposit(ts: &mut TestSetup, amount_a: u64, amount_b: u64) -> Result<(), String> { + let ix = deposit_ix(ts, amount_a, amount_b); + send_transaction_from_instructions( + &mut ts.svm, + vec![ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .map(|_| ()) + .map_err(|e| format!("{e:?}")) +} + +/// Test A: deposit into an already-funded pool at the *exact* current ratio +/// succeeds and both sides are pulled in full. Verifies the clamp leaves +/// matching amounts unchanged and that LP tokens are minted. +#[test] +fn test_deposit_into_funded_pool_at_correct_ratio() { + let mut ts = full_setup(); + + // Seed the pool at a 4:1 ratio. This hits the pool-creation branch, which + // is unchanged by the fix. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("initial deposit"); + + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let lp_before = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + + // Second deposit at the same 4:1 ratio. Neither side should be clamped. + send_deposit(&mut ts, 8_000_000, 2_000_000).expect("ratio-matched deposit"); + + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let lp_after = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + + assert_eq!( + pool_a_after - pool_a_before, + 8_000_000, + "pool_a should grow by the full requested amount_a" + ); + assert_eq!( + pool_b_after - pool_b_before, + 2_000_000, + "pool_b should grow by the full requested amount_b" + ); + assert!(lp_after > lp_before, "LP tokens should be minted to depositor"); +} + +/// Test B: depositor offers more token B than the ratio needs. `amount_b` +/// should be clamped down; `amount_a` should be used in full. +#[test] +fn test_deposit_clamps_excess_amount_b() { + let mut ts = full_setup(); + + // Seed at 4:1. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("initial deposit"); + + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let holder_a_before = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_before = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + // Caller wants 8M A : 3M B, but at 4:1 only 2M B is needed for 8M A. + // amount_b should clamp from 3M → 2M. + send_deposit(&mut ts, 8_000_000, 3_000_000).expect("excess-b deposit"); + + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let holder_a_after = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_after = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + assert_eq!( + pool_a_after - pool_a_before, + 8_000_000, + "amount_a should be used in full" + ); + assert_eq!( + pool_b_after - pool_b_before, + 2_000_000, + "amount_b should clamp down to 2M (the ratio-matched amount)" + ); + // Cross-check via the depositor's balance: only the clamped amount left + // their wallet. + assert_eq!(holder_a_before - holder_a_after, 8_000_000); + assert_eq!(holder_b_before - holder_b_after, 2_000_000); +} + +/// Test C: depositor offers more token A than the ratio can absorb. `amount_a` +/// should be clamped down; `amount_b` should be used in full. +#[test] +fn test_deposit_clamps_excess_amount_a() { + let mut ts = full_setup(); + + // Seed at 4:1. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("initial deposit"); + + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + + // Caller wants 12M A : 2M B, but at 4:1 only 8M A is needed for 2M B. + // amount_a should clamp from 12M → 8M. + send_deposit(&mut ts, 12_000_000, 2_000_000).expect("excess-a deposit"); + + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + + assert_eq!( + pool_a_after - pool_a_before, + 8_000_000, + "amount_a should clamp down to 8M (the ratio-matched amount)" + ); + assert_eq!( + pool_b_after - pool_b_before, + 2_000_000, + "amount_b should be used in full" + ); +} + +/// Test D: end-to-end. A swap shifts the pool away from its seeded ratio; a +/// subsequent deposit must use the *new, shifted* effective ratio (not the +/// raw vault ratio, which includes admin fees). Proves the +/// effective-reserves subtraction works under real swap fees. +#[test] +fn test_deposit_after_swap_uses_shifted_effective_ratio() { + let mut ts = full_setup(); + + // Seed at 100:100 (1:1) so the post-swap ratio is dramatic and easy to + // sanity-check. + send_deposit(&mut ts, 10_000_000, 10_000_000).expect("initial deposit"); + + // Swap 1M of A in. With fee = 500 bps and admin_share = 1667 bps: + // fee_amount = 50_000 + // admin_portion = 50_000 * 1667 / 10_000 = 8_335 (accrues on side A) + // taxed_input = 950_000 + // Effective reserves pre-swap: (10M, 10M). Output b = 950_000 * 10M / + // (10M + 950_000) ≈ 867_579 (u128 integer division, exact value + // depends on the floor). + // Post-swap raw vault: pool_a ≈ 11M, pool_b ≈ 9.13M. + // Effective (LP) reserves: pool_a - 8_335, pool_b unchanged. + let swap_in = 1_000_000u64; + let swap_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: true, + input_amount: swap_in, + min_output_amount: 1, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("swap a→b"); + + let pool_a_after_swap = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after_swap = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let admin_owed_a: u64 = { + let account = ts.svm.get_account(&ts.pool_config_key).unwrap(); + // PoolConfig layout: 8-byte anchor discriminator, then Pubkey config + // (32), Pubkey mint_a (32), Pubkey mint_b (32), u64 + // admin_fees_owed_a (8), u64 admin_fees_owed_b (8), u8 bump. + let start = 8 + 32 * 3; + u64::from_le_bytes(account.data[start..start + 8].try_into().unwrap()) + }; + assert!(admin_owed_a > 0, "swap should have accrued admin fees on A"); + let effective_pool_a = pool_a_after_swap - admin_owed_a; + let effective_pool_b = pool_b_after_swap; + // Sanity: pool moved meaningfully off 1:1. + assert!( + effective_pool_a > effective_pool_b, + "after A→B swap, effective A side should be larger" + ); + + // Now deposit using the *effective* ratio. We'll deposit at exactly that + // ratio so both sides should be pulled in full. Pick a base of 1M on the + // B side and compute the matching A side from effective reserves. + let deposit_b = 1_000_000u64; + let deposit_a = ((deposit_b as u128) * (effective_pool_a as u128) + / (effective_pool_b as u128)) as u64; + + let holder_a_before = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_before = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + // Give the depositor a small headroom on A so the clamp logic has the + // option to consume the full deposit_a. (We expect deposit_a to be fully + // used because it matches the effective ratio.) + send_deposit(&mut ts, deposit_a + 10, deposit_b).expect("post-swap deposit"); + + let holder_a_after = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_after = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + // The contract should have pulled exactly deposit_a (or deposit_a ± 1 + // base unit because of integer division rounding) and the full deposit_b. + let used_a = holder_a_before - holder_a_after; + let used_b = holder_b_before - holder_b_after; + assert_eq!(used_b, deposit_b, "amount_b should be fully used"); + // used_a must be close to deposit_a - never the unbounded raw value + // (deposit_a + 10). If the bug were still here we'd see something + // wildly off (or a transaction failure on transfer_checked). + assert!( + used_a <= deposit_a + 1 && used_a + 1 >= deposit_a, + "used_a {} should clamp to ~deposit_a {} (±1 for integer division)", + used_a, + deposit_a + ); +} + +/// Test E: a deposit so small that one clamped side rounds to zero must +/// revert with `DepositAmountTooSmall` rather than mint LP tokens against a +/// zero contribution. +#[test] +fn test_deposit_too_small_for_ratio_reverts() { + let mut ts = full_setup(); + + // Seed at 4M:1M (A is "cheaper" - 4 A per 1 B). To force amount_b to + // round down to zero, the depositor must offer < 4 base units of A + // (so amount_b_required = amount_a * 1M / 4M = 0). We offer 1 base unit + // of A and a large amount_b. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("initial deposit"); + + let result = send_deposit(&mut ts, 1, 1_000_000); + assert!( + result.is_err(), + "sub-ratio deposit should revert (clamped amount rounds to zero)" + ); +} + +/// Test F: LP-mint correctness for a subsequent deposit at the current ratio. +/// With the Uniswap V2 formula `min(a*supply/pool_a, b*supply/pool_b)`, an +/// equal-ratio deposit must mint LP tokens exactly proportional to its share +/// of the pool. Previously the program used `sqrt(a*b)` for *all* deposits, +/// which over- or under-minted depending on pool size and broke +/// proportionality. +#[test] +fn test_lp_mint_proportional_to_share_of_pool() { + let mut ts = full_setup(); + + // Initial deposit: 4M : 1M. sqrt(4M * 1M) = 2_000_000. Minus + // MINIMUM_LIQUIDITY (100) → depositor LP balance = 1_999_900, which is + // also the total LP supply (we don't mint the locked floor anywhere). + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("initial deposit"); + + let lp_supply_initial = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + let expected_initial: u64 = 2_000_000 - 100; + assert_eq!( + lp_supply_initial, expected_initial, + "initial LP supply should equal sqrt(a*b) - MINIMUM_LIQUIDITY" + ); + + // Second deposit at the same 4:1 ratio doubles the pool. The proportional + // formula must mint exactly `lp_supply_initial` more LP (so the depositor + // doubles their stake). + let lp_before_second = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + // Same depositor + same args as the first deposit → identical tx + // signature. Bump the blockhash so litesvm doesn't reject the second + // tx as `AlreadyProcessed`. + ts.svm.expire_blockhash(); + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("second deposit"); + let lp_after_second = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + + let minted_on_second = lp_after_second - lp_before_second; + // min(4M * 1_999_900 / 4M, 1M * 1_999_900 / 1M) = 1_999_900. + let expected_second: u64 = 1_999_900; + assert_eq!( + minted_on_second, expected_second, + "second deposit (same ratio, same size) should mint the same LP \ + amount as the initial deposit minus the locked floor" + ); +} + +/// Test G: LP-mint correctness after a swap has shifted the pool ratio. The +/// effective reserves differ from the seeded ratio; LP minting must use +/// the post-swap effective reserves (vault balance minus admin fees) to +/// keep shares honest. +#[test] +fn test_lp_mint_after_swap_uses_effective_reserves() { + let mut ts = full_setup(); + + // Seed 10M : 10M, then swap A→B so the pool shifts off 1:1. + send_deposit(&mut ts, 10_000_000, 10_000_000).expect("initial deposit"); + let lp_after_initial = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + let total_supply_before_second = lp_after_initial; + + let swap_in = 1_000_000u64; + swap_a_to_b(&mut ts, swap_in); + + // Read post-swap effective reserves directly from onchain state. + let pool_a_after_swap = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after_swap = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let admin_owed_a: u64 = { + let account = ts.svm.get_account(&ts.pool_config_key).unwrap(); + let start = 8 + 32 * 3; + u64::from_le_bytes(account.data[start..start + 8].try_into().unwrap()) + }; + let effective_pool_a = pool_a_after_swap - admin_owed_a; + let effective_pool_b = pool_b_after_swap; + + // Deposit at exactly the effective ratio. Pick deposit_b, derive deposit_a. + let deposit_b: u64 = 1_000_000; + let deposit_a = ((deposit_b as u128) * (effective_pool_a as u128) + / (effective_pool_b as u128)) as u64; + + // Expected LP minted = min(a*supply/pool_a, b*supply/pool_b) using the + // *clamped* (a, b) the program actually transfers. After clamp at the + // exact ratio, the binding side is whichever clamp picks: in + // deposit_liquidity, `amount_b_required = amount_a * pool_b / pool_a`. + // We pass `deposit_a` exactly, so amount_b_required = deposit_a * pool_b + // / pool_a, which rounds down to ≤ deposit_b. The program then uses + // (deposit_a, amount_b_required). Compute the expected LP from that. + let amount_b_used = ((deposit_a as u128) * (effective_pool_b as u128) + / (effective_pool_a as u128)) as u64; + let expected_liquidity_from_a = (deposit_a as u128) * (total_supply_before_second as u128) + / (effective_pool_a as u128); + let expected_liquidity_from_b = (amount_b_used as u128) * (total_supply_before_second as u128) + / (effective_pool_b as u128); + let expected_liquidity = expected_liquidity_from_a.min(expected_liquidity_from_b) as u64; + + let lp_before = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + send_deposit(&mut ts, deposit_a, deposit_b).expect("post-swap deposit"); + let lp_after = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + + let minted = lp_after - lp_before; + assert_eq!( + minted, expected_liquidity, + "LP minted on post-swap deposit must match share-of-effective-pool math" + ); +} + +// --------------------------------------------------------------------------- +// Slippage protection + invariant tests +// --------------------------------------------------------------------------- + +/// Helper: build a `swap_tokens` ix with a custom `min_output_amount`. +fn swap_a_to_b_ix(ts: &TestSetup, input_amount: u64, min_output_amount: u64) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: true, + input_amount, + min_output_amount, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// Helper: build a `deposit_liquidity` ix with a custom `minimum_lp_tokens_out`. +fn deposit_ix_with_min_lp( + ts: &TestSetup, + amount_a: u64, + amount_b: u64, + minimum_lp_tokens_out: u64, +) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a, + amount_b, + minimum_lp_tokens_out, + } + .data(), + swap_example::accounts::DepositLiquidityAccountConstraints { + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// Helper: build a `withdraw_liquidity` ix with custom slippage floors. +fn withdraw_ix_with_min( + ts: &TestSetup, + amount: u64, + minimum_token_a_out: u64, + minimum_token_b_out: u64, +) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::WithdrawLiquidity { + amount, + minimum_token_a_out, + minimum_token_b_out, + } + .data(), + swap_example::accounts::WithdrawLiquidityAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + withdrawer: ts.admin.pubkey(), + liquidity_provider_mint: ts.liquidity_provider_mint, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + liquidity_provider_token: ts.liquidity_account, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// Slippage test: a swap with `min_output_amount` strictly higher than the +/// achievable output must revert with `SlippageExceeded` rather than fill +/// at a worse rate. +#[test] +fn test_swap_reverts_when_output_below_min() { + let mut ts = full_setup(); + // Seed a 4:1 pool so 1M of A out gives ~237k of B after a 5% fee. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + // First: prove the swap *would* succeed with a permissive floor. + let baseline_ix = swap_a_to_b_ix(&ts, 1_000_000, 1); + let before_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + send_transaction_from_instructions( + &mut ts.svm, + vec![baseline_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("baseline swap should succeed"); + let after_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + let actual_output = after_b - before_b; + assert!(actual_output > 0, "baseline swap should produce some B"); + + // Reset and try the same swap with `min_output_amount = actual + 1`. It + // must revert because the pool can't beat the previous output (in fact + // it can't even match it - the first swap shifted the ratio). + let mut ts = full_setup(); + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + let too_high = actual_output + 1; + let strict_ix = swap_a_to_b_ix(&ts, 1_000_000, too_high); + let result = send_transaction_from_instructions( + &mut ts.svm, + vec![strict_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ); + let err = format!("{:?}", result.expect_err("must revert")); + assert!( + err.contains("SlippageExceeded"), + "expected SlippageExceeded, got: {err}" + ); +} + +/// Slippage test: a deposit with `minimum_lp_tokens_out` strictly higher +/// than the achievable LP mint amount must revert with +/// `DepositBelowMinimum`. +#[test] +fn test_deposit_reverts_when_lp_below_min() { + let mut ts = full_setup(); + // Seed pool so the second deposit goes through the proportional branch. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + // Compute the LP that a `(4M, 1M)` deposit at the current ratio would + // mint, using the same formula as the program (no probe tx needed): + // liquidity = min(a*supply/pool_a, b*supply/pool_b) + // Effective reserves == raw reserves here because no swaps have happened. + let lp_supply = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + let pool_a_amount = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_amount = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let lp_from_a = (4_000_000u128 * lp_supply as u128) / pool_a_amount as u128; + let lp_from_b = (1_000_000u128 * lp_supply as u128) / pool_b_amount as u128; + let achievable_lp = lp_from_a.min(lp_from_b) as u64; + + // Require *strictly more* than that - the deposit must revert. + let strict_ix = + deposit_ix_with_min_lp(&ts, 4_000_000, 1_000_000, achievable_lp + 1); + let result = send_transaction_from_instructions( + &mut ts.svm, + vec![strict_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ); + let err = format!("{:?}", result.expect_err("must revert")); + assert!( + err.contains("DepositBelowMinimum"), + "expected DepositBelowMinimum, got: {err}" + ); + + // Sanity: the same deposit with `achievable_lp` as the floor succeeds. + let ok_ix = deposit_ix_with_min_lp(&ts, 4_000_000, 1_000_000, achievable_lp); + send_transaction_from_instructions( + &mut ts.svm, + vec![ok_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("deposit at exact LP floor should succeed"); +} + +/// Slippage test: a withdrawal with `minimum_token_a_out` or +/// `minimum_token_b_out` strictly higher than the achievable output must +/// revert with `WithdrawalBelowMinimum`. +#[test] +fn test_withdraw_reverts_when_below_min() { + let mut ts = full_setup(); + send_deposit(&mut ts, 4_000_000, 4_000_000).expect("seed"); + let lp = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + + // Burning half the LP at a 4M:4M pool returns ~2M of each side, but the + // exact amount is `lp/2 * 4_000_000 / (lp_supply + MINIMUM_LIQUIDITY)`. + // Demand 4M of A out of a half-burn - clearly impossible, must revert. + let strict_ix = withdraw_ix_with_min(&ts, lp / 2, 4_000_000, 0); + let result = send_transaction_from_instructions( + &mut ts.svm, + vec![strict_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ); + let err = format!("{:?}", result.expect_err("must revert (A side)")); + assert!( + err.contains("WithdrawalBelowMinimum"), + "expected WithdrawalBelowMinimum (A side), got: {err}" + ); + + // Same on the B side. + let strict_ix_b = withdraw_ix_with_min(&ts, lp / 2, 0, 4_000_000); + let result_b = send_transaction_from_instructions( + &mut ts.svm, + vec![strict_ix_b], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ); + let err_b = format!("{:?}", result_b.expect_err("must revert (B side)")); + assert!( + err_b.contains("WithdrawalBelowMinimum"), + "expected WithdrawalBelowMinimum (B side), got: {err_b}" + ); +} + +/// Slippage test: passing `min_output_amount = 0` is the explicit +/// "I accept any non-zero output" signal - this is the documented escape +/// hatch and must still succeed. +#[test] +fn test_swap_with_zero_min_output_still_succeeds() { + let mut ts = full_setup(); + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + let before_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + let ix = swap_a_to_b_ix(&ts, 1_000_000, 0); + send_transaction_from_instructions( + &mut ts.svm, + vec![ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("swap with min_output_amount=0 must succeed"); + let after_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + assert!(after_b > before_b, "B balance should increase"); +} + +/// Helper: build a `swap_tokens` ix that trades token B in for token A. +fn swap_b_to_a_ix(ts: &TestSetup, input_amount: u64, min_output_amount: u64) -> Instruction { + Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapTokens { + input_is_token_a: false, + input_amount, + min_output_amount, + } + .data(), + swap_example::accounts::SwapTokensAccountConstraints { + config: ts.config_key, + pool_config: ts.pool_config_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_a: ts.pool_a, + pool_b: ts.pool_b, + token_a: ts.holder_account_a, + token_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ) +} + +/// B→A regression test: the trader must pay the pool exactly `input_amount` +/// of token B, not some other quantity. This pins the trader-to-pool transfer +/// amount in the `input_is_token_a = false` branch, which once shipped a +/// wrong-variable bug (it transferred `output` of token B instead of +/// `input_amount`, so the trader underpaid for every B→A swap). +#[test] +fn test_swap_b_to_a_trader_pays_full_input() { + let mut ts = full_setup(); + // Seed at 4:1 so the B side is the scarce asset and a B→A swap returns a + // multiple of its input in A. + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + let holder_a_before = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_before = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + + let input_amount = 100_000u64; + let swap_ix = swap_b_to_a_ix(&ts, input_amount, 1); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("B→A swap should succeed"); + + let holder_a_after = get_token_account_balance(&ts.svm, &ts.holder_account_a).unwrap(); + let holder_b_after = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + + // The trader pays exactly input_amount of B... + assert_eq!( + holder_b_before - holder_b_after, + input_amount, + "trader must pay the pool the full input_amount of token B" + ); + assert_eq!( + pool_b_after - pool_b_before, + input_amount, + "pool must receive the full input_amount of token B" + ); + + // ...and receives a positive amount of A, conserved against the pool. + let output = holder_a_after - holder_a_before; + assert!(output > 0, "trader should receive token A"); + assert_eq!( + pool_a_before - pool_a_after, + output, + "token A out of the pool must equal token A received by the trader" + ); +} + +/// B→A invariant test: after a fee-paying B→A swap, the effective +/// (LP-claimable) `k = x * y` must not decrease. Run alongside the A→B +/// variant so both directions of the symmetric flow are exercised. +#[test] +fn test_invariant_holds_after_b_to_a_swap() { + let mut ts = full_setup(); + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + let k_before = (pool_a_before as u128) * (pool_b_before as u128); + + let swap_ix = swap_b_to_a_ix(&ts, 100_000, 1); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .expect("B→A swap should succeed"); + + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + // The swap input was on the B side, so the admin fee accrued on B. + // PoolConfig layout: 8 (discriminator) + 32*3 (config, mint_a, mint_b) + // + 8 (admin_fees_owed_a) → admin_fees_owed_b starts at byte 112. + let admin_owed_b: u64 = { + let account = ts.svm.get_account(&ts.pool_config_key).unwrap(); + let start = 8 + 32 * 3 + 8; + u64::from_le_bytes(account.data[start..start + 8].try_into().unwrap()) + }; + let effective_a_after = pool_a_after; + let effective_b_after = pool_b_after - admin_owed_b; + let k_after = (effective_a_after as u128) * (effective_b_after as u128); + + assert!( + k_after >= k_before, + "effective invariant must not decrease across a B→A swap: \ + before={k_before}, after={k_after}" + ); +} + +/// Invariant-check test: a normal swap leaves the effective `k = x * y` +/// at least as high as before (LP fee adds to LP-claimable reserves; admin +/// slice is excluded). This is the runtime guard that catches "the math +/// gave away too much" bugs - verify the happy path doesn't trip it. +#[test] +fn test_invariant_holds_after_normal_swap() { + let mut ts = full_setup(); + send_deposit(&mut ts, 4_000_000, 1_000_000).expect("seed"); + + // Read effective reserves before. + let pool_a_before = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_before = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + // No swaps yet → admin_fees_owed_* = 0, so effective == raw. + let k_before = (pool_a_before as u128) * (pool_b_before as u128); + + // Do an A→B swap and verify it succeeds. + swap_a_to_b(&mut ts, 1_000_000); + + // Compute effective reserves after. We need to subtract admin_fees_owed_a + // (the swap was input_is_token_a = true, so the admin fee accrued on A). + let pool_a_after = get_token_account_balance(&ts.svm, &ts.pool_a).unwrap(); + let pool_b_after = get_token_account_balance(&ts.svm, &ts.pool_b).unwrap(); + // PoolConfig layout: 8 (discriminator) + 32*3 (config, mint_a, mint_b) → + // admin_fees_owed_a starts at byte 104. + let admin_owed_a: u64 = { + let account = ts.svm.get_account(&ts.pool_config_key).unwrap(); + let start = 8 + 32 * 3; + u64::from_le_bytes(account.data[start..start + 8].try_into().unwrap()) + }; + let effective_a_after = pool_a_after - admin_owed_a; + let effective_b_after = pool_b_after; + let k_after = (effective_a_after as u128) * (effective_b_after as u128); + + assert!( + k_after >= k_before, + "effective invariant must not decrease across a fee-paying swap: \ + before={k_before}, after={k_after}" + ); +} diff --git a/finance/token-swap/anchor/README.md b/finance/token-swap/anchor/README.md index c06fd0289..11894f5a5 100644 --- a/finance/token-swap/anchor/README.md +++ b/finance/token-swap/anchor/README.md @@ -1,5 +1,11 @@ # Solana Token Swap AMM (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + A constant-product AMM (automated market maker) on Solana: create pools, deposit liquidity, swap with slippage guards, and withdraw. This is the exchange design behind Solana venues like Raydium and Orca. See also: [Token Swap overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/finance/vault-strategy/anchor-v1/.gitignore b/finance/vault-strategy/anchor-v1/.gitignore new file mode 100644 index 000000000..58b27306d --- /dev/null +++ b/finance/vault-strategy/anchor-v1/.gitignore @@ -0,0 +1,6 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger diff --git a/finance/vault-strategy/anchor-v1/Anchor.toml b/finance/vault-strategy/anchor-v1/Anchor.toml new file mode 100644 index 000000000..f13e05b84 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/Anchor.toml @@ -0,0 +1,19 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +vault_strategy = "VLT5W7bqhRN4nCdRpXm8UfHRxZd9EuZGqiSAkGHQfGh" +mock_swap_router = "SWPR8Rk3aq3DrDGLdaANq7xCMnXoUFUJWJJmCWxc8Jm" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/finance/vault-strategy/anchor-v1/CHANGELOG.md b/finance/vault-strategy/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..182761d0d --- /dev/null +++ b/finance/vault-strategy/anchor-v1/CHANGELOG.md @@ -0,0 +1,27 @@ +# Changelog + +## 2026-07-20 + +- **`WhitelistEntry` renamed `ApprovedAsset`** (and `whitelist_asset` renamed `approve_asset`, PDA seed `"whitelist"` renamed `"approved_asset"`), naming the account after what it is: one curator-approved asset bound to its official price feed. The unused `AssetNotWhitelisted` error is removed; approval is checked by the `ApprovedAsset` account's existence. Doc comments and README now state that the `Registry` account is the curator record at the root of the approved set, not the list itself. + +## 2026-07-01 + +### Added + +- **Curated asset registry.** A `Registry` plus per-mint `WhitelistEntry` accounts, maintained by a protocol authority separate from strategy managers. Each entry binds an approved mint to its official Pyth price feed. New instructions: `initialize_registry`, `whitelist_asset`. +- **Dynamic assets.** A strategy now grows its portfolio with `add_asset`, which registers a whitelisted mint at the next index as an `AssetConfig` PDA (`["asset", strategy, index]`) and creates its vault. Assets occupy the contiguous range `0..asset_count`, up to `MAX_ASSETS` (16). Replaces the previous fixed two-asset layout. +- **Oracle-bounded slippage.** `deposit` and `rebalance` compute each swap's minimum output from the Pyth price and a strategy-level `max_slippage_bps` (capped at `MAX_SLIPPAGE_BPS` = 10%), instead of trusting a caller-supplied minimum. Set at creation via `initialize_strategy`. +- **Full-allocation invariant with immediate deployment.** A strategy accepts deposits only once its weights sum to exactly 10,000 bps (`deposit` reverts with `StrategyNotFullyAllocated` otherwise). `deposit` then swaps each depositor's USDC into the basket at its target weights through the registered router in the same transaction, so every deposit is fully invested (bar sub-cent rounding dust) and the USDC vault holds no idle cash. +- **Retirable assets.** `set_weight(weight_bps)` changes an asset's target weight after creation, including setting it to zero to retire it (reassign that weight to another asset to reach 100% and reopen deposits; `rebalance` liquidates the retired holdings). The asset's index is preserved, so the `0..asset_count` range the valuation handlers depend on stays contiguous. + +### Changed + +- `initialize_strategy` now takes `(index, fee_bps, max_slippage_bps, swap_router)` and binds the strategy to a registry; the strategy PDA is seeded by a caller-chosen index (`["strategy", index]`) rather than the manager's key, with the manager kept as a stored field. Weights and price feeds move to `add_asset`. +- `deposit` takes each asset's `[asset_config, vault, mint, rate, price_feed]` plus the router accounts, validates the complete `0..asset_count` set for NAV, requires the strategy to be fully allocated, and deploys the deposit at the target weights. +- `withdraw` takes each asset's `[asset_config, vault, mint, user_token_account]` and pays out every asset in kind over the complete `0..asset_count` set. +- `rebalance` takes `(sell_amount, usdc_to_invest)`; per-call minimums are gone. + +### Fixed + +- Boxed the `mock-swap-router` swap account structs, which overflowed the 4096-byte SBF stack frame under current platform-tools. +- Documented the per-manifest build (the workspace build strips the router entrypoint via feature unification). diff --git a/finance/vault-strategy/anchor-v1/Cargo.toml b/finance/vault-strategy/anchor-v1/Cargo.toml new file mode 100644 index 000000000..14a951cee --- /dev/null +++ b/finance/vault-strategy/anchor-v1/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/finance/vault-strategy/anchor-v1/PRODUCT.md b/finance/vault-strategy/anchor-v1/PRODUCT.md new file mode 100644 index 000000000..0c508e905 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/PRODUCT.md @@ -0,0 +1,76 @@ +# Product + + + +## Platform + +web + +## Users + +The frontend serves two roles first; a third exists in the program and is secondary for now. + +- **Depositor (primary):** a retail user who deposits USDC into a manager-run strategy, receives shares representing proportional ownership of the whole basket, watches their position's value track the portfolio, and withdraws their slice in kind when they choose. Highest-volume, lowest-expertise surface. +- **Manager (primary):** a power user who creates and operates a strategy — registers curator-approved assets, sets target weights, rebalances as prices drift, and collects the management fee. An operations surface where correctness and confirmation matter more than reach. +- **Curator (secondary, not yet in scope):** governs the approved-asset registry that bounds what managers may hold. Low-frequency, high-trust. Recorded so future work does not treat the manager as the only privileged role. + +## Product Purpose + +An **educational demo dApp** shipped alongside the `vault-strategy` Solana program (part of a public Solana examples collection). Its job is to make the program's mechanics legible and touchable — show, through a real interface, how deposits are priced by NAV, how shares represent ownership, how managers configure weights and rebalance, and how in-kind withdrawal works. Success is a visitor understanding and exercising the full deposit → hold → withdraw and configure → allocate → rebalance loops against the deployed program. It teaches by letting people operate it, not by describing it. + +## Positioning + +A **multi-asset** strategy built from single-asset vaults, transparently priced on-chain. Unlike an ERC-4626-style single-asset vault, one "strategy" owns one vault per asset plus a USDC vault, and every deposit is deployed across the basket at its target weights in the same transaction — there is no idle-cash mode. Deposit pricing, slippage floors, and fees are all derived on-chain from the Pyth oracle and the strategy's own parameters rather than trusted from a caller, which is the truth the interface must make visible: the numbers a user sees are the numbers the program enforces. + +## Operating Context + +- Solana wallet–connected web app; users sign transactions in-wallet. +- Runs against the deployed program on **devnet with mock tokens** for the demo. Portfolio assets in the example are **TSLAx** (Tesla) and **NVDAx** (NVIDIA) — xStocks issued on Solana by Backed Finance; mock tokens in tests. +- Prices come from **Pyth Network** `PriceUpdateV2` accounts with a 60-second staleness window; the client must supply fresh price accounts for pricing operations. +- Swaps in the example route through a **test-only mock swap router** (a fake Jupiter) that would be replaced by real [Jupiter](https://jup.ag) in production. +- Baskets beyond ~3 assets exceed a legacy transaction's 1232-byte limit, so the client must send **v0 transactions with an Address Lookup Table**; `deposit` pulls `14 + 5N` accounts and `withdraw` `10 + 4N` for `N` assets. + +## Capabilities and Constraints + +Program instructions the frontend can surface: + +- **Registry / curator:** `initialize_registry`, `approve_asset` (whitelist of assets managers may use). +- **Manager:** `initialize_strategy`, `add_asset`, `set_weight` (including set-to-zero to retire an asset), `rebalance`, `collect_fees`. +- **Depositor:** `deposit` (USDC → minted shares), `withdraw` (burn shares → in-kind slice of every vault). + +Rules the UI must respect and reflect: + +- Deposits are accepted only when target weights sum to **exactly 10,000 bps**; a strategy is either still being configured or fully allocated and live (`StrategyNotFullyAllocated` otherwise). +- Shares: first deposit is 1:1 with USDC minor units; later deposits mint `deposit_usdc × total_shares / NAV`. Share mint is a PDA owned by the strategy PDA. +- Management fee is charged by minting new shares to the manager (dilution), fixed at creation, capped at `MAX_FEE_BPS` = 1,000 bps (10%), no setter to raise it. `collect_fees` is permissionless. +- Slippage floors are computed on-chain from the Pyth price and `max_slippage_bps` (capped at 1,000 bps); a manager-supplied minimum is not trusted. +- `MAX_ASSETS` = 16. `deposit` re-derives the full `0..asset_count` PDA range and refuses to run if any asset account is missing (`IncompleteAssetAccounts`), so NAV can't be understated. +- Withdrawal is **in-kind**: the user must already hold a token account for each asset; there is no built-in sell-to-cash. + +Two program ports exist in the repo — an **Anchor** implementation and a **Quasar** implementation of the same program. The frontend targets the same on-chain behavior regardless of port. + +## Brand Commitments + +Existing name: **Vault Strategy** (the on-chain construct is a "strategy" built from single-asset "vaults"; the README is deliberate about this distinction). No logo, palette, or visual identity is committed yet. Voice in existing docs is precise, plain, and educational — it defines terms and links canonical references rather than hyping. Future design should not contradict that register. + +## Evidence on Hand + +- `anchor/README.md` — thorough product and financial-concept documentation (NAV, shares, fees, weights, slippage, in-kind withdrawal, transaction-size limits). +- `VIDEO_SCRIPT.md` at the `vault-strategy` root — an existing narrative walkthrough of the product. +- `anchor/CHANGELOG.md`, `quasar/CHANGELOG.md` — history. +- Program source and tests under `anchor/programs/` and `quasar/`. +- No real users, testimonials, deployment addresses, or production metrics exist; the demo runs on devnet with mock tokens. Future work must not fabricate mainnet deployment claims, real AUM, or user counts. + +## Product Principles + +1. **The interface shows what the program enforces.** Every number a user sees (NAV, share price, slippage floor, fee) is derived on-chain; surface the real computed values, never a client-side approximation presented as truth. +2. **Teach by operating.** This is a demo whose purpose is comprehension — make each step of the deposit/withdraw and configure/rebalance loops legible as the user performs it. +3. **Respect the state machine.** A strategy is either being configured or live; deposits require exactly-10,000-bps allocation. The UI should make the current phase and what's required to advance it obvious rather than surfacing raw errors. +4. **Distinguish the roles.** Depositor and manager have different jobs, risks, and permissions; do not collapse them into one undifferentiated view. +5. **Devnet honesty.** Present the demo as a demo — mock tokens, devnet, a mock swap router — without dressing it as production. + +## Open Decisions + +- Whether this frontend ever targets **production/mainnet** with real funds is undecided; recorded here rather than assumed. +- Curator/registry-governance UI is out of first scope; not yet designed. +- Which program port (Anchor vs Quasar) the client library binds to is a later implementation decision. diff --git a/finance/vault-strategy/anchor-v1/README.md b/finance/vault-strategy/anchor-v1/README.md new file mode 100644 index 000000000..5487f503c --- /dev/null +++ b/finance/vault-strategy/anchor-v1/README.md @@ -0,0 +1,174 @@ +# Solana Vault Strategy (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +A manager-run investment vault on Solana. Users deposit [USDC](https://www.investopedia.com/terms/u/usd-coin-usdc.asp) and receive shares representing proportional ownership of a portfolio of assets. The manager adds assets a curator has approved and sets their target weights; each deposit is deployed across those assets at its weights in the same transaction. The manager rebalances as prices drift, earns a fee, and depositors withdraw their proportional slice in kind when they choose. + +The example uses two stocks as the portfolio assets: **TSLAx** (Tesla) and **NVDAx** (NVIDIA) - [xStocks](https://backed.fi/xstocks) issued on Solana by Backed Finance. In tests these are mock [tokens](https://solana.com/docs/terminology#token). + +A note on the word **vault**: by the common standard (ERC-4626) a vault holds a single asset. Here a vault is one single-asset [token account](https://solana.com/docs/terminology#token-account), and the whole multi-asset construct is the **strategy**, which owns one vault per asset plus a USDC vault. So "vault strategy" reads literally: a strategy built from vaults. + +--- + +## Programs + +- **`vault-strategy`**: Registry and approved assets, strategy creation, asset registration, deposits, share minting, fee accrual, rebalancing, withdrawals +- **`mock-swap-router`**: Test-only fake Jupiter. Stores exchange rates, mints/burns basket tokens for USDC. Replaced by real [Jupiter](https://jup.ag) in production. + +--- + +## Key Financial Concepts + +### Net Asset Value (NAV) + +[NAV](https://www.investopedia.com/terms/n/nav.asp) is the total value of everything the strategy holds: the USDC vault balance plus each asset vault balance valued at its Pyth price. It prices new deposits fairly, so every depositor pays the same per-share price regardless of when they join. + +Because the asset set is dynamic, `deposit` must value *every* asset. The assets live at PDAs indexed `0..asset_count`, and `deposit` re-derives that complete range from the accounts it is given, refusing to run if any asset is missing (`IncompleteAssetAccounts`). This makes it structurally impossible to omit an asset and understate NAV. + +Referencing every asset has a transaction-size cost: `deposit` pulls in `14 + 5N` accounts and `withdraw` `10 + 4N`, where `N` is the asset count. That stays within Solana's 128-account transaction lock limit at the `MAX_ASSETS` cap of 16 (94 accounts for `deposit`), but a basket beyond roughly three assets no longer fits a legacy transaction's 1232-byte limit, so the client must send a v0 transaction with an [Address Lookup Table](https://docs.anza.xyz/proposals/versioned-transactions). + +Prices come from [Pyth Network](https://pyth.network/) `PriceUpdateV2` accounts. A 60-second staleness window is enforced; zero or negative prices are rejected. + +### Shares + +A [share](https://www.investopedia.com/terms/s/shares.asp) represents a fraction of the whole strategy. Hold 1% of shares and you own 1% of every vault. + +- **First deposit**: shares are issued 1:1 with USDC minor units (initial price of 1 USDC per share). +- **Later deposits**: `shares_to_mint = deposit_usdc × total_shares / NAV`. +- Shares are [SPL tokens](https://solana.com/docs/terminology#token); the share mint's address is a [PDA](https://solana.com/docs/terminology#program-derived-address-pda), so it is deterministic and the strategy PDA is its mint authority. + +### Management Fee + +A [management fee](https://www.investopedia.com/terms/m/managementfee.asp), in [basis points](https://www.investopedia.com/terms/b/basispoint.asp) (100 bps = 1% per year), is charged by *minting new shares to the manager*, diluting holders proportionally. This is the common onchain pattern (Yearn, Lido charge fees this way) and differs from a traditional fund, which deducts the fee in cash from assets. + +``` +fee_shares = total_shares × fee_bps × elapsed_seconds / (10_000 × 31_536_000) +``` + +`collect_fees` is permissionless. The fee is fixed at creation and capped at `MAX_FEE_BPS` (1,000 bps = 10%); there is no setter to raise it later. + +### Weights and Rebalancing + +Each asset carries a target **weight** in basis points (e.g. 40% TSLAx, 60% NVDAx). A strategy accepts deposits only once its weights sum to exactly 10,000 (`add_asset` and `set_weight` keep the running sum at or below 10,000; `deposit` requires it to equal 10,000, else `StrategyNotFullyAllocated`). So a strategy is either still being configured or fully allocated and live, and `deposit` deploys each depositor's USDC straight into the basket at those weights, fully invested bar sub-cent rounding dust. There is no idle-cash mode. + +[Rebalancing](https://www.investopedia.com/terms/r/rebalancing.asp) handles the drift that prices create after a deposit: `rebalance` sells an over-weight asset for USDC and buys an under-weight one in a single atomic instruction. `set_weight` changes a target after creation, including setting it to zero to **retire** an asset: deposits stop allocating to it, the manager sells its holdings out with `rebalance`, and the now-empty vault keeps its index so the contiguous `0..asset_count` range stays intact (the index is never reused). + +### Slippage, bounded by the oracle + +[Slippage](https://www.investopedia.com/terms/s/slippage.asp) is the gap between the expected and the realized amount of a swap. Rather than trust a manager-supplied minimum, `deposit` and `rebalance` compute the floor themselves from the Pyth price and the strategy's `max_slippage_bps`: a swap whose output falls more than that tolerance below the oracle-implied amount reverts. `max_slippage_bps` is set at creation and capped at `MAX_SLIPPAGE_BPS` (1,000 bps = 10%). + +### In-Kind Withdrawal + +An [in-kind distribution](https://www.investopedia.com/terms/i/in-kind.asp) returns the underlying assets, not cash. `withdraw` burns shares and pays out a proportional slice of the USDC vault and every asset vault. The user must already hold a token account for each asset; you can sell those on a DEX yourself. + +--- + +## Program Flow + +### Participants + +- **Victor**, the registry authority: curates which assets, and which official Pyth feed, are safe to hold. A protocol role, not a manager. +- **Maria**, the strategy manager: earns a 1% annual fee running a basket she has a thesis on. +- **Alice**, the early depositor: wants diversified TSLAx and NVDAx exposure without managing positions. +- **Bob**, the later depositor: joins the same strategy after it has been running. + +`Maria` and `Victor` are stored as plain `Pubkey`s and may each be a [Squads](https://squads.so/) multisig; the program only checks the signature. + +### Victor creates the registry and approves assets + +`initialize_registry()` creates a `Registry` PDA (`["registry", victor]`) owned by Victor. The registry holds no list; it only names the curator. The approved set is the collection of `ApprovedAsset` accounts under it: `approve_asset(price_feed)` creates one `ApprovedAsset` PDA (`["approved_asset", registry, mint]`) per approved mint, binding it to its official Pyth feed, and an asset counts as approved exactly when that account exists. Only Victor can create them. This separation is the anti-fraud core: a manager can only ever add assets Victor approved, and the feed comes from the registry, so a manager cannot list a token they mint themselves or pair a real mint with a feed they control. + +### Maria initializes the strategy + +`initialize_strategy(index=0, fee_bps=100, max_slippage_bps=100, swap_router)` creates the `Strategy` PDA (`["strategy", 0]`), the share mint, and the USDC vault, binding the strategy to Victor's registry. The strategy is addressed by a caller-chosen index (`"strategy" + 0`, `"strategy" + 1`, …) rather than the manager's key. No assets yet. + +### Maria adds assets + +`add_asset(weight_bps)`, once per asset, creates an `AssetConfig` at `["asset", strategy, index]` (index = current `asset_count`), copies the official feed from the ApprovedAsset account, and creates that asset's vault. TSLAx at index 0 (4000 bps), NVDAx at index 1 (6000 bps). Rejected if the mint is not approved (its ApprovedAsset account does not exist), if the weights would exceed 10,000 bps, or once `MAX_ASSETS` (16) is reached. Deposits stay closed until the weights sum to exactly 10,000. + +### Alice deposits, and her money is deployed at once + +`deposit(usdc_amount, minimum_shares)`, with each asset's `[asset_config, vault, mint, rate, price_feed]` passed as remaining accounts, plus the router accounts. The handler requires the strategy to be fully allocated, values every asset for NAV (first deposit is 1:1), mints shares to Alice, then deploys her USDC across the basket at its target weights through the router, each leg under an oracle slippage floor. With the weights at 40/60, a 900 USDC deposit lands as 1.44 TSLAx and 3.0 NVDAx with no idle USDC. + +### Bob deposits at the current share price + +Same as Alice's deposit. Because shares are priced at NAV, Bob pays the current per-share value and does not dilute Alice's gain; his USDC is deployed at the target weights too. + +### Maria rebalances + +A price move pushes the basket off target. `rebalance(sell_amount, usdc_to_invest)` sells the over-weight asset for USDC and buys the under-weight one, both legs bounded against their Pyth prices, in one atomic instruction. `set_weight(weight_bps)` changes a target between rebalances, or retires an asset by setting it to zero (then reassign that weight to another asset to reach 100% again, and `rebalance` liquidates the retired holdings). + +### Fees accrue + +`collect_fees()` mints time-and-rate-proportional fee shares to Maria, diluting all holders by the fee. + +### Alice withdraws in kind + +`withdraw(shares_to_burn, min_usdc_out)`, with each asset's `[asset_config, vault, mint, user_token_account]` as remaining accounts. Alice's shares burn and she receives her proportional slice of USDC and every asset. Amounts floor in the protocol's favour. + +--- + +## Oracle Integration (Pyth) + +`PriceUpdateV2` price (i64) is read at byte offset 73 and `publish_time` at 93, directly from account bytes to avoid borsh version incompatibility with Anchor. Pyth USD pairs use exponent −8; with USDC and the basket tokens all at 6 decimals, value in USDC minor units is `amount × price / 10⁸`. Each asset's feed pubkey is fixed in its `AssetConfig` (copied from the registry), and validated on every read. In tests, mock `PriceUpdateV2` accounts are injected into LiteSVM (TSLAx $250, NVDAx $180). + +--- + +## Mock Swap Router vs Production + +The `mock-swap-router` exists only for testing: it stores a `usdc_per_token` rate per asset, holds the basket mints' authority, and mints/burns to simulate swaps. The `Strategy` stores the router program pubkey at creation, and `deposit` and `rebalance` require the router account to match it (`InvalidSwapRouter`). In production, replace the router CPIs with [Jupiter](https://jup.ag); the strategy PDA still signs. + +--- + +## What restricts the manager + +The strategy PDA holds all assets; no instruction moves a vault's tokens to the manager. The manager's powers are fenced: + +- **Assets** are limited to mints approved by the registry authority, with the price feed taken from the registry, not the manager. +- **Swaps** go only through the one router registered at creation, and each leg's minimum output is computed from the oracle, not supplied by the manager. +- **The fee** is fixed at creation and capped at 10%, paid only in minted shares. + +What remains to trust: the honesty of the registered router and registry. With an honest router, the worst a careless manager can do is churn and pay market slippage (which hurts depositors but does not enrich the manager); the manager cannot withdraw principal. + +--- + +## Financial Math Implementation + +- Integer arithmetic only; intermediate products use `u128`; multiply before divide. +- All arithmetic uses `checked_*`. Users receive floor division; the protocol keeps the remainder. +- `transfer_checked` carries decimals through every token CPI. + +--- + +## Build and Test + +```bash +# Build each program on its own. Building the whole workspace at once unifies the +# vault's `cpi` feature into the router build and strips the router's entrypoint, +# leaving a stub .so, so build per-manifest (as `anchor build` does): +cargo build-sbf --manifest-path programs/mock-swap-router/Cargo.toml +cargo build-sbf --manifest-path programs/vault-strategy/Cargo.toml + +# Run tests (LiteSVM, no local validator needed) +cargo test --manifest-path programs/vault-strategy/Cargo.toml +``` + +Tests live in `programs/vault-strategy/tests/vault_strategy.rs` and use [LiteSVM](https://github.com/LiteSVM/litesvm). Both `.so` files are loaded from `target/deploy/`, so build before testing. The suite covers the full lifecycle end to end (deposit with auto-deployment, a price move, rebalance back to target, a second depositor priced at the new NAV, a year's fee, in-kind withdrawal), retiring an asset with `set_weight` and reallocating to reopen deposits, and the rejection paths: unapproved asset, weight overflow, over-cap fee and slippage, oracle-bounded deposit slippage, an under-allocated strategy, non-manager `set_weight`, unregistered router, and incomplete asset accounts on deposit. + +## FAQ + +### How do I build an onchain investment fund on Solana? + +A manager creates a strategy with `initialize_strategy`, registers curator-approved assets with `add_asset` at target weights, and investors `deposit` USDC for shares. Each deposit is deployed across the basket in the same transaction, and `withdraw` redeems a proportional slice of every vault in kind. + +### How are share prices calculated? + +Shares are priced at the strategy's net asset value: the total value of the vault balances at current prices divided by shares outstanding. A later depositor pays the current share price rather than diluting earlier ones. + +### How does the manager operate the fund? + +`rebalance` trades the vaults back to their target weights as prices drift, `set_weight` reweights or retires an asset, and a management fee accrues over time and is collected with `collect_fees`. diff --git a/finance/vault-strategy/anchor-v1/app/.env.example b/finance/vault-strategy/anchor-v1/app/.env.example new file mode 100644 index 000000000..afef240a2 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/.env.example @@ -0,0 +1,20 @@ +# Copy to .env.local and fill in. All values are read at build/runtime by src/solana/config.ts. + +# Your Quicknode devnet RPC endpoint (required for reliable reads/sends). +VITE_RPC_URL=https://your-endpoint.solana-devnet.quiknode.pro/xxxxxxxx/ + +# Program IDs. Defaults below are the repo's localnet IDs (Anchor.toml / declare_id!). +# A fresh devnet deploy will produce NEW ids — override them here after deploying. +VITE_VAULT_PROGRAM_ID=VLT5W7bqhRN4nCdRpXm8UfHRxZd9EuZGqiSAkGHQfGh +VITE_ROUTER_PROGRAM_ID=SWPR8Rk3aq3DrDGLdaANq7xCMnXoUFUJWJJmCWxc8Jm + +# The USDC mint the strategy was created with. The demo creates its own 6-decimal +# mock USDC during seeding — paste that mint here. (No safe default exists.) +VITE_USDC_MINT= + +# Which strategy index to view (PDA seed "strategy" + index). Managers can create others. +VITE_STRATEGY_INDEX=0 + +# Explorer cluster label: "devnet" | "mainnet-beta" | "custom". +# "custom" uses VITE_RPC_URL as the explorer's customUrl. +VITE_CLUSTER=devnet diff --git a/finance/vault-strategy/anchor-v1/app/.gitignore b/finance/vault-strategy/anchor-v1/app/.gitignore new file mode 100644 index 000000000..63b3e72fe --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/.gitignore @@ -0,0 +1,13 @@ +node_modules +dist +dist-ssr +*.local +.env +.env.local +.env.*.local +.DS_Store + +# build artifacts (tsc -b / vite) +*.tsbuildinfo +vite.config.js +vite.config.d.ts diff --git a/finance/vault-strategy/anchor-v1/app/.npmrc b/finance/vault-strategy/anchor-v1/app/.npmrc new file mode 100644 index 000000000..316aab6c5 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/.npmrc @@ -0,0 +1,5 @@ +# Don't re-run `install` before every `pnpm + + diff --git a/finance/vault-strategy/anchor-v1/app/package.json b/finance/vault-strategy/anchor-v1/app/package.json new file mode 100644 index 000000000..f3f73c0a4 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/package.json @@ -0,0 +1,37 @@ +{ + "name": "vault-strategy-app", + "private": true, + "version": "0.1.0", + "type": "module", + "description": "Frontend for the vault-strategy Solana program (educational demo, devnet).", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview", + "typecheck": "tsc --noEmit", + "verify": "node scripts/verify-client.mjs" + }, + "dependencies": { + "@coral-xyz/anchor": "^0.30.1", + "@solana/spl-token": "^0.4.9", + "@solana/wallet-adapter-base": "^0.9.23", + "@solana/wallet-adapter-react": "^0.15.35", + "@solana/wallet-adapter-react-ui": "^0.9.35", + "@solana/wallet-adapter-wallets": "^0.19.32", + "@solana/web3.js": "^1.95.3", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/node": "^20.14.15", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.4", + "vite": "^5.4.2", + "vite-plugin-node-polyfills": "^0.22.0" + } +} diff --git a/finance/vault-strategy/anchor-v1/app/pnpm-lock.yaml b/finance/vault-strategy/anchor-v1/app/pnpm-lock.yaml new file mode 100644 index 000000000..3ad12544f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/pnpm-lock.yaml @@ -0,0 +1,10942 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@coral-xyz/anchor': + specifier: ^0.30.1 + version: 0.30.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/spl-token': + specifier: ^0.4.9 + version: 0.4.15(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-base': + specifier: ^0.9.23 + version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-react': + specifier: ^0.15.35 + version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-react-ui': + specifier: ^0.9.35 + version: 0.9.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@18.3.1(react@18.3.1))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-wallets': + specifier: ^0.19.32 + version: 0.19.38(@babel/runtime@7.29.7)(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@types/react@18.3.31)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@18.3.1(react@18.3.1))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@3.22.4) + '@solana/web3.js': + specifier: ^1.95.3 + version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/node': + specifier: ^20.14.15 + version: 20.19.43 + '@types/react': + specifier: ^18.3.3 + version: 18.3.31 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.7(@types/react@18.3.31) + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(terser@5.49.0)) + autoprefixer: + specifier: ^10.4.20 + version: 10.5.4(postcss@8.5.23) + postcss: + specifier: ^8.4.41 + version: 8.5.23 + tailwindcss: + specifier: ^3.4.10 + version: 3.4.19(yaml@2.9.0) + typescript: + specifier: ^5.5.4 + version: 5.9.3 + vite: + specifier: ^5.4.2 + version: 5.4.21(@types/node@20.19.43)(terser@5.49.0) + vite-plugin-node-polyfills: + specifier: ^0.22.0 + version: 0.22.0(rollup@4.62.2)(vite@5.4.21(@types/node@20.19.43)(terser@5.49.0)) + +packages: + + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@coral-xyz/anchor-errors@0.30.1': + resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==} + engines: {node: '>=10'} + + '@coral-xyz/anchor@0.30.1': + resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==} + engines: {node: '>=11'} + + '@coral-xyz/borsh@0.30.1': + resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + + '@emurgo/cardano-serialization-lib-browser@13.2.1': + resolution: {integrity: sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==} + + '@emurgo/cardano-serialization-lib-nodejs@13.2.0': + resolution: {integrity: sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@ethereumjs/common@10.1.2': + resolution: {integrity: sha512-whWnhqAxwpDy4zWkM6rqMzb8nioZJpiys01N57+HDyanvK5IRzodV5tdMRDt66PD5vDjl2c9K5UcB039gU2Oyw==} + + '@ethereumjs/rlp@10.1.2': + resolution: {integrity: sha512-T5Zt6C2pd02Wd88Q9A5/UX+He1Q2Y1LntHxz/038tfbUMiqby4fYSSTLEDx+TEfJqw1BsJSBY/TSu6goUzlk+w==} + engines: {node: '>=20'} + hasBin: true + + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + + '@ethereumjs/tx@10.1.2': + resolution: {integrity: sha512-bAYK3YaYkk+auzxGfZSRVDbLHvboJNTx8/tV6jaqgPVlrA1QKEEADDEp/EGz+KI4NQmTGxEtXZ8tV/WjniRNww==} + engines: {node: '>=20'} + + '@ethereumjs/util@10.1.2': + resolution: {integrity: sha512-UPBgXtHHfQugoXOSAoeG3jdmPbl37cwV9y3XqTPAnw8tJj8np14TPV2uc5lOs7C2LMF9Ubn66zyaiYxgwGppng==} + engines: {node: '>=20'} + + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + + '@fivebinaries/coin-selection@3.0.0': + resolution: {integrity: sha512-h25Pn1ZA7oqQBQDodGAgIsQt66T2wDge9onBKNqE66WNWL0KJiKJbpij8YOLo5AAlEIg5IS7EB1QjBgDOIg6DQ==} + + '@fractalwagmi/popup-connection@1.1.1': + resolution: {integrity: sha512-hYL+45iYwNbwjvP2DxP3YzVsrAGtj/RV9LOgMpJyCxsfNoyyOoi2+YrnywKkiANingiG2kJ1nKsizbu1Bd4zZw==} + peerDependencies: + react: ^17.0.2 || ^18 + react-dom: ^17.0.2 || ^18 + + '@fractalwagmi/solana-wallet-adapter@0.1.1': + resolution: {integrity: sha512-oTZLEuD+zLKXyhZC5tDRMPKPj8iaxKLxXiCjqRfOo4xmSbS2izGRWLJbKMYYsJysn/OI3UJ3P6CWP8WUWi0dZg==} + + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keystonehq/alias-sampling@0.1.2': + resolution: {integrity: sha512-5ukLB3bcgltgaFfQfYKYwHDUbwHicekYo53fSEa7xhVkAEqsA74kxdIwoBIURmGUtXe3EVIRm4SYlgcrt2Ri0w==} + + '@keystonehq/bc-ur-registry-sol@0.9.5': + resolution: {integrity: sha512-HZeeph9297ZHjAziE9wL/u2W1dmV0p1H9Bu9g1bLJazP4F6W2fjCK9BAoCiKEsMBqadk6KI6r6VD67fmDzWyug==} + + '@keystonehq/bc-ur-registry@0.5.4': + resolution: {integrity: sha512-z7bZe10I5k0zz9znmDTXh+o3Rzb5XsRVpwAzexubOaLxVdZ0F7aMbe2LoEsw766Hpox/7zARi7UGmLz5C8BAzA==} + + '@keystonehq/bc-ur-registry@0.7.1': + resolution: {integrity: sha512-6eVIjNt/P+BmuwcYccbPYVS85473SFNplkqWF/Vb3ePCzLX00tn0WZBO1FGpS4X4nfXtceTfvUeNvQKoTGtXrw==} + + '@keystonehq/sdk@0.19.2': + resolution: {integrity: sha512-ilA7xAhPKvpHWlxjzv3hjMehD6IKYda4C1TeG2/DhFgX9VSffzv77Eebf8kVwzPLdYV4LjX1KQ2ZDFoN1MsSFQ==} + peerDependencies: + react: '*' + react-dom: '*' + + '@keystonehq/sol-keyring@0.20.0': + resolution: {integrity: sha512-UBeMlecybTDQaFMI951LBEVRyZarqKHOcwWqqvphV+x7WquYz0SZ/wf/PhizV0MWoGTQwt2m5aqROzksi6svqw==} + + '@ledgerhq/devices@8.16.0': + resolution: {integrity: sha512-brXLPzkvGM3D5YNsWQ25P5G4SmWdSNBed9W8wKoOIRLGdRfvE+bg9mzFty0iZ+aRLBkLoXwX7xKIL9zUi6LBKQ==} + + '@ledgerhq/devices@8.17.0': + resolution: {integrity: sha512-l+rrVQEjR1hSWOLD00LFX4zbS8yB1M/Mb6UYPmSHGO7TmE1CFbZ4CmDJC/kZSl3hdrXCJ+YUNpvaLCcSWDwA+Q==} + + '@ledgerhq/errors@6.37.0': + resolution: {integrity: sha512-T5yiKI5UX7ugeocdTF3TUsCIN2BH41Bio4ZeN410YFjFOf3es08n/5JyMzzKwzRgP0blG3HfBf7s7vJKqCSAeg==} + + '@ledgerhq/hw-transport-webhid@6.36.0': + resolution: {integrity: sha512-1mKWm3LyGOgmaYlAiqbmaGoupOZHbj2Kow5sXLxKZzQa4kFvQuUdinYOWhs7T8hqJyAkz9WlHYyKM7aIs8kjNg==} + + '@ledgerhq/hw-transport@6.35.5': + resolution: {integrity: sha512-P4+wtLewLWgxPtIb90h5kjpzXVlC6f4IBQBmvowVFkInvZt34ffXkX7wa5KfMzu4l3cqCcpNSqtPSCMp+0vuqg==} + + '@ledgerhq/hw-transport@6.35.6': + resolution: {integrity: sha512-Eg1SsOgY9jAVPTBfhCVzj5WvzqlYS08Ip+DMX33tG6rjcCibDVjwjU2LuxYmTawd4Jo83bYm+Fpg8hIwN+bBNw==} + + '@ledgerhq/logs@6.17.0': + resolution: {integrity: sha512-yra33g5q/AU7+PwAws+GaVpQGUuxnDREjVBnviJjcaJLVKuLzI4pnj8Bd3nY3fypM5k1yZEYKEXfUuGFUjP2+w==} + + '@lit-labs/ssr-dom-shim@1.6.0': + resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + + '@mobily/ts-belt@3.13.1': + resolution: {integrity: sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==} + engines: {node: '>= 10.*'} + + '@ngraveio/bc-ur@1.1.13': + resolution: {integrity: sha512-j73akJMV4+vLR2yQ4AphPIT5HZmxVjn/LxpL7YHoINnXoH6ccc90Zzck6/n6a3bCXOVZwBxq+YHwbAKRV+P8Zg==} + + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@2.2.0': + resolution: {integrity: sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==} + engines: {node: '>= 20.19.0'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@2.2.0': + resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} + engines: {node: '>= 20.19.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@particle-network/analytics@1.0.2': + resolution: {integrity: sha512-E4EpTRYcfNOkxj+bgNdQydBrvdLGo4HfVStZCuOr3967dYek30r6L7Nkaa9zJXRE2eGT4lPvcAXDV2WxDZl/Xg==} + + '@particle-network/auth@1.3.1': + resolution: {integrity: sha512-hu6ie5RjjN4X+6y/vfjyCsSX3pQuS8k8ZoMb61QWwhWsnZXKzpBUVeAEk55aGfxxXY+KfBkSmZosyaZHGoHnfw==} + + '@particle-network/chains@1.8.3': + resolution: {integrity: sha512-WgzY2Hp3tpQYBKXF0pOFdCyJ4yekTTOCzBvBt2tvt7Wbzti2bLyRlfGZAoP57TvIMiy1S1oUfasVfM0Dqd6k5w==} + + '@particle-network/crypto@1.0.1': + resolution: {integrity: sha512-GgvHmHcFiNkCLZdcJOgctSbgvs251yp+EAdUydOE3gSoIxN6KEr/Snu9DebENhd/nFb7FDk5ap0Hg49P7pj1fg==} + + '@particle-network/solana-wallet@1.3.2': + resolution: {integrity: sha512-KviKVP87OtWq813y8IumM3rIQMNkTjHBaQmCUbTWGebz3csFOv54JIoy1r+3J3NnA+mBxBdZeRedZ5g+07v75w==} + peerDependencies: + '@solana/web3.js': ^1.50.1 + bs58: ^4.0.1 + + '@project-serum/sol-wallet-adapter@0.2.6': + resolution: {integrity: sha512-cpIb13aWPW8y4KzkZAPDgw+Kb+DXjCC6rZoH74MGm3I/6e/zKyGnfAuW5olb2zxonFqsYgnv7ev8MQnvSgJ3/g==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.5.0 + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.2': + resolution: {integrity: sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + + '@react-native-async-storage/async-storage@1.24.0': + resolution: {integrity: sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==} + peerDependencies: + react-native: ^0.0.0-0 || >=0.60 <1.0 + + '@react-native/assets-registry@0.86.0': + resolution: {integrity: sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/codegen@0.86.0': + resolution: {integrity: sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.86.0': + resolution: {integrity: sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': 0.86.0 + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.86.0': + resolution: {integrity: sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/debugger-shell@0.86.0': + resolution: {integrity: sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/dev-middleware@0.86.0': + resolution: {integrity: sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/gradle-plugin@0.86.0': + resolution: {integrity: sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/js-polyfills@0.86.0': + resolution: {integrity: sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + '@react-native/normalize-colors@0.86.0': + resolution: {integrity: sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==} + + '@react-native/virtualized-lists@0.86.0': + resolution: {integrity: sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + peerDependencies: + '@types/react': ^19.2.0 + react: '*' + react-native: 0.86.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@reown/appkit-common@1.7.2': + resolution: {integrity: sha512-DZkl3P5+Iw3TmsitWmWxYbuSCox8iuzngNp/XhbNDJd7t4Cj4akaIUxSEeCajNDiGHlu4HZnfyM1swWsOJ0cOw==} + + '@reown/appkit-controllers@1.7.2': + resolution: {integrity: sha512-KCN/VOg+bgwaX5kcxcdN8Xq8YXnchMeZOvmbCltPEFDzaLRUWmqk9tNu1OVml0434iGMNo6hcVimIiwz6oaL3Q==} + + '@reown/appkit-polyfills@1.7.2': + resolution: {integrity: sha512-TxCVSh9dV2tf1u+OzjzLjAwj7WHhBFufHlJ36tDp5vjXeUUne8KvYUS85Zsyg4Y9Yeh+hdSIOdL2oDCqlRxCmw==} + + '@reown/appkit-scaffold-ui@1.7.2': + resolution: {integrity: sha512-2Aifk5d23e40ijUipsN3qAMIB1Aphm2ZgsRQ+UvKRb838xR1oRs+MOsfDWgXhnccXWKbjPqyapZ25eDFyPYPNw==} + + '@reown/appkit-ui@1.7.2': + resolution: {integrity: sha512-fZv8K7Df6A/TlTIWD/9ike1HwK56WfzYpHN1/yqnR/BnyOb3CKroNQxmRTmjeLlnwKWkltlOf3yx+Y6ucKMk6Q==} + + '@reown/appkit-utils@1.7.2': + resolution: {integrity: sha512-Z3gQnMPQopBdf1XEuptbf+/xVl9Hy0+yoK3K9pBb2hDdYNqJgJ4dXComhlRT8LjXFCQe1ZW0pVZTXmGQvOZ/OQ==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-wallet@1.7.2': + resolution: {integrity: sha512-WQ0ykk5TwsjOcUL62ajT1bhZYdFZl0HjwwAH9LYvtKYdyZcF0Ps4+y2H4HHYOc03Q+LKOHEfrFztMBLXPTxwZA==} + + '@reown/appkit@1.7.2': + resolution: {integrity: sha512-oo/evAyVxwc33i8ZNQ0+A/VE6vyTyzL3NBJmAe3I4vobgQeiobxMM0boKyLRMMbJggPn8DtoAAyG4GfpKaUPzQ==} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/base@2.2.0': + resolution: {integrity: sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + + '@sinclair/typebox@0.33.24': + resolution: {integrity: sha512-91up4t0BLjfkCZ4Ap/BcgaPrMaX6n0I2YRu+kc03xGhLy9G3N05nbTpnK8q7GXdv0PxwUoxi67A8o3Wr5U7j3w==} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.9': + resolution: {integrity: sha512-TAMItAuOb7duwYQ+PZ6JNqw/6TEhCWLObHF5uOBGV9tjCozHGVunxa7lTeuHAWIgO68IAo86MZdE5kethDATpw==} + peerDependencies: + '@solana/web3.js': ^1.98.4 + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.9': + resolution: {integrity: sha512-qtWJq0hzKgngVG0So2ViBRPYDculaxgj40WDSP1nzgdg85MXyAmTEjQqV10uSVbZRm9b1hl601HDJX1sHTgeiw==} + peerDependencies: + react-native: '>0.74' + + '@solana-mobile/wallet-adapter-mobile@2.2.9': + resolution: {integrity: sha512-IWzI2pUmEqBsTNo+XqMTY38NL5TSdMetES59N0Cmuf+zYqiS56rHdMwD/R2IOy7E4yKa1CsuHfCh6CE6zk4ViQ==} + peerDependencies: + '@solana/web3.js': ^1.98.4 + react-native: '>0.74' + + '@solana-mobile/wallet-standard-mobile@0.5.3': + resolution: {integrity: sha512-/Ea/CNIWHExpXsA6syVy7fUUhONtYob+VMsmF8flm8GEAZQyzX6UtKSy4NQMMTGBTAGlmmmbBVrZF+Tp5/fDxQ==} + + '@solana-program/compute-budget@0.8.0': + resolution: {integrity: sha512-qPKxdxaEsFxebZ4K5RPuy7VQIm/tfJLa1+Nlt3KNA8EYQkz9Xm8htdoEaXVrer9kpgzzp9R3I3Bh6omwCM06tQ==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana-program/stake@0.2.1': + resolution: {integrity: sha512-ssNPsJv9XHaA+L7ihzmWGYcm/+XYURQ8UA3wQMKf6ccEHyHOUgoglkkDU/BoA0+wul6HxZUN0tHFymC0qFw6sg==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana-program/system@0.7.0': + resolution: {integrity: sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana-program/token-2022@0.4.2': + resolution: {integrity: sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==} + peerDependencies: + '@solana/kit': ^2.1.0 + '@solana/sysvars': ^2.1.0 + + '@solana-program/token@0.5.1': + resolution: {integrity: sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==} + peerDependencies: + '@solana/kit': ^2.1.0 + + '@solana/accounts@2.3.0': + resolution: {integrity: sha512-QgQTj404Z6PXNOyzaOpSzjgMOuGwG8vC66jSDB+3zHaRcEPRVRd2sVSrd1U6sHtnV3aiaS6YyDuPQMheg4K2jw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/accounts@6.10.0': + resolution: {integrity: sha512-+FxfDOrnifoPlBkF+fr8eeQdgM6xtIgAg9xKMu3WnIz60oZd4Xnry6+ff6t+ePPoZZp397FSg9ZJet68VCWm5Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/addresses@2.3.0': + resolution: {integrity: sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/addresses@6.10.0': + resolution: {integrity: sha512-vEoCGBTxG0HCERAn84KXkrJjl+pDaNzOpZ0qbgcPS98fYxP5yzbKB8SNOY2bzrbkRUmmw5Q3hqTRERemUN2Gcw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/assertions@2.3.0': + resolution: {integrity: sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/assertions@6.10.0': + resolution: {integrity: sha512-lKSAdVo+P/6Lp4vs6shstXmFOpvxrABwn4o1462tb7sKkNapk6o9pPFVPGw4DUgPS3WqWRs1j2tmpuVjhQRntg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/buffer-layout-utils@0.3.0': + resolution: {integrity: sha512-MuQOCC1j0np1xH9yAv0ZWWfwvr7Bt7Sz4LId11Wi4wDdAmJ+lobE+vHg/mZmGcihF0BIkqVBNxGmlv8QE5DrtA==} + engines: {node: '>= 10'} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.0.0-rc.1': + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-core@6.10.0': + resolution: {integrity: sha512-nfAl9OMGo4HanIMxGsQoVB7BxMoqBCYEUxl8oEAZZ09pDxnaXQZkTRXEwPPccag37XfW1ciPd1vWPKwB2b0HHQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@2.0.0-rc.1': + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-data-structures@2.3.0': + resolution: {integrity: sha512-qvU5LE5DqEdYMYgELRHv+HMOx73sSoV1ZZkwIrclwUmwTbTaH8QAJURBj0RhQ/zCne7VuLLOZFFGv6jGigWhSw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-data-structures@6.10.0': + resolution: {integrity: sha512-CNasJW3bq5u+632Zt5aJ8rOjAjv2HyenpV8o9kAIqdmV4CBpjCCoBnKn8LkuR/sbeREZxJYfhKTXO/9ruAkw7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-numbers@2.0.0-rc.1': + resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@6.10.0': + resolution: {integrity: sha512-CcM+wX4zOiA9zkh8A7t1787A0Ehgmu5+6Z2tKoHew6cNw/dkaUTPa8JnNHbvfsLC8dfHC1BhAEJl86sKmRsfkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@2.0.0-rc.1': + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + + '@solana/codecs-strings@2.3.0': + resolution: {integrity: sha512-y5pSBYwzVziXu521hh+VxqUtp0hYGTl1eWGoc1W+8mdvBdC1kTqm/X7aYQw33J42hw03JjryvYOvmGgk3Qz/Ug==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + + '@solana/codecs-strings@6.10.0': + resolution: {integrity: sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs@2.0.0-rc.1': + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs@2.3.0': + resolution: {integrity: sha512-JVqGPkzoeyU262hJGdH64kNLH0M+Oew2CIPOa/9tR3++q2pEd4jU2Rxdfye9sd0Ce3XJrR5AIa8ZfbyQXzjh+g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs@6.10.0': + resolution: {integrity: sha512-lLVuxod4ChWp9i7OvpgIykYG8Q9OGPVXKnHM9VlzDDLylsx7Y1FoQL00sHa7PqFkJVmkBufaA6dcGbQ7FU+lAQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/errors@2.0.0-rc.1': + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} + hasBin: true + peerDependencies: + typescript: '>=5' + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@6.10.0': + resolution: {integrity: sha512-KBLAxCtAXr357JNhCyIDQXWbuSj5vN6w+28FSfcYY6OOSiphmXLAV3V58jgV0C6iNbIzFJFi6yatFyDTdeJsNg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@2.3.0': + resolution: {integrity: sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/fast-stable-stringify@6.10.0': + resolution: {integrity: sha512-iCNed27wk6PKSS3QUtHovRfMWF/jbVWogs2vB4tukKUCsqG4rDfDInIwZ6ur/nY6XTrgi2gMMdZq9GAUlWsbfw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@6.10.0': + resolution: {integrity: sha512-ZkKL0alXH3L7/wMiVG8YUuG8qBKunlM810+YBD7nUPRhifiGsX1zwADViHLYNqLr/jUk0mTYFUcKznTpB/K+Gg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@2.3.0': + resolution: {integrity: sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/functional@6.10.0': + resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@6.10.0': + resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@2.3.0': + resolution: {integrity: sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/instructions@6.10.0': + resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@2.3.0': + resolution: {integrity: sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/keys@6.10.0': + resolution: {integrity: sha512-26IRfdm/hTUCmM7MeEeX0ULSbCM6OzkZTkfkrPircqmRM7xyNqP4hq7u0P7wjb9dl7NfgyG6K7cdvUxrj2e3mA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@2.3.0': + resolution: {integrity: sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/kit@6.10.0': + resolution: {integrity: sha512-/WnnQp3uARh2JCFSfAakejTAqwmXVuMVTcRn5r2yDwY2yzZ4R6mt/Cl59VPimVLNSoTyN/KsEwhv9omr3ERazQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@2.3.0': + resolution: {integrity: sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/nominal-types@6.10.0': + resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@6.10.0': + resolution: {integrity: sha512-RiEgAueeMkFMC1suOXBIcmCZgtXRxy24yk0DldPB37bB4zwOF1SAaRjNRPjIkGK8RhCYrEpPosnzLyavw9ueRg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@2.0.0-rc.1': + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} + peerDependencies: + typescript: '>=5' + + '@solana/options@2.3.0': + resolution: {integrity: sha512-PPnnZBRCWWoZQ11exPxf//DRzN2C6AoFsDI/u2AsQfYih434/7Kp4XLpfOMT/XESi+gdBMFNNfbES5zg3wAIkw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/options@6.10.0': + resolution: {integrity: sha512-RO9UT3UYD8/Cu2uM6ZXbKvLeMnVD42+g9JRds7Pfs4AhiOyg4R4TJrQUAppTgavPTO3PBRlWtWOC05ZH/yAIbg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@6.10.0': + resolution: {integrity: sha512-JE70YTQOfFACVFGvoJon4Scc/eHUWjMu8Ovo35CcV2kHTAHYMCd4UkBd2gmlhK0vRMMomsQi1ZLPlAlTq0OoUQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@6.10.0': + resolution: {integrity: sha512-vr0/l9wcM4orwGr8cjkFWaJ9A4HvzuAv00jMFNMg0Spd0GZqnwnpW+D/fXa1lIJnTRaF3EeEjLh4VjKU037T0Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@6.10.0': + resolution: {integrity: sha512-4PPbTLdC1ylHIuvhOFDP8RnSkXPCFjNFWGslzc+UFKnoR4ajzBcByX94jmaruDMk5ncxgj7tr9pzJTvfGHIaMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@2.3.0': + resolution: {integrity: sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/programs@6.10.0': + resolution: {integrity: sha512-qn/HeLP5KGUJXVub3fyGe69/rWaLX4jzwm6V/1pNxJDbdF+MBdgn18hP6F+VmhfdNmwK0lue3J/1HQ1UTMuQeQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@2.3.0': + resolution: {integrity: sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/promises@6.10.0': + resolution: {integrity: sha512-oJSIn+VBBMWDo8oqw7RV3tI6Jih+Ieup6FcQLYLDUriaeo7+8l1Zdezl8zh7SIfeU4lOfAbRg6mR0huaS/Lltg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@2.3.0': + resolution: {integrity: sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-api@6.10.0': + resolution: {integrity: sha512-RjPIVsAb/85P1ptoO3WpC0x7QG6gG/e4q/3lo6gbSznUZOcoM+8sSBnCX7BwP1ZkCDS6NK/ClXLnhhhYZx+OGg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@2.3.0': + resolution: {integrity: sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-parsed-types@6.10.0': + resolution: {integrity: sha512-5275mvSV1mxhwvrMVa+K7BU/nAetpHfcb+8Ql9rtA8RRf6DyiimFQFZUukE4Ez6XJihEpCHNy98yhkgai9wytQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@2.3.0': + resolution: {integrity: sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec-types@6.10.0': + resolution: {integrity: sha512-NDZrKyZrJk4HaMFhTE/lAiMB824cWAodKqDHyKi0UteHU9pyRmil3BN1jt7e+j08mwMWwfklSgyrTaq52g6DIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec@2.3.0': + resolution: {integrity: sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec@6.10.0': + resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-api@2.3.0': + resolution: {integrity: sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions-api@6.10.0': + resolution: {integrity: sha512-CRPQoTtT1cOwOQUsqS7jgo7wYdAj7jB5ab/UmMPWVpecf2FNMhWhgvxP2s82M7VkDGTGl13qaQ0WySmi7Egrlg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@2.3.0': + resolution: {integrity: sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + ws: ^8.18.0 + + '@solana/rpc-subscriptions-channel-websocket@6.10.0': + resolution: {integrity: sha512-KkqP1186HELPlJftA88SNAT2znR8knCVzsUipXVzY4zfW8sN3LOa0ePMzh9VZ/V+J+raTt55laR87ovAO0n+zw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@2.3.0': + resolution: {integrity: sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions-spec@6.10.0': + resolution: {integrity: sha512-nWMwGaG4ulzeX2sskY5TywXF3cwEd8FDmUpLe2JBWxE8XDAOGOKcsYPYFcBgb8ee9KqfPT2PTNdcz9jOhJf34w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@2.3.0': + resolution: {integrity: sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions@6.10.0': + resolution: {integrity: sha512-6mfuHp/K7unFKCOTCCBC9ziEGnxe2tyJ74EbR51QUnBeCUdYD7Hhdpxic1WRSJ3UeNW/mG4OzFM6z8Wi64Eh9Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@2.3.0': + resolution: {integrity: sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transformers@6.10.0': + resolution: {integrity: sha512-2nFUrVTiE720pJOY4XKx3HuYmishw0of/4oScu76YGm6O8wsmvFvPNAkrEinmieWXQkfpBfRvLZmpl8PaAy+ug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@2.3.0': + resolution: {integrity: sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transport-http@6.10.0': + resolution: {integrity: sha512-JrdNuYi0nBbD3X8JUtgX1dQJwIwz/WJvmigDdELysXfGB2bTJpfjqGDLhCLOz2sRl66FASIEqgG/LVa2C9VXcA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@2.3.0': + resolution: {integrity: sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-types@6.10.0': + resolution: {integrity: sha512-zaSecTfCPvz/vcoAmKD6XoRstGHTr1EKJBD8T9UcpEFFB6CtF6DxerDB+wrzkamuT6msmnR2DWXMrYOGDAsgIg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@2.3.0': + resolution: {integrity: sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc@6.10.0': + resolution: {integrity: sha512-EwxsqoD+NXV+m+iobnWNtATD93gTgaNsOiQOzYB1/2e+8S6fl6obdNPB55yfXgtl4jt6GV6/ae4xuPhLv76vvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@2.3.0': + resolution: {integrity: sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/signers@6.10.0': + resolution: {integrity: sha512-+vtCc+mT1FpGxrA5oL2aaMxSHiMJ2hH5PcDIfjo2XJkHz2klZiCZyT5F9+zpltc9vdi1QTElQq59Sfplmtd33A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/spl-token-group@0.0.7': + resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + + '@solana/spl-token-metadata@0.1.6': + resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + + '@solana/spl-token@0.4.15': + resolution: {integrity: sha512-3Lof3mNov8NVQ3PalIWb1Jgr/TZ6lYM+/sexv2TLqdhNFVth2OfWmH3d7QucgMjSbokkjNiNlRr6I8Fd269uaw==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.5 + + '@solana/subscribable@2.3.0': + resolution: {integrity: sha512-DkgohEDbMkdTWiKAoatY02Njr56WXx9e/dKKfmne8/Ad6/2llUIrax78nCdlvZW9quXMaXPTxZvdQqo9N669Og==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/subscribable@6.10.0': + resolution: {integrity: sha512-VsR6XMwkiDBkZJUcoGkEOhf397pOV75gKCL9Bx8bpi2T3Bbs0CxUpMn4yaUgAnRba3eXmjbXMNCXjttfa6sKbw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@2.3.0': + resolution: {integrity: sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/sysvars@6.10.0': + resolution: {integrity: sha512-cG13p1+onxz+20iWjwWQr1Z1jQwPm0fnjoW75fqZq7p4rVCie3L2sXvaJsYPjWKrUvpOzOIEHnqZGkG05rCpjg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@2.3.0': + resolution: {integrity: sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-confirmation@6.10.0': + resolution: {integrity: sha512-ULvtg65qfenh4T/GYcIlKSUv5EqDcng9UN0dxbHU4kuZdR2e0B8HN2xDC4WhcFQVeFJSbTZmaYFkeTY/Y4gfGQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@2.3.0': + resolution: {integrity: sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-messages@6.10.0': + resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@2.3.0': + resolution: {integrity: sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transactions@6.10.0': + resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/wallet-adapter-alpha@0.1.14': + resolution: {integrity: sha512-ZSEvQmTdkiXPeHWIHbvdU4yDC5PfyTqG/1ZKIf2Uo6c+HslMkYer7mf9HUqJJ80dU68XqBbzBlIv34LCDVWijw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-avana@0.1.17': + resolution: {integrity: sha512-I3h+dPWVTEylOWoY2qxyI7mhcn3QNL+tkYLrZLi3+PBaoz79CVIVFi3Yb4NTKYDP+hz7/Skm/ZsomSY5SJua5A==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-base-ui@0.1.6': + resolution: {integrity: sha512-OuxLBOXA2z3dnmuGP0agEb7xhsT3+Nttd+gAkSLgJRX2vgNEAy3Fvw8IKPXv1EE2vRdw/U6Rq0Yjpp3McqVZhw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + react: '*' + + '@solana/wallet-adapter-base@0.9.27': + resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-bitkeep@0.3.24': + resolution: {integrity: sha512-LQvS9pr/Qm95w8XFAvxqgYKVndgifwlQYV1+Exc0XMnbxpw40blMTMKxSfiiPq78e3Zi2XWRApQyqtFUafOK5g==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-bitpie@0.5.22': + resolution: {integrity: sha512-S1dSg041f8CKqzy7HQy/BPhY56ZZiZeanmdx4S6fMDpf717sgkCa7jBjLFtx8ugZzO/VpYQJtRXtKEtHpx0X0A==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-clover@0.4.23': + resolution: {integrity: sha512-0PIAP0g1CmSLyphwXLHjePpKiB1dg+veWIbkziIdLHwSsLq6aBr2FimC/ljrbtqrduL1bH7sphNZOGE0IF0JtQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-coin98@0.5.24': + resolution: {integrity: sha512-lEHk2L00PitymreyACv5ShGyyeG/NLhryohcke4r/8yDL3m2XTOeyzkhd1/6mDWavMhno1WNivHxByNHDSQhEw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-coinbase@0.1.23': + resolution: {integrity: sha512-vCJi/clbq1VVgydPFnHGAc2jdEhDAClYmhEAR4RJp9UHBg+MEQUl1WW8PVIREY5uOzJHma0qEiyummIfyt0b4A==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-coinhub@0.3.22': + resolution: {integrity: sha512-an/0FyUIY5xWfPYcOxjaVV11IbCCeErURbw+nHyWV89kw/CuiaYwaWXxATGdj8XJjg/UPsPbiLAGyKkdOMjjfw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-fractal@0.1.12': + resolution: {integrity: sha512-gu9deyHxwrRfBt6VqaCVIN7FmViZn47NwORuja4wc95OX2ZxsjGE6hEs1bJsfy7uf/CsUjwDe1V309r7PlKz8g==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-huobi@0.1.19': + resolution: {integrity: sha512-wLv2E/VEYhgVot7qyRop2adalHyw0Y+Rb1BG9RkFUa3paZUZEsIozBK3dBScTwSCJpmLCjzTVWZEvtHOfVLLSw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-hyperpay@0.1.18': + resolution: {integrity: sha512-On95zV7Dq5UTqYAtLFvttwDgPVz0a2iWl1XZ467YYXbvXPWSxkQmvPD0jHPUvHepGw60Hf5p0qkylyYANIAgoQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-keystone@0.1.19': + resolution: {integrity: sha512-u7YmrQCrdZHI2hwJpX3rAiYuUdK0UIFX6m8+LSDOlA2bijlPJuTeH416aqqjueJTpvuZHowOPmV/no46PBqG0Q==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-krystal@0.1.16': + resolution: {integrity: sha512-crAVzzPzMo63zIH0GTHDqYjIrjGFhrAjCntOV2hMjebMGSAmaUPTJKRi+vgju2Ons2Ktva7tRwiVaJxD8370DA==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-ledger@0.9.29': + resolution: {integrity: sha512-1feOHQGdMOPtXtXBCuUuHlsoco2iqDNcUTbHW+Bj+3ItXGJctwMicSSWgfATEAFNUanvOB+kKZ4N3B1MQrP/9w==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-mathwallet@0.9.22': + resolution: {integrity: sha512-5ePUe4lyTbwHlXQJwNrXRXDfyouAeIbfBTkJxcAWVivlVQcxcnE7BOwsCjImVaGNh4MumMLblxd2ywoSVDNf/g==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-neko@0.2.16': + resolution: {integrity: sha512-0l/s+NJUGkyVm24nHF0aPsTMo9lsdw21PO+obDszJziZZmiKrI1l1WmhCDwYwAllY0nQjaxQ0tJBYy066pmnVg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-nightly@0.1.20': + resolution: {integrity: sha512-37kRXzZ+54JhT21Cp3lC0O+hg9ZBC4epqkwNbev8piNnZUghKdsvsG5RjbsngVY6572jPlFGiuniDmb0vUSs3A==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-nufi@0.1.21': + resolution: {integrity: sha512-up9V4BfWl/oR0rIDQio1JD2oic+isHPk5DI4sUUxBPmWF/BYlpDVxwEfL7Xjg+jBfeiYGn0sVjTvaHY4/qUZAw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-onto@0.1.11': + resolution: {integrity: sha512-fyTJ5xFaYD8/Izu8q+oGD9iXZvg7ljLxi/JkVwN/HznVdac95ee1fvthkF3PPRmWGZeA7O/kYAxdQMXxlwy+xw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-particle@0.1.16': + resolution: {integrity: sha512-uB2FFN2SqV0cJQTvQ+pyVL6OXwGMhbz5KuWU14pcZWqfrOxs+L4grksLwMCGw+yBw/+jydLGMTUWntuEm6r7ag==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-phantom@0.9.29': + resolution: {integrity: sha512-nAFvjtX2S1aRLzi70CSLajsmixGxev+1O1GzGzety4eyfv2AYxTHEuDIJySugcMTtSTleVpOMhHXjzlUkxuf1w==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-react-ui@0.9.39': + resolution: {integrity: sha512-B6GdOobwVuIgEX1qjcbTQEeo+0UGs3WPuBeUlR0dDCzQh9J3IAWRRyL/47FYSHYRp26LAu4ImWy4+M2TFD5OJg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + react: '*' + react-dom: '*' + + '@solana/wallet-adapter-react@0.15.39': + resolution: {integrity: sha512-WXtlo88ith5m22qB+qiGw301/Zb9r5pYr4QdXWmlXnRNqwST5MGmJWhG+/RVrzc+OG7kSb3z1gkVNv+2X/Y0Gg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + react: '*' + + '@solana/wallet-adapter-safepal@0.5.22': + resolution: {integrity: sha512-K1LlQIPoKgg3rdDIVUtMV218+uUM1kCtmuVKq2N+e+ZC8zK05cW3w7++nakDtU97AOmg+y4nsSFRCFsWBWmhTw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-saifu@0.1.19': + resolution: {integrity: sha512-RWguxtKSXTZUNlc7XTUuMi78QBjy5rWcg7Fis3R8rfMtCBZIUZ/0nPb/wZbRfTk3OqpvnwRQl89TC9d2P7/SvA==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-salmon@0.1.18': + resolution: {integrity: sha512-YN2/j5MsaurrlVIijlYA7SfyJU6IClxfmbUjQKEuygq0eP6S7mIAB/LK7qK2Ut3ll5vyTq/5q9Gejy6zQEaTMg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-sky@0.1.19': + resolution: {integrity: sha512-jJBAg5TQLyPUSFtjne3AGxUgGV8cxMicJCdDFG6HalNK6N9jAB9eWfPxwsGRKv2RijXVtzo3/ejzcKrGp3oAuQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-solflare@0.6.33': + resolution: {integrity: sha512-eYDjpXMF+LyfWf5jG89IqJG2ehaEsWvv7P3y3NjPmhCqe0WjfFc2EwED19G4R0JUqdhnY5zFj+gn3pJ3ystGhg==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-solong@0.9.22': + resolution: {integrity: sha512-lGTwQmHQrSTQp3OkYUbfzeFCDGi60ScOpgfC0IOZNSfWl7jwG5tnRXAJ4A1RG9Val9XcVe5b2biur2hyEMJlSQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-spot@0.1.19': + resolution: {integrity: sha512-p7UgT+4+2r82YIJ+NsniNrXKSaYNgrM43FHkjdVVmEw69ZGvSSXJ3x108bCE9pshy6ldl+sb7VhJGg+uQ/OF9g==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-tokenary@0.1.16': + resolution: {integrity: sha512-7FrDcRrXogCn13Ni2vwA1K/74RMLq+n37+j5fW0KtU2AEA6QVPqPgl/o0rRRgwdaG1q6EM3BXfgscYkmMTlxQQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-tokenpocket@0.4.23': + resolution: {integrity: sha512-5/sgNj+WK0I+0+pMB8CmTPhRbImXJ8ZcqfO8+i2uHbmKwU+zddPFDT4Fin/Gm9AX/n//M+5bxhhN4FpnA9oM8w==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-torus@0.11.32': + resolution: {integrity: sha512-LHvCNIL3tvD3q3EVJ1VrcvqIz7JbLBJcvpi5+PwG6DQzrRLHJ7oxOHFwc1SUX41WwifQHKI+lXWlTrVpIOgDOA==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-trezor@0.1.6': + resolution: {integrity: sha512-jItXhzaNq/UxSSPKVxgrUamx4mr2voMDjcEBHVUqOQhcujmzoPpBSahWKgpsDIegeX6zDCmuTAULnTpLs6YuzA==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-trust@0.1.17': + resolution: {integrity: sha512-raVtYoemFxrmsq8xtxhp3mD1Hke7CJuPqZsYr20zODjM1H2N+ty6zQa7z9ApJtosYNHAGek5S1/+n4/gnrC4nQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-unsafe-burner@0.1.11': + resolution: {integrity: sha512-VyRQ2xRbVcpRSPTv+qyxOYFtWHxrVlLiH2nIuqIRCZcmGkFmxr+egwMjCCIURS6KCX7Ye3AbHK8IWJX6p9yuFQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-walletconnect@0.1.21': + resolution: {integrity: sha512-OE2ZZ60RbeobRsCa2gTD7IgXqofSa5B+jBLUu0DO8TVeRWro40JKYJuUedthALjO5oLelWSpcds+i7PRL+RQcQ==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-wallets@0.19.38': + resolution: {integrity: sha512-uwWP3DZe8uG9X80SMHo8+NvXaat8ChBnZExTcvQVQhxhvzsYdS04YyVhCiU0zFyPpmkZuBCsArHXDQnFr1XhjA==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-adapter-xdefi@0.1.11': + resolution: {integrity: sha512-WzhzhNtA4ECX9ZMyAyZV8TciuwvbW8VoJWwF+hdts5xHfnitRJDR/17Br6CQH0CFKkqymVHCMWOBIWEjmp+3Rw==} + engines: {node: '>=20'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/wallet-standard-chains@1.1.2': + resolution: {integrity: sha512-EZobEGclDBAFplpJC5F3d/s8Xnlqc5isNKuPrd5o9ZPZ7tWN84O0e68yIZ8MAOj9V7ieRadNiHtql7uIXCTyXg==} + engines: {node: '>=22'} + + '@solana/wallet-standard-features@1.4.0': + resolution: {integrity: sha512-f0tAdqwM2aL6CiFbIgt9h5zKFp+mgY/iNGwoxPMTj9VSTeQj7d1GGSmWhZw0XWoZ4N/1tnKTKmYFq+Dyq08jRw==} + engines: {node: '>=22'} + + '@solana/wallet-standard-util@1.1.3': + resolution: {integrity: sha512-aweR5y5FjYaeS9TkoqAWERFpGUj2MJepsDhcekCuoPLcNCquJL85Nsnuy01tBybspN5+Y09SWkxwsODOFGSfkg==} + engines: {node: '>=22'} + + '@solana/wallet-standard-wallet-adapter-base@1.1.5': + resolution: {integrity: sha512-dbk+4mJAsZ1a2R/v5/Qvp6SleviuSNWd9LnuQ0ekH0HRRJTOWyTBJsdQsVDdAymdPnLAaIN5J10ni1CT2Z+ERg==} + engines: {node: '>=22'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + bs58: ^6.0.0 + + '@solana/wallet-standard-wallet-adapter-react@1.1.5': + resolution: {integrity: sha512-JfKBU2Mc332pR+9xhxjr5U/Q2aL03mMmSbrcnvfvAjML6zUEzAQ/bV6DchRsdtAT8Rx0zEg8h4OhsXbmteu0Yg==} + engines: {node: '>=22'} + peerDependencies: + '@solana/wallet-adapter-base': '*' + react: '*' + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + + '@solflare-wallet/sdk@1.4.2': + resolution: {integrity: sha512-jrseNWipwl9xXZgrzwZF3hhL0eIVxuEtoZOSLmuPuef7FgHjstuTtNJAeT4icA7pzdDV4hZvu54pI2r2f7SmrQ==} + peerDependencies: + '@solana/web3.js': '*' + + '@stellar/js-xdr@3.1.2': + resolution: {integrity: sha512-VVolPL5goVEIsvuGqDc5uiKxV03lzfWdvYg1KikvwheDmTBO68CKDji3bAZ/kppZrx5iTA8z3Ld5yuytcvhvOQ==} + + '@stellar/stellar-base@14.1.0': + resolution: {integrity: sha512-A8kFli6QGy22SRF45IjgPAJfUNGjnI+R7g4DF5NZYVsD1kGf7B4ITyc4OPclLV9tqNI4/lXxafGEw0JEUbHixw==} + engines: {node: '>=20.0.0'} + deprecated: This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support. + + '@stellar/stellar-sdk@14.2.0': + resolution: {integrity: sha512-7nh2ogzLRMhfkIC0fGjn1LHUzk3jqVw8tjAuTt5ADWfL9CSGBL18ILucE9igz2L/RU2AZgeAvhujAnW91Ut/oQ==} + engines: {node: '>=20.0.0'} + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@toruslabs/base-controllers@5.11.0': + resolution: {integrity: sha512-5AsGOlpf3DRIsd6PzEemBoRq+o2OhgSFXj5LZD6gXcBlfe0OpF+ydJb7Q8rIt5wwpQLNJCs8psBUbqIv7ukD2w==} + engines: {node: '>=18.x', npm: '>=9.x'} + peerDependencies: + '@babel/runtime': 7.x + + '@toruslabs/broadcast-channel@10.0.2': + resolution: {integrity: sha512-aZbKNgV/OhiTKSdxBTGO86xRdeR7Ct1vkB8yeyXRX32moARhZ69uJQL49jKh4cWKV3VeijrL9XvKdn5bzgHQZg==} + engines: {node: '>=18.x', npm: '>=9.x'} + + '@toruslabs/constants@13.4.0': + resolution: {integrity: sha512-CjmnMQ5Oj0bqSBGkhv7Xm3LciGJDHwe4AJ1LF6mijlP+QcCnUM5I6kVp60j7zZ/r0DT7nIEiuHHHczGpCZor0A==} + engines: {node: '>=18.x', npm: '>=9.x'} + peerDependencies: + '@babel/runtime': 7.x + + '@toruslabs/eccrypto@4.0.0': + resolution: {integrity: sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==} + engines: {node: '>=18.x', npm: '>=9.x'} + + '@toruslabs/http-helpers@6.1.1': + resolution: {integrity: sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==} + engines: {node: '>=18.x', npm: '>=9.x'} + peerDependencies: + '@babel/runtime': ^7.x + '@sentry/types': ^7.x + peerDependenciesMeta: + '@sentry/types': + optional: true + + '@toruslabs/metadata-helpers@5.1.0': + resolution: {integrity: sha512-7fdqKuWUaJT/ng+PlqrA4XKkn8Dij4JJozfv/4gHTi0f/6JFncpzIces09jTV70hCf0JIsTCvIDlzKOdJ+aeZg==} + engines: {node: '>=18.x', npm: '>=9.x'} + peerDependencies: + '@babel/runtime': 7.x + + '@toruslabs/openlogin-jrpc@8.3.0': + resolution: {integrity: sha512-1OdSkUXGXJobkkMIJHuf+XzwmUB4ROy6uQfPEJ3NXvNj84+N4hNpvC4JPg7VoWBHdfCba9cv6QnQsVArlwai4A==} + engines: {node: '>=18.x', npm: '>=9.x'} + peerDependencies: + '@babel/runtime': 7.x + + '@toruslabs/openlogin-utils@8.2.1': + resolution: {integrity: sha512-NSOtj61NZe7w9qbd92cYwMlE/1UwPGtDH02NfUjoEEc3p1yD5U2cLZjdSwsnAgjGNgRqVomXpND4hii12lI/ew==} + engines: {node: '>=18.x', npm: '>=9.x'} + peerDependencies: + '@babel/runtime': 7.x + + '@toruslabs/solana-embed@2.1.0': + resolution: {integrity: sha512-rgZniKy+yuqJp8/Z/RcqzhTL4iCH+4nP55XD5T2nEIajAClsmonsGp24AUqYwEqu+7x2hjumZEh+12rUv+Ippw==} + engines: {node: '>=18.x', npm: '>=9.x'} + deprecated: This sdk is now deprecated. Please use @web3auth/ws-embed instead + peerDependencies: + '@babel/runtime': 7.x + + '@trezor/analytics@1.5.0': + resolution: {integrity: sha512-evILW5XJEmfPlf0TY1duOLtGJ47pdGeSKVE3P75ODEUsRNxtPVqlkOUBPmYpCxPnzS8XDmkatT8lf9/DF0G6nA==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/blockchain-link-types@1.5.1': + resolution: {integrity: sha512-Idavz6LwLBW8sXc69fh5AJEnl666EDl2Nt3io7updvBgOR0/P12I900DgjNhCKtiWuv66A33/5RE7zLcj3lfnw==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/blockchain-link-utils@1.5.2': + resolution: {integrity: sha512-OSS5OEE98FMnYfjoEALPjBt7ebjC/FKnq3HOolHdEWXBpVlXZNN2+Vo1R9J6WbZUU087sHuUTJJy/GJYWY13Tg==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/blockchain-link@2.6.2': + resolution: {integrity: sha512-HMz+Dm6nMflqRkaebMqpv3uNnVkRrb6lD2HKTHNBGhjVbqf0wRzJ8JoQ08wn/sF00ljJZz8pGnpcMYHJNxE+wQ==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/connect-analytics@1.4.0': + resolution: {integrity: sha512-hy2J2oeIhRC/e1bOWXo5dsVMVnDwO2UKnxhR6FD8PINR3jgM6PWAXc6k33WJsBcyiTzwMP7/xPysLcgNJH5o4w==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/connect-common@0.5.1': + resolution: {integrity: sha512-wdpVCwdylBh4SBO5Ys40tB/d59UlfjmxgBHDkkLgaR+JcqkthCfiw5VlUrV9wu65lquejAZhA5KQL4mUUUhCow==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/connect-web@9.7.3': + resolution: {integrity: sha512-oTI/v9sUJMvLZgLa0seSGyPaumXydRYeAT4OVTQxIaEiL1hOA0yH+UvEfT4WKwxbxOtOqWosD8chP3uuWSArcg==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/connect@9.7.3': + resolution: {integrity: sha512-oAOfvJHT8tPqOXTmCOhn8uTZcoqSDuWAiWXQegx7C46tq+NLg+enkYXxUYEHq/9PmfZAOrUT9VMxZDsXM2thkA==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/crypto-utils@1.2.0': + resolution: {integrity: sha512-9i1NrfW1IE6JO910ut7xrx4u5LxE++GETbpJhWLj4P5xpuGDDSDLEn/MXaYisls2DpE897aOrGPaa1qyt8V6tw==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/device-authenticity@1.1.2': + resolution: {integrity: sha512-313uSXYR4XKDv3CjtCpgHA+yEe9xxqN7EFl/D68FEn70SPsuWI0+2zUvjPPh6TIOh/EcLv7hCO/QTHUAGd7ZWQ==} + + '@trezor/device-utils@1.2.0': + resolution: {integrity: sha512-Aqp7pIooFTx21zRUtTI6i1AS4d9Lrx7cclvksh2nJQF9WJvbzuCXshEGkLoOsHwhQrCl3IXfbGuMdA12yDenPA==} + + '@trezor/env-utils@1.5.0': + resolution: {integrity: sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==} + peerDependencies: + expo-constants: '*' + expo-localization: '*' + react-native: '*' + tslib: ^2.6.2 + peerDependenciesMeta: + expo-constants: + optional: true + expo-localization: + optional: true + react-native: + optional: true + + '@trezor/protobuf@1.5.2': + resolution: {integrity: sha512-zViaL1jKue8DUTVEDg0C/lMipqNMd/Z3kr29/+MeZOoupjaXIQ2Lqp3WAMe8hvNTKKX8aNQH9JrbapJ6w9FMXw==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/protobuf@1.5.3': + resolution: {integrity: sha512-ZYQtapkT2NaiVrAgb91Zprnk3uhl2Wca0bsnJcWgE7vwzqKegjrSorRnkZLqLTKTbCaT6sgkCYtM2hPl4Hqw5Q==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/protocol@1.3.1': + resolution: {integrity: sha512-uNJ83n38+BM+AJKsWza1ocvQ206d6NXJQ8/g+DelPLTj5c37Rj6hFiY5Nb5zgM7DBnq6T8Aa2K8t4TVCzHT1qg==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/schema-utils@1.4.0': + resolution: {integrity: sha512-K7upSeh7VDrORaIC4KAxYVW93XNlohmUnH5if/5GKYmTdQSRp1nBkO6Jm+Z4hzIthdnz/1aLgnbeN3bDxWLRxA==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/transport@1.6.3': + resolution: {integrity: sha512-GEi9KfiJsBgT/MCGNDIn9RDeXceLaAPjJT/GCayirXaCr3KnlpZCs6LGYkrjqapxiBm73nxM+BctKBKhpUl2cQ==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/type-utils@1.2.0': + resolution: {integrity: sha512-+E2QntxkyQuYfQQyl8RvT01tq2i5Dp/LFUOXuizF+KVOqsZBjBY43j5hewcCO3+MokD7deDiPyekbUEN5/iVlw==} + + '@trezor/utils@9.5.0': + resolution: {integrity: sha512-kdyMyDbxzvOZmwBNvTjAK+C/kzyOz8T4oUbFvq+KaXn5mBFf1uf8rq5X2HkxgdYRPArtHS3PxLKsfkNCdhCYtQ==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/utxo-lib@2.5.0': + resolution: {integrity: sha512-Fa2cZh0037oX6AHNLfpFIj65UR/OoX0ZJTocFuQASe77/1PjZHysf6BvvGfmzuFToKfrAQ+DM/1Sx+P/vnyNmA==} + peerDependencies: + tslib: ^2.6.2 + + '@trezor/websocket-client@1.3.0': + resolution: {integrity: sha512-9KQSaVc3NtmM6rFFj1e+9bM0C5mVKVidbnxlfzuBJu7G2YMRdIdLPcAXhvmRZjs40uzDuBeApK+p547kODz2ug==} + peerDependencies: + tslib: ^2.6.2 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/w3c-web-usb@1.0.14': + resolution: {integrity: sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==} + + '@types/web@0.0.197': + resolution: {integrity: sha512-V4sOroWDADFx9dLodWpKm298NOJ1VJ6zoDVgaP+WBb/utWxqQ6gnMzd9lvVDAr/F3ibiKaxH9i45eS0gQPSTaQ==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@wallet-standard/app@1.1.1': + resolution: {integrity: sha512-WDGwoByhP5gwHH01r5EaLgQdLVkACPCdOMQhmhn8rsm10h/siSgTorShzBxrn0ExSPof+Lu+C3TfgqBrPa1xoQ==} + engines: {node: '>=22'} + + '@wallet-standard/base@1.1.1': + resolution: {integrity: sha512-gggIHTtxicF9XFMQ12DkfS6NAG92Ak795JeSA7f2whAQ6Y3AkMWWuCMxSZXG2NIPN42kEaZSNVjqMsJRaJRxMQ==} + engines: {node: '>=22'} + + '@wallet-standard/core@1.1.2': + resolution: {integrity: sha512-QcVLGDkFtsWjTpkej2jx4FyP2cu+qOAW/lVnvlWjyhCkSEje6z+vEKURV5v+7L6IXjbze5pyFBe24yrPyoUuyw==} + engines: {node: '>=22'} + + '@wallet-standard/errors@0.1.2': + resolution: {integrity: sha512-oEzKUqJefKby6wcIvaJgrSEe/uNn/rnqkJ0P/85K+h0i5Tdo9E3L22VWq/j5K1e8hHMnZd6LgaIr8m/Wn7X/Ng==} + engines: {node: '>=22'} + hasBin: true + + '@wallet-standard/features@1.1.1': + resolution: {integrity: sha512-aCWYmVeSCGViyEU5k7GMoW8zxE4Gs+C1s1Pp2XLesvSNlnZ4PMES9HUnTB3hl0b3RVj7C61yze3IWyrncqg4MA==} + engines: {node: '>=22'} + + '@wallet-standard/wallet@1.1.1': + resolution: {integrity: sha512-8WiRPaKk/wNNRZhB2eVhpR/JW7/aqTCMoZhgVUCujuzDmxxmGvsosMxdCG4NAdYkoyozAHCX8/xLtlWUn5mNdQ==} + engines: {node: '>=22'} + + '@walletconnect/core@2.19.0': + resolution: {integrity: sha512-AEoyICLHQEnjijZr9XsL4xtFhC5Cmu0RsEGxAxmwxbfGvAcYcSCNp1fYq0Q6nHc8jyoPOALpwySTle300Y1vxw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.19.1': + resolution: {integrity: sha512-rMvpZS0tQXR/ivzOxN1GkHvw3jRRMlI/jRX5g7ZteLgg2L0ZcANsFvAU5IxILxIKcIkTCloF9TcfloKVbK3qmw==} + engines: {node: '>=18'} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.19.0': + resolution: {integrity: sha512-+GkuJzPK9SPq+RZgdKHNOvgRagxh/hhYWFHOeSiGh3DyAQofWuFTq4UrN/MPjKOYswSSBKfIa+iqKYsi4t8zLQ==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.19.1': + resolution: {integrity: sha512-OgBHRPo423S02ceN3lAzcZ3MYb1XuLyTTkKqLmKp/icYZCyRzm3/ynqJDKndiBLJ5LTic0y07LiZilnliYqlvw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/solana-adapter@0.0.8': + resolution: {integrity: sha512-Qb7MT8SdkeBldfUCmF+rYW6vL98mxPuT1yAwww5X2vpx7xEPZvFCoAKnyT5fXu0v56rMxhW3MGejnHyyYdDY7Q==} + peerDependencies: + '@solana/wallet-adapter-base': 0.x + '@solana/web3.js': 1.x + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.19.0': + resolution: {integrity: sha512-Ttse3p3DCdFQ/TRQrsPMQJzFr7cb/2AF5ltLPzXRNMmapmGydc6WO8QU7g/tGEB3RT9nHcLY2aqlwsND9sXMxA==} + + '@walletconnect/types@2.19.1': + resolution: {integrity: sha512-XWWGLioddH7MjxhyGhylL7VVariVON2XatJq/hy0kSGJ1hdp31z194nHN5ly9M495J9Hw8lcYjGXpsgeKvgxzw==} + + '@walletconnect/universal-provider@2.19.0': + resolution: {integrity: sha512-e9JvadT5F8QwdLmd7qBrmACq04MT7LQEe1m3X2Fzvs3DWo8dzY8QbacnJy4XSv5PCdxMWnua+2EavBk8nrI9QA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.19.1': + resolution: {integrity: sha512-4rdLvJ2TGDIieNWW3sZw2MXlX65iHpTuKb5vyvUHQtjIVNLj+7X/09iUAI/poswhtspBK0ytwbH+AIT/nbGpjg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/utils@2.19.0': + resolution: {integrity: sha512-LZ0D8kevknKfrfA0Sq3Hf3PpmM8oWyNfsyWwFR51t//2LBgtN2Amz5xyoDDJcjLibIbKAxpuo/i0JYAQxz+aPA==} + + '@walletconnect/utils@2.19.1': + resolution: {integrity: sha512-aOwcg+Hpph8niJSXLqkU25pmLR49B8ECXp5gFQDW5IeVgXHoOoK7w8a79GBhIBheMLlIt1322sTKQ7Rq5KzzFg==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + '@xrplf/isomorphic@1.0.2': + resolution: {integrity: sha512-ncZUdMXr6VlSXtdoiDi0jTH+gBrgGxwVeEidhoegII3PmyErbQsyj6e+j7acmR4LW/lvBkPkzb9QzRfJH0n3rA==} + engines: {node: '>=18.0.0'} + + '@xrplf/secret-numbers@2.0.0': + resolution: {integrity: sha512-z3AOibRTE9E8MbjgzxqMpG1RNaBhQ1jnfhNCa1cGf2reZUJzPMYs4TggQTc7j8+0WyV3cr7y/U8Oz99SXIkN5Q==} + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + autoprefixer@10.5.4: + resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + + babel-plugin-syntax-hermes-parser@0.36.0: + resolution: {integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + base32.js@0.1.0: + resolution: {integrity: sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==} + engines: {node: '>=0.12.0'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64url@3.0.1: + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} + + baseline-browser-mapping@2.11.3: + resolution: {integrity: sha512-sbT0Ui/CZwyAyy7icT1Gw5P1LKRlFaHwaF6tDCW5YHq2X5SeeZFphBuIagopSfwSSZq3sQcbmEL072yphxm7ew==} + engines: {node: '>=6.0.0'} + hasBin: true + + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + big-integer@1.6.36: + resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} + engines: {node: '>=0.6'} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + bignumber.js@10.0.2: + resolution: {integrity: sha512-E8Wp9O06QA6lneJ4aRUXKYf/1GIomqUEmUMwtIOMtDxf1U52ffJY+y7JBk/8wRafA8qOIqLnXQGqonYXZdBnFQ==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bip66@2.0.0: + resolution: {integrity: sha512-kBG+hSpgvZBrkIm9dt5T1Hd/7xGCPEX2npoxAWZfsK1FvjgaxySEh2WizjyIstWXriKo9K9uJ4u0OnsyLDUPXQ==} + + bitcoin-ops@1.4.1: + resolution: {integrity: sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==} + + blake-hash@2.0.0: + resolution: {integrity: sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==} + engines: {node: '>= 10'} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bn.js@4.12.5: + resolution: {integrity: sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==} + + bn.js@5.2.5: + resolution: {integrity: sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.6: + resolution: {integrity: sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==} + engines: {node: '>= 0.10'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + bs58check@4.0.0: + resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + + cashaddrjs@0.4.4: + resolution: {integrity: sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==} + + cbor-sync@1.0.4: + resolution: {integrity: sha512-GWlXN4wiz0vdWWXBU71Dvc1q3aBo0HytqwAZnXF1wOwjqNnDWA1vZ1gDMFLlqohak31VQzmhiYfiCX5QSSfagA==} + + cbor@10.0.12: + resolution: {integrity: sha512-exQDevYd7ZQLP4moMQcZkKCVZsXLAtUSflObr3xTh4xzFIv/xBCdvCd6L259kQOUP2kcTC0jvC6PpZIf/WmRXA==} + engines: {node: '>=20'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-edge-launcher@0.3.0: + resolution: {integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} + engines: {node: '>= 0.10'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + + crypto-hash@1.3.0: + resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} + engines: {node: '>=8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + detect-europe-js@0.1.2: + resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + draggabilly@3.0.0: + resolution: {integrity: sha512-aEs+B6prbMZQMxc9lgTpCBfyCUhRur/VFucHhIOvlvvdARTj7TcDmX/cdOUtqbjJJUh7+agyJXR5Z6IFe1MxwQ==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.396: + resolution: {integrity: sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.6: + resolution: {integrity: sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ev-emitter@2.1.2: + resolution: {integrity: sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + exenv@1.2.2: + resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fb-dotslash@0.5.8: + resolution: {integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==} + engines: {node: '>=20'} + hasBin: true + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + feaxios@0.0.23: + resolution: {integrity: sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-size@3.0.0: + resolution: {integrity: sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hermes-compiler@250829098.0.14: + resolution: {integrity: sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==} + + hermes-estree@0.35.0: + resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + + hermes-estree@0.36.0: + resolution: {integrity: sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==} + + hermes-parser@0.35.0: + resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + + hermes-parser@0.36.0: + resolution: {integrity: sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + idb-keyval@6.3.0: + resolution: {integrity: sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + int64-buffer@1.1.1: + resolution: {integrity: sha512-xp/v0/im2q7n7ISFJXcYsr/aVsUdZKPUZS1uYtoM9I9Cfmm5YuAi7SQts2TrEXwAKIE0wyn3KxJbo35goJgvwQ==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ip-address@10.3.1: + resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==} + engines: {node: '>= 12'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@3.0.0: + resolution: {integrity: sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==} + engines: {node: '>=12'} + + is-standalone-pwa@0.1.1: + resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + + jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} + engines: {node: '>=8'} + hasBin: true + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsbi@3.2.5: + resolution: {integrity: sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==} + + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + + jsqr@1.4.0: + resolution: {integrity: sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.3: + resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==} + + lit@3.1.0: + resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + long@5.2.5: + resolution: {integrity: sha512-e0r9YBBgNCq1D1o5Dp8FMH0N5hsFtXDBiVa0qoJPHpakvZkmDKPRoGffZJII/XsHvj9An9blm+cRJ01yQqU+Dw==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + metro-babel-transformer@0.84.4: + resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache-key@0.84.4: + resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-cache@0.84.4: + resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-config@0.84.4: + resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-core@0.84.4: + resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-file-map@0.84.4: + resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-minify-terser@0.84.4: + resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-resolver@0.84.4: + resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-runtime@0.84.4: + resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-source-map@0.84.4: + resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-symbolicate@0.84.4: + resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + + metro-transform-plugins@0.84.4: + resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro-transform-worker@0.84.4: + resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + metro@0.84.4: + resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.28.0: + resolution: {integrity: sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==} + + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + + node-addon-api@8.9.0: + resolution: {integrity: sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==} + engines: {node: ^18 || ^20 || >= 21} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + + node-stdlib-browser@1.3.1: + resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} + engines: {node: '>=10'} + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + ob1@0.84.4: + resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + oblivious-set@1.4.0: + resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} + engines: {node: '>=16'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + ox@0.14.32: + resolution: {integrity: sha512-EPB214GvtsP2TtAYZXkNdizLzGp6PXtfaHcRrD4pcBk/D0Y7ZCNv71QgwrjeCsZ+82moVeMlZZG+NDEIUfxMpw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + pako@2.2.0: + resolution: {integrity: sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==} + + parse-asn1@5.1.9: + resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} + engines: {node: '>= 0.10'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pbkdf2@3.1.6: + resolution: {integrity: sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==} + engines: {node: '>= 0.10'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} + engines: {node: ^10 || ^12 || >=14} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + + protobufjs@7.5.5: + resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} + engines: {node: '>=12.0.0'} + + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + pushdata-bitcoin@1.0.1: + resolution: {integrity: sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==} + + qr.js@0.0.0: + resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} + + qrcode.react@1.0.1: + resolution: {integrity: sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg==} + peerDependencies: + react: ^15.5.3 || ^16.0.0 || ^17.0.0 + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-modal@3.16.3: + resolution: {integrity: sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 + react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 + + react-native@0.86.0: + resolution: {integrity: sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + hasBin: true + peerDependencies: + '@react-native/jest-preset': 0.86.0 + '@types/react': ^19.1.1 + react: ^19.2.3 + peerDependenciesMeta: + '@react-native/jest-preset': + optional: true + '@types/react': + optional: true + + react-qr-reader@2.2.1: + resolution: {integrity: sha512-EL5JEj53u2yAOgtpAKAVBzD/SiKWn0Bl7AZy6ZrSf1lub7xHwtaXe6XSx36Wbhl1VMGmvmrwYMRwO1aSCT2fwA==} + peerDependencies: + react: ~16 + react-dom: ~16 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + + ripple-address-codec@5.0.1: + resolution: {integrity: sha512-JQHLKuVJV8lv9Qobmn4aUM2Dpv9WRRLKnNWfM8tN02fAbUtG8mUPsu9q9UYX8P76G4qzytEc5ZKMp/3JggNYmw==} + engines: {node: '>= 18'} + + ripple-binary-codec@2.8.0: + resolution: {integrity: sha512-+NKnOi3hdzjm5dDpoZLUEaYon1jahPlSGnp3YrDoNMSR09ICEqgupN5wpEkPuqJvV75PF/g+W1QUwIXVzbEe7w==} + engines: {node: '>= 18'} + + ripple-keypairs@2.0.0: + resolution: {integrity: sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==} + engines: {node: '>= 16'} + + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rpc-websockets@9.3.9: + resolution: {integrity: sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==} + + rtcpeerconnection-shim@1.2.15: + resolution: {integrity: sha512-C6DxhXt7bssQ1nHb154lqeL0SXz5Dx4RczXZu2Aa/L1NJFnEVDxFwCBo3fqtuljhHIGceg5JKBV4XJ0gW5JKyw==} + engines: {node: '>=6.0.0', npm: '>=3.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + salmon-adapter-sdk@1.1.1: + resolution: {integrity: sha512-28ysSzmDjx2AbotxSggqdclh9MCwlPJUldKkCph48oS5Xtwu0QOg8T9ZRHS2Mben4Y8sTq6VvxXznKssCYFBJA==} + peerDependencies: + '@solana/web3.js': ^1.44.3 + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + sdp@2.12.0: + resolution: {integrity: sha512-jhXqQAQVM+8Xj5EjJGVweuEzgtGWb3tmEEpl3CLP3cStInSbVHSg0QWOGQzNq8pSID4JkpeV2mPqlMDLrm0/Vw==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.7: + resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} + engines: {node: '>=10.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + terser@5.49.0: + resolution: {integrity: sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==} + engines: {node: '>=10'} + hasBin: true + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tiny-secp256k1@1.1.7: + resolution: {integrity: sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==} + engines: {node: '>=6.0.0'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-is-frozen@0.1.2: + resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==} + + ua-parser-js@2.0.10: + resolution: {integrity: sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw==} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + uint8array-tools@0.0.8: + resolution: {integrity: sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==} + engines: {node: '>=14.0.0'} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.29.0: + resolution: {integrity: sha512-vamA8dGlzMwhpyYpQp9d8vka3o4D/yn5I7ez7Or+msDA4bZ8Uh+Zy91WvWf3I73gDAkFha9JcYRqm2li0Npfgg==} + + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} + + unidragger@3.0.1: + resolution: {integrity: sha512-RngbGSwBFmqGBWjkaH+yB677uzR95blSQyxq6hYbrQCejH3Mx1nm8DVOuh3M9k2fQyTstWUG5qlgCnNqV/9jVw==} + + unload@2.4.1: + resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + usb@2.18.0: + resolution: {integrity: sha512-klAJPUTaSxRvTgrIh7om6UTrgRxdzioD+rJc/MaoiN8+OGdqRzai39tR00asnoCesPNikItWB9zBZoo0pJsWaA==} + engines: {node: '>=12.22.0 <13.0 || >=14.17.0'} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@14.0.1: + resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + uuidv4@6.2.13: + resolution: {integrity: sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + varuint-bitcoin@2.0.0: + resolution: {integrity: sha512-6QZbU/rHO2ZQYpWFDALCDSRsXbAs1VOEmXAxtbtjLtKuMJ/FQ8YbhfxlaiKv5nklci0M6lZtlZyxo9Q+qNnyog==} + + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.55.8: + resolution: {integrity: sha512-BHqtsmK4iMLuLnRyrPIB1jVrmFVliRIP/K0dnFT7gBOpfo8Ko4ozhkzUCRNfR+Z/ZZdnlnVrh04fAOuIm5Svkg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-plugin-node-polyfills@0.22.0: + resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webrtc-adapter@7.7.1: + resolution: {integrity: sha512-TbrbBmiQBL9n0/5bvDdORc6ZfRY/Z7JnEj+EYOD1ghseZdpJ+nF2yx14k3LgQKc7JZnG7HAcL+zHnY25So9d7A==} + engines: {node: '>=6.0.0', npm: '>=3.10.0'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wif@5.0.0: + resolution: {integrity: sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.21.1: + resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xrpl@4.4.3: + resolution: {integrity: sha512-vi2OjuNkiaP8nv1j+nqHp8GZwwEjO6Y8+j/OuVMg6M4LwXEwyHdIj33dlg7cyY1Lw5+jb9HqFOQvABhaywVbTQ==} + engines: {node: '>=18.0.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + +snapshots: + + '@adraffy/ens-normalize@1.11.1': {} + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.7 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@coral-xyz/anchor-errors@0.30.1': {} + + '@coral-xyz/anchor@0.30.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@coral-xyz/anchor-errors': 0.30.1 + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@noble/hashes': 1.8.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bn.js: 5.2.5 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + pako: 2.2.0 + snake-case: 3.0.4 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bn.js: 5.2.5 + buffer-layout: 1.2.2 + + '@emurgo/cardano-serialization-lib-browser@13.2.1': {} + + '@emurgo/cardano-serialization-lib-nodejs@13.2.0': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@ethereumjs/common@10.1.2': + dependencies: + '@ethereumjs/util': 10.1.2 + eventemitter3: 5.0.4 + + '@ethereumjs/rlp@10.1.2': {} + + '@ethereumjs/rlp@5.0.2': {} + + '@ethereumjs/tx@10.1.2': + dependencies: + '@ethereumjs/common': 10.1.2 + '@ethereumjs/rlp': 10.1.2 + '@ethereumjs/util': 10.1.2 + '@noble/curves': 2.2.0 + '@noble/hashes': 2.2.0 + + '@ethereumjs/util@10.1.2': + dependencies: + '@ethereumjs/rlp': 10.1.2 + '@noble/curves': 2.2.0 + '@noble/hashes': 2.2.0 + + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + + '@fivebinaries/coin-selection@3.0.0': + dependencies: + '@emurgo/cardano-serialization-lib-browser': 13.2.1 + '@emurgo/cardano-serialization-lib-nodejs': 13.2.0 + + '@fractalwagmi/popup-connection@1.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@fractalwagmi/solana-wallet-adapter@0.1.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@fractalwagmi/popup-connection': 1.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + bs58: 5.0.0 + transitivePeerDependencies: + - '@solana/web3.js' + - react + - react-dom + + '@isaacs/ttlcache@1.4.1': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.43 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@keystonehq/alias-sampling@0.1.2': {} + + '@keystonehq/bc-ur-registry-sol@0.9.5': + dependencies: + '@keystonehq/bc-ur-registry': 0.7.1 + bs58check: 2.1.2 + uuid: 8.3.2 + + '@keystonehq/bc-ur-registry@0.5.4': + dependencies: + '@ngraveio/bc-ur': 1.1.13 + bs58check: 2.1.2 + tslib: 2.8.1 + + '@keystonehq/bc-ur-registry@0.7.1': + dependencies: + '@ngraveio/bc-ur': 1.1.13 + bs58check: 2.1.2 + tslib: 2.8.1 + + '@keystonehq/sdk@0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@ngraveio/bc-ur': 1.1.13 + qrcode.react: 1.0.1(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-modal: 3.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-qr-reader: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rxjs: 6.6.7 + + '@keystonehq/sol-keyring@0.20.0(bufferutil@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@keystonehq/bc-ur-registry': 0.5.4 + '@keystonehq/bc-ur-registry-sol': 0.9.5 + '@keystonehq/sdk': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bs58: 5.0.0 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - react + - react-dom + - typescript + - utf-8-validate + + '@ledgerhq/devices@8.16.0': + dependencies: + semver: 7.7.3 + + '@ledgerhq/devices@8.17.0': + dependencies: + semver: 7.7.3 + + '@ledgerhq/errors@6.37.0': {} + + '@ledgerhq/hw-transport-webhid@6.36.0': + dependencies: + '@ledgerhq/devices': 8.16.0 + '@ledgerhq/errors': 6.37.0 + '@ledgerhq/hw-transport': 6.35.5 + '@ledgerhq/logs': 6.17.0 + + '@ledgerhq/hw-transport@6.35.5': + dependencies: + '@ledgerhq/devices': 8.16.0 + '@ledgerhq/errors': 6.37.0 + '@ledgerhq/logs': 6.17.0 + events: 3.3.0 + + '@ledgerhq/hw-transport@6.35.6': + dependencies: + '@ledgerhq/devices': 8.17.0 + '@ledgerhq/errors': 6.37.0 + '@ledgerhq/logs': 6.17.0 + events: 3.3.0 + + '@ledgerhq/logs@6.17.0': {} + + '@lit-labs/ssr-dom-shim@1.6.0': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + + '@mobily/ts-belt@3.13.1': {} + + '@ngraveio/bc-ur@1.1.13': + dependencies: + '@keystonehq/alias-sampling': 0.1.2 + assert: 2.1.0 + bignumber.js: 9.3.1 + cbor-sync: 1.0.4 + crc: 3.8.0 + jsbi: 3.2.5 + sha.js: 2.4.12 + + '@noble/ciphers@1.2.1': {} + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@2.2.0': + dependencies: + '@noble/hashes': 2.2.0 + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.0': {} + + '@noble/hashes@1.7.1': {} + + '@noble/hashes@1.8.0': {} + + '@noble/hashes@2.2.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@particle-network/analytics@1.0.2': + dependencies: + hash.js: 1.1.7 + uuidv4: 6.2.13 + + '@particle-network/auth@1.3.1': + dependencies: + '@particle-network/analytics': 1.0.2 + '@particle-network/chains': 1.8.3 + '@particle-network/crypto': 1.0.1 + buffer: 6.0.3 + draggabilly: 3.0.0 + + '@particle-network/chains@1.8.3': {} + + '@particle-network/crypto@1.0.1': + dependencies: + crypto-js: 4.2.0 + uuidv4: 6.2.13 + + '@particle-network/solana-wallet@1.3.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@particle-network/auth': 1.3.1 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@project-serum/sol-wallet-adapter@0.2.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bs58: 4.0.1 + eventemitter3: 4.0.7 + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + + '@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))': + dependencies: + merge-options: 3.0.4 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6) + optional: true + + '@react-native/assets-registry@0.86.0': {} + + '@react-native/codegen@0.86.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + hermes-parser: 0.36.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + tinyglobby: 0.2.17 + yargs: 17.7.3 + + '@react-native/community-cli-plugin@0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@react-native/dev-middleware': 0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-config: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-core: 0.84.4 + semver: 7.8.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.86.0': {} + + '@react-native/debugger-shell@0.86.0': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3 + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color + + '@react-native/dev-middleware@0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.86.0 + '@react-native/debugger-shell': 0.86.0 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.3.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.86.0': {} + + '@react-native/js-polyfills@0.86.0': {} + + '@react-native/normalize-colors@0.86.0': {} + + '@react-native/virtualized-lists@0.86.0(@types/react@18.3.31)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 18.3.1 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6) + optionalDependencies: + '@types/react': 18.3.31 + + '@reown/appkit-common@1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-polyfills@1.7.2': + dependencies: + buffer: 6.0.3 + + '@reown/appkit-scaffold-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.22.4)': + dependencies: + '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.22.4) + '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + lit: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + lit: 3.1.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.22.4)': + dependencies: + '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.2 + '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.2 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.2 + '@reown/appkit-scaffold-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.22.4) + '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.22.4) + '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.62.2)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.62.2) + estree-walker: 2.0.2 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/pluginutils@5.4.0(rollup@4.62.2)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.5 + optionalDependencies: + rollup: 4.62.2 + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/base@2.2.0': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@sinclair/typebox@0.27.12': {} + + '@sinclair/typebox@0.33.24': {} + + '@socket.io/component-emitter@3.1.2': {} + + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.9(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.9(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/kit': 6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-standard-features': 1.4.0 + '@solana/wallet-standard-util': 1.1.3 + '@wallet-standard/core': 1.1.2 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana-mobile/wallet-adapter-mobile@2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.9(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana-mobile/wallet-standard-mobile': 0.5.3(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-features': 1.4.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@wallet-standard/core': 1.1.2 + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6) + tslib: 2.8.1 + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana-mobile/wallet-standard-mobile@0.5.3(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.9(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + '@wallet-standard/wallet': 1.1.1 + qrcode: 1.5.4 + tslib: 2.8.1 + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)) + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + + '@solana-program/stake@0.2.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + + '@solana-program/system@0.7.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + + '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + + '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))': + dependencies: + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + + '@solana/accounts@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/accounts@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 2.3.0(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/assertions@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/buffer-layout-utils@0.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bigint-buffer: 1.1.5 + bignumber.js: 9.3.1 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-core@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-core@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-data-structures@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-data-structures@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs-strings@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs-strings@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/fixed-points': 6.10.0(typescript@5.9.3) + '@solana/options': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 12.1.0 + typescript: 5.9.3 + + '@solana/errors@2.3.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + typescript: 5.9.3 + + '@solana/errors@6.10.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 15.0.0 + optionalDependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/fixed-points@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/functional@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/functional@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/instructions@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/keys@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 2.3.0(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/keys@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/programs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/kit@6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/accounts': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/instruction-plans': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/offchain-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/plugin-core': 6.10.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/program-client-core': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/programs': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-api': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + '@solana/sysvars': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-confirmation': 6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/nominal-types@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.9.3) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/plugin-interfaces@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instruction-plans': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/program-client-core@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/instruction-plans': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-api': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/promises@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-api@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-api@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-parsed-types@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@2.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/rpc-spec@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions-api@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-api@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) + '@solana/subscribable': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + + '@solana/rpc-subscriptions-channel-websocket@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/promises': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/subscribable': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/rpc-subscriptions-spec@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/promises': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 2.3.0(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/subscribable': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/rpc-subscriptions@6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transformers@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + undici-types: 7.29.0 + + '@solana/rpc-transport-http@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + undici-types: 8.9.0 + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-types@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-types@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/fixed-points': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/rpc-api': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 2.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-transport-http': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/rpc-api': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-transport-http': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/offchain-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.4.15(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/subscribable@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/subscribable@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/sysvars@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 2.3.0(typescript@5.9.3) + '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/transaction-confirmation@6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/rpc': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.10.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-messages@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 2.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 2.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 2.3.0(typescript@5.9.3) + '@solana/functional': 2.3.0(typescript@5.9.3) + '@solana/instructions': 2.3.0(typescript@5.9.3) + '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 2.3.0(typescript@5.9.3) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/wallet-adapter-alpha@0.1.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-avana@0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-base-ui@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + react: 18.3.1 + transitivePeerDependencies: + - bs58 + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-standard-features': 1.4.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + eventemitter3: 5.0.4 + + '@solana/wallet-adapter-bitkeep@0.3.24(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-bitpie@0.5.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-clover@0.4.23(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-coin98@0.5.24(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bs58: 6.0.0 + buffer: 6.0.3 + + '@solana/wallet-adapter-coinbase@0.1.23(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-coinhub@0.3.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-fractal@0.1.12(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@fractalwagmi/solana-wallet-adapter': 0.1.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - react + - react-dom + + '@solana/wallet-adapter-huobi@0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-hyperpay@0.1.18(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-keystone@0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@keystonehq/sol-keyring': 0.20.0(bufferutil@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - react + - react-dom + - typescript + - utf-8-validate + + '@solana/wallet-adapter-krystal@0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-ledger@0.9.29(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@ledgerhq/devices': 8.17.0 + '@ledgerhq/hw-transport': 6.35.6 + '@ledgerhq/hw-transport-webhid': 6.36.0 + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + buffer: 6.0.3 + + '@solana/wallet-adapter-mathwallet@0.9.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-neko@0.2.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-nightly@0.1.20(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-nufi@0.1.21(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-onto@0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-particle@0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@particle-network/solana-wallet': 1.3.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bs58 + + '@solana/wallet-adapter-phantom@0.9.29(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-react-ui@0.9.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@18.3.1(react@18.3.1))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-base-ui': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - bs58 + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana-mobile/wallet-adapter-mobile': 2.2.9(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-wallet-adapter-react': 1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(react@18.3.1) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + react: 18.3.1 + transitivePeerDependencies: + - bs58 + - bufferutil + - fastestsmallesttextencoderdecoder + - react-native + - typescript + - utf-8-validate + + '@solana/wallet-adapter-safepal@0.5.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-saifu@0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-salmon@0.1.18(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + salmon-adapter-sdk: 1.1.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + + '@solana/wallet-adapter-sky@0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-solflare@0.6.33(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solflare-wallet/sdk': 1.4.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + + '@solana/wallet-adapter-solong@0.9.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-spot@0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-tokenary@0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-tokenpocket@0.4.23(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-torus@0.11.32(@babel/runtime@7.29.7)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@toruslabs/solana-embed': 2.1.0(@babel/runtime@7.29.7)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + assert: 2.1.0 + crypto-browserify: 3.12.1 + process: 0.11.10 + stream-browserify: 3.0.0 + transitivePeerDependencies: + - '@babel/runtime' + - '@sentry/types' + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@solana/wallet-adapter-trezor@0.1.6(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@trezor/connect-web': 9.7.3(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + buffer: 6.0.3 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - debug + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - tslib + - typescript + - utf-8-validate + - ws + + '@solana/wallet-adapter-trust@0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-unsafe-burner@0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@noble/curves': 1.9.7 + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-features': 1.4.0 + '@solana/wallet-standard-util': 1.1.3 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-adapter-walletconnect@0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@walletconnect/solana-adapter': 0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@solana/wallet-adapter-wallets@0.19.38(@babel/runtime@7.29.7)(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@types/react@18.3.31)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@18.3.1(react@18.3.1))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1)(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(zod@3.22.4)': + dependencies: + '@solana/wallet-adapter-alpha': 0.1.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-avana': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-bitkeep': 0.3.24(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-bitpie': 0.5.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-clover': 0.4.23(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-coin98': 0.5.24(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-coinbase': 0.1.23(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-coinhub': 0.3.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-fractal': 0.1.12(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@solana/wallet-adapter-huobi': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-hyperpay': 0.1.18(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-keystone': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-krystal': 0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-ledger': 0.9.29(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-mathwallet': 0.9.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-neko': 0.2.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-nightly': 0.1.20(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-nufi': 0.1.21(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-onto': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-particle': 0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-phantom': 0.9.29(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-safepal': 0.5.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-saifu': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-salmon': 0.1.18(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-sky': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-solflare': 0.6.33(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-solong': 0.9.22(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-spot': 0.1.19(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-tokenary': 0.1.16(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-tokenpocket': 0.4.23(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-torus': 0.11.32(@babel/runtime@7.29.7)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/wallet-adapter-trezor': 0.1.6(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-trust': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-unsafe-burner': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@solana/wallet-adapter-xdefi': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/runtime' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@sentry/types' + - '@solana/sysvars' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bs58 + - bufferutil + - db0 + - debug + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - ioredis + - react + - react-dom + - react-native + - supports-color + - tslib + - typescript + - uploadthing + - utf-8-validate + - ws + - zod + + '@solana/wallet-adapter-xdefi@0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/wallet-standard-chains@1.1.2': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@solana/wallet-standard-features@1.4.0': + dependencies: + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + + '@solana/wallet-standard-util@1.1.3': + dependencies: + '@noble/curves': 1.9.7 + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + + '@solana/wallet-standard-wallet-adapter-base@1.1.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-chains': 1.1.2 + '@solana/wallet-standard-features': 1.4.0 + '@solana/wallet-standard-util': 1.1.3 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@wallet-standard/app': 1.1.1 + '@wallet-standard/base': 1.1.1 + '@wallet-standard/features': 1.1.1 + '@wallet-standard/wallet': 1.1.1 + + '@solana/wallet-standard-wallet-adapter-react@1.1.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(react@18.3.1)': + dependencies: + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@wallet-standard/app': 1.1.1 + '@wallet-standard/base': 1.1.1 + react: 18.3.1 + transitivePeerDependencies: + - '@solana/web3.js' + - bs58 + + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.5 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + node-fetch: 2.7.0 + rpc-websockets: 9.3.9 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@solflare-wallet/sdk@1.4.2(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bs58: 5.0.0 + eventemitter3: 5.0.4 + uuid: 9.0.1 + + '@stellar/js-xdr@3.1.2': {} + + '@stellar/stellar-base@14.1.0': + dependencies: + '@noble/curves': 1.9.7 + '@stellar/js-xdr': 3.1.2 + base32.js: 0.1.0 + bignumber.js: 9.3.1 + buffer: 6.0.3 + sha.js: 2.4.12 + + '@stellar/stellar-sdk@14.2.0': + dependencies: + '@stellar/stellar-base': 14.1.0 + axios: 1.18.1 + bignumber.js: 9.3.1 + eventsource: 2.0.2 + feaxios: 0.0.23 + randombytes: 2.1.0 + toml: 3.0.0 + urijs: 1.19.11 + transitivePeerDependencies: + - debug + - supports-color + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + + '@toruslabs/base-controllers@5.11.0(@babel/runtime@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@ethereumjs/util': 9.1.0 + '@toruslabs/broadcast-channel': 10.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.29.7) + '@toruslabs/openlogin-jrpc': 8.3.0(@babel/runtime@7.29.7) + '@toruslabs/openlogin-utils': 8.2.1(@babel/runtime@7.29.7) + async-mutex: 0.5.0 + bignumber.js: 9.3.1 + bowser: 2.14.1 + jwt-decode: 4.0.0 + loglevel: 1.9.2 + transitivePeerDependencies: + - '@sentry/types' + - bufferutil + - supports-color + - utf-8-validate + + '@toruslabs/broadcast-channel@10.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@toruslabs/eccrypto': 4.0.0 + '@toruslabs/metadata-helpers': 5.1.0(@babel/runtime@7.29.7) + loglevel: 1.9.2 + oblivious-set: 1.4.0 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + unload: 2.4.1 + transitivePeerDependencies: + - '@sentry/types' + - bufferutil + - supports-color + - utf-8-validate + + '@toruslabs/constants@13.4.0(@babel/runtime@7.29.7)': + dependencies: + '@babel/runtime': 7.29.7 + + '@toruslabs/eccrypto@4.0.0': + dependencies: + elliptic: 6.6.1 + + '@toruslabs/http-helpers@6.1.1(@babel/runtime@7.29.7)': + dependencies: + '@babel/runtime': 7.29.7 + lodash.merge: 4.6.2 + loglevel: 1.9.2 + + '@toruslabs/metadata-helpers@5.1.0(@babel/runtime@7.29.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@toruslabs/eccrypto': 4.0.0 + '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.29.7) + elliptic: 6.6.1 + ethereum-cryptography: 2.2.1 + json-stable-stringify: 1.3.0 + transitivePeerDependencies: + - '@sentry/types' + + '@toruslabs/openlogin-jrpc@8.3.0(@babel/runtime@7.29.7)': + dependencies: + '@babel/runtime': 7.29.7 + end-of-stream: 1.4.5 + events: 3.3.0 + fast-safe-stringify: 2.1.1 + once: 1.4.0 + pump: 3.0.4 + readable-stream: 4.7.0 + + '@toruslabs/openlogin-utils@8.2.1(@babel/runtime@7.29.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@toruslabs/constants': 13.4.0(@babel/runtime@7.29.7) + base64url: 3.0.1 + color: 4.2.3 + + '@toruslabs/solana-embed@2.1.0(@babel/runtime@7.29.7)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@toruslabs/base-controllers': 5.11.0(@babel/runtime@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@toruslabs/http-helpers': 6.1.1(@babel/runtime@7.29.7) + '@toruslabs/openlogin-jrpc': 8.3.0(@babel/runtime@7.29.7) + eth-rpc-errors: 4.0.3 + fast-deep-equal: 3.1.3 + lodash-es: 4.18.1 + loglevel: 1.9.2 + pump: 3.0.4 + transitivePeerDependencies: + - '@sentry/types' + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@trezor/analytics@1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)': + dependencies: + '@trezor/env-utils': 1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/utils': 9.5.0(tslib@2.8.1) + tslib: 2.8.1 + transitivePeerDependencies: + - expo-constants + - expo-localization + - react-native + + '@trezor/blockchain-link-types@1.5.1(tslib@2.8.1)': + dependencies: + '@trezor/utils': 9.5.0(tslib@2.8.1) + '@trezor/utxo-lib': 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@trezor/blockchain-link-utils@1.5.2(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(utf-8-validate@6.0.6)': + dependencies: + '@mobily/ts-belt': 3.13.1 + '@stellar/stellar-sdk': 14.2.0 + '@trezor/env-utils': 1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/protobuf': 1.5.2(tslib@2.8.1) + '@trezor/utils': 9.5.0(tslib@2.8.1) + tslib: 2.8.1 + xrpl: 4.4.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - debug + - expo-constants + - expo-localization + - react-native + - supports-color + - utf-8-validate + + '@trezor/blockchain-link@2.6.2(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/stake': 0.2.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@stellar/stellar-sdk': 14.2.0 + '@trezor/blockchain-link-types': 1.5.1(tslib@2.8.1) + '@trezor/blockchain-link-utils': 1.5.2(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(utf-8-validate@6.0.6) + '@trezor/env-utils': 1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/utils': 9.5.0(tslib@2.8.1) + '@trezor/utxo-lib': 2.5.0(tslib@2.8.1) + '@trezor/websocket-client': 1.3.0(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6) + '@types/web': 0.0.197 + crypto-browserify: 3.12.0 + socks-proxy-agent: 8.0.5 + stream-browserify: 3.0.0 + tslib: 2.8.1 + xrpl: 4.4.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - debug + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + - ws + + '@trezor/connect-analytics@1.4.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)': + dependencies: + '@trezor/analytics': 1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + tslib: 2.8.1 + transitivePeerDependencies: + - expo-constants + - expo-localization + - react-native + + '@trezor/connect-common@0.5.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)': + dependencies: + '@trezor/env-utils': 1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/type-utils': 1.2.0 + '@trezor/utils': 9.5.0(tslib@2.8.1) + tslib: 2.8.1 + transitivePeerDependencies: + - expo-constants + - expo-localization + - react-native + + '@trezor/connect-web@9.7.3(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@trezor/connect': 9.7.3(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/connect-common': 0.5.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/utils': 9.5.0(tslib@2.8.1) + '@trezor/websocket-client': 1.3.0(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6) + tslib: 2.8.1 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - debug + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + - ws + + '@trezor/connect@9.7.3(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + dependencies: + '@ethereumjs/common': 10.1.2 + '@ethereumjs/tx': 10.1.2 + '@fivebinaries/coin-selection': 3.0.0 + '@mobily/ts-belt': 3.13.1 + '@noble/hashes': 1.8.0 + '@scure/bip39': 1.6.0 + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/system': 0.7.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/blockchain-link': 2.6.2(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@trezor/blockchain-link-types': 1.5.1(tslib@2.8.1) + '@trezor/blockchain-link-utils': 1.5.2(bufferutil@4.1.0)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)(utf-8-validate@6.0.6) + '@trezor/connect-analytics': 1.4.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/connect-common': 0.5.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/crypto-utils': 1.2.0(tslib@2.8.1) + '@trezor/device-authenticity': 1.1.2(tslib@2.8.1) + '@trezor/device-utils': 1.2.0 + '@trezor/env-utils': 1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1) + '@trezor/protobuf': 1.5.3(tslib@2.8.1) + '@trezor/protocol': 1.3.1(tslib@2.8.1) + '@trezor/schema-utils': 1.4.0(tslib@2.8.1) + '@trezor/transport': 1.6.3(tslib@2.8.1) + '@trezor/type-utils': 1.2.0 + '@trezor/utils': 9.5.0(tslib@2.8.1) + '@trezor/utxo-lib': 2.5.0(tslib@2.8.1) + blakejs: 1.2.1 + bs58: 6.0.0 + bs58check: 4.0.0 + cbor: 10.0.12 + cross-fetch: 4.1.0 + jws: 4.0.1 + tslib: 2.8.1 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - debug + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + - ws + + '@trezor/crypto-utils@1.2.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@trezor/device-authenticity@1.1.2(tslib@2.8.1)': + dependencies: + '@noble/curves': 2.2.0 + '@trezor/crypto-utils': 1.2.0(tslib@2.8.1) + '@trezor/protobuf': 1.5.2(tslib@2.8.1) + '@trezor/schema-utils': 1.4.0(tslib@2.8.1) + '@trezor/utils': 9.5.0(tslib@2.8.1) + transitivePeerDependencies: + - tslib + + '@trezor/device-utils@1.2.0': {} + + '@trezor/env-utils@1.5.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + ua-parser-js: 2.0.10 + optionalDependencies: + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6) + + '@trezor/protobuf@1.5.2(tslib@2.8.1)': + dependencies: + '@trezor/schema-utils': 1.4.0(tslib@2.8.1) + long: 5.2.5 + protobufjs: 7.4.0 + tslib: 2.8.1 + + '@trezor/protobuf@1.5.3(tslib@2.8.1)': + dependencies: + '@trezor/schema-utils': 1.4.0(tslib@2.8.1) + long: 5.2.5 + protobufjs: 7.5.5 + tslib: 2.8.1 + + '@trezor/protocol@1.3.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@trezor/schema-utils@1.4.0(tslib@2.8.1)': + dependencies: + '@sinclair/typebox': 0.33.24 + ts-mixer: 6.0.4 + tslib: 2.8.1 + + '@trezor/transport@1.6.3(tslib@2.8.1)': + dependencies: + '@trezor/protobuf': 1.5.3(tslib@2.8.1) + '@trezor/protocol': 1.3.1(tslib@2.8.1) + '@trezor/type-utils': 1.2.0 + '@trezor/utils': 9.5.0(tslib@2.8.1) + cross-fetch: 4.1.0 + tslib: 2.8.1 + usb: 2.18.0 + transitivePeerDependencies: + - encoding + + '@trezor/type-utils@1.2.0': {} + + '@trezor/utils@9.5.0(tslib@2.8.1)': + dependencies: + bignumber.js: 9.3.1 + tslib: 2.8.1 + + '@trezor/utxo-lib@2.5.0(tslib@2.8.1)': + dependencies: + '@trezor/utils': 9.5.0(tslib@2.8.1) + bech32: 2.0.0 + bip66: 2.0.0 + bitcoin-ops: 1.4.1 + blake-hash: 2.0.0 + blakejs: 1.2.1 + bn.js: 5.2.5 + bs58: 6.0.0 + bs58check: 4.0.0 + cashaddrjs: 0.4.4 + create-hmac: 1.1.7 + int64-buffer: 1.1.1 + pushdata-bitcoin: 1.0.1 + tiny-secp256k1: 1.1.7 + tslib: 2.8.1 + typeforce: 1.18.0 + varuint-bitcoin: 2.0.0 + wif: 5.0.0 + + '@trezor/websocket-client@1.3.0(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)': + dependencies: + '@trezor/utils': 9.5.0(tslib@2.8.1) + tslib: 2.8.1 + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.19.43 + + '@types/estree@1.0.9': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/node@12.20.55': {} + + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.31)': + dependencies: + '@types/react': 18.3.31 + + '@types/react@18.3.31': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@types/trusted-types@2.0.7': {} + + '@types/uuid@10.0.0': {} + + '@types/uuid@8.3.4': {} + + '@types/w3c-web-usb@1.0.14': {} + + '@types/web@0.0.197': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 20.19.43 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 20.19.43 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.43)(terser@5.49.0))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@20.19.43)(terser@5.49.0) + transitivePeerDependencies: + - supports-color + + '@wallet-standard/app@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@wallet-standard/base@1.1.1': {} + + '@wallet-standard/core@1.1.2': + dependencies: + '@wallet-standard/app': 1.1.1 + '@wallet-standard/base': 1.1.1 + '@wallet-standard/errors': 0.1.2 + '@wallet-standard/features': 1.1.1 + '@wallet-standard/wallet': 1.1.1 + + '@wallet-standard/errors@0.1.2': + dependencies: + chalk: 5.6.2 + commander: 13.1.0 + + '@wallet-standard/features@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@wallet-standard/wallet@1.1.1': + dependencies: + '@wallet-standard/base': 1.1.1 + + '@walletconnect/core@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/window-getters': 1.0.1 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.3.0 + unstorage: 1.17.5(idb-keyval@6.3.0) + optionalDependencies: + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@walletconnect/core': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@walletconnect/core': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/solana-adapter@0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@reown/appkit': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@walletconnect/universal-provider': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + bs58: 6.0.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + events: 3.3.0 + lodash: 4.17.21 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + elliptic: 6.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + elliptic: 6.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + '@xrplf/isomorphic@1.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@noble/hashes': 2.2.0 + eventemitter3: 5.0.1 + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@xrplf/secret-numbers@2.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + dependencies: + '@xrplf/isomorphic': 1.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ripple-keypairs: 2.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + abitype@1.0.8(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 + + abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn@8.17.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + anser@1.4.10: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@5.0.2: {} + + asap@2.0.6: {} + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.5 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@2.1.0: + dependencies: + call-bind: 1.0.9 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + autoprefixer@10.5.4(postcss@8.5.23): + dependencies: + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.23 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.18.1: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.6 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + babel-plugin-syntax-hermes-parser@0.36.0: + dependencies: + hermes-parser: 0.36.0 + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base-x@4.0.1: {} + + base-x@5.0.1: {} + + base32.js@0.1.0: {} + + base64-js@1.5.1: {} + + base64url@3.0.1: {} + + baseline-browser-mapping@2.11.3: {} + + bech32@2.0.0: {} + + big-integer@1.6.36: {} + + big.js@6.2.2: {} + + bigint-buffer@1.1.5: + dependencies: + bindings: 1.5.0 + + bignumber.js@10.0.2: {} + + bignumber.js@9.3.1: {} + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bip66@2.0.0: {} + + bitcoin-ops@1.4.1: {} + + blake-hash@2.0.0: + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + blakejs@1.2.1: {} + + bn.js@4.12.5: {} + + bn.js@5.2.5: {} + + borsh@0.7.0: + dependencies: + bn.js: 5.2.5 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + bowser@2.14.1: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.12 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.7 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.7 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.5 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + browserify-sign@4.2.6: + dependencies: + bn.js: 5.2.5 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + inherits: 2.0.4 + parse-asn1: 5.1.9 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.28.7: + dependencies: + baseline-browser-mapping: 2.11.3 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.396 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.7) + + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@5.0.0: + dependencies: + base-x: 4.0.1 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + bs58check@4.0.0: + dependencies: + '@noble/hashes': 1.8.0 + bs58: 6.0.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer-layout@1.2.2: {} + + buffer-xor@1.0.3: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + builtin-status-codes@3.0.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camelcase-css@2.0.1: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001806: {} + + cashaddrjs@0.4.4: + dependencies: + big-integer: 1.6.36 + + cbor-sync@1.0.4: {} + + cbor@10.0.12: + dependencies: + nofilter: 3.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chrome-launcher@0.15.2: + dependencies: + '@types/node': 20.19.43 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@0.3.0: + dependencies: + '@types/node': 20.19.43 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + + cipher-base@1.0.7: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@12.1.0: {} + + commander@13.1.0: {} + + commander@14.0.3: {} + + commander@15.0.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.3: {} + + core-util-is@1.0.3: {} + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.5 + elliptic: 6.6.1 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.7 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.3 + sha.js: 2.4.12 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.7 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + + create-require@1.1.1: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.6 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.6 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + crypto-browserify@3.12.1: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.6 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.6 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + crypto-hash@1.3.0: {} + + crypto-js@4.2.0: {} + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.7: {} + + delay@5.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1)): + dependencies: + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + destr@2.0.5: {} + + destroy@1.2.0: {} + + detect-browser@5.3.0: {} + + detect-europe-js@0.1.2: {} + + didyoumean@1.2.2: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.5 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + dijkstrajs@1.0.3: {} + + dlv@1.1.3: {} + + domain-browser@4.22.0: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + draggabilly@3.0.0: + dependencies: + get-size: 3.0.0 + unidragger: 3.0.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.396: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.5 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + encode-utf8@1.0.3: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-toolkit@1.33.0: {} + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + estree-walker@2.0.2: {} + + etag@1.8.1: {} + + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ev-emitter@2.1.2: {} + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + eventemitter3@5.0.4: {} + + events@3.3.0: {} + + eventsource@2.0.2: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + exenv@1.2.2: {} + + exponential-backoff@3.1.3: {} + + eyes@0.1.8: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-stable-stringify@1.0.0: {} + + fastestsmallesttextencoderdecoder@1.0.22: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fb-dotslash@0.5.8: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + feaxios@0.0.23: + dependencies: + is-retry-allowed: 3.0.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@1.1.0: {} + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flow-enums-runtime@0.0.6: {} + + follow-redirects@1.16.0: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + fraction.js@5.3.4: {} + + fresh@0.5.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-size@3.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-base@3.0.5: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hermes-compiler@250829098.0.14: {} + + hermes-estree@0.35.0: {} + + hermes-estree@0.36.0: {} + + hermes-parser@0.35.0: + dependencies: + hermes-estree: 0.35.0 + + hermes-parser@0.36.0: + dependencies: + hermes-estree: 0.36.0 + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + https-browserify@1.0.0: {} + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + idb-keyval@6.3.0: {} + + ieee754@1.2.1: {} + + image-size@1.2.1: + dependencies: + queue: 6.0.2 + + inherits@2.0.4: {} + + int64-buffer@1.1.1: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ip-address@10.3.1: {} + + iron-webcrypto@1.2.1: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-arrayish@0.3.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: + optional: true + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-retry-allowed@3.0.0: {} + + is-standalone-pwa@0.1.1: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-timers-promises@1.0.1: {} + + isomorphic-ws@4.0.1(ws@7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6)): + dependencies: + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + + isows@1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)): + dependencies: + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + + isows@1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)): + dependencies: + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + jest-get-type@29.6.3: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.19.43 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.2 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.19.43 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + jsbi@3.2.5: {} + + jsc-safe-url@0.2.4: {} + + jsesc@3.1.0: {} + + json-stable-stringify@1.3.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonify@0.0.1: {} + + jsqr@1.4.0: {} + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + jwt-decode@4.0.0: {} + + keyvaluestorage-interface@1.0.0: {} + + leven@3.1.0: {} + + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.3 + + lit-html@3.3.3: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.1.0: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.18.1: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash.throttle@4.1.1: {} + + lodash@4.17.21: {} + + loglevel@1.9.2: {} + + long@5.2.5: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@11.5.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + marky@1.3.0: {} + + math-intrinsics@1.1.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.0.5 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + memoize-one@5.2.1: {} + + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + optional: true + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + metro-babel-transformer@0.84.4: + dependencies: + '@babel/core': 7.29.7 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.35.0 + metro-cache-key: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.84.4: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.84.4 + transitivePeerDependencies: + - supports-color + + metro-config@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-cache: 0.84.4 + metro-core: 0.84.4 + metro-runtime: 0.84.4 + yaml: 2.9.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.84.4 + + metro-file-map@0.84.4: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.49.0 + + metro-resolver@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.84.4: + dependencies: + '@babel/runtime': 7.29.7 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.84.4: + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.84.4 + nullthrows: 1.1.1 + ob1: 0.84.4 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.84.4 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.84.4: + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + flow-enums-runtime: 0.0.6 + metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-minify-terser: 0.84.4 + metro-source-map: 0.84.4 + metro-transform-plugins: 0.84.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + accepts: 2.0.0 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.35.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + yargs: 17.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.5 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multiformats@9.9.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nan@2.28.0: {} + + nanoid@3.3.16: {} + + negotiator@1.0.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-addon-api@3.2.1: {} + + node-addon-api@8.9.0: {} + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + node-int64@0.4.0: {} + + node-mock-http@1.0.4: {} + + node-releases@2.0.51: {} + + node-stdlib-browser@1.3.1: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.1 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + + nofilter@3.1.0: {} + + normalize-path@3.0.0: {} + + nullthrows@1.1.1: {} + + ob1@0.84.4: + dependencies: + flow-enums-runtime: 0.0.6 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + oblivious-set@1.4.0: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + on-exit-leak-free@0.2.0: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + os-browserify@0.3.0: {} + + ox@0.14.32(typescript@5.9.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.6.7(typescript@5.9.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + pako@1.0.11: {} + + pako@2.2.0: {} + + parse-asn1@5.1.9: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.6 + safe-buffer: 5.2.1 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pbkdf2@3.1.6: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.2 + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.5: {} + + pify@2.3.0: {} + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-std-serializers@4.0.0: {} + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + + pirates@4.0.7: {} + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pngjs@5.0.0: {} + + possible-typed-array-names@1.1.0: {} + + postcss-import@15.1.0(postcss@8.5.23): + dependencies: + postcss: 8.5.23 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.12 + + postcss-js@4.1.0(postcss@8.5.23): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.23 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.23)(yaml@2.9.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.23 + yaml: 2.9.0 + + postcss-nested@6.2.0(postcss@8.5.23): + dependencies: + postcss: 8.5.23 + postcss-selector-parser: 6.1.4 + + postcss-selector-parser@6.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.23: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: {} + + process@0.11.10: {} + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 20.19.43 + long: 5.2.5 + + protobufjs@7.5.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 20.19.43 + long: 5.2.5 + + proxy-compare@2.6.0: {} + + proxy-from-env@2.1.0: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.5 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.9 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@1.4.1: {} + + pushdata-bitcoin@1.0.1: + dependencies: + bitcoin-ops: 1.4.1 + + qr.js@0.0.0: {} + + qrcode.react@1.0.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + prop-types: 15.8.1 + qr.js: 0.0.0 + react: 18.3.1 + + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + querystring-es3@0.2.1: {} + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-format-unescaped@4.0.4: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + shell-quote: 1.10.0 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-lifecycles-compat@3.0.4: {} + + react-modal@3.16.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + exenv: 1.2.2 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + warning: 4.0.3 + + react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6): + dependencies: + '@react-native/assets-registry': 0.86.0 + '@react-native/codegen': 0.86.0(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.86.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/gradle-plugin': 0.86.0 + '@react-native/js-polyfills': 0.86.0 + '@react-native/normalize-colors': 0.86.0 + '@react-native/virtualized-lists': 0.86.0(@types/react@18.3.31)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(utf-8-validate@6.0.6))(react@18.3.1) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-plugin-syntax-hermes-parser: 0.36.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + hermes-compiler: 250829098.0.14 + invariant: 2.2.4 + memoize-one: 5.2.1 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 18.3.1 + react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.27.0 + semver: 7.8.5 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.17 + whatwg-fetch: 3.6.20 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6) + yargs: 17.7.3 + optionalDependencies: + '@types/react': 18.3.31 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + + react-qr-reader@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + jsqr: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + webrtc-adapter: 7.7.1 + + react-refresh@0.14.2: {} + + react-refresh@0.17.0: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + readdirp@5.0.0: {} + + real-require@0.1.0: {} + + regenerator-runtime@0.13.11: {} + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + + ripple-address-codec@5.0.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@scure/base': 2.2.0 + '@xrplf/isomorphic': 1.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ripple-binary-codec@2.8.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@xrplf/isomorphic': 1.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) + bignumber.js: 10.0.2 + ripple-address-codec: 5.0.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ripple-keypairs@2.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@noble/curves': 1.9.7 + '@xrplf/isomorphic': 1.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ripple-address-codec: 5.0.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 + + rpc-websockets@9.3.9: + dependencies: + '@swc/helpers': 0.5.23 + '@types/uuid': 10.0.0 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.4 + uuid: 14.0.1 + ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + rtcpeerconnection-shim@1.2.15: + dependencies: + sdp: 2.12.0 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@6.6.7: + dependencies: + tslib: 1.14.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + salmon-adapter-sdk@1.1.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)): + dependencies: + '@project-serum/sol-wallet-adapter': 0.2.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + eventemitter3: 4.0.7 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + scheduler@0.27.0: {} + + sdp@2.12.0: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + semver@7.8.5: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-error@2.1.0: {} + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.10.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + smart-buffer@4.2.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6) + socket.io-parser: 4.2.7 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.7: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.9 + transitivePeerDependencies: + - supports-color + + socks@2.8.9: + dependencies: + ip-address: 10.3.1 + smart-buffer: 4.2.0 + + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + split-on-first@1.1.0: {} + + split2@4.2.0: {} + + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + statuses@1.5.0: {} + + statuses@2.0.2: {} + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-chain@2.2.5: {} + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + + stream-shift@1.0.3: {} + + strict-uri-encode@2.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + + superstruct@0.15.5: {} + + superstruct@2.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@3.4.19(yaml@2.9.0): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.23 + postcss-import: 15.1.0(postcss@8.5.23) + postcss-js: 4.1.0(postcss@8.5.23) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.23)(yaml@2.9.0) + postcss-nested: 6.2.0(postcss@8.5.23) + postcss-selector-parser: 6.1.4 + resolve: 1.22.12 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + terser@5.49.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.17.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-encoding-utf-8@1.0.2: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + + throat@5.0.0: {} + + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tiny-secp256k1@1.1.7: + dependencies: + bindings: 1.5.0 + bn.js: 4.12.5 + create-hmac: 1.1.7 + elliptic: 6.6.1 + nan: 2.28.0 + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tmpl@1.0.5: {} + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toml@3.0.0: {} + + tr46@0.0.3: {} + + ts-interface-checker@0.1.13: {} + + ts-mixer@6.0.4: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tty-browserify@0.0.1: {} + + type-fest@0.7.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typeforce@1.18.0: {} + + typescript@5.9.3: {} + + ua-is-frozen@0.1.2: {} + + ua-parser-js@2.0.10: + dependencies: + detect-europe-js: 0.1.2 + is-standalone-pwa: 0.1.1 + ua-is-frozen: 0.1.2 + + ufo@1.6.4: {} + + uint8array-tools@0.0.8: {} + + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + + uncrypto@0.1.3: {} + + undici-types@6.21.0: {} + + undici-types@7.29.0: {} + + undici-types@8.9.0: {} + + unidragger@3.0.1: + dependencies: + ev-emitter: 2.1.2 + + unload@2.4.1: {} + + unpipe@1.0.0: {} + + unstorage@1.17.5(idb-keyval@6.3.0): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.2 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + optionalDependencies: + idb-keyval: 6.3.0 + + update-browserslist-db@1.2.3(browserslist@4.28.7): + dependencies: + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 + + urijs@1.19.11: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.15.3 + + usb@2.18.0: + dependencies: + '@types/w3c-web-usb': 1.0.14 + node-addon-api: 8.9.0 + node-gyp-build: 4.8.4 + + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + utf-8-validate@6.0.6: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.22 + + utils-merge@1.0.1: {} + + uuid@14.0.1: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + uuidv4@6.2.13: + dependencies: + '@types/uuid': 8.3.4 + uuid: 8.3.2 + + valtio@1.13.2(@types/react@18.3.31)(react@18.3.1): + dependencies: + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1)) + proxy-compare: 2.6.0 + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + react: 18.3.1 + + varuint-bitcoin@2.0.0: + dependencies: + uint8array-tools: 0.0.8 + + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4): + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@3.22.4) + isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + ox: 0.6.7(typescript@5.9.3)(zod@3.22.4) + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + ox: 0.14.32(typescript@5.9.3)(zod@3.22.4) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-plugin-node-polyfills@0.22.0(rollup@4.62.2)(vite@5.4.21(@types/node@20.19.43)(terser@5.49.0)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.62.2) + node-stdlib-browser: 1.3.1 + vite: 5.4.21(@types/node@20.19.43)(terser@5.49.0) + transitivePeerDependencies: + - rollup + + vite@5.4.21(@types/node@20.19.43)(terser@5.49.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.23 + rollup: 4.62.2 + optionalDependencies: + '@types/node': 20.19.43 + fsevents: 2.3.3 + terser: 5.49.0 + + vlq@1.0.1: {} + + vm-browserify@1.1.2: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + webidl-conversions@3.0.1: {} + + webrtc-adapter@7.7.1: + dependencies: + rtcpeerconnection-shim: 1.2.15 + sdp: 2.12.0 + + whatwg-fetch@3.6.20: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wif@5.0.0: + dependencies: + bs58check: 4.0.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.13(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + xmlhttprequest-ssl@2.1.2: {} + + xrpl@4.4.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + '@xrplf/isomorphic': 1.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@xrplf/secret-numbers': 2.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + bignumber.js: 9.3.1 + eventemitter3: 5.0.4 + fast-json-stable-stringify: 2.1.0 + ripple-address-codec: 5.0.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ripple-binary-codec: 2.8.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ripple-keypairs: 2.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.9.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zod@3.22.4: {} diff --git a/finance/vault-strategy/anchor-v1/app/pnpm-workspace.yaml b/finance/vault-strategy/anchor-v1/app/pnpm-workspace.yaml new file mode 100644 index 000000000..937355dee --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/pnpm-workspace.yaml @@ -0,0 +1,15 @@ +# These transitive dependencies ship postinstall build scripts. They are all optional +# native accelerators (or, for esbuild, a binary that its Node API resolves from the +# platform package without a build step) and have pure-JS fallbacks, so we decline to +# build them. `pnpm build` / `pnpm dev` are verified to work with these off. +# Flip any to `true` if you want the native path on your machine. +allowBuilds: + '@stellar/stellar-sdk': false + bigint-buffer: false + blake-hash: false + bufferutil: false + esbuild: false + protobufjs: false + tiny-secp256k1: false + usb: false + utf-8-validate: false diff --git a/finance/vault-strategy/anchor-v1/app/postcss.config.js b/finance/vault-strategy/anchor-v1/app/postcss.config.js new file mode 100644 index 000000000..2aa7205d4 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/finance/vault-strategy/anchor-v1/app/preview.html b/finance/vault-strategy/anchor-v1/app/preview.html new file mode 100644 index 000000000..3c142ca50 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/preview.html @@ -0,0 +1,19 @@ + + + + + + + Vault Strategy — preview + + + + + +

+ + + diff --git a/finance/vault-strategy/anchor-v1/app/scripts/verify-client.mjs b/finance/vault-strategy/anchor-v1/app/scripts/verify-client.mjs new file mode 100644 index 000000000..f8f64c961 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/scripts/verify-client.mjs @@ -0,0 +1,145 @@ +// Offline verification of the client wiring. No cluster needed: it re-derives +// the Anchor discriminators, builds the Program from the IDL, round-trips instruction +// encoding and account decoding through Anchor's own coder, and derives the PDAs. +// +// node scripts/verify-client.mjs +// +// Exits non-zero on any mismatch, so it doubles as a CI gate. + +import { createHash } from "node:crypto"; +import { readFileSync } from "node:fs"; +import * as anchor from "@coral-xyz/anchor"; +import { Connection, Keypair, PublicKey } from "@solana/web3.js"; + +// @coral-xyz/anchor is CJS; under Node ESM interop some builds expose everything +// only on the default export (notably BN), so fall back to it. +const { Program, AnchorProvider, BN } = { ...anchor.default, ...anchor, BN: anchor.BN ?? anchor.default?.BN }; + +const idl = JSON.parse(readFileSync(new URL("../src/idl/vault_strategy.json", import.meta.url))); +const PROGRAM_ID = new PublicKey(idl.address); + +let failures = 0; +const ok = (name) => console.log(` ✓ ${name}`); +const fail = (name, detail) => { + failures++; + console.error(` ✗ ${name}${detail ? ` — ${detail}` : ""}`); +}; +const eqBytes = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]); +const snakeToCamel = (s) => s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()); +const disc = (prefix, name) => Array.from(createHash("sha256").update(`${prefix}:${name}`).digest().subarray(0, 8)); + +// 1. Discriminators embedded in the IDL match sha256(global:/account:). +console.log("discriminators"); +for (const ix of idl.instructions) { + const expected = disc("global", ix.name); + eqBytes(expected, ix.discriminator) + ? ok(`ix ${ix.name}`) + : fail(`ix ${ix.name}`, `expected [${expected}] got [${ix.discriminator}]`); +} +for (const acc of idl.accounts) { + const expected = disc("account", acc.name); + eqBytes(expected, acc.discriminator) + ? ok(`account ${acc.name}`) + : fail(`account ${acc.name}`, `expected [${expected}] got [${acc.discriminator}]`); +} + +// 2. The Program builds from the IDL (validates the whole IDL shape + coder). +console.log("program"); +const connection = new Connection("http://127.0.0.1:8899", "confirmed"); // never called +const kp = Keypair.generate(); +const wallet = { + publicKey: kp.publicKey, + signTransaction: async (t) => t, + signAllTransactions: async (t) => t, +}; +const provider = new AnchorProvider(connection, wallet, { commitment: "confirmed" }); +let program; +try { + program = new Program(idl, provider); + ok("new Program(idl, provider)"); +} catch (e) { + fail("new Program(idl, provider)", e.message); +} + +// 3. Encode every instruction; assert the discriminator prefix matches. +if (program) { + console.log("instruction encoding"); + const argSamples = { + u64: () => new BN(1000), + u16: () => 100, + u8: () => 1, + pubkey: () => Keypair.generate().publicKey, + }; + for (const ix of idl.instructions) { + try { + const accounts = Object.fromEntries(ix.accounts.map((a) => [snakeToCamel(a.name), Keypair.generate().publicKey])); + const args = ix.args.map((a) => (argSamples[a.type] ?? (() => new BN(0)))()); + const built = await program.methods[snakeToCamel(ix.name)](...args) + .accountsStrict(accounts) + .instruction(); + const prefix = Array.from(built.data.subarray(0, 8)); + if (eqBytes(prefix, ix.discriminator)) ok(`encode ${ix.name} (${built.data.length} bytes)`); + else fail(`encode ${ix.name}`, `data prefix [${prefix}]`); + } catch (e) { + fail(`encode ${ix.name}`, e.message); + } + } + + // 4. Round-trip a Strategy account through the coder. + console.log("account decoding"); + try { + const sample = { + index: new BN(7), + manager: PublicKey.default, + registry: PublicKey.default, + shareMint: PublicKey.default, + usdcMint: PublicKey.default, + swapRouter: PublicKey.default, + feeBps: 100, + maxSlippageBps: 250, + totalShares: new BN("1350000000"), + lastFeeAccrualTimestamp: new BN("1700000000"), + assetCount: 2, + totalWeightBps: 10000, + bump: 254, + }; + // Anchor 0.30 keys the coder by camelCase account name (matches program.account.strategy). + const encoded = await program.coder.accounts.encode("strategy", sample); + const decoded = program.coder.accounts.decode("strategy", encoded); + const good = + decoded.index.toString() === "7" && + decoded.feeBps === 100 && + decoded.maxSlippageBps === 250 && + decoded.assetCount === 2 && + decoded.totalWeightBps === 10000 && + decoded.totalShares.toString() === "1350000000"; + good ? ok("Strategy encode/decode round-trip") : fail("Strategy round-trip", JSON.stringify(decoded)); + } catch (e) { + fail("Strategy round-trip", e.message); + } +} + +// 5. Derive the key PDAs (sanity + reference values). +console.log("PDAs (index 0)"); +const u64le = (n) => { + const b = Buffer.alloc(8); + b.writeBigUInt64LE(BigInt(n)); + return b; +}; +const strategy = PublicKey.findProgramAddressSync([Buffer.from("strategy"), u64le(0)], PROGRAM_ID)[0]; +const shareMint = PublicKey.findProgramAddressSync([Buffer.from("share_mint"), strategy.toBuffer()], PROGRAM_ID)[0]; +const asset0 = PublicKey.findProgramAddressSync( + [Buffer.from("asset"), strategy.toBuffer(), Buffer.from([0])], + PROGRAM_ID, +)[0]; +console.log(` strategy ${strategy.toBase58()}`); +console.log(` share_mint ${shareMint.toBase58()}`); +console.log(` asset[0] ${asset0.toBase58()}`); +ok("PDA derivation"); + +console.log(); +if (failures > 0) { + console.error(`FAILED: ${failures} check(s) did not pass.`); + process.exit(1); +} +console.log("OK: client wiring verified offline."); diff --git a/finance/vault-strategy/anchor-v1/app/src/App.tsx b/finance/vault-strategy/anchor-v1/app/src/App.tsx new file mode 100644 index 000000000..8aad9920c --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/App.tsx @@ -0,0 +1,73 @@ +import { useState } from "react"; +import { Header } from "./components/Header"; +import { CreateStrategyForm, ManagerView } from "./components/ManagerView"; +import { ErrorPanel, Loading, NotFound } from "./components/states"; +import { useVault } from "./hooks/useVault"; +import { InvestorView } from "./views/InvestorView"; + +type Tab = "investor" | "manager"; + +function TabBar({ tab, onTab }: { tab: Tab; onTab: (t: Tab) => void }) { + const item = (key: Tab, label: string) => ( + + ); + return ( + + ); +} + +export default function App() { + const vault = useVault(); + const [tab, setTab] = useState("investor"); + + const showManagerTab = Boolean(vault.view?.exists && vault.isManager); + const activeTab: Tab = showManagerTab ? tab : "investor"; + + return ( +
+
+ {showManagerTab && } + +
+ {vault.loading && } + {!vault.loading && vault.error && } + {!vault.loading && !vault.error && vault.view && ( +
+ {vault.view.exists ? ( + activeTab === "manager" ? ( + + ) : ( + + ) + ) : ( + <> + + {vault.connected && ( +
+ +
+ )} + + )} +
+ )} +
+ +
+ Educational demo · devnet. Every figure is a live on-chain read; redemptions pay out each asset in kind, not + USDC. +
+
+ ); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/components/ActionTicket.tsx b/finance/vault-strategy/anchor-v1/app/src/components/ActionTicket.tsx new file mode 100644 index 000000000..edb4d790a --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/components/ActionTicket.tsx @@ -0,0 +1,208 @@ +import { useState } from "react"; +import { applyToleranceFloor, estimateRedeem, estimateSharesOut, parseAmount } from "../lib/amounts"; +import { describeError } from "../lib/tx"; +import { formatShares, formatUnits, formatUsdc, shortAddress } from "../solana/format"; +import type { Position, StrategyView } from "../solana/strategy"; +import { Button, Segmented, StatusLine, TextField, type TxStatus } from "./atoms"; + +const DEPOSIT_TOLERANCE_BPS = 100; // 1% — floor on shares out to protect the depositor + +type Mode = "deposit" | "redeem"; + +/** Ungrouped decimal string for filling the input (no thousands commas). */ +function rawAmount(minor: bigint, decimals = 6): string { + const base = 10n ** BigInt(decimals); + const whole = (minor / base).toString(); + const frac = (minor % base).toString().padStart(decimals, "0").replace(/0+$/, ""); + return frac ? `${whole}.${frac}` : whole; +} + +export interface ActionTicketProps { + view: StrategyView; + connected: boolean; + walletUsdc: bigint | null; + position: Position | null; + onDeposit: (usdcMinor: bigint, minShares: bigint) => Promise; + onRedeem: (sharesMinor: bigint, minUsdcOut: bigint) => Promise; +} + +export function ActionTicket({ view, connected, walletUsdc, position, onDeposit, onRedeem }: ActionTicketProps) { + const [mode, setMode] = useState("deposit"); + const [depositInput, setDepositInput] = useState(""); + const [redeemInput, setRedeemInput] = useState(""); + const [status, setStatus] = useState({ kind: "idle" }); + const [busy, setBusy] = useState(false); + + const shares = position?.shares ?? 0n; + const activeUnpriced = view.assets.some((a) => a.weightBps > 0 && (a.price === null || a.stale)); + + // deposit derivations + const usdcMinor = parseAmount(depositInput, 6); + const depositInvalid = depositInput.trim() !== "" && usdcMinor === null; + const expectedShares = + usdcMinor !== null && usdcMinor > 0n ? estimateSharesOut(usdcMinor, view.navMinor, view.totalShares) : null; + const minShares = expectedShares !== null ? applyToleranceFloor(expectedShares, DEPOSIT_TOLERANCE_BPS) : 0n; + + const depositBlock: string | null = !connected + ? "Connect a wallet to deposit." + : !view.fullyAllocated + ? "Strategy isn’t fully allocated — deposits are closed until target weights total 100%." + : activeUnpriced + ? "Oracle prices are stale or missing — a deposit would revert on-chain." + : usdcMinor !== null && usdcMinor > 0n && walletUsdc !== null && usdcMinor > walletUsdc + ? "Amount exceeds your USDC balance." + : null; + const depositReady = + connected && + view.fullyAllocated && + !activeUnpriced && + usdcMinor !== null && + usdcMinor > 0n && + (walletUsdc === null || usdcMinor <= walletUsdc); + + // redeem derivations + const sharesMinor = parseAmount(redeemInput, 6); + const redeemInvalid = redeemInput.trim() !== "" && sharesMinor === null; + const redeemEst = sharesMinor !== null && sharesMinor > 0n ? estimateRedeem(sharesMinor, view) : null; + + const redeemBlock: string | null = !connected + ? "Connect a wallet to redeem." + : shares === 0n + ? "You hold no shares in this strategy." + : sharesMinor !== null && sharesMinor > 0n && sharesMinor > shares + ? "Amount exceeds your shares." + : null; + const redeemReady = connected && shares > 0n && sharesMinor !== null && sharesMinor > 0n && sharesMinor <= shares; + + async function run(action: () => Promise, verb: string) { + setBusy(true); + setStatus({ kind: "pending", message: "Confirm in your wallet…" }); + try { + const signature = await action(); + setStatus({ kind: "success", message: `${verb} confirmed.`, signature }); + setDepositInput(""); + setRedeemInput(""); + } catch (err) { + setStatus({ kind: "error", message: describeError(err) }); + } finally { + setBusy(false); + } + } + + return ( +
+ + options={[ + { key: "deposit", label: "Deposit" }, + { key: "redeem", label: "Redeem" }, + ]} + value={mode} + onChange={(k) => { + setMode(k); + setStatus({ kind: "idle" }); + }} + /> + +
+ Share price + {formatUnits(view.navPerShareMinor, 6, 4)} USDC +
+ +
+ {mode === "deposit" ? ( + <> + setDepositInput(rawAmount(walletUsdc))} + className="tabular-nums transition-colors hover:text-accent" + > + Balance {formatUsdc(walletUsdc)} · Max + + ) : ( + "Balance —" + ) + } + /> + + {expectedShares !== null && ( +
+
+ You receive + ≈ {formatShares(expectedShares)} shares +
+
+ Minimum (1% tol.) + {formatShares(minShares)} shares +
+
+ )} + + {depositBlock &&

{depositBlock}

} + + + + ) : ( + <> + setRedeemInput(rawAmount(shares))} + className="tabular-nums transition-colors hover:text-accent" + > + Balance {formatShares(shares)} · Max + + } + /> + + {redeemEst && ( +
+
Paid out in kind — each asset, not USDC:
+ {redeemEst.legs.map((leg) => ( +
+ + #{leg.index} · {shortAddress(leg.mint)} + + {formatUnits(leg.amountMinor, 6, 6)} +
+ ))} +
+ USDC + {formatUsdc(redeemEst.usdcMinor)} +
+
+ )} + + {redeemBlock &&

{redeemBlock}

} + + + + )} + + +
+
+ ); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/components/Allocation.tsx b/finance/vault-strategy/anchor-v1/app/src/components/Allocation.tsx new file mode 100644 index 000000000..d5dce765f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/components/Allocation.tsx @@ -0,0 +1,140 @@ +import { formatBps, formatRatioPct, formatUnits, formatUsdc } from "../solana/format"; +import type { StrategyView } from "../solana/strategy"; +import { Addr } from "./atoms"; + +// A curated, desaturated "instrument" palette — matte, not neon — starting from the +// accent amber. Real weight encoding, not decoration: the table swatches reuse it. +const PALETTE = ["#F0B429", "#5E8CA6", "#7FA06B", "#C77F4E", "#9C7BA6", "#4FA39A", "#B5606B"]; +const assetColor = (i: number): string => PALETTE[i % PALETTE.length]; +const IDLE_COLOR = "rgba(233, 230, 225, 0.16)"; +const UNALLOC_COLOR = "rgba(233, 230, 225, 0.06)"; + +interface Segment { + key: string; + label: string; + pct: number; + color: string; +} + +function buildSegments(view: StrategyView): Segment[] { + const nav = Number(view.navMinor); + const useActual = view.navComplete && view.navMinor > 0n; + const segments: Segment[] = []; + + view.assets.forEach((a, i) => { + const pct = useActual ? (a.valueUsdc !== null ? Number(a.valueUsdc) / nav : 0) : a.weightBps / 10_000; + if (pct > 0) { + segments.push({ key: `a${a.index}`, label: `#${a.index}`, pct, color: assetColor(i) }); + } + }); + + if (useActual) { + const idle = Number(view.usdcAmount) / nav; + if (idle > 0.0005) segments.push({ key: "usdc", label: "USDC", pct: idle, color: IDLE_COLOR }); + } else { + const allocated = (view.account?.totalWeightBps ?? 0) / 10_000; + if (allocated < 1) { + segments.push({ key: "unalloc", label: "Unallocated", pct: 1 - allocated, color: UNALLOC_COLOR }); + } + } + return segments; +} + +function priceUsd(price: bigint | null): string { + return price === null ? "—" : `$${formatUnits(price, 8, 2)}`; +} + +export function AllocationPanel({ view }: { view: StrategyView }) { + const s = view.account!; + const segments = buildSegments(view); + const basisLabel = view.navComplete && view.navMinor > 0n ? "live weights" : "target weights"; + + return ( +
+
+

Allocation

+ + fee {formatBps(s.feeBps)} / yr · slippage {formatBps(s.maxSlippageBps)} + +
+ + {segments.length > 0 && ( +
+ {segments.map((seg) => ( +
+ ))} +
+ )} + + {view.assets.length === 0 ? ( +

No assets added yet.

+ ) : ( +
+ + + + + + + + + + + + + {view.assets.map((a, i) => ( + + + + + + + + + + ))} + {view.usdcAmount > 0n && ( + + + + + + + + + + )} + +
+ AssetTargetLiveVault balancePriceValue
+ + + #{a.index} + {a.weightBps === 0 && ( + retired + )} + {formatBps(a.weightBps, 0)} + {a.actualWeight === null ? "—" : formatRatioPct(a.actualWeight)} + {formatUnits(a.vaultAmount, 6, 6)} + {priceUsd(a.price)} + {a.stale && stale} + + {a.valueUsdc === null ? "—" : `$${formatUsdc(a.valueUsdc)}`} +
+ + USDC (idle) + {view.navMinor > 0n ? formatRatioPct(Number(view.usdcAmount) / Number(view.navMinor)) : "—"} + {formatUnits(view.usdcAmount, 6, 6)}$1.00${formatUsdc(view.usdcAmount)}
+
+ )} +
+ ); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/components/Header.tsx b/finance/vault-strategy/anchor-v1/app/src/components/Header.tsx new file mode 100644 index 000000000..43210cfa0 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/components/Header.tsx @@ -0,0 +1,29 @@ +import { WalletMultiButton } from "@solana/wallet-adapter-react-ui"; +import { CLUSTER, STRATEGY_INDEX } from "../solana/config"; +import { Chip } from "./atoms"; + +export function Header({ onRefresh }: { onRefresh: () => void }) { + return ( +
+
+ + VAULT STRATEGY + / #{STRATEGY_INDEX.toString()} +
+
+ + + {CLUSTER} + + + +
+
+ ); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/components/ManagerView.tsx b/finance/vault-strategy/anchor-v1/app/src/components/ManagerView.tsx new file mode 100644 index 000000000..bbe6eae2f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/components/ManagerView.tsx @@ -0,0 +1,427 @@ +import { useConnection } from "@solana/wallet-adapter-react"; +import { PublicKey } from "@solana/web3.js"; +import { useEffect, useMemo, useState } from "react"; +import type { VaultState } from "../hooks/useVault"; +import { parseAmount, parsePercentToBps, toAmountInput } from "../lib/amounts"; +import { describeError } from "../lib/tx"; +import { + BPS_DENOMINATOR, + MAX_ASSETS, + MAX_FEE_BPS, + MAX_SLIPPAGE_BPS, + PYTH_PRICE_PRECISION, + ROUTER_PROGRAM_ID, + STRATEGY_INDEX, + USDC_MINT, +} from "../solana/config"; +import { formatBps, formatShares, formatUnits, formatUsdc, shortAddress } from "../solana/format"; +import { approvedAssetPda } from "../solana/pdas"; +import type { StrategyView } from "../solana/strategy"; +import { Button, Panel, Select, StatusLine, TextField, type TxStatus } from "./atoms"; + +const SECONDS_PER_YEAR = 31_536_000n; + +/** Shared submit/status/busy wiring for a manager action. */ +function useAction() { + const [status, setStatus] = useState({ kind: "idle" }); + const [busy, setBusy] = useState(false); + async function run(fn: () => Promise, verb: string) { + setBusy(true); + setStatus({ kind: "pending", message: "Confirm in your wallet…" }); + try { + const signature = await fn(); + setStatus({ kind: "success", message: `${verb} confirmed.`, signature }); + } catch (err) { + setStatus({ kind: "error", message: describeError(err) }); + } finally { + setBusy(false); + } + } + return { status, busy, run }; +} + +function tryPubkey(value: string): PublicKey | null { + const t = value.trim(); + if (t.length < 32) return null; + try { + return new PublicKey(t); + } catch { + return null; + } +} + +const assetOptions = (view: StrategyView) => + view.assets.map((a) => ({ + value: String(a.index), + label: `#${a.index} · ${shortAddress(a.mint)} · ${formatBps(a.weightBps, 0)}`, + })); + +// ---- Rebalance ------------------------------------------------------------- + +function RebalancePanel({ view, onRebalance }: { view: StrategyView; onRebalance: VaultState["rebalance"] }) { + const { status, busy, run } = useAction(); + const [sell, setSell] = useState("0"); + const [buy, setBuy] = useState(view.assets.length > 1 ? "1" : "0"); + const [sellInput, setSellInput] = useState(""); + const [usdcInput, setUsdcInput] = useState(""); + + if (view.assets.length < 2) { + return ( + +

+ Rebalancing needs at least two assets. Add another asset first. +

+
+ ); + } + + const sellIdx = Number(sell); + const buyIdx = Number(buy); + const sellAsset = view.assets[sellIdx]; + const buyAsset = view.assets[buyIdx]; + const sellMinor = parseAmount(sellInput, 6); + const usdcMinor = parseAmount(usdcInput, 6); + const impliedUsdc = + sellMinor !== null && sellAsset.price ? (sellMinor * sellAsset.price) / PYTH_PRICE_PRECISION : null; + const legStale = sellAsset.price === null || sellAsset.stale || buyAsset.price === null || buyAsset.stale; + + const block = + sellIdx === buyIdx + ? "Choose two different assets." + : legStale + ? "An oracle price is stale or missing — the rebalance would revert on-chain." + : sellMinor !== null && sellMinor > sellAsset.vaultAmount + ? "Sell amount exceeds the vault balance." + : null; + const ready = + sellIdx !== buyIdx && + !legStale && + sellMinor !== null && + sellMinor > 0n && + sellMinor <= sellAsset.vaultAmount && + usdcMinor !== null && + usdcMinor > 0n; + + return ( + +
+ +
+ setSellInput(toAmountInput(sellAsset.vaultAmount))} + className="tabular-nums transition-colors hover:text-accent" + > + Vault {formatUnits(sellAsset.vaultAmount, 6, 4)} · Max + + } + /> + setUsdcInput(toAmountInput(impliedUsdc))} + className="tabular-nums transition-colors hover:text-accent" + > + Oracle ≈ {formatUsdc(impliedUsdc)} · Use + + ) : ( + "enter sell amount" + ) + } + /> + {block &&

{block}

} + + +
+ ); +} + +// ---- Set weight ------------------------------------------------------------ + +function SetWeightPanel({ view, onSetWeight }: { view: StrategyView; onSetWeight: VaultState["setWeight"] }) { + const { status, busy, run } = useAction(); + const [idx, setIdx] = useState("0"); + const [pct, setPct] = useState(""); + const assetIdx = Number(idx); + const asset = view.assets[assetIdx]; + const newBps = parsePercentToBps(pct); + const oldBps = asset?.weightBps ?? 0; + const newTotal = view.account!.totalWeightBps - oldBps + (newBps ?? 0); + const invalid = pct.trim() !== "" && (newBps === null || newBps < 0 || newBps > BPS_DENOMINATOR); + + const block = invalid + ? "Enter a weight from 0 to 100%." + : newBps !== null && newTotal > BPS_DENOMINATOR + ? `Total weight would reach ${formatBps(newTotal, 0)} — over 100%.` + : null; + const ready = newBps !== null && !invalid && newTotal <= BPS_DENOMINATOR; + + return ( + + ) => onChange(e.target.value)} + placeholder={placeholder} + inputMode="decimal" + autoComplete="off" + spellCheck={false} + className={`h-11 w-full bg-transparent px-3 font-mono text-[15px] tabular-nums text-ink placeholder:text-faint focus:outline-none ${ + invalid ? "text-loss" : "" + }`} + /> + {suffix && {suffix}} + + + ); +} + +export function Segmented({ + options, + value, + onChange, +}: { + options: { key: T; label: string }[]; + value: T; + onChange: (key: T) => void; +}) { + return ( +
+ {options.map((o) => { + const active = o.key === value; + return ( + + ); + })} +
+ ); +} + +export function Select({ + label, + value, + onChange, + options, +}: { + label: string; + value: T; + onChange: (value: T) => void; + options: { value: T; label: string }[]; +}) { + return ( + + ); +} + +export function Panel({ title, hint, children }: { title: string; hint?: ReactNode; children: ReactNode }) { + return ( +
+
+

{title}

+ {hint && {hint}} +
+
{children}
+
+ ); +} + +export type TxStatus = + | { kind: "idle" } + | { kind: "pending"; message: string } + | { kind: "success"; message: string; signature: string } + | { kind: "error"; message: string }; + +export function StatusLine({ status }: { status: TxStatus }) { + if (status.kind === "idle") return null; + if (status.kind === "pending") { + return ( +

+ + {status.message} +

+ ); + } + if (status.kind === "success") { + return ( +
+ ); + } + return

{status.message}

; +} diff --git a/finance/vault-strategy/anchor-v1/app/src/components/states.tsx b/finance/vault-strategy/anchor-v1/app/src/components/states.tsx new file mode 100644 index 000000000..1dd8ddb23 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/components/states.tsx @@ -0,0 +1,53 @@ +import { VAULT_PROGRAM_ID } from "../solana/config"; +import type { StrategyView } from "../solana/strategy"; +import { Addr, Field } from "./atoms"; + +export function Loading() { + return ( +
+ + reading chain… +
+ ); +} + +export function ErrorPanel({ message }: { message: string }) { + return ( +
+
+
RPC error
+

{message}

+

+ Point VITE_RPC_URL at your Quicknode devnet endpoint in{" "} + .env.local, then refresh. +

+
+
+ ); +} + +export function NotFound({ view }: { view: StrategyView }) { + return ( +
+
+
No strategy
+

+ Nothing at strategy #{view.index.toString()} on this cluster +

+

+ The program isn't deployed here, or no strategy exists at this index yet. Deploy the vault-strategy program to + devnet and seed it, then set the VITE_* variables to the new ids. See{" "} + app/README.md. +

+
+ + + + + + +
+
+
+ ); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/hooks/useVault.ts b/finance/vault-strategy/anchor-v1/app/src/hooks/useVault.ts new file mode 100644 index 000000000..25426f166 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/hooks/useVault.ts @@ -0,0 +1,186 @@ +import { useAnchorWallet, useConnection, useWallet } from "@solana/wallet-adapter-react"; +import type { PublicKey } from "@solana/web3.js"; +import { useCallback, useEffect, useMemo, useState } from "react"; +import { sendIxs } from "../lib/tx"; +import { + buildAddAssetIx, + buildCollectFeesIx, + buildDepositIx, + buildInitializeStrategyIx, + buildRebalanceIx, + buildSetWeightIx, + buildWithdrawIxs, + type InitializeStrategyParams, +} from "../solana/instructions"; +import { userAta } from "../solana/pdas"; +import { getProgram } from "../solana/program"; +import { readTokenAmount } from "../solana/pyth"; +import { loadPosition, loadStrategyView, type Position, type StrategyView } from "../solana/strategy"; + +interface Data { + loading: boolean; + error: string | null; + view: StrategyView | null; + position: Position | null; + walletUsdc: bigint | null; +} + +export interface VaultState extends Data { + connected: boolean; + isManager: boolean; + refresh: () => void; + // depositor + deposit: (usdcMinor: bigint, minShares: bigint) => Promise; + redeem: (sharesMinor: bigint, minUsdcOut: bigint) => Promise; + // manager + rebalance: (sellIndex: number, buyIndex: number, sellAmount: bigint, usdcToInvest: bigint) => Promise; + setWeight: (assetIndex: number, weightBps: number) => Promise; + addAsset: (mint: PublicKey, weightBps: number) => Promise; + collectFees: () => Promise; + createStrategy: (params: Omit) => Promise; +} + +/** Loads the strategy, the connected wallet's position + USDC balance, and exposes both + * depositor and manager actions. Every field is a live read; actions rebuild against a + * fresh view before sending, then refresh. */ +export function useVault(): VaultState { + const { connection } = useConnection(); + const anchorWallet = useAnchorWallet(); + const { publicKey } = useWallet(); + const program = useMemo(() => getProgram(connection, anchorWallet ?? undefined), [connection, anchorWallet]); + const [tick, setTick] = useState(0); + const [data, setData] = useState({ + loading: true, + error: null, + view: null, + position: null, + walletUsdc: null, + }); + + // biome-ignore lint/correctness/useExhaustiveDependencies(tick): `tick` is not read in the effect body — it exists purely so `refresh()` can force a refetch. + useEffect(() => { + let cancelled = false; + setData((d) => ({ ...d, loading: true, error: null })); + (async () => { + try { + const view = await loadStrategyView(connection, program); + let position: Position | null = null; + let walletUsdc: bigint | null = null; + if (view.exists && publicKey) { + position = await loadPosition(connection, view, publicKey); + const info = await connection.getAccountInfo(userAta(view.account!.usdcMint, publicKey)); + walletUsdc = info ? readTokenAmount(info.data) : 0n; + } + if (!cancelled) setData({ loading: false, error: null, view, position, walletUsdc }); + } catch (err) { + if (!cancelled) { + setData({ + loading: false, + error: err instanceof Error ? err.message : String(err), + view: null, + position: null, + walletUsdc: null, + }); + } + } + })(); + return () => { + cancelled = true; + }; + }, [connection, program, publicKey, tick]); + + const refresh = useCallback(() => setTick((t) => t + 1), []); + + // All senders rebuild against a freshly-loaded view so account derivations (asset + // count, mints, router) reflect the latest chain state, then refresh the UI. + const withFreshView = useCallback( + async (send: (view: StrategyView, manager: PublicKey) => Promise) => { + if (!anchorWallet) throw new Error("Connect a wallet first."); + const view = await loadStrategyView(connection, program); + if (!view.exists) throw new Error("Strategy not found on this cluster."); + const sig = await send(view, anchorWallet.publicKey); + refresh(); + return sig; + }, + [anchorWallet, connection, program, refresh], + ); + + const deposit = useCallback( + (usdcMinor: bigint, minShares: bigint) => + withFreshView(async (view, wallet) => + sendIxs(program, [await buildDepositIx(program, view, wallet, usdcMinor, minShares)]), + ), + [program, withFreshView], + ); + + const redeem = useCallback( + (sharesMinor: bigint, minUsdcOut: bigint) => + withFreshView(async (view, wallet) => + sendIxs(program, await buildWithdrawIxs(program, view, wallet, sharesMinor, minUsdcOut)), + ), + [program, withFreshView], + ); + + const rebalance = useCallback( + (sellIndex: number, buyIndex: number, sellAmount: bigint, usdcToInvest: bigint) => + withFreshView(async (view, wallet) => + sendIxs(program, [ + await buildRebalanceIx(program, view, wallet, sellIndex, buyIndex, sellAmount, usdcToInvest), + ]), + ), + [program, withFreshView], + ); + + const setWeight = useCallback( + (assetIndex: number, weightBps: number) => + withFreshView(async (view, wallet) => + sendIxs(program, [await buildSetWeightIx(program, view, wallet, assetIndex, weightBps)], 0), + ), + [program, withFreshView], + ); + + const addAsset = useCallback( + (mint: PublicKey, weightBps: number) => + withFreshView(async (view, wallet) => + sendIxs(program, [await buildAddAssetIx(program, view, wallet, mint, weightBps)], 0), + ), + [program, withFreshView], + ); + + const collectFees = useCallback( + () => withFreshView(async (view, wallet) => sendIxs(program, [await buildCollectFeesIx(program, view, wallet)], 0)), + [program, withFreshView], + ); + + const createStrategy = useCallback( + async (params: Omit) => { + if (!anchorWallet) throw new Error("Connect a wallet first."); + const ix = await buildInitializeStrategyIx(program, { ...params, manager: anchorWallet.publicKey }); + const sig = await sendIxs(program, [ix], 0); + refresh(); + return sig; + }, + [anchorWallet, program, refresh], + ); + + const isManager = !!( + publicKey && + data.view?.exists && + data.view.account && + data.view.account.manager.equals(publicKey) + ); + + return { + ...data, + connected: !!publicKey, + isManager, + refresh, + deposit, + redeem, + rebalance, + setWeight, + addAsset, + collectFees, + createStrategy, + }; +} diff --git a/finance/vault-strategy/anchor-v1/app/src/idl/vaultStrategy.ts b/finance/vault-strategy/anchor-v1/app/src/idl/vaultStrategy.ts new file mode 100644 index 000000000..a55f10902 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/idl/vaultStrategy.ts @@ -0,0 +1,51 @@ +import type { Idl } from "@coral-xyz/anchor"; +import idlJson from "./vault_strategy.json"; + +// The IDL, generated from the program source by `anchor idl build` (see the app +// README for the regeneration command). `address` is overridden +// at runtime by the configured program id (see src/solana/program.ts), so a fresh +// devnet deploy under a new id works without editing this file. +export const VAULT_STRATEGY_IDL = idlJson as Idl; + +import type { BN } from "@coral-xyz/anchor"; +// Typed shapes of the on-chain accounts, matching the `types` section of the IDL. +// (Anchor decodes to these; we cast fetch results to them for ergonomics.) +import type { PublicKey } from "@solana/web3.js"; + +export interface StrategyAccount { + index: BN; + manager: PublicKey; + registry: PublicKey; + shareMint: PublicKey; + usdcMint: PublicKey; + swapRouter: PublicKey; + feeBps: number; + maxSlippageBps: number; + totalShares: BN; + lastFeeAccrualTimestamp: BN; + assetCount: number; + totalWeightBps: number; + bump: number; +} + +export interface AssetConfigAccount { + strategy: PublicKey; + index: number; + mint: PublicKey; + priceFeed: PublicKey; + vault: PublicKey; + weightBps: number; + bump: number; +} + +export interface RegistryAccount { + authority: PublicKey; + bump: number; +} + +export interface ApprovedAssetAccount { + registry: PublicKey; + mint: PublicKey; + priceFeed: PublicKey; + bump: number; +} diff --git a/finance/vault-strategy/anchor-v1/app/src/idl/vault_strategy.json b/finance/vault-strategy/anchor-v1/app/src/idl/vault_strategy.json new file mode 100644 index 000000000..37587a0e7 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/idl/vault_strategy.json @@ -0,0 +1,1316 @@ +{ + "address": "VLT5W7bqhRN4nCdRpXm8UfHRxZd9EuZGqiSAkGHQfGh", + "metadata": { + "name": "vault_strategy", + "version": "0.1.0", + "spec": "0.1.0", + "description": "Manager-run investment vault with NAV-based shares" + }, + "instructions": [ + { + "name": "add_asset", + "docs": ["Add a curator-approved asset to the strategy at the next index. Manager only."], + "discriminator": [81, 53, 134, 142, 243, 73, 42, 179], + "accounts": [ + { + "name": "manager", + "writable": true, + "signer": true, + "relations": ["strategy"] + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "account", + "path": "strategy.index", + "account": "Strategy" + } + ] + } + }, + { + "name": "registry", + "relations": ["strategy"] + }, + { + "name": "asset_mint" + }, + { + "name": "approved_asset", + "docs": [ + "Proof the mint is approved, and the source of its official price feed.", + "Seeds tie it to this registry and this mint; existence means approved." + ], + "pda": { + "seeds": [ + { + "kind": "const", + "value": [97, 112, 112, 114, 111, 118, 101, 100, 95, 97, 115, 115, 101, 116] + }, + { + "kind": "account", + "path": "registry" + }, + { + "kind": "account", + "path": "asset_mint" + } + ] + } + }, + { + "name": "asset_config", + "writable": true + }, + { + "name": "vault_asset", + "docs": ["Strategy-owned vault for this asset."], + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "asset_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "weight_bps", + "type": "u16" + } + ] + }, + { + "name": "approve_asset", + "docs": ["Approve a mint and bind it to its official price feed. Registry authority only."], + "discriminator": [127, 15, 21, 247, 23, 22, 189, 238], + "accounts": [ + { + "name": "authority", + "writable": true, + "signer": true, + "relations": ["registry"] + }, + { + "name": "registry", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [114, 101, 103, 105, 115, 116, 114, 121] + }, + { + "kind": "account", + "path": "authority" + } + ] + } + }, + { + "name": "asset_mint" + }, + { + "name": "approved_asset", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [97, 112, 112, 114, 111, 118, 101, 100, 95, 97, 115, 115, 101, 116] + }, + { + "kind": "account", + "path": "registry" + }, + { + "kind": "account", + "path": "asset_mint" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "price_feed", + "type": "pubkey" + } + ] + }, + { + "name": "collect_fees", + "discriminator": [164, 152, 207, 99, 30, 186, 19, 182], + "accounts": [ + { + "name": "manager", + "relations": ["strategy"] + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "account", + "path": "strategy.index", + "account": "Strategy" + } + ] + } + }, + { + "name": "share_mint", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 104, 97, 114, 101, 95, 109, 105, 110, 116] + }, + { + "kind": "account", + "path": "strategy" + } + ] + } + }, + { + "name": "manager_share_account", + "docs": ["Manager's share token account - receives fee shares"], + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "manager" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "share_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "payer", + "writable": true, + "signer": true + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "deposit", + "discriminator": [242, 35, 198, 137, 82, 225, 242, 182], + "accounts": [ + { + "name": "depositor", + "writable": true, + "signer": true + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "account", + "path": "strategy.index", + "account": "Strategy" + } + ] + } + }, + { + "name": "share_mint", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 104, 97, 114, 101, 95, 109, 105, 110, 116] + }, + { + "kind": "account", + "path": "strategy" + } + ] + } + }, + { + "name": "usdc_mint", + "relations": ["strategy"] + }, + { + "name": "depositor_usdc_account", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "depositor" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "usdc_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "depositor_share_account", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "depositor" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "share_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "vault_usdc", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "usdc_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "router_config", + "writable": true + }, + { + "name": "router_usdc_treasury", + "writable": true + }, + { + "name": "router_authority", + "writable": true + }, + { + "name": "swap_router_program", + "address": "SWPR8Rk3aq3DrDGLdaANq7xCMnXoUFUJWJJmCWxc8Jm" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "usdc_amount", + "type": "u64" + }, + { + "name": "minimum_shares", + "type": "u64" + } + ] + }, + { + "name": "initialize_registry", + "docs": [ + "Create the curator record for an approved-asset set, owned by `authority`", + "(not a manager). The set itself lives in per-asset ApprovedAsset accounts." + ], + "discriminator": [189, 181, 20, 17, 174, 57, 249, 59], + "accounts": [ + { + "name": "authority", + "writable": true, + "signer": true + }, + { + "name": "registry", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [114, 101, 103, 105, 115, 116, 114, 121] + }, + { + "kind": "account", + "path": "authority" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_strategy", + "docs": [ + "Open a strategy at a caller-chosen index, e.g. index 0 derives the PDA", + "from seeds `\"strategy\" + 0`. Manager pays and becomes the strategy's manager." + ], + "discriminator": [208, 119, 144, 145, 178, 57, 105, 252], + "accounts": [ + { + "name": "manager", + "writable": true, + "signer": true + }, + { + "name": "usdc_mint" + }, + { + "name": "registry", + "docs": ["Registry whose approved assets this strategy may hold."] + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "arg", + "path": "index" + } + ] + } + }, + { + "name": "share_mint", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 104, 97, 114, 101, 95, 109, 105, 110, 116] + }, + { + "kind": "account", + "path": "strategy" + } + ] + } + }, + { + "name": "vault_usdc", + "docs": ["Vault's USDC token account - strategy PDA is the authority"], + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "usdc_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "index", + "type": "u64" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "max_slippage_bps", + "type": "u16" + }, + { + "name": "swap_router", + "type": "pubkey" + } + ] + }, + { + "name": "rebalance", + "discriminator": [108, 158, 77, 9, 210, 52, 88, 62], + "accounts": [ + { + "name": "manager", + "signer": true, + "relations": ["strategy"] + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "account", + "path": "strategy.index", + "account": "Strategy" + } + ] + } + }, + { + "name": "usdc_mint", + "relations": ["strategy"] + }, + { + "name": "sell_mint", + "writable": true + }, + { + "name": "buy_mint", + "writable": true + }, + { + "name": "sell_config" + }, + { + "name": "buy_config" + }, + { + "name": "sell_price_feed" + }, + { + "name": "buy_price_feed" + }, + { + "name": "vault_sell", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "sell_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "vault_buy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "buy_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "vault_usdc", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "usdc_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "sell_rate" + }, + { + "name": "buy_rate" + }, + { + "name": "router_config", + "writable": true + }, + { + "name": "router_usdc_treasury", + "writable": true + }, + { + "name": "router_authority", + "writable": true + }, + { + "name": "swap_router_program", + "address": "SWPR8Rk3aq3DrDGLdaANq7xCMnXoUFUJWJJmCWxc8Jm" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "sell_amount", + "type": "u64" + }, + { + "name": "usdc_to_invest", + "type": "u64" + } + ] + }, + { + "name": "set_weight", + "docs": ["Change an asset's target weight, or set it to zero to retire it. Manager only."], + "discriminator": [41, 228, 200, 244, 87, 125, 173, 36], + "accounts": [ + { + "name": "manager", + "signer": true, + "relations": ["strategy"] + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "account", + "path": "strategy.index", + "account": "Strategy" + } + ] + } + }, + { + "name": "asset_config", + "writable": true + } + ], + "args": [ + { + "name": "weight_bps", + "type": "u16" + } + ] + }, + { + "name": "withdraw", + "discriminator": [183, 18, 70, 156, 148, 109, 161, 34], + "accounts": [ + { + "name": "user", + "writable": true, + "signer": true + }, + { + "name": "strategy", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 116, 114, 97, 116, 101, 103, 121] + }, + { + "kind": "account", + "path": "strategy.index", + "account": "Strategy" + } + ] + } + }, + { + "name": "share_mint", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [115, 104, 97, 114, 101, 95, 109, 105, 110, 116] + }, + { + "kind": "account", + "path": "strategy" + } + ] + } + }, + { + "name": "usdc_mint", + "relations": ["strategy"] + }, + { + "name": "user_share_account", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "user" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "share_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "user_usdc_account", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "user" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "usdc_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "vault_usdc", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "strategy" + }, + { + "kind": "account", + "path": "token_program" + }, + { + "kind": "account", + "path": "usdc_mint" + } + ], + "program": { + "kind": "const", + "value": [ + 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16, + 132, 4, 142, 123, 216, 219, 233, 248, 89 + ] + } + } + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "shares_to_burn", + "type": "u64" + }, + { + "name": "min_usdc_out", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "ApprovedAsset", + "discriminator": [187, 133, 252, 71, 239, 199, 204, 13] + }, + { + "name": "AssetConfig", + "discriminator": [57, 112, 247, 166, 247, 64, 140, 23] + }, + { + "name": "Registry", + "discriminator": [47, 174, 110, 246, 184, 182, 252, 218] + }, + { + "name": "Strategy", + "discriminator": [174, 110, 39, 119, 82, 106, 169, 102] + } + ], + "errors": [ + { + "code": 6000, + "name": "SlippageTooHigh", + "msg": "Shares minted are below the minimum - slippage exceeded" + }, + { + "code": 6001, + "name": "UsdcSlippage", + "msg": "USDC out is below minimum - slippage exceeded" + }, + { + "code": 6002, + "name": "SwapSlippageExceeded", + "msg": "Swap output deviates from the oracle price by more than the allowed slippage" + }, + { + "code": 6003, + "name": "SlippageConfigTooHigh", + "msg": "Max slippage exceeds the maximum allowed configuration" + }, + { + "code": 6004, + "name": "AssetNotFound", + "msg": "Asset mint is not part of this strategy" + }, + { + "code": 6005, + "name": "TooManyAssets", + "msg": "Strategy already holds the maximum number of assets" + }, + { + "code": 6006, + "name": "DuplicateAsset", + "msg": "Asset is already part of this strategy" + }, + { + "code": 6007, + "name": "WeightOverflow", + "msg": "Total target weight would exceed 10000 basis points" + }, + { + "code": 6008, + "name": "StrategyNotFullyAllocated", + "msg": "Strategy weights must sum to 100% before it can accept deposits" + }, + { + "code": 6009, + "name": "IncompleteAssetAccounts", + "msg": "Wrong number of asset accounts supplied for the strategy's assets" + }, + { + "code": 6010, + "name": "InvalidAssetAccount", + "msg": "An asset account does not match the strategy's registered asset" + }, + { + "code": 6011, + "name": "InvalidVaultAccount", + "msg": "Token account could not be read" + }, + { + "code": 6012, + "name": "InvalidRecipient", + "msg": "Recipient token account is not owned by the withdrawing user" + }, + { + "code": 6013, + "name": "InvalidRegistry", + "msg": "Registry does not match the strategy's registered registry" + }, + { + "code": 6014, + "name": "NoTimeElapsed", + "msg": "No time has elapsed since last fee accrual" + }, + { + "code": 6015, + "name": "MathOverflow", + "msg": "Arithmetic overflow" + }, + { + "code": 6016, + "name": "ZeroShares", + "msg": "Cannot withdraw zero shares" + }, + { + "code": 6017, + "name": "ZeroDeposit", + "msg": "Cannot deposit zero USDC" + }, + { + "code": 6018, + "name": "ZeroTotalShares", + "msg": "Total shares are zero - cannot compute proportional withdraw" + }, + { + "code": 6019, + "name": "InvalidPriceFeed", + "msg": "Price feed account does not match the registered feed" + }, + { + "code": 6020, + "name": "NegativePrice", + "msg": "Pyth price is zero or negative" + }, + { + "code": 6021, + "name": "StalePriceFeed", + "msg": "Pyth price feed is stale" + }, + { + "code": 6022, + "name": "SameMint", + "msg": "Sell and buy mints must be different" + }, + { + "code": 6023, + "name": "InvalidUsdcMint", + "msg": "USDC mint does not match the strategy's registered USDC mint" + }, + { + "code": 6024, + "name": "InvalidSwapRouter", + "msg": "Swap router program does not match the strategy's registered swap router" + }, + { + "code": 6025, + "name": "FeeTooHigh", + "msg": "Management fee exceeds the maximum allowed" + } + ], + "types": [ + { + "name": "ApprovedAsset", + "docs": [ + "One curator-approved asset, binding its mint to its official Pyth", + "PriceUpdateV2 feed. Its address is a PDA seeded by the registry and the mint,", + "so existence of this account is the approval check: add_asset derives the", + "address and fails if no account is there. Created only by the registry", + "authority; add_asset copies `price_feed` from here so the manager never", + "supplies the feed." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "registry", + "type": "pubkey" + }, + { + "name": "mint", + "type": "pubkey" + }, + { + "name": "price_feed", + "type": "pubkey" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AssetConfig", + "docs": [ + "One basket asset. Its address is a PDA seeded by the strategy and the asset's", + "index, so the full set is the contiguous range 0..asset_count: any handler", + "computing net asset value re-derives every index and refuses to proceed if an", + "asset account is missing." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "strategy", + "type": "pubkey" + }, + { + "name": "index", + "type": "u8" + }, + { + "name": "mint", + "type": "pubkey" + }, + { + "name": "price_feed", + "docs": [ + "Pyth PriceUpdateV2 account, copied from the registry's ApprovedAsset at", + "add time so the manager cannot substitute a feed they control." + ], + "type": "pubkey" + }, + { + "name": "vault", + "docs": ["Strategy-owned associated token account holding this asset."], + "type": "pubkey" + }, + { + "name": "weight_bps", + "docs": [ + "Target share of the strategy's value in basis points. deposit deploys at these", + "weights (the sum across assets must reach 10000 before deposits open), and the", + "manager maintains them against price drift with rebalance." + ], + "type": "u16" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AssetRate", + "type": { + "kind": "struct", + "fields": [ + { + "name": "mint", + "type": "pubkey" + }, + { + "name": "usdc_per_token", + "docs": [ + "USDC base units per token base unit.", + "e.g. 250 means 1 token base unit = 250 USDC base units", + "(so 1.0 TSLAx = $250 when both have 6 decimals)" + ], + "type": "u64" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "Registry", + "docs": [ + "The curator record at the root of an approved-asset set. This account holds no", + "list: it only names the authority allowed to approve assets under it. The set", + "itself is the collection of `ApprovedAsset` accounts derived from this registry,", + "and an asset counts as approved exactly when its `ApprovedAsset` account exists.", + "", + "The authority is deliberately not a strategy manager: the curator vets which", + "real assets (and which official price feed) are safe, and a manager only", + "chooses among them. This is what stops a manager from listing a token they", + "mint themselves, or pairing a real mint with a feed they control." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "Strategy", + "docs": [ + "One strategy (basket). Its address is a PDA seeded by a caller-chosen index,", + "e.g. seeds `\"strategy\" + 0`, so strategies are addressed by a simple counter", + "rather than by the manager's key. The index is stored here so every handler", + "can re-derive the PDA to sign for the vaults and share mint." + ], + "type": { + "kind": "struct", + "fields": [ + { + "name": "index", + "docs": ["Index used as the PDA seed, e.g. 0 for the first strategy."], + "type": "u64" + }, + { + "name": "manager", + "type": "pubkey" + }, + { + "name": "registry", + "docs": [ + "Registry whose curator approves assets. add_asset only accepts mints", + "approved in this registry." + ], + "type": "pubkey" + }, + { + "name": "share_mint", + "type": "pubkey" + }, + { + "name": "usdc_mint", + "type": "pubkey" + }, + { + "name": "swap_router", + "type": "pubkey" + }, + { + "name": "fee_bps", + "docs": ["Annual management fee in basis points (e.g. 100 = 1%)."], + "type": "u16" + }, + { + "name": "max_slippage_bps", + "docs": [ + "Maximum tolerated deviation, in basis points, between a swap's output and", + "the Pyth-implied amount on deposit/rebalance. Bounded by MAX_SLIPPAGE_BPS." + ], + "type": "u16" + }, + { + "name": "total_shares", + "type": "u64" + }, + { + "name": "last_fee_accrual_timestamp", + "type": "i64" + }, + { + "name": "asset_count", + "docs": [ + "Assets live at PDAs indexed 0..asset_count, so callers can re-derive the", + "complete set and no asset can be silently omitted from a NAV calculation." + ], + "type": "u8" + }, + { + "name": "total_weight_bps", + "docs": ["Running sum of every asset's target weight, kept <= 10000."], + "type": "u16" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + } + ] +} diff --git a/finance/vault-strategy/anchor-v1/app/src/index.css b/finance/vault-strategy/anchor-v1/app/src/index.css new file mode 100644 index 000000000..32cd08e79 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/index.css @@ -0,0 +1,87 @@ +/* biome-ignore lint/suspicious/noUnknownAtRules: Tailwind v3 directive, expanded by PostCSS at build time */ +@tailwind base; +/* biome-ignore lint/suspicious/noUnknownAtRules: Tailwind v3 directive, expanded by PostCSS at build time */ +@tailwind components; +/* biome-ignore lint/suspicious/noUnknownAtRules: Tailwind v3 directive, expanded by PostCSS at build time */ +@tailwind utilities; + +@layer base { + :root { + color-scheme: dark; + } + html, + body, + #root { + height: 100%; + } + body { + @apply bg-graphite text-ink font-sans antialiased; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + } + /* Numbers read as instrument data: tabular by default in the mono face. */ + .font-mono { + font-variant-numeric: tabular-nums; + font-feature-settings: + "tnum" 1, + "zero" 1; + } +} + +@layer utilities { + .tnum { + font-variant-numeric: tabular-nums; + } +} + +/* Retune the wallet-adapter UI to the terminal (default ships a purple button). */ +.wallet-adapter-button { + font-family: "Archivo", ui-sans-serif, sans-serif !important; + height: 34px !important; + padding: 0 14px !important; + border-radius: 3px !important; + font-weight: 600 !important; + font-size: 13px !important; + line-height: 34px !important; +} +.wallet-adapter-button-trigger { + background: #f0b429 !important; + color: #0b0d10 !important; +} +.wallet-adapter-button-trigger:not([disabled]):hover { + background: #f4c356 !important; +} +.wallet-adapter-modal-wrapper, +.wallet-adapter-dropdown-list { + background: #111419 !important; + border: 1px solid rgba(233, 230, 225, 0.16) !important; + border-radius: 6px !important; +} +.wallet-adapter-modal-title { + font-family: "Archivo", ui-sans-serif, sans-serif !important; + color: #e8e6e1 !important; +} +.wallet-adapter-modal-list .wallet-adapter-button { + background: #161a20 !important; + color: #e8e6e1 !important; +} + +/* One authored moment: the active view settles in — a short exponential ease-out + with a whisper of blur clearing. Disabled entirely under reduced-motion. */ +@media (prefers-reduced-motion: no-preference) { + .animate-rise { + animation: rise 460ms cubic-bezier(0.16, 1, 0.3, 1) both; + } + @keyframes rise { + from { + opacity: 0; + transform: translateY(6px); + filter: blur(3px); + } + to { + opacity: 1; + transform: none; + filter: none; + } + } +} diff --git a/finance/vault-strategy/anchor-v1/app/src/lib/amounts.ts b/finance/vault-strategy/anchor-v1/app/src/lib/amounts.ts new file mode 100644 index 000000000..876ca91af --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/lib/amounts.ts @@ -0,0 +1,70 @@ +import type { StrategyView } from "../solana/strategy"; + +/** Parse a decimal string into minor units. Returns null if malformed or over-precise. */ +export function parseAmount(input: string, decimals: number): bigint | null { + const t = input.trim(); + if (t === "" || t === ".") return null; + if (!/^\d*\.?\d*$/.test(t)) return null; + const [whole, frac = ""] = t.split("."); + if (frac.length > decimals) return null; + const w = whole === "" ? 0n : BigInt(whole); + const f = frac === "" ? 0n : BigInt(frac.padEnd(decimals, "0")); + return w * 10n ** BigInt(decimals) + f; +} + +/** Shares a deposit would mint, matching the program: first deposit 1:1, else usdc*shares/nav. */ +export function estimateSharesOut(usdcMinor: bigint, navMinor: bigint, totalShares: bigint): bigint { + if (totalShares === 0n) return usdcMinor; + if (navMinor === 0n) return 0n; + return (usdcMinor * totalShares) / navMinor; +} + +export interface RedeemLeg { + index: number; + mint: string; + amountMinor: bigint; // 6dp +} + +export interface RedeemEstimate { + usdcMinor: bigint; + legs: RedeemLeg[]; +} + +/** The in-kind slice a redemption pays out, matching withdraw's proportional math. */ +export function estimateRedeem(sharesMinor: bigint, view: StrategyView): RedeemEstimate { + if (view.totalShares === 0n || sharesMinor <= 0n) { + return { + usdcMinor: 0n, + legs: view.assets.map((a) => ({ index: a.index, mint: a.mint.toBase58(), amountMinor: 0n })), + }; + } + const usdcMinor = (view.usdcAmount * sharesMinor) / view.totalShares; + const legs = view.assets.map((a) => ({ + index: a.index, + mint: a.mint.toBase58(), + amountMinor: (a.vaultAmount * sharesMinor) / view.totalShares, + })); + return { usdcMinor, legs }; +} + +/** Apply a bps slippage tolerance to a floor (e.g. minimum shares out). */ +export function applyToleranceFloor(amount: bigint, toleranceBps: number): bigint { + return (amount * BigInt(10_000 - toleranceBps)) / 10_000n; +} + +/** Ungrouped decimal string for filling an input (no thousands separators). */ +export function toAmountInput(minor: bigint, decimals = 6): string { + const base = 10n ** BigInt(decimals); + const whole = (minor / base).toString(); + const frac = (minor % base).toString().padStart(decimals, "0").replace(/0+$/, ""); + return frac ? `${whole}.${frac}` : whole; +} + +/** Parse a percent string (e.g. "40" or "12.5") into basis points, or null if invalid. */ +export function parsePercentToBps(input: string): number | null { + const t = input.trim(); + if (t === "" || !/^\d*\.?\d*$/.test(t)) return null; + const pct = Number(t); + if (!Number.isFinite(pct)) return null; + return Math.round(pct * 100); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/lib/tx.ts b/finance/vault-strategy/anchor-v1/app/src/lib/tx.ts new file mode 100644 index 000000000..446f17098 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/lib/tx.ts @@ -0,0 +1,46 @@ +import { AnchorError, type AnchorProvider } from "@coral-xyz/anchor"; +import { ComputeBudgetProgram, Transaction, type TransactionInstruction } from "@solana/web3.js"; +import type { VaultProgram } from "../solana/program"; + +/** + * Build a legacy transaction from instructions (with a compute-unit bump — deposit and + * rebalance run swaps + a mint and exceed the 200k default), sign with the provider's + * wallet, send, and confirm. Returns the signature. + * + * Note: baskets beyond ~3 assets exceed the legacy 1232-byte limit and need a v0 + * transaction with an Address Lookup Table; that's out of scope for the demo basket. + */ +export async function sendIxs( + program: VaultProgram, + ixs: TransactionInstruction[], + computeUnits = 400_000, +): Promise { + const provider = program.provider as AnchorProvider; + const tx = new Transaction(); + if (computeUnits > 0) { + tx.add(ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits })); + } + for (const ix of ixs) tx.add(ix); + return provider.sendAndConfirm(tx); +} + +/** Turn a thrown transaction error into a human message: problem, and where possible recovery. */ +export function describeError(err: unknown): string { + const e = err as { + error?: { errorMessage?: string }; + logs?: string[]; + message?: string; + }; + if (e?.error?.errorMessage) return e.error.errorMessage; + if (Array.isArray(e?.logs)) { + const parsed = AnchorError.parse(e.logs); + if (parsed) return parsed.error.errorMessage; + const line = e.logs.find((l) => l.includes("Error Message:")); + if (line) return line.split("Error Message:")[1].trim(); + } + if (typeof e?.message === "string") { + if (/user rejected|rejected the request/i.test(e.message)) return "Transaction rejected in wallet."; + return e.message.replace(/^failed to send transaction:\s*/i, ""); + } + return String(err); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/main.tsx b/finance/vault-strategy/anchor-v1/app/src/main.tsx new file mode 100644 index 000000000..2a82cdae9 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/main.tsx @@ -0,0 +1,29 @@ +import { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react"; +import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"; +import { PhantomWalletAdapter, SolflareWalletAdapter } from "@solana/wallet-adapter-wallets"; +import React, { useMemo } from "react"; +import ReactDOM from "react-dom/client"; +import "@solana/wallet-adapter-react-ui/styles.css"; +import "./index.css"; +import App from "./App"; +import { COMMITMENT, RPC_URL } from "./solana/config"; + +function Root() { + // Phantom/Solflare also register via Wallet Standard; listed for reliability in the demo. + const wallets = useMemo(() => [new PhantomWalletAdapter(), new SolflareWalletAdapter()], []); + return ( + + + + + + + + ); +} + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/finance/vault-strategy/anchor-v1/app/src/preview.tsx b/finance/vault-strategy/anchor-v1/app/src/preview.tsx new file mode 100644 index 000000000..c46e353e7 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/preview.tsx @@ -0,0 +1,139 @@ +import { BN } from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; +import ReactDOM from "react-dom/client"; +import "./index.css"; +import { ManagerView } from "./components/ManagerView"; +import type { VaultState } from "./hooks/useVault"; +import type { StrategyAccount } from "./idl/vaultStrategy"; +import type { AssetView, StrategyView } from "./solana/strategy"; +import { InvestorView } from "./views/InvestorView"; + +// ──────────────────────────────────────────────────────────────────────────── +// DEV-ONLY design preview. Renders InvestorView with fabricated data so the flagship +// view can be reviewed without a deployed devnet program. NOT wired into the real app +// (main.tsx / index.html): the shipped app only ever renders live account reads. +// ──────────────────────────────────────────────────────────────────────────── + +const k = () => PublicKey.unique(); + +const asset = ( + index: number, + price: bigint, + vaultAmount: bigint, + valueUsdc: bigint, + weightBps: number, + actualWeight: number, +): AssetView => ({ + index, + config: k(), + mint: k(), + vault: k(), + priceFeed: k(), + weightBps, + vaultAmount, + price, + publishTime: 1_900_000_000, + stale: false, + valueUsdc, + actualWeight, +}); + +const account: StrategyAccount = { + index: new BN(0), + manager: k(), + registry: k(), + shareMint: k(), + usdcMint: k(), + swapRouter: k(), + feeBps: 100, + maxSlippageBps: 100, + totalShares: new BN("12600000000"), + lastFeeAccrualTimestamp: new BN("1900000000"), + assetCount: 2, + totalWeightBps: 10_000, + bump: 255, +}; + +const view: StrategyView = { + exists: true, + index: 0n, + strategy: k(), + shareMint: account.shareMint, + usdcVault: k(), + account, + usdcAmount: 0n, + assets: [ + asset(0, 25_000_000_000n, 20_545_200n, 5_136_300_000n, 4000, 0.4), + asset(1, 18_000_000_000n, 42_802_500n, 7_704_450_000n, 6000, 0.6), + ], + navMinor: 12_840_750_000n, + navComplete: true, + totalShares: 12_600_000_000n, + navPerShareMinor: 1_019_107n, + fullyAllocated: true, +}; + +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); +const mockSig = "Prev1ewS1gnatureX9mB4kZ2qWvR7tNjHcYfDpL3sAe8uK1oI5rT6yUw"; + +const act = async () => { + await sleep(500); + return mockSig; +}; + +const vault: VaultState = { + loading: false, + error: null, + view, + position: { + shares: 3_150_000_000n, + ownership: 0.25, + valueMinor: 3_210_187_500n, + shareAccount: k(), + shareAccountExists: true, + }, + walletUsdc: 5_000_000_000n, + connected: true, + isManager: true, + refresh: () => {}, + deposit: act, + redeem: act, + rebalance: act, + setWeight: act, + addAsset: act, + collectFees: act, + createStrategy: act, +}; + +ReactDOM.createRoot(document.getElementById("root")!).render( +
+
+
+ + VAULT STRATEGY + / #0 +
+
+ + devnet + + + 7xQ…4mB + +
+
+
+
+ Investor tab +
+ +
+ Manager tab +
+ +
+
+ Design preview · fabricated data. The shipped app renders only live on-chain reads. +
+
, +); diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/config.ts b/finance/vault-strategy/anchor-v1/app/src/solana/config.ts new file mode 100644 index 000000000..f1e655551 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/config.ts @@ -0,0 +1,37 @@ +import type { Commitment } from "@solana/web3.js"; +import { PublicKey } from "@solana/web3.js"; + +// Repo localnet ids (Anchor.toml / declare_id!). Overridden by env after a devnet deploy. +const DEFAULT_VAULT_PROGRAM = "VLT5W7bqhRN4nCdRpXm8UfHRxZd9EuZGqiSAkGHQfGh"; +const DEFAULT_ROUTER_PROGRAM = "SWPR8Rk3aq3DrDGLdaANq7xCMnXoUFUJWJJmCWxc8Jm"; + +const env = import.meta.env; + +function optionalPubkey(value: string | undefined): PublicKey | null { + if (!value) return null; + return new PublicKey(value); // throws on a malformed value — fail loud, not silent +} + +/** RPC endpoint. Defaults to public devnet; point VITE_RPC_URL at your Quicknode devnet. */ +export const RPC_URL: string = env.VITE_RPC_URL || "https://api.devnet.solana.com"; + +export const VAULT_PROGRAM_ID = new PublicKey(env.VITE_VAULT_PROGRAM_ID || DEFAULT_VAULT_PROGRAM); +export const ROUTER_PROGRAM_ID = new PublicKey(env.VITE_ROUTER_PROGRAM_ID || DEFAULT_ROUTER_PROGRAM); + +/** The USDC mint the strategy was created with. Null until configured (post-seed). */ +export const USDC_MINT: PublicKey | null = optionalPubkey(env.VITE_USDC_MINT); + +/** PDA seed for the strategy under view ("strategy" + index). */ +export const STRATEGY_INDEX: bigint = BigInt(env.VITE_STRATEGY_INDEX ?? "0"); + +export const CLUSTER: string = env.VITE_CLUSTER || "devnet"; +export const COMMITMENT: Commitment = "confirmed"; + +// Program constants, mirrored from the Rust source (state/*.rs, instructions/*.rs). +export const MAX_ASSETS = 16; +export const MAX_FEE_BPS = 1_000; // 10% +export const MAX_SLIPPAGE_BPS = 1_000; // 10% +export const BPS_DENOMINATOR = 10_000; +export const PYTH_PRICE_PRECISION = 100_000_000n; // 10^8, Pyth exponent -8 +export const MAX_PRICE_AGE_SECONDS = 60; +export const SHARE_DECIMALS = 6; // share_mint is created with mint::decimals = 6 diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/format.ts b/finance/vault-strategy/anchor-v1/app/src/solana/format.ts new file mode 100644 index 000000000..667e3c318 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/format.ts @@ -0,0 +1,53 @@ +import type { PublicKey } from "@solana/web3.js"; +import { CLUSTER, RPC_URL } from "./config"; + +function groupThousands(intDigits: string): string { + return intDigits.replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + +/** Format a fixed-point integer (`minor`) with `decimals` places, showing `frac` of them. */ +export function formatUnits(minor: bigint, decimals: number, frac = 2): string { + const negative = minor < 0n; + const abs = negative ? -minor : minor; + const base = 10n ** BigInt(decimals); + const whole = abs / base; + const fraction = (abs % base).toString().padStart(decimals, "0"); + const shownFrac = frac <= 0 ? "" : `.${fraction.slice(0, frac).padEnd(frac, "0")}`; + return `${negative ? "-" : ""}${groupThousands(whole.toString())}${shownFrac}`; +} + +/** USDC amount (6dp minor units) → "1,363.50". */ +export const formatUsdc = (minor: bigint, frac = 2): string => formatUnits(minor, 6, frac); + +/** Share amount (6dp minor units) → "900.000000", trailing zeros trimmed to `minFrac`. */ +export function formatShares(minor: bigint, minFrac = 2): string { + const full = formatUnits(minor, 6, 6); + if (!full.includes(".")) return full; + const [w, f] = full.split("."); + const trimmed = f.replace(/0+$/, ""); + const kept = trimmed.length < minFrac ? trimmed.padEnd(minFrac, "0") : trimmed; + return kept ? `${w}.${kept}` : w; +} + +/** Basis points → percent string, e.g. 100 → "1.00%". */ +export const formatBps = (bps: number, frac = 2): string => `${(bps / 100).toFixed(frac)}%`; + +/** A 0..1 ratio → percent string, e.g. 0.375 → "37.5%". */ +export const formatRatioPct = (ratio: number, frac = 1): string => `${(ratio * 100).toFixed(frac)}%`; + +export function shortAddress(value: PublicKey | string, edge = 4): string { + const s = typeof value === "string" ? value : value.toBase58(); + return s.length <= edge * 2 + 1 ? s : `${s.slice(0, edge)}…${s.slice(-edge)}`; +} + +function explorerSuffix(): string { + if (CLUSTER === "mainnet-beta") return ""; + if (CLUSTER === "custom") return `?cluster=custom&customUrl=${encodeURIComponent(RPC_URL)}`; + return `?cluster=${CLUSTER}`; // devnet / testnet +} + +export const explorerTx = (signature: string): string => + `https://explorer.solana.com/tx/${signature}${explorerSuffix()}`; + +export const explorerAddress = (address: PublicKey | string): string => + `https://explorer.solana.com/address/${typeof address === "string" ? address : address.toBase58()}${explorerSuffix()}`; diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/instructions.ts b/finance/vault-strategy/anchor-v1/app/src/solana/instructions.ts new file mode 100644 index 000000000..9c5887200 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/instructions.ts @@ -0,0 +1,291 @@ +import { BN } from "@coral-xyz/anchor"; +import { createAssociatedTokenAccountIdempotentInstruction } from "@solana/spl-token"; +import { type AccountMeta, type PublicKey, SystemProgram, type TransactionInstruction } from "@solana/web3.js"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + approvedAssetPda, + assetConfigPda, + assetRatePda, + registryPda, + routerAuthorityPda, + routerConfigPda, + routerUsdcTreasury, + shareMintPda, + strategyPda, + TOKEN_PROGRAM_ID, + userAta, + vaultAta, +} from "./pdas"; +import type { VaultProgram } from "./program"; +import type { StrategyView } from "./strategy"; + +const bn = (v: bigint): BN => new BN(v.toString()); +const ro = (pubkey: PublicKey): AccountMeta => ({ pubkey, isSigner: false, isWritable: false }); +const rw = (pubkey: PublicKey): AccountMeta => ({ pubkey, isSigner: false, isWritable: true }); + +// The three account keys every token-touching instruction shares. +const TOKEN_PROGRAMS = { + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, +}; + +function requireAccount(view: StrategyView) { + if (!view.account) throw new Error("strategy does not exist on this cluster"); + return view.account; +} + +// ---- depositor ------------------------------------------------------------- + +/** + * deposit(usdc_amount, minimum_shares). remaining_accounts per asset, in the order the + * program reads: [asset_config(ro), vault(rw), mint(rw), rate(ro), price_feed(ro)]. + */ +export function buildDepositIx( + program: VaultProgram, + view: StrategyView, + depositor: PublicKey, + usdcAmount: bigint, + minimumShares: bigint, +): Promise { + const s = requireAccount(view); + const router = s.swapRouter; + const remaining: AccountMeta[] = []; + for (const a of view.assets) { + remaining.push(ro(a.config), rw(a.vault), rw(a.mint), ro(assetRatePda(a.mint, router)), ro(a.priceFeed)); + } + return program.methods + .deposit(bn(usdcAmount), bn(minimumShares)) + .accountsStrict({ + depositor, + strategy: view.strategy, + shareMint: view.shareMint, + usdcMint: s.usdcMint, + depositorUsdcAccount: userAta(s.usdcMint, depositor), + depositorShareAccount: userAta(view.shareMint, depositor), + vaultUsdc: view.usdcVault, + routerConfig: routerConfigPda(router), + routerUsdcTreasury: routerUsdcTreasury(s.usdcMint, router), + routerAuthority: routerAuthorityPda(router), + swapRouterProgram: router, + ...TOKEN_PROGRAMS, + }) + .remainingAccounts(remaining) + .instruction(); +} + +/** + * withdraw(shares_to_burn, min_usdc_out). The program pays in kind, so the user must + * already hold a token account for every asset — we create them idempotently first. + * remaining_accounts per asset: [asset_config(ro), vault(rw), mint(ro), user_ata(rw)]. + * Returns the ATA-creation instructions followed by the withdraw instruction. + */ +export async function buildWithdrawIxs( + program: VaultProgram, + view: StrategyView, + user: PublicKey, + sharesToBurn: bigint, + minUsdcOut: bigint, +): Promise { + const s = requireAccount(view); + const pre: TransactionInstruction[] = []; + const usdcAta = userAta(s.usdcMint, user); + pre.push(createAssociatedTokenAccountIdempotentInstruction(user, usdcAta, user, s.usdcMint)); + + const remaining: AccountMeta[] = []; + for (const a of view.assets) { + const ata = userAta(a.mint, user); + pre.push(createAssociatedTokenAccountIdempotentInstruction(user, ata, user, a.mint)); + remaining.push(ro(a.config), rw(a.vault), ro(a.mint), rw(ata)); + } + + const ix = await program.methods + .withdraw(bn(sharesToBurn), bn(minUsdcOut)) + .accountsStrict({ + user, + strategy: view.strategy, + shareMint: view.shareMint, + usdcMint: s.usdcMint, + userShareAccount: userAta(view.shareMint, user), + userUsdcAccount: usdcAta, + vaultUsdc: view.usdcVault, + ...TOKEN_PROGRAMS, + }) + .remainingAccounts(remaining) + .instruction(); + + return [...pre, ix]; +} + +// ---- manager --------------------------------------------------------------- + +/** rebalance(sell_amount, usdc_to_invest): sell one asset for USDC, buy another. */ +export function buildRebalanceIx( + program: VaultProgram, + view: StrategyView, + manager: PublicKey, + sellIndex: number, + buyIndex: number, + sellAmount: bigint, + usdcToInvest: bigint, +): Promise { + const s = requireAccount(view); + const router = s.swapRouter; + const sell = view.assets[sellIndex]; + const buy = view.assets[buyIndex]; + if (!sell || !buy) throw new Error("sell/buy asset index out of range"); + return program.methods + .rebalance(bn(sellAmount), bn(usdcToInvest)) + .accountsStrict({ + manager, + strategy: view.strategy, + usdcMint: s.usdcMint, + sellMint: sell.mint, + buyMint: buy.mint, + sellConfig: sell.config, + buyConfig: buy.config, + sellPriceFeed: sell.priceFeed, + buyPriceFeed: buy.priceFeed, + vaultSell: sell.vault, + vaultBuy: buy.vault, + vaultUsdc: view.usdcVault, + sellRate: assetRatePda(sell.mint, router), + buyRate: assetRatePda(buy.mint, router), + routerConfig: routerConfigPda(router), + routerUsdcTreasury: routerUsdcTreasury(s.usdcMint, router), + routerAuthority: routerAuthorityPda(router), + swapRouterProgram: router, + ...TOKEN_PROGRAMS, + }) + .instruction(); +} + +/** set_weight(weight_bps): reweight an asset, or set 0 to retire it. */ +export function buildSetWeightIx( + program: VaultProgram, + view: StrategyView, + manager: PublicKey, + assetIndex: number, + weightBps: number, +): Promise { + return program.methods + .setWeight(weightBps) + .accountsStrict({ + manager, + strategy: view.strategy, + assetConfig: assetConfigPda(view.strategy, assetIndex), + }) + .instruction(); +} + +/** add_asset(weight_bps): register a curator-approved mint at the next index. */ +export function buildAddAssetIx( + program: VaultProgram, + view: StrategyView, + manager: PublicKey, + assetMint: PublicKey, + weightBps: number, +): Promise { + const s = requireAccount(view); + const registry = s.registry; + return program.methods + .addAsset(weightBps) + .accountsStrict({ + manager, + strategy: view.strategy, + registry, + assetMint, + approvedAsset: approvedAssetPda(registry, assetMint), + assetConfig: assetConfigPda(view.strategy, s.assetCount), + vaultAsset: vaultAta(assetMint, view.strategy), + ...TOKEN_PROGRAMS, + }) + .instruction(); +} + +/** collect_fees(): permissionless — anyone pays to mint the accrued fee to the manager. */ +export function buildCollectFeesIx( + program: VaultProgram, + view: StrategyView, + payer: PublicKey, +): Promise { + const s = requireAccount(view); + return program.methods + .collectFees() + .accountsStrict({ + manager: s.manager, + strategy: view.strategy, + shareMint: view.shareMint, + managerShareAccount: userAta(view.shareMint, s.manager), + payer, + ...TOKEN_PROGRAMS, + }) + .instruction(); +} + +export interface InitializeStrategyParams { + manager: PublicKey; + usdcMint: PublicKey; + registry: PublicKey; + index: bigint; + feeBps: number; + maxSlippageBps: number; + swapRouter: PublicKey; +} + +/** initialize_strategy(index, fee_bps, max_slippage_bps, swap_router). */ +export function buildInitializeStrategyIx( + program: VaultProgram, + p: InitializeStrategyParams, +): Promise { + const strategy = strategyPda(p.index); + return program.methods + .initializeStrategy(bn(p.index), p.feeBps, p.maxSlippageBps, p.swapRouter) + .accountsStrict({ + manager: p.manager, + usdcMint: p.usdcMint, + registry: p.registry, + strategy, + shareMint: shareMintPda(strategy), + vaultUsdc: vaultAta(p.usdcMint, strategy), + ...TOKEN_PROGRAMS, + }) + .instruction(); +} + +// ---- curator (registry) — used by seeding / a future curator surface -------- + +/** initialize_registry(): create the curator record owned by `authority`. */ +export function buildInitializeRegistryIx( + program: VaultProgram, + authority: PublicKey, +): Promise { + return program.methods + .initializeRegistry() + .accountsStrict({ + authority, + registry: registryPda(authority), + systemProgram: SystemProgram.programId, + }) + .instruction(); +} + +/** approve_asset(price_feed): bind a mint to its official Pyth feed. */ +export function buildApproveAssetIx( + program: VaultProgram, + authority: PublicKey, + assetMint: PublicKey, + priceFeed: PublicKey, +): Promise { + const registry = registryPda(authority); + return program.methods + .approveAsset(priceFeed) + .accountsStrict({ + authority, + registry, + assetMint, + approvedAsset: approvedAssetPda(registry, assetMint), + systemProgram: SystemProgram.programId, + }) + .instruction(); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/pdas.ts b/finance/vault-strategy/anchor-v1/app/src/solana/pdas.ts new file mode 100644 index 000000000..040c15981 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/pdas.ts @@ -0,0 +1,67 @@ +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { PublicKey } from "@solana/web3.js"; +import { ROUTER_PROGRAM_ID, VAULT_PROGRAM_ID } from "./config"; + +const seed = (s: string): Buffer => Buffer.from(s, "utf8"); + +function u64le(n: bigint | number): Buffer { + const buf = Buffer.alloc(8); + buf.writeBigUInt64LE(BigInt(n)); + return buf; +} + +const pda = (seeds: Array, programId: PublicKey): PublicKey => + PublicKey.findProgramAddressSync(seeds, programId)[0]; + +// ---- vault-strategy program PDAs ------------------------------------------- + +/** ["strategy", index_u64_le] */ +export const strategyPda = (index: bigint): PublicKey => pda([seed("strategy"), u64le(index)], VAULT_PROGRAM_ID); + +/** ["share_mint", strategy] */ +export const shareMintPda = (strategy: PublicKey): PublicKey => + pda([seed("share_mint"), strategy.toBuffer()], VAULT_PROGRAM_ID); + +/** ["asset", strategy, index_u8] */ +export const assetConfigPda = (strategy: PublicKey, index: number): PublicKey => + pda([seed("asset"), strategy.toBuffer(), Buffer.from([index])], VAULT_PROGRAM_ID); + +/** ["registry", authority] */ +export const registryPda = (authority: PublicKey): PublicKey => + pda([seed("registry"), authority.toBuffer()], VAULT_PROGRAM_ID); + +/** ["approved_asset", registry, mint] — existence == approved */ +export const approvedAssetPda = (registry: PublicKey, mint: PublicKey): PublicKey => + pda([seed("approved_asset"), registry.toBuffer(), mint.toBuffer()], VAULT_PROGRAM_ID); + +// ---- mock-swap-router program PDAs ----------------------------------------- +// The strategy stores which router it uses, so these accept the router program id +// (defaulting to the configured one) to stay correct if a strategy points elsewhere. + +/** ["router_config"] */ +export const routerConfigPda = (routerProgram: PublicKey = ROUTER_PROGRAM_ID): PublicKey => + pda([seed("router_config")], routerProgram); + +/** ["router_authority"] */ +export const routerAuthorityPda = (routerProgram: PublicKey = ROUTER_PROGRAM_ID): PublicKey => + pda([seed("router_authority")], routerProgram); + +/** ["rate", mint] */ +export const assetRatePda = (mint: PublicKey, routerProgram: PublicKey = ROUTER_PROGRAM_ID): PublicKey => + pda([seed("rate"), mint.toBuffer()], routerProgram); + +// ---- associated token accounts --------------------------------------------- + +/** Strategy-owned vault ATA for a mint (strategy is a PDA → allowOwnerOffCurve). */ +export const vaultAta = (mint: PublicKey, strategy: PublicKey): PublicKey => + getAssociatedTokenAddressSync(mint, strategy, true); + +/** A wallet's ATA for a mint. */ +export const userAta = (mint: PublicKey, owner: PublicKey): PublicKey => + getAssociatedTokenAddressSync(mint, owner, false); + +/** Router USDC treasury = ATA(usdc, router_authority). */ +export const routerUsdcTreasury = (usdcMint: PublicKey, routerProgram: PublicKey = ROUTER_PROGRAM_ID): PublicKey => + getAssociatedTokenAddressSync(usdcMint, routerAuthorityPda(routerProgram), true); + +export { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID }; diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/program.ts b/finance/vault-strategy/anchor-v1/app/src/solana/program.ts new file mode 100644 index 000000000..977940c93 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/program.ts @@ -0,0 +1,54 @@ +import type { Idl } from "@coral-xyz/anchor"; +import { AnchorProvider, Program } from "@coral-xyz/anchor"; +import { Connection, Keypair, type PublicKey, type Transaction, type VersionedTransaction } from "@solana/web3.js"; +import { VAULT_STRATEGY_IDL } from "../idl/vaultStrategy"; +import { COMMITMENT, RPC_URL, VAULT_PROGRAM_ID } from "./config"; + +export interface AnchorWalletLike { + publicKey: PublicKey; + signTransaction: (tx: T) => Promise; + signAllTransactions: (txs: T[]) => Promise; +} + +// Use the configured program id, not the value baked into the JSON, so a devnet +// redeploy under a new id needs only an env change. +function idl(): Idl { + return { ...(VAULT_STRATEGY_IDL as Idl), address: VAULT_PROGRAM_ID.toBase58() }; +} + +/** A wallet stand-in for read-only use before a real wallet connects. */ +function readonlyWallet(): AnchorWalletLike { + const kp = Keypair.generate(); + return { + publicKey: kp.publicKey, + signTransaction: async (tx) => tx, + signAllTransactions: async (txs) => txs, + }; +} + +export function makeConnection(): Connection { + return new Connection(RPC_URL, COMMITMENT); +} + +export function makeProvider(connection: Connection, wallet?: AnchorWalletLike): AnchorProvider { + return new AnchorProvider(connection, wallet ?? readonlyWallet(), { + commitment: COMMITMENT, + preflightCommitment: COMMITMENT, + }); +} + +/** + * Anchor Program with loosely-typed `methods`/`account` namespaces. The strong + * per-instruction types normally come from `anchor build` codegen, which is + * unavailable in this environment; typed reads live in strategy.ts and typed + * builders in instructions.ts instead. + */ +export type VaultProgram = Omit & { + methods: any; + account: any; +}; + +/** Build the Program. Pass a wallet to send transactions; omit it for reads. */ +export function getProgram(connection: Connection, wallet?: AnchorWalletLike): VaultProgram { + return new Program(idl(), makeProvider(connection, wallet)) as unknown as VaultProgram; +} diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/pyth.ts b/finance/vault-strategy/anchor-v1/app/src/solana/pyth.ts new file mode 100644 index 000000000..6485978a1 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/pyth.ts @@ -0,0 +1,45 @@ +// Raw account parsing that mirrors the program byte-for-byte (see programs/.../oracle.rs). +// The program reads Pyth PriceUpdateV2 and SPL token/mint accounts directly from bytes to +// dodge borsh/SDK version drift; the client must read them the same way to agree on NAV. + +const PYTH_PRICE_OFFSET = 73; // i64 price +const PYTH_PUBLISH_TIME_OFFSET = 93; // i64 publish_time +const TOKEN_AMOUNT_OFFSET = 64; // u64 amount in an SPL token account +const MINT_DECIMALS_OFFSET = 44; // u8 decimals in an SPL mint account + +export interface PythPrice { + /** Price as an integer at exponent -8 (Pyth USD pairs). Divide by 10^8 for dollars. */ + price: bigint; + /** Unix seconds of the last update. */ + publishTime: number; +} + +function view(data: Uint8Array): DataView { + return new DataView(data.buffer, data.byteOffset, data.byteLength); +} + +export function parsePriceUpdateV2(data: Uint8Array): PythPrice { + if (data.length < PYTH_PUBLISH_TIME_OFFSET + 8) { + throw new Error("price feed account is too small to be a PriceUpdateV2"); + } + const dv = view(data); + return { + price: dv.getBigInt64(PYTH_PRICE_OFFSET, true), + publishTime: Number(dv.getBigInt64(PYTH_PUBLISH_TIME_OFFSET, true)), + }; +} + +export function readTokenAmount(data: Uint8Array): bigint { + if (data.length < TOKEN_AMOUNT_OFFSET + 8) throw new Error("not a token account"); + return view(data).getBigUint64(TOKEN_AMOUNT_OFFSET, true); +} + +export function readMintDecimals(data: Uint8Array): number { + if (data.length <= MINT_DECIMALS_OFFSET) throw new Error("not a mint account"); + return data[MINT_DECIMALS_OFFSET]; +} + +/** The program rejects prices older than 60s. `now` and `publishTime` are unix seconds. */ +export function priceAgeSeconds(publishTime: number, now: number): number { + return now - publishTime; +} diff --git a/finance/vault-strategy/anchor-v1/app/src/solana/strategy.ts b/finance/vault-strategy/anchor-v1/app/src/solana/strategy.ts new file mode 100644 index 000000000..cbd54630f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/solana/strategy.ts @@ -0,0 +1,206 @@ +import type { BN } from "@coral-xyz/anchor"; +import type { Connection, PublicKey } from "@solana/web3.js"; +import type { AssetConfigAccount, StrategyAccount } from "../idl/vaultStrategy"; +import { MAX_PRICE_AGE_SECONDS, PYTH_PRICE_PRECISION, STRATEGY_INDEX } from "./config"; +import { assetConfigPda, shareMintPda, strategyPda, userAta, vaultAta } from "./pdas"; +import type { VaultProgram } from "./program"; +import { parsePriceUpdateV2, readTokenAmount } from "./pyth"; + +const toBig = (v: BN): bigint => BigInt(v.toString()); +const nowSeconds = (): number => Math.floor(Date.now() / 1000); + +export interface AssetView { + index: number; + config: PublicKey; + mint: PublicKey; + vault: PublicKey; + priceFeed: PublicKey; + weightBps: number; + vaultAmount: bigint; + price: bigint | null; // exponent -8 + publishTime: number | null; + stale: boolean; + valueUsdc: bigint | null; // vaultAmount * price / 1e8 + actualWeight: number | null; // valueUsdc / nav, 0..1 +} + +export interface StrategyView { + exists: boolean; + index: bigint; + strategy: PublicKey; + shareMint: PublicKey; + usdcVault: PublicKey; + account: StrategyAccount | null; + usdcAmount: bigint; + assets: AssetView[]; + navMinor: bigint; + /** False when a held asset could not be freshly priced (NAV is then a floor). */ + navComplete: boolean; + totalShares: bigint; + /** USDC per whole share, scaled by 1e6 (so 1.01 USDC/share → 1_010_000n). */ + navPerShareMinor: bigint; + fullyAllocated: boolean; +} + +export interface Position { + shares: bigint; + ownership: number; // 0..1 + valueMinor: bigint; // USDC minor units + shareAccount: PublicKey; + shareAccountExists: boolean; +} + +/** Fetch just the Strategy account (null if it doesn't exist on this cluster). */ +export async function loadStrategyAccount( + program: VaultProgram, + index: bigint = STRATEGY_INDEX, +): Promise<{ strategy: PublicKey; account: StrategyAccount } | null> { + const strategy = strategyPda(index); + const account = (await program.account.strategy.fetchNullable(strategy)) as StrategyAccount | null; + return account ? { strategy, account } : null; +} + +/** + * Load everything the UI needs about a strategy: config, assets, vault balances, and + * freshly parsed oracle prices, then derive NAV exactly as the program does + * (value = amount * price / 1e8, all in USDC minor units). + */ +export async function loadStrategyView( + connection: Connection, + program: VaultProgram, + index: bigint = STRATEGY_INDEX, +): Promise { + const strategy = strategyPda(index); + const shareMint = shareMintPda(strategy); + const account = (await program.account.strategy.fetchNullable(strategy)) as StrategyAccount | null; + + if (!account) { + return { + exists: false, + index, + strategy, + shareMint, + usdcVault: shareMint, // placeholder; unused when !exists + account: null, + usdcAmount: 0n, + assets: [], + navMinor: 0n, + navComplete: false, + totalShares: 0n, + navPerShareMinor: 1_000_000n, + fullyAllocated: false, + }; + } + + const usdcVault = vaultAta(account.usdcMint, strategy); + const assetCount = account.assetCount; + + const configPdas = Array.from({ length: assetCount }, (_, i) => assetConfigPda(strategy, i)); + const configs = (await program.account.assetConfig.fetchMultiple(configPdas)) as (AssetConfigAccount | null)[]; + + // One RPC round-trip for the USDC vault + every asset vault + every price feed. + const raw: PublicKey[] = [usdcVault]; + configs.forEach((c) => { + if (c) raw.push(c.vault, c.priceFeed); + }); + const infos = await connection.getMultipleAccountsInfo(raw); + + const usdcInfo = infos[0]; + const usdcAmount = usdcInfo ? readTokenAmount(usdcInfo.data) : 0n; + + const now = nowSeconds(); + let navMinor = usdcAmount; + let navComplete = true; + let cursor = 1; + + const assets: AssetView[] = configs.map((c, i) => { + const config = configPdas[i]; + if (!c) { + navComplete = false; + return { + index: i, + config, + mint: config, + vault: config, + priceFeed: config, + weightBps: 0, + vaultAmount: 0n, + price: null, + publishTime: null, + stale: false, + valueUsdc: null, + actualWeight: null, + }; + } + const vaultInfo = infos[cursor++]; + const feedInfo = infos[cursor++]; + const vaultAmount = vaultInfo ? readTokenAmount(vaultInfo.data) : 0n; + + let price: bigint | null = null; + let publishTime: number | null = null; + let stale = false; + if (feedInfo) { + try { + const parsed = parsePriceUpdateV2(feedInfo.data); + price = parsed.price; + publishTime = parsed.publishTime; + stale = now - publishTime > MAX_PRICE_AGE_SECONDS; + } catch { + price = null; + } + } + + const priced = price !== null && price > 0n; + const valueUsdc = priced ? (vaultAmount * price!) / PYTH_PRICE_PRECISION : null; + if (valueUsdc !== null) navMinor += valueUsdc; + else if (vaultAmount > 0n) navComplete = false; // holding we can't value + + return { + index: c.index, + config, + mint: c.mint, + vault: c.vault, + priceFeed: c.priceFeed, + weightBps: c.weightBps, + vaultAmount, + price, + publishTime, + stale, + valueUsdc, + actualWeight: null, // filled below once nav is known + }; + }); + + for (const a of assets) { + a.actualWeight = a.valueUsdc !== null && navMinor > 0n ? Number(a.valueUsdc) / Number(navMinor) : null; + } + + const totalShares = toBig(account.totalShares); + const navPerShareMinor = totalShares > 0n ? (navMinor * 1_000_000n) / totalShares : 1_000_000n; + + return { + exists: true, + index, + strategy, + shareMint, + usdcVault, + account, + usdcAmount, + assets, + navMinor, + navComplete, + totalShares, + navPerShareMinor, + fullyAllocated: account.totalWeightBps === 10_000, + }; +} + +/** A wallet's position in the strategy: shares held and their current USDC value. */ +export async function loadPosition(connection: Connection, view: StrategyView, owner: PublicKey): Promise { + const shareAccount = userAta(view.shareMint, owner); + const info = await connection.getAccountInfo(shareAccount); + const shares = info ? readTokenAmount(info.data) : 0n; + const ownership = view.totalShares > 0n ? Number(shares) / Number(view.totalShares) : 0; + const valueMinor = view.totalShares > 0n ? (shares * view.navMinor) / view.totalShares : 0n; + return { shares, ownership, valueMinor, shareAccount, shareAccountExists: info !== null }; +} diff --git a/finance/vault-strategy/anchor-v1/app/src/views/InvestorView.tsx b/finance/vault-strategy/anchor-v1/app/src/views/InvestorView.tsx new file mode 100644 index 000000000..56c5b396c --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/views/InvestorView.tsx @@ -0,0 +1,122 @@ +import type { ReactNode } from "react"; +import { ActionTicket } from "../components/ActionTicket"; +import { AllocationPanel } from "../components/Allocation"; +import { Addr, Field } from "../components/atoms"; +import type { VaultState } from "../hooks/useVault"; +import { VAULT_PROGRAM_ID } from "../solana/config"; +import { formatRatioPct, formatShares, formatUnits, formatUsdc } from "../solana/format"; +import type { StrategyView } from "../solana/strategy"; + +function HeroCell({ + label, + value, + sub, + delta, +}: { + label: string; + value: string; + sub?: ReactNode; + delta?: { ratio: number }; +}) { + return ( +
+ {label} + {value} + + {sub} + {delta && ( + = 0 ? "text-gain" : "text-loss"}> + {delta.ratio >= 0 ? "▲" : "▼"} {formatRatioPct(Math.abs(delta.ratio), 2)} + + )} + +
+ ); +} + +function HeroBand({ view, vault }: { view: StrategyView; vault: VaultState }) { + const perShareRatio = Number(view.navPerShareMinor) / 1e6 - 1; + + const positionValue = !vault.connected ? "—" : vault.position ? `$${formatUsdc(vault.position.valueMinor)}` : "$0.00"; + const positionSub = !vault.connected ? ( + connect wallet + ) : vault.position && vault.position.shares > 0n ? ( + `${formatShares(vault.position.shares)} shares · ${formatRatioPct(vault.position.ownership)}` + ) : ( + "no shares yet" + ); + + return ( +
+ partial · unpriced holdings + ) + } + /> + 0n ? { ratio: perShareRatio } : undefined} + /> + +
+ ); +} + +function DetailsStrip({ view }: { view: StrategyView }) { + const s = view.account!; + return ( +
+ + + + + + + + + + + + + + + + + + +
+ ); +} + +export function InvestorView({ vault }: { vault: VaultState }) { + const view = vault.view!; + return ( +
+ +
+
+ + +
+
+ +
+
+
+ ); +} diff --git a/finance/vault-strategy/anchor-v1/app/src/vite-env.d.ts b/finance/vault-strategy/anchor-v1/app/src/vite-env.d.ts new file mode 100644 index 000000000..e5bfa8df1 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/src/vite-env.d.ts @@ -0,0 +1,14 @@ +/// + +interface ImportMetaEnv { + readonly VITE_RPC_URL?: string; + readonly VITE_VAULT_PROGRAM_ID?: string; + readonly VITE_ROUTER_PROGRAM_ID?: string; + readonly VITE_USDC_MINT?: string; + readonly VITE_STRATEGY_INDEX?: string; + readonly VITE_CLUSTER?: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/finance/vault-strategy/anchor-v1/app/tailwind.config.ts b/finance/vault-strategy/anchor-v1/app/tailwind.config.ts new file mode 100644 index 000000000..731a1f99c --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/tailwind.config.ts @@ -0,0 +1,38 @@ +import type { Config } from "tailwindcss"; + +// Dark matte "terminal" world. Flat surfaces, hairline dividers, one signal accent +// (amber), semantic green/red reserved for P&L numbers only. No glow, glass, gradient. +export default { + content: ["./index.html", "./src/**/*.{ts,tsx}"], + theme: { + extend: { + colors: { + graphite: "#0B0D10", // canvas + panel: "#111419", // lifted surface + panel2: "#161A20", // input / nested surface + line: "rgba(233, 230, 225, 0.09)", // hairline + line2: "rgba(233, 230, 225, 0.16)", // stronger hairline + ink: "#E8E6E1", // primary text (warm off-white) + muted: "#9C9A94", // secondary text — warm-tinted from ink, ~6:1 on graphite + faint: "#84827C", // tertiary labels — still ~4.7:1 + accent: "#F0B429", // signal amber (actions, focus, active) + "accent-dim": "#8A6716", + gain: "#41B883", // P&L up + loss: "#E5595E", // P&L down + }, + fontFamily: { + sans: ['"Archivo"', "ui-sans-serif", "system-ui", "sans-serif"], + mono: ['"IBM Plex Mono"', "ui-monospace", "SFMono-Regular", "monospace"], + }, + letterSpacing: { + tightest: "-0.03em", + }, + fontSize: { + // Hero readouts (AUM / NAV / position) live here. + hero: ["3.25rem", { lineHeight: "1", letterSpacing: "-0.02em" }], + stat: ["2rem", { lineHeight: "1.05", letterSpacing: "-0.01em" }], + }, + }, + }, + plugins: [], +} satisfies Config; diff --git a/finance/vault-strategy/anchor-v1/app/tsconfig.json b/finance/vault-strategy/anchor-v1/app/tsconfig.json new file mode 100644 index 000000000..59a00a520 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo", + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "types": ["node"] + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/finance/vault-strategy/anchor-v1/app/tsconfig.node.json b/finance/vault-strategy/anchor-v1/app/tsconfig.node.json new file mode 100644 index 000000000..3b5c41d65 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/tsconfig.node.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "composite": true, + // Emit (required by composite) goes under node_modules so a compiled + // vite.config.js never lands next to vite.config.ts — Vite would load + // the stale .js in preference to the .ts. + "outDir": "./node_modules/.tmp/tsconfig-node", + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig-node/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowSyntheticDefaultImports": true, + "types": ["node"] + }, + "include": ["vite.config.ts"] +} diff --git a/finance/vault-strategy/anchor-v1/app/vite.config.ts b/finance/vault-strategy/anchor-v1/app/vite.config.ts new file mode 100644 index 000000000..5d0375de3 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/app/vite.config.ts @@ -0,0 +1,14 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import { nodePolyfills } from "vite-plugin-node-polyfills"; + +// @solana/web3.js and @coral-xyz/anchor expect Node's Buffer/process in the browser. +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + include: ["buffer", "process"], + globals: { Buffer: true, global: true, process: true }, + }), + ], +}); diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/Cargo.toml b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/Cargo.toml new file mode 100644 index 000000000..b9968e2d7 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "mock-swap-router" +version = "0.1.0" +description = "Mock swap router for vault-strategy tests" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "mock_swap_router" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/Xargo.toml b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/error.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/error.rs new file mode 100644 index 000000000..c57935c69 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/error.rs @@ -0,0 +1,17 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum RouterError { + #[msg("Rate is zero - cannot compute swap")] + ZeroRate, + #[msg("Output is below minimum - slippage exceeded")] + SlippageExceeded, + #[msg("Asset mint does not match rate record")] + InvalidAssetMint, + #[msg("Arithmetic overflow")] + MathOverflow, + #[msg("USDC mint does not match router config")] + WrongUsdcMint, + #[msg("Asset amount in must be greater than zero")] + ZeroAmount, +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/initialize_router.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/initialize_router.rs new file mode 100644 index 000000000..125ea422f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/initialize_router.rs @@ -0,0 +1,43 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenInterface}; + +use crate::state::RouterConfig; + +#[derive(Accounts)] +pub struct InitializeRouterAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + pub usdc_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = authority, + space = RouterConfig::DISCRIMINATOR.len() + RouterConfig::INIT_SPACE, + seeds = [b"router_config"], + bump + )] + pub router_config: Account<'info, RouterConfig>, + + /// CHECK: PDA used as mint authority only - no data stored + #[account( + seeds = [b"router_authority"], + bump + )] + pub router_authority: UncheckedAccount<'info>, + + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_router( + context: Context, + _usdc_mint: Pubkey, +) -> Result<()> { + context.accounts.router_config.set_inner(RouterConfig { + authority: context.accounts.authority.key(), + usdc_mint: context.accounts.usdc_mint.key(), + bump: context.bumps.router_config, + }); + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/mod.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/mod.rs new file mode 100644 index 000000000..44288a1b5 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/mod.rs @@ -0,0 +1,9 @@ +pub mod initialize_router; +pub mod set_rate; +pub mod swap_asset_for_usdc; +pub mod swap_usdc_for_asset; + +pub use initialize_router::*; +pub use set_rate::*; +pub use swap_asset_for_usdc::*; +pub use swap_usdc_for_asset::*; diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/set_rate.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/set_rate.rs new file mode 100644 index 000000000..09c5d9548 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/set_rate.rs @@ -0,0 +1,66 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::state::{AssetRate, RouterConfig}; + +#[derive(Accounts)] +pub struct SetRateAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + has_one = authority, + seeds = [b"router_config"], + bump = router_config.bump + )] + pub router_config: Account<'info, RouterConfig>, + + pub asset_mint: InterfaceAccount<'info, Mint>, + + pub usdc_mint: InterfaceAccount<'info, Mint>, + + #[account( + init_if_needed, + payer = authority, + space = AssetRate::DISCRIMINATOR.len() + AssetRate::INIT_SPACE, + seeds = [b"rate", asset_mint.key().as_ref()], + bump + )] + pub asset_rate: Account<'info, AssetRate>, + + /// CHECK: PDA used as mint authority only + #[account( + seeds = [b"router_authority"], + bump + )] + pub router_authority: UncheckedAccount<'info>, + + #[account( + init_if_needed, + payer = authority, + associated_token::mint = usdc_mint, + associated_token::authority = router_authority, + associated_token::token_program = token_program + )] + pub router_usdc_treasury: InterfaceAccount<'info, TokenAccount>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_set_rate( + context: Context, + _mint: Pubkey, + usdc_per_token: u64, +) -> Result<()> { + context.accounts.asset_rate.set_inner(AssetRate { + mint: context.accounts.asset_mint.key(), + usdc_per_token, + bump: context.bumps.asset_rate, + }); + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs new file mode 100644 index 000000000..66d33f376 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_asset_for_usdc.rs @@ -0,0 +1,120 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + burn, transfer_checked, Burn, Mint, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::error::RouterError; +use crate::state::{AssetRate, RouterConfig}; + +#[derive(Accounts)] +pub struct SwapAssetForUsdcAccountConstraints<'info> { + pub caller: Signer<'info>, + + #[account( + seeds = [b"router_config"], + bump = router_config.bump + )] + pub router_config: Account<'info, RouterConfig>, + + #[account( + constraint = asset_rate.mint == asset_mint.key() @ RouterError::InvalidAssetMint + )] + pub asset_rate: Account<'info, AssetRate>, + + #[account(constraint = usdc_mint.key() == router_config.usdc_mint @ RouterError::WrongUsdcMint)] + pub usdc_mint: Box>, + + #[account(mut)] + pub asset_mint: Box>, + + /// Caller's asset token account - asset tokens are burned from here + #[account( + mut, + associated_token::mint = asset_mint, + associated_token::authority = caller, + associated_token::token_program = token_program + )] + pub caller_asset_account: Box>, + + /// Caller's USDC account - receives the USDC + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = caller, + associated_token::token_program = token_program + )] + pub caller_usdc_account: Box>, + + /// Router's USDC treasury - sends the USDC + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = router_authority, + associated_token::token_program = token_program + )] + pub router_usdc_treasury: Box>, + + /// CHECK: PDA used as treasury authority - validated by seeds constraint + #[account( + seeds = [b"router_authority"], + bump + )] + pub router_authority: UncheckedAccount<'info>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_swap_asset_for_usdc( + context: Context, + asset_amount_in: u64, + minimum_usdc_out: u64, +) -> Result<()> { + let rate = context.accounts.asset_rate.usdc_per_token; + require!(rate > 0, RouterError::ZeroRate); + require!(asset_amount_in > 0, RouterError::ZeroAmount); + + // usdc_out = asset_amount_in * rate (u128 intermediate, protocol gets ceil on sell) + let usdc_out: u64 = (asset_amount_in as u128) + .checked_mul(rate as u128) + .ok_or(RouterError::MathOverflow)? as u64; + + require!(usdc_out >= minimum_usdc_out, RouterError::SlippageExceeded); + + // Burn asset tokens from caller + let burn_accounts = Burn { + mint: context.accounts.asset_mint.to_account_info(), + from: context.accounts.caller_asset_account.to_account_info(), + authority: context.accounts.caller.to_account_info(), + }; + burn( + CpiContext::new(context.accounts.token_program.key(), burn_accounts), + asset_amount_in, + )?; + + // Transfer USDC from router treasury to caller - router_authority PDA signs + let router_authority_bump = context.bumps.router_authority; + let signer_seeds: &[&[&[u8]]] = &[&[b"router_authority", &[router_authority_bump]]]; + + let transfer_accounts = TransferChecked { + from: context.accounts.router_usdc_treasury.to_account_info(), + mint: context.accounts.usdc_mint.to_account_info(), + to: context.accounts.caller_usdc_account.to_account_info(), + authority: context.accounts.router_authority.to_account_info(), + }; + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + transfer_accounts, + signer_seeds, + ), + usdc_out, + context.accounts.usdc_mint.decimals, + )?; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs new file mode 100644 index 000000000..784d16b7f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/instructions/swap_usdc_for_asset.rs @@ -0,0 +1,119 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + mint_to, transfer_checked, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::error::RouterError; +use crate::state::{AssetRate, RouterConfig}; + +#[derive(Accounts)] +pub struct SwapUsdcForAssetAccountConstraints<'info> { + /// The caller - e.g. the vault strategy PDA (can be a signer or a PDA signer via CPI) + pub caller: Signer<'info>, + + #[account( + seeds = [b"router_config"], + bump = router_config.bump + )] + pub router_config: Account<'info, RouterConfig>, + + #[account( + constraint = asset_rate.mint == asset_mint.key() @ RouterError::InvalidAssetMint + )] + pub asset_rate: Account<'info, AssetRate>, + + pub usdc_mint: Box>, + + #[account(mut)] + pub asset_mint: Box>, + + /// Caller's USDC token account - USDC flows from here to the treasury + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = caller, + associated_token::token_program = token_program + )] + pub caller_usdc_account: Box>, + + /// Caller's asset token account - minted asset tokens land here + #[account( + mut, + associated_token::mint = asset_mint, + associated_token::authority = caller, + associated_token::token_program = token_program + )] + pub caller_asset_account: Box>, + + /// Router's USDC treasury - receives the USDC payment + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = router_authority, + associated_token::token_program = token_program + )] + pub router_usdc_treasury: Box>, + + /// CHECK: PDA used as mint authority - validated by seeds constraint + #[account( + seeds = [b"router_authority"], + bump + )] + pub router_authority: UncheckedAccount<'info>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_swap_usdc_for_asset( + context: Context, + usdc_amount_in: u64, + minimum_asset_out: u64, +) -> Result<()> { + let rate = context.accounts.asset_rate.usdc_per_token; + require!(rate > 0, RouterError::ZeroRate); + + // asset_out = usdc_amount_in / rate (u128 intermediate, user gets floor) + let asset_out: u64 = (usdc_amount_in as u128) + .checked_mul(1u128) + .ok_or(RouterError::MathOverflow)? + .checked_div(rate as u128) + .ok_or(RouterError::MathOverflow)? as u64; + + require!( + asset_out >= minimum_asset_out, + RouterError::SlippageExceeded + ); + + // Transfer USDC from caller to router treasury + let transfer_accounts = TransferChecked { + from: context.accounts.caller_usdc_account.to_account_info(), + mint: context.accounts.usdc_mint.to_account_info(), + to: context.accounts.router_usdc_treasury.to_account_info(), + authority: context.accounts.caller.to_account_info(), + }; + let cpi_ctx = CpiContext::new(context.accounts.token_program.key(), transfer_accounts); + transfer_checked(cpi_ctx, usdc_amount_in, context.accounts.usdc_mint.decimals)?; + + // Mint asset tokens to caller - router_authority PDA signs + let router_authority_bump = context.bumps.router_authority; + let signer_seeds: &[&[&[u8]]] = &[&[b"router_authority", &[router_authority_bump]]]; + + let mint_accounts = MintTo { + mint: context.accounts.asset_mint.to_account_info(), + to: context.accounts.caller_asset_account.to_account_info(), + authority: context.accounts.router_authority.to_account_info(), + }; + let cpi_ctx = CpiContext::new_with_signer( + context.accounts.token_program.key(), + mint_accounts, + signer_seeds, + ); + mint_to(cpi_ctx, asset_out)?; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/lib.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/lib.rs new file mode 100644 index 000000000..7ee358266 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/lib.rs @@ -0,0 +1,54 @@ +pub mod error; +pub mod instructions; +pub mod state; + +use anchor_lang::prelude::*; + +pub use instructions::*; +pub use state::*; + +declare_id!("SWPR8Rk3aq3DrDGLdaANq7xCMnXoUFUJWJJmCWxc8Jm"); + +#[program] +pub mod mock_swap_router { + use super::*; + + pub fn initialize_router( + context: Context, + usdc_mint: Pubkey, + ) -> Result<()> { + instructions::initialize_router::handle_initialize_router(context, usdc_mint) + } + + pub fn set_rate( + context: Context, + mint: Pubkey, + usdc_per_token: u64, + ) -> Result<()> { + instructions::set_rate::handle_set_rate(context, mint, usdc_per_token) + } + + pub fn swap_usdc_for_asset( + context: Context, + usdc_amount_in: u64, + minimum_asset_out: u64, + ) -> Result<()> { + instructions::swap_usdc_for_asset::handle_swap_usdc_for_asset( + context, + usdc_amount_in, + minimum_asset_out, + ) + } + + pub fn swap_asset_for_usdc( + context: Context, + asset_amount_in: u64, + minimum_usdc_out: u64, + ) -> Result<()> { + instructions::swap_asset_for_usdc::handle_swap_asset_for_usdc( + context, + asset_amount_in, + minimum_usdc_out, + ) + } +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/asset_rate.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/asset_rate.rs new file mode 100644 index 000000000..332ebfa8b --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/asset_rate.rs @@ -0,0 +1,12 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct AssetRate { + pub mint: Pubkey, + /// USDC base units per token base unit. + /// e.g. 250 means 1 token base unit = 250 USDC base units + /// (so 1.0 TSLAx = $250 when both have 6 decimals) + pub usdc_per_token: u64, + pub bump: u8, +} diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/mod.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/mod.rs new file mode 100644 index 000000000..a9ecd3471 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/mod.rs @@ -0,0 +1,5 @@ +pub mod asset_rate; +pub mod router_config; + +pub use asset_rate::*; +pub use router_config::*; diff --git a/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/router_config.rs b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/router_config.rs new file mode 100644 index 000000000..308a2e4aa --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/mock-swap-router/src/state/router_config.rs @@ -0,0 +1,9 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct RouterConfig { + pub authority: Pubkey, + pub usdc_mint: Pubkey, + pub bump: u8, +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/Cargo.toml b/finance/vault-strategy/anchor-v1/programs/vault-strategy/Cargo.toml new file mode 100644 index 000000000..917c27183 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "vault-strategy" +version = "0.1.0" +description = "Manager-run investment vault with NAV-based shares" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "vault_strategy" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" +mock-swap-router = { path = "../mock-swap-router", features = ["cpi"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-account = "3.0.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/Xargo.toml b/finance/vault-strategy/anchor-v1/programs/vault-strategy/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/error.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/error.rs new file mode 100644 index 000000000..c80b5a703 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/error.rs @@ -0,0 +1,57 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum VaultError { + #[msg("Shares minted are below the minimum - slippage exceeded")] + SlippageTooHigh, + #[msg("USDC out is below minimum - slippage exceeded")] + UsdcSlippage, + #[msg("Swap output deviates from the oracle price by more than the allowed slippage")] + SwapSlippageExceeded, + #[msg("Max slippage exceeds the maximum allowed configuration")] + SlippageConfigTooHigh, + #[msg("Asset mint is not part of this strategy")] + AssetNotFound, + #[msg("Strategy already holds the maximum number of assets")] + TooManyAssets, + #[msg("Asset is already part of this strategy")] + DuplicateAsset, + #[msg("Total target weight would exceed 10000 basis points")] + WeightOverflow, + #[msg("Strategy weights must sum to 100% before it can accept deposits")] + StrategyNotFullyAllocated, + #[msg("Wrong number of asset accounts supplied for the strategy's assets")] + IncompleteAssetAccounts, + #[msg("An asset account does not match the strategy's registered asset")] + InvalidAssetAccount, + #[msg("Token account could not be read")] + InvalidVaultAccount, + #[msg("Recipient token account is not owned by the withdrawing user")] + InvalidRecipient, + #[msg("Registry does not match the strategy's registered registry")] + InvalidRegistry, + #[msg("No time has elapsed since last fee accrual")] + NoTimeElapsed, + #[msg("Arithmetic overflow")] + MathOverflow, + #[msg("Cannot withdraw zero shares")] + ZeroShares, + #[msg("Cannot deposit zero USDC")] + ZeroDeposit, + #[msg("Total shares are zero - cannot compute proportional withdraw")] + ZeroTotalShares, + #[msg("Price feed account does not match the registered feed")] + InvalidPriceFeed, + #[msg("Pyth price is zero or negative")] + NegativePrice, + #[msg("Pyth price feed is stale")] + StalePriceFeed, + #[msg("Sell and buy mints must be different")] + SameMint, + #[msg("USDC mint does not match the strategy's registered USDC mint")] + InvalidUsdcMint, + #[msg("Swap router program does not match the strategy's registered swap router")] + InvalidSwapRouter, + #[msg("Management fee exceeds the maximum allowed")] + FeeTooHigh, +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/add_asset.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/add_asset.rs new file mode 100644 index 000000000..dc21ac1df --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/add_asset.rs @@ -0,0 +1,90 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::error::VaultError; +use crate::state::{ApprovedAsset, AssetConfig, Registry, Strategy, MAX_ASSETS}; + +#[derive(Accounts)] +pub struct AddAssetAccountConstraints<'info> { + #[account(mut)] + pub manager: Signer<'info>, + + #[account( + mut, + has_one = manager, + has_one = registry @ VaultError::InvalidRegistry, + seeds = [b"strategy", strategy.index.to_le_bytes().as_ref()], + bump = strategy.bump + )] + pub strategy: Box>, + + pub registry: Box>, + + pub asset_mint: Box>, + + /// Proof the mint is approved, and the source of its official price feed. + /// Seeds tie it to this registry and this mint; existence means approved. + #[account( + seeds = [b"approved_asset", registry.key().as_ref(), asset_mint.key().as_ref()], + bump = approved_asset.bump + )] + pub approved_asset: Box>, + + #[account( + init, + payer = manager, + space = AssetConfig::DISCRIMINATOR.len() + AssetConfig::INIT_SPACE, + seeds = [b"asset", strategy.key().as_ref(), &[strategy.asset_count]], + bump + )] + pub asset_config: Box>, + + /// Strategy-owned vault for this asset. + #[account( + init, + payer = manager, + associated_token::mint = asset_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_asset: Box>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_add_asset( + context: Context, + weight_bps: u16, +) -> Result<()> { + let strategy = &mut context.accounts.strategy; + + require!(strategy.asset_count < MAX_ASSETS, VaultError::TooManyAssets); + + let new_total = (strategy.total_weight_bps as u32) + .checked_add(weight_bps as u32) + .ok_or(VaultError::MathOverflow)?; + require!(new_total <= 10_000, VaultError::WeightOverflow); + + let index = strategy.asset_count; + + context.accounts.asset_config.set_inner(AssetConfig { + strategy: strategy.key(), + index, + mint: context.accounts.asset_mint.key(), + // Copied from the registry entry, never supplied by the manager. + price_feed: context.accounts.approved_asset.price_feed, + vault: context.accounts.vault_asset.key(), + weight_bps, + bump: context.bumps.asset_config, + }); + + strategy.asset_count = index.checked_add(1).ok_or(VaultError::MathOverflow)?; + strategy.total_weight_bps = new_total as u16; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/approve_asset.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/approve_asset.rs new file mode 100644 index 000000000..0dd06af72 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/approve_asset.rs @@ -0,0 +1,43 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; + +use crate::state::{ApprovedAsset, Registry}; + +#[derive(Accounts)] +pub struct ApproveAssetAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + has_one = authority, + seeds = [b"registry", authority.key().as_ref()], + bump = registry.bump + )] + pub registry: Account<'info, Registry>, + + pub asset_mint: InterfaceAccount<'info, Mint>, + + #[account( + init, + payer = authority, + space = ApprovedAsset::DISCRIMINATOR.len() + ApprovedAsset::INIT_SPACE, + seeds = [b"approved_asset", registry.key().as_ref(), asset_mint.key().as_ref()], + bump + )] + pub approved_asset: Account<'info, ApprovedAsset>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_approve_asset( + context: Context, + price_feed: Pubkey, +) -> Result<()> { + context.accounts.approved_asset.set_inner(ApprovedAsset { + registry: context.accounts.registry.key(), + mint: context.accounts.asset_mint.key(), + price_feed, + bump: context.bumps.approved_asset, + }); + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/collect_fees.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/collect_fees.rs new file mode 100644 index 000000000..04e964d02 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/collect_fees.rs @@ -0,0 +1,105 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{mint_to, Mint, MintTo, TokenAccount, TokenInterface}, +}; + +use crate::error::VaultError; +use crate::state::Strategy; + +const SECONDS_PER_YEAR: u64 = 31_536_000; + +#[derive(Accounts)] +pub struct CollectFeesAccountConstraints<'info> { + /// CHECK: manager is stored in strategy; we only read their pubkey for derivation + pub manager: UncheckedAccount<'info>, + + #[account( + mut, + has_one = manager, + seeds = [b"strategy", strategy.index.to_le_bytes().as_ref()], + bump = strategy.bump + )] + pub strategy: Account<'info, Strategy>, + + #[account( + mut, + seeds = [b"share_mint", strategy.key().as_ref()], + bump + )] + pub share_mint: InterfaceAccount<'info, Mint>, + + /// Manager's share token account - receives fee shares + #[account( + init_if_needed, + payer = payer, + associated_token::mint = share_mint, + associated_token::authority = manager, + associated_token::token_program = token_program + )] + pub manager_share_account: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub payer: Signer<'info>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_collect_fees(context: Context) -> Result<()> { + let clock = Clock::get()?; + let current_ts = clock.unix_timestamp; + let last_ts = context.accounts.strategy.last_fee_accrual_timestamp; + + require!(current_ts > last_ts, VaultError::NoTimeElapsed); + + let elapsed_seconds = (current_ts - last_ts) as u64; + let total_shares = context.accounts.strategy.total_shares; + let fee_bps = context.accounts.strategy.fee_bps; + let strategy_index = context.accounts.strategy.index; + let strategy_bump = context.accounts.strategy.bump; + + // fee_shares = total_shares * fee_bps * elapsed / (10_000 * SECONDS_PER_YEAR) + let denominator = (10_000u128) + .checked_mul(SECONDS_PER_YEAR as u128) + .ok_or(VaultError::MathOverflow)?; + + let fee_shares: u64 = (total_shares as u128) + .checked_mul(fee_bps as u128) + .ok_or(VaultError::MathOverflow)? + .checked_mul(elapsed_seconds as u128) + .ok_or(VaultError::MathOverflow)? + .checked_div(denominator) + .ok_or(VaultError::MathOverflow)? as u64; + + // Update timestamp even if fee_shares rounds to zero + context.accounts.strategy.last_fee_accrual_timestamp = current_ts; + + if fee_shares == 0 { + return Ok(()); + } + + // Checks-effects-interactions: update total_shares before CPI + context.accounts.strategy.total_shares = total_shares + .checked_add(fee_shares) + .ok_or(VaultError::MathOverflow)?; + + // Mint fee shares to manager - strategy PDA signs + let index_bytes = strategy_index.to_le_bytes(); + let signer_seeds: &[&[&[u8]]] = &[&[b"strategy", index_bytes.as_ref(), &[strategy_bump]]]; + + let mint_accounts = MintTo { + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.manager_share_account.to_account_info(), + authority: context.accounts.strategy.to_account_info(), + }; + let cpi_ctx = CpiContext::new_with_signer( + context.accounts.token_program.key(), + mint_accounts, + signer_seeds, + ); + mint_to(cpi_ctx, fee_shares)?; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/deposit.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/deposit.rs new file mode 100644 index 000000000..1a31f6c58 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/deposit.rs @@ -0,0 +1,271 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + mint_to, transfer_checked, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, + }, +}; +use mock_swap_router::cpi::accounts::SwapUsdcForAssetAccountConstraints as RouterSwapAccounts; + +use crate::error::VaultError; +use crate::oracle::{asset_value_in_usdc, load_price, read_token_amount, PYTH_PRICE_PRECISION}; +use crate::state::{AssetConfig, Strategy}; + +#[derive(Accounts)] +pub struct DepositAccountConstraints<'info> { + #[account(mut)] + pub depositor: Signer<'info>, + + #[account( + mut, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, + seeds = [b"strategy", strategy.index.to_le_bytes().as_ref()], + bump = strategy.bump + )] + pub strategy: Box>, + + #[account( + mut, + seeds = [b"share_mint", strategy.key().as_ref()], + bump + )] + pub share_mint: Box>, + + pub usdc_mint: Box>, + + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = depositor, + associated_token::token_program = token_program + )] + pub depositor_usdc_account: Box>, + + #[account( + init_if_needed, + payer = depositor, + associated_token::mint = share_mint, + associated_token::authority = depositor, + associated_token::token_program = token_program + )] + pub depositor_share_account: Box>, + + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_usdc: Box>, + + /// CHECK: Router config PDA from the mock-swap-router program + #[account(mut)] + pub router_config: UncheckedAccount<'info>, + + /// CHECK: Router USDC treasury ATA + #[account(mut)] + pub router_usdc_treasury: UncheckedAccount<'info>, + + /// CHECK: Router authority PDA from the mock-swap-router program + #[account(mut)] + pub router_authority: UncheckedAccount<'info>, + + #[account( + constraint = swap_router_program.key() == strategy.swap_router @ VaultError::InvalidSwapRouter + )] + pub swap_router_program: Program<'info, mock_swap_router::program::MockSwapRouter>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, + // remaining_accounts: for each asset index 0..asset_count, in order: + // [asset_config, vault, asset_mint, asset_rate, price_feed] +} + +/// Deposit USDC, receive shares priced at net asset value, and immediately deploy +/// the deposit into the basket at its target weights. The strategy must be fully +/// allocated first: the weights sum to exactly 10000, so every deposit is fully +/// invested. For each asset the handler swaps `usdc_amount * weight_bps / 10000` +/// through the registered router, so a depositor's money is invested in the same +/// transaction they put it in (only sub-cent rounding dust can remain as USDC). +pub fn handle_deposit<'info>( + context: Context<'info, DepositAccountConstraints<'info>>, + usdc_amount: u64, + minimum_shares: u64, +) -> Result<()> { + require!(usdc_amount > 0, VaultError::ZeroDeposit); + // A strategy accepts deposits only once its weights sum to 100%, so a deposit is + // always fully invested. A half-configured or under-allocated basket is closed. + require!( + context.accounts.strategy.total_weight_bps == 10_000, + VaultError::StrategyNotFullyAllocated + ); + + let vault_usdc_amount = context.accounts.vault_usdc.amount; + let total_shares = context.accounts.strategy.total_shares; + let usdc_decimals = context.accounts.usdc_mint.decimals; + let strategy_index = context.accounts.strategy.index; + let strategy_bump = context.accounts.strategy.bump; + let strategy_key = context.accounts.strategy.key(); + let max_slippage_bps = context.accounts.strategy.max_slippage_bps; + let asset_count = context.accounts.strategy.asset_count as usize; + + let now = Clock::get()?.unix_timestamp; + + // Net asset value over the complete asset set. The assets are exactly indices + // 0..asset_count, so requiring five accounts per index, in order, each with a + // matching index, makes it impossible to omit an asset and understate NAV. + let remaining = context.remaining_accounts; + require!( + remaining.len() == asset_count * 5, + VaultError::IncompleteAssetAccounts + ); + + let mut nav: u128 = vault_usdc_amount as u128; + + for index in 0..asset_count { + let config_account = &remaining[index * 5]; + let vault_account = &remaining[index * 5 + 1]; + let feed_account = &remaining[index * 5 + 4]; + + let config = AssetConfig::load_checked(config_account)?; + require_keys_eq!( + config.strategy, + strategy_key, + VaultError::InvalidAssetAccount + ); + require!( + config.index as usize == index, + VaultError::InvalidAssetAccount + ); + require_keys_eq!( + vault_account.key(), + config.vault, + VaultError::InvalidAssetAccount + ); + + let price = load_price(feed_account, &config.price_feed, now)?; + let amount = read_token_amount(vault_account)?; + nav = nav + .checked_add(asset_value_in_usdc(amount, price)?) + .ok_or(VaultError::MathOverflow)?; + } + + // shares = usdc_amount * total_shares / nav (floor); first deposit is 1:1. + let shares_to_mint: u64 = if total_shares == 0 { + usdc_amount + } else { + (usdc_amount as u128) + .checked_mul(total_shares as u128) + .ok_or(VaultError::MathOverflow)? + .checked_div(nav) + .ok_or(VaultError::MathOverflow)? as u64 + }; + + require!( + shares_to_mint >= minimum_shares, + VaultError::SlippageTooHigh + ); + + context.accounts.strategy.total_shares = total_shares + .checked_add(shares_to_mint) + .ok_or(VaultError::MathOverflow)?; + + // Pull the depositor's USDC into the strategy's USDC vault. + let transfer_accounts = TransferChecked { + from: context.accounts.depositor_usdc_account.to_account_info(), + mint: context.accounts.usdc_mint.to_account_info(), + to: context.accounts.vault_usdc.to_account_info(), + authority: context.accounts.depositor.to_account_info(), + }; + let cpi_ctx = CpiContext::new(context.accounts.token_program.key(), transfer_accounts); + transfer_checked(cpi_ctx, usdc_amount, usdc_decimals)?; + + let index_bytes = strategy_index.to_le_bytes(); + let signer_seeds: &[&[&[u8]]] = &[&[b"strategy", index_bytes.as_ref(), &[strategy_bump]]]; + + // Deploy the deposit across the basket at its target weights. Each leg swaps a + // weight-sized slice of the deposit through the router, under an oracle-computed + // slippage floor. The strategy PDA signs, since the USDC leaves a vault only it + // controls. + for index in 0..asset_count { + let config_account = &remaining[index * 5]; + let vault_account = &remaining[index * 5 + 1]; + let mint_account = &remaining[index * 5 + 2]; + let rate_account = &remaining[index * 5 + 3]; + let feed_account = &remaining[index * 5 + 4]; + + let config = AssetConfig::load_checked(config_account)?; + require_keys_eq!( + mint_account.key(), + config.mint, + VaultError::InvalidAssetAccount + ); + + if config.weight_bps == 0 { + continue; + } + + let deploy_usdc: u64 = (usdc_amount as u128) + .checked_mul(config.weight_bps as u128) + .ok_or(VaultError::MathOverflow)? + .checked_div(10_000) + .ok_or(VaultError::MathOverflow)? as u64; + + if deploy_usdc == 0 { + continue; + } + + // Slippage floor anchored to the oracle: expected_out = deploy_usdc * 10^8 / + // price, allowed to fall short by at most max_slippage_bps. + let price = load_price(feed_account, &config.price_feed, now)?; + let expected_out = (deploy_usdc as u128) + .checked_mul(PYTH_PRICE_PRECISION) + .ok_or(VaultError::MathOverflow)? + .checked_div(price) + .ok_or(VaultError::MathOverflow)?; + let minimum_asset_out: u64 = expected_out + .checked_mul((10_000 - max_slippage_bps) as u128) + .ok_or(VaultError::MathOverflow)? + .checked_div(10_000) + .ok_or(VaultError::MathOverflow)? + .try_into() + .map_err(|_| VaultError::MathOverflow)?; + + let cpi_accounts = RouterSwapAccounts { + caller: context.accounts.strategy.to_account_info(), + router_config: context.accounts.router_config.to_account_info(), + asset_rate: rate_account.clone(), + usdc_mint: context.accounts.usdc_mint.to_account_info(), + asset_mint: mint_account.clone(), + caller_usdc_account: context.accounts.vault_usdc.to_account_info(), + caller_asset_account: vault_account.clone(), + router_usdc_treasury: context.accounts.router_usdc_treasury.to_account_info(), + router_authority: context.accounts.router_authority.to_account_info(), + associated_token_program: context.accounts.associated_token_program.to_account_info(), + token_program: context.accounts.token_program.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + }; + let cpi_ctx = CpiContext::new_with_signer( + context.accounts.swap_router_program.key(), + cpi_accounts, + signer_seeds, + ); + mock_swap_router::cpi::swap_usdc_for_asset(cpi_ctx, deploy_usdc, minimum_asset_out)?; + } + + // Mint the shares last, with the strategy PDA signing as the share mint authority. + let mint_accounts = MintTo { + mint: context.accounts.share_mint.to_account_info(), + to: context.accounts.depositor_share_account.to_account_info(), + authority: context.accounts.strategy.to_account_info(), + }; + let cpi_ctx = CpiContext::new_with_signer( + context.accounts.token_program.key(), + mint_accounts, + signer_seeds, + ); + mint_to(cpi_ctx, shares_to_mint)?; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_registry.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_registry.rs new file mode 100644 index 000000000..c0479af3e --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_registry.rs @@ -0,0 +1,30 @@ +use anchor_lang::prelude::*; + +use crate::state::Registry; + +#[derive(Accounts)] +pub struct InitializeRegistryAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + init, + payer = authority, + space = Registry::DISCRIMINATOR.len() + Registry::INIT_SPACE, + seeds = [b"registry", authority.key().as_ref()], + bump + )] + pub registry: Account<'info, Registry>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_registry( + context: Context, +) -> Result<()> { + context.accounts.registry.set_inner(Registry { + authority: context.accounts.authority.key(), + bump: context.bumps.registry, + }); + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_strategy.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_strategy.rs new file mode 100644 index 000000000..0cf96dd44 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/initialize_strategy.rs @@ -0,0 +1,101 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; + +use crate::error::VaultError; +use crate::state::{Registry, Strategy}; + +/// Highest annual management fee a manager may set, in basis points (10%). +/// `collect_fees` mints shares to the manager and dilutes every depositor, +/// so an uncapped fee would let a manager drain the vault by configuration; +/// 10% per year is already far above typical fund management fees. +pub const MAX_FEE_BPS: u16 = 1_000; + +/// Highest slippage tolerance a manager may set, in basis points (10%). +/// deposit/rebalance reject a swap whose output deviates from the Pyth price by +/// more than this; capping it stops a manager from setting a tolerance so loose +/// that the bound is meaningless. +pub const MAX_SLIPPAGE_BPS: u16 = 1_000; + +#[derive(Accounts)] +#[instruction(index: u64)] +pub struct InitializeStrategyAccountConstraints<'info> { + #[account(mut)] + pub manager: Signer<'info>, + + pub usdc_mint: InterfaceAccount<'info, Mint>, + + /// Registry whose approved assets this strategy may hold. + pub registry: Account<'info, Registry>, + + #[account( + init, + payer = manager, + space = Strategy::DISCRIMINATOR.len() + Strategy::INIT_SPACE, + seeds = [b"strategy", index.to_le_bytes().as_ref()], + bump + )] + pub strategy: Box>, + + #[account( + init, + payer = manager, + mint::decimals = 6, + mint::authority = strategy, + mint::freeze_authority = strategy, + mint::token_program = token_program, + seeds = [b"share_mint", strategy.key().as_ref()], + bump + )] + pub share_mint: Box>, + + /// Vault's USDC token account - strategy PDA is the authority + #[account( + init, + payer = manager, + associated_token::mint = usdc_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_usdc: Box>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_strategy( + context: Context, + index: u64, + fee_bps: u16, + max_slippage_bps: u16, + swap_router: Pubkey, +) -> Result<()> { + require!(fee_bps <= MAX_FEE_BPS, VaultError::FeeTooHigh); + require!( + max_slippage_bps <= MAX_SLIPPAGE_BPS, + VaultError::SlippageConfigTooHigh + ); + + let clock = Clock::get()?; + + context.accounts.strategy.set_inner(Strategy { + index, + manager: context.accounts.manager.key(), + registry: context.accounts.registry.key(), + share_mint: context.accounts.share_mint.key(), + usdc_mint: context.accounts.usdc_mint.key(), + swap_router, + fee_bps, + max_slippage_bps, + total_shares: 0, + last_fee_accrual_timestamp: clock.unix_timestamp, + asset_count: 0, + total_weight_bps: 0, + bump: context.bumps.strategy, + }); + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/mod.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/mod.rs new file mode 100644 index 000000000..be9eb51ee --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/mod.rs @@ -0,0 +1,19 @@ +pub mod add_asset; +pub mod approve_asset; +pub mod collect_fees; +pub mod deposit; +pub mod initialize_registry; +pub mod initialize_strategy; +pub mod rebalance; +pub mod set_weight; +pub mod withdraw; + +pub use add_asset::*; +pub use approve_asset::*; +pub use collect_fees::*; +pub use deposit::*; +pub use initialize_registry::*; +pub use initialize_strategy::*; +pub use rebalance::*; +pub use set_weight::*; +pub use withdraw::*; diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/rebalance.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/rebalance.rs new file mode 100644 index 000000000..b75e1b1ae --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/rebalance.rs @@ -0,0 +1,217 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, TokenAccount, TokenInterface}, +}; +use mock_swap_router::{ + cpi::accounts::SwapAssetForUsdcAccountConstraints as RouterSellAccounts, + cpi::accounts::SwapUsdcForAssetAccountConstraints as RouterBuyAccounts, state::AssetRate, +}; + +use crate::error::VaultError; +use crate::oracle::{load_price, PYTH_PRICE_PRECISION}; +use crate::state::{AssetConfig, Strategy}; + +#[derive(Accounts)] +pub struct RebalanceAccountConstraints<'info> { + pub manager: Signer<'info>, + + #[account( + mut, + has_one = manager, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, + seeds = [b"strategy", strategy.index.to_le_bytes().as_ref()], + bump = strategy.bump + )] + pub strategy: Box>, + + pub usdc_mint: Box>, + + #[account(mut)] + pub sell_mint: Box>, + + #[account(mut)] + pub buy_mint: Box>, + + #[account( + constraint = sell_config.strategy == strategy.key() @ VaultError::InvalidAssetAccount, + constraint = sell_config.mint == sell_mint.key() @ VaultError::AssetNotFound, + constraint = sell_config.vault == vault_sell.key() @ VaultError::InvalidAssetAccount, + )] + pub sell_config: Box>, + + #[account( + constraint = buy_config.strategy == strategy.key() @ VaultError::InvalidAssetAccount, + constraint = buy_config.mint == buy_mint.key() @ VaultError::AssetNotFound, + constraint = buy_config.vault == vault_buy.key() @ VaultError::InvalidAssetAccount, + )] + pub buy_config: Box>, + + /// CHECK: Pyth feed - validated against sell asset's registered feed + #[account(constraint = sell_price_feed.key() == sell_config.price_feed @ VaultError::InvalidPriceFeed)] + pub sell_price_feed: UncheckedAccount<'info>, + + /// CHECK: Pyth feed - validated against buy asset's registered feed + #[account(constraint = buy_price_feed.key() == buy_config.price_feed @ VaultError::InvalidPriceFeed)] + pub buy_price_feed: UncheckedAccount<'info>, + + #[account( + mut, + associated_token::mint = sell_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_sell: Box>, + + #[account( + mut, + associated_token::mint = buy_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_buy: Box>, + + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_usdc: Box>, + + pub sell_rate: Account<'info, AssetRate>, + + pub buy_rate: Account<'info, AssetRate>, + + /// CHECK: Router config PDA + #[account(mut)] + pub router_config: UncheckedAccount<'info>, + + /// CHECK: Router USDC treasury ATA + #[account(mut)] + pub router_usdc_treasury: UncheckedAccount<'info>, + + /// CHECK: Router authority PDA + #[account(mut)] + pub router_authority: UncheckedAccount<'info>, + + #[account( + constraint = swap_router_program.key() == strategy.swap_router @ VaultError::InvalidSwapRouter + )] + pub swap_router_program: Program<'info, mock_swap_router::program::MockSwapRouter>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, +} + +pub fn handle_rebalance( + context: Context, + sell_amount: u64, + usdc_to_invest: u64, +) -> Result<()> { + require!( + context.accounts.sell_mint.key() != context.accounts.buy_mint.key(), + VaultError::SameMint + ); + + let strategy = &context.accounts.strategy; + let strategy_index = strategy.index; + let strategy_bump = strategy.bump; + let slip = (10_000 - strategy.max_slippage_bps) as u128; + + let now = Clock::get()?.unix_timestamp; + let price_sell = load_price( + &context.accounts.sell_price_feed, + &context.accounts.sell_config.price_feed, + now, + )?; + let price_buy = load_price( + &context.accounts.buy_price_feed, + &context.accounts.buy_config.price_feed, + now, + )?; + + // Sell leg floor: USDC out must be within slippage of the oracle value of what we sell. + let expected_usdc = (sell_amount as u128) + .checked_mul(price_sell) + .ok_or(VaultError::MathOverflow)? + .checked_div(PYTH_PRICE_PRECISION) + .ok_or(VaultError::MathOverflow)?; + let minimum_usdc_from_sell: u64 = expected_usdc + .checked_mul(slip) + .ok_or(VaultError::MathOverflow)? + .checked_div(10_000) + .ok_or(VaultError::MathOverflow)? + .try_into() + .map_err(|_| VaultError::MathOverflow)?; + + // Buy leg floor: asset out must be within slippage of the oracle-implied amount. + let expected_buy = (usdc_to_invest as u128) + .checked_mul(PYTH_PRICE_PRECISION) + .ok_or(VaultError::MathOverflow)? + .checked_div(price_buy) + .ok_or(VaultError::MathOverflow)?; + let minimum_buy_amount: u64 = expected_buy + .checked_mul(slip) + .ok_or(VaultError::MathOverflow)? + .checked_div(10_000) + .ok_or(VaultError::MathOverflow)? + .try_into() + .map_err(|_| VaultError::MathOverflow)?; + + let index_bytes = strategy_index.to_le_bytes(); + let signer_seeds: &[&[&[u8]]] = &[&[b"strategy", index_bytes.as_ref(), &[strategy_bump]]]; + + // Step 1: sell basket token -> USDC + let sell_cpi_accounts = RouterSellAccounts { + caller: context.accounts.strategy.to_account_info(), + router_config: context.accounts.router_config.to_account_info(), + asset_rate: context.accounts.sell_rate.to_account_info(), + usdc_mint: context.accounts.usdc_mint.to_account_info(), + asset_mint: context.accounts.sell_mint.to_account_info(), + caller_asset_account: context.accounts.vault_sell.to_account_info(), + caller_usdc_account: context.accounts.vault_usdc.to_account_info(), + router_usdc_treasury: context.accounts.router_usdc_treasury.to_account_info(), + router_authority: context.accounts.router_authority.to_account_info(), + associated_token_program: context.accounts.associated_token_program.to_account_info(), + token_program: context.accounts.token_program.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + }; + mock_swap_router::cpi::swap_asset_for_usdc( + CpiContext::new_with_signer( + context.accounts.swap_router_program.key(), + sell_cpi_accounts, + signer_seeds, + ), + sell_amount, + minimum_usdc_from_sell, + )?; + + // Step 2: buy basket token with USDC + let buy_cpi_accounts = RouterBuyAccounts { + caller: context.accounts.strategy.to_account_info(), + router_config: context.accounts.router_config.to_account_info(), + asset_rate: context.accounts.buy_rate.to_account_info(), + usdc_mint: context.accounts.usdc_mint.to_account_info(), + asset_mint: context.accounts.buy_mint.to_account_info(), + caller_usdc_account: context.accounts.vault_usdc.to_account_info(), + caller_asset_account: context.accounts.vault_buy.to_account_info(), + router_usdc_treasury: context.accounts.router_usdc_treasury.to_account_info(), + router_authority: context.accounts.router_authority.to_account_info(), + associated_token_program: context.accounts.associated_token_program.to_account_info(), + token_program: context.accounts.token_program.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + }; + mock_swap_router::cpi::swap_usdc_for_asset( + CpiContext::new_with_signer( + context.accounts.swap_router_program.key(), + buy_cpi_accounts, + signer_seeds, + ), + usdc_to_invest, + minimum_buy_amount, + )?; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/set_weight.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/set_weight.rs new file mode 100644 index 000000000..d0cbd6b05 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/set_weight.rs @@ -0,0 +1,50 @@ +use anchor_lang::prelude::*; + +use crate::error::VaultError; +use crate::state::{AssetConfig, Strategy}; + +#[derive(Accounts)] +pub struct SetWeightAccountConstraints<'info> { + pub manager: Signer<'info>, + + #[account( + mut, + has_one = manager, + seeds = [b"strategy", strategy.index.to_le_bytes().as_ref()], + bump = strategy.bump + )] + pub strategy: Box>, + + #[account( + mut, + constraint = asset_config.strategy == strategy.key() @ VaultError::InvalidAssetAccount, + )] + pub asset_config: Box>, +} + +/// Change an asset's target weight. Setting it to zero retires the asset: deposits +/// stop allocating to it, and the manager sells its holdings out with `rebalance`, +/// leaving an empty vault at the asset's index. The index is never reused, so the +/// contiguous 0..asset_count range the valuation handlers depend on stays intact. +/// Funds do not move here; this only edits the target the manager trades toward. +pub fn handle_set_weight( + context: Context, + weight_bps: u16, +) -> Result<()> { + let strategy = &mut context.accounts.strategy; + let asset_config = &mut context.accounts.asset_config; + + // total_weight_bps = total_weight_bps - old_weight + new_weight, kept <= 10000. + let new_total = strategy + .total_weight_bps + .checked_sub(asset_config.weight_bps) + .ok_or(VaultError::MathOverflow)? + .checked_add(weight_bps) + .ok_or(VaultError::MathOverflow)?; + require!(new_total <= 10_000, VaultError::WeightOverflow); + + asset_config.weight_bps = weight_bps; + strategy.total_weight_bps = new_total; + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/withdraw.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/withdraw.rs new file mode 100644 index 000000000..a15235d4d --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/instructions/withdraw.rs @@ -0,0 +1,198 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{ + burn, transfer_checked, Burn, Mint, TokenAccount, TokenInterface, TransferChecked, + }, +}; + +use crate::error::VaultError; +use crate::oracle::{read_mint_decimals, read_token_amount, read_token_mint_and_owner}; +use crate::state::{AssetConfig, Strategy}; + +#[derive(Accounts)] +pub struct WithdrawAccountConstraints<'info> { + #[account(mut)] + pub user: Signer<'info>, + + #[account( + mut, + has_one = usdc_mint @ VaultError::InvalidUsdcMint, + seeds = [b"strategy", strategy.index.to_le_bytes().as_ref()], + bump = strategy.bump + )] + pub strategy: Box>, + + #[account( + mut, + seeds = [b"share_mint", strategy.key().as_ref()], + bump + )] + pub share_mint: Box>, + + pub usdc_mint: Box>, + + #[account( + mut, + associated_token::mint = share_mint, + associated_token::authority = user, + associated_token::token_program = token_program + )] + pub user_share_account: Box>, + + #[account( + init_if_needed, + payer = user, + associated_token::mint = usdc_mint, + associated_token::authority = user, + associated_token::token_program = token_program + )] + pub user_usdc_account: Box>, + + #[account( + mut, + associated_token::mint = usdc_mint, + associated_token::authority = strategy, + associated_token::token_program = token_program + )] + pub vault_usdc: Box>, + + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, + // remaining_accounts: for each asset index 0..asset_count, in order: + // [asset_config, vault, mint, user_token_account] + // The user's asset token accounts must already exist. +} + +pub fn handle_withdraw<'info>( + context: Context<'info, WithdrawAccountConstraints<'info>>, + shares_to_burn: u64, + min_usdc_out: u64, +) -> Result<()> { + require!(shares_to_burn > 0, VaultError::ZeroShares); + + let total_shares = context.accounts.strategy.total_shares; + require!(total_shares > 0, VaultError::ZeroTotalShares); + + let vault_usdc_amount = context.accounts.vault_usdc.amount; + let usdc_decimals = context.accounts.usdc_mint.decimals; + let strategy_index = context.accounts.strategy.index; + let strategy_bump = context.accounts.strategy.bump; + let strategy_key = context.accounts.strategy.key(); + let user_key = context.accounts.user.key(); + let asset_count = context.accounts.strategy.asset_count as usize; + + require!( + context.remaining_accounts.len() == asset_count * 4, + VaultError::IncompleteAssetAccounts + ); + + let shares_u128 = shares_to_burn as u128; + let total_u128 = total_shares as u128; + + // USDC leg, floored in the protocol's favour. + let amount_usdc: u64 = (vault_usdc_amount as u128) + .checked_mul(shares_u128) + .ok_or(VaultError::MathOverflow)? + .checked_div(total_u128) + .ok_or(VaultError::MathOverflow)? as u64; + require!(amount_usdc >= min_usdc_out, VaultError::UsdcSlippage); + + // Checks-effects-interactions: shrink supply before any transfer. + context.accounts.strategy.total_shares = total_shares + .checked_sub(shares_to_burn) + .ok_or(VaultError::MathOverflow)?; + + let index_bytes = strategy_index.to_le_bytes(); + let signer_seeds: &[&[&[u8]]] = &[&[b"strategy", index_bytes.as_ref(), &[strategy_bump]]]; + + // Hoist owned account-info handles for every CPI up front, so the asset loop + // can borrow remaining_accounts without also re-borrowing `context.accounts` + // (Account is invariant over its lifetime, which otherwise fails to unify). + let strategy_info = context.accounts.strategy.to_account_info(); + let share_mint_info = context.accounts.share_mint.to_account_info(); + let usdc_mint_info = context.accounts.usdc_mint.to_account_info(); + let vault_usdc_info = context.accounts.vault_usdc.to_account_info(); + let user_info = context.accounts.user.to_account_info(); + let user_share_info = context.accounts.user_share_account.to_account_info(); + let user_usdc_info = context.accounts.user_usdc_account.to_account_info(); + let token_program_key = context.accounts.token_program.key(); + + // Burn the user's shares. + let burn_accounts = Burn { + mint: share_mint_info, + from: user_share_info, + authority: user_info, + }; + burn( + CpiContext::new(token_program_key, burn_accounts), + shares_to_burn, + )?; + + // USDC payout. + if amount_usdc > 0 { + let transfer_accounts = TransferChecked { + from: vault_usdc_info, + mint: usdc_mint_info, + to: user_usdc_info, + authority: strategy_info.clone(), + }; + transfer_checked( + CpiContext::new_with_signer(token_program_key, transfer_accounts, signer_seeds), + amount_usdc, + usdc_decimals, + )?; + } + + // Each basket asset, paid in kind, proportional to shares burned. + let remaining = context.remaining_accounts; + for i in 0..asset_count { + let config_ai = &remaining[i * 4]; + let vault_ai = &remaining[i * 4 + 1]; + let mint_ai = &remaining[i * 4 + 2]; + let user_ata_ai = &remaining[i * 4 + 3]; + + let config = AssetConfig::load_checked(config_ai)?; + require_keys_eq!( + config.strategy, + strategy_key, + VaultError::InvalidAssetAccount + ); + require!(config.index as usize == i, VaultError::InvalidAssetAccount); + require_keys_eq!( + vault_ai.key(), + config.vault, + VaultError::InvalidAssetAccount + ); + require_keys_eq!(mint_ai.key(), config.mint, VaultError::InvalidAssetAccount); + + let (recipient_mint, recipient_owner) = read_token_mint_and_owner(user_ata_ai)?; + require_keys_eq!(recipient_owner, user_key, VaultError::InvalidRecipient); + require_keys_eq!(recipient_mint, config.mint, VaultError::InvalidRecipient); + + let vault_balance = read_token_amount(vault_ai)?; + let amount: u64 = (vault_balance as u128) + .checked_mul(shares_u128) + .ok_or(VaultError::MathOverflow)? + .checked_div(total_u128) + .ok_or(VaultError::MathOverflow)? as u64; + + if amount > 0 { + let decimals = read_mint_decimals(mint_ai)?; + let transfer_accounts = TransferChecked { + from: vault_ai.to_account_info(), + mint: mint_ai.to_account_info(), + to: user_ata_ai.to_account_info(), + authority: strategy_info.clone(), + }; + transfer_checked( + CpiContext::new_with_signer(token_program_key, transfer_accounts, signer_seeds), + amount, + decimals, + )?; + } + } + + Ok(()) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/lib.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/lib.rs new file mode 100644 index 000000000..4773503cb --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/lib.rs @@ -0,0 +1,91 @@ +pub mod error; +pub mod instructions; +pub mod oracle; +pub mod state; + +use anchor_lang::prelude::*; + +pub use instructions::*; +pub use state::*; + +declare_id!("VLT5W7bqhRN4nCdRpXm8UfHRxZd9EuZGqiSAkGHQfGh"); + +#[program] +pub mod vault_strategy { + use super::*; + + /// Create the curator record for an approved-asset set, owned by `authority` + /// (not a manager). The set itself lives in per-asset ApprovedAsset accounts. + pub fn initialize_registry( + context: Context, + ) -> Result<()> { + instructions::initialize_registry::handle_initialize_registry(context) + } + + /// Approve a mint and bind it to its official price feed. Registry authority only. + pub fn approve_asset( + context: Context, + price_feed: Pubkey, + ) -> Result<()> { + instructions::approve_asset::handle_approve_asset(context, price_feed) + } + + /// Open a strategy at a caller-chosen index, e.g. index 0 derives the PDA + /// from seeds `"strategy" + 0`. Manager pays and becomes the strategy's manager. + pub fn initialize_strategy( + context: Context, + index: u64, + fee_bps: u16, + max_slippage_bps: u16, + swap_router: Pubkey, + ) -> Result<()> { + instructions::initialize_strategy::handle_initialize_strategy( + context, + index, + fee_bps, + max_slippage_bps, + swap_router, + ) + } + + /// Add a curator-approved asset to the strategy at the next index. Manager only. + pub fn add_asset(context: Context, weight_bps: u16) -> Result<()> { + instructions::add_asset::handle_add_asset(context, weight_bps) + } + + /// Change an asset's target weight, or set it to zero to retire it. Manager only. + pub fn set_weight( + context: Context, + weight_bps: u16, + ) -> Result<()> { + instructions::set_weight::handle_set_weight(context, weight_bps) + } + + pub fn deposit<'info>( + context: Context<'info, DepositAccountConstraints<'info>>, + usdc_amount: u64, + minimum_shares: u64, + ) -> Result<()> { + instructions::deposit::handle_deposit(context, usdc_amount, minimum_shares) + } + + pub fn collect_fees(context: Context) -> Result<()> { + instructions::collect_fees::handle_collect_fees(context) + } + + pub fn withdraw<'info>( + context: Context<'info, WithdrawAccountConstraints<'info>>, + shares_to_burn: u64, + min_usdc_out: u64, + ) -> Result<()> { + instructions::withdraw::handle_withdraw(context, shares_to_burn, min_usdc_out) + } + + pub fn rebalance( + context: Context, + sell_amount: u64, + usdc_to_invest: u64, + ) -> Result<()> { + instructions::rebalance::handle_rebalance(context, sell_amount, usdc_to_invest) + } +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/oracle.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/oracle.rs new file mode 100644 index 000000000..cfa41e11f --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/oracle.rs @@ -0,0 +1,112 @@ +use anchor_lang::prelude::*; + +use crate::error::VaultError; + +/// Byte offset of `price` (i64) inside a Pyth PriceUpdateV2 account: +/// 8 discriminator + 32 write_authority + 1 verification_level + 32 feed_id = 73 +const PYTH_PRICE_OFFSET: usize = 73; +/// Byte offset of `publish_time` (i64): +/// price(8) + conf(8) + exponent(4) = +20 bytes after price +const PYTH_PUBLISH_TIME_OFFSET: usize = PYTH_PRICE_OFFSET + 8 + 8 + 4; // 93 +/// Pyth USD pairs use exponent -8 (price * 10^-8 = dollars per token). +pub const PYTH_PRICE_PRECISION: u128 = 100_000_000; // 10^8 +/// Prices older than this (seconds) are rejected. +const MAX_PRICE_AGE_SECONDS: i64 = 60; + +/// SPL token account layout: amount is a u64 at bytes 64..72. The base layout is +/// shared by the Classic Token Program and the Token Extensions Program, so this +/// reads either. +const TOKEN_AMOUNT_OFFSET: usize = 64; +/// `owner` Pubkey is at bytes 32..64. +const TOKEN_OWNER_OFFSET: usize = 32; +/// `mint` Pubkey is at bytes 0..32. +const TOKEN_MINT_OFFSET: usize = 0; + +fn read_pyth_raw(account_data: &[u8]) -> Result<(i64, i64)> { + if account_data.len() < PYTH_PUBLISH_TIME_OFFSET + 8 { + return err!(VaultError::InvalidPriceFeed); + } + let price = i64::from_le_bytes( + account_data[PYTH_PRICE_OFFSET..PYTH_PRICE_OFFSET + 8] + .try_into() + .map_err(|_| VaultError::InvalidPriceFeed)?, + ); + let publish_time = i64::from_le_bytes( + account_data[PYTH_PUBLISH_TIME_OFFSET..PYTH_PUBLISH_TIME_OFFSET + 8] + .try_into() + .map_err(|_| VaultError::InvalidPriceFeed)?, + ); + Ok((price, publish_time)) +} + +/// Validate a price feed account against the one the strategy registered, then +/// return its positive, fresh price as u128. `now` is the current unix timestamp. +pub fn load_price(price_feed: &AccountInfo, expected_key: &Pubkey, now: i64) -> Result { + require_keys_eq!( + price_feed.key(), + *expected_key, + VaultError::InvalidPriceFeed + ); + + let data = price_feed.try_borrow_data()?; + let (price, publish_time) = read_pyth_raw(&data)?; + + require!(price > 0, VaultError::NegativePrice); + require!( + now.checked_sub(publish_time) + .ok_or(VaultError::MathOverflow)? + <= MAX_PRICE_AGE_SECONDS, + VaultError::StalePriceFeed + ); + + Ok(price as u128) +} + +/// Read the `amount` field of a token account from its raw data. +pub fn read_token_amount(account: &AccountInfo) -> Result { + let data = account.try_borrow_data()?; + if data.len() < TOKEN_AMOUNT_OFFSET + 8 { + return err!(VaultError::InvalidVaultAccount); + } + Ok(u64::from_le_bytes( + data[TOKEN_AMOUNT_OFFSET..TOKEN_AMOUNT_OFFSET + 8] + .try_into() + .map_err(|_| VaultError::InvalidVaultAccount)?, + )) +} + +/// Read the `decimals` byte of a mint account. Offset 44 in the Mint layout +/// (mint_authority option 36 + supply 8), shared by both token programs. +pub fn read_mint_decimals(account: &AccountInfo) -> Result { + let data = account.try_borrow_data()?; + const MINT_DECIMALS_OFFSET: usize = 44; + if data.len() <= MINT_DECIMALS_OFFSET { + return err!(VaultError::InvalidVaultAccount); + } + Ok(data[MINT_DECIMALS_OFFSET]) +} + +/// Read the `mint` and `owner` Pubkeys of a token account from its raw data. +pub fn read_token_mint_and_owner(account: &AccountInfo) -> Result<(Pubkey, Pubkey)> { + let data = account.try_borrow_data()?; + if data.len() < TOKEN_OWNER_OFFSET + 32 { + return err!(VaultError::InvalidVaultAccount); + } + let mint = Pubkey::try_from(&data[TOKEN_MINT_OFFSET..TOKEN_MINT_OFFSET + 32]) + .map_err(|_| VaultError::InvalidVaultAccount)?; + let owner = Pubkey::try_from(&data[TOKEN_OWNER_OFFSET..TOKEN_OWNER_OFFSET + 32]) + .map_err(|_| VaultError::InvalidVaultAccount)?; + Ok((mint, owner)) +} + +/// Value of `amount` token minor units in USDC minor units, given a Pyth price. +/// Both USDC and the basket assets use 6 decimals, so the only scaling is the +/// Pyth exponent: value = amount * price / 10^8. Multiply before divide. +pub fn asset_value_in_usdc(amount: u64, price: u128) -> Result { + (amount as u128) + .checked_mul(price) + .ok_or(VaultError::MathOverflow)? + .checked_div(PYTH_PRICE_PRECISION) + .ok_or(VaultError::MathOverflow) + .map_err(Into::into) +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/mod.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/mod.rs new file mode 100644 index 000000000..94ac45232 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/mod.rs @@ -0,0 +1,5 @@ +pub mod registry; +pub mod strategy; + +pub use registry::*; +pub use strategy::*; diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/registry.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/registry.rs new file mode 100644 index 000000000..ffee0bb73 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/registry.rs @@ -0,0 +1,32 @@ +use anchor_lang::prelude::*; + +/// The curator record at the root of an approved-asset set. This account holds no +/// list: it only names the authority allowed to approve assets under it. The set +/// itself is the collection of `ApprovedAsset` accounts derived from this registry, +/// and an asset counts as approved exactly when its `ApprovedAsset` account exists. +/// +/// The authority is deliberately not a strategy manager: the curator vets which +/// real assets (and which official price feed) are safe, and a manager only +/// chooses among them. This is what stops a manager from listing a token they +/// mint themselves, or pairing a real mint with a feed they control. +#[account] +#[derive(InitSpace)] +pub struct Registry { + pub authority: Pubkey, + pub bump: u8, +} + +/// One curator-approved asset, binding its mint to its official Pyth +/// PriceUpdateV2 feed. Its address is a PDA seeded by the registry and the mint, +/// so existence of this account is the approval check: add_asset derives the +/// address and fails if no account is there. Created only by the registry +/// authority; add_asset copies `price_feed` from here so the manager never +/// supplies the feed. +#[account] +#[derive(InitSpace)] +pub struct ApprovedAsset { + pub registry: Pubkey, + pub mint: Pubkey, + pub price_feed: Pubkey, + pub bump: u8, +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/strategy.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/strategy.rs new file mode 100644 index 000000000..05dc893a3 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/src/state/strategy.rs @@ -0,0 +1,81 @@ +use anchor_lang::prelude::*; + +/// Largest number of basket assets one strategy can hold. Not a storage limit +/// (each asset is its own account); the cap bounds how many accounts deposit and +/// withdraw, which must reference every asset at once, pull into a single +/// instruction: deposit uses 14 + 5*N accounts and withdraw 10 + 4*N, where N is the +/// asset count. At the cap of 16 that is 94 accounts for deposit (74 for withdraw), +/// within Solana's 128-account transaction lock limit but past the 1232-byte legacy +/// transaction size (which fits only ~3 assets), so a client depositing into a large +/// basket must send a v0 transaction with an Address Lookup Table. USDC is the base +/// currency, held separately, and does not count against this. +pub const MAX_ASSETS: u8 = 16; + +/// One strategy (basket). Its address is a PDA seeded by a caller-chosen index, +/// e.g. seeds `"strategy" + 0`, so strategies are addressed by a simple counter +/// rather than by the manager's key. The index is stored here so every handler +/// can re-derive the PDA to sign for the vaults and share mint. +#[account] +#[derive(InitSpace)] +pub struct Strategy { + /// Index used as the PDA seed, e.g. 0 for the first strategy. + pub index: u64, + pub manager: Pubkey, + /// Registry whose curator approves assets. add_asset only accepts mints + /// approved in this registry. + pub registry: Pubkey, + pub share_mint: Pubkey, + pub usdc_mint: Pubkey, + pub swap_router: Pubkey, + /// Annual management fee in basis points (e.g. 100 = 1%). + pub fee_bps: u16, + /// Maximum tolerated deviation, in basis points, between a swap's output and + /// the Pyth-implied amount on deposit/rebalance. Bounded by MAX_SLIPPAGE_BPS. + pub max_slippage_bps: u16, + pub total_shares: u64, + pub last_fee_accrual_timestamp: i64, + /// Assets live at PDAs indexed 0..asset_count, so callers can re-derive the + /// complete set and no asset can be silently omitted from a NAV calculation. + pub asset_count: u8, + /// Running sum of every asset's target weight, kept <= 10000. + pub total_weight_bps: u16, + pub bump: u8, +} + +/// One basket asset. Its address is a PDA seeded by the strategy and the asset's +/// index, so the full set is the contiguous range 0..asset_count: any handler +/// computing net asset value re-derives every index and refuses to proceed if an +/// asset account is missing. +#[account] +#[derive(InitSpace)] +pub struct AssetConfig { + pub strategy: Pubkey, + pub index: u8, + pub mint: Pubkey, + /// Pyth PriceUpdateV2 account, copied from the registry's ApprovedAsset at + /// add time so the manager cannot substitute a feed they control. + pub price_feed: Pubkey, + /// Strategy-owned associated token account holding this asset. + pub vault: Pubkey, + /// Target share of the strategy's value in basis points. deposit deploys at these + /// weights (the sum across assets must reach 10000 before deposits open), and the + /// manager maintains them against price drift with rebalance. + pub weight_bps: u16, + pub bump: u8, +} + +impl AssetConfig { + /// Deserialize an AssetConfig passed via remaining_accounts to an owned value, + /// verifying it is owned by this program and has the right discriminator. + /// Avoids the lifetime invariance of `Account::try_from` on borrowed infos. + pub fn load_checked(account: &AccountInfo) -> Result { + require_keys_eq!( + *account.owner, + crate::ID, + crate::error::VaultError::InvalidAssetAccount + ); + let data = account.try_borrow_data()?; + AssetConfig::try_deserialize(&mut &data[..]) + .map_err(|_| error!(crate::error::VaultError::InvalidAssetAccount)) + } +} diff --git a/finance/vault-strategy/anchor-v1/programs/vault-strategy/tests/vault_strategy.rs b/finance/vault-strategy/anchor-v1/programs/vault-strategy/tests/vault_strategy.rs new file mode 100644 index 000000000..469eb2b41 --- /dev/null +++ b/finance/vault-strategy/anchor-v1/programs/vault-strategy/tests/vault_strategy.rs @@ -0,0 +1,1405 @@ +use { + anchor_lang::{ + solana_program::{ + clock::Clock, instruction::AccountMeta, instruction::Instruction, pubkey::Pubkey, + system_program, + }, + AccountDeserialize, InstructionData, ToAccountMetas, + }, + anchor_spl::token::spl_token, + litesvm::LiteSVM, + solana_account::Account as SolanaAccount, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, + send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn pyth_receiver_program_id() -> Pubkey { + "rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +/// Mock PriceUpdateV2 layout (see pyth-solana-receiver-sdk): price i64 at 73, +/// publish_time i64 at 93. Exponent -8. +fn build_mock_price_update_account(price: i64, exponent: i32, publish_time: i64) -> Vec { + let discriminator: [u8; 8] = [34, 241, 35, 99, 157, 126, 244, 205]; + let mut data = Vec::with_capacity(133); + data.extend_from_slice(&discriminator); + data.extend_from_slice(&[0u8; 32]); + data.push(1u8); + data.extend_from_slice(&[0xEFu8; 32]); + data.extend_from_slice(&price.to_le_bytes()); + data.extend_from_slice(&100_000u64.to_le_bytes()); + data.extend_from_slice(&exponent.to_le_bytes()); + data.extend_from_slice(&publish_time.to_le_bytes()); + data.extend_from_slice(&(publish_time - 1).to_le_bytes()); + data.extend_from_slice(&price.to_le_bytes()); + data.extend_from_slice(&120_000u64.to_le_bytes()); + data.extend_from_slice(&1u64.to_le_bytes()); + data +} + +fn set_price_feed(svm: &mut LiteSVM, key: Pubkey, price: i64) { + let data = build_mock_price_update_account(price, -8, PUBLISH_TIME); + let rent = svm.minimum_balance_for_rent_exemption(data.len()); + svm.set_account( + key, + SolanaAccount { + lamports: rent, + data, + owner: pyth_receiver_program_id(), + executable: false, + rent_epoch: 0, + }, + ) + .unwrap(); +} + +const PUBLISH_TIME: i64 = 1_700_000_000; +const TOKEN_DECIMALS: u8 = 6; +const SECONDS_PER_YEAR: i64 = 31_536_000; + +const TSLA_PRICE: i64 = 25_000_000_000; // $250 +const NVDA_PRICE: i64 = 18_000_000_000; // $180 +const TSLA_RATE: u64 = 250; // router usdc per token +const NVDA_RATE: u64 = 180; + +const FEE_BPS: u16 = 100; // 1% +const SLIPPAGE_BPS: u16 = 100; // 1% +const STRATEGY_INDEX: u64 = 0; // strategy PDA seed: "strategy" + 0 + +struct TestContext { + svm: LiteSVM, + vault_program_id: Pubkey, + router_program_id: Pubkey, + manager: Keypair, + payer: Keypair, + usdc_mint: Pubkey, + tsla_mint: Pubkey, + nvda_mint: Pubkey, + strategy_pda: Pubkey, + share_mint_pda: Pubkey, + registry_pda: Pubkey, + approved_tsla: Pubkey, + approved_nvda: Pubkey, + router_config_pda: Pubkey, + router_authority_pda: Pubkey, + tsla_rate_pda: Pubkey, + nvda_rate_pda: Pubkey, + vault_usdc: Pubkey, + vault_tsla: Pubkey, + vault_nvda: Pubkey, + router_usdc_treasury: Pubkey, + price_feed_tsla: Pubkey, + price_feed_nvda: Pubkey, +} + +impl TestContext { + fn asset_config(&self, index: u8) -> Pubkey { + Pubkey::find_program_address( + &[b"asset", self.strategy_pda.as_ref(), &[index]], + &self.vault_program_id, + ) + .0 + } +} + +/// Mints, router (config + rates + treasury), Pyth feeds, a registry with TSLAx +/// and NVDAx approved, and all derived PDAs. Does not create the strategy. +fn setup_full() -> TestContext { + let vault_program_id = vault_strategy::id(); + let router_program_id = mock_swap_router::id(); + + let mut svm = LiteSVM::new(); + svm.add_program( + vault_program_id, + include_bytes!("../../../target/deploy/vault_strategy.so"), + ) + .unwrap(); + // Use std::fs::read() instead of include_bytes!() for the router program because + // include_bytes!() runs at compile time, and during `anchor build` the IDL generation + // step compiles tests before the .so files exist. Since this is a cross-program + // dependency (not our own program), mock_swap_router.so may not be built yet at compile time. + let router_bytes = std::fs::read(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../target/deploy/mock_swap_router.so" + )) + .expect("mock_swap_router.so not found - run `anchor build` first"); + svm.add_program(router_program_id, &router_bytes).unwrap(); + + svm.set_sysvar(&Clock { + slot: 1, + epoch_start_timestamp: PUBLISH_TIME, + epoch: 0, + leader_schedule_epoch: 0, + unix_timestamp: PUBLISH_TIME, + }); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let manager = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let usdc_mint = create_token_mint(&mut svm, &payer, TOKEN_DECIMALS, None).unwrap(); + let tsla_mint = create_token_mint(&mut svm, &payer, TOKEN_DECIMALS, None).unwrap(); + let nvda_mint = create_token_mint(&mut svm, &payer, TOKEN_DECIMALS, None).unwrap(); + + let (router_authority_pda, _) = + Pubkey::find_program_address(&[b"router_authority"], &router_program_id); + + // The router mints basket assets on swap, so it must hold their mint authority. + for basket_mint in [&tsla_mint, &nvda_mint] { + let ix = spl_token::instruction::set_authority( + &spl_token::ID, + basket_mint, + Some(&router_authority_pda), + spl_token::instruction::AuthorityType::MintTokens, + &payer.pubkey(), + &[], + ) + .unwrap(); + send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()).unwrap(); + } + + let (strategy_pda, _) = Pubkey::find_program_address( + &[b"strategy", STRATEGY_INDEX.to_le_bytes().as_ref()], + &vault_program_id, + ); + let (share_mint_pda, _) = + Pubkey::find_program_address(&[b"share_mint", strategy_pda.as_ref()], &vault_program_id); + let (registry_pda, _) = + Pubkey::find_program_address(&[b"registry", payer.pubkey().as_ref()], &vault_program_id); + let (approved_tsla, _) = Pubkey::find_program_address( + &[b"approved_asset", registry_pda.as_ref(), tsla_mint.as_ref()], + &vault_program_id, + ); + let (approved_nvda, _) = Pubkey::find_program_address( + &[b"approved_asset", registry_pda.as_ref(), nvda_mint.as_ref()], + &vault_program_id, + ); + let (router_config_pda, _) = + Pubkey::find_program_address(&[b"router_config"], &router_program_id); + let (tsla_rate_pda, _) = + Pubkey::find_program_address(&[b"rate", tsla_mint.as_ref()], &router_program_id); + let (nvda_rate_pda, _) = + Pubkey::find_program_address(&[b"rate", nvda_mint.as_ref()], &router_program_id); + + let vault_usdc = derive_ata(&strategy_pda, &usdc_mint); + let vault_tsla = derive_ata(&strategy_pda, &tsla_mint); + let vault_nvda = derive_ata(&strategy_pda, &nvda_mint); + let router_usdc_treasury = derive_ata(&router_authority_pda, &usdc_mint); + + let price_feed_tsla = Keypair::new().pubkey(); + let price_feed_nvda = Keypair::new().pubkey(); + set_price_feed(&mut svm, price_feed_tsla, TSLA_PRICE); + set_price_feed(&mut svm, price_feed_nvda, NVDA_PRICE); + + // Router: init, rates, treasury. + let init_router_ix = Instruction::new_with_bytes( + router_program_id, + &mock_swap_router::instruction::InitializeRouter { usdc_mint }.data(), + mock_swap_router::accounts::InitializeRouterAccountConstraints { + authority: payer.pubkey(), + usdc_mint, + router_config: router_config_pda, + router_authority: router_authority_pda, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_router_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + for (mint, rate, rate_pda) in [ + (tsla_mint, TSLA_RATE, tsla_rate_pda), + (nvda_mint, NVDA_RATE, nvda_rate_pda), + ] { + let ix = Instruction::new_with_bytes( + router_program_id, + &mock_swap_router::instruction::SetRate { + mint, + usdc_per_token: rate, + } + .data(), + mock_swap_router::accounts::SetRateAccountConstraints { + authority: payer.pubkey(), + router_config: router_config_pda, + asset_mint: mint, + usdc_mint, + asset_rate: rate_pda, + router_authority: router_authority_pda, + router_usdc_treasury, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()).unwrap(); + } + + mint_tokens_to_token_account( + &mut svm, + &usdc_mint, + &router_usdc_treasury, + 10_000_000_000u64, + &payer, + ) + .unwrap(); + + // Registry with both basket assets approved, bound to their feeds. + let init_registry_ix = Instruction::new_with_bytes( + vault_program_id, + &vault_strategy::instruction::InitializeRegistry {}.data(), + vault_strategy::accounts::InitializeRegistryAccountConstraints { + authority: payer.pubkey(), + registry: registry_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_registry_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + for (mint, feed, entry) in [ + (tsla_mint, price_feed_tsla, approved_tsla), + (nvda_mint, price_feed_nvda, approved_nvda), + ] { + let ix = Instruction::new_with_bytes( + vault_program_id, + &vault_strategy::instruction::ApproveAsset { price_feed: feed }.data(), + vault_strategy::accounts::ApproveAssetAccountConstraints { + authority: payer.pubkey(), + registry: registry_pda, + asset_mint: mint, + approved_asset: entry, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![ix], &[&payer], &payer.pubkey()).unwrap(); + } + + TestContext { + svm, + vault_program_id, + router_program_id, + manager, + payer, + usdc_mint, + tsla_mint, + nvda_mint, + strategy_pda, + share_mint_pda, + registry_pda, + approved_tsla, + approved_nvda, + router_config_pda, + router_authority_pda, + tsla_rate_pda, + nvda_rate_pda, + vault_usdc, + vault_tsla, + vault_nvda, + router_usdc_treasury, + price_feed_tsla, + price_feed_nvda, + } +} + +fn init_strategy(ctx: &mut TestContext, fee_bps: u16, slippage_bps: u16, router: Pubkey) { + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::InitializeStrategy { + index: STRATEGY_INDEX, + fee_bps, + max_slippage_bps: slippage_bps, + swap_router: router, + } + .data(), + vault_strategy::accounts::InitializeStrategyAccountConstraints { + manager: ctx.manager.pubkey(), + usdc_mint: ctx.usdc_mint, + registry: ctx.registry_pda, + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + vault_usdc: ctx.vault_usdc, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&ctx.manager], + &ctx.manager.pubkey(), + ) + .unwrap(); +} + +fn add_asset( + ctx: &mut TestContext, + index: u8, + mint: Pubkey, + approved_asset: Pubkey, + vault: Pubkey, + weight_bps: u16, +) -> Result<(), solana_kite::SolanaKiteError> { + let asset_config = ctx.asset_config(index); + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::AddAsset { weight_bps }.data(), + vault_strategy::accounts::AddAssetAccountConstraints { + manager: ctx.manager.pubkey(), + strategy: ctx.strategy_pda, + registry: ctx.registry_pda, + asset_mint: mint, + approved_asset, + asset_config, + vault_asset: vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&ctx.manager], + &ctx.manager.pubkey(), + ) +} + +/// init strategy + add TSLAx (index 0, 40%) + NVDAx (index 1, 60%). +fn standard_strategy(ctx: &mut TestContext) { + let router = ctx.router_program_id; + init_strategy(ctx, FEE_BPS, SLIPPAGE_BPS, router); + let (tm, wt, vt) = (ctx.tsla_mint, ctx.approved_tsla, ctx.vault_tsla); + add_asset(ctx, 0, tm, wt, vt, 4000).unwrap(); + let (nm, wn, vn) = (ctx.nvda_mint, ctx.approved_nvda, ctx.vault_nvda); + add_asset(ctx, 1, nm, wn, vn, 6000).unwrap(); +} + +/// One asset's deposit remaining_accounts, in the order the handler reads: +/// [asset_config, vault, mint, rate, price_feed]. Deposit deploys into the asset, +/// so vault and mint must be writable. +fn asset_deposit_metas( + config: Pubkey, + vault: Pubkey, + mint: Pubkey, + rate: Pubkey, + feed: Pubkey, +) -> Vec { + vec![ + AccountMeta::new_readonly(config, false), + AccountMeta::new(vault, false), + AccountMeta::new(mint, false), + AccountMeta::new_readonly(rate, false), + AccountMeta::new_readonly(feed, false), + ] +} + +fn deposit_remaining_tsla(ctx: &TestContext) -> Vec { + asset_deposit_metas( + ctx.asset_config(0), + ctx.vault_tsla, + ctx.tsla_mint, + ctx.tsla_rate_pda, + ctx.price_feed_tsla, + ) +} + +/// remaining_accounts for a deposit into the two-asset standard strategy. +fn deposit_remaining(ctx: &TestContext) -> Vec { + let mut metas = deposit_remaining_tsla(ctx); + metas.extend(asset_deposit_metas( + ctx.asset_config(1), + ctx.vault_nvda, + ctx.nvda_mint, + ctx.nvda_rate_pda, + ctx.price_feed_nvda, + )); + metas +} + +/// Named accounts for a deposit (everything except per-asset remaining_accounts). +fn deposit_named_metas(ctx: &TestContext, user: &Keypair) -> Vec { + vault_strategy::accounts::DepositAccountConstraints { + depositor: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: ctx.usdc_mint, + depositor_usdc_account: derive_ata(&user.pubkey(), &ctx.usdc_mint), + depositor_share_account: derive_ata(&user.pubkey(), &ctx.share_mint_pda), + vault_usdc: ctx.vault_usdc, + router_config: ctx.router_config_pda, + router_usdc_treasury: ctx.router_usdc_treasury, + router_authority: ctx.router_authority_pda, + swap_router_program: ctx.router_program_id, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None) +} + +fn deposit_instruction( + ctx: &TestContext, + user: &Keypair, + usdc_amount: u64, + minimum_shares: u64, + remaining: Vec, +) -> Instruction { + let mut metas = deposit_named_metas(ctx, user); + metas.extend(remaining); + Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Deposit { + usdc_amount, + minimum_shares, + } + .data(), + metas, + ) +} + +/// Deposit into the two-asset standard strategy, auto-deploying at the target weights. +fn do_deposit( + ctx: &mut TestContext, + user: &Keypair, + usdc_amount: u64, + minimum_shares: u64, +) -> Pubkey { + let remaining = deposit_remaining(ctx); + let ix = deposit_instruction(ctx, user, usdc_amount, minimum_shares, remaining); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[user], &user.pubkey()).unwrap(); + derive_ata(&user.pubkey(), &ctx.share_mint_pda) +} + +/// Deposit into a TSLAx-only strategy. +fn do_deposit_tsla_only( + ctx: &mut TestContext, + user: &Keypair, + usdc_amount: u64, + minimum_shares: u64, +) -> Pubkey { + let remaining = deposit_remaining_tsla(ctx); + let ix = deposit_instruction(ctx, user, usdc_amount, minimum_shares, remaining); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[user], &user.pubkey()).unwrap(); + derive_ata(&user.pubkey(), &ctx.share_mint_pda) +} + +/// Update the router's exchange rate for a mint (and its Pyth feed stays the caller's +/// job). Used to keep the router quote in step with a price move. +fn set_router_rate(ctx: &mut TestContext, mint: Pubkey, rate: u64, rate_pda: Pubkey) { + let ix = Instruction::new_with_bytes( + ctx.router_program_id, + &mock_swap_router::instruction::SetRate { + mint, + usdc_per_token: rate, + } + .data(), + mock_swap_router::accounts::SetRateAccountConstraints { + authority: ctx.payer.pubkey(), + router_config: ctx.router_config_pda, + asset_mint: mint, + usdc_mint: ctx.usdc_mint, + asset_rate: rate_pda, + router_authority: ctx.router_authority_pda, + router_usdc_treasury: ctx.router_usdc_treasury, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&ctx.payer], &ctx.payer.pubkey()) + .unwrap(); +} + +/// Move NVDAx's price: rewrite its Pyth feed and update the router rate to match. +fn set_nvda_price(ctx: &mut TestContext, price: i64, rate: u64) { + set_price_feed(&mut ctx.svm, ctx.price_feed_nvda, price); + let nvda_mint = ctx.nvda_mint; + let nvda_rate_pda = ctx.nvda_rate_pda; + set_router_rate(ctx, nvda_mint, rate, nvda_rate_pda); +} + +fn set_weight( + ctx: &mut TestContext, + index: u8, + weight_bps: u16, +) -> Result<(), solana_kite::SolanaKiteError> { + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::SetWeight { weight_bps }.data(), + vault_strategy::accounts::SetWeightAccountConstraints { + manager: ctx.manager.pubkey(), + strategy: ctx.strategy_pda, + asset_config: ctx.asset_config(index), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&ctx.manager], + &ctx.manager.pubkey(), + ) +} + +/// init strategy + add only TSLAx at 40%, so total weight is 4000: the strategy is +/// under-allocated and rejects deposits until its weights reach 100%. +fn tsla_only_strategy(ctx: &mut TestContext) { + let router = ctx.router_program_id; + init_strategy(ctx, FEE_BPS, SLIPPAGE_BPS, router); + let (tm, wt, vt) = (ctx.tsla_mint, ctx.approved_tsla, ctx.vault_tsla); + add_asset(ctx, 0, tm, wt, vt, 4000).unwrap(); +} + +fn read_strategy(ctx: &TestContext) -> vault_strategy::state::Strategy { + let account = ctx.svm.get_account(&ctx.strategy_pda).unwrap(); + vault_strategy::state::Strategy::try_deserialize(&mut &account.data[..]).unwrap() +} + +fn read_asset_config(ctx: &TestContext, index: u8) -> vault_strategy::state::AssetConfig { + let account = ctx.svm.get_account(&ctx.asset_config(index)).unwrap(); + vault_strategy::state::AssetConfig::try_deserialize(&mut &account.data[..]).unwrap() +} + +/// (mint, asset_config, price_feed, vault, rate_pda) for an asset in the two-asset +/// standard strategy: index 0 is TSLAx, index 1 is NVDAx. +fn asset_accounts(ctx: &TestContext, index: u8) -> (Pubkey, Pubkey, Pubkey, Pubkey, Pubkey) { + match index { + 0 => ( + ctx.tsla_mint, + ctx.asset_config(0), + ctx.price_feed_tsla, + ctx.vault_tsla, + ctx.tsla_rate_pda, + ), + 1 => ( + ctx.nvda_mint, + ctx.asset_config(1), + ctx.price_feed_nvda, + ctx.vault_nvda, + ctx.nvda_rate_pda, + ), + _ => panic!("unknown asset index {index}"), + } +} + +fn do_rebalance( + ctx: &mut TestContext, + sell_index: u8, + buy_index: u8, + sell_amount: u64, + usdc_to_invest: u64, +) { + let (sell_mint, sell_config, sell_feed, vault_sell, sell_rate) = + asset_accounts(ctx, sell_index); + let (buy_mint, buy_config, buy_feed, vault_buy, buy_rate) = asset_accounts(ctx, buy_index); + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Rebalance { + sell_amount, + usdc_to_invest, + } + .data(), + vault_strategy::accounts::RebalanceAccountConstraints { + manager: ctx.manager.pubkey(), + strategy: ctx.strategy_pda, + usdc_mint: ctx.usdc_mint, + sell_mint, + buy_mint, + sell_config, + buy_config, + sell_price_feed: sell_feed, + buy_price_feed: buy_feed, + vault_sell, + vault_buy, + vault_usdc: ctx.vault_usdc, + sell_rate, + buy_rate, + router_config: ctx.router_config_pda, + router_usdc_treasury: ctx.router_usdc_treasury, + router_authority: ctx.router_authority_pda, + swap_router_program: ctx.router_program_id, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&ctx.manager], + &ctx.manager.pubkey(), + ) + .unwrap(); +} + +fn advance_one_year(ctx: &mut TestContext) { + let clock = ctx.svm.get_sysvar::(); + ctx.svm.set_sysvar(&Clock { + slot: clock.slot + 1_000_000, + epoch_start_timestamp: clock.epoch_start_timestamp, + epoch: clock.epoch, + leader_schedule_epoch: clock.leader_schedule_epoch, + unix_timestamp: PUBLISH_TIME + SECONDS_PER_YEAR, + }); +} + +fn do_collect_fees(ctx: &mut TestContext) -> Pubkey { + let manager_share = derive_ata(&ctx.manager.pubkey(), &ctx.share_mint_pda); + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::CollectFees {}.data(), + vault_strategy::accounts::CollectFeesAccountConstraints { + manager: ctx.manager.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + manager_share_account: manager_share, + payer: ctx.payer.pubkey(), + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&ctx.payer], &ctx.payer.pubkey()) + .unwrap(); + manager_share +} + +fn fund_user(ctx: &mut TestContext, usdc_amount: u64) -> Keypair { + let user = create_wallet(&mut ctx.svm, 10_000_000_000).unwrap(); + let user_usdc = + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.usdc_mint, &ctx.payer) + .unwrap(); + mint_tokens_to_token_account( + &mut ctx.svm, + &ctx.usdc_mint, + &user_usdc, + usdc_amount, + &ctx.payer, + ) + .unwrap(); + user +} + +// ---------------------------------------------------------------------------- + +#[test] +fn test_initialize_and_add_assets() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let account = ctx.svm.get_account(&ctx.strategy_pda).unwrap(); + let strategy = + vault_strategy::state::Strategy::try_deserialize(&mut &account.data[..]).unwrap(); + assert_eq!(strategy.asset_count, 2); + assert_eq!(strategy.total_weight_bps, 10_000); + assert_eq!(strategy.fee_bps, FEE_BPS); + assert_eq!(strategy.max_slippage_bps, SLIPPAGE_BPS); + assert_eq!(strategy.registry, ctx.registry_pda); + + let cfg0 = ctx.svm.get_account(&ctx.asset_config(0)).unwrap(); + let asset0 = vault_strategy::state::AssetConfig::try_deserialize(&mut &cfg0.data[..]).unwrap(); + assert_eq!(asset0.mint, ctx.tsla_mint); + assert_eq!(asset0.price_feed, ctx.price_feed_tsla); + assert_eq!(asset0.vault, ctx.vault_tsla); + assert_eq!(asset0.weight_bps, 4000); +} + +#[test] +fn test_add_asset_rejects_unapproved() { + let mut ctx = setup_full(); + let router = ctx.router_program_id; + init_strategy(&mut ctx, FEE_BPS, SLIPPAGE_BPS, router); + + // A mint that was never approved: its approved_asset PDA does not exist. + let rogue_mint = create_token_mint(&mut ctx.svm, &ctx.payer, TOKEN_DECIMALS, None).unwrap(); + let (rogue_entry, _) = Pubkey::find_program_address( + &[ + b"approved_asset", + ctx.registry_pda.as_ref(), + rogue_mint.as_ref(), + ], + &ctx.vault_program_id, + ); + let rogue_vault = derive_ata(&ctx.strategy_pda, &rogue_mint); + + let result = add_asset(&mut ctx, 0, rogue_mint, rogue_entry, rogue_vault, 5000); + assert!(result.is_err(), "adding an unapproved mint must fail"); +} + +#[test] +fn test_add_asset_rejects_weight_overflow() { + let mut ctx = setup_full(); + let router = ctx.router_program_id; + init_strategy(&mut ctx, FEE_BPS, SLIPPAGE_BPS, router); + let (tm, wt, vt) = (ctx.tsla_mint, ctx.approved_tsla, ctx.vault_tsla); + add_asset(&mut ctx, 0, tm, wt, vt, 6000).unwrap(); + let (nm, wn, vn) = (ctx.nvda_mint, ctx.approved_nvda, ctx.vault_nvda); + let result = add_asset(&mut ctx, 1, nm, wn, vn, 6000); + assert!(result.is_err(), "weights over 10000 bps must fail"); +} + +/// Create a fresh mint and approve it in the registry. The bound price feed is an +/// arbitrary pubkey: callers that never value this asset (e.g. the cap boundary test) +/// do not need a real feed account. +fn create_and_approve_mint(ctx: &mut TestContext) -> (Pubkey, Pubkey) { + let mint = create_token_mint(&mut ctx.svm, &ctx.payer, TOKEN_DECIMALS, None).unwrap(); + let (entry, _) = Pubkey::find_program_address( + &[b"approved_asset", ctx.registry_pda.as_ref(), mint.as_ref()], + &ctx.vault_program_id, + ); + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::ApproveAsset { + price_feed: Keypair::new().pubkey(), + } + .data(), + vault_strategy::accounts::ApproveAssetAccountConstraints { + authority: ctx.payer.pubkey(), + registry: ctx.registry_pda, + asset_mint: mint, + approved_asset: entry, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&ctx.payer], &ctx.payer.pubkey()) + .unwrap(); + (mint, entry) +} + +#[test] +fn test_add_asset_enforces_max_assets() { + let mut ctx = setup_full(); + let router = ctx.router_program_id; + init_strategy(&mut ctx, FEE_BPS, SLIPPAGE_BPS, router); + + // Fill the basket to the cap: 16 assets at 625 bps each = 10000. + for index in 0..16u8 { + let (mint, entry) = create_and_approve_mint(&mut ctx); + let vault = derive_ata(&ctx.strategy_pda, &mint); + add_asset(&mut ctx, index, mint, entry, vault, 625).unwrap(); + } + let strategy = read_strategy(&ctx); + assert_eq!(strategy.asset_count, 16); + assert_eq!(strategy.total_weight_bps, 10_000); + + // The 17th asset must be rejected. Weight 0 so the cap, not the weight sum, trips. + let (mint, entry) = create_and_approve_mint(&mut ctx); + let vault = derive_ata(&ctx.strategy_pda, &mint); + let result = add_asset(&mut ctx, 16, mint, entry, vault, 0); + assert!(result.is_err(), "adding beyond MAX_ASSETS must revert"); +} + +#[test] +fn test_initialize_rejects_excessive_fee() { + let mut ctx = setup_full(); + let excessive = vault_strategy::instructions::initialize_strategy::MAX_FEE_BPS + 1; + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::InitializeStrategy { + index: STRATEGY_INDEX, + fee_bps: excessive, + max_slippage_bps: SLIPPAGE_BPS, + swap_router: ctx.router_program_id, + } + .data(), + vault_strategy::accounts::InitializeStrategyAccountConstraints { + manager: ctx.manager.pubkey(), + usdc_mint: ctx.usdc_mint, + registry: ctx.registry_pda, + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + vault_usdc: ctx.vault_usdc, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + let r = send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&ctx.manager], + &ctx.manager.pubkey(), + ); + assert!(r.is_err(), "fee above MAX_FEE_BPS must be rejected"); +} + +#[test] +fn test_initialize_rejects_excessive_slippage() { + let mut ctx = setup_full(); + let excessive = vault_strategy::instructions::initialize_strategy::MAX_SLIPPAGE_BPS + 1; + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::InitializeStrategy { + index: STRATEGY_INDEX, + fee_bps: FEE_BPS, + max_slippage_bps: excessive, + swap_router: ctx.router_program_id, + } + .data(), + vault_strategy::accounts::InitializeStrategyAccountConstraints { + manager: ctx.manager.pubkey(), + usdc_mint: ctx.usdc_mint, + registry: ctx.registry_pda, + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + vault_usdc: ctx.vault_usdc, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + let r = send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&ctx.manager], + &ctx.manager.pubkey(), + ); + assert!( + r.is_err(), + "slippage above MAX_SLIPPAGE_BPS must be rejected" + ); +} + +#[test] +fn test_deposit_first() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let amount = 1_000_000u64; // 1 USDC + let user = fund_user(&mut ctx, amount); + let user_share = do_deposit(&mut ctx, &user, amount, amount); + + // First deposit is 1:1, then deployed at 40/60: 0.4 USDC -> TSLAx, 0.6 -> NVDAx, + // leaving no idle USDC. + assert_eq!( + get_token_account_balance(&ctx.svm, &user_share).unwrap(), + amount + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(), + 0 + ); + // 400000 USDC / 250 = 1600 TSLAx; 600000 USDC / 180 = 3333 NVDAx (floor). + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 1_600 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(), + 3_333 + ); +} + +#[test] +fn test_deposit_rejects_underallocated() { + let mut ctx = setup_full(); + // TSLAx at 40% only: total weight is 4000, so the strategy is not investable yet. + tsla_only_strategy(&mut ctx); + + let user = fund_user(&mut ctx, 10_000_000); + let ix = deposit_instruction(&ctx, &user, 10_000_000, 1, deposit_remaining_tsla(&ctx)); + let r = send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()); + assert!( + r.is_err(), + "deposit into an under-allocated strategy must revert" + ); + + // Bring TSLAx to 100%; the deposit now succeeds and deploys fully into TSLAx. + // Fresh blockhash so the retry is not byte-identical to the reverted attempt. + set_weight(&mut ctx, 0, 10_000).unwrap(); + ctx.svm.expire_blockhash(); + do_deposit_tsla_only(&mut ctx, &user, 10_000_000, 1); + + // 10 USDC / 250 = 40000 TSLAx, with no idle USDC left. + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 40_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(), + 0 + ); +} + +#[test] +fn test_deposit_rejects_slippage() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + // Router rate for TSLAx far worse than the oracle: a deposit's TSLAx deploy leg + // must revert, taking the whole deposit with it. + let (tsla_mint, tsla_rate_pda) = (ctx.tsla_mint, ctx.tsla_rate_pda); + set_router_rate(&mut ctx, tsla_mint, 300, tsla_rate_pda); + + let user = fund_user(&mut ctx, 10_000_000); + let ix = deposit_instruction(&ctx, &user, 10_000_000, 1, deposit_remaining(&ctx)); + let r = send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()); + assert!( + r.is_err(), + "deposit deploy leg worse than oracle must revert the deposit" + ); +} + +#[test] +fn test_deposit_rejects_unregistered_router() { + let mut ctx = setup_full(); + // Register a different router than the deployed mock, then fully allocate 40/60. + let bogus_router = Pubkey::new_unique(); + init_strategy(&mut ctx, FEE_BPS, SLIPPAGE_BPS, bogus_router); + let (tm, wt, vt) = (ctx.tsla_mint, ctx.approved_tsla, ctx.vault_tsla); + add_asset(&mut ctx, 0, tm, wt, vt, 4000).unwrap(); + let (nm, wn, vn) = (ctx.nvda_mint, ctx.approved_nvda, ctx.vault_nvda); + add_asset(&mut ctx, 1, nm, wn, vn, 6000).unwrap(); + + let user = fund_user(&mut ctx, 10_000_000); + let ix = deposit_instruction(&ctx, &user, 10_000_000, 1, deposit_remaining(&ctx)); + let r = send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()); + assert!( + r.is_err(), + "deposit deploying through an unregistered router must fail" + ); +} + +#[test] +fn test_deposit_fair_pricing() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + // Alice deposits 900 USDC (first deposit 1:1 -> 900,000,000 shares), auto-deployed + // 40/60: 1.44 TSLAx + 3.0 NVDAx. NAV = 900 USDC. + let alice = fund_user(&mut ctx, 900_000_000); + let alice_share = do_deposit(&mut ctx, &alice, 900_000_000, 1); + assert_eq!( + get_token_account_balance(&ctx.svm, &alice_share).unwrap(), + 900_000_000 + ); + + // NVDAx rises 180 -> 200. NAV rises to 0 + 1.44*250 + 3.0*200 = 960 USDC. + set_nvda_price(&mut ctx, 20_000_000_000, 200); + + // Bob deposits 480 USDC at the higher NAV: shares = 480 * 900 / 960 = 450,000,000. + // He pays today's price, so he does not dilute Alice's gain. + let bob = fund_user(&mut ctx, 480_000_000); + let bob_share = do_deposit(&mut ctx, &bob, 480_000_000, 1); + assert_eq!( + get_token_account_balance(&ctx.svm, &bob_share).unwrap(), + 450_000_000 + ); + + // Alice's shares are untouched; supply is the two deposits combined. + assert_eq!( + get_token_account_balance(&ctx.svm, &alice_share).unwrap(), + 900_000_000 + ); + let strategy = read_strategy(&ctx); + assert_eq!(strategy.total_shares, 1_350_000_000); +} + +#[test] +fn test_rebalance() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + // Alice deposits 900 USDC, auto-deployed to 1.44 TSLAx + 3.0 NVDAx (exactly 40/60). + let alice = fund_user(&mut ctx, 900_000_000); + do_deposit(&mut ctx, &alice, 900_000_000, 1); + + // NVDAx rises 180 -> 200, pushing the basket to 37.5 / 62.5 by value. + set_nvda_price(&mut ctx, 20_000_000_000, 200); + + // Rebalance back toward 40/60: sell 0.12 NVDAx for 24 USDC, buy 0.096 TSLAx with it. + do_rebalance(&mut ctx, 1, 0, 120_000, 24_000_000); + + // 1.44 + 0.096 = 1.536 TSLAx; 3.0 - 0.12 = 2.88 NVDAx. Now 384 / 576 = 40 / 60. + // The USDC vault nets to zero across the two legs. + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 1_536_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(), + 2_880_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(), + 0 + ); +} + +#[test] +fn test_collect_fees() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let user = fund_user(&mut ctx, 1_000_000_000); // 1000 USDC + do_deposit(&mut ctx, &user, 1_000_000_000, 1); + + advance_one_year(&mut ctx); + let manager_share = do_collect_fees(&mut ctx); + + // 1% of 1,000,000,000 = 10,000,000 fee shares. + assert_eq!( + get_token_account_balance(&ctx.svm, &manager_share).unwrap(), + 10_000_000 + ); +} + +fn withdraw_remaining(ctx: &TestContext, user: &Pubkey) -> Vec { + vec![ + AccountMeta::new_readonly(ctx.asset_config(0), false), + AccountMeta::new(ctx.vault_tsla, false), + AccountMeta::new_readonly(ctx.tsla_mint, false), + AccountMeta::new(derive_ata(user, &ctx.tsla_mint), false), + AccountMeta::new_readonly(ctx.asset_config(1), false), + AccountMeta::new(ctx.vault_nvda, false), + AccountMeta::new_readonly(ctx.nvda_mint, false), + AccountMeta::new(derive_ata(user, &ctx.nvda_mint), false), + ] +} + +#[test] +fn test_withdraw() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let user = fund_user(&mut ctx, 10_000_000); + // Deposit auto-deploys 4 USDC -> 16000 TSLAx and 6 USDC -> 33333 NVDAx, no idle USDC. + let user_share = do_deposit(&mut ctx, &user, 10_000_000, 1); + let shares = get_token_account_balance(&ctx.svm, &user_share).unwrap(); + + // User needs token accounts for each asset paid in kind. + let user_usdc = derive_ata(&user.pubkey(), &ctx.usdc_mint); + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.tsla_mint, &ctx.payer) + .unwrap(); + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.nvda_mint, &ctx.payer) + .unwrap(); + + let mut metas = vault_strategy::accounts::WithdrawAccountConstraints { + user: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: ctx.usdc_mint, + user_share_account: user_share, + user_usdc_account: user_usdc, + vault_usdc: ctx.vault_usdc, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None); + metas.extend(withdraw_remaining(&ctx, &user.pubkey())); + + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Withdraw { + shares_to_burn: shares, + min_usdc_out: 0, + } + .data(), + metas, + ); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()).unwrap(); + + // Sole holder withdraws everything in kind: all 16000 TSLAx + 33333 NVDAx, no USDC. + assert_eq!(get_token_account_balance(&ctx.svm, &user_usdc).unwrap(), 0); + assert_eq!( + get_token_account_balance(&ctx.svm, &derive_ata(&user.pubkey(), &ctx.tsla_mint)).unwrap(), + 16_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &derive_ata(&user.pubkey(), &ctx.nvda_mint)).unwrap(), + 33_333 + ); +} + +#[test] +fn test_withdraw_rejects_slippage() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let user = fund_user(&mut ctx, 10_000_000); + let user_share = do_deposit(&mut ctx, &user, 10_000_000, 1); + let shares = get_token_account_balance(&ctx.svm, &user_share).unwrap(); + + let user_usdc = derive_ata(&user.pubkey(), &ctx.usdc_mint); + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.tsla_mint, &ctx.payer) + .unwrap(); + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.nvda_mint, &ctx.payer) + .unwrap(); + + let mut metas = vault_strategy::accounts::WithdrawAccountConstraints { + user: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: ctx.usdc_mint, + user_share_account: user_share, + user_usdc_account: user_usdc, + vault_usdc: ctx.vault_usdc, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None); + metas.extend(withdraw_remaining(&ctx, &user.pubkey())); + + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Withdraw { + shares_to_burn: shares, + // The deposit was fully deployed, so the USDC payout is 0; demanding any + // USDC back must revert. + min_usdc_out: 1, + } + .data(), + metas, + ); + let r = send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()); + assert!(r.is_err(), "min_usdc_out above payout must revert"); +} + +#[test] +fn test_deposit_rejects_incomplete_assets() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let amount = 1_000_000u64; + let user = fund_user(&mut ctx, amount); + + // Only one asset's accounts supplied (5) for a two-asset strategy (needs 10). + let ix = deposit_instruction(&ctx, &user, amount, 1, deposit_remaining_tsla(&ctx)); + let r = send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()); + assert!(r.is_err(), "incomplete asset accounts must revert"); +} + +fn do_withdraw(ctx: &mut TestContext, user: &Keypair, shares: u64, min_usdc_out: u64) { + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.tsla_mint, &ctx.payer) + .unwrap(); + create_associated_token_account(&mut ctx.svm, &user.pubkey(), &ctx.nvda_mint, &ctx.payer) + .unwrap(); + let user_usdc = derive_ata(&user.pubkey(), &ctx.usdc_mint); + let user_share = derive_ata(&user.pubkey(), &ctx.share_mint_pda); + let mut metas = vault_strategy::accounts::WithdrawAccountConstraints { + user: user.pubkey(), + strategy: ctx.strategy_pda, + share_mint: ctx.share_mint_pda, + usdc_mint: ctx.usdc_mint, + user_share_account: user_share, + user_usdc_account: user_usdc, + vault_usdc: ctx.vault_usdc, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None); + metas.extend(withdraw_remaining(ctx, &user.pubkey())); + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::Withdraw { + shares_to_burn: shares, + min_usdc_out, + } + .data(), + metas, + ); + send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[user], &user.pubkey()).unwrap(); +} + +#[test] +fn test_set_weight_retire() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + // Retire NVDAx by setting its target weight to zero. Total drops to 4000, so the + // strategy is under-allocated and stops accepting deposits. + set_weight(&mut ctx, 1, 0).unwrap(); + let strategy = read_strategy(&ctx); + assert_eq!(strategy.total_weight_bps, 4000); + assert_eq!(read_asset_config(&ctx, 1).weight_bps, 0); + + let user = fund_user(&mut ctx, 100_000_000); + let ix = deposit_instruction(&ctx, &user, 100_000_000, 1, deposit_remaining(&ctx)); + let r = send_transaction_from_instructions(&mut ctx.svm, vec![ix], &[&user], &user.pubkey()); + assert!( + r.is_err(), + "an under-allocated (retired) strategy must reject deposits" + ); + + // Reassign the freed weight to TSLAx (back to 100%); deposits reopen and now deploy + // entirely into TSLAx, never touching the retired NVDAx vault. Fresh blockhash so + // the retry is not byte-identical to the reverted attempt. + set_weight(&mut ctx, 0, 10_000).unwrap(); + ctx.svm.expire_blockhash(); + do_deposit(&mut ctx, &user, 100_000_000, 1); + // 100 USDC / 250 = 400000 TSLAx, nothing to NVDAx, no idle USDC. + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 400_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(), + 0 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_usdc).unwrap(), + 0 + ); +} + +#[test] +fn test_set_weight_rejects_overflow() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + // TSLAx 4000 + NVDAx 6000 = 10000. Raising TSLAx to 6000 would total 12000. + let r = set_weight(&mut ctx, 0, 6000); + assert!( + r.is_err(), + "weight change pushing total over 10000 must revert" + ); +} + +#[test] +fn test_set_weight_rejects_non_manager() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + let intruder = create_wallet(&mut ctx.svm, 10_000_000_000).unwrap(); + let ix = Instruction::new_with_bytes( + ctx.vault_program_id, + &vault_strategy::instruction::SetWeight { weight_bps: 0 }.data(), + vault_strategy::accounts::SetWeightAccountConstraints { + manager: intruder.pubkey(), + strategy: ctx.strategy_pda, + asset_config: ctx.asset_config(1), + } + .to_account_metas(None), + ); + let r = send_transaction_from_instructions( + &mut ctx.svm, + vec![ix], + &[&intruder], + &intruder.pubkey(), + ); + assert!(r.is_err(), "only the manager may set weights"); +} + +/// The whole lifecycle with the exact figures the video script narrates: deposit and +/// auto-deploy, a price move, a rebalance back to target, a second depositor priced at +/// the new NAV, a year's fee, and an in-kind withdrawal. +#[test] +fn test_full_lifecycle() { + let mut ctx = setup_full(); + standard_strategy(&mut ctx); + + // Alice deposits 900 USDC -> 900,000,000 shares, deployed to 1.44 TSLAx + 3.0 NVDAx. + let alice = fund_user(&mut ctx, 900_000_000); + let alice_share = do_deposit(&mut ctx, &alice, 900_000_000, 1); + assert_eq!( + get_token_account_balance(&ctx.svm, &alice_share).unwrap(), + 900_000_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 1_440_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(), + 3_000_000 + ); + + // NVDAx 180 -> 200; basket drifts to 37.5 / 62.5. Rebalance back to 40/60. + set_nvda_price(&mut ctx, 20_000_000_000, 200); + do_rebalance(&mut ctx, 1, 0, 120_000, 24_000_000); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 1_536_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(), + 2_880_000 + ); + + // Bob deposits 480 USDC at NAV 960 -> 450,000,000 shares, deployed 40/60. + let bob = fund_user(&mut ctx, 480_000_000); + let bob_share = do_deposit(&mut ctx, &bob, 480_000_000, 1); + assert_eq!( + get_token_account_balance(&ctx.svm, &bob_share).unwrap(), + 450_000_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_tsla).unwrap(), + 2_304_000 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &ctx.vault_nvda).unwrap(), + 4_320_000 + ); + + // A year passes; the manager collects 1% of the 1,350,000,000 supply = 13,500,000. + advance_one_year(&mut ctx); + let manager_share = do_collect_fees(&mut ctx); + assert_eq!( + get_token_account_balance(&ctx.svm, &manager_share).unwrap(), + 13_500_000 + ); + assert_eq!(read_strategy(&ctx).total_shares, 1_363_500_000); + + // Alice withdraws all 900,000,000 shares in kind: her 900/1363.5 slice of each vault. + do_withdraw(&mut ctx, &alice, 900_000_000, 0); + assert_eq!( + get_token_account_balance(&ctx.svm, &derive_ata(&alice.pubkey(), &ctx.tsla_mint)).unwrap(), + 1_520_792 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &derive_ata(&alice.pubkey(), &ctx.nvda_mint)).unwrap(), + 2_851_485 + ); + assert_eq!( + get_token_account_balance(&ctx.svm, &derive_ata(&alice.pubkey(), &ctx.usdc_mint)).unwrap(), + 0 + ); + assert_eq!(read_strategy(&ctx).total_shares, 463_500_000); +} diff --git a/finance/vault-strategy/anchor/README.md b/finance/vault-strategy/anchor/README.md index f0c43d3fb..ef13f1688 100644 --- a/finance/vault-strategy/anchor/README.md +++ b/finance/vault-strategy/anchor/README.md @@ -1,5 +1,11 @@ # Solana Vault Strategy (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + A manager-run investment vault on Solana. Users deposit [USDC](https://www.investopedia.com/terms/u/usd-coin-usdc.asp) and receive shares representing proportional ownership of a portfolio of assets. The manager adds assets a curator has approved and sets their target weights; each deposit is deployed across those assets at its weights in the same transaction. The manager rebalances as prices drift, earns a fee, and depositors withdraw their proportional slice in kind when they choose. The example uses two stocks as the portfolio assets: **TSLAx** (Tesla) and **NVDAx** (NVIDIA) - [xStocks](https://backed.fi/xstocks) issued on Solana by Backed Finance. In tests these are mock [tokens](https://solana.com/docs/terminology#token). diff --git a/tokens/create-token/anchor-v1/Anchor.toml b/tokens/create-token/anchor-v1/Anchor.toml new file mode 100644 index 000000000..943ead39e --- /dev/null +++ b/tokens/create-token/anchor-v1/Anchor.toml @@ -0,0 +1,21 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +create_token = "GwvQ53QTu1xz3XXYfG5m5jEqwhMBvVBudPS8TUuFYnhT" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# The LiteSVM test loads Metaplex Token Metadata from a local fixture +# (tests/fixtures/mpl_token_metadata.so) instead of cloning it from mainnet, +# which is too slow and unreliable in CI. +test = "cargo test" diff --git a/tokens/create-token/anchor-v1/CHANGELOG.md b/tokens/create-token/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/create-token/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/create-token/anchor-v1/Cargo.toml b/tokens/create-token/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/create-token/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/create-token/anchor-v1/README.md b/tokens/create-token/anchor-v1/README.md new file mode 100644 index 000000000..82c9691bf --- /dev/null +++ b/tokens/create-token/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Create Token (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Create a token mint with metadata (symbol, name, uri) via the Classic Token and Metaplex Token Metadata programs. + +See also: [Create Token overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Mint and metadata accounts +- See [tokens/create-token/README.md](../README.md) + +## Setup + +From this directory (`tokens/create-token/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/create-token/anchor-v1/prepare.mjs b/tokens/create-token/anchor-v1/prepare.mjs new file mode 100644 index 000000000..afef70398 --- /dev/null +++ b/tokens/create-token/anchor-v1/prepare.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "mpl_token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/create-token/anchor-v1/programs/create-token/Cargo.toml b/tokens/create-token/anchor-v1/programs/create-token/Cargo.toml new file mode 100644 index 000000000..ca65253b2 --- /dev/null +++ b/tokens/create-token/anchor-v1/programs/create-token/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "create-token" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "create_token" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = { version = "1.1.2", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/create-token/anchor-v1/programs/create-token/Xargo.toml b/tokens/create-token/anchor-v1/programs/create-token/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/create-token/anchor-v1/programs/create-token/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/create-token/anchor-v1/programs/create-token/src/lib.rs b/tokens/create-token/anchor-v1/programs/create-token/src/lib.rs new file mode 100644 index 000000000..59173b779 --- /dev/null +++ b/tokens/create-token/anchor-v1/programs/create-token/src/lib.rs @@ -0,0 +1,93 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + metadata::{ + create_metadata_accounts_v3, mpl_token_metadata::types::DataV2, + CreateMetadataAccountsV3, Metadata, + }, + token::{Mint, Token}, + }, +}; + +declare_id!("GwvQ53QTu1xz3XXYfG5m5jEqwhMBvVBudPS8TUuFYnhT"); + +#[program] +pub mod create_token { + use super::*; + + pub fn create_token_mint( + context: Context, + _token_decimals: u8, + token_name: String, + token_symbol: String, + token_uri: String, + ) -> Result<()> { + msg!("Creating metadata account..."); + msg!( + "Metadata account address: {}", + &context.accounts.metadata_account.key() + ); + + // Cross Program Invocation (CPI) + // Invoking the create_metadata_account_v3 instruction on the token metadata program + create_metadata_accounts_v3( + CpiContext::new( + context.accounts.token_metadata_program.key(), + CreateMetadataAccountsV3 { + metadata: context.accounts.metadata_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + mint_authority: context.accounts.payer.to_account_info(), + update_authority: context.accounts.payer.to_account_info(), + payer: context.accounts.payer.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + rent: context.accounts.rent.to_account_info(), + }, + ), + DataV2 { + name: token_name, + symbol: token_symbol, + uri: token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + false, // Is mutable + true, // Update authority is signer + None, // Collection details + )?; + + msg!("Token mint created successfully."); + + Ok(()) + } +} + +#[derive(Accounts)] +#[instruction(_token_decimals: u8)] +pub struct CreateTokenMintAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + /// CHECK: Validate address by deriving pda + #[account( + mut, + seeds = [b"metadata", token_metadata_program.key().as_ref(), mint_account.key().as_ref()], + bump, + seeds::program = token_metadata_program.key(), + )] + pub metadata_account: UncheckedAccount<'info>, + // Create new mint account + #[account( + init, + payer = payer, + mint::decimals = _token_decimals, + mint::authority = payer.key(), + )] + pub mint_account: Account<'info, Mint>, + + pub token_metadata_program: Program<'info, Metadata>, + pub token_program: Program<'info, Token>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, +} diff --git a/tokens/create-token/anchor-v1/programs/create-token/tests/test_create_token.rs b/tokens/create-token/anchor-v1/programs/create-token/tests/test_create_token.rs new file mode 100644 index 000000000..11e7bf7a0 --- /dev/null +++ b/tokens/create-token/anchor-v1/programs/create-token/tests/test_create_token.rs @@ -0,0 +1,145 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = create_token::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/create_token.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +#[test] +fn test_create_spl_token() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &create_token::instruction::CreateTokenMint { + _token_decimals: 9, + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + create_token::accounts::CreateTokenMintAccountConstraints { + payer: payer.pubkey(), + metadata_account, + mint_account: mint_keypair.pubkey(), + token_metadata_program: metadata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the mint account exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint account should have data"); + + // Verify the metadata account was created + let meta_account = svm + .get_account(&metadata_account) + .expect("Metadata account should exist"); + assert!( + !meta_account.data.is_empty(), + "Metadata account should have data" + ); +} + +#[test] +fn test_create_nft() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &create_token::instruction::CreateTokenMint { + _token_decimals: 0, + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/nft.json".to_string(), + } + .data(), + create_token::accounts::CreateTokenMintAccountConstraints { + payer: payer.pubkey(), + metadata_account, + mint_account: mint_keypair.pubkey(), + token_metadata_program: metadata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the mint account exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint account should have data"); +} diff --git a/tokens/create-token/anchor-v1/tests/fixtures/mpl_token_metadata.so b/tokens/create-token/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Create a token mint with metadata (symbol, name, uri) via the Classic Token and Metaplex Token Metadata programs. See also: [Create Token overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/tokens/external-delegate-token-master/anchor-v1/Anchor.toml b/tokens/external-delegate-token-master/anchor-v1/Anchor.toml new file mode 100644 index 000000000..e84c0f638 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +external_delegate_token_master = "FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" \ No newline at end of file diff --git a/tokens/external-delegate-token-master/anchor-v1/CHANGELOG.md b/tokens/external-delegate-token-master/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/external-delegate-token-master/anchor-v1/Cargo.toml b/tokens/external-delegate-token-master/anchor-v1/Cargo.toml new file mode 100644 index 000000000..92e201f94 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/Cargo.toml @@ -0,0 +1,12 @@ +[workspace] +members = ["programs/*"] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/external-delegate-token-master/anchor-v1/README.md b/tokens/external-delegate-token-master/anchor-v1/README.md new file mode 100644 index 000000000..a17d70aa2 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/README.md @@ -0,0 +1,43 @@ +# External Delegate Token Master (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Authorize token transfers using an external secp256k1 delegate signature. + +See the [example overview](../README.md) for the signed-message format and nonce semantics shared with the [Quasar variant](../quasar/), and the [repository catalog](../../../README.md). + +## Major concepts + +- `UserAccount` state: the Solana `authority`, the delegate's 20-byte `ethereum_address`, and a `nonce` consumed by each signature-authorized transfer. +- `transfer_tokens` rebuilds the authorized message onchain as keccak256(program id || user account || amount LE || recipient token account || nonce LE), recovers the signer with the secp256k1 syscall, compares the recovered Ethereum address to the stored one, and increments the nonce before the transfer CPI. The `authority` must also sign the transaction; the Ethereum signature supplements that check. +- `authority_transfer` moves tokens with only the Solana authority's signature. +- Both transfer handlers use `transfer_checked` through `anchor_spl::token_interface`, so the program works against the Classic Token Program and the Token Extensions Program. +- Tokens are held by a token account owned by a PDA derived from the user account's address; the program signs the CPI with that PDA. + +## Setup + +From this directory (`tokens/external-delegate-token-master/anchor/`): + +```bash +cargo build-sbf +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`) and [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. Build first so `target/deploy/external_delegate_token_master.so` exists, then: + +```bash +cargo test +``` + +The tests sign real transfer authorizations with a fixed secp256k1 key, send transactions, and assert token balances and nonce state, including the replay, wrong-amount, wrong-recipient, and wrong-authority failure paths. + +## Usage + +Read the program source under `programs/` and `Anchor.toml` for the program ID. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Cargo.toml b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Cargo.toml new file mode 100644 index 000000000..a1ccd537b --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "external-delegate-token-master" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "external_delegate_token_master" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata"] } +sha3 = "0.10.8" +solana-secp256k1-recover = "2.0.0" + +[dev-dependencies] +# Signs test transfer authorizations with a fixed secp256k1 key so tests can +# exercise the Ethereum-signature path end to end. +libsecp256k1 = "0.7.2" +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Xargo.toml b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/authority_transfer.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/authority_transfer.rs new file mode 100644 index 000000000..9fc507eea --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/authority_transfer.rs @@ -0,0 +1,54 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::UserAccount; + +#[derive(Accounts)] +pub struct AuthorityTransferAccountConstraints<'info> { + #[account(has_one = authority)] + pub user_account: Account<'info, UserAccount>, + + pub authority: Signer<'info>, + + pub mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub user_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + seeds = [user_account.key().as_ref()], + bump, + )] + pub user_pda: SystemAccount<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + let transfer_accounts = TransferChecked { + from: context.accounts.user_token_account.to_account_info(), + mint: context.accounts.mint.to_account_info(), + to: context.accounts.recipient_token_account.to_account_info(), + authority: context.accounts.user_pda.to_account_info(), + }; + + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + transfer_accounts, + &[&[ + context.accounts.user_account.key().as_ref(), + &[context.bumps.user_pda], + ]], + ), + amount, + context.accounts.mint.decimals, + )?; + + Ok(()) +} diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/initialize.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/initialize.rs new file mode 100644 index 000000000..12890e6e8 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/initialize.rs @@ -0,0 +1,26 @@ +use anchor_lang::prelude::*; + +use crate::UserAccount; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account( + init, + payer = authority, + space = UserAccount::DISCRIMINATOR.len() + UserAccount::INIT_SPACE, + )] + pub user_account: Account<'info, UserAccount>, + + #[account(mut)] + pub authority: Signer<'info>, + + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context) -> Result<()> { + let user_account = &mut context.accounts.user_account; + user_account.authority = context.accounts.authority.key(); + user_account.ethereum_address = [0; 20]; + user_account.nonce = 0; + Ok(()) +} diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/mod.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/mod.rs new file mode 100644 index 000000000..43f46ed26 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/mod.rs @@ -0,0 +1,9 @@ +pub mod authority_transfer; +pub mod initialize; +pub mod set_ethereum_address; +pub mod transfer_tokens; + +pub use authority_transfer::*; +pub use initialize::*; +pub use set_ethereum_address::*; +pub use transfer_tokens::*; diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs new file mode 100644 index 000000000..1967fc1b4 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/set_ethereum_address.rs @@ -0,0 +1,20 @@ +use anchor_lang::prelude::*; + +use crate::UserAccount; + +#[derive(Accounts)] +pub struct SetEthereumAddressAccountConstraints<'info> { + #[account(mut, has_one = authority)] + pub user_account: Account<'info, UserAccount>, + + pub authority: Signer<'info>, +} + +pub fn handler( + context: Context, + ethereum_address: [u8; 20], +) -> Result<()> { + let user_account = &mut context.accounts.user_account; + user_account.ethereum_address = ethereum_address; + Ok(()) +} diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs new file mode 100644 index 000000000..4ab2c8631 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/instructions/transfer_tokens.rs @@ -0,0 +1,80 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked, +}; + +use crate::{build_transfer_authorization_message, verify_ethereum_signature, ErrorCode, UserAccount}; + +#[derive(Accounts)] +pub struct TransferTokensAccountConstraints<'info> { + #[account(mut, has_one = authority)] + pub user_account: Account<'info, UserAccount>, + + pub authority: Signer<'info>, + + pub mint: InterfaceAccount<'info, Mint>, + + #[account(mut)] + pub user_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account(mut)] + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + seeds = [user_account.key().as_ref()], + bump, + )] + pub user_pda: SystemAccount<'info>, + + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handler( + context: Context, + amount: u64, + signature: [u8; 65], +) -> Result<()> { + let user_account = &context.accounts.user_account; + let user_account_key = user_account.key(); + + // Rebuild the authorized message onchain so the signature commits to + // this exact transfer (amount, recipient, and the current nonce). + let message = build_transfer_authorization_message( + &user_account_key, + amount, + &context.accounts.recipient_token_account.key(), + user_account.nonce, + ); + + require!( + verify_ethereum_signature(&user_account.ethereum_address, &message, &signature), + ErrorCode::InvalidSignature + ); + + // Consume the nonce before the transfer CPI (checks-effects-interactions), + // so this signature can never authorize a second execution. + let user_account = &mut context.accounts.user_account; + user_account.nonce = user_account + .nonce + .checked_add(1) + .ok_or(ErrorCode::NonceOverflow)?; + + let transfer_accounts = TransferChecked { + from: context.accounts.user_token_account.to_account_info(), + mint: context.accounts.mint.to_account_info(), + to: context.accounts.recipient_token_account.to_account_info(), + authority: context.accounts.user_pda.to_account_info(), + }; + + transfer_checked( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + transfer_accounts, + &[&[user_account_key.as_ref(), &[context.bumps.user_pda]]], + ), + amount, + context.accounts.mint.decimals, + )?; + + Ok(()) +} diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/lib.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/lib.rs new file mode 100644 index 000000000..27aed7a12 --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/src/lib.rs @@ -0,0 +1,106 @@ +use anchor_lang::prelude::*; +use sha3::{Digest, Keccak256}; +use solana_secp256k1_recover::secp256k1_recover; + +mod instructions; +use instructions::*; + +declare_id!("FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD"); + +#[program] +pub mod external_delegate_token_master { + use super::*; + + pub fn initialize(context: Context) -> Result<()> { + instructions::initialize::handler(context) + } + + pub fn set_ethereum_address( + context: Context, + ethereum_address: [u8; 20], + ) -> Result<()> { + instructions::set_ethereum_address::handler(context, ethereum_address) + } + + pub fn transfer_tokens( + context: Context, + amount: u64, + signature: [u8; 65], + ) -> Result<()> { + instructions::transfer_tokens::handler(context, amount, signature) + } + + pub fn authority_transfer( + context: Context, + amount: u64, + ) -> Result<()> { + instructions::authority_transfer::handler(context, amount) + } +} + +#[account] +#[derive(InitSpace)] +pub struct UserAccount { + pub authority: Pubkey, + pub ethereum_address: [u8; 20], + /// Strictly increasing counter committed into every signed transfer + /// authorization, so each Ethereum signature executes exactly once. + pub nonce: u64, +} + +#[error_code] +pub enum ErrorCode { + #[msg("Invalid Ethereum signature")] + InvalidSignature, + #[msg("Nonce overflow")] + NonceOverflow, +} + +/// Reconstructs the message a delegate must sign to authorize one transfer: +/// keccak256(program id || user account || amount LE || recipient token account || nonce LE). +/// +/// Because the hash commits to every transfer parameter plus the user +/// account's stored nonce, a signature is valid for exactly one +/// (amount, recipient, nonce) execution and cannot be replayed. +pub fn build_transfer_authorization_message( + user_account: &Pubkey, + amount: u64, + recipient_token_account: &Pubkey, + nonce: u64, +) -> [u8; 32] { + let mut hasher = Keccak256::new(); + hasher.update(ID.as_ref()); + hasher.update(user_account.as_ref()); + hasher.update(amount.to_le_bytes()); + hasher.update(recipient_token_account.as_ref()); + hasher.update(nonce.to_le_bytes()); + hasher.finalize().into() +} + +pub fn verify_ethereum_signature( + ethereum_address: &[u8; 20], + message: &[u8; 32], + signature: &[u8; 65], +) -> bool { + let recovery_id = signature[64]; + let mut sig = [0u8; 64]; + sig.copy_from_slice(&signature[..64]); + + if let Ok(pubkey) = secp256k1_recover(message, recovery_id, &sig) { + // An Ethereum address is the last 20 bytes of the keccak256 hash of + // the 64-byte uncompressed public key (x || y, no 0x04 prefix byte). + // `secp256k1_recover` already returns exactly those 64 bytes. + let pubkey_bytes = pubkey.to_bytes(); + let mut recovered_address = [0u8; 20]; + recovered_address.copy_from_slice(&keccak256(&pubkey_bytes)[12..]); + recovered_address == *ethereum_address + } else { + false + } +} + +fn keccak256(data: &[u8]) -> [u8; 32] { + let mut hasher = Keccak256::new(); + hasher.update(data); + hasher.finalize().into() +} diff --git a/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/tests/test_external_delegate.rs b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/tests/test_external_delegate.rs new file mode 100644 index 000000000..4b6d73bdc --- /dev/null +++ b/tokens/external-delegate-token-master/anchor-v1/programs/external-delegate-token-master/tests/test_external_delegate.rs @@ -0,0 +1,515 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + sha3::{Digest, Keccak256}, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +const WALLET_LAMPORTS: u64 = 10_000_000_000; +const MINT_DECIMALS: u8 = 6; +const MINT_AMOUNT: u64 = 1_000_000_000; +const TRANSFER_AMOUNT: u64 = 500_000_000; + +/// Fixed delegate key so tests are deterministic. Any nonzero scalar below +/// the secp256k1 curve order works. +const DELEGATE_SECP256K1_PRIVATE_KEY: [u8; 32] = [0x42; 32]; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +/// Mirror of the program's `UserAccount` for reading state in tests +/// (after the 8-byte Anchor discriminator). +#[derive(BorshDeserialize)] +struct UserAccountState { + authority: [u8; 32], + ethereum_address: [u8; 20], + nonce: u64, +} + +fn read_user_account(svm: &LiteSVM, address: &Pubkey) -> UserAccountState { + let account = svm.get_account(address).expect("user account should exist"); + let anchor_discriminator_len = 8; + UserAccountState::try_from_slice(&account.data[anchor_discriminator_len..]).unwrap() +} + +fn delegate_secret_key() -> libsecp256k1::SecretKey { + libsecp256k1::SecretKey::parse(&DELEGATE_SECP256K1_PRIVATE_KEY).unwrap() +} + +/// Ethereum address = last 20 bytes of keccak256 of the 64-byte uncompressed +/// public key (0x04 prefix dropped). +fn ethereum_address_of(secret_key: &libsecp256k1::SecretKey) -> [u8; 20] { + let public_key = libsecp256k1::PublicKey::from_secret_key(secret_key); + let uncompressed = public_key.serialize(); + let hash = Keccak256::digest(&uncompressed[1..]); + let mut address = [0u8; 20]; + address.copy_from_slice(&hash[12..]); + address +} + +/// Builds the exact preimage the program reconstructs onchain: +/// keccak256(program id || user account || amount LE || recipient token account || nonce LE). +fn build_transfer_authorization_message( + program_id: &Pubkey, + user_account: &Pubkey, + amount: u64, + recipient_token_account: &Pubkey, + nonce: u64, +) -> [u8; 32] { + let mut hasher = Keccak256::new(); + hasher.update(program_id.as_ref()); + hasher.update(user_account.as_ref()); + hasher.update(amount.to_le_bytes()); + hasher.update(recipient_token_account.as_ref()); + hasher.update(nonce.to_le_bytes()); + hasher.finalize().into() +} + +/// 65-byte recoverable signature: r || s || recovery id. +fn sign_transfer_authorization( + secret_key: &libsecp256k1::SecretKey, + message: &[u8; 32], +) -> [u8; 65] { + let (signature, recovery_id) = + libsecp256k1::sign(&libsecp256k1::Message::parse(message), secret_key); + let mut bytes = [0u8; 65]; + bytes[..64].copy_from_slice(&signature.serialize()); + bytes[64] = recovery_id.serialize(); + bytes +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = external_delegate_token_master::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/external_delegate_token_master.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, WALLET_LAMPORTS).unwrap(); + (svm, program_id, payer) +} + +fn initialize_user_account( + svm: &mut LiteSVM, + program_id: &Pubkey, + authority: &Keypair, + user_account: &Keypair, +) { + let init_instruction = Instruction::new_with_bytes( + *program_id, + &external_delegate_token_master::instruction::Initialize {}.data(), + external_delegate_token_master::accounts::InitializeAccountConstraints { + user_account: user_account.pubkey(), + authority: authority.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + svm, + vec![init_instruction], + &[authority, user_account], + &authority.pubkey(), + ) + .unwrap(); +} + +fn set_ethereum_address( + svm: &mut LiteSVM, + program_id: &Pubkey, + authority: &Keypair, + user_account: &Pubkey, + ethereum_address: [u8; 20], +) { + let set_address_instruction = Instruction::new_with_bytes( + *program_id, + &external_delegate_token_master::instruction::SetEthereumAddress { ethereum_address } + .data(), + external_delegate_token_master::accounts::SetEthereumAddressAccountConstraints { + user_account: *user_account, + authority: authority.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + svm, + vec![set_address_instruction], + &[authority], + &authority.pubkey(), + ) + .unwrap(); +} + +/// Everything a transfer_tokens test needs: a user account linked to the +/// fixed delegate Ethereum key, a funded PDA-owned token account, and a +/// recipient token account. +struct TransferFixture { + svm: LiteSVM, + program_id: Pubkey, + authority: Keypair, + user_account: Pubkey, + user_pda: Pubkey, + mint: Pubkey, + user_pda_token_account: Pubkey, + recipient_token_account: Pubkey, +} + +fn setup_transfer_fixture() -> TransferFixture { + let (mut svm, program_id, authority) = setup(); + let user_account_keypair = Keypair::new(); + initialize_user_account(&mut svm, &program_id, &authority, &user_account_keypair); + + let user_account = user_account_keypair.pubkey(); + set_ethereum_address( + &mut svm, + &program_id, + &authority, + &user_account, + ethereum_address_of(&delegate_secret_key()), + ); + + let (user_pda, _bump) = Pubkey::find_program_address(&[user_account.as_ref()], &program_id); + + let mint = create_token_mint(&mut svm, &authority, MINT_DECIMALS, None).unwrap(); + let user_pda_token_account = + create_associated_token_account(&mut svm, &user_pda, &mint, &authority).unwrap(); + mint_tokens_to_token_account(&mut svm, &mint, &user_pda_token_account, MINT_AMOUNT, &authority) + .unwrap(); + + let recipient = Keypair::new(); + let recipient_token_account = + create_associated_token_account(&mut svm, &recipient.pubkey(), &mint, &authority).unwrap(); + + TransferFixture { + svm, + program_id, + authority, + user_account, + user_pda, + mint, + user_pda_token_account, + recipient_token_account, + } +} + +fn build_transfer_tokens_instruction( + fixture: &TransferFixture, + authority: &Pubkey, + recipient_token_account: &Pubkey, + amount: u64, + signature: [u8; 65], +) -> Instruction { + Instruction::new_with_bytes( + fixture.program_id, + &external_delegate_token_master::instruction::TransferTokens { amount, signature }.data(), + external_delegate_token_master::accounts::TransferTokensAccountConstraints { + user_account: fixture.user_account, + authority: *authority, + mint: fixture.mint, + user_token_account: fixture.user_pda_token_account, + recipient_token_account: *recipient_token_account, + user_pda: fixture.user_pda, + token_program: token_program_id(), + } + .to_account_metas(None), + ) +} + +#[test] +fn test_initialize_user_account() { + let (mut svm, program_id, authority) = setup(); + let user_account = Keypair::new(); + initialize_user_account(&mut svm, &program_id, &authority, &user_account); + + let state = read_user_account(&svm, &user_account.pubkey()); + assert_eq!(state.authority, authority.pubkey().to_bytes()); + assert_eq!(state.ethereum_address, [0u8; 20]); + assert_eq!(state.nonce, 0); +} + +#[test] +fn test_set_ethereum_address() { + let (mut svm, program_id, authority) = setup(); + let user_account = Keypair::new(); + initialize_user_account(&mut svm, &program_id, &authority, &user_account); + + let ethereum_address = ethereum_address_of(&delegate_secret_key()); + set_ethereum_address( + &mut svm, + &program_id, + &authority, + &user_account.pubkey(), + ethereum_address, + ); + + let state = read_user_account(&svm, &user_account.pubkey()); + assert_eq!(state.ethereum_address, ethereum_address); +} + +#[test] +fn test_transfer_tokens_with_valid_signature_moves_tokens_and_increments_nonce() { + let mut fixture = setup_transfer_fixture(); + + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &fixture.recipient_token_account.clone(), + TRANSFER_AMOUNT, + signature, + ); + send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + TRANSFER_AMOUNT + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.user_pda_token_account).unwrap(), + MINT_AMOUNT - TRANSFER_AMOUNT + ); + assert_eq!(read_user_account(&fixture.svm, &fixture.user_account).nonce, 1); +} + +#[test] +fn test_transfer_tokens_replayed_signature_fails() { + let mut fixture = setup_transfer_fixture(); + + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &fixture.recipient_token_account.clone(), + TRANSFER_AMOUNT, + signature, + ); + send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction.clone()], + &[&fixture.authority], + &authority_pubkey, + ) + .unwrap(); + + // Replay the identical instruction. The stored nonce is now 1, so the + // onchain reconstruction differs from the signed message. + fixture.svm.expire_blockhash(); + let replay_result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ); + assert!(replay_result.is_err(), "replayed signature must be rejected"); + + // Exactly one transfer happened. + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + TRANSFER_AMOUNT + ); + assert_eq!(read_user_account(&fixture.svm, &fixture.user_account).nonce, 1); +} + +#[test] +fn test_transfer_tokens_signature_over_different_amount_fails() { + let mut fixture = setup_transfer_fixture(); + + let authorized_amount = TRANSFER_AMOUNT; + let attempted_amount = MINT_AMOUNT; + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + authorized_amount, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &fixture.recipient_token_account.clone(), + attempted_amount, + signature, + ); + let result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ); + assert!( + result.is_err(), + "signature over a different amount must be rejected" + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + 0 + ); + assert_eq!(read_user_account(&fixture.svm, &fixture.user_account).nonce, 0); +} + +#[test] +fn test_transfer_tokens_signature_over_different_recipient_fails() { + let mut fixture = setup_transfer_fixture(); + + // Sign for the legitimate recipient, then try to redirect the transfer + // to an attacker-controlled token account. + let attacker = Keypair::new(); + let attacker_token_account = create_associated_token_account( + &mut fixture.svm, + &attacker.pubkey(), + &fixture.mint, + &fixture.authority, + ) + .unwrap(); + + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let authority_pubkey = fixture.authority.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &authority_pubkey, + &attacker_token_account, + TRANSFER_AMOUNT, + signature, + ); + let result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&fixture.authority], + &authority_pubkey, + ); + assert!( + result.is_err(), + "signature over a different recipient must be rejected" + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &attacker_token_account).unwrap(), + 0 + ); +} + +#[test] +fn test_transfer_tokens_wrong_solana_authority_fails() { + let mut fixture = setup_transfer_fixture(); + + // A correctly signed Ethereum authorization must not bypass the + // Solana-side authority check. + let message = build_transfer_authorization_message( + &fixture.program_id, + &fixture.user_account, + TRANSFER_AMOUNT, + &fixture.recipient_token_account, + 0, + ); + let signature = sign_transfer_authorization(&delegate_secret_key(), &message); + + let mallory = create_wallet(&mut fixture.svm, WALLET_LAMPORTS).unwrap(); + let mallory_pubkey = mallory.pubkey(); + let transfer_instruction = build_transfer_tokens_instruction( + &fixture, + &mallory_pubkey, + &fixture.recipient_token_account.clone(), + TRANSFER_AMOUNT, + signature, + ); + let result = send_transaction_from_instructions( + &mut fixture.svm, + vec![transfer_instruction], + &[&mallory], + &mallory_pubkey, + ); + assert!( + result.is_err(), + "a signer other than user_account.authority must be rejected" + ); + assert_eq!( + get_token_account_balance(&fixture.svm, &fixture.recipient_token_account).unwrap(), + 0 + ); +} + +#[test] +fn test_authority_transfer() { + let fixture = setup_transfer_fixture(); + let mut svm = fixture.svm; + + let authority_transfer_instruction = Instruction::new_with_bytes( + fixture.program_id, + &external_delegate_token_master::instruction::AuthorityTransfer { + amount: TRANSFER_AMOUNT, + } + .data(), + external_delegate_token_master::accounts::AuthorityTransferAccountConstraints { + user_account: fixture.user_account, + authority: fixture.authority.pubkey(), + mint: fixture.mint, + user_token_account: fixture.user_pda_token_account, + recipient_token_account: fixture.recipient_token_account, + user_pda: fixture.user_pda, + token_program: token_program_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![authority_transfer_instruction], + &[&fixture.authority], + &fixture.authority.pubkey(), + ) + .unwrap(); + + assert_eq!( + get_token_account_balance(&svm, &fixture.recipient_token_account).unwrap(), + TRANSFER_AMOUNT + ); + assert_eq!( + get_token_account_balance(&svm, &fixture.user_pda_token_account).unwrap(), + MINT_AMOUNT - TRANSFER_AMOUNT + ); +} diff --git a/tokens/external-delegate-token-master/anchor/README.md b/tokens/external-delegate-token-master/anchor/README.md index 2fb029238..6129da99b 100644 --- a/tokens/external-delegate-token-master/anchor/README.md +++ b/tokens/external-delegate-token-master/anchor/README.md @@ -1,5 +1,11 @@ # External Delegate Token Master (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Authorize token transfers using an external secp256k1 delegate signature. See the [example overview](../README.md) for the signed-message format and nonce semantics shared with the [Quasar variant](../quasar/), and the [repository catalog](../../../README.md). diff --git a/tokens/nft-minter/anchor-v1/Anchor.toml b/tokens/nft-minter/anchor-v1/Anchor.toml new file mode 100644 index 000000000..3d01ae82b --- /dev/null +++ b/tokens/nft-minter/anchor-v1/Anchor.toml @@ -0,0 +1,22 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false +seeds = true + +[programs.localnet] +nft_minter = "52quezNUzc1Ej6Jh6L4bvtxPW8j6TEFHuLVAWiFvdnsc" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# The LiteSVM test loads Metaplex Token Metadata from a local fixture +# (tests/fixtures/mpl_token_metadata.so) instead of cloning it from mainnet, +# which is too slow and unreliable in CI. +test = "cargo test" diff --git a/tokens/nft-minter/anchor-v1/CHANGELOG.md b/tokens/nft-minter/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/nft-minter/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/nft-minter/anchor-v1/Cargo.toml b/tokens/nft-minter/anchor-v1/Cargo.toml new file mode 100644 index 000000000..1c63ae30e --- /dev/null +++ b/tokens/nft-minter/anchor-v1/Cargo.toml @@ -0,0 +1,13 @@ +[workspace] +members = ["programs/*"] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 + diff --git a/tokens/nft-minter/anchor-v1/README.md b/tokens/nft-minter/anchor-v1/README.md new file mode 100644 index 000000000..74ce998a2 --- /dev/null +++ b/tokens/nft-minter/anchor-v1/README.md @@ -0,0 +1,40 @@ +# NFT Minter (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Mint an NFT from inside your program using the Classic Token Program and Metaplex Token Metadata. + +See also: [Nft Minter overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- NFT mint with 0 decimals +- Metadata CPI + +## Setup + +From this directory (`tokens/nft-minter/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/nft-minter/anchor-v1/prepare.mjs b/tokens/nft-minter/anchor-v1/prepare.mjs new file mode 100644 index 000000000..fb6b26225 --- /dev/null +++ b/tokens/nft-minter/anchor-v1/prepare.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/nft-minter/anchor-v1/programs/nft-minter/Cargo.toml b/tokens/nft-minter/anchor-v1/programs/nft-minter/Cargo.toml new file mode 100644 index 000000000..c721aa3d8 --- /dev/null +++ b/tokens/nft-minter/anchor-v1/programs/nft-minter/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "nft-minter" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "nft_minter" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/nft-minter/anchor-v1/programs/nft-minter/Xargo.toml b/tokens/nft-minter/anchor-v1/programs/nft-minter/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/nft-minter/anchor-v1/programs/nft-minter/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/nft-minter/anchor-v1/programs/nft-minter/src/lib.rs b/tokens/nft-minter/anchor-v1/programs/nft-minter/src/lib.rs new file mode 100644 index 000000000..134a07cbb --- /dev/null +++ b/tokens/nft-minter/anchor-v1/programs/nft-minter/src/lib.rs @@ -0,0 +1,146 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + associated_token::AssociatedToken, + metadata::{ + create_master_edition_v3, create_metadata_accounts_v3, + mpl_token_metadata::types::DataV2, CreateMasterEditionV3, CreateMetadataAccountsV3, + Metadata, + }, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, + }, +}; + +declare_id!("52quezNUzc1Ej6Jh6L4bvtxPW8j6TEFHuLVAWiFvdnsc"); + +#[program] +pub mod nft_minter { + use super::*; + + pub fn mint_nft( + context: Context, + nft_name: String, + nft_symbol: String, + nft_uri: String, + ) -> Result<()> { + msg!("Minting Token"); + // Cross Program Invocation (CPI) + // Invoking the mint_to instruction on the token program + mint_to( + CpiContext::new( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.mint_account.to_account_info(), + to: context.accounts.associated_token_account.to_account_info(), + authority: context.accounts.payer.to_account_info(), + }, + ), + 1, + )?; + + msg!("Creating metadata account"); + // Cross Program Invocation (CPI) + // Invoking the create_metadata_account_v3 instruction on the token metadata program + create_metadata_accounts_v3( + CpiContext::new( + context.accounts.token_metadata_program.key(), + CreateMetadataAccountsV3 { + metadata: context.accounts.metadata_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + mint_authority: context.accounts.payer.to_account_info(), + update_authority: context.accounts.payer.to_account_info(), + payer: context.accounts.payer.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + rent: context.accounts.rent.to_account_info(), + }, + ), + DataV2 { + name: nft_name, + symbol: nft_symbol, + uri: nft_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + false, // Is mutable + true, // Update authority is signer + None, // Collection details + )?; + + msg!("Creating master edition account"); + // Cross Program Invocation (CPI) + // Invoking the create_master_edition_v3 instruction on the token metadata program + create_master_edition_v3( + CpiContext::new( + context.accounts.token_metadata_program.key(), + CreateMasterEditionV3 { + edition: context.accounts.edition_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + update_authority: context.accounts.payer.to_account_info(), + mint_authority: context.accounts.payer.to_account_info(), + payer: context.accounts.payer.to_account_info(), + metadata: context.accounts.metadata_account.to_account_info(), + token_program: context.accounts.token_program.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + rent: context.accounts.rent.to_account_info(), + }, + ), + None, // Max Supply + )?; + + msg!("NFT minted successfully."); + + Ok(()) + } +} + +#[derive(Accounts)] +pub struct MintNftAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + /// CHECK: Validate address by deriving pda + #[account( + mut, + seeds = [b"metadata", token_metadata_program.key().as_ref(), mint_account.key().as_ref()], + bump, + seeds::program = token_metadata_program.key(), + )] + pub metadata_account: UncheckedAccount<'info>, + + /// CHECK: Validate address by deriving pda + #[account( + mut, + seeds = [b"metadata", token_metadata_program.key().as_ref(), mint_account.key().as_ref(), b"edition"], + bump, + seeds::program = token_metadata_program.key(), + )] + pub edition_account: UncheckedAccount<'info>, + + // Create new mint account, NFTs have 0 decimals + #[account( + init, + payer = payer, + mint::decimals = 0, + mint::authority = payer.key(), + mint::freeze_authority = payer.key(), + )] + pub mint_account: Account<'info, Mint>, + + // Create associated token account, if needed + // This is the account that will hold the NFT + #[account( + init_if_needed, + payer = payer, + associated_token::mint = mint_account, + associated_token::authority = payer, + )] + pub associated_token_account: Account<'info, TokenAccount>, + + pub token_program: Program<'info, Token>, + pub token_metadata_program: Program<'info, Metadata>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, +} diff --git a/tokens/nft-minter/anchor-v1/programs/nft-minter/tests/test_nft_minter.rs b/tokens/nft-minter/anchor-v1/programs/nft-minter/tests/test_nft_minter.rs new file mode 100644 index 000000000..733c91afe --- /dev/null +++ b/tokens/nft-minter/anchor-v1/programs/nft-minter/tests/test_nft_minter.rs @@ -0,0 +1,145 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_edition_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + metadata_pid.as_ref(), + mint.as_ref(), + b"edition", + ], + &metadata_pid, + ); + pda +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = nft_minter::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/nft_minter.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_mint_nft() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + let edition_account = derive_edition_pda(&mint_keypair.pubkey()); + let associated_token_account = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &nft_minter::instruction::MintNft { + nft_name: "Homer NFT".to_string(), + nft_symbol: "HOMR".to_string(), + nft_uri: "https://example.com/nft.json".to_string(), + } + .data(), + nft_minter::accounts::MintNftAccountConstraints { + payer: payer.pubkey(), + metadata_account, + edition_account, + mint_account: mint_keypair.pubkey(), + associated_token_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the mint account exists (NFT = 0 decimals) + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty()); + + // Verify the metadata account was created + let meta_account = svm + .get_account(&metadata_account) + .expect("Metadata account should exist"); + assert!(!meta_account.data.is_empty()); + + // Verify the edition account was created + let edition = svm + .get_account(&edition_account) + .expect("Edition account should exist"); + assert!(!edition.data.is_empty()); + + // Verify 1 NFT was minted to the associated token account + let balance = get_token_account_balance(&svm, &associated_token_account).unwrap(); + assert_eq!(balance, 1, "Should have exactly 1 NFT"); +} diff --git a/tokens/nft-minter/anchor-v1/tests/fixtures/mpl_token_metadata.so b/tokens/nft-minter/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�uRqv&wKQHtBkj-jl>xKg%M|M^GyRSc{gK=|ruve!)4zlo^)fv#H%@&@dO9>;n4li{_Y=b;{pQKO>rpJcN*NKy zm!FZ8P_yzDUl#SNn)Us88`_i8Q}5sZU-sSwzK*iYAD>A$5D=vxC)5a%(vsFnH5DzT zatR2vRFt5eQV=wUgV0hhIRv4@xRN45trr4nt@W0Zv@~5=jfzqgO>|MJvf6dM)O%Fi zt=G-2x>iN|d%n+Q=AAh+Cuym={{MSE&^OP_^SlzU$|kC>v7|NM1QPt3h29yz7yy6 zv)mtRKSB3&uwDUg9q^ofo8_tfw#6%MJkUpUxbo-tLF;w#UP*Ycj{-F*>w6EKY)89< z4>f5w)>S~Kt9SH>^4G7YjliF5Req`6+dKjEu!&xweTR~r*Wasn1ZQ;Hfp!Cb)=Q~e zhaSj<`S}vWBceai{O>HO-}K>A&y|L`38 zUrF>Ayq}5wEf@b0E)jne@0;soIxz450%{uMhhOwv)r)Q2a-Pt8vH6Wog+)%(F9`f1 zUAMlteNxI1e;0^5@a+EklK(tDF;!hC6_)(xdf%fA)rF8E=Jzk~{)b_BCBV<|e#kI- z55VVpzhW5L2Kd?Ds~M(&48!MmcQB0J4e!tPzR$443nl+d-YHpKc(}fQmUk|{7dQe7zL8cOt?q=y-nacRjvmCs{V7d{T?gul@H7k)3}<&yt2@7oNM z!qKnfFYrFb@X-oCh3^%pE)+*q@}KNI!taG~C4Vk^xT>D7DETLQujBVc%|F}2NzUp* zM6W1+7LS;#3uS?;N^ghLKo5D}pQY?Xd(>bQ{>rs+rbaB?~ExrAF8j?X2$M&M|_{PhAy z=Mtp8>GtCV?%hzYjL$3ccQSv1VI7|@85ekquA463A@J4IVydmZA}Jg$SBZGH%PF^^uM+*3$@Xj~%nw$0--i0+N)RCrY1FIISm z!ZHrXvm-Z7wfde!^@TUJOF7&6g+F@U&uusR8}*YGKf3z(G1Ad`ea~d|Eu@NSSvbdhB;Q{Xz4;j29jwPYa$X2+BJg@2$L{&P2H-aho*O zlLGBNlR)QNEnW$iOC002oAuS=7L^D1@a~JLzUW>yiKF9wphxV&?hmnhexiP$Ti!?g zfW!;a?+4Cf2DpBX{lql<+#Lr)UvCipyW?``jrHeQ{;nT-yIK65OE=ruIw{YMOK!n; z%xdx+dWm?>jpJU6_uKV737_S3r_yzcq;7oB%k38ZiQ+e%k8mGs@( z1^At07X`j;4Swe#*0aj|5!E-jcRgG(DDam1ISrR@5_s#q0$(;D@T2Gt%}#I6vD1r) zZX5T<@yK4OSHE`>F7d>FZjtyP*eY>Kpmc?u+7Gl-!|4}xw{TkNB15NN!TTeZ7k^h= z+7;aca+2i3`X2sr<++LU1?O9rrPhD0f`1uN{^`D(=pIhBd$*j$q!*COBQ&K}-X?Zb zI_xMOhXu7&+`h2w6tzdO%W(c2frnSh`z6NE0aW!y@IwQsD#q z4mB;hKZS0mq9=sEVZHEK@1wBu%C`S6x@Ud_*s?!(2K3vp-wOe+llRc$IrJymc^v7n z+x`jIos$oC;OhO+Dg66^e@lJ2M-pD;rX3#ct)4Z0*Cprh9{xdoUp#C%3*VHBW zM{{+UO;xF}pM@ld$r9MPxw zr*j&|N7JY4))!;l=J{No+Yay({QDBUcb~Jrbo9dbd@l2Okm-o|yhYlvZAAE1wfIl@ z9NojBe2(s6Q9f5WdnTXL@-{yIEAcs~F6NB1UZC}MDs1)4Q`qWhS9tn-dw}IRuI-h0 z2m1Om=l*ewpPx=87rcPWPusOSPY=%*wu;;f-mQ%9@*VAS?a}x?pZP9yN8fdg{Db-% z{XQ+-II{SkmLvd zK>x8n`R+^O@5EyN2ALy&my@y(KYq*QG~&lU6Q1$I4$9H(CpOo)7Bx~c1}`xH2=Zn03Sc|Hz;?{>xilPvwc@?{ym(3lJmQ9 zQI_4fez>ED`bqPPL%TRX+C{}B{PioyFQob6>hotoukz2O%lLE#^Jy-(fcB3`zxFru zgFn6ueoz=~`>fEO<6ZqG<$WemZ2V}{{s*RLe>?H7z^l&LdUQPeZkgE=-4hD?qHdDw zpLIL=IlISao!}v!g`7fhv(bKkyH_n-KJX`Cj){BpZ2etx)5_I{H2 zb23*%^5SyB&Fdw-wx84B23Z%0?pwQsGSV+AP8<1?#A&^beW0GFkzNG0Zd)6Xa;-ni zh||_;KYu0s;K(l4qY~}who3RMGCQMtO!<9u@91#9z)Q3r*s@mO<>F6+t=hh#Ff=?_ z+7mug{6cs>H;?DvQD3FFj32n;M}GbUdG6ZB>4X_7-wR$3=cD_RxV`T9C++vqUK=;K z`tXC>l6rJ3@P@cp=Kt3S2L4s_2z>rl3V#R5!^SUexnCo^%7z)t7u%O)af<6#b|Sy( zAQp?BmS|ztDI~Tull&^=^)m9yu^y`5Yw%r& zO(bWGN7twP++8T=Zr!g^ll?c1#-rxv=0jh$i~LK6&rm-%BJFRxpXm;UWSkq$zgOVl zP0GJ}1m2>0vV4oc2khrW&%9(;CCwiSt)!T?_OD7?&(6>H$6X+p40bgrTtrYT9gqw=IRxcuK6hSVRONIy@jn>S@@I*B zto(v^6Sp7z<)C9XbbgKbgZ9#Y6c4K&w~4;H?U49c^d9*5*}gWEyI=A1HpvhFmzJyB zA46Y1P5#p4Mf;7o9e7S^74_SI3&bCjTO+^uInbTaznPr=jmjx_ZCsDdkGXug$vJ+FsbL)35EKe6Bq{1pE=@UklxnigMQp z?8X~r@1F<0!|ziZI$S+6{P7e$h;y>a{UqU4Ht%BnaruLFBJk&xE8O`fQSd~&P;Oc1 zM*CLMpU5{#Efup!n?R|NtJnv}d^1?+LceYYR z^b2$62Mhe(^vUjBcH>RND>fdp`P(dg=^}okU3*zyHZeWL!#nHrWlu`($d?tDz9}W2 zcOy=8^yS@@5B$7}=tI4?rSJz*@-)7$1D>NN%Tn|V0@nE>ln>8{@^3;uM;|dUk)@A@ ze|@T+ZqTpgy83ANuO$4+X6erj5B1(Lg?@3lj(&|Qy;o6rv3^OvYWvJ+zo7INL(-4Y z_ZkHr?pFPpA@G)!0xzG*aJW?U%I2LrTBtVY2Pg4(M*EWjQGj2pUuZ3j5y_9*PxMQm zNWV@K*v|iC>Dz?r+uP4Y|2n~Rmb722jy%k;Yp=k!^+@n_m6I>-k7sek#lueF)b49H zd6?X6e-z5OfG|ruTSxkllCO&g{fp-bWZ!@uO`;S%u|)h*Kg@>a=TSt0XO!B)v1t`NTyE_y827j}r8`j$c( z&>LA74TdJA-1*{ng5kZ1ddgZ)uyv0-H^0+CjGa--f=oMzPv%R>2>!g1^E(dS=C z)T`x1^-8&My~suNRn|*-Wk07`_3orMs2BCS^{&Laou{eF19k{KqVq`1Pr&%ucMI%0RSVuB8BYx4{ema7^B?ZII`qrd5h8!wC-`XJ zkI1zKL*}o{73NqI)O3%-sy}ZfPVtU-@~Kaj$mknQ=PH<=rXep!~~l57mgk*yl>ktBaq2SHgEMuh#Pm+Z3Pt0?Wnv*DK?4FG9Hve|A$` z77Wc}dQjeTQ|}S)(Ra;+-n*n6cieI2tx0|0aoR2Qc#BhbSXVQ>amzcE@Pb;G@JqI% z$LFqU!na_ilpk&of8(}iFY(FFyT^8<=L$CH`6Cr|XyCYA#M?&AS?!^i>*PlaSy)b&z&Vpf)2mCVq$NKoummscd zVLP(8F4!)5=kf=1Le7in5BE9R9c1hme(X6YSM0XvpTvwY`=N8qYS-dFLjB%ZFuX(T zc}b7F-y-%O>h~PNCx`$;Jy#i?P6|%HQ2nCa<5eD-!};U+$>X)$Wm>MTyGHYqN6PzX zep1>$-F>nyKa5Y0Pw@%%0RF-Mo4+a7WWKNHYaCqR=FmQp#`+nWK9WArf8^io{EO~m zn?f&xA+-lbFBeZ!FZZVO^5O=18TUUq`Z+A^MR>&H!<4?ddfJoF(<3pJ!6x=ww;kz9XxDXh(<=i^*ow9Yq| zU&r6eGJl}{aO~Oo{zZ~PkNUrhd4Jh|NcUKZ{_1*y%a=Xy|3i`w>wLS_j^95U_PK}i zA?`=qSm4vM=+`HOzH(gOrkCQqjAL9ro=qs$zZQ5mCY3uR@qI8Xfg zcO9SQrtyr~$)n-Zi>eb+r)LZheXZs5`_X<50&)WB$ zEZ)`cqek(+-Ya?yk=IUD+^A`hKDP%-qxE>T57hgr7boKg?uSXw@x%MMJ;)~y+<5dN zAt~fb|9J~~@vq1q=_UHSq~Eu( zarKFJ;w{OittU}_p!?af*5x-5zY!nIcqEQHK@V*;rucM|lykI{OY2Mwhsv*DmOO{t zK%vcB2ivrLde3K8z3a8!d8vAz$n~yI)jJ^Yu(T^&sPyF2f5IkE13Ae++_g)duh94f z@g9EY7w|*7w~`!8@8bE3IsD$_ihWRf-kIdr_b6Y%JAv_BJ3N)1#QtoalvCp*o6gXVwaVA76kjK)AG7aMnm!bpj^lD{U$5QYW_;t@1j!^EBq?%#Wjf{A^qWJzkk=_eRoH$d%Z#Z|qXRkH$$$Mmdg-_QhyC zZ~hngeo0$XPZ(Im8C^ZHb%b}m4EnN*%Zc^nD#nlZ@9yUJ@%M)&6dvc4#^(y}7)LZTZ~qMBc&po9gQ60e`d}TF2t|C}(r( zetq;~Ha-lm9g%XblzM6XFv|B<G*)E=ii z2-NuC;=P9O7ObKQ>1W^Har1$Gw|$Q|d^)i#^x|ANe$XqFv|yc-XL@G)%I!SJn3xgi z!6@r}tOsPg^s{v$v#&tHIdAM-e(fEVvi}8hv_ADumr#l)rRJMCLtyJkvm}3@b{hF% z9k156TjT})e~;Q-Pw)9szOHLU^d2MiESUT1MExf!-Qg5;6ubqTuijt$g7t;Y0W#l$ zVLdOrWL)4adaii6#96^sJ%4irTa7A2qu^ah>x5|&!eVKkc=O4U4%5}%%Y%k=4@B`n6dy;z0b~lW-XalHbODH!WY_J%2^g?nK|!PG85>B>I;JGxeaI5lvo!?xTzEE1u8q z%R{!`MCG$Z<+fGjIk=wr6LxF7*hK`=FYJ_nsM0QSDtISqd9Pu)(>WN`hwC||b1(vL zdAY#LHwnD;DuFN4_(1DBka0Hn1pajp|14gnb2(go#l8>-$CD+ zFVMQg-4k3+>Ch(D|NCg348H<%0e*Hbzqju%2GO`c=!oXQ+f;vSzE{8dn$_Or7h^r^ z5iYl4-_0G;xW?A?hGl#jkE3+`Y5BP1yH@xWE`OWQx8&WD&flWt-ot5D{k;?qN8bUc zNqgbv5$Ay~?}EMe$aB+^vDpHTsT`pPBhJ2NA>IGzsMb}>KTf9O9N&+Ha{we6|n(0`Im`%%AGflE3JGh5sn} zU*`4|{jc$evgq$-e_!;!%j46cKS8=p>wEsgd~ZzA-@`k|i~cWoUZCht@(fAQ{|&DX z75%;ZJ>R1L2!Cm_NXvqlVJZ5b;TZtBFW$%eLD4_VCsHZ>vtRLzqkNAG?XRU9Rq*@>zOldPKaOr( z0ep=ABu-oDMi#(remkch;Ps87|4-gY4Bz8Hg^KBbnOPxa9w(f8f_r*OK6XF!Yo5+9LA(XV+=<#dp59xnRtUXbYl+Sw|h%CJ>P#8rx*BV zaC#T-3@G{+`e!lRO*irY{|>K<)3@*!B8&c;`5vC4e=*(YgZCx>JWemA8-D;_;V~+LhXD8aIPq2VZ}czXH1xYUz1hE* z)7SY3U8r3Dg`B?8e-Wp5_$5x?>aXDR9sVVpzRO?9>HB;PsfzxqJ?a)H9r6+J7X7<@ z3Rft-j_(sH`rG}NFx>0Cl+#yvJ)FMZhe;Lv5BgVf`Vsn)E8sP}KZx|pe;LD{@UQ0d z)BZJ_e%8l`tmuEGUdeculg_N^c(&wIQ_Q&N=|#cS8@71zn9Y=`c+PU zLX;xkbUUYuo7QuB zM$;QO?P}V<>3L0Wf9&>CK#WH@$_^7d73%>B^=7PA_k|lhdB2yEwh7>8+fu zYI+-|FK>cxFZ#Vr8#%qc=^dP|ZQ8`?YntB4X@ApZPH$~`7pLo+-p%Qon%=|dK+}6U zeOuG}INj7V$mzSAYMc%>4RN}qX_(WIrY)S_)3lY-(WbjOy|-x_r#qTPIK97VJE!AK z|H$bBP4DM)XVX2LKGgJ2obGD+0H|srdm;Pip=gryb3o=X8GagPcBuK5cLFKYfGrEz~L z{UrB)PMlZpp4m)jypJon?kD}H-QSIJ@T2c@?L%7dPUU=A<&PeE1W@=#->1*T8%*HM z$;BH;;GLL@*Pp;^%f;(W;1zT6dJ=dua`Czoc#p}&>q_7qnv2(&!1HtQ+7oz>G=bq+ z@|cmp`&}-cm%#h)T)fGGE8kz{;!Py*_T=L2O5puC7jHa)_x)VF(FESNa`6TecwfuK z8%W@NB^R$hf%nB+yxs)f=W_9S5_sdec-;xSPv+uvCGb9$i`SXJ`%o@kdjjvCT)Y_x zyluI7UIK3@7jN;N6;wH;}-) zITx=#fp=3bUT*^L)wy^*3B2B1yzT_vnq0iD1m4xTc%2EnaxPwb0`Kx%ycr3+OLFnN z1l|jB@g|#H{d-<6-b4a#SuWnL1m3fA@x~K)XXWCJCh$(r#T!iEJtG%yAc6O^T)h4S z-uzs=-UQysxp+MZy!KqY?gZWwbMd+oc&)j3oe8|7bMe{}ct_^q%}C&3g)Y0F_7Zqa zxprUW(DHpFRf%o}byv_vPXL9k{6L|OM;>}3lNhF`8FJ1!g z!@1>6`mX-{Q!d^_0&gT2Z&w0uI2Ug`f%o2AywL>SJ9F^{6L@dS#T!WA-I0sepTOIY zi`SdLdwnimPXez$7q2^k7v|!1CGc*@#p_JqRdey$6L>Gr#ha19yCxUUOW<9Zi#Mrf zTHr?u-W9oc6A8SPxp=!0crVPw8&BXpKNoK_fp-1YSojURMHdRxVy=0`K@-y!Hg%ak+Ri5_ret z;&}6VAt(`>w5iSoAR;*BTpFuR*w z-e>|3v&GqXg9$v$K4;?%B=9hsosHL@z{Bi#HePQ653}vrcs&U`%-(0?btmxF<>GZE z@UXg&U0!Db533c~cSMY(u`3B2XGcmoN%^KIcS0_nm%y8ui#M5A4|#kp-b4cLak+TA5_qE9nf-JE z?~vT`Mjbrc*MN1L^&N)yKQ+!^eCivKA zf_)Fz*Rb+M`}S4!Ue%JGFRIo)!|OwRZQD34`m;GB=pA>~7b3cxa;Mt2F>is;fPbxh z?*5oCLe3X{XSq&rL6EzjVR-1HX^Xr?*NuEC;J_pjWc`&UME|H_AS|H@Bv|H`j*|BBC}!J>bZ{}?Xs1pi1* zpThfB>h($Z6x*4$U-t>Q?HXV`iT4vxv7}GZK9rl(GuapB=BMpSq-O)dKSzJl=b(&# z_tSo#cpsY38Sg`reM0d*G@--QCzRvr)9+p?{U|(;$urg~tTre2lOn&XS6_ZfyiW=H zlJP5eSp9bNM!$m?oo{aI=k`YDpWD_mY?lY#O`_9aI`?OxOkF_dS<4?Yvu@GJGzA$CIFUjQBRZ{OXm-Ipuf`!8qo ztOee!)>uEElS%jUrcHMxlWvLc4n#lU@q^(BkNw2CvvL~Ib2x?KRp&eeG8TBZANH}!KIux^`?;NE?O!Uo@rF?Z}{E}kw@Gwd_(1Cda_pGU7Utdzpz{3 z^_;>kj^KJ_JkzM&pJdkipw_eh^&-x(^MZ}){YGZJqVEU7XT()@zM)aQ4`$Z8{eav1 zSgO~~HwW9rzRiyWTSOk=(s_hMcw72KPD|Sr7J1q|X2F(~`o2rw_b9wf;Z+KEE8MH_ zN`}KlizV&olyoBn?(_?9gZ9U9R>8Z2^Tm9YdgC}r>W$+hsW-Yu#_px44M_cw9d1%s z+8IRO3lly-FKI|a{lU1@ulvgj-nSXfx>s$I;y#Q&-irIQ_1pvQmqPpy4DFTrI;4H^ zc~lvPTD%HB1pF}14>cGk(lG_D|Bc5`eIvrB^7cJkZ|U$ucszi1A+D&jj?%y2Hz%Zz zA_rF=`P}1>yvKO02XQfFUQdtE&YMH3r>5sF+RhU`)%09O+l36r=Qdu%aAk8Br{M-U z&*jz!`rWwswJ*eYSK3k1`^u^#^4+pV`L@%!fburUS3K--+}?8Sa;djX&x>sry-CFV zf2R7&(q6Q4MB8~KwKLo(^SO53tkR0zsTgMpANy_tHtZT&1HMT4kSFuIL;0OG?xT9a z&l@g^&nYw-C(ihj;IDWA_%q{AsITOU!c=QVGu+p96sJYrr7!zUlk)+4c|pVF<8I|b8x7-$#>+oX|?Qrz)XwpL$|K1e7-Rt=bst@|~7{ae? z7CQ?!2*2F?>2~~aOJW=lnq{juil>{6Q`lOsv^PvEl zACL>q@2?z`xjKGM?QEkzkpGD!uY&hqoWEN8naTMP;8klsRd|wN`d$M6suC7^eVe~o zr)PT~AwH70A%~e1KBy$39ir0e=OOLD}V44^4~-GKZ zYxsqJho5GzrZ05=R-HW1Pd4&1ooi$HWX(H%lk-p3l?(sn@&ob!-)^FQBpy$gKN0^G z`xDVu^LOcT&>r(AAH4$l`5vjiL4Q0*^q~G4=~q?bi;@rPgdW#8e_xx7ck<_LN9)=t z{2S-zCMWkCUvfTeZ(aWPIsA+L^bW=gZ`xUhpXRHz>!Ji-h0Zwc8sT!{xNK0$b^II3 zarwG|_*(C$DVU+3YbVI(`rostAGG)_9*<~0JR)>7%6}QhYeHZ2eG8p$o~mC6^gCOw zUCso(PCGFUg;!(D?O29QbU&1o@9GEq3iR=s z=Odn#eTDA(wB0;2Qx6a|Al{Pxp6*Xozhm|-{wTI@@mGII`+iD-FDseBbZ(H-M(sPF zY_uHN+wt6Qn18YUH*TNwyJ4HPZKfjTvMt|F<^S|MI@ju~wv3K)h<`)~a?^4`P9JTLA+dWiq4hO1t%D`9atJy=aXpw_SD z^(!CNE4-dz#0MCc75J2U<9_3Z341d6&4Rn|R_l0SjgFtHwIQyjuk9F4gPPo165E^H zUlQBfy^1e#itR@F>1s{%#Nvl)?W5Wbv&WAyTphVj>ofW8WIkHlwpzchyGHMGsn&$P zzP8PpPu6LsV}Cy-{~6m64^N4Y8<`&oIi=#N*Jj!uPT7;ZEDotL$Z_OU_V@7G>BS%T z4p2<5$?sHcx5UMC52WhJ|JffTP^}%f{e6h!G9CNFxP|zB_c2_WK))MlFw;&c z%})Vr7}s4xF~a|s`@1lqzg^6a0*_J~^JV$}`K`pb?ga@xl9JMIsyNg3jfESep9(ii z|3vFrthaRkBKwhq-%IsRJbyy6uz7{&v3<geZNP`S*-6LR=7vu z358cF{%(a=D!fbKWs3ih!rcn*RCul8Z&A2c-w!IhN#S=Z+|Tfu*3AkJFx=PrPK5^* z-lXt)hQroghQr%B_4znIue6?`@QCJnio&A`&sTVt!cSIskHW_(Ji&0-dX&Pu8Mf~a z(7tko`8C=14Cx;?2))ypN5aX;*pL6ipU_{1(KyxO{5`B!@jmrQg>9U@S794R3IF4M zK=_~V%c*_bNk}){wjs7o|O#8^(Dff_Ee53-?2RzE3%0xxMOdrax~^@Kxp6cJTFQzEe-EKiz*d{rQ+v|KC!79-wmw zvD{@pXTf_K>yO3xQ^#xVb$W_^$?d1o{fW3(`s#kQyT{)`~k%Q z!O%F@>&640;c{29UD19{&Tspi>^spxtykao==-$_OB@i7-+T4_dVRlEVezB(z14WX zM7O>dKN_~JRCtx{}Z-#>3i`{^j%p%a*{QFDl<4u1deSFpbPxTQhnWv9q5`LkdRQ=hc>0eeKgYBY!1@9HC zmyPx>j+0&@o<8e&7-x^O{@HhQ%-*WQdaiNF?fkyjd^X!*vH4`#ztG&l`xol>BkW>) zlp}oF%`nY#bL!g1B++5#JFQ+jUs%5%VQ*dj+d2Pa-SfP2jz6V!#DjUxan7Z(9|7@b z{eFa#nP0|-0^b^)oY#XK-2DmH&_;ZdN4yVaC$}%&$I8V<>!k%=eM5XB>o=7)Syw3Q zxzvi@FHZi2%dzud@xGt|e!g1ofwy%8(2e zy_CO5&Jzd2Qf|2DiTr-`@Fsr0X3=bh!w&5JkNIZvap>>xE6o$>dB z=OQ=BuT|5Uq}Uf@_Vl$2U3)r%5lpYEgKAGl=s98i?sm~rd!pODLC4?Hp4{`quAS!D z)6ECjo<6a%kv$3HV|&7>mB#iIkSdgi#J?5kt}m!oq}TdA@nDPTx2}J#n91daOJ%%M zStRoc6+Jg#c3$9BM#OoI?bGzy^v3j|EN0*pn_IZPBJIzG-nsK3c!PcaNa3$9 zk-kzUg^A+@okxt~g%eeuBwpxSB#Ie! z$oyiZRr>A9ZHyN6&-HPG`0XOyaSJ{KvybNt;X+A+*jfJ z7bnE$FAn4S!6($%=={acFQI-w?aJg8UMul^blyVc+IOw&({c5r9rNZyHrkza-lFBX z(C2m;mkh~xw(h(Ixhu51c&NlNr9&nDa_ixJ9D4o({nI@p>R_ak^`flj8%u}J<8p$# zg?_Xj5m-gnE8_ESSJ2bAf1~*aE(h^Y@_a)VKQ}v}c?gDGy2NjEM|ddL_T`|wsm?b% zEoWS@8}a%ON|SyW?MJ&`!v0|o*GKanoW}d`7b~oONB85U%Q3w`dGAcfU-G%_8%(Vi zE+#sl|Lch^z&)4v>rV|=g+FTPduJKl=bm)?HNk< zcQ`HA7Ah=!qVLr+O#981F3}^}7tiqOn&`!vwo!RMBJycO&u{5|oR}Wz#{*r*$G8mo z91M$oS7r||BSRSmCHA*W5MLpmt_$LGhSlvtf1~<;;?!?;6ps&uexsw(q4n!HrQrQ1 z^P{SKqVqt)|7|L7a!Z{ld4o<{XM&xSVoL;K|%=hBxdA?@9db8Bl^Pp!Wk<@|AfIij%H zm9*dOFTo$Tzx>FGta!R!KatP;4CMPpzNbpckNv6C4}VIk@8#Y%X6M=*Ke`s>4~bkc zZXX3)6&QYP9{q`W*VC0m=JzmvM2|e9%f)*g;pLxC`xWykOMhW6sOJ{eAF;oZ|70cv ze8VpuugUlx?ZvOyJYUm!4gFu*ULMUnuIuL>%{XnrLH2*EGWDv3`Q!SrEIl!Q5b2TH zf2BkG$aMU`2*q8H;{_~7iC;?oT`WP9S9N4N$1!~yj(ddV*K!WOFSZ=XH=Pw*Ud;X* zFsYzdYNGZmTTm@iY>G0OTPkRCb>v3MsRq40;j9ICvm#kJCW0Cy>?D7@Mm#)wSN+)tL3|j zE!TQ;7`~2XUQte;d{?pMdJitS*z#(&(_+g%c(9ma%SApcqS$h~haED-mN$Fw#Ko4k zdJ8yxmwZ>Tr6%81Y}qE?RcslN?<%%D-^WZzvE?h?shr*;-&Jh6SH7#*@@a1oKOgf> z< zxA8dTNyJ&912Z25?=tqRuvg416ugJHZ{s->Cfm_+4Cn$^QT_yi#?1u~dRaA;6YMh}x-owd=i8_G7Dn}Va{bp#S)SK9et3z-e8l(3tsQYW z@8x{p<1^_m(}VK%dssgT-uEK^0KZ@GmNR}MKF>it+g1M#zl;4H%13`e=SDd{U~szzp5+k?i9W+0C;YFDqYB>Zqk7Pw0{3>}*AQpWKC9?GBAxEd8HL_in;)(h9pUTlaX=ierP4@$Hd5!et57dsb&Lfum zEhIzGD|ViBe{0&0ui<(HzeL|LheAxJ-j^l(<|7>E2iwHn>3-5F_48X4{~4V{|4ha= zdx4&_zd)x=Kbr@!@s8DF_UG~^9arN1JLqL6l><4~NX{02jorz`d)U9(PJiC0Y0+Q3 z4+Od8LchcLB4<~RP@h}=+o^oek2s(9QPIC759Q1L(A!PaI0*EeUpn0YPmSKl8Uy)T^>y>kzk-WMvp=*g_V zIuL#6RQ_HtEqagMZ+fl#GnL+jOfN96U-T%{M|VvI-aN7GmP zY#-%IXUbC>hge)<_H1@Z_mr_;Pur1e@8(bXsYvMiaa4a$JA>!ZXx}0C13~RPg{6NB zqWcY`|0~yC#P4bSL-8+HeChAXwX5{K^mjpRmA;q$Er|AKOaBLda}?1tRr{@fp?lxB zUfO@e$bmziytt{Mp7+ONsH%4K2*ig7*{A zZyhJq`y;VaS8mWZS8i!Ozdpg|an*x^>yMxpv#14A`>XqL=-y8mCV41tfbupf?_V31C+ny#eeG0tqw*eXSl%A)H_YE-9j%-Gx9=5U ze^t7@pQ7@@BPQzd^>aR1C(FwBG0rFJkuLqCQ_%lG&L{f??EaI(4x{ll@=@%8Usio1 zS?yMQ=ofzXVX#QQU|8BylFw*H>)q%N`27~4yClb+xU{S8c@IBd%+JG(&{D!%(Jrak$+Z2M*kR<)GVBNQ=WEB zwHL=eS#R3LbM5mZoKNk=p&xqKh#&WGKGAzOE@1m?U}syi+MTkqsp5hAgzfZw8KK+y zfBVh~_Ko8g==rEpfs~$pW4Cfb&((hIIfPHYF;&3BC@x{UTA}vlJZHOF(Nl-dcC}(< z-E;1*R&>`rpQI<@3bi+<{2qSZMgLNNO#NynrBVE_RO}?IiyuT^;`l-I(c*_trt$0J zh73Ey`o8ITem`|7$n*B6pSn6r?hWh*{Ar|rmp3dg&wfN-v+U;utk3Ef9Q$ECXkd5G z<$U%16zr}M{pWE$wL7PuV!LZ#KWApOJ7qs{T&;Q@#nsaOgV9e(|I!0BNW|N02O0ei z+rfUs&jVEMU%lU%%gsrQTW8Rt*dE0G>ieC`Iinj#x0B0hB>zLQ$;a|&5TE^;^QqpimG&df+BJp#{(|$V-aF#}Y$0yc|NeyX89$?b^iHYQ z#s|T$v?GqMq}`^sk$!Jc{f^=+(eGf3&}IEX6lYzp?W6ty@nE>LpC61l&(VK{ON9~c z^F&uHTQ-#f>}lW&sqiT-5edkg1NJ8|fTJR8~h?VL~T#PRdck4EE> z{;YPZUH`@H_n8Gc**x$32Z-%jny^4sI!?^4xE2Y-N{t6pwA_=TfcRuG+{d4qaoa$?&M`v+9)jvm% zCXr9|BCEdBphx7R@H6|2{I2O!G|wjOF~4bXcpOg)-4;(<{9PAM-y-$7@ignp3gxpC z@3OwE5c#|KJyb+AU$(KG3$*w)T-qWqHlNYY?xl?Ulc=A`2o{^H1C4l zf-(OgN0GnqJBzPJy7IrBvwN5qh5Q@Iqu|Q_4VsVQ{Bh({{mZKF&t0_cvQF`dKIWUw zqr1tU)62bIAMkz^Xl*i_<4KX^B#Uav+j8(KcB(R zLtU4gj(%WBYjVt=-<~b?iC8$^7^f$V^y5y_kMIcf>rPw?J~Xn=4bUsn0sM@vNdMKY zr!&6|{mq)MX1*>`e%H-Qw{yMjd^Pjc=Hcu+VI7P{{-K5ci0n_-4czt3U3&hijaW$g zCT0Fo*C|R((ok!!eOJf&i%{dqV0bs@3l~X!=3i|7!uSztyQb?OTsn6vov)(v$aWu8 zFr@K+lS~AGPBL3M2RF*?HvKAiXD}QLtN&WkE%eS`CaIo-PuFL5fc3|o1FCm^s@_#v zZ;#fylG8@@UVK3Hiv7jy?bmwOYQ4Qv*83kcPrkY)axL*!-RL_bBlq9Os zpT5ZV3rN1AkJS+9mB=YiK5qMaRnBimKj_r6QlH3x}$o@Bv^E&!;%J~6J*x7mZ zc>liG8{KEm<&?L7cS?GGKK{<(l%fb)4b2 zedEG6TTh-Za#^kGtZSC+lK0z$&NYjE!1=?DZ%W$w6)mre@o1fc=?-ek6!s*)-bZ2I zW2O7p_5BQe-=pwMg;y!uu5hoy^AujIaHqok3NKc8lfsiq&w#>v6kf0J1jFT;=wGE( zI!@Zh&+jXGuXtehLATzl?H!T)trFPNeGm+R4YOPvo?GF8-YqZ>8l~^!ExK zksSYL+H(AZ({Gpf)H(5WWa@sphx9L&qwuGo`Z%3<;irjyUif7FAM^nGxbyCdi1eWC z-?*KT9_ac)tOw#>qkT;C#~DBFcXl#t^Ym*L&7oQ`o;+UC)?+#C+X$%j?T%`OEw`Iv0d>4q%}E$5Z|F<%rzJRPQ2xlJb`a(%%2P zi0r3D_}i#`f1-J;g4$Vx*PtB_Q@Q2`4<^08IFsZv4SFZ{linXvxpnk5@XzBK|6*M% zzMttiEZF?}nV!lX2>WdRUhZdlC-pxE^M0nUJx}IK(399c;P`%~)0ls5KL|d%)rWa-v&%0f@n0N3D~3szZAJ?JTXA z=%K2~YJbW6s@8tTX*XYl-_{9?{<|ITuM`;k+C}`reD5qgS3LLqAIN?S zp4_XI?gx1oPJpUoIuO9t~f%O~IFc zarx4~pJ6-=J{?Xj%;Jp_--d(u&&KuBj003}>|Xq;j_c{WA*@fqh{U0;9j3?g=O^Nx z`nbg>QRKz1(}|0o$@aIK>52WwuNkiD__{o#@rK@iRMvf;6@1)@epU4|eI4x#2YPR} z&1(ij5*OKeN?+?qjA#DH;@iHB&@PIHZW9Mm@cy0Y$kO9GmuBlRRLa%MHxXW1k1cMo z^)46xHZJ!MT<_}YGNxxuo51e)_Yd%6Wq!@$Usy8q=J#iiUtYVCUzA!7O-_GX@P5wq0{_As{ObunxUnZHm;a!DD2unCN{*X;;DP)l_th3W(X+};j|e}9 z7>(}_pkqymb|CUZJ0_?dbIDIZQWg&s5BsL%Unlw9cD$a-K|J(*q$ED%D|%x81yADF zEIGb#nsR*pe#&u~BS%->kf=-dNSDyvjprGD?QPG=@@sN0r^TVxuVl6FVxq(RVu^3- zitB;?rS4t~*xRuMkQ1HY(WQ985q_t{SVl8)03M309_{xRLs-dL~24>i*3Q`z4h z!*n;&=cf{0N$<5z>#eKjq*knZC~(1Xq-gZpAANoUwWp|7VScCReT~a3@To!1i}W4F zM8D!;s<#>XeryAMH@?|?aQd8z>+dJ19N60;lADc3?OaUBS;qlAw$5C?jwA6&xJ2WT z`Gedpo8M2@XK@|soqIs_+B%NaD{*KzU;Vt!TQ{nA<^k0U4WYP8_sNAzq~8kXi=6EI zSfhGBK=y9mOR;&R)gwO=zgFYoc^wCGarty7-Q#ESiPv%Va6ZJT_@(9J(y>$Jd^zd6 z`+QWNUz&QpNuRHv=Vtfux=k0?8{Jo`_ie}DsqNPHrUxq(R{dz}QFxToux*vXCcj>V zRjzGo1>Pp@we?2(j=imu+WL{*uSnlH<9u$v*$uvyg-wVq7;|lVdT2JI>uM<3k-Owc9{Z9(7lb)O0c|U~W z{TJb_UMukc`Z-YQmd~)3k8(eH{=R+I4wGLaKVWeu@)>`#)^pK6*WVMJUe6VIhVw^d)Q)J#zIuUGF;%s9y5}R_`X!llcRZwyhVvbL=@? z?*jG%yBRO`15>Z(&R{mX!R5dYWXZ>EzpWR32mPxwm7_o{{6X zuco5S&(VEcLf24}q{DxZc5L}?PQ#6_l6tpF`zkABeJt22?GIOM()YrjaK#|Ql^X^) zood~$;Ju6M&5FajY50{j?*V&t#{=JeR^#y^B3~E(3|dzxc{)CH;_{PIc&9O*%*&wv zI3Mpb#v4y3Jc}QrahI?6MN_|mU$hRC>i5$2fqv*AYPYS^m;7gP{^_i@JpF9fFZf!o z>=&KRyuuI9i|0?`c?EEV`uWXkSx%-aZ0$kH$~Th?ca#$68oJFU7t+Q1uaYZ;c2Z;wMu*v@v#+JhIvZmqpnBA@$*h@ zZ*|LFPWzVc;?(?7-_ol%f4Jy!NjqM|X?aNGQ|S;o%R?eR`_5W0B=QP7WIZbwTF>R$ zI#+c_Ca33{VDIyYk}P}w2(5FOofo{{ zOa0TZ>x&b1E$hhBvFleR^vvw~Xy#LFj|XXfa~k&eO7b%n@5b~06U+z1AC2_h^faEI zBu3LOo}WB~;dnk0wwm9zD|=wG-Iw?0FEAgy@)HSCae&;qTB;CYsQ+{*ev|IiQe zM$I-pu<-=OJ15d}_~jdy)cg5Ivrl4|#$k_Ry%0Mt`6q!KT3?rW4x9G~+x~;wVdp&T z+>qU8;PxYv==X=Y7+x1bJyCn8k=CB|q{mgA?=JbaF7#hqPsx`J40hjg@$h3gUtK-U z_~}ZgJevoz@vf~SyZJ%aQFjWR)gh_3Zjw}PAT`kk#OHJV>s#d;@tA6%#7 zqN)T6V-+rr^=+N&+flEK~x%zthvk}jVoyYx@*m<5Gv3=2h ziSIR1lcM{g;_o}FpBk2UsS=$((D-YS`kUba;n$)Qx!u*_O$<->dyQ%P0bjpKE@(RO z(LBcvBE468fuDdR-0>A{S&GJ2u&-r!pJ885r2aIHqh$SlI`eJw*njQj_Lul;A@E;1 zuUKRDWbW%fpY=iV#p4_8Z=-eMzux#^E%C|5c`-dC82Xu?HTy8X8r#oa(TB*sB>uAb zU5g8|))Uh6No&|Y8DHwhG0@w*{x)83w)kK5S=Wzkd=ba{;xOa!far5PUQm6H)}w9w zAa)ye=)9?}XNNj|=+p5-P*Xc;wQ@53D({U`(k*2#5U5hg5 z5`D9E&4Q=FX9cj{WFL)TuKf7~CsX6z4LqGr+hg4<7^pM?K=AMwxj3E6ydc|`f| z_z~c{{mPe#pJtD7zasoWze4}fx{?Uc*8NOhg6+!32Ic>h*V&{WF8aUOhw|ck4m4iU zd-B4KkT&8}PGWs&(0dxU-2SQk=m)s{k}qz*_@AlUFL+`NhDozDEs?dN9AXZ?)xn}0me^FDR+MSA|o=D8ZR@A^!-WZV(a)k>We{o;9{ zE{5y+h17YO{Qc`M<@{mCC6cyY#A$rKq+Mb4lPxtFNanNWA?{nneN;d!C;C(2CH_mwRJ|cJDQT4hH6E^ibO=PU} zYqT%pkBd>Cu8TYMeT4G4eEA>7`<~cA^VP`+Ego9{m8KnacL=**$xX7&fNzr9?YzCY;5p#vo}qT|FIItG~^?@@l3 zKR7g+m&)reid3H2Yr%Uv=QlfVM91Smhw7>82L_4$dOxs%%ZpIc74|NSHFBQJSBuET@fxaGBQdEc+Yn@Hiko$>U1r^*lfh2FX4VSju{_i>i1 z)7Pi3pXTb5#0}HYr!P}Jex|2IU(TV#`Xqj!(Y%z+^PWp`vH8Z5-znv4 z`SCpOHs)io`I-E_*nBeEQL*`HJZ^+tWXpm*q8W+R!U5|GDcN>ihv(6cf zVEj9z^-wTk?foV7M+bABcODHL&`$VSn~#a-d&$V?=Z>q=^S$38{>SI5Bwn_48jMT1 zT#XNGox#4}hI$Ew;t2dJbb#M>9?SNL8eKM?Px~30PwH!%{<_3BND-mO?1$8DTs^&r z>?NviE|cet&6M;$>Gr+8Yjf(;^01DH_P}3#XA$Y?I@Bg{9a89B!jC)adY6;^6!_~G z8U2TYcM0L)905FR)W19L|Bc4=7GI4i-D5qd-PtFv^09OD2g1+KQu|7LimfqUasIKs zKLMABevK>Z_%6$$b$STCewOC5WBZr+M>}WN*QR#w&*t*;?A+DwgK5u?W<96(Alv!- zmu9W!$hg66f7-t1()^$CH=cLe$^JBNJ;&r1t>?6gUntka&sTImNxUC=gv$$tWd13f zKg#fG{qDz_B|GH(7O8j5B9UjXYu=Ro!j)Vs z+wY%Azs-)Ueb&FBzaM^&?bw zogZ=N{tu#iI`aoVV*Ay3cqfiPO)kCAn3DGcmIwSN_vab@^HrI4F7h=yFL>YJa>hiQ zUioOW%JVLvHsJ;I3odKHG2$N}SHQV`ej&Z2pX+y@M(v8^)xeLOp7101dZYA5NYily z=)$kqe7dF!G@f`W_hg7G$o13vPVQfd%?sH-7n`5X^#48ip&xMnF7{{pUILwejMv4) zer??>9k)Pk#}Yr_uiG;H&@s$MH*SE$)9YXIl_=2*yf?juJRlOg=K?VJZ~Gnq!=7a{ zDf!V~+WrZ=hrXG=sOb64NN+mmCH<^_L_2;?6->u(e2@0+H}V_vQ0|pnJoD$bUFb(; zpDe-+v;#lzF9=|5V(%0lvh4s~@B~>u3D$N2^eUSl5xW{E~+1K2jlC0yh6sfrkn8H_I>Dd)FYx%pW#35A-wuH zLC;kZ|M83VAt39lL?`6cO$t!fecLwwRUVP?jNAVK-(7cl#o1WTkbWob|75?NOs_l9Jw_~tN?V1~a_tKW_i$?atHS79(gZ&b+qyZe>VBcVwv~dvUFvN_?*QMw zVD$cs*RjI3nOdLZ58K)qZdA@(@`o|MPGtrMHOUulZsGjlh8diK52OmweG10cXdhe4 zGdMr|K#Bgc?=~%12P+nPXyZQM%dA?5SxrWGUr$2AhwCGFV@8(PE$;$}e{8!1>bsLpeP?LIt zA*l!Lf!(7$6|yZ`UvtavhaNiiyNO`nf0+C+?2bU{*X16YK6yiUEkzG^fe|#c8zTyKu zO1?b%a_L#6d>JRdS@5iV_4R_E;NK@1PtGq{J>?;>&q{~TT^{OTx~(4whPs6x8gEvI z#2))PW(&PT%k;g(p~28vg_r63UWL097QTjhpRS$T3vcU|_hx7M9k-w+_G|lX?fgjC zD)DYmo5AH<|5fl_#c+C@jP^f<`lGCVtDS0g{q!Sbfa!h<{u+9l<*%{6RqwAwui|)b z`uAUb`mA^z`EPlz#2EEM=BH!-Kf(Nkev--2z61IPsjjD5+%TQ>@{c6SM`^IvUvv5O z`?hVLkLb7U^NIIupUC;+dnTk~40K{MdQb`9-01N+{F5HC0ED(@atzch=254DdJ}`XXX)dE|{tD&y8JNP-VmP z@yQmd34WOGaUi=miQxDi2VD;q_Gj*gLB9igJd^qY+mBZA zMSj!SS9h6XAFVmt9Q9+&wAyT7Hbf4YsuMfwh{f!~kqiqwnj z%Jh<7NB25dd}R33Ik)>*va^`aa=%e@?s0P$>r%Ku{5a@@C0hJZ9+v$%wtu+TOq*lz zo{-j3I`(u1y|KlTE?9`%64&tinmmWT_mbSLT(d{$!6`h>(tbnlPm0dt==s!e^C;8l z_J4b*JUf@}KK~X!mwwFR`1-g;ziZ&o2fcLTU)&fP-|y4K4GFY=EYFg_tYY{5&60Lj zY=7jC^mBne5A9yxS!6i$v+-himiVDc+k@Ob^P9ntwAc2-Tyc!(iQCRWq8I%8D)^`P zb4ht%kG5~-D6Ky_|Dtq9=UE{6I!pPjFX&xzSNodJGt@kqFF8PgTE zc1e1hC}yPZQC!h2Z#T8-?aa?hS(4TQ1lgZ)rXCn@~h4HfDk3Z7*B&*+O zCraIZV}Sf}y5B(j0a021;o@%~{DT>PeBex1?`2{t_Nxc!+*bx4)Asl8G{0~5mluCL zntQFjohTn#8^<5P zD*a8d`N=G=V)J~C6aJp&L(k-ReTVo>>*pTDeCXO|(;UDJ!nb(cRpTa|cd~It{d_29 zF-7medROnEs^+(C92@CX#(d^5$u-L_qo;QL?CB);EWb=$aHd~AmGGzSmyNEOR2cox zufLDz+MoLl)AXJ~^`n1g`qoLgZhPj@`?`A|o%#{4J(~JYo}&I)Zv73$3s{!~Ki*7f zynkNers?dTM?VtppBF>5`SR)PkN6_u%cX;ae&&zzb#lz(} zBB$aZ>faAh|4x-auOmGt7%d6rK+0fkpGR;-~*BW-3j^azx=;W?Y48vaU3G^JCHv#F;D*0nw~Sx zJwKuMg3K2F)%UY9FNk_Ud6Di1gdP;>`!dkGqTj+JNaTZNnqC72zPk>DeC|3B@<;ka zFQIY!6ED2^yo`SH@30-WKYf4Vp8vh_s8Ty3J8!Vw8?ruI{33D5)bWc6T|Wn%E}zj;y6fqn+x4S}NL@dQcDQ~N?Q!{zcI}TJ z{mnwhZvRg%#66Mo-&!sY{-0dfKL5Ab%WI!a`oUV_?Bo1DyZK*ZH&>9|)XAqoJhGbh z;n+UQk}q+_)bYs0++OT!=eW3ek;WsZX*{x6aepuUd)(hk{~q`E;;$r5NBPo^#Br7M@Ay~x8R_4VOJM2W zQH#LRzk@1)QL@|LBYw$?voLRQ?RVq;9q=nt@GDYqUkZNQ^4QM>(rlg|dJQqs;{8C_ z7tKRmLhnFv$)CaY5#TZj`USE~>IGGq7k)E6BNlmMH{dO;>k>0*nq^djIQ@v%BE_m(d#qAk;raTX3 zYyHhi&upnTTqvo%4;KnvAnHi-Ad=tejo0C1-0t32wwLIGUH|$)(Fx>4JDx)6Oj5pG zhsvBJo`dcOE|iqA?aP`^`3yZz&l6^?+dN2eMR{D#T$E1y$ncX`7qRtM&;`e4^F_#i z+xax_vq9PwuM1DgdR1+=&e!hY)ZJHw^;4q@Kmyr5^0q9r2!UffK`j==K;)M5!K1k(+dOtMy42=)xb2bm(OP_S~ zAe=Av>4t4Hgs(L%hsxhU?X&xMtsk@de4%HXzACzk9Ja3*&)W}+_00Ac1pJrYI@(V)mxMMfTMbA zySTon-r7!u>+9{}dgVKuS@nWq@Z;O4x14HkIn~~Bs=ej>_F{jYeK)sJz28K=cc$vS zGga@Mse12B)w^9_tiMAa()HQ**HiSRbn;XNjWcQxUS-9`V<&n@rJ6yADz zZ~n@~^HX^L2)tWRTC%)HE+=|M#6KDz(4Ka}v;8Y57hVJHF3}zxSB@;_A$mzae7^vG z&*TdHr#k#axr+(U=$%RBE=&27BM2XU>X5gDyHVzMe!BP4aHhx~&mVKyOYM7Z0Ifc zOC}oa^9@_2ffhg8I+2|#jr&{i@9BN^V=JWmaJlSP8Ixl<(Rq#74p%XKL1c$L3Y#6S zR9MT?efX{&_Cqfmz3B$LPVmvLBVqrM|J3>-|Ecvw{!{BKr|NV3&0to2ijVsKOff_3 zH${#?mOz@l<_~m-$W9H%ax`{omoW(jN5h?bL*5|G0i9#rEZe z8@fd=(tJ}t1v{nxykLvS5A}Rwu@eW+5&obb|Ljg^j{MBNt49lrbs+q(FN8?qc;%xh zd>OZ(HhF*Edz0l+)!x`S{F?p7sof48v*kI*pY&&3FDW+t4(2|TbBTugxYW4*K!$%b zevx)wL;OI^V+#cl{J{f+XZv@Ir~TPSkeU_~9t!cc^@@ za>iy!J<)zgVI$Y~v=>Ufq%Ql6p0O7wzJqt9gZI~<>v*TWMs)q2Xa(Oue@vI~If(cr zsmA^XQZukfPmkfm3$}|NKe@?g{RJNDaZTQ% z+(F7`<$&IcseQH&l;RquJG@Ke6W${EfRCEOCA;MP{GF1vjdSYyaf~O;Z@clrJj##y zCSOeSI`oVKU+cm9t>B-YQ;GX4txwMZ#Qm4hXYvV-r2^=;V2-5VGt=$#t36J9VeugP zTki|8zp{HHA~|V4ZsRGJ{#~H|>0B+h?*?bwZTcGsIo?t2f@k!m$M-?he`$ZSS~8v} z(^=lwCdq#q@#rM_)8bK=f8XvT{#_^e=92t@7gR-_wqMuoUmSa@ln1_lisTYhC7*rA zHat$?h%VJvH=Zj|(NTL^r978Elf)mCzjGPns{Q7Ww9oFLsEa$a9Ox@3NB&Px{~yUy z-&?(AufZ`I?`Xeea-{LJ=xI&pL%BxR*GP5;qnyKCK8QKTaneHJqv=ne^GP-i544}L zecQSAbgs}3dz`0yxefL-tnH%bY)@5zEv_EBRbcS(c`lugSG-x8sveuY1OM`_m_KQK zb@kx67h!$}(jt1woUq(38d^y#6XAnqca-zU`0OOX4SJ@#Zj-wM}2#%Bv;{-K_d?y81ZpjbYevalhOuy*LvHX1p;=;dC^xyZD z)$#pEfG+Y=efD*5KTnjVe-K?PzC#l9Nb|n|{t^Ekz!m<)>%*ugJW_nWh_Y$9ZArOC z@SXh!sqr3%*n&Qw1DYx9I_-E5(znF3KE=zie^w7srVvk{V)WxV5v}7Bzpo(P3BMmg z_f!0?f)1*j=-D6RxzY*mPYwPLOuorChU@}=l9zB(Ef0@(@%!lveKjvQ4P!p>&abiL z%4qndb?gUZn1%=CK>M@vD?=~BP6>}uKYm=yf91z+1n?fz-x5#aw+->WbGz}^<%|vV zo$Kc;PF9bY_MJP|>a77@SK!yH@Z5&y;Q8Jk`9I_j*j*W44jBk(IlgxpUyf99yeZ1m zKWf~o@H~d+Ae9w?{UJ$frZvRFk_&&Wh7)TH>KEY{-gs_9`rvc%13~z*KL-#`;Sl4R zy(R2~XXpM9&XEKT>2LIypndj(6nq5v><`vq*-hJDb!?2E6zd=@=DM77{M5S0BaV*A z{bmT>WXJiwOGsUO!{uswRPu{_{4V6J*VDVMiu_n#ko?ha8~&rV-$p#f znxArg1iB~kWj?Pi?mzS9tpDU#e(Q46nZD+^fDAY{I~?+f3F$a+5by|}?==d4HP&g0 z^_K3X22b~#@qQ~*vG(|6{a*(INPmW6+_}-mo&4;hR$u-!?F;?QynCU;y>+oa?^Z# zH}#vJg}OES8Y}pBV_ScAP4_hb!pHlXV|;S`oODm&Z)JQhbJ6d6{Fx00o!{+o(r*s+ zD$c9v`(fE|o4zjx9;5^5SF8AaL(=cQbKQRHo)wnE@P1-+(BW?cEy>5Oi#?uQ9nbUq z*>|kn z5z77^>m4lBTh4kkb_m&2uUDMAOYGW_q@MWFHQ@D9zU=74m(UC1`4tc_8`|l5*V^Iz zyxrksdtC3cy>0$11A!#(>Q5H;8?Zme6TArjLi8u!>HWyp2Yx{}-J2jeX8FHD5q)P* z?^nrxa<1>(cRGII?-cx=A8=zF=Q=X=DZBKzm9N(x@%~+U#GhAt`O9DTu*KA^e`~toY zvz3kTXIQQ){GaTa16ICo%JufFRs6oXadrnhA$=sz=Vd;YOve6v6BT8D#82u6^+5L{ zcapzt37;i@()+n#XHq$|_hPaS_j>T$Mb;~A8S?GR6(ZucQDUaNf5 z@Zxx7dfi-T0J43{EnW7!n7_0fKH+Xceesd>`13yYKlC=}yAk%&^ym(+H#hV*8`B0Lypho_qai3`@~=Aw0D~l`5->CR=52$&4)C;q~ly8X`l2V zK6;N*+(+1Q{MjzY8^V7D_@B!6;YjB|D1WkOcZ1g_o=X!vwJ%%#81q*r`D|zL%A_9` zIvm*-!QTkHNN4hca>#ls{x9r($VpDe3ZcL&_>*n4P7>cAf)RC_r9*yVojac$_BZg(XCHI>h4#r$*;Rdy zigAM<_{e|K`x?z>wN72D_`N0hbq-hi%47#eLm$*n?KhO4GWve+ch?$!&J8~1tBx9; z`2$DndHGT|AjLfEN-r;c(s)cdd~z-I$Ls5TT(OQH>!4ltdwtRQ@+`)!mecF=tE;@ahV=(|c#F3us>h>GtcL=+{@?E|#RM6!% zuRprPpKND8=psL296iEL75!e|^@@InUg^ARVc+L?xqWy5d}Sm4+xU%fiJ>j$ai3j$ zXM1k=`-L5jdEe;OUXS?Zpo{F?Xpg7M{^rZvUo7^=v^;+rkT7`(e^vg5;EobG1j3*5 z{k9y*-cR&C=<=)K;3E`#6u!wi&vWpefpDqc?e!$LNA2|^1JmwT%omz7J-t8Hb+Z|y zX43y*&!=BSe~|v|d7puDL|{L)pLb!&Uaxvp8?Vu5PvgxR)MHEf?kw#+J3z4fv#yuF zd_9sq(S2_PUmgcum!)`JYRy!%-?{!2?1!F+ek)7#o0sA_Kkz)qpM`!7d7R_7`Rk!i zod1$;lnWfiX!Cu6mzO+egDxliv2MWelNwEatW5a~cwE6IyqCjN>Rt)?12sFv0XrPy zQ@H12)(xp2oHvv2b0F56O8p%|zU)Y$7YiJ}JjT<(J6OBDZa6s0qDB9-f2O$4x#juP zPk=XncpLPukfSm^wt9Q)7ge@zd#?e=Vtp<3qfOuMarhbs*gw`|{|=V=cMJO$?|;=# z((~OfgM6bs2GYG;Zx`z2XCHR^-tuzn&k>}{-cP#yR@m{O7;j7T)qQKaPn~pN(EG{B z$jA3EMJ&sQ&T)wDdT(9Gandi!G3nC6^AT^p;II6N!tWdK0)20CL}hR1uJCm27b3h> zu;{Mpxl0wFNl zf4QFNyzIb@{ys3>2M94O&Jj?bDOc>rdnqsB-)aAY##iRQ2l?aZ7J4$;ODr&60;wK6 zx5V>;>eR}+5Z647aDE1H;U_u`bO)X-WFk-wInPY}RpQP1zs7NH*!@JU&!zA;cfgbN z-qs<#uvfhct=(+C6S_Xt&r|nLC3QewK9c<`q#HxM%3XTs-#&Yoe{iTo-^Ivc`}vwS z9prB^{oz-%^`O7%_l|1cXBO+snY%*;9rYf8^*@U#o8%^66#nXL$ER#pL@(BxjXq@~ zPRIImUvS7C3_m{>S~O2N?|EPdg7~KMB-uGVmQH@L1nI)(WcOD|-iXi3QBQs><%lHD zVt%CeCHaQ1+qWSTp_q5S9{><)IK9ND=uy0v3OUU-csb2y&zm`o#jy|8;cC5VF!Ugc z{jlnv_D>b?8&=);`(?y zz++wqJS4B=FZ0Q-UdZ$5(C6h`AB+BLo~U((Y-aE!@dwV;&@WNMAU}`MtNg!D z^0i+|`~3>L)5~6gUgA&e=OO&(ksi*T_IEH)mPyoqDq?xOVEgO}>o5I@Hr=`I7od<^ z*>>K=&agW6X)uUhtoO;Q+x$@fnEr(%y%;yc4iXRcyMCtI_eT&RWR9oT_V@SWX9bU1 zUyR4hXJ9_k+xhYR7OlT5z?6j$xt_p&X}pjf(>O}}z6e zpXLbW8;NC`j%=rulsg?dI3)W!y%QZM|IEc>T3?9{8$kzhY%+9s_!M*)IRzc=Px^N< zI&4eIb)o~Bfjqc?r1HQ%MmXaXbeP&V%O|>$2hss9`bp*BzEkvn$0_=MOVY2C^?!X* zu2cUhL7ntLoyT*=Df-{lNe-r>;$-At@Dy~QO*@%B^e6p086B=j$`$@zjLY@Vqpa8U ziTd*><{9)$nWFK20qi^Vys*FF=cnI;Lv~SKc4;#0eXv7&8_^#1>B(sC0~54IzC9W3 z{Zh0Ck{0w~|EMRY-Cpobbk+H(uAc%h1kEQj@9Mjkts>orX{-xPHM_5M==^@mF8qpY ztH)D+g7XmVE0$kDIpKam$~jx;+vV+OAI}B&Y^9C2$hRkm%M$7Q4bd6JcST5i1io+K zPuYF>g(*IqUu5xpvC(%}H5*T#jr9|qC(ri#ygnN`WH!5hiu=X+onAhFzso!Eam+1! zo7UmWe$LZL=l4H;I!~Vroyn)k(D?}D`A3n?cRYSNpHZfBD#z6K$wy8t`ZzI<0@c<1xbfZxg_~DTSx^J*U8v{k?Vqc#RZZtWV_2V*PZH zucwyjn6Be-otE&wgN^@kqcY3gd^Rr7iCcAuT ze$0A=H=unBh2O(ew&U~YB0uKk1s}`fb<3*R`rcvSuX&b@&oID}YvOY|Hk3aR_oRFm zL)}wxPs%61o5*kM3)H%(=Kt(p4@kiNed(p>ual$gf5bUEy*KJK?_QIHYyk=)qy{$UZLfFOdjiW`P~K%`^yiSotJ-JKg-*xPmBEyiM-i*@@-y^c)t!W7>jkxkmGFF z*FWp>Ttm(BJaaKCdJ z5I~S$F8pehb1Xd@asHLzso#44MEDxEn|+nk&yA$>mc%CY*jHIX0YzxFDQ0X`n2 z?^TYY9OnV&rtddEq|1OW-+Sy%+Tr`h14*24*IwOTk4y320l267{;JMN>w7zCf7ySH zTWn_&5YqlQ(Shl+V0U#-yY|i1DxWfXW-)GMaqhOT6FjhmkiIv1HsBO`9eQ4i@0&_b z^c?3`whWw&YZ{lYfZjCXy=Xt~*JWso_&EZ-Z%O5Tg#1eM^a~h|X4?LtBm(ox6zI`?5S=LM41J?e|mHQ)_KbP&H=uyab(7O#63_{TP zL%qjO`%QXLuC|rlYrh5j&^$}`b;z&D7r9>QeRpBEFLS!+y?)xxF3M97lX9~Ks*trp zU%Oqev;ComF}~>gh}p2W$9hv>KeLv{wJxB2zmntpfdj^u`dRKU73Y^`IX&9v?SqeD z*J_nNvwB896qP&_^C}uIrYG`7J(E32`}cF`U;e-`mycH1qu5`W#rX=I*Vq0juDSJ~ zi7oN$$NlvTqO;b+G;YeCi%+%6N3FdSKdx8Eo|AsRkA1n#7|#X2IrRB)^`u94LXSAk z0u092uSS0k+jAnhOxqWnyJ6^RmHpmM$uE^$_D^wsl;v0b)P67ij3hC@gRSgPC9%SKQxZ(JX_XpGp6S{d_I`!|Q(XboPstI>J($ji zd|7=A{RD4dlJGt-NqDcGB)oej3Gezz!rPI+WB;=xUigO%7qI^DcM5t(I_v!gFGv?uHRSMVpl!{hlao-g>4t5kmIC$Qcp|Fu2OI9a(zl5)c15o;ZN zZFqb7K1YiG8&O92eD98CPvo<_yzmn|&98{pKcSrTwr*Y?=z{tTgmVD-aN8?~3GYnT z^Ko)4|8}2MGe4i@dpBAhC;dssY{>CX={Se|9*%OLFZm?=vZ285KF=p!zXVw1GuLbN{lkH< z7kd9rKhD~VaaH_D+dYfzhCkg2uNw2Wx7+>0gb(F=B_v>4feJSa-fn`?m=?TYm z{Ht*Oki6IKUw4t0n;ZBr|0M`aYlJX;EKMr$``FZ z{fFhKLb)K_$-lotn?*aZ?}7J4Fcj(MTC|d#6MUqzji7P3EArVMYv#*h+z$VX^1}8s z?(YM!$S?X8|Kta;@hgk( zyUVXG?(e$U;b@;wo1R;pf5ErD`S^h#f1UEj6t0I;CRBe*@Z<7x&tY-9m&5SxsXF13sq;_RF;#^mg9Q_VJ7VALa$Ms`hAwxEF*znhPOwxJpF48CL67}$S zGA|0#FH~R%~!iZc#3m9_aGC2_Ha3#tbhJB&=ZiAMLDjK&$Y_Ot$!O) z&fv}Se$KrZg;)-4vYhr~>q&U)&|%q8`7c?Vd(FGu{uK8|-r#Vl_nd8MJl6hn!kYp7 zbUtn$kYqo}moav<*U+kDZ$brx{Kg&5pADX_bCzt!?D8^~pRS+>`@{aX<$jmdPw(kH zf_Al@M|!dU`KoPJE??#Pl=6xEB>tSIwEZj_!C)VP4q9i>{=1mB7w4E}y1W3UYL^41=#3l`t2d#;V^Su^xL?q8w51=3(%QMdB4du)gOmcK^$ zJpaq`q*u+P6Z~l&cRFaE**q3;=SS8I{nUD$+7Ex6@ECM&{mI&YZnO{7igRmogD#&& zBIWf?W+DuPz1bM)k}vr!sa+=hQoZ1rAsEYW*OU z8_v6RE;YZ=`IzP(Cja+19Nl-J`yO;Ykn4L3&mMd3_NP!q=R!0u)OV6a586kwFYCQO zWj|1SlmDE(B+AVXd_XtyP4=ho+b{Bb%ImBpkdubTQ@i;~$$O7{RnT==^nYQLkMV_Y z?gFl(u_UDNuIp|u*9ajsVL`u;QBVVoOyXdIItAbXe2&u%j~&R@zG;p%=# z?n5-X-4gV;-|EUp=Y~?behcJ!biJ1^>`K$)lwY=^^B3$l+bQrQQV2}ngo15) zxct>B|I78|5-%seO!Efq!@K+i94 zwf$FP<{RN(%f84T*FD_Xg~Wp6h4XzKWQBp_%ZVTU@Q3`3#}DbJrQ=P$>Y&@VxX-n# z!IGd`$V+~!>-&da<>{iI?9M(61L*FFby0rZWnQj7-o0c)USIwy^@Ma;H`B|Fn@2>t z`dOcX&G-m4Tg?ESw|YITvkISm0BU$__k8h*{x#bhH;=s7%gybL@_wwu=#|bV*S*m5 zw*Ux073VU$qP+Yi=2H@s&VG%VM+!dD$M7}Mw?Geg0$cu#)?3#_zSgy~b9+#V_Q=N} z>Dzxs8cpxIpbzPXe-)jRu2(*5eAYg@;-252xAaGLj(SH;keunhmIAM^6WZUW_XMYs zw_4>RhQ}5l`%=Kyc_GbDM}62X?(-SE6on9`f%wNMXXksoEA(OT64zJZuXER_iiHD&3|Eaex!ntD6UE_q#_Yfb-o9xt`1d1TJ*7r>$UtJ44 zpX)s|z48lm?t|@pDP50S>E(;_bs>iu|FZaAP1ZmDe!e5b>*lC`yFUqkK5*1{)gHfT z6_Fn2AtxHYH6CjoSd8QM0Wd;&eKyy)9&(b$_+FgPj&WXm%VXUjU$)Eb(V|D~S@d_n znz8#iN$S+zvcH;-=>0=Fzx_CDxWKjDQ&gG`|XWi?(obK<-!!C+m(xV!@LY7o|UkE(o z3}t_`?@qsWfc>S0X2U+t^j)NW0b$k)zk~f}IrWqD{Liat_klQq=1pBR8VGsVMaiq? z!GRX+)v!Gf&wSNx?@zo3 z&dynA8Ct*2w0<1@&GvhHnlEO14p@DT6C9^BkCXk9y&&CJAYb&*IJ!>ua zmy`Uac+3MH#Xh1aSM)R5%l10IxlFNbUDFsZP?{Z^LO<}dNeoqSF8M*)zf)Mjc0n#D*MfGlNe;@I{!3}8GWwf zp>eys-cj5exIFOn;i$4M{Mq`M=UaxxUyZx_P>%AWa?0NldQN*d=Doo+4u5XIB_64t zr+LJ>9xt~A@KL0|qiemV>)br^sYgnmgZLPKFUrq>u}JOhi#I!*EqIu}x7_3Fz!!$% z{vHY!!bIzDZ^k+Z`>*%-U19IF4$o~v)MH|2|PrJv<|jw3`( zlf`AgZ7t559A+Byx+nJQP{&PUupa~iT=@^dyK6HQhw z!;|AZyFor_oZk}ke@)o8G@WwZDV^FnP-q8VEci&Fs*&!b>$~bK z0Xiej!jk)X&8imr|N5&RI>8k7_fYyBDzyJ&Ob62rm-c;r9{bR3+(SEM`78AIT2w}; zRsOr_qV`SVy^pP(5TCaopY_>3;hlkj828dxzShwSzq5F66yvP!r;GPc?e|8zyuB7% zNB;qw-_gVSB!io->+T}{6iNiP|7%eBtmy`;-R@$`*Z$osE+W$VA$?~^?@8150*e8^ z+@AccwB7fi-Sj&pGgxoCHEVc%0%OAHevi|yAl~xxWsg&Mx3M21PDjCkf9!Nef9FMi zkNzy+MmwYv(>3lBp342NQn^>KT-dL)+~2TVEARw7>&I;#H+jK6h-UMMCD4Cl$eQ1^ zr|zfCn%|1}a^qvx{D+7yjrf-%zS#NvphfNdl+k4<;!|*cDCyMjIPnBZM$c@0o5uqt=(rL{pOv5e%BlQ<{3TOa`=-$AJOk65f}Y_JmR7sSAR(F$Ij>K zGh7b8yYS?4cnRpJc`oM>>p_oHZfSQZ&)>k9hjmV~Khh(t4@Era+4AoJ7xZkAx^BOz z$AojQ!Et)a-exVYFMD0saP(- z1^e~WafBnN#u54tt4r_yzVsd6?=;5lCf}hQV|SD9(2lXY$#-bS*xfmSU(=t&@9W@W z;ip0#81gummG@4MxIK{G6LIG&{jD+ky?ea@!7I<3vM2HTWZ(W7&~@1Hr2l>Z@*%#7 z-s$(r)+YVdyepdrf*?>|`74#ngCTE!OS#{7$mKrPz3TD(i0odc*9F+m#9#6&)A<_V zGf)KO57x{(MLgyel26V180QHkohL2BtyOF)T*<=kNb#ngaDC@2)aN?Irjoq97V?%2 zAMpMRJ!;RizV?^@(s7>KIcE9w>Rg+zWFtqtUi7=~c2_LTYYKdN(KteRpHF}FJfnm7 z!g&uN^j$4De?AT$?$cvGww3y^lKs&Br`VsNb3s~XFZV0;KMx0g-whn}enRW?{c)dN zaSk}%U&w!=9{tO=(0=F@{Y8K~q4PG9 z=g^iDhoXD?CC_Pp)jz-Y^RU71uezV7_iXKbWzOefejNQR_Qwq$ar|OGTps7L^JNY< z4?A10`h->Um;!I;7hly3TLECH}Rvm4|OQ|hyGF?BrmDIefh<(H< zQZJipt$}{5BQlWQuTH+FmBRgf=#jqP$Z|hDLAl>WInr%C;0ezZP6O>e!p0DuNcv4X z1^qJ6PwRsH(_u^yh-VL;o$#CuJj?5Yl%pdkPrV_3$d@y)ud_b&A3Z60rI=PD8X%$JxQYixJA4aB@C+rHTH z^KSQ}o7u2+B0(zES973B~8fIqVBS4RA>#T(nP_=GUf{px7X={TTy z@AlV5`K6ZM-2MiO561kxx!vUl_T1q0SAB1q@>+Z9`+=f6{lX8G?$e-M ztySD%&bAK*9-FLww*97vJKSvhK*Sw>w%yl>^X}DFUh6va(eGJK*UzTXowvxd}fB|8C&ZXe~B64Rp`3XQSovH_-ijr+3WT z@Led2H(LwsIoLfT%CEHNKzAkLE>8p9Q!U<}SNc4)*;;PtgWW!l&05Y^_yIPL&Eorf zTHnlC&R6(lk?(vh)*)NoFOEhU{vn9q)@SLXLkrFzG( zPZsm!arMf4e-r9aFIM7zYNuaAdk%Zg(1>|(V<_l8?0S`7<^}Ti`})+t0thU^0F?wG zYdK%?*`Cmh`SalHxt8B(IUgEB&Yx`9?LmH-zvsz@-5%tZxuG0b&|~!mW<&T8urI~v zJ~;adix=w+v)$0)y{xZ4%w8V(&Zm6#%818&fA;E#$NI!@Y z%jG+tz1iX#56S1P%pY>OPUqQ|kw1xFeZyJePFgvNSdv0T6}Q!t5D1N&!@%>-P_m69)7%J56OAmCy?6BKP{Cb$Eeqh zW00$$1LOaIcriX*NGw37ke`O^0cb+Pe$w)$Oef z>E3Ms3jd;e^6h*Y?T8Plzxlo~{c*jnRi0h61Ja)s{eJ%x{o%QA(W$s+--n?}*`L%r zCDVElk%>V1_1#A9!Y{{v|E2r#L0E)rwgVox>-%QsQ+{AO_?USOJznx-2>35RHNt#^ zKoIKF&$MSJ`pv|8DfiiOyrjR(dUfnRVTD4@T|A2YR;j($I>kqD;JFd|Rr{-M&&X%? zK>M*8!(TVJJfFo-pXz=V%Y6`W-AkqS^V&y7J8$_dt5%$!797eW1N;A{|IGD>gVv7L zAGB{(^X&ZAM?L?>Blgrf;YQ%m12|jaS+C9`*fHaq`4yq(Y;QH_m+e1laIy!F*|Yyl zpMRuuIt2Q%{3h6sTFl?Fcz>?_)7qDF{mhB$FU5RB<++Ybe(61bv7W5=k`0$1-A|?c z)LGnP#q(3>Y9-s}^r%(*p295N%abn*S)7wD&UfrT(QXf#+!D|Flof`6%1Q4EeT(z>#XiQkABg1%r|%-KpFgnK z+SmOjWqNWwmF2k(xhpw`N;=;Ry^?>g@0(?NLN8<8EQM!&W#CVE50&6OfIQtxo8O5> z5gIK&XE@O9`v)4W1BUN_&T%%pT=Bj~`WN?XH5)(_VNm;4M?UTS9df#7E$2fg{ofJt z^jloliSpzF*FT;Hp3_Hb%&-I z`aIY>*URsB{_uT2(1D$Gyy-{cAI1ld*DAm7{fc$!LM~$7uY1z65$~_|CuR?BvU+vA zykUb{hu8Y$xcxn7lq;Q__fGU3r`n64H*N;U*m2QwE$w%-tNVO3ZWn%C_N8)*qOh4tD$Zr|VS* zREM3XKGabTqKW4c^Y6H>x+{5qBKt`FVEMM)JZf-Ldj<1``LT~9g+9f3F2X(Z5e()L zI^Bb_&+5B>lENK9dg@oIzu(~dHl1_Vdw}9S&q2el{hr6|U>Oeaq<)fqxAnPP(X-Ka zvUKlFt>WulDPF`w@1a?LK1eJ2*Q+b7r}FbS4jSC>EA)P^@Hbjc7}}{a+-Yb>aQdq- z76>)_+8^v=e5juNpb6=_+xf2XN%t_Oc<&_M_Zpbu{soRNM@r+%=ea&Q9Ckm>SEu`} z4A1QjhyDK|?O4QV@5=E04)8kJxozy<&{mhHN#ON4;uYt-vmv+7`2shfdap)$b7YZS zO8Z}??^fu2o4(`{$19hYTE*pv@bC}tKxhQU`3vhSE@$z*^VB|_%I>d#yh*;uzf|sY zFP!koyFYC0G+V!CPtF5C^2!ZE4_o{-Gl>=aN8r_iXJhywPoK|J_Q&mj_HpPwIl@_r z{MTG$#jIaeevh9^$cFu%xol*_;N>fNtl+r!j(0fy_1>;l*<QKu9lU;~^Scv1uLC}s z-=+EFC+YV>U!~JHx-{VY7VJwS_DA(sUt<9B8)q1A8~a~o zPmX6}_P50QhxWL)(#mPymi9a5-D@L#y*<-;jLq8EA{_UdNCVEZ!rS`(?%pUJ2_pcaTwtJlN`k8-3 z`6PbLH!z=%c}uP0_BtC`Zv83bY8F>hK$kllj^sLv_bhq5AIw@SogR9hI5geq((Co| zc>hzp$Bp-l*~n5a*IMn*2VD;8)o*%yXt6!DZz3C77;(1?+0dMb_gF*OP*23&5Y;OG z$KpDlk;?6+(7!35L#^^5E2r_JlfKe!kdCiLOWJ?bUv<0F7>V!rC30zYCee#e!avtO z9^U7|p!aR^9|kTAd&f;F2yJ>FH~a=-+^bdo?6<0ttXZ+Cot zl(tu<@2@8G?XR9=`0KoPT2FL20J>=XuZB^974%(o$-nHs>``&=earQ`UiEc8$*1%< zzu%f~^KZZNuM-~EVjQbgzUBN3zNh6h-h3JzmcQR$U1SXi&*pHu-7er1%bD!-^IDJ@s|?tCR=#D&+sEJ?8I4e$Itkgxt+fA!o%s5b`_Re2>vn z)0+*^Za6Q5i=m*fN15)Sb2D1WV;`^ls`OmpeJg>-CICQ?y(;&Y^e6x8XFkiyNuJ); z@b^-w9HjUWFY2r8Cch8B(1|X0Ug~}=ietZH&}X9+FYqF~W>Rjn$MdgW9&j)AxW4Df z@>|irqF?L;g3g)gd@{@3az(p+y$|f4GR5>w_V5OjV<1|@@HLAWOW=q86W#{SZ$my9 ze-QBk57~+6UwK~_%fEIm>L>4Me+6;A-{AZ!g$wm+zrPK*n)eXS=U?FU@N-PP14tJ> zjhXBP_>1Ez&%smaDV)DYJGIL9T|c88eV4V4190n6Pk41Dc*AY6_i&4muX~dPU*mKN zXXgZP*gokrSvUtKfb*r3z!9G_A3klp17IrsHCHsQ*Q5H0{3@oRzvuh2eg>@v=!^&D zLiaA^SB4zNe7WfNrB=MsnD5X2sXk-M=95d%$BVpPF@Ngya;jhKx9j$CN#C>9Jz{M? zEynGrukj%DJCC4091o7C`vuSs&PaJr?ntt}M|nCEuR{4G9rRwa?04zheHQY6-b`92 zUvHqMYM-6f_w(5I^jN;fOjfA98g8j(JCdtx0b`KsX>O;ueu}P^zY{pUugO&SQ%?5c z`l@Z}EY&ql~0`=Nar?e99c9LPRuo*=%J>GX7d_m6tOVTe6{jNey$Lcja> zWzbji&B9N6tlw7*z0$eg^7uqOX1~eT&w>u}GpPqI3COJAJIOO$@A+Lz29|GK(w2Ym zRpT4;e=EuF)IR6!EcY91H}>b(r&5~G{}{Km&qn+ASpI>3NbG#bbs^`m4^``Cv_tHN z#xZ@zs<3aFHHULJ{_LMRrJx7UGW_&>HMX8=9X5;i@RMz)4ZmverJwB2a=>ji-4AZw z{6a&dIk?cC+1q>k`Hq;sUK`K*Eg5>~ikhDZKnPlA99-h{2QPGZgR>mI_%ymE>aSXB z`_iO;TK5t?Q+YXn^$6m79YEpzsMYJQZm|`v{Kn-L$38@R<`1m)=Uoduy*cNY;n%$~ z;xi(?)Z;h%Jy==h_aVc7_4?iGJzx9hx;I5U_Rn>1ws?x?df=HaT5RdWclG(;8|)N= z?A`?!&`mCo&S%zgd|Cb-@GoSy z!u5%VAV^w|%0|3B%}3epgUoM5d4N5Jeq=*VPv-NSNqVl1{E%OybydpsVt`=zWv_Dk zzVeUJcm(?2FNl1~b#|L)r02cI;5po;<6pxU!1{>w59{If%pP?96HnjHY<>qx&;I;jFXe8VjcdIBi>_C#;vGog5r39{812)J zy`|KDY6kPi^nahXOTWtcAAValywLi^^4E9h|KslWaI_1)89zmbSZ|?yR{!@W{m&kB zeQVQUn*r)XhkHQ>(x3FwyslQc%gSSY(E2wJ_i|^$e`fLa`JX@bc-$+T?frzuuY1V& zFmNG^7ec;-vr^h0pBLrVx*cz~_b$sPKPp*U9`o)U1}DXv@0IfS9$H&&j#|5EIm!+E zI7??a(h2MN7H2yL6Mqf!?V=nJ!TjIhmH9rzT=!p7{UZOLh4D=5^4M2vcuS6?hm5ZW z{?hO4c88~Pdsu(L%bhpDv?aK36 zt`+TpF07Z@mD$W6iF^zv*6-~BM{=0hl@G5NtG~2U!Yj2uA1syI&2k$8ZqSAD4bY~K zuk59MyB*=W7v(j@n|QI`*AY(AAL;uNq}M91HNG^4K48y*MVsuI4c}+aeA#-B?|Glc zSFQE<-uSNGb*nud`lb7s8bcp7z6~teWzTH*VSDDwc6xlzhdjP&hsXEs@%VMyJRa~S zt1oH))bF31px?8t-{%@(A8)@O3x1;inI-&$_w$i1zaziyA*07AWP@Sc{g@rrc@CjI z`Tpt`Qa)Ud`>U^WzvC_+hw@upZnBo^KfY7rbZ;GTK7_u*kBs<1$0L!WN6}6;68PQb z__5uU^MNPE1qO}ZOyB&1c3k%l&kcXFZ!@hCz9*u3k*Go%I?Lb5_BotXpBI<( zxk7kBC($h}zlh}nf3`P({`Q5xRIB)UZWiM_zN27x%b!l^VEvQ*yU)mF_TpFR*CqWk zdJTI%&#R~XN$t#|J(MH21O3&PjI%S6=MVAwTKk<2*big)$cSXTm&UldGRD=lF|LN5)G9lyeU0zgkmK3@ zPSLw9U+)cd&k^zcZ8XvTo(qVHQ1HRcNk#i%Cc}@70P$G(aYs+e5BYU|-*IE;oo0^* z7Wuk(HvD$C+wt9mY|mRgzG|1-?Y(dE_;ouyzB}mA6ZBjh^jseFTpjcTJs48_B?mV_ z4r-OPo}b9`vGY(q^qcf2$p&KoXJ3W{1g(FM=gZGpey8?+9_^LWQ@wsA3NLn(l^bM^Ip|!+nX;W{pdECD`O&7&x#Y)g_lIRCxG&M?C*EFGx({L;A1*euY~7Uf z$}#3J)GAGr<5TrFe{J;h%IIgTn-26wKb=iuC+MWlozn4Ic%6Mu#=D5m`jyK-~ecIpsooVu>aiBf#nr-#8 z{>pp?y$59cKOo*N?{cK~g?dk@_1;s}mz~jhJ?#t7y%Aa;6h2zl6Fyq^)V>kH%Yr|A z55q3xjwa62vp1NpDSf8LCC|sfBd${eG&vp593x=fJ;9{j-001>`Np0hV75m}!4jmdYP1mET+{&v|{{!csU;Eup=|9W; zkz(Ie>~G74wwayG7p-=CIlR^5%T{{4*srzR)3vW@g8Nufd_;%mz;31K2o4|HPUO9%gLTG_e?G)J%%jV#yO+Uc8^nTsHucIOgU)n_Wo&q zmA<=H?9*~Pt^3=wE~EW|slR#*c**W+zLK{0D`+o&V2-ty&Z`W+1Yh=B<5Mc<|Cw^$ zihe<8c9;4|x}@drES2XtnbL)HPs?vNdK`5*9XjH2x+uOIsP$B>8#Wvd>2*3!;SfUl z_RJlN?_spZbm~Xi56Q(WrU#!`ZV}^QuNa?(cws-?JuCc%PIid*0i^wVGwE>>JJeI6 z$GTGa&FEK(_v%vlH7F z`SS;6cYGbJZFkm&el50VHstmuU$oHU!)|Z#Wj!9>6ZU46>xstmV!v2?4Hr>S-gMH{^GX%o?&!K?ao2qD?Jha)Ar6pd-(&$ zteq6!vYllAq<^X2{P60ra#priWxY9GDqpr!Wxe@!seIW^mG$K7C=Wl_={Dqgl0ODJ zbw=>x7hf>8f0Cmml%wDu`PQO5B=+bXh?ngV<{746o$S$pl0EtY`+X97RJLEAEtTI4 z{8M=@^WoE^(^hjY#eVFiN``wQ9pM}W~LVN$V+o^0Q?A9XJ&un<9>1n=fde}9$fBCA4 z$M?oPD|Me>StMR-&iWYvsAvUhu4)&dW$9`S2BRYqf z$9bX@&trh2`9NFl#ez4{!}N8&dXS>=0BYj)cg>!AQbf9wx$_D+fTag&o~oI}^Vv{w0!r4ug0 zz%2HL>sY=H(S~;{>I>dC#=z^Z`h6m_*M#u6_xUvp4O=ImCa3=P5%7!p^`Ag*@k@BO z`{DJ=bWQbva8f?}I*weY{5!<_7*}{t@zLb{G~53h@J;6mvbbO40(_r!KAI*T=i|wG zmH%+IBZI%J_lcMK6X0==?qQ>&)^)WHmF4~i^FvO!Uc&M^_jx+~y8RUWnp48>;}i7j zwZNbKx&}}7YjLUG{*&~Ja)E8c#Xej1&+cKJZ2wxQj6gbw|C`XS_IldcwmziwD&32k zUF_pPeTpmA1yj0ge<=HbZF|;_m8E{{O#0Cn^7}vvczawAvc0ZPx%PLhK!*@?zpD1( zx7X>oY6rcz*d91vNa^tL-qy92c)IRasM+oa#8yI zde$lEHPZlJfPK}ZQ*kab@Ndpz>UjJI0<3i2KMWfx5p$>z_BAW5sYE!6I7+ z=eSS1xdw3N;;H+N>eX3h_v_W!CK2`OOp^!3S-xJK1K#lY>^cdUdMppXYa$dE%*#{T!6&I`AQ?#P1b&>bu>H zv)$s}2*fGT`o0kJH(T7-%o%5UHN(!~z0%^rSLE{x3VQ#>@=Gn>3Cs9<5ZC&&{1@60 zN}~38*7V)g2c4gd1~L(NFDmscwXa`BoP1*o(o^kY&2J0;(bb?hS1{Ux!U)G!XXGmd^R5bxhcJlpN|MEaYpcE6+VVy=Fpzy0o4_r1=?5Pb(w`|P_& zbcFm$e+rKFHx~DJCGE~k?3=!SHhPWMPx1RE7(hH}XVmYm#a>Qy>w|q@ko@ypB2&1Z z>qu!IA6HO0Zfq^-;b#C-?Fj$=sZ%R^2^Z!0Wd0SHKj^+d+C}`U4D_zVUzC$w=(T9U zFT!Eh2!~I?`4o6M9*);*!*Tu#pW?k*%gb>b8UbAh57$baXvDn%_31xuc%^>EyGg&H zs0Tbh#CVK*#EUE>obO#p`99=!D9%|o<2~G9tT#9J$9EJHJQkJU|0Uvt%QtC+`%S=2 z<#IjC-|YCL?SB>J>SxWf4Cx8`c?MEa{8>M(_rFjN`*9ubSqrUxGwwGXoV9oyyo*cl zh<}RjUjW|V{V>i519#X1{Nmd}wsSD(v)i6o?CZ-H?eciMm&QIXkMDWN%dgtu&sjYN zN8dxsmw-SB`3mPZ_H(XrF52~Ws@I%GC5g|{*e!R@obDZp8eCitey5fu|1CO z(0a#n(HxHtul4w{86MvgbY3;x(@*g}q1_+XlUl_cjZ{9T1Fw|7#5a{s)+GK9f-hOi z_vz)`yKSDBwfz2zVt;YV&okq`+Q|2NJG8&6x&NbvcPfw9b6%S0$H&k<<>BgR_x)%$ zEq{RJ6ZsW>_n=(;EL!=o@@nN9mTY!F<=jcY=xqijHENMBx{~F3S!XEX*e=@kY5NqIlCVNkM__O_<9Gyha z{)+Z{^+Tc0Dj#;v#kuH5eTvJ=pqoc~F9$SE&`y)@I-jq8_g#VxBNX2OzsTD!&iD0N zcBShof9kt8s?Tw}`q}or2ab>PQ8Yb&`URYSC%uV>(fx(v4VL?D-OW(K#JwY`;a~_YigB^`+%)J0QEx^q)@PZG_z5AMR6fJoFv*`Wa3S@rV0J z>1W?i_i|Z}KRI7!k8bd2<$7Ee%b$eLg3VHt@3T7->LC({*>_<3^_QR_Lst;ZMX01mZxst z>A4YfA&1L&-1Hdm*h4sRuWqdp_pi{|M$mroarPwq72RKu?h7M@G!NAMhz0!vzjPmX zhOKzyAH?HCx&QqXbOfDC*L=MH47U&R>tt66=S_ddah=)){MBCAXXd{J`IH+5;iq|G zagKP2=L>Jn^IW4WecO2#d;2=isrCr}XOsS@KGWZrq|2VP&qX_5({s+BIKS;jNsf8m znRpa;eGVT3dv`0)-pY4%Ur`_HHVgdTcc(3!FT|edN!jtxcDEHm# zh|8YvoUipW?sd)Y_j>A&_D`g8Nk2y4w~~Dz-TxHnkMn%>^5VXpkQ>@>;-_^R>0^oy z*W0r_;g`L`@h3i)UI6`wdv6~1`RZp7oj>yU={%zook{YP&K7SuJ!$7BqBE~vdcx>D z-`mqVS;}YnSG0eW2l96}`5yk0{3)hyLAvBu_fkv--p40^_qGI{>=4`e)R)`s6z$Cn z{1dv#@BdGPUz~p@bwRhG@DJkNeZu9s&}87UyU(TD^kB^?i_bk3oq`!Kl!OtI9Y;f{h7uu8dX&#!8ePX@y zfUnM5WZT2vjPu{wb`(Is{!Oc|?+4{NKfc|vk-ygQ9q~Bt&9eFYP{h&wwVY?WdtKbi zs_}|=%)u7#VqCk;>!p6sFJ6KCq~FT{Pxg@I&^43O{|$ds=gzgB(LP_T^^WCEmpE@t zy3phdbU44dgY=RAG30z=(}oH;Z#6FR+fa*AL%i{#iB@^TUp-#%jYKh?fH`2~5byQXq1{rw~CM@iGQPxNz0 zmwn1wqRS3%H@=6KwM4(2k-pOLEaG47kdzLc;N+gvYNk4Ah)#2*U!?NolmcSZa_#CKaf-Cy!P z@;m7t?W5*#?B8nO#r}Q$UIxAz6vR;R}eTTl_9Xdh9o@UZ=*!0V=4k6ZgSd;17_ZzXo%QReHhX+5U1 z-bL(B;8(n#*uY%R-w#B2F9a=y%BAzCy~w-i0dF^@lf9p77#Le8CgwGJ`$@cf{Ay-E z0HN52tnw&aMLO|25BTNLuam(ig;@T-K+Xmyfsf$7ALaAAPL03d-;MHmPn*)y`{x5^ za|@x5`lIEo6Fr&WFYAMjqaDw z{Izc@vG92vf9W3dT4m7E#b3z*<(oaBzVq2P+xsQ`AAP%3tMD8T```Df$oFO{yayWQ z!2Ah5`{Vr4Xw1WO9#Z~N-yOd1DZk6t6S-cxGkL$+>HZY6Uwa)7(Np)-XM1)TT}Zc= zbHBOHSq`~9NbUF$;Ky?BfI{8S@_j0ep(9qG{w@7L-3wpz-(RCu)}X(0kuN{;=Pz-5 z)_^Y8UHj}}JuJOvl9XD5Kde`e`}ynDmzds*F0~34XAx3*jGTfVyU`D=w-)EM2Mi4M z*SG2MW28r%E8+e%mtXEGf?O2mPj*`WwZDS&`7q%(99|bYfl$cDEKd-9D0e7+qJK)z zd$yOaResCi4*$@eH^q0JvpxS}@#22wy}mClzwV%=XS=`R`DeSm&K~sf^`<2+Fu?f= zpYZ3`KF8x{`U1sGu@6uCev17!@f`r|YuCM$lskpR_))XBlWl#;H-!Iv4+w&g$9YNm z4=yKe2U0k2cME;XV;s==Lg``Fa(e6gQiMlTbe{c*)AyT+c45zd6!rZ8_JvMH-~Sal zI#g9qP-S3s(Q-if2y>9q- zJtr9o{eSB8{6~LWzj~5-e(Oo~{DsCJja!q^^V1#IY4V>6eeZpY`p)~}{(W5kw?3}_ z=G<)yFYe#<{prpwY=6Y0ocRJq7r|Xf^pVdB(*=c?D5amzy>t42o{=VIxZ1)$xOL`wN zytBA3s*d$mQb2l<+N-&=S9g2;arUY-9#PKGeA`}~>-G9>cLCLV63P$tQQzTwyyxt6 zzh5DbfX^0n-YcbF&nf74Af=zivxI&FM!y3=KVK&;?j?!+OY9$2Nbh^4r;kNWHa|^r zvf?!5*wUh9p3Bq@AkyZiTMlnJq|h1c?jJDOZ)T>uooJaI^{o%aqwjMHzoP< zw^P55{tnwYhNtWj&)0HXl>e!Hhy7EYRp~)``F>7~qdJH5c>RQN<8k=8o$$uC%1Pl( z4n33b{?sJ#Uj8)VU6!|${*Q*-aNn2iS?tICF$}VkIUyFO>BxjNj$y)(G_7%!+)_kBi&l`5Sz%S%V`Xl|AOuv8QN3h@8r@?zpuK^#W z|9zLzOZPaRyf1eENi5Is;Vb>Q25BtWk9}JVsl0HVhvf;E^Y*2Qe^2}Kue6&Z;ji!W z^}KBOp^z6}*DJ$gz2~7`W88aOt?Pwcb?**14qy9#v|c{(Iqt>Q5A6%hm-Kjih31u) zTby*_JW2iIdIIBpmyjArN1UQ2x@ldE>736EgdZ^w@>{E1!fIIOoMU*W>lPi)`G-Hx zdENP_N4op~_b;UMS`7N9`@}f^WO??`=wB+op5@T{VSUbE=nE&E@ zYp)B+J~&^QP6}y0D?8E`8$@cAs|=ptcg?hDac|WH#r~Z6mN7Uh){%lAvJZ_RKQCU$ zQ|y1u_J%xM8+=~j>z3lP_6>_K76^<`*o}ro?cSj0;%7={(lMpqACZ1Z`K6`u zWe>-tlh7hxTAo$sYWo`B4i)Z+q-nt9;q@;kKv;`CVPAcPm&(c}8<5 zWY1H(#w8chlk_-!yXNwh>eXuU3wDigJK422nqAxE{n)qOpTleY8TYG};Sv9j|10g< zE-TlM`*+CtC;J`;-OrrbGou$82dPiPo~=dc_PR>jo-O|&(^GpkoqQT%D%J+k4(X}+ z1odDg(n*hjl03bU@9C0yA0Qu4{!LN-`cip2&ym>2TH+cWQXipQz&e%@)~ zeQrrk?A~w5$t3LAx1i5D*OLvcG(DJ%Jv*|XZO`PF>Ru+z6Z2jpXL~%-d@0h?bGYy6 zY0J|niHNWUPqL&R_X;v>!T;&_zXt!gpZWqw373d(ItDiC z``WW1hnEd|J830#zKcZKy;`@I!zSXDJt$e5U`2AkZ>)UpVqdnk9|K*Re zod=OlePw%nGx^u!_5{8F*WRxl{uue0$^+wX#{W9xiSq=(*Lmzt<*z{l(s!LF7oGA& zhn&uF9x{)8(TzQEZ{l9(W4>e#(X15n#%n2ckkb{;kFvb7zq~2u0({4wPjfpH|Eh_1 zRSb{dKZ;^r!@nNqQ}R?kAD{B!5a`ACb`13Q*YioHBTz11-$On}|KdH5zN=Ec=cCcI zYSIW;7uzK~s`@KEY z&-nbO`dPd2wO;-I?G1Om`lZVAtlZyL_=TK$^(z%zABpEt`|?t~`c=E{r(XS@eV?{o z{eGMa_+h2T%2lep_MB3kXU{XL^X)mKdcHkpRxhyUbE|ZTWhcl7m{ri`Tw`c6&Jm^g z$Tt2wM0?U;4E1mGC;9f9Ob`1{zlHmnQoe5k-&t-5gvo|?gq_%C&sya^10=Y_hlt=D zgyXZt1t!f$5#;AquhY38id3z#XTp4HK&`Ud@>95!58SgcF8xfT5dWR%C-Gyz{owYb z{o{^-bU&!w=jhi1fPY^Nx%^tl<<~mK<(`fDI!|%3a)hM&;!akM{2>3AQg%m-PK}jq_Q^i^g}sB_ByKw)YC^QOm%Z|G1NQ4MiN~G;Y4s z^vLH!+0f3=qn%bTg-erNtL(D$ClX&YZ}`5bgzxSN@SSh?j)dOt4t#GlyqX>KoBkE) zF^}+NZ*I2Y=+7^By$*JYc9!*?pVqt0>oI)}(*sT?JM~c5sb?F$j|RRE*;9BB&aXf& zsP{hs&^5aywJj&)Cp{3BI~(m~g+BOrEWfTk?Jb7b4ci^Ro4QXemjG>W-xKZA?~)&; zd&Pw(@t_}~?=p7M$JqhzJGf|WvU*Y6uOED2JM0r~B%f{8`_*t`CZO6g|`H+6;xbj@7WqV&> zKPKcGE?+}GV%JopYtXLU_A@ z*RMD_#d$*AQ%bn_hx)X7?q9keKuANM)Bc-+T(pI@;)$9dt)xR0Ow>*ZZeS)zmxp3My=xhd-+_r{9K(o6g=X`K)C-O;MUCQwA*7o;W9r% ze%7SabKZ2^?ON04J?-&|qcihk9@r$c7!SL&&!T4cOb&)3j&?XMsb6gGX0SkbN?z#a z_n->%{}GBQK8{}NaCF``U$)fk?Se>m@$KkOz6cCxw6JFHHsagxIPuvIM&)-c_I5|29GJbF<+gh~wKso?cC))3vAnzG^t>B@5c2L{ zjX0%+@w+2#QN-Wt?X*13d6(T!e4EEfC+Y|B`pOct(^_cd2fN*G=6sQy8|e0ar~bkw z;#=cZ;kjtd!~LK zgXb6+Qn@}1d(-|7(;@3e)^fh+ez^R`!=7H) znd1?c+#ZX#?99=KdwZSq&iXy%`6tu6BWNOhFL97|rKE@C*7&o-8mUr*;@^R07-n}d0tL=$<#v{Hq;v*4XAMuCmnc6G%zmvUs zj@hdVy=lv!w6@Kr= z&(~c_JNNY4=fA-e{bcs}m%xXAi}ra}$v*$p{7&|HrHvDl@t?Im`5KH>jX1a4U)>V^ z^HLvoZe4EAY-9M#n_~Xk3VVU^WIe_Q?l%}o-tTeT*unkl$@(aYOv3NoVt`Zr(ckXm z_hwii$>KXT?Rk~_4)<&F8+SPVh2IB1^nEnq!q5G`;@oTZAn7sRN#COlGdB zS9{%VhSSg8*pBz|bDluH(KfXG%X`9p9k+czIQMRFvW+qS-xTxzVqNc;mCG7#*Yut7 zRNvW-^jrIO+3p$el~Vm)IDvj&3;UYdv$wNcvaY1{xtk$>S!=rCJJ{{=%XI>D59@O- z-zl8cgpS-2TOMO?s=X3O2>0DekJV?>2<~!yZrdq zWno4i*Svp8$sVrz_G7V!lV6v;!0h2l<6m*F!!u}Iwr`Sl@F?i?bk6(dOknrE2)rh? z&pob3PoaJ8ngGuOz;nEPcD??$XP@0ZrS|#fUUD+O`Khzde~VY~C$rDL3_eWkH_JW; zzJ+~`@uaZNF`g9m*~gP7(>@<5+2_B;7)|>MGyAyKWmjYCLECSB{PvkMyvMUHdmHYd zk-x_N{l>SRT>H!|bkF4XW*OxjA%L5b_({4@k#bu19oQ7x)Am_h<4t?H}V6YHDXETBp4e@`>|h zCBJec;vgtO@xHs5SMQ2^%SQfAi>K=rr&<2ra+J5Gfi!br~ ztqJg42Rz67!9K5S<9Dz`&jS&E=C2=r@1m30*`Rx|PO;njRjgBloD}O6r!Oa3r}zcZ zKUt?JuOGkYq;~e1yM8?5+1wH9fpYfFo=$%7O4l!(DP=g>{xR9vZ(+_?@tQ+XP z+pkPX*L6QQ!Fh;<$LJqt8+!a%-XAd#=bo0udz69LAF*tX`PYN-{y1N>+2Y(s0C(gu z?Ni`=OzFDs*S|5=j&r~7srM=T7j|cioGhPUJ>qw;?)^+&_x*iLb5i>~(Yo(DAoow_ zd%52xo*nG>2E)tcq&=@cZgTQe?C-c|0=!-Wye9VFL(ZSV_l57B0MBK>bG-k)FzBaq zg4;^;+!}GMlek_!{rfq5{V9E4_{A5WY+MOBDb`7jdB2KvlA|6k)=7?7JY7$t9ZdK8 zmG=Q@o#YLqf3i+udY0_xI17B3*nfZKzAs!`8duifh&R_uK$a7uuQD@PDemEaVZ>*} zGoi&mP@7Y022PWyD0Yestsy_*=f+UH<> z9VaXH=`MG^7yERVM%>}(yW<=u<{>FPe|iS^Se!rIF8$f%^|u2-1g*_Ccgn>AJmDV%;NcIg{KQ^E+0`d7g&+8`rT8wtGmh(H+<2MrTM!Vj3 z{*mX#yDXtG=POdLK^s#By`dW+Tqa^;fTUyhiL{_nUC()m3 ziLQT1xE<*FeRO#6ewQ=cKWKCqoVD2C75?R{g%;;M0eB5NrhSu(r2Pw#Px<&3;OaXu zSHJonfKdKE*NK+sN972xSd4*cAP^04)dOYz20uBcT6I^?*2OU?y&FUZpyxg-%y;( zKkD=;-J8@tmw(vuQ~6z3(nIo#?ahYlXU(OCQ2V|M=XprBn^=rP@YuUs0tG>0=4(&=R_d}4o=3ww0OgFuc^A{RV z`Ta1H1O7os@py>v_jo!#(}<98Amn$7=Y z&wkh^kNRV?!js6)ee`7La(-YJnqBHmu>ZUp;wzN zKG8k;`3h^!+9QbuW_kO%SEezfb>Dr_?k63d&XWxNZp3$b{_w{g=iXjZ^!{SRozDH$FIZf1 zku}{=<30-0L)m%M{&lFE`Ivww*|0%xb zvtLR7k0$rIu-tOgCqL#|znp*htZhhTKZDP+wnp6fJuu7VWAJ{rBl#W6Ex%Uzh~pRY zjApMTo8Q4-b$s6fq%HJR{s#4y>C)R~FJrV1-!pj4UP?9N$0P1`fp&&L_m~k5!@w*U zCIsD!--hSoMH`;q1KaF%c>UF{8+_VdLU`Qk8Vy6k?DBN{O!;sGd?MXfAw&Ha-tB&P zeT~DT^F1#AmVWIIKla^)Og-HC#qaBU3e$hD`};q`^xOa2vlnRmV)~q`uKy_0|NgC? z{Y#BwOh5Cl|K-a}|HeCh`EN9ymGK>QH^}7WEf|l9CtRLNzj4p|LDtK!Ebv}H$moB_ z#Z!)V=sW5C8sZIeLsaT^OD6CdG4#wYCtu`;v;2PI9rfiOGJOT$)YWgmBOM0rcQ{4A z&-Xab&E|*P#xaF@N6W46501JyudIO?pNsT*?OGOtzC71js8?s1U9VT?*mzy9K0odO zeF0>g<$A6CdUd|tKUS|^825lKjC(*A#XX>XaX;uAZJw^J}Njlqo4svQ0Qz3)FgKpIn@2r%>Q;NzYF=JE)HfNo(B?14_Kd}8TwG? zp-O~oK36ZG8yAItGoQU@+}8uL`Ccx+h`mDjc~yJny>8zLmnj1mS#r^y?s?Cmz3Z>W z%OwQ*F<7R-{`Dhf=d&RnPx4p~F8qx+->3V%^VsK?4SBsBePhr)+oL$U#z22~F`oHV z{bV<3cjkkE8vhyJh`7o%s6+_-&M758>GWra5zAxQ z2kSTAxBfrXe4*Sdd*657LmYqML}kC|&h#I9_&xu~^mRXX+1+{2pXq<`nJ=$k`scou zeMo#@y2h(Ne{<_z@k9L;z0!Wa6SBhjIY=;uem5aq^#nh^h@~ip_9*g6R|eAYpFh{W zS2ELgv1WU{1@M0tqg;KO`{gOWFl^X*^C3Qg56jgm?&k=P(coh$7e`T^?e0R~v$)5- zKGhXVa;xvNvD{ZtUhw9Go)CA0ZRcI=`lJ3xuUYT&P)R;fy{OOl-zMpzZx-WveVWfh zct;y4#PK}|)BBp9z{coK7+`z8D4*<-`263CQ+P)RL2!22hm40mH*%Yl5O+YcC)wrMJB~Aqv*phSz>TKX%&b|nX3d&4Yd)SC z-P^tc{3C_cTRlU?&HyLPD3lc}Bq_sGB8^Nqd2edW`9rt`j_3p}Okj`#)Kx<|kI zfX54e>1Ob(c@5h|_pfQb!1{a^@vJ9H=se)%^d4}0%NI1Pe&h%1DLpp8x7|UXH*>KA zK7Yy%*#WwlKbI5ARk_dCje56wd8Fqz!C&1+SbpTG(0@;w-yQLHfvR^qeDy)+JLz!> zEPhwB_zQzicIXf}eFo+0y&#s$_Y7@Df>C;B;Nl4 zziF%Dl&=_Hbic$nm;jg7*~VjhS>*gGW8R_r7V~+e*@aV<-OBkKe&&2XfcoU^zZwnI zjd8aBzMj*Q?o~V0=}F&TpBm%h%mL$bb*gh;a+}LPQ#5~?c5@-=seyj*h||q`%B&u{ z`}O!;)+6dAxgsB_GgNLj?BsMG=BZH+t-GlnT6a@D0&iXq(mg;g%A=D!l$-rrLgy?f z0=Tm4>-e2lbM%Idywp7CXP48lWf9)szVPVX483>KW9NZm{muXm`e?R8n%DHM^zxh&rc@LT1Sr+dCU{TcL4rOPj)oirXyfEgr-?>>?*&>p$r?Ps9PSW=* z3Sj#%U(V+*AzpNmUb=F*`-J7a?F_+tJNZr5X$BoIGe|*or9~IL=nt)V!EbnMcePu! z!TU|!zUiG8`A-Xf#(lP<><`*6vNKu@Cq(u~75Sf7>omBaQTrzQhl?;iCo z4!EV^uW?`R=IlTwD}RH>Z}RFCJ@A39S$x^YiO_=sqPnb4%|WqN0k|_{MbNVSC(-bk&>fNGH2qc6_p{$30!}opW5@EeSqUYbXWCFZm4kv5P#P z@F_p#=*2ZTA}f2Zc6icvP9`_&F7^i0JT;9A8T^XV`*PN&%jLOGhvOF=>aVR4m+5k8 z)MHJIlf2Xru3F;*h~}r&nt(@{mLB#8@u6zPbjX9s>7DCv%HJA|@gm{(a+I#|QR7ox zKFZ*4l81*JKlQr$=__meeF;F=PY-1MlziTl@j2;{6^^gx?3iUQ(N4_o=O!faEW&(N z`v6I=taLopLT?AjVQ-tqGv8$(th&zYpZMj$B%kW<><2_ic_l{Xe;dPyC*P|Ry__oY zYdon=^oVj&>0YsN(&MWW+sNJT5A}Qb)&KHxZv=d`CFJEM$1@ilsa|16l;f-g_!aWj z8g)COJ4$Wi?bQC$OwXcS=~@k+ujTeF=MAz0DSxX0N4~ree69C?#&h@~66##JJ`{I+`?puNOVpkFW_1>H0fpjyS_?w_x z?V|a?zOSFr88pxb+YZ&`sLKr|xW`<5C;Oy3&-<OaCy^(>P>W4E@%@`|Bvt{-QgL%X6%E9m~4Wd$RfpKk0rTiyzR3-~r{Rb(}XC z*FzZQxc*z8_{1mhvw%0+nPe>Z;KW8`I(;~Hh3e$ z>W}z-`l%Q+;qv;gMwshQ6oJF>flNFcA0A`=!|>sCS^W;jhf6a!jl=!*L+4+<9@xVI zHpfAxNN;Oh^_bTMHC~22(u(%V%lm(#JW5(#9_8qm%ZqYUPkq<%tyqVo-liO|UdOTy zIjjHG)*;nTG#=-Aly=0h^~W{XAWGxJ!209od>->|5D6!JPCY=n!|iGoe>rqq{#Nq$ z!_Sewv-)?9zx8!q@|pelX!tzuuzddJt@F;X-D5v3U*|m^@fr`b{xEERgLVPOTedg# z<|pRB*U9n4zT1)T65o60z_&EV2ROPqy;>*IIwA4B7KBna($(QhAC8I~{@(#!aAmCD zX?>FTuFKN3ej_-o^J(5ncy3(?pZ0MWKlA&~jo)9w0+Z|;;XM*xbNlG8hve6KsQ5v% z2kbsnjXU4EBW~}ge*JVG4^%JF!+Fz6WTl-$2-f!(n$}YEh{mN~KfRjDP^o8J~>Z|diTp92y0)ED_+4`#4(_y#D{v)3M z%=VaZdsY21y@!0m7hT`RxR~B?oOZk`z+aAgY!5b7tKkCO!a5t>)H~bm-{}om?y_J} z-W_zl%jqoN9rN0ozvkuPqcK8O_kF?rk*Cd{zS8qgU*v0?EZ52h9sd>b!r|J&4VRy0 z@!u_<)*<`*@?Ng^M}D+{n*8{~7lY5pPse`CpE^HQ@5iN^Q)zys{>VFO>9lUQGw}D; zTXaG5uZ@43R(m+@3%8sPT9+Ez=IMHGWha&onPmr-r&xnc+dX~%xwGNMe3>z=JMKg> zrazXi1z+ovy*2`HOg|g{c7UIp@o$1pxBsH>qnv8e!_^f*=Q0oPME5)sKgX7On0P1w znxO(e)OHXnVe9i44 z?N8i6y>}GnBc6}?2%pwZ)UPG)lnZjQ6YD9GlZlAuc>y}@qtx{X?bki|`77k(Nhi*$ z+u!ADTFg&ATzi`PAnVY!RenAvU!TV_8#ce^h)MW2Bcfhj>Nk6d)%7>!BOfn!49TZ) zKCJ`S^5=HUkE4ynH|a(7Q>|xIx5qlp+E~BI@Y#5^!Rcc?-U&8zV_ie?tMeDyFRYHE zR6%b;nAjfGTP@h9V}*xBM_n%J`%f&F@}lvhi}RIqT5rztA0Yp{c(XeQ$NZPzU-h0i zM>gZ<2hzHg_V43<{2U+WM_R8W9)?@7KUKZU3(|R)dOpH$MEmLea`8)Yna1}R*VRs% zcWGXm*2#2kY34~APn*yttl#u1ABS`K1DPgAd*Xs0_YF5c%TqY zdYI+2Jl5xWrWgOq+AHCkFz|HFI;VFV;8lOTGyja?-Rkhfw;PN~ctlrL-`8gOb9%(z z38bg|=LH?=m%a^Foq9n-`q}@20fCipj++LT5w#^28j3~J0ML$dRP`h0e7iSCT0DQZmF>OAMiw!lB|T?vVRD^GX0x!Rfaen0q3JwQp7Jhim`pzm+ba6B3(32*g` za>QTSQ-&wXEtfgH-Fcp0_7wNgnZk7vYrl)4Ua{XodRb%b!w|2Pw+4}LDo^cMp6>Y% zSI^tNDfRSnzv=Zn-|L;~JMQK7V*KFzf-zbb>yEZ81NmnB4Zezx<-)e5FTTz9yLAp? z^7OE;W4&X^QUmMDH}nxDzB3(ik1$=g>0!-pSq_&99wYopz%R$Z4X1uV`JvNyZPf?7 zK9WPpv%VKe@7&%T{b8zY`E{OV-EF5>xI51g>pPI#PBi;E>eYLvffv-TyJ~vpry(aA zCztGYIQ92*UOVgWgy_ck_Z}+^C%qxPAbnl$H)V|LX&*k?Q}SJ&OFE z3hHai2YpRHje7{wO+08Rn zX2=ECpR7I$91y`}jx<%k;`qJ!(0Af@PRg1lD^g>mB*J$Gb+8 zeo{YA^Ce3pMt#-JFGV|-k9fbNJk$Qc_p_G2&(Ako#=4%@yh8i1W13e;4~<8= zQaQm*M0|JN4Hnk^e)*y6ygrx2_`UBygdvD<Caj02bc0~9`XW`#)MEECW!TWtmhok4< zEckPei2vDH@Z6>Gb5nDzH=j7GzAru^{K{GIOOFV@eil5x7Ct;ZSI>g?j&wNw+%yaR zq$A?LYZkn(PaF>ao>}lda2*c*@eH1NcLz*!`s{~?%U7J(w|}(WdN}xnv*7()D)ns} z9MC>mHE!%k^TlLG$9ei>N5}j~^Lypjc=gS~)4SB^8+fPTBOXtCg6m4jz6*Use&+je z)Q1-!i}sOdPp;1RL--fqeX(-4>!a$l&`Z0K09VELx#|AD(_Al=yDb^%?w6Aax9x|{ z^;V~a{+blN)s`;(R4$8hH$=IyE}(tUa#`rX4N>mtQBJg<#<%HlkC8fk|yFA^~MSeFBFZwjU(Y<6VFm8}T)kYuJs<1|k=BjJPDTK(TJ@CYyCUu{j{6VGE1X`v@7}x4;kDoK`h~6s z${8Owt3?i9#=V#6Uce72pO0td-bcK=hn#+mYpnm30Bsf*TZZ1dJRj{i(p`SU>s>zV z^=us<=N4}E`e`4Rc>WIKIr{dRyBKr#Rk|`bW7p zyM-Shx6p6gtm)qadxpnXi>|ivwC}I)*Y&-G`f<{Gu}+cn;v(+{s!t|9_`}&6!%a?c#qSa_FJQ0YW;SR^Huv2nny}L zHSbLOq4EBD`W`#pUzfh97H#qJ?hifj{?LC}eYddx-Qo4=#kw2og=p-zxg4;axUO67 zb-wr83yP5OGajF>cWgm?&R3R0yuXAAnDlM`ds$ylTL^y3p=t2_>Q$znTO%*<`-9Nm zSYm5riBZ-X8Hes-c&XnXG_u_0d99HZHa~8Syg0sxeMx)|8}|o|oay%mjjZwegGSEw z`-4W#_4|WH&bNNt8hN?jA2jmacE3++WSy;-wni>2U@jFoz2r}`_+I>-9S_zOlP5bL zTO(^NUGwFpN!M(6)~{KdYj8P!VrUj;4aBql>E57>fBe}jUOE8Jd2q7``#FPW&uXJgvZVFHwev{kdtk?aZ#1-|OT0Hm?^~wsp^09*^Vfh$ok4V4!CnY-1k;k_XPq|(Xx$bR208a9)^#j^@ za_m=Hm(aRUs}bW!%p-RKzKsk!AUyOpt-&8S+Rc=wR^zhppYQ#mvB>*Hx>xIkRs-TC zi&~8rdB12Z@qW>0$GuwP-Y*)bn;z!raMc$fF_lnEnW9J?LEu*)x{0QzpyymW8C zLR98c`S+(m59Q^zfSCDR&WXjtF5fKG!!FmP(!(y#td)mdj$K}f&*c|CBHiVdQseNX zRQo%UQ`L*>E*vnluh<$HF*#$pm)plfitG1QN#3hfKK^lDcrg3UR_lIRzf0>zi@s>% zR6brjgMOlW{0L8{ah-S{|Ge8O9{;T8f7rlmt)1&mI>%LSm;7AN0l=|6eir?g<*+@p zuciGZrtiV~ABkUH4El+8*jD2t=M(ai)cjt;%d`2N>O=Zx%~SB05K;E)>Gcu6a=y?$ zp^;U#?>OX(xo&ef3)(W`dJ@jMmvz7qnk_L$oHl+n@Eci=PeeZKBXnfY5wuXJC^ zOni@_`%-2;6X`6yU!Q^dQaD(`<@9hriuALmO~w9F7ks4?eK}um%Ig1($eGwN^7$B9Abyt{D@MBii64rl)_xiAbzZ3osCom+i< zTJrG5;A_)Pr8+%?ukgs4`%&K-pL6~l9LB$knH%(7<-YjXihESF@5A^XLH-GVS$k>! zEBGS&Lg#P#d{;ZTd?$N9^&_1F5&I_U?_M|UBte4V9ehzQf4K#(zA*k^R*8_b)fN7-+vkLa}SMS3=k_wnj{ zmd-=4Ji0#q7g<>C%lto%{F+ba^SpmRe2+#KoX#01y@>kIG5-wes{LQ3GyaXpf8%XV zfX-7Yo%}_0tc?yG`X3h){?}NZgWGvirf(1ZQ9obFadxi#gaDY~~OP}SJ%dMK}yB6vzlE`xr^mUF_=Pf28zI$BQeZjxZdUQ0n&Q;7sI~E1N zjlJ5uV(L8itKh5FTRZC=o?*J_Ne@qtdsy;zIDR})tKasle!VLkkIpr7K69`J|D!ql z>VU85sibFCdOFp68$Xl0-x2k2FOx^l(7D_bw9X{CozCu=BZTIq)ka_UV7*T~slRWL z)=6iA4x~SUcGS3_?>lhQ4eyAmpXhAb zEP{59+e_u%u(Qtac}BVS?@Z>aGicqT-|da>i_h>nlzaa?(!IfT@1gMb`C{4AxO}+w zf40`1%k%bhb(8c|xz+LNoH^HfNr~#&xtXotVfqsYGN#*zc@%y#+&SL|aMAn5MPK)N zW$)gsKSI0NdfbPA3@%^48e@Cud}f^2%-ajiWaAL&=J21g^I_{JHuGbSB-{JKRtFJ!>xhb_}p{v8UJjiM~tGc%=27 zyr0~a(LJo6aC}MqB23x2V&;U?fSraR*LSNmo<-`Ky;(#QL>z8d!C(X{_f z86WfUWv=mPPX^C={UZKJUUZ&4eb;#s65;f{Qx)e6t5wdgT+Z1)i089tAJP4dz{mIE zg)hnTWkyz^`wX&R)~|AZ^;zz>eVtZ%sfu;>bgnYi)zd!2 z9loxf_N~{3{h7{x?y>r(ed~B9rS#&lk8_Ww-x2$NtL}0=c>6B%(>taoJY!+f1rhGI zzt&Io8u|9!^VRI9AC55Wi`y997h&{U%7xzT$nPV<(c(0(W&8YmCO5tFJ%8EvEsfTw*d)yK2@s4PZcRD`WsWjos>yCWRsE-EcN{orlpSHbt{!Dl`EVDz&(zaRGe91n-_TXtfld1_~OChXxfho z^^Kb^vVyDilmf`->gZSP=vOBmTfeG8{w44AevtIvT=M@M+T-K3_IP#P9?wDk@BS9b zKl#R%OneJ|elz9y!5aTwlJhU@nI0$4aO%gh`_#^zct3&m>XX^HD0@WjB5J*h^Jdy} z^>I&j3ia3@eg*yF80^6>X5}*fb+Aul4{F>aeFx^4FFsz&|EpNoCmxV_sCT*7KlSHW z-_ZQ9y5RxSGkJX;Kt8?mrFv_gLcBi;254S90lM%%?CsT75b0#e7Qmlt0Z+FR|M;_W zj{#ub^fE@LbLwN51JFsIcX*j!gz3wUDnIOcvODr;jK=-`LBDtVLg!xCzQi#1y2ht0 zf3<3O{dJBeulJjV)LY*TG;MbV_Pvokcm1mqj=sDf99mxN*EoA{4r`^=L-znwJ3LH& zTYtp(K&N}l)DM(zI^;oeR^7hE+D`2?fxN6uE+2PMKH{9W)@O42dL{Ib&R>@^Zf{gt zC)0V3SjVd#d~`tmewp~=d_n%b!>>@DW4xi-+@xH~{?PY6 zl;^MEyv|gdqi8iQ34U!bKgYN0DDnM1@CpCaBR<|w&A5Hl?=L=H<@gUv@1;hL_3OWy zMXw7&vsi8bJQu~7a>^UFTIBc1;Con0*ZFFl!`6OAc{8O2<7n9RQxEz1o^oI0Pv@5% zuk>4WN#I=``CEpj(0Q$$Acpj)-qVYG9YWt5OvgI1)=6`I?5Xja{9$`t3q7CCtA##j z7Qbe4@R+j$a^Z4Zo$UQ#`VOb7S)5}(re?f;)HihHLjk`u;C;I->8Ytb!HPVXR< zGrwZxCO*!5Ji>0bl{3E=VYjEtnLmlJ^Hui{PJP(%=k+&vz0c{(_0VT2Ur|r-wG6uY z`pDbmNct!*Z>apeFUk-5S>LI!9lk<2-1E5AN9T^Z4enY~-@x#Pv+~hy7Qml;JfOs= zy^=l(eU;NiIbeA|g!x;uxWRCx_mo$BkD;F2>-^ic;^h|Bx>@;<^SL_T?auNcZ-?r9 zA8^t;iRYu^z-b?$I^P+r?^vqy+mY_`t?GQ2lQPaZR_Cv_^y;+r=1#Ap`S)N1R_Q=MOQSX*|(5ulDEoL5|<3_iqrU)4J%` zEgrscy|;_{?f$UyxUQDDU0Of>BMTZIRKq25?`tejy2c& z3QT8sYOjx<>AO8df)ul(;0?S7u6Ad=K<=T+yG2@O)Ve`=E^}i)l=EfykKrHvR(#jX zFrD5Ft6uHlE=nhydUEy@;e1EmUk`q5Pf6zH9)(0x3 zzaACyi#+{?EPXP@k=CfMN4G|odVNP%SUa^wU*hMfMqg$cvo*Q~bp@YC&++qAqZino zbZhi`%${qFuJ`j)qZj*ms?kgRJk{t%KTkFK{eGTm^a?*uHTpU~Pc^#5S@fZr_M!l0cyqK4PJIA8C1mi=Jdz--@g z!+)8LhfU1>dR?YRn#CoSAE-2pdRDsc zOXlgnJuBVEnLPdHvvl%{nx$F1Vt|gHtie$do3^?FeUkC*jv5>#sA<}4Hr$&tIDJ2# zKQ%~pVa=3N|r}w3(Zx#UlXyoO%EI;X?ML~JF zJd+pp!>u4x_W|VP|6@&V*+rXnihVZU{;CE?i$L#E=lDKVgY$EFJiRp=-_O_JPB(lm z`#HXoYxN^0*-JUxeKmY+GS>UQK(OAA-*gOLhX;cc*7!a(>FIn&n6A}W<$9;_-L7{U zuZ(k?H@n_x+zJ{9SH(HbU9NW;?{dA<_+XsleBAX;<4;ZRh+dAz&X*gkyfl8rcO$ty zw~PAWLk4E_|2@~O9=^-$qB7=5y_-C}Z_hqy5gK15Px<#8=VD&aEq;Fh4lGLVQCNId%qKm}GK?PDZ#mz8-RN=qOy^(v^z1c!q=)@>7(Mej z4;$dmPg=fa@t@2mJ?O$i=`njLlY@_%9B4k_cFmw1{CmSIdMF305tFyu@u+9Fc+UWw zwe!suZTx%|c5An|a{$ijo5B5^!R;D=LzB!Z_wxo<865exndy@joCWvQY+a`>S8m`o zMbEhBW541!%l7{q_?^bzXqW1SxSuTenEE3!H6!0%@U>Z7X9y)jDn_et81I!}xKq#*Yh(A72c99Grt6FEsq3 zhxKeDCa3EI#*fnm;Oh0f)9Oj<$>nc7eBsUU{n*fY`ub=(rwKY3GpwG^)av;HtLL*( zPhTgfw|g3ACxH}>^{mtX2BY84kBaVL?S7rXebvfid$NTDpV#v(L+k1H#`fPg`+IMf z*str4|FqILu6JVm|DG8CH^%rsKgRzzT90qxJsbA_R%1bo|8I`*|7|h;KN#cxFAR+T z(o^4Udg^g2_elDKdgG4_{$mE8>xo^p_W2m#j%+7<#PLj-XY*jT56fAJ{N2J8rS?Io zUzNVh(q}9q>7L6j*f6v`9<+ST;%Cgy>ruA@euDLw(+;>dl@HPC%L4~>IM!p$(DHq} zYZgvNUVeStzuU^6Yuw*$T#a+8;9QlXH!+*2>x6SbkN&lRsUu)@jV_n(Cs3ck z_Pf~NnuRam= zo9cix`$@os_D>nO*&A^qb=jQ{?ggyz9~fF6e+QvI&iTCnlxsTO_g9TOzjQxjHSXyeuhY82jK`Bsu2XTH z>#o|m!k54(@4J+UgYiK`!~d9ZoT&J2=@Sv6zV&ryq$Fp57k3Ib9v~0 z7eXzGb=&lPj`OYmU5Hi5?01?H{dH;1;xaizedwsS9t9)CFSSz&pXYFC|G|qdmc+hD zF3*35I+b?^J-eNbbPxa5z%%VW%l!wKoMWYjs|P$^DmUyPy|bwH*E?3?V>urAb*^W| z!<3JwXn*XDFzPG5t|y&3A3Evj+!uMYCP)7rvRE?9O55zZve_gX``t8N|y%vwc;Pico^s3G~5RO+h==-Q)>5DBr}}@w&&2G@p&A9jF9PX7igRy8WyaTnmJU${NzcO~Qfu(oIcLHuTqILius+Qi5+0Q`%PVY#J z0nWm0_jkghCB%F!_WQ8+`|`f3xRHcs6)=C+gqEPrd)m`ZBzUNa1wOdMDbA zbZWhcd^CC|4Xn_8pM+~8D!ps7&C_*{-v04`54qL%N8OC>}O@*ayXVh27b{cI@%U2 z_Or5Z;!iH;ZN#%3>8Jh>@b5<)o$iO!Jm>%P_vBmi<~v`|{$%-dybG1~lgBODzNdz| zI;8u}#82w){QLaJAP+A<7TOaRWaAk1+%61j^ofUXbXDLNzPaL+PV?*bE%X13dH>`k zYo1p8(Y*J5{mK3EkM_Oyqrv;O3~&8Cd(o%&>RA6*gLcVZN{?|PKQCx@!xU=@c<^&I zeCB@`4A!`p+n>*1T_NFP=MDIGz^|7leb772z--(kZ;Af__~oR>>$?$s&#L#*>))MF z4s!dkI?e5m%Ec?$CmPR0=Ro*;FSq{PL_TiP?o_?W7dq1Y=kPUdrg2-}Ro!b~#jyLE zei;0u-Jts42GAPqTMm+U2ea+|Q>Sr3)HQwz6f0>VT?SkJq z=ezK?Pv+Q>Np;@f3@Zsnrhdbx^fII;tRxbQq$eG?d3VTH555oEPj5H~c^ATo*o5GCLEf z2KB%)M8e6Q(Yt8uPwh;fr1`Jx+pR8m(i4kMCRNlMF8^cW7A&Sif6YhX4MbIEcs|Le z^cc(gIpz<%&BE7P)Xus`Q17=b3A)$Cdu`1BDDo$~(x)>{2j|14H@141d?KalZ_Lkj z)4Qnp4n5(UjC`mE^AY}^k%2zPvpRpC%e(KN|23|kvh~n@!8get%lQJ*NjIJ7)BPps z-Rko^J<)xEhwJpU7SP&6eK!CxTr2LIEHCo*>yEgb&ZT#Co;T;;)8K>FY4q-j&ZAJj z(&@dGrrnaq@;zSodbfC(_5CF4OQD5p*{)5-mxxdE{27O1JKH?(W)BN5@$E*G^tk3* zy1%Lao|^MR^r}6oc;{4nW;*^)?|+Hkw0jsIZr9?o*y}-myr&_2q-Q3RALVEK{w#iA zoCYr9ZynbnS{t|M-#F<4uXE)OqZuieJKa|#{4qQn$l-c40^pV}Xt;hrI{r`Ziaw0?HNL_pUt1%g_u{@&(N%5q_0MXR zuP4YJ(Y<(*uVL!~X7}wQ70^kj7uW4_zTSzjBjF)YlPo&w=bPt}A&B4ehRG z@!3QCCH<;-R9!w)AGY@&Sh=&;+f9xUFaB!1=SX;&@8fge`(TDo{f6)tLm#AamRdd1 zI>+JYekIG<ljFLFdKp?}Xg6@w2zy z!#m)$@lST!|9wZ;`62uB+uj zA%Nre<8;I~4`Yk$2I-Tz?v>Ja@7+er^2?smeGy|Xw&;TV1KH`_%g%i+U>aX05M+$L zYtnf7ZU-x_#a;)U-eVs7pojTgKF2-L+bQS5>+#*u@34%y9zH<*x!3u|`tJoV^qrNy zZ<0M*o#zAZT>3S~dk}av|JOb9#P9mr$3K1FqWw474Vr(XcdvIxeNheLBihZzdrs!y zI?wZlq#eayE8v4QX&piDzl!c=;rBk~^m05GAJnepzDG@-Nca85mnSW(eYs}w7cOrr zNCnCZIV*1?b>1%g)!FR{W$Yv7<(l1apMfX)h2tCZ@jUuXwe`8ZkavxDyswjR!`}J) zsrc7+K|5UU?*ime7INf`reIDHpq<$tjkiL-J)Ezy(Xd{2R?_`a4 zINfhwt?>%zyQOMP?028eQc>;^)`gNDTIukT6Y_5fq9pfPuPe8CePpMN#d^NC{R`?=27%8t?gl<(vr-<6gf>m7bRa4hVg>03Nr>jRvx;r~>Q-UAgM z)4S0ZK~UgyPC<6`l8Y?bQt*zVcBX$nVZO__r?~eBYii zlI!YSmYndD}$=%a4zF71Ak*x}T~(ugd$e&4;2N z>piO8t^M+r;-~JzDj!k*b$!qs`MmY#D#o?y-7f!}?m1!LuC-V8E?8$un2cK$x1J{3ieW$;o|AwslSUbi2Xqq>Fqt|_8M{<3hq|2_kKH7f=;wX8V z=c(W3`$E46fgBcpDw;;|S`Qj_Ze}f-blAC>@3wfC_QRcdU>)p^Yb_~S*z>3fm3~BoKrig-qP|>7WBGk@eQtgD+t8PZP8un2()Y1c)uq7mX3=^foI#2YNVJ(W+U*dMG^mkq!&sXN> z^od8`!zup+;&S}r3(NgDWIB~AzQsFOIov;Ga*)2=evB5#;MfGWk-yj%Jwl~hT_Ln@g;vHhj3FV?$+>5`k zqwvqe_gHv)W4^tZw7oHI=QXy+`#G(~YvVng25d&=zuVxM-@|uB{_nJVH@7#|*!;NF zcum2Z5?C(h%gy2rgJV7q@3!!E+{et3dV6EF-&fJNBEBPQSh!hKDIeGdJhw-_)poO0 ztMMv(8LHLz{$d$YSl)7jyT#yGo`|W=W5S*9H99cJ8g!ILBVtAUtoX(7R=X_we}vzsBz|f&8MI8-LhO zbZ-UWJ?sjNVRUz-^AwEpn{uoBE0|8JCcOuR-&CFHJt+L9-0A!b;VDisgNb9`1-F> zOUUqx@lSe_`tdVanD!<6%LJH21AY6*39k1>7P{UW3B8AR^BPF!dg)a^?X)3?edJ%G zXYuo%>cm!kGq3gd9y$g7y$s6;%>(Bb-HRIlb?Z8ic)*89O_1?%;CVzzgXwCj} zx%m%KPRI2g^08$I|A!fV^26KZ0}0;r-pD4CU&3#y)x+ibo&?W!YK^?gt>O26 z_a1|9jl9zJ9`K`RqvyA>cGG)_(}!uJPOTl#e5=k!wtTTO+Txb|d^R*5JK;d>mo=PuJ4P&t`Eo{(Aiv z?(NGP<-z;;RVn@68vQQ+n^XE9)cE1`du2-h%`9E>PSW*s4X^X@l9cbdp>%IZ=@-`W z`}pMJ2l4-7E#2k(5kvW59U9vhTq30Y6;K(N45MHAU>U|cdTp`QG#{YCDvB6LZ7gVxIMRpzfC+<)(S`l*3H`h&9^Y zINioA+D~*^|Ks`sIja3PZf~&M>URI$IA7P|eq^<1@V zMePK)J{u3KMGI5>7qfMoYEj%HGvoM37xxWx4>s|l$$&TRbNP_NX+Fnwl(kto><7mI zgzda~rmt_vSE?WNFWP&^TI@u<+wjE~!tws&3B=JJm_8x)Cm%)tj(oEH+2FIjKji+? z_hsdAACYtu-|wN^{CiH@7m57#y+y_k!haf!)I6Nwm!m?m&w7s-8O3~vh0(Fw!#N$T zoF5>9?Ls`ak`5nkY&{QA>Aqa@G3OWgNcy>sbU}^27iIJ@-=e%c7*vdYqHD zUsnIyYV>~{c`27GfNFZt7o4sP?-z&{>2$}!*M9WIZNodZeEI zgMcL*$guMz(?4|Uo3@>Z2srlNH@By6l3; zgV%bG)|s^bN4p+bVAn5jJ&5B^J+Zs77HN-M(8Yn!k2PRY}I5zGAgo}o3e()9+2 zU=Gsp6wV(=U*vjo7v%uu(-H1w=oRvL&wp{9&iE?sBhT|aihR|g2dv(NUzzbu_dQcC z@IUf9pVB(@46&jQB9Y(O>U(p-(@Ec#=|1$wgTK4X*LT4K`fAeiTYW*k)_v>ik@-H$ zehd?m=Yf6=dfGs_ZPEQ!?&0M9fBn+zakDP(Y!K3g>V5;{eUJ0u_D90^b|C*K2jVx| z=P*CC0{``zbus!d$_B>#85&p?P&E?43F_$B6|3?k} zaP9fiK%;gl_j-L>Bfo3;^gVUn?|v8U(JX%3(#iKf1&QK6{XfpaI#0{|q;`svVz}*% zm}k$izDT|KWTuaG{~_a-Wp*v`qDaW&uLfSNGq%nC;(8(N+g9Tm)1%CP>Sy|VW`4I% ze?IcZJiD>l=h=-3pJyZABiXp3dj<#B7q9a9HQ@Kv%5nSs!%>db7q5)<#jek@k#B2O z4(W6I^*=^FtuMYBb#{IGN40Xu;%4y^3Et+}Soh?7jrBiR!|(I7_a%7pv(?z-^K8Ix z8;YNrk#OH{`mhE3Al2}Hxd!j^+;<23W}k02uJrjf@Q>8sy*+jZe9XHWG4BTa?KS#+ zK34_&t7CofH9qeK{H_{)=cf&UpuZdIi&y)+8}OIZ@H_ll0{?{BHSTPWc^6% zxXkx+wS3O^D^tF=)adl|?@#Gx4o%;f(x0y3_j+EM(!Vw||3xYNmRf$Vm#^cJ{;@xw z-H%=F*QWeME#2iX=HJNw#aVngJLUV%TDdGm>$fcTKh)@Ux?YmXjYy6cT4DSe`b-`geT-=OcxS~~Sa(|Vhi|M41rr=PvZ(|@^^?)7IaJpE5= z_&q3Z_el#wAY?B zIN5Fa_|ADG`FTNxm-N34ajLKAOy9S!ae76k&XsHbnfX2q5amCbeaTP$Vt-#!c>8>r zUEW;r%EvX6VfO^ct|wiu0?!_Ev`G$>p6n(cX6+s`n{Q8g29Bqz@soId5h9=S^NHZ+ z=8T`YJwVB1Kl^zMD{bN4N;5~6Kx6T)xW0f7I^SqMJ&P8A*ob1sF1R2w9EVKAB_@;gI9q4;Z?_9>e zsLy5Q70Y3ul49EN^mSgoem=C-@QHr8)$6D8*6F*uMQ$JKJ)nW}vvEIJ-fq^u_4(+{ zP8ZvmBS!k(Zm+NBq<-;Mhtv64wXe<_4xTIad*^swkdFAT4IkoT`r*x4Sp3&_)Z)9o zk2_|*uL!=cVCmR<{{JxFIbwV>`Mw(X$$#GuQnBXYVmpS!jFeoOtuc$Rwx^q%^2%dAa~v(#XHJoR(oYXACo)YMDFtMxhJf6*-b z-tM}GK=4i$D30@09^hZhlPWm>L;oEScl+v zwky-0TCZUI6aU6>?w$-U`STxvGjD%ZIS>EyFZ9Rj{&yR$cXTgVHO^XPdVQ&fhn@3! zKeDRchdWm@0Uem&&U1Xd7l+Tu7TjaNMS5Gu(R#vs__&cI$Day4Lb=vDcivuqhI;k9 z8bx;j7SZ5_!Tn{9XSabB!^WLIg#pHPq~x+3q9z}I59J(gzk=tp#qVmD6I5*px!L07 zS-WTLmd>?;M|6o#XLwlSjNVIbHBPq#-7mrMf^G-sQQC@2St!~K0f)^yYxG&>(f_Jv#{td5(=+*erEdI{=GuxG}S`qET4FrZy zGq0#__jRRweVz7@^o7<#bNlJNkehrQJ^*;yqqFR%X~$1F`3Ka!YpWw!yYKe&T)r#H zcf@zG%RvZ*bGY3ZKZbqp_SH<^FyGn0!+oLlskF4*ab0?S7ABoHpbaF~^>IY}p!~Ig zVrTfozYF2c$uW)uzqjdL9EQR2&dJCCr}HzyH-Tu5Uzfq(1%G-`+)smkLW}7#_y-t& zd)!NdFi~osTm3`!+Urktfs@1OQLn{9Oo7-|p+|T94leqFJ8__yz~x;8w*wI-Cr`5ssR15H9!vJ`t3BLs7=JXW&mS z>hotF!Wu6J=^9?%z`Z@dZ}h?+);_d%$>}n_ClLRa>_#Nqx~Uj>oaT|nwR&l zp#L$n3-c5IaqOqArm(k0ZbMFn!2P=%Pt1oBAGTRG!^ck-st-C{)eaN@SO5M&^E{Rh zv}ycF^*qDzslJ5Uf-b4?wri_vsDI2q)Lyjn*MBxD!*bX9JcRLAXZoR9>+^Q$^J;C( z&)53ALgiHN3BC1@)5CFy^AytaD*SF)?*+ehdAjK5{xUhB{wBT4e3zjf8uy#HMVdJ| zX0Q9oAuHuKZu{Nygr^*5YJc1+ml4v}SKge}ll9=r&3o~WEqFBf%UXVFyn24p`=f}b z&vw$eh%(xzToLkji_;~!;rQ`j4L|jO@JoKXg|B~>yHNmKtHD)nv|F}sw&iVEd&WD! z`FQ2~BYTXGdHf#Go3F!wq}lsExje*uwHkM|P9r+22fdy0@hM-A(DzB?(+OycZgG*- zL+3ZkyDf4RS<2fv~pkuRjr?5su4euU8Hyy@Y)Uwdfe46`!)hf4JC^t{tmbLe)C#>Gps>i*3vwW18YSp987vx)=^JP`+ z`wiKbt;+?PEA8{;`+|2Jg?t>1JUju~q+fgY7#mXmWWPm|;+{H}uljvOl!vE=(82gw zdT!BE&Yu~_PdoXk&{OZifTRA~U#AK9eE|=p@eKRRM%RC|uV&%j82XaR1+LoYda>H* z?N+S{`eWTE?}rDdH_q~Wq=Vlli=M;fBRzROR4M5p>houFzDREeKdZG~ziREE{L#E^lR()p69oy-;oX$mF4)qMg0&@3+%lDA>I|#f<53%wF@A97W zH=n{?S?Wdm!k&$Nh~_-?e)z%<@;B*0;-b zU-`eazQp@vHCV5l?m8c4wPUPn-Irdi_4ch+IX|Sg zWM|OsqN`Q~|JHi@GoD=Aw#wT>=P{~PyNs_|zpqx^=HZh-81XE+%fcL|=xE2%>AOGL z)%YLxh&$Xgl`X^ZPGWhA>*I39@oIdoZgBd##e~7r?q)&dK5zf-{EZgh`+#{x=M@*( z550Fi_CAl-y7H3yJxnoXpoiX*J# zU}fRN=hi&m&(i%G+9w&iq7TO`@w|P}i})6-C{idqx|c)ySDmZ;eoXPBcd6s+j*J^U zV?Jyb;t$^~VL6@qp(Jj9GF{3N-ZQSFhPVxC5;RxEA_pw99ugKTL zYu1Dmy{re5${8*>AA35D+&H~76hTo0j>{LUq(v=dIr_I=sEI5bIqTgB(Be66p@ z9@aXI$|wIw*Hqk_DmuFjw@cNpr?z?rE3YSYI9qq`YV&(OUAFZgmS1i3`c>C>f9v9X zW;&fmBi+A{*~P5}BH$SRu`HhTp``FTCOU=*nchdgKkUfw^Zu)Pi+Ny zqVoMK&7ZvI9P_7s;sW!hV_vZB1n+m-wC{Dz7mbc8?51Rota{SoIi6iUYn*(-;&XlI z1^z0~e%7nRd3{?Y2A{?jbH-qKg)^PKPbddUIME4h(8Xg#r~rQAv==#O#N z9}{RV>Wyy01-l%#Pz|>Ut04R@_6RdzJ7U&%X?YVqgto#7JqGg(fc!!PsyX^ z{gTTx&)aRqVI1>&UNtUs!yZZH-yG#<>pH)Z)l+&u^(WQOtAly<9~*t*r`l)w!O(*@ zJ00b8^y_^d=DGPE`qi9z@Mdq}Oh4&~u#dVUFJv_I z!HCK4)Z|Gi%pc`--j391~FD(U9xC!vV%7MQN;iG@Y!S|;J=^S34f&CMdXZ)C>eA0{mXMG>VeGb|i&&R%q z^3^r^=M`{<>#ng3pkaN?=Kvmm9Kb~L-&8> zE%w>K53m^HRm=FIe)R1qZ+x${E(gaVcON}Qxns{#dDKS~t?3OuE^-}Ju8kkn21+-^ zgNUy-v>8M^1fKpH*VEOw1qboQz4ilmH$G$fnR=M6y8WPqtJ{6PQE44L)*p4gLhk@} z7x?+8^1PLnzjfT3%r9piH$3ISwuObC#|}s--!o%X%I7=%x=*@{^`Gu2rHXPz?E$#D zy?&qD4Z4?D<4?D^(cyPT`a3K*OTTbl&>!b_7y#FdSR&~oMWn}k6wh_v)^WbT(=5K^ z^?EsLfqC}v-*0|iKWgL^$j_Ece2DW@T+d<7a+_tt`wrYa%ivCKTX=G}>)maOe113; z`&@dTbu#vYG;d7f>pQ*Pt$993r!a z240kxIDg2CJ%{`^Q(oT$0yyC*H&`&;uT{l*w$?|>-7cTyJAGcLX=?)NJgC~&k#>GJzkShDn3 zZ#`2X50Zl)Snv$PE!?X@$N4XBM$!K2pfbXgXlDzey#iJyh8pR?5}|rx{v7J!p9#$`F%d3!@!mAjPfTfnBHeCAM$pT zJZqjp{<5CEn;bsLF(ct5@8V~YM^8@Y()2EX^v;-zwY^_URBS$U<3rsz|30?G5tJWt zy{qppd%Gfj-&5Alo5gH%P!8!-zup58zQ*+z$8&=8`4HpWrAUA)NgSN&O?abc zLCDj#wx##(H7~uR+o#9(ITAe~Polro_<7X(q(b?1o=1Et_c@*AhrB;?{zA>uE&h}7 zt9--4TKR6D)#bTceAwVw54!RZ@8??ASRC&Ult-wK#-Uc6FJhSd(0L^Bsk88bS>-j0 z4>-Ni|5Sf{M=?n6Jr1vXzr((pUKnyPn zd%)!tZ7Zj|3Jng&bw(E5ZJcPn&Yz|4Vy^La*LN}0^Mr2}KgjGw`C->@y*F48cBl8l z^iBZ!5nZ}(z2zNN`;*e+NiVy(Ta;HtKlwhdXVXs6!hVNbu!l^Y=ZGf|xDeq@J6H<% zd!G9ofAjHZ2hh<{>y@6q>2CMS(03fio8f2ON?4K zZWfe6cfX%DY$kzH+cWKWz1R3`hm~HjKbmjEU-aV{ z*W+ou@*|-aKj3mo`r3djAMt+BiTPCdaP*U~`?P;az55ZAmEI|dcirdOAJP3J(&J5> z?nH6PUQju$1>S$8Ka$=FJ#n=5!n!R!znQw1(&pn8eSWuK{VU|Y8Q&p2S9@Wu{W|Se z=>33Z@iD9K63H3*Bk8DaaJ!{7-|hVt6abo{=!IU`2{?vjm-C%=hLtb3>k*A{-SH`Z z^&W3ejZ+#|C!g}t6puwY8qd;u9wA5R{+Hb>74+Wcet(?z@vT{W&D%Nf zsr**sKE(IsQs-mT-gSA=xX{HZA(lk?=*owqz9FBBsSp@{lyr)(t)P=((?^qrCh?(j z+S_K8i+gV^Tz<&=hu+<5#e1Tiw)a!^E4sxaPM6MG=pN~@rJgRhsk1%I^?1{h;d349 z00_G=-hu7Kc%yR*y|(Am{X;1}^hOo?>$~3>JLo6FIzvHJdwGe5AhF4#ZLUADwExir?(?L zr%(48=^VS>=T*J5k1G2`@BgZv;{Wt%-cHl37+n24{eV3c{Ux0@*8X_#Lvow&FLJwP z`ULN9>YrHOdWPkdZ}9nlxjpWA%lOQ7HT4ha7vtl<@H-X1FAnx<;PLzC%I$vNobnO= z#{fSS{bOox*jZ#cTx-My<1zfE=%)Sjy{<<6~bw`xC~aza5SUyV-t>tRF> zoDWF$?@Fd3{Z#koYPTdO(+;P0oIcJORlUpQL+#3W7wOQt1H*LFXPjid_Uk3j19HU9 z4kx>&yw~wdFKV1gbVz<4^mZAb1Mj-hB|27lJL}wazTfjj%2kZ7vgar#U!t6RIL3u| zSEkkQbr$t!jT1UYP(JMRa9@@bOwD+?tp*eWoc7NrkVyGyH9}v9{w{~?(;s&KG{ynx z)w%ZjMdy+CP5;64;{?Y6(3kqbalubk0#5B%#W_-~vz6z2da3<|7?0C<8TDkloDNW} z1F>DnA<47asaw3z3Re4;kGS22_sJ|?^A?@&7`wyEui{+3+P{kPP&zlGeUYhs-t-75pHdE<`xr$6CVh8mEK!*hHHqJ-i(6LqCn5x}R|e5}7{LbV4Se z)QNA?YaCwoI@dkOpWeA1zXNbKFABVyuJCxSQ$B;Ao#lT2O2QxZ$pnfq{AUCnAUzpB zCrmtHH^+RTb=*^k#r!6#H|16Pr?R{9bT)|iNO>DUeyuxJ4<0y#WZdI5-{|J~5o%K2 z?@rfh{IcDj&2gKSV7jjxaBsG-+iR`HFPX*4`$C=0o z%r^$N0)7K-Cw$Iq8Bh6n7(Pt%G>)_yw}VfxXFv3$wR7i^yOD}^ZTdV!?+h-!)9rlS zr>*wVdRQ6b?AVo-y_kyn4A_I9*X+Tw-sa`RK2PWJTP(czoopq_(QW4Ip29l*YUATZ zuk4{EuQqVl&reyr#vj>n8h^TacLI$EF~YxBSw{BDHh%34e>?g$DQPu*oksU6xjsJ0 z#;4aIUFXNdk5<#)Vd!0gL^$dN612U!*xHfn9(0d^4?hfF>nHvE=SR6OFnGOx!*Z=( zhkTQ-ZNyMM=u3~*>FJJkkP3PM$NESQQ!npgc%SpJ-214v|F|m>!c*={e}m@E_}K^{ zjClMX`#U%<6LuBjDThtFU5R`<&EQ(i=UY7M?di`anndpo6vA@Y4>&^Sda{kM+T-oZ z5r88RqhxkAvvvq0o;H@`@G;0c9m^+#_^tJX`G~ZBdAWgseiQ&lc+y3D zTnS0{(;(jJkN8^=FMMi0$y@o*v&K)2kKJM|paK6*^V0fL(ql0`a6PKPn!fZC`O`+s z&hVFy{0zuF(cUd49nInqD`)It1mMzsYOJ#^(R^u->+vx*0$e%c`4*qZQG|F}hKKxO zPiz)HoWeI-xUz8ShZivy#=q0uC!I6}KN{2u>cc20+SeJd(N zpY4(ChKF1)wML!r&IR59G)^y$cQVyK6MbH-V#z`;cP_o4d0k&Wc>Ajz+5V>kMZG<% z6EuHzUv`!1I~I1tRM1i9kLce%^0&kJ6mmj7JzL|`x{OcSk5BzS%9UOuKVO#3SGB*D zzRw+pK(l_&Ynv}Sf%RU2n7Qq|u$PPbEg$y_Xg5sy@KJ0(KI{dcXFqKnzs}%V$G_a| z1?+RrvKIj7_5!7d@aMU`aQqshqjmghw-@fUWRsJX$kT5_W+xyYi<*FMc0#0U{=5_Mq<1XKXLbVeo1FmP>;(81 z0`6h>W+!|Q0XXSJ@l$pr^`z?y6adHY&Gey1*fQG3KI-umh0-3O{Mq>W3StG{g6>xH ze5>c+`08KUCw-6nHonHZrl0>zYv)$;d4?yAudFP}Rr}02zSijJjxP6nlg#hq#R~X? z`ojCmoZ}<-#rA31?X9S9v_JKRwJZL7Q^rTM7ajS=7SuZj1LI@VTXH~n(#3X~H9jI9 zB5mgOY*#$=)A3s(bAKk9eI;ZsXW3D!e9+eXuo1gz^ zJ3I>vuV1|Zzd+A=^DK?)Se@oeEuxC^bZLJ)=4G5$va>G)GWIJ1(?9dAmd);^*#*ZC zecfB4b(8%eM_Lc$^QMQs{`IdD9^Ti--pya=pTJB#aqX0cuXS>{DnjbE{>U0mUH?LT-+5NGw`>A*6WRH!#%fnMYneqP{^&NJ;KF9BMwZ6pij`q9rJ(lmF@ioWyDB@)ovtEDkwf;Q;M^oR+zs>9W z8^>7R>%PtFyCj-hU~dhR?@~9M0v@_1Uq= zvCIFF<@gxzG%?~&~{W9p(c*XTklG=%Vc&&$arI%c-;T}vMr?kIDEyI5r-_xji9<+ykN{p7~ee1WuCYyq^_hyGmjuUqq4CWG!t z^N*hHCB;GHXw6?*{CD_0ueNpH6`i-ag{R`Zdw4U)Q^xi@TVvmem-uk*1BMf49t z;`{yJmn^^LS<~-0$>^VcpX;gWVlbTf(T@1Ps6ubaew3X>JN@x&T&11$h5y;NyR;uo z`xT_xIW*3ndSUl2iSekj+zs;O%{y)1MEz{Z)uaM+pd3=vdB<)GYh7*v@x;q{CY{Em z#ix1$Xb{rOsPjqZ#klTb^@)0nEhm;fJxv=` z(EitZJdg31ehZ)N!E&}Ak2PKJg<-m8eCIkA_2TeFxcR6rzz%gs5dpUoOhHtkdsyo8 z%4Tty!A-?{fcu74e)x|e)yhBaAH95oX8CTpV-!kNR1D_?CZb55u~@T=rqw zmk2%3n&;!F^7meWOmLkIlqQr9G7iAkx+}+n|IK*NOQ-T%jZeEC+Uxcb*Ry8vbKK#T zuSem9!@EnCFV%Bog~cnZciL3%v7lRa@&xM1a(0AIyDMLhDalkgeUFjk1#u>?@J(K~ z;0N5bE}q5MW)HKUvK?s;ntnk0(dizEX7Nu(Kg-SKphu$Mt_^y3;k6#T>ipiuMUQ(wn=y3u-OPT_oA!H` zkt;ws?&V0^3Au1@`ftBjp?tn;1fc*mfB=qSTL ze`xB5d=H{NK5WN%m>$x#kKY-&!tyN+xoKjAq^nN2+{)AUfYmAwSBussItWL-H|t)= z6Rvi8Z`f>pXX)t#D>}=(VLNF)>2|Hj$@BZ`g4LpX96#y^QH5T4!0`>a=hfsQ*0-p) z=&D7#3_hRFZ$^FfeV~>1HkW0Gclk-@k!K8z$>(~@_v8S+3oQPC#S`DGevs~ObUDlE zSZ#cFyRx&?3D&+{wf3eyzB%|oQU1p9!|OH3kEe_dt+V9xJ3r>C_h5Z*GCn;zz`tFH z@5OjWd7u31pnWNM)_U%s94|0ArXHi~QCQ%J?}NZkAKszXD1N|o&T{>-c&X+!?n};d zxu$BTTtE3=`*PAO_IW)VT_OD&(~V*W@|b=N|1so0fbwsQ^Jo2b-r{(c0T6E8(sA?i zeF<#e9+KTlJd~8qYL^#=>AJ!j_0IDXa@~3d)cjK4X;L2^$mENBx&;M_U$UdeF12FP z_r5wuu;dLM&vBXcOYrA;yzE(ylSqah^7wlD-MHmh;{)MIZ|@w3(|6#Vi+nw6@iMQs z=9i0?Ej7TjeiQmn=RE8C?%PK?PDk9&KY?-LLYBA9%j0}w3B#*B%yuN_Hnlyx9DIHn zKbysJiy(fcPo0P#a1;1Pe49L&_S3lD!gT=ITbph|0FLv4XW(~syuiW<-$@_@j&_yd zJK2K84n*@O>9p@<&hmKS_4go70)0M@VSmo`F~=c(U#)W(Z0APa-@-1@d6K!#^=}`2 z((DAuvCbh7-;2@CNq)9CebmQnxos!B=@4T`$1eDt5ikIb>13IWljxeA5f@~}v#J&k z44oL47*B|5qw7hvf3@f~!_Ru(l*x5Ij<7#}>I=Gb|6$ytFMGD5^_I;JCp&-f$v%&n zTEWs$e%Re(w>sR^xcjt!DNl=IoxF+lW~OvD`@E)e=l2?*^jM1rb>T!8*CD}{L;3uM z2&OJKFthtf!Rr@#JG0+2EW52Iy7zfImyftz(XWTouY0ptE@O0lsD)06U?DxGc-=c8 zc+NX%**#|ZfO?7A2s-Q)=Gk|KZT$Qs;OO7@K7S|XVf}tJu&r_zP{kR?d`zBc^lsuZJiHZRFb-KJlP9JO8)@11jswaOV>K^)P*X ze@%J*ToZWUw-L{EEc$HM&*3-iD$B3)qX^S!U6IoKJC`Fr{5JmW44-xvdm7gpEPvQv zT7Ss%|KOV8`Dt->ln?cylV06)ZiIurO&3KN^~L|irsW=%e0H0EX8licO8xhXfB(M^ z(Vl1nG?zD!ob+60sgEmpzRiCzJm2QOJR!^H_cJKp1j;#xb{r_r$;9_rpEz{z!y~C5 z5FXdA9R~i_554H|5i5`UosT~!e*MdbsE67J?+kx=tbbmrzE;t*q5M_z5jpecS^1gF%E=YApgn5ro9S+bubDuTyKwgw%)M|{MLMI zdNZ{!LEYm+{lc!lym`FsKWe>~a<>cd)DyemcTVwpfv9&F&vt#Fc0TtW ze1Deg-}L~3o4`Liw+?z&<9Daw<1Y0D(_{yz+;@kZRf}BD=k}x3FYGPRS1p>Yf3;su zI*E#OekQ+n6ZJuo&5wTv`#I9T-;Vs=dW`%&|69!O2Zr!_azMUYpz_$|TjQnVT;tt0 zL(b1WD!%))9M4ssQ_i8% ziskc;q`$ce1ATrN{r%KGXZrgp15f9G2laToOOf=r%lo%NzQ6O^jL#o^j(m1`{?_sN zAnZ1cm->Eq@+^+(utS!)yi7nCVd53tc|ISez1v2(|6XgvV{oS7u5p@n!%rZr?e zNBhJ3Nyozj@ht5y<3-z&i)0TWzu8044<{hMq(k##+Sk^fnoYNd#y!96jlMnP3F%&7 zCu7jwnfLcLKjApw?dR(dbN2V=OmFo6Iq5yJ{dRROmvh!<4*M<2J)-?qqi?`|3;RxT zaX9P@pX9|)ZbiHb~&a$nC|;4$K2kR5S!22O&;eRtvtFx zCA&xG^#}F0-#6cvOTYK`-%jU|foGVg=fd{5=srI;}RF zvwu!2^w0SXPuKp@3M{S=UhAkj-=*^!6G-Q}=lSs80DQVPYQ=mHFS*HzDe`x&Kf`(9 zWggG{Clp!m{M~1>dC}N)o__ti+<)VarS@Y7{t}+@!yECrA2=%?!gSYfF|T;z{N?t8 z`(C`~etGkAhYlV5YLj79t5}Zr7q-Fwf7yEv__oUP@B2tzva_5(h#4U#kPrnj2L>Blx4b5X$x*k!7cxSy1=y18afb^f9noF zUDRFhT-Q1GE#22IHnh*v|NDME@B5rK9DT3ry6mFyA%Z2^=;+Y&f_cM2Yo9!I` ze2*ixcpuA2|3<}R9-yC{s{Hgmq2Bk}P4-Ut(Ag=Uh#QWt&CGjteC(q$|J+Ugaq>mK zMZT2(r#%44n2-D;$l-W=<}+Xawzs*yj-Tyr z9>;Dxe}BDU*E5$cLPyVWYJ8Yi<1p_J&xd_8%2Hw9OqYj_UzZ!F<9XxnE$IEOf}Oh0 zxy!4r7jrIG{5#IZ^}}!T_ua~zyA|%fAr%$fms0m()caEU`w%@Ue$G$L+r;;u+y_j; ze$jJ(_`lyPdYI~n>q$Syz|05xTb5&c;&$}1(T;l5ee1$^;nY5_UWe)ZTpf?zALDv| z^rv$Fmqbp#I@1`(^t>Lwr>^ghaeCGn_B|)4_RCI)4*mW0#|B*H=S_#HpXv8odEYHS zDvqa~5}@Co(f9xK^U$pS<{u4zGtZ4r_n)^*-(n+uy5H%3Q9*^wDc1YhZ?|85BJ_JM zJzc)+clpr!F=4&EO(y>bmn6u z-&KC3yN*=PrSSa^56SiOCi*>Y{k@~b^I6OBx%2e{ln$0mJKhnC=Ww`R^1Lf-)Te$f zEEaX`_tD8oH=S+zcR-!>bNCmB-0SJ*@cI4pn8#cyu|>EO8&4nxp1d zd|&u`W;wgjJN3^o;yi@&!-tMve{XrdcZ&5Rx|V*vRm=5vWAyt2`u;uMKU_S6b3@}e z#n1JyxWRp{dRmmFhmH^0uXDTRa_0G66#DrsUQ~9Cn@Pzs>UzYGeFSPh0ET#754o8LO^>upn_a5~7fr~rc^45O5@I23*?)^{wp7{ZCqBh05 zkK*O?wto5#9s2w4OINtObiO)A-Sf1RI;(c6|DM7$Tgg>_xWeNmSdZ5ayK3h-2KAFp z`O_EAa0`ydi{g=Azj%h*AUPb@Gwa=wV5|I9i)X0yw+f{FnZ9q&#q5kXB3>({p94HV zk#QEeo$-@IbJVO+)eg z%po-EaZW#v`+!QX?B7;O*NgVYvRtPXo|~)RPLb20=QXF)&b zdv}hU&W`*#CmLrThVwtaY`*nRvgh}p_;{?_J@Y<|tDo!Wc|3Fch+8bK5j{GvP5BF1 z-__Q(M%TpL-{5)j!_*%6(DMNr@d}UiCdu@7*JMA)U$ss3k1{LlB%p@MiOYq7PFLxD zs(MxNZYy_8=|9x&%MN!yw}blIT;1YA`e!-=*oY+In?wVfZbUDEaEx_Uj1=)d=b`I}AqJ$&fr$fbVl zs+lEjL^6JA_b0gVKX6Ds-RFhobh`TaB}Y1bitCN@!|j{>mhK1J=DBw5UGACvrA}^ASpK9;yKgD<-AR{^s&_7OZeT0eTIjVlyUX1t3UfXdy z;(X|FO+SyN-+yF1=SR!A-H7pC#m90n-W%x(Qh2Txp2^Koewdn*Gmh`3Gq?A4z6c$Q z)pNx3y;rw>DBcjsXL?or9M4v6`*-R`wHN(eKGQ!s^`rWSDR=5;9Jy0J>R8CI0@E}FU{L;BjxtzLZp2NC4cat5zuYBc-DXv_l zSI=8?`EWntcBj{edR;m#=>)SLJKsG|>v7MQ@k0xAboRSvJ?^xg>E`ocx~@|%E8K$D z;}GvJaXu5hB;_7>a!tL4k- z}=cJ-QxR5Bs}wUHyG1UiY#<=V!up ztlHb|GS{B{itrz*-{^GlILe2fuj_t#1v_{;3jLFQbGa-ob;tk0^R(=A=-_eH=`X4u z9@<}KyMDwqclPJF-gLWIyh`~K)gB6dYJnS|NA-)IW|uGKkI>S=`&LfB-C;I)$+2^_KY|eSEUbkEQevr;r z!&&a%_cr&>`F^#ozgXJU@1tmJ`uC(dYrj-O%>9i{&LP)f|95?>%cZlUVQFK0X={7q zl8#Oi#=5%Vt%)wXtKE(@HrfZ8yPE9w{qc^yE$s)|+U+h22FdN+jAly5fyHdOG*Vv|L5FwY_UQWprbb zOF{)XqrIcEX>+?nN~DstgOY0Gh;iIpsK_azj`jnaV$Cgu{L%F`wzYTfYf>g>$9r^y zR9sYG&6NGi#OSCb=l88`t8773uhguocGjaxBjO5XK%dpTK6qKuQ}u5M_y_9{tFKs^^bF|`O1_9 zZ+`u+{*gOx_=n1zy|J@_l549=Q~kCkY|i4kRxWzGl`7cY6Swzu#A99Y4!f%<)@ENG z?`U5#<^7qT&;HGvo@+lg_Q;uQJO@S|>RP;O^Q*J2{LyWP&!7D{Rfa0wbuARWv1fBJ zujP@)@Bir;_XOAHJr7+!<7?$#Y5DI@ogKPwXvUMbZeG#eYv&%fm@!OvTplD zE3SO=OOL+v;`KLvWd1E%=UxB%ubo=G@bH_bTr=r{!#?`LTh-T=-h9Q#Pkudie*X=r z-}bEZH$OP9tN#3-J@)<+>b`T>Pn!p?5}tk2Uk-fsSG)G#vG&?u z{`}SOz*WnaE&I~LD?a@51wHS3@1#Wh3%_{g-5Z0qZ@=o&(#OAFH`vm7RQjJ^-u%!r zkCcop+@$;8MCXLtgO+mt?ChelUD^@vjCbsJnmBdUmgYSjv5ual4ecFq*Qlkrf%K|_QpS7M}M*G{^qvEc+zg~?y}qW z+IzV5bgre^i`y;nHoLjgHm^^=8{(av?Hx<^#mR@O)y;Kl?R5#d^8UDOwDon} zT}|yB&0W+~I=lDoZEk3$j!Mqz(s)~^QUzU}eLx|=)58#M20i*iD?l$s~OAoYnT)H&T66+!d z-@3S~y}hLqk=hMecXln+&9Jkp(P@Rv?Ms_m6D^$-=U&If@j!BbDlBdvXlieX+k2?i z;vF%2LvtrxqQ_?IIA_gi*i<`I`fZdcawBohtlixfPbR1a;*Bjm|HsL61`yS!I;h_N z6In0xz_#wz;y9}NwK1NycGJ+9Xz7uIDjCwq=d{@kaUQ9<;xx{7cC~lJ_Qmba1PzKC z;+-_6ItAnmHj#KoE4SPBwhi&N=6Ivi+IkXkYRs*%u7;-djx*leNW)h<#m4`q9%HxB zIN^-k3#l%sCy)lzz7Xb@SqpK2_&rzPI(j<@z+8l&1`t?`C-Y8UQU!%nEH z(4U;4EZ)d7N?x<`JeKFWP3<%&bhl9|8k#sh${uAUPE!Wg>*(;U-Cd;aA@{>WV!ZMH zxOxj!LD%gdUr4^9k(*+ylUyfv5!-E)YwgZ>%ibl4c>L0Mr;F0 zSW4q?g3i===sH{u116>O{$^2G0ts}`@tS^ zA7_({OUYyDyt!q0NbZ){J88t*+uXsE7)nE7Iuo$T^VG7dq@w8PNwhb&by0fh8aytY zLuC8iMDsN_)0COzXVA6RCz{Xfj&(F{pv=&W^is;AGdJV@!D-ZeeP?rPym4E17q3zH z(D~(fwoo|j3#bu0^SMS9AE&9%oVjf)U+y@yqJriHdVWYY@kW|Mwzo}SsW?C+F*$cP@E^xx)gSHP&%yykq?M8(P{s_55-Ii$bej+Req>ytjvH)@bSfdN5}eXasgDmkLO` z3|;$n2TfbXk5-$|0@@w8DLD7tc%$y+JGx@zp!V(RYHpzsI6_m7t_{jI;?5|Y)=5ib zYUk`m))z9vbg0d)PFhIo{1zv}Wc!XiYJ7w7bEfKxyol47>sw=;G?M9RtlwW--_>5f zf7yiXsSw_oi5wDqIR%V63(E;E@9372_i^S$^)%g_@KSp_;_=JlOWjkUJ2uwS7{e>n zcM3-f)&u`WDBWY1HaIz>*f;NMqXh{~qY_-ZHg7D@l!o_4XpZ5`TixXeP3dB7jWjZh zpXEZttrW|Ii7r?<7bCNCnrWYfeYx+M@r2+lYp=_Fj*xUB1jULCw zNtE39DTaj|Ay)9b$KL49G3>3IcDk}XG?dV)mGa^21=6ljm${PPp|Z*1oxFax$yqub zgo96D>?Xgk$yF#hd;fABisDeEWL%Avx)^P~aw90+ay5kZdCS~vP}WqIw#QqY-3ada z)V-Y`s@BWo5{$KBHASPsebdCOG;vCnZFzOGa@-sQBn@rvFls0gj=3re=9F>OE3gJewhd9^%A zatqg)M{kWE(3i3IcC@!15}-L&Ofm1zh^wenkvpV`MUUM{-p}4oA)Kj`+5237qQ)f} zka!jX9eO;ILkBr!<&03{Mj*$^@lA^JzC+WfB+kTuLhIhU*3If#-EY_KXz%W5h&vks z?oZbV8=D0>sAE%TCz9NKTs`S=if!DH%FVXxxwi5wS5HFhM#@Yx?fBU1V{Hq%XiZ5& zBX8&|S>F<;T^x7w$FSF9*xSa^7}v3w1;mcHlQ$uuR9*So7Q8Yk7QC7c@fvfygU7tL zJq}HmS#kBe6vJ`cO@mX$lmR_N+Ro~dR<`jZ?bPtD&RV-LloeK_yqb8s5V}{E!(Kq^UWe> zt5OXL+|f708>o-Abna+s?`~;4BYpwhBoKEul%r5xl=q-{!^+(wqDgO?JHEKPyu4E2 zIhSJ*@6uzBn)BJtrY~({t9>kY!(*e`MzpmR`60S<(QV#gp&c|Q-sV#wUZr24D8;5guE=E1jU4H1) zYo`4UUOMV)(3nL%lZG(fhb!K8qlh6BoMmrJfAaAA9Tre^A<2&7(ggUG1=vGKWGflo4)x>3; zyVTG#9i1Djm#6P+Iw&b^_>3zx1YN<}-R&fSw|iBkU) zW;>3MqKt8^(Y=^LR`qRKohxc-&i1@Jg2ZTQ)6(49T-cs$EN+4qd>kj1=etxBdL5(7 zM!UgrOmw~rWgerJp~FFWsiJb`;(BdIh0~$#7dh)Z+7Vf-w?wG`kex=;Z2JKh&X$Bs(!`Tb(JD)yvh5Cu+fkyPn!)M`VktMpc|z z;TEB)$8BxoXt)rpD^r3Um#r%Qf>rS8(TagRPm@;zfJqoY-x04;|lpgBn7dSe=_h1&O{} z6Hk(_D!50{zG$0>_OH5Kf1%6hoh`lmhI8dXX^u<7 z2(K^QJ$AbBr`C$=^dfMH^WX`shdZ2yK-|Xa%&qv@8Xlly^Z-bkUFaZAZ`4<(fs0$1 z>P$`uy{^|6aD;j@mEt3ZN%ukAZ6%sv71Q6jL{GD5uD6HEO+53_8cQnw==w@+3obx; zLZzk64*f`jy@gsAJGl*f2a5Jm;)QvOj_Mp|(WbK|E~AAq`kg$E#nrw9{p2nXbN5yB zl9P8?`Kr2+)8y4@I)%JyU(NZTaoTlc#X{jl4@ax#7`BeUC^+tN&XC&B-r7ndsFN(2 zQfDY|I#^*Rv2*;?%W#g3=m2W!t8=}FHg{-zqPy=j_EL}B-%L}UCF^+#?i2?t-uPxR z8K_nE4mHL*Q_v+&{MQN~5}=1u1R%xy4Uow0jfVc{qZ5W1~?^Z)4m|t1@Z)HoG>q@+wqfv=nyd0=jw9 zE=-4R%`^}1=%Cur^Hu7}Jb0g{8ldg?272hs(5u<|l65qxbw(h*gqt_rOdapU4bpkm zMUO?!jj1l~4OAE%OA6~q=$u?Z?ml{PJmn`zSk8^iX$_Qz;+_+2MDYrPn@6*|*m5g# zeQ|rB;K{V@2A;%kr6g|T0p*?T*Quv>9P>`HkCTIhDg4x_7;)IAmZh7iu5$;KX>gP79zg+|}5mm;^^-&O_MYG!}e0H&k92#P>J1ck}$2 z_J$}L-mIlK=wT)jIZIO`!ws%$rH)Z>Cc3#B7uwuupW{47;`Ah{e}15Z+Hp&BBEjnd znhw*hL;U>qZkmm$d$bgswWlgc6WKd;M+ybhum~KJzL}oX@NyQYXbpiN>|85M@Ov3X=*yH zs#_~}NL5F5PYu+4I$6vfoifEGiL)+ME>1_euX%r*YmRDO?I=?@jMuQ}$>l;5F6+p#E&Xa!I0ICwoataook&}N^W z3wDtgq%9VwX*ciX34g(+g(q0t%v;*q_ObsJ`zMay;ti^pyX>YCR6T$_pVNHR5bm}$ zU08*Lxiceb5!8+NW^r*e=D>6R?N~(Dae^0mU_r&c&`sMR$)N29J#vXHCnu&t1WvyG z^{^XgaOUkZUfZhiP7UX(3fz6EBt0}kJ%!ziQ&{J4xjL;1o1a^*#akM?wr?&}(T<+h zJ@iCYp~hn5do(yPs@6?g0(xSH(Q|DSt#o-%YPhrNHse&8Q}cRB;J9TqjVX+$d@r8z zMNaLIfoS|Sm6{UkCVWV!@d`wh=7LVAh@BL=?W&XZ>Ua)$;Q}4sf<=0t$!>03Wb<>1 zi|hre%`UjOSSIJFJ^%lWNV$57G3k-MxL9o55~D{fX(ZVbYl*cr(9^AP+WDrTtgUNt z+24|c%vJ&zDHm@ zPj<-rBpi|X?g@w4eCTuO{~v!?_&@iEB|P7fmpCC=SCx~LHobX?x`uBRcko~DQHG}hT-bDX*}t96i? zz4P>Ctfk%wphiwwF}b5XML_NT-^iN218mzZuKRIr)vz0HqkHKpdRim$`%vl$a(4ri zM+4UvP_O4Z>CX6|_6KR|#7J{LcMHOKXycvUB6+8`h`1b`A+S)IZ|4sjpYi`_>!K%1 zJNPj(^Pyx;bKy>$dPeEc7Q)XS|4$z3vjP8OmvFzP^FJ27^KF^`x!CD_ZmK2cnFQ*g zwEwC51V8J$S+8uI89&`Q-b>po^a@0*MO*RoX*{_aDaTW7it{~a+U1@=={`rXA-*?8 zW4MZk_R{DHEqecgrT|@M#A(!TbA#_YhZehq#Hjg6gdZ}GcQ|R|C$M;O>pTYp*;A48 zOCYf}%9q}#*YOonY6#raX+gNX{ZjL{ic#E+cV-TH>SR>pJM~{fKmPOMTye&rZ`hCj zevICS!Iwq;1wZj`_*BEm!*Jm=H1ZPe(+^BB*JIWZSERgdf^}d$z z+Nn)<$!HbfY~-_j!a--W;U-KIeR?f{Hb-LoG!qNd+Fq~Y={66&h{>~J4$Tuzl@i+6 zaNicK*W(u((48h4yUbMas{{Yq%ewFQmM$5n7BtbDxSMH$t6#x23cJ?mf%RbmyY@aw6TBY3x*S@&?XM^;)3Hh@nvuW1i0T+D_f}JG9x; zoI7F9J=G5U=O$gwuvmC~i7!yUr-vHMf2>0l9DrL}J7~8jPV1+0sP4k_Xop*){G8?% zeguFXY16HGU0V;;;|~4ywkn*Rv3(n9uf37{tCG-GXa|VSp!b_Vw5w}xupnx8yd2#l zAg8^L953(q(-wVuhr7+?{&e4$rP~wj9X;K}SE~5kHd>wX3v+a{K&P&-amSmA6uz5Y z2csvz)%{zsAHxfKXZx|Gx$RPZwy?8vaU*S((wdSbypv0voYuIstZY!*oqRR&1D!oI zyg1JSI^am1eFC~toJrkgzO0*e*XSO+`)WP84vMvnw)6Ox<6_v>eOixqGQ0Q%C4ND; zSv^J7NR3hdc3vFgCub-{lrtKLDJgC7E`D{?DFwQr)z(NG^2N)yw6`ZX8|2mKO8^u|5tsH^BBd4=lJZN9tk5z019)!+FRd(VU3uTs6|nSU*(a#H-(y)I!>u zrj18dHMs9f#_7eh!i$qJddZP$U&m&=9cdVK#P{;vB|UjV8@#-KOgrfOf~PY~w9-?3 z^h)TqPTSv3w>6!YV;36U)a^=+e3#jXx6!n|gC6qUwwGre9X-XNZe#miXLjN?%yp_^ z@{L$>Qd?-3P<5tFREym9NO}%!k#FH9x}KXT?It^Ils>tjTP53`L2Z&YGn_WbzgfmH za)adGZi76R+oOI6hvhdbO?UpIBPwCv^=hcBSUs1joM!_EBaB2BPb;#=Kj#}S8} zMpwMV7HUg0ZZvMAn*v4Y2Hia9q8quEh+w03-GjIAAS9!d(RTOZ@suS-q5gW*_t(td)CAog3FdKrH%I{>Lv%;76+EpE?ctP z3D6Ncpe9QC#c(HuT35e6&aVI-l8_j$Pido%e9b<7W`^#Zz0-T)hsM9R)!ZWZ7v7#- zxP%|Bpe#6L>i(o#Ne+=KrOk3$4?BBwyi{MCh_y94kDAfe@&ej@jIOoqE2~Ev5IuDbs-@ZTr^-mIamvRs>cCRs~iEf`K))f!f;IWwpy| zSJbYoT~)ifHdwo6SzuZ1vSrJbFI%x}<+4@FRxb-KTeCc{ymt9A`mo)KD~<;s<-R<2$dT)AddU{&p^ zWviC2TCr;7s#U92uL`bOvpTT4cJ;E=%U7>hy>j)c)vH$rSFZ^Mg0;bA!R5gf!Ii;P z!PUWFaLpP@;u^aA8j5-i1zSU+aWm;okNpeXcfDyqpj}b7>~xECHT*oDvzf%>rJ8EH z>{>e^$%%K_P8HC=>VO*HTuT+qzYw=R&1VFq=^<&RHonyPAcONn4bO)8Yft}g9>yZ; zfAgpJZI2Q-O8GFZ#7`^m#~5hOsJmInae?jf(!#;i!7#6lW!|Mb3D@>b>Nl07%v^r^t^x*KlnJLYFor=7j!@Bdh`^z@4^u7CO3n{K}K1NVR7 zt6%%p6W{*M&tIXxds#Yt#=_batJj`<>gKa9zV>EPe(9@Ud*VA!J^jjmTcuN`I@+}- zZ``!`tV*WUW^+rRzP(^IA|B+=&G7hZG;y|;MNt@l%qZ+-j4SN=OcW%@?iq)%P@ z;3JPd_S}#2zrW_X8}7dM(Z{~^)0?+$+kO5e_1E8g%NHJc__1$1 z@#K%EA2I8~i{ALln{TCBFZ=n6Q|Gj`A2YlD%J+Q!fvdju$Pu%SowMo8t=sA@xagAi zT=nH|J^S2G^S}RdN9QeF-5)+-$^>yCZh*>4X&GxGee=npyB^~YWPV(HZzd`Fj-Pe1tCsj1JD z&8a+ibjguEPwCRq6{Qs=o{I8{=~az!O$Rx+vFGj(R! z){3Jmc2{`IXHAZjt}mf)@0Lz4pEh}I>FoLSc5CUo=BKh{S7%C&D!=-lCFfThQCU-Y z_~gSUzpK2e{HXHtD^4ogRJEvda;c}JcG9BKqsk|hq&`ckrM2gjr0({eQZlXNl!~D5 zq_V5unqK2uI(>1;+-Y;CrEV;}`Xfh9n%VoovZZAwS9qt^RHhz1u4{7YM@LOAOTAT= zdU5g}ZZBC~dGMmcQ-i+Lcgw13PA;h`5BfIwCYN_jI=1A3((@}**VG(SbwuTs($xFQ zKXdowS*5jimL7cJgo?>!WvP3s5B|BrW1m<~+M7yKkCq%=GHr@g?(tCOyk!*?UZ1bh zTU9p6JGHdhGu=C*?6B#FduDoPd5@fOOxbMT9M3$@yGk$hK2Y)n?<3x)z0Y``o%~$o zkGwzjzTnA~z2yB>>8STLJ6}5H{aeZ3J(CxleA?D+x7=~ZC$G5Swhw>m!LPpe3*{A+ zt4=-bygv>y1NVx7R=R+UpnW`O`n%+OhLvA78R`fq&QS={xVb z`@VtCef5$5DxWlY=IphnZ#?(j`@Z-6bj6WJ9XJ29(|`55*Wdcq6Q%a?^H1D<*ASe{gl>5mmmLlQ*s@Y4BABjwqX3a&(y| z6f8ZvY-wp#MP)_EUQjx@a#hLNvZE?WCs#x^uU&QukhR+{Q^&t@ zTVAzlQR%GIS59f%F*#gWwQ1wgVc(7^n=7hPZ)~cXU2^8;)g@DXRpo0cst&F?vf|{D zW6twTTQ=pIkMHfCl=`ptZ)uovZJ_#yTRwgDnRkBW>NOQ7mR?kTLe-`!f7xMIXD*DN zUAm@XdWf6EN5*{D{^-QYPyOoP@@bygy_ljjB#x zV&UOKDZ9_nPS&ww#*!<|*Z#(p_aoukaq6x~Q~q@_ALM&j)8uSyWm{J)%7Iv1>+3 zr%pCqXH!~M`KFR-Wku?{^Q*2cpU^=oM_tcLPV&(^ zJ9;+Jn}Iv{9+WdXbN=Hj-gy<|4CD3P33?|z&RkFP1Lxx**Oc1Utz}W`;=|I`j9K=a z$#!(k>x`$rpDGR zt+{he;FwtWkH_A*CA1*W6r}TKwu}5DxX>Dbt zr>4|XNu9jxq>@v7C)RlE)fAxAN8YKT$~)V$mV=l2$fU}9l*j8`L*Ag&OWx3PthdB7 ziMfmnJcoOaAYVb&6t~Y)QBvhS)^jq2olGJ96g|aSQbw+%!aK={m6Jpl^)eshT|?>9 zSDEbzdrCbNxyR=@*W<02?Azn^+*|^LSQI_0Sc|CVA#ndiIuj$|+IaBfX_1 z)umJDXSrvZhh8}=ne9E6{ulCkDtsRAq)HF@XivBIIM4o)Qg5ZFyyPcT2$b3ij?wEY zukv~Vb81Ti#AP0TzdNl5`q*805O{u0j=PX%AF#QQ|Z@;pA*D!IuMwXO1I zuT|=)vb_;6jpmg0BfVvwk9d!oF~xI&@5o6@N&=KOuXllGJ(axIJDKve)U%vo^?J)F z-zR!~p4Yh8JoM3->gsCxl#%CU&xhy(qLj;0e@Ut59*W=cMoKnKsx7_3vufHx%4bzc zEyY>kIkjY7na6jUXR>!iC3O=|eF+yO6^iF}Pl<1)Q?ee<5uT|PC1sEMI5V@jRH?4m z&g1pC&scyPnyDi3+H=6n*2TP-L=`b7t{4?5=~VGml^U}O0T}xXUe}-Qj|}09qP4Cj1%dz z^kya>|G1;lQlBlhen#JA)%WJ!{mDw_Z*j8Cag>hf{DY2(;>*R|`1t(oQr&}x`ruloIoBYx%*{j%QEe+AvtBuIZXMr z6UeWdK>lNr>vVRcD=qi0NI212w-8_A{Fq=0s@qr>k-e@9j#SE1BpWXtmLE?4_;`S>TkHOGz8$UYP5J4hKU3M5@-LE1_fu2;lp+5m#joq1 z+uSx4k16Le(B*8(*OOfP^sFj>Q@@?`x{OUZj~`m@yQk9mTkRxr>R<=|pabQ){7xtP zGh7p=ZnQnhwf#Y|pQ-Hm^kHJ%Cpf=HC|%;-O6U5Fr_ev$mQk+94^z(ZXnBU>S;LXg z;irEmJHO~VimH5GC;cKN<9?!TO?fxTHz*rZevo9F#*u$`0{e_1@1=HctFWAZUH+z= z#|QT>Lz5pf?9V3oY!&wC`zoEkxxjc9{i{;)9VB0+ew*^^NzUcK$0zBZ_FpfPT&H0R z$#uIk<@b|Z_gmjUWx+RaAJAb<`BG1@Kbi8CB%exQ_&~YqE$DCFQT%!wV7m}8_kVr- ziRKa7kF#tG>2;kmpG(Z;$_Llo4Cj|+jVga*>Un(QHpYi3_fk5!Z}4HtM@Y_ni4RkL z9?5mTzXH1;=*!lz6YrpX{$+!;rIQ;%f zYq|T=DF^M(O?fNnb$y&k_WD}f&a}NL=Q7duJ!C&$#lOq2zk}q3F^c5cFQ8oeg{R0~ z&r4gV9CeyeK383YTp5oI@~&N-zI({=S+$Lv?W?QZypIw#e6V3#Y`=Zun%>GKX(U#-qLWv|ae zJ6*k54&9VPUFN2IKgo4pH09Tje2P;l-mznY#C$PV10{KTtzKH(uVaCIL zOw0FEee1Ttb~h61IZ}#Pw|i6m1Cr}G&-4e1_T2WS(LX*+IgcsY7cV4x?Z?g|xvn!) z{&kWsrGI>w^68ZBd9GN<>qxHa+_b-t$R6@{|%ClS6?jW zxhx;1{WnRjeILrli|6qP;{P$pb=xrGVflFZdU=9)SRQnfDbo21l8={Pmg{tGq4ueL z=ocssJ?@zDGOG9S?D_B5=yq$`v;1(C9#ih0ARd;$gW?&;68sJw~^Z z?QUgn%5NuG)j0A$lT7;s(|#Alug7jv-azuTDxP7wuAZBIm}It+*JXPl=CH zcBY&+4QwS(Q1~O&Z$4db#K+^B?#HJ5Hj?Xfnexw)T<6=Ae~sjN{$k4CAi16!oASSs zT(=QZPP>`~e}i(}eogs8vL8>*^{M55qx|Y?(Pgb!Uns8QnZqA1t{a$Fl72q_P{#$t z+Gn!pJ;ZahlFpwb);^xaUnAE3pZSNNf1OzSRMuBLSezd+pF*tbgn0+CUaK)*My!1Z zbB5Tw{`ZI%vO*nyCf4nWMbo}0^+96odsu%7vGyU%2Z_z_A1Bsz%KFEN&Gf!Ntos1# z%fBSkKabcf&oHrhy-SI8-{tUk6K~=l>i7+@?w>50{^iPo&tMJ_oAEUe&t!!<256pZ zYoK$I^k(^fm{^YuY&HbppCdN&=Xt2Iu&2iMhZCFSaT2la`>el^*sQMu#OD0rCSo(a zpCZJ;bB>SA!6+_*kli}Szgx>oBrYsVlzEoB-V2m z4*v@1|4OXK2-epO%KV3kwU1~00b)I-Gha_^mS39KOz$^=Um-TrU-1>mClZ_Ky%6|D zVzWJFh|T_+B{ti~FNsg$gsNluS7mwm!JnK+db7Sa5u5dW5wTgmz5TL%UPgNJdY>RR z`|CGB|0=PW-br7R*PBahUT+oXw-B4<*-mV>hhAc{y=92?7|%uW3u3c>Ry`uicM0)o zU3hek6Py0(W@0n`hlo!z?Egf((%^+(m+9R?tk;5U)&qPmvDyBfBc5!;_Y$$$eyvAk z`sWdc4Esi6Jy&A!Cy34Q;~T_g|NlMk+{a{kw-TG}qmh{B|N7`BK1&0gUxx70hGhHj zLwj0D`csYY9mJ+TyMx&D_k+Y?!`}La>`%4CW_{NYuQTjFN^I8GQ^aO@yh*Ira2#yX zH>JNjhS>BEONh<(yPnu=?=cA9L2UYy>xs?le}&j=UxPGXFw6fhq&Lgw_{U}Yy?}U$ zk>6fobNu=SvDsgLMQr-B%Kwt>YccS-#AbT-5u5(t1H|U|I6`dB4`zK!wwD;OIX>J@ ztoI%`8&6UG&Gw%mz3CsHB{s*$H;K*uQ}u)#pN=Fp>-PlWkWpTHiOu$S7x5}X|2(nT zpWYHErOQT)9B$j7f~(yZt4cNlW>{_!73e!goi?*E?iol1+-&Bu4V#q|fuwQn}% zPfcLYa$Q$XQ2e{y=&jF`7S}zd{JSLAzQL3~Pjc-eO!>z>ekoP1p1Vy{5BffMfa+D(r#^Fbb-Vi=wHtknFv)eirku-vE(fB+ls6KO zCy$d{$7$MMOLE;-O!;+&ob#j8sn4XglB&J+y{X!xI8_;3e4=DTUk_t!H_1$8B z8X$@8Tkj>g_A_^o-0xV^{YFFnd6Lan@(+;Q?AK#kDlA*+%e3!t+TzhcM;KNUqm*rhM%L_9stZzlG$we$99;Cb>@gyzh_yoWRv2*Lx+mlKlzv zj}KG+DPo-$Q~o5$$FqNS0()M6>pC&x*+}w56owB|eiq5~y4;k%LUKKaFy*5p*JFVx zf0g9AZaz%;)p?mu{Z0D|Q@(xzdHn?PgA>T_m_Yu>1oG!6kiRj3{4nY=<8>i_1I?0uQ%jli*<`B_Gzvc{X9=(sjtwcik7s`wB9BASzTis%CcS>F8U$UubA>U z*=fIW>ob*wG35^=*Rg$)G4^ALIc>?+A6Uf(3Am2iAJ-0Q}&+_robIt^Ee*R=U z`%5N}$4IXIoO#`5l2g-m4pYweAGQ2(su$f~A0_!bW&cx>>%6e&kHk7nJYUygtRKkr zhiUgB#b&olKa!SN1}hDT<>R|LiR@}d(NAlN0@S+L+CV_^7#|k`$?|n(xyF+ z9plBnoaA%qA0MVY%k|i4%6Z)~UOekaK3+P{Ai1uG?UY|VKJs{~{WZ$9Uq-nuD^t$n zhfXKT$Gh$T*s0d+o^{OTSypo8mB`zMY^A5=Vr zL(damrf|A$uOn^2=KJGczxoF%z6tbo-+Oy~(=%_c54}TpztX3k(>Zjrlz7%xNP8g< zq>B97y&mgzTT&@-0)~HB)R($Z(c`|wBdhdD3a{t(X7~Y;^MUC(ex&FxSigkWOc$p| z$D_||7ckPJ<@(I}gwjV|kn_nF;)~dTjtl6Y-}y!R*S{bCI{rVnvG$Xmk3n^Qh2qiU z9LuxDb;@b|r2Abp*^gHqy1h@N$9^#|)9n{gb^Vk&>wXbdoK$Ddk3P)u)ay_GPm24k zjg($n8Mly}uy8beOzw-mkMxBxfviHr=J8Qt^Lohlg8n|@5+j1ax5iI*M)g#@9^2~> z`pnS{Ug4$-?LR};GxNvc$E%+@pBp|i(>?dka?cZ8uc^n?KT7fIF*;7^&})K;!dW$L zxEgi#9p&;}KP|@7OClZv`7q_TkX(-kexsh6$WD(RLllo$Uq2u|&WXwW&$D;P=g(08 zC$iVq;1E?mEBZm^S;TrQWL`w9=hDoVQhAu|VK?dZKKDmRulvyDKbQMkcN6PzlH+-l z*v!Xs#CmSQ`W&&D&QHU2-ypr-V_|#y&Pw6G8t;(hfZ_3ar7z0;#Q}=XY=0+`o|X@V z1LF&jUbmA9Dj-Cl?=WeA2CVfN;Gk+~TJKX6Kh1vN zFmMz&3ET&q0nP&FfVCsj>8VkUO>+=90-ONu1I_{K8{ay9dm1$yIy8rXqrfTPG_X%O z5*=Sk4PKgketA6`xMrc$M}d>Ty})C@;S(V~-~@0EIG_eVo&GRz9q>RomRtus z2%I}h+K0}TTnF3)+y|To9$?2!hb}+gIg)MQ0B{}fAaG)!f}V*!MoE zPXdQ~rM?$<;CiXAe!t`qVE+wLAHGrYAaLp?sUHFk-6HiF;6xwjfroFE`rrp7TenG$ z0H;1E^?BgThd>XU`}#o-Y<*1X6TnTkOZ@78aM|W{He4bd0F!CFC;g;A~_8l{*BZR0*}51 z`qw4bZw%;%H)wfDcd|dLtU6P0H zmt6Nb$^Hi=k9|pUN^Ll5{}uf@=!Yanzb)BT8_0_+WJn}2azE>sJ0SA9C^&@Xc z_Wwn46xe!G>W3zIg})jD&K@T9L$f6J&z5W-C%FkY4czaS_PzXKui-yOfCB-k?*+~Q zM{A}1&~nN43dvF6L0~&5?K7uJ4xc7@1i0yRsUHKj)=7O6aB`#6=Yaj2q&@{ac9zup z&y}139^5YV=^c{&J0%BqNzMWfoG10c-I51^{dH2`4{Y%Z-$r}MT_8Dfk>pX}-l)`% z#3cusC1+YBS0^ObbxQ6#AUSfm->aU;(esgjr$p3e9dIu&eZo@MCxDwOrG5Z7Jw@t=fb+oqsnXsz zO>%U)Wcygj$+?o#z**oNaP>SHJ_?)xPR^J1$rB_G0@p2;`hH+vKm+A^edkMkAMhw}-~wr%1_fYaAYeefp9Y2ff}QXl@PzX0fj{xUhkoxpbB-i{@a_DE0)4*fEeLt7>(HA8*y(GCGcoew* z6=@&+Z^nsBybiube4=idbZ>Y zaN-=P9{~<*mHN;&$!XvrV4wQdr0#Da;A-_vO0Cc9Z$vu1*s|*C0+mz=y%^2kM! z!Lc%woWDwP_@Lz8t0m{JksP>A@+k1&`=q}2 zddW5Km+Zema{5NedEn7Lskd&Goce&|@P{M^)dS(W{YO3~^~1mepOE_gwB#Y+F<|>s z(mo8FLcUwt4+4kpmHIy5%!5*2_hrdx;GwTd{pi;u_dX)I=26K_z`n<%zW;H_IpC4+ zN`1}uBsYCu@*r^VDXI7UP;%e1lC!|6=RprV`g5u8dr@-YWyu4;nO{i#FmN8&_lmUl z1BZb}fV01n;jK~0L%=!UF<_fNyh4ZWFMYq2ocNvOfmbDmUz6c`%coP0}ioq9V{r+)xA=qnTX8>y7sR3&*3I6YPBebXd|fJcFws-=Az*qSc&N#O7d zsm}rr9wGJiEXj4iW5CH8X`cbEK2qv?foqPI`aa<7@lu~zAlZMSsIC`1XCxJ)zOMUc!uUfr_sN)L(HvtbJzhA~T0&L$P^4%l~#j6VQe2b=;P03HS& z1Gf9*^}@gj;C|pC;8Eb}TV?z~;3#k}a0Yk;*!qBs-wzxCP6DTav%q=an%m^{LcmSH zeZYgjIbh!hW&8o)I^Y!W0PryI7_d!$sL=GcVc-OCKkyLnC~)rM`v7nqa0++;co=vL*#4xvUKlt5+z&hiJPKT$mhlIHqrknu8Q>9M>rNTJA2 z1Wp5If%CvMpOV)L0XG5n0S^M_fPHt#_yfRoz$xGX;9=k~VEb-)y)bYBxEDBhj|`s# z?!8aybHL#*OMNf!$iq?}8I+vSTk4yD)4-wQqrG1TGas)UXl=?B?-qWRi5IA~<)b|3{)Jc6Eu+=E_HgF1f0N59o;RC>Z zz=Oawdu8|#a2hxZY&Su8;6C6ia80ue9|2ASj{y7MCBsL7Gr*(3R;vsj1h(3wz79B< zkoq+6=w(vx?~pvyC3zG$v0v&lz^NOgeh9ekgHqoQ9JpQT6TrSZrQQbi-zD`4;9lS~ za1J;yAmbbOjN}pEG2p(8v>yN-{EE~^zbbj`5y|$WlIwu`fc=k2`|58hr*f?@N6zaLrRv9{?T#wx5>v*0AIta0)mFocy5-ANr+a z-|r;X0VjY{z=79f_z~dV-%EY|?~(_-6=J?JHbZjs2+2v{!DB%`N3wseZ`X&&h7#} zPjX$I5$0hfFLUQtx zl2d8P(Yquk?v@<6PjYlXa{p%}H+@!e-{&QdJ|Nlu1<6ehN{)O{a^IIEC%-It@FB_R zhb89*C5IoCocf03x^GJE1GXQR`p6TK{ZC4c0_VOX^-Vd+DPZ3(rQQY}0?z(M+UJ0y zd8tnVTW?5x4RHGJQa=bB{fE^1Jnl+WuUBp0EO4S++V=tnDx`j7lH@#aV20F(fs-?( zeyj#~uH>QPB#!{+fqlnIdp~d(xCuA~oCY2Q9tO?>SI?8_2>?fc6Tp4I1Hf5eU#+~J z4IEi6^_dltv%rZ}QlH-}*>{%Yd_=PET*)=SeZbasX`eh#vUR@XP`%_j-~@0la2j|J zco=vT*ow;Q*8m5A!@yDCByb<_0Pqm-2yh0hV9XKJm7dUX4)Q5q4kvpV)8aM|$)-CNL`z2Q&keo?M&I0Fv$AE`= zWcU$a-{n$22t0I!)QMNz*51a$8z6$JtL%?;wiTBFzqrlbglX^dJ?q;bU z1FpVB>ixj|z^U7$eHJ(eY<*DL`++0C3E)294DblB^&z+(a2U7=xDR*`cnrAu!}5AT z;3#k}a0Yk;*!qZ!zv*7dnE}a``dcrql>SD&`dcZQM>Amm19c5I6~(0Uiae z`H74#44ecW03HFhek$Yh1J?of0uKU@0@wUZ#vcT(15N_>0}lcZ1LuLOe=e^d0FD4R z0rvtA0B3=7z}AcM`ZjO~I0~EsP6H1C=YXvoT>mA>Vc;lm1~>~Gd|Aeq03HG!1Frss z3?BfF01p9=0aw2w&W~_`gfe0_TA9z+-R8@YU*XQ|a{NfNf8u*w0S^XMt_6v>yQult}#`a2_~RD($nt zIp9#4w9f$t%cZ^-cnmmMA?=5OE%mpy3gtIR+V@YEoB>Wuk^1yh$<{Q!N3vj1?&w)z`mI{!)F5%ssnv_5i_3?G>-IS*_Hq`nR~x=iXbz^Rj^ ze&7_zsr8brjgk|Q zu&++)>wpJyr9Vw`AXb$sypH15%#^_9dl0)FXKaxcYLbPXbq8A@xyUpZZ&O+CK)b zl=f-hLEuqf>pe1j3V0CtDrp}{Nsa>B2c>=#xaMl99~hN92s{it3T*vahOYq*00)6X zz+vDha1(F}xF0wJoCO{R9tF+=`+g(yYXb*?L%?;wQQ#zS3b-FQ1DplU0gnM!|5oP5 z4;%uH05<`rfct>cz=OcUz@xx<;4xt9cQQXUz&5ZSI0Re=oB-|xP6H1D4+D<^Td&IW zR|DI?LEs2*6L11J3ET(V51awc0_T9ofU94V`SSyZfa`!0z`ej};6dPF;8EZ_u}zyrWTz$3tUVC&B^z16@ra1b~G z+ytBeP6DTZdx86a`+?KI1Hc*JLEs_aEN~8Z6gUq&25h|{%hv~74O|0k1N(skz(L>; za2;?0xEDALJP14tJPK_6MdrU6*bf{6t^-a0_X4MZ2Z4uyM}e&|ncf=U0B{&M3Y-M) z10Db#0v-X*1N;6e(`y3UqhUO#XMxDGf0+zXrr9t0i+ z9tF1kF4I>78~_djM}ZT-y})VU3~&}W2RsH`{STRbKX3@R4mbha3!Dbd01p8V1LuJA zz}7!y`m2F$-~ez4I0766P5`HX`+(EH8Q>w{Vc;Ba9@u&l@(*kS2Y^Gs5#T6r0yqWS z2b>1Z01p8V1LuJAz}8!ke_$Ip02~6207ronz$xH9;52XscnEkHI0u{uwyY{~Kdl%2+0UiP# z2F?NJfh{lOAJ_&C0Ed7hz)|1?a0<8&I1QWu9s(W)&H?9vtrEyTuniml4gp7iqreH^ z6mTDK8aM+y1Uw9!1I`0mrI3GM8#n+Q0*(MjffK+f;6C6qa0Yk?co;YboCmhbApgKN zZ~!<290863CxBDHeZXnp4Db-}FmMhy4{Vh~{()`a0B{I60vrWS0H=WafYZPk;342) z;8EZ_uvG#12eyF&z+vDha00j&xDU7=I1M}qJOn%foCo&#WPWYnAaDe@2{;AZ51awc z0_T9ofU7HIdi}s5;4p9$xCuA~+z*@q&I0Fv$AGJ=Wcq7>ZD2oe2sjKJ0d4|L0rvwB z01p9Yfk%Kxfvri9U*G_67&r=?1nvVK03HG!0nP*aCd>5Nz(L>$a1(F}xF0wJoCVGS zj{#Rtk?HjVhk)yV6TrQ|Y2ZQNA>a|<9B>}kH&v$J1`Yy8fSZ6*!2Q4(;4E+scnr9D znoO@BI0Re=oB-|xP6H1D4+D<^Th%gsHNXMjFmN4k0yqWS51awc0_T9ofUBp=^!tHB zz;(b0;9lS~@F4Io@F=h~L#D3=H~<_5jsiCUr+|Bb`+x_4Gr(EkVc-$q9PlV`9(WAc zI!u<257-9w0|$VEz!Bgk-~@0la2j|3cnCNPoC6*Owho8<1KYrU;2>}WxDGf0oCNLz z?g!2Q4+3X_M}S9xt(lO2U>n#E90ZO4HvuPrlfWt9KHvf1A>b@<4tNwe4?G5J9RcM7 zTn$_UYy$^@L%?;wO~6UuUf_P<0pLO4Ebs_$9(WAcH%pd}4eSRF0*8U4z)ipj;3RM# za6fPcI14-sJOZ2p9s{nfk>%kB4g!aP>wueplfb>e{lEjjgTTYUIp937b)?K+HLwjF z01g31fTO?(;1qBla2hxRJOn%foCo$DCG%?o`+-BiVc;n6ka{18ui~M9qx>H_nE5XY zX5By6Qs5!?^DPA)1rDeOe|7k%oBV=(dLhSNjKB9p$%&IBj|3$r*GLY9B=@b896CdC z8aNLeT@UuaqrjOB(!Oq^WNVY;)cPNjlq|C|B9-XI-~$3K%tA_hHa@BW7iOcT+G?;a zyx-h&dgq+2xcd*(%zw_kH_2}@j|}F!du*5Y+Rp5=J$u;p;GpfX>)s=7?z;b|oljiX zPTF~)W4q}4O*?P6E}yaUe&6=wC)?@EwsTj-4@iAHH8w^2&RcRmS?!^mFH^gCWBdiG z-M-28WSi~YEw;0Aeo5Vbu*c2i{B1gK$@$x~b8k5aF% zAnQG9&s;Cc`i?qZ`P3dSE$cVxyzRPt)^1-rXFL6k?VRh>w|1U)o&L_w3$D}OySeMk zc{?ww9c>T&M1{^SrDNsQc&l+j-e_>H#}XyY9;RetNuytmmga zFYEbf7iB#^?Sib|r@iR9@4Eh?y**RkFWGtjW!ody9a*nVufHbi&uO=0eL3x-tRJU6 zll9`Xo3cKfc0tyI(;mwDZ`#ET@h=G4?Txn6n{8LN*zV+Q_gy!)+j-A*X@{NHcG~W^ z9^Yo?(>rXB@3cL0J>2Eyu1CA=Jaw1t+`YDodu@66-G18kOxAZ&|BS4!q&;<= zd&cfReb#pAIom7G+b+p^MSA?wD|X&LZF}H4`;MKrTu)t3-m}~1-?v?Io&Lbi3$C-W zevRJ#$tQOE)WCNAtnH5L=I3@^m-RaI_ybw5Lc8~~-M%R6Md-Zjda&;I`KzPfREDlc zuE(x3@_K(ge$Ms4b^3z4eHU$)U3V|pdEa$c)(g<<@4FtlZp`fQhOP^;-hdvj{kPq| zd)apSAKMvOUqJU?blq{?bv?f!{{O>t|BSqTU%Tyk$L6GF5CUxwp(}G zp4?-5Ag>44+c$FElh=dmeBinxuLsw8vuuxF+Go4FV7q<5_SALmAv@0;v|VxCT(a}2 z>zusaS#NJ;*=|2PY`grF?fwzlxns5)$8G0UZFj1+Q}TLKy*&ljy=#-_N8va1;=1QY zp=YO)=O>|Sw}$Tm@$>D_lbyD6pV`iTVSDPj{H2?_?tW$G*{^N)TxZYO`QmxoJ=d8Z z?7ZW;_M@FQez84ro&VL&Ypw^bv%lHxmtBusXQp=hitDcH^aZ!Q>yGQ0>-pd9{vFpd z*X2L#_AS>F*PV-Y`{pIv6W8TG?Y!-J>bm%s-M-;EH?#A$oWDGLy@bbiLC#;UU6S*c zYtJ4`o#DqaXsF6A^Ckf94~*sc6Z&+*DxRKOTIqCkvlhskH%l0 zp{nXq)3l&ooyq%i^S065lJW=zd1;hF!MEhgM#X@26hw z+%E&U$kHc~ [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Mint an NFT from inside your program using the Classic Token Program and Metaplex Token Metadata. See also: [Nft Minter overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/tokens/nft-operations/anchor-v1/Anchor.toml b/tokens/nft-operations/anchor-v1/Anchor.toml new file mode 100644 index 000000000..76e5151c3 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/Anchor.toml @@ -0,0 +1,24 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +mint_nft = "3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa" + +[programs.devnet] +mint_nft = "3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# Rust + LiteSVM tests; they load Metaplex Token Metadata from the local +# fixture (tests/fixtures/mpl_token_metadata.so) instead of cloning it from +# mainnet, which is too slow/unreliable in CI. +test = "cargo test" diff --git a/tokens/nft-operations/anchor-v1/CHANGELOG.md b/tokens/nft-operations/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/nft-operations/anchor-v1/Cargo.toml b/tokens/nft-operations/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/nft-operations/anchor-v1/README.md b/tokens/nft-operations/anchor-v1/README.md new file mode 100644 index 000000000..468efe55e --- /dev/null +++ b/tokens/nft-operations/anchor-v1/README.md @@ -0,0 +1,401 @@ +# NFT Operations + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Create an NFT collection, mint an NFT, and verify an NFT as part of a collection - all using Metaplex Token Metadata. + +## Program setup + +The [CPIs](https://solana.com/docs/terminology#cross-program-invocation-cpi) that create metadata [accounts](https://solana.com/docs/terminology#account) and master edition accounts, and that verify NFTs as part of a collection, all target the Metaplex Token Metadata program. The Rust test suite loads a dump of that program from `tests/fixtures/mpl_token_metadata.so` into LiteSVM. To refresh the dump from mainnet, run `prepare.mjs` (requires [zx](https://github.com/google/zx)). + +## Create an NFT collection + +The accounts needed to create an NFT collection are: + +```rust +#[derive(Accounts)] +pub struct CreateCollectionAccountConstraints<'info> { + #[account(mut)] + user: Signer<'info>, + + #[account( + init, + payer = user, + mint::decimals = 0, + mint::authority = mint_authority, + mint::freeze_authority = mint_authority, + )] + mint: Account<'info, Mint>, + + #[account( + seeds = [b"authority"], + bump, + )] + /// CHECK: This account is not initialized and is being used for signing purposes only + pub mint_authority: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + metadata: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + master_edition: UncheckedAccount<'info>, + + #[account( + init, + payer = user, + associated_token::mint = mint, + associated_token::authority = user + )] + destination: Account<'info, TokenAccount>, + + system_program: Program<'info, System>, + token_program: Program<'info, Token>, + associated_token_program: Program<'info, AssociatedToken>, + token_metadata_program: Program<'info, Metadata>, +} +``` + +### Account breakdown + +- `user`: the account creating the collection NFT and the owner of the destination [token account](https://solana.com/docs/terminology#token-account). +- `mint`: the collection NFT [mint account](https://solana.com/docs/terminology#token-mint). Initialized with 0 decimals; the mint authority and freeze authority are set to `mint_authority`. +- `mint_authority`: the [PDA](https://solana.com/docs/terminology#program-derived-address-pda) authority used to mint tokens from the collection mint. +- `metadata`: the metadata account of the collection NFT. +- `master_edition`: the master edition account of the collection NFT. +- `destination`: the token account that receives the collection NFT. +- `system_program`: initializes new accounts. +- `token_program` / `associated_token_program`: create new [ATAs](https://solana.com/docs/terminology#associated-token-account-ata) and mint tokens. +- `token_metadata_program`: the MPL Token Metadata program, used to create the metadata and master edition accounts. + +The `metadata` and `master_edition` accounts are `UncheckedAccount` because the Metaplex program initializes them during the CPI. If instead we wrote: + +```rust +#[account(mut)] +metadata: Account<'info, MetadataAccount>, +#[account(mut)] +master_edition: Account<'info, MasterEditionAccount>, +``` + +the instruction would fail because [Anchor](https://solana.com/docs/terminology#anchor) would expect the accounts to already be initialized. + +When an account *is* already initialized (as in the verify-collection flow below), use the specific account types. + +### Implementation for `create_collection` + +Each [instruction handler](https://solana.com/docs/terminology#instruction-handler) is a free function called from the `#[program]` module in `lib.rs`. The account constraints struct lives in the same file as the handler. The metadata `name`, `symbol`, and `uri` are instruction arguments, validated against the Metaplex limits (32, 10, and 200 bytes) by `validate_metadata_strings`, which returns the named errors `NameTooLong` / `SymbolTooLong` / `UriTooLong` instead of an opaque CPI failure. + +```rust +pub fn handle_create_collection( + accounts: &mut CreateCollectionAccountConstraints, + bumps: &CreateCollectionAccountConstraintsBumps, + name: String, + symbol: String, + uri: String, +) -> Result<()> { + validate_metadata_strings(&name, &symbol, &uri)?; + + let metadata = &accounts.metadata.to_account_info(); + let master_edition = &accounts.master_edition.to_account_info(); + let mint = &accounts.mint.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let payer = &accounts.user.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let spl_token_program = &accounts.token_program.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; + let signer_seeds = &[&seeds[..]]; + + let cpi_accounts = MintTo { + mint: accounts.mint.to_account_info(), + to: accounts.destination.to_account_info(), + authority: accounts.mint_authority.to_account_info(), + }; + let cpi_ctx = + CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); + mint_to(cpi_ctx, 1)?; + msg!("Collection NFT minted!"); + + let creator = vec![Creator { + address: accounts.mint_authority.key(), + verified: true, + share: 100, + }]; + + let metadata_account = CreateMetadataAccountV3Cpi::new( + spl_metadata_program, + CreateMetadataAccountV3CpiAccounts { + metadata, + mint, + mint_authority: authority, + payer, + update_authority: (authority, true), + system_program, + rent: None, + }, + CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: Some(CollectionDetails::V1 { size: 0 }), + }, + ); + metadata_account.invoke_signed(signer_seeds)?; + msg!("Metadata Account created!"); + + let master_edition_account = CreateMasterEditionV3Cpi::new( + spl_metadata_program, + CreateMasterEditionV3CpiAccounts { + edition: master_edition, + update_authority: authority, + mint_authority: authority, + mint, + payer, + metadata, + token_program: spl_token_program, + system_program, + rent: None, + }, + CreateMasterEditionV3InstructionArgs { + max_supply: Some(0), + }, + ); + master_edition_account.invoke_signed(signer_seeds)?; + msg!("Master Edition Account created"); + + Ok(()) +} +``` + +Three steps: + +1. Mint one token to the destination token account via a CPI to the [Classic Token Program](https://solana.com/docs/terminology#token-program). +2. Create a metadata account for the mint via a CPI to the Token Metadata program. The mint authority signs the CPI, so we use `invoke_signed` with the authority PDA's seeds. +3. Create a master edition account for the mint via a CPI to the Token Metadata program. This enforces the NFT-specific constraints and transfers both the mint authority and freeze authority to the Master Edition PDA. Again, the mint authority signs. + +More on Token Metadata: + +## Mint an NFT + +The accounts needed to mint an NFT: + +```rust +#[derive(Accounts)] +pub struct MintNftAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + init, + payer = owner, + mint::decimals = 0, + mint::authority = mint_authority, + mint::freeze_authority = mint_authority, + )] + pub mint: Account<'info, Mint>, + + #[account( + init, + payer = owner, + associated_token::mint = mint, + associated_token::authority = owner + )] + pub destination: Account<'info, TokenAccount>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + pub metadata: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + pub master_edition: UncheckedAccount<'info>, + + #[account( + seeds = [b"authority"], + bump, + )] + /// CHECK: This is account is not initialized and is being used for signing purposes only + pub mint_authority: UncheckedAccount<'info>, + + #[account(mut)] + pub collection_mint: Account<'info, Mint>, + + pub system_program: Program<'info, System>, + pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_metadata_program: Program<'info, Metadata>, +} +``` + +### Account breakdown + +- `owner`: the account minting the NFT and the owner of the destination token account. +- `mint`: the NFT mint account. 0 decimals; mint authority and freeze authority are the PDA. +- `destination`: the token account that receives the NFT. +- `metadata`: the metadata account. +- `master_edition`: the master edition account. +- `mint_authority`: the PDA authority used to mint tokens. +- `collection_mint`: the collection the NFT belongs to. +- `system_program`, `token_program`, `associated_token_program`, `token_metadata_program`: as above. + +Apart from `collection_mint`, the accounts are the same as the collection creation flow. A collection is just a regular NFT with the `collection_details` field set and the `collection` field on `data` set to `None`. An NFT belonging to a collection has `collection_details` set to `None` and the `collection` field on `data` set to a `Collection` struct with the collection's key and a `verified` boolean. `verified` starts false and flips to true once the NFT is verified as part of the collection. + +That's where the `collection_mint` account comes from - it provides the address that goes into the `Collection` struct on the NFT's metadata. + +### Implementation for `mint_nft` + +`handle_mint_nft` (in `mint_nft.rs`) mirrors `handle_create_collection`: the same caller-supplied `name` / `symbol` / `uri` arguments, the same validation, and the same three CPIs (mint one token, create metadata, create master edition). The difference is in the data on the metadata account. + +For the collection NFT: + +```rust +CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: Some(CollectionDetails::V1 { size: 0 }), +} +``` + +We set `collection_details`. + +For a regular NFT: + +```rust +CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: Some(Collection { + verified: false, + key: accounts.collection_mint.key(), + }), + uses: None, + }, + is_mutable: true, + collection_details: None, +} +``` + +We set the `collection` field with the key of the collection. `verified` starts false until the NFT is verified. + +## Verify an NFT as part of a collection + +The accounts needed to verify an NFT as part of a collection: + +```rust +#[derive(Accounts)] +pub struct VerifyCollectionMintAccountConstraints<'info> { + pub authority: Signer<'info>, + #[account(mut)] + pub metadata: Account<'info, MetadataAccount>, + pub mint: Account<'info, Mint>, + #[account( + seeds = [b"authority"], + bump, + )] + /// CHECK: This account is not initialized and is being used for signing purposes only + pub mint_authority: UncheckedAccount<'info>, + pub collection_mint: Account<'info, Mint>, + #[account(mut)] + pub collection_metadata: Account<'info, MetadataAccount>, + pub collection_master_edition: Account<'info, MasterEditionAccount>, + pub system_program: Program<'info, System>, + #[account(address = INSTRUCTIONS_SYSVAR_ID)] + /// CHECK: Sysvar instruction account that is being checked with an address constraint + pub sysvar_instruction: UncheckedAccount<'info>, + pub token_metadata_program: Program<'info, Metadata>, +} +``` + +### Account breakdown + +- `authority`: signer of the transaction. You can add constraints to restrict who can verify a collection. +- `metadata`: the metadata account of the NFT being verified. +- `mint`: the NFT mint being verified. +- `mint_authority`: the mint authority of the collection NFT. +- `collection_mint`: the mint account of the collection NFT. +- `collection_metadata`: the metadata account of the collection NFT. +- `collection_master_edition`: the master edition account of the collection NFT. +- `system_program`: as above. +- `sysvar_instruction`: provides access to the serialized instruction data for the running transaction. +- `token_metadata_program`: MPL Token Metadata, used to perform the verification CPI. + +Only the NFT and collection NFT metadata accounts need to be mutable - both are updated. The NFT metadata gets its `verified` boolean flipped to true, and the collection NFT metadata has its collection size incremented. + +### Implementation for `verify_collection` + +```rust +pub fn handle_verify_collection( + accounts: &mut VerifyCollectionMintAccountConstraints, + bumps: &VerifyCollectionMintAccountConstraintsBumps, +) -> Result<()> { + let metadata = &accounts.metadata.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let collection_mint = &accounts.collection_mint.to_account_info(); + let collection_metadata = &accounts.collection_metadata.to_account_info(); + let collection_master_edition = &accounts.collection_master_edition.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let sysvar_instructions = &accounts.sysvar_instruction.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; + let signer_seeds = &[&seeds[..]]; + + let verify_collection = VerifyCollectionV1Cpi::new( + spl_metadata_program, + VerifyCollectionV1CpiAccounts { + authority, + delegate_record: None, + metadata, + collection_mint, + collection_metadata: Some(collection_metadata), + collection_master_edition: Some(collection_master_edition), + system_program, + sysvar_instructions, + }, + ); + verify_collection.invoke_signed(signer_seeds)?; + + msg!("Collection Verified!"); + Ok(()) +} +``` + +> `INSTRUCTIONS_SYSVAR_ID` is the well-known sysvar address `Sysvar1nstructions1111111111111111111111111`, defined directly in [`verify_collection.rs`](programs/mint-nft/src/instructions/verify_collection.rs) because `sysvar::instructions::ID` moved in Anchor 1.0. + +`verify_collection` performs a CPI to the Token Metadata program with the right accounts. The collection NFT's mint authority signs the CPI, and the NFT is verified as part of the collection. + +## Testing + +Rust + LiteSVM tests live in `programs/mint-nft/tests/test_nft_operations.rs`. They load the program binary and the Metaplex fixture, then run the full lifecycle - create a collection, mint an NFT into it, verify membership - asserting token balances and that the caller-supplied metadata strings land in the metadata accounts. + +```bash +cargo build-sbf +cargo test +``` + +Use this as a starting point for your own collections, NFTs, and verification flows. diff --git a/tokens/nft-operations/anchor-v1/prepare.mjs b/tokens/nft-operations/anchor-v1/prepare.mjs new file mode 100644 index 000000000..7b58d3eac --- /dev/null +++ b/tokens/nft-operations/anchor-v1/prepare.mjs @@ -0,0 +1,35 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + // Must match the fixture filename the tests load via include_bytes!. + name: "mpl_token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/Cargo.toml b/tokens/nft-operations/anchor-v1/programs/mint-nft/Cargo.toml new file mode 100644 index 000000000..e277d36a5 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "mint-nft" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "mint_nft" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/Xargo.toml b/tokens/nft-operations/anchor-v1/programs/mint-nft/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/src/error.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/error.rs new file mode 100644 index 000000000..4f5384344 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/error.rs @@ -0,0 +1,11 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum MintNftError { + #[msg("Metadata name exceeds the Metaplex maximum of 32 bytes")] + NameTooLong, + #[msg("Metadata symbol exceeds the Metaplex maximum of 10 bytes")] + SymbolTooLong, + #[msg("Metadata URI exceeds the Metaplex maximum of 200 bytes")] + UriTooLong, +} diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/create_collection.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/create_collection.rs new file mode 100644 index 000000000..6fd2722cc --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/create_collection.rs @@ -0,0 +1,152 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + metadata::Metadata, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, +}; + +use anchor_spl::metadata::mpl_token_metadata::{ + instructions::{ + CreateMasterEditionV3Cpi, CreateMasterEditionV3CpiAccounts, + CreateMasterEditionV3InstructionArgs, CreateMetadataAccountV3Cpi, + CreateMetadataAccountV3CpiAccounts, CreateMetadataAccountV3InstructionArgs, + }, + types::{CollectionDetails, Creator, DataV2}, +}; + +use super::validate_metadata_strings; + +#[derive(Accounts)] +pub struct CreateCollectionAccountConstraints<'info> { + #[account(mut)] + user: Signer<'info>, + + #[account( + init, + payer = user, + mint::decimals = 0, + mint::authority = mint_authority, + mint::freeze_authority = mint_authority, + )] + mint: Account<'info, Mint>, + + #[account( + seeds = [b"authority"], + bump, + )] + /// CHECK: This account is not initialized and is being used for signing purposes only + pub mint_authority: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + metadata: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + master_edition: UncheckedAccount<'info>, + + #[account( + init, + payer = user, + associated_token::mint = mint, + associated_token::authority = user + )] + destination: Account<'info, TokenAccount>, + + system_program: Program<'info, System>, + token_program: Program<'info, Token>, + associated_token_program: Program<'info, AssociatedToken>, + token_metadata_program: Program<'info, Metadata>, +} + +/// Creates a collection NFT with caller-supplied metadata. +/// +/// `name`, `symbol`, and `uri` are validated against the Metaplex Token +/// Metadata limits (32, 10, and 200 bytes respectively). +pub fn handle_create_collection( + accounts: &mut CreateCollectionAccountConstraints, + bumps: &CreateCollectionAccountConstraintsBumps, + name: String, + symbol: String, + uri: String, +) -> Result<()> { + validate_metadata_strings(&name, &symbol, &uri)?; + + let metadata = &accounts.metadata.to_account_info(); + let master_edition = &accounts.master_edition.to_account_info(); + let mint = &accounts.mint.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let payer = &accounts.user.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let spl_token_program = &accounts.token_program.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; + let signer_seeds = &[&seeds[..]]; + + let cpi_accounts = MintTo { + mint: accounts.mint.to_account_info(), + to: accounts.destination.to_account_info(), + authority: accounts.mint_authority.to_account_info(), + }; + let cpi_ctx = + CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); + mint_to(cpi_ctx, 1)?; + msg!("Collection NFT minted!"); + + let creator = vec![Creator { + address: accounts.mint_authority.key(), + verified: true, + share: 100, + }]; + + let metadata_account = CreateMetadataAccountV3Cpi::new( + spl_metadata_program, + CreateMetadataAccountV3CpiAccounts { + metadata, + mint, + mint_authority: authority, + payer, + update_authority: (authority, true), + system_program, + rent: None, + }, + CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: Some(CollectionDetails::V1 { size: 0 }), + }, + ); + metadata_account.invoke_signed(signer_seeds)?; + msg!("Metadata Account created!"); + + let master_edition_account = CreateMasterEditionV3Cpi::new( + spl_metadata_program, + CreateMasterEditionV3CpiAccounts { + edition: master_edition, + update_authority: authority, + mint_authority: authority, + mint, + payer, + metadata, + token_program: spl_token_program, + system_program, + rent: None, + }, + CreateMasterEditionV3InstructionArgs { + max_supply: Some(0), + }, + ); + master_edition_account.invoke_signed(signer_seeds)?; + msg!("Master Edition Account created"); + + Ok(()) +} diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mint_nft.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mint_nft.rs new file mode 100644 index 000000000..04023aada --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mint_nft.rs @@ -0,0 +1,157 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + metadata::Metadata, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, +}; + +use anchor_spl::metadata::mpl_token_metadata::{ + instructions::{ + CreateMasterEditionV3Cpi, CreateMasterEditionV3CpiAccounts, + CreateMasterEditionV3InstructionArgs, CreateMetadataAccountV3Cpi, + CreateMetadataAccountV3CpiAccounts, CreateMetadataAccountV3InstructionArgs, + }, + types::{Collection, Creator, DataV2}, +}; + +use super::validate_metadata_strings; + +#[derive(Accounts)] +pub struct MintNftAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + init, + payer = owner, + mint::decimals = 0, + mint::authority = mint_authority, + mint::freeze_authority = mint_authority, + )] + pub mint: Account<'info, Mint>, + + #[account( + init, + payer = owner, + associated_token::mint = mint, + associated_token::authority = owner + )] + pub destination: Account<'info, TokenAccount>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + pub metadata: UncheckedAccount<'info>, + + #[account(mut)] + /// CHECK: This account will be initialized by the metaplex program + pub master_edition: UncheckedAccount<'info>, + + #[account( + seeds = [b"authority"], + bump, + )] + /// CHECK: This is account is not initialized and is being used for signing purposes only + pub mint_authority: UncheckedAccount<'info>, + + #[account(mut)] + pub collection_mint: Account<'info, Mint>, + + pub system_program: Program<'info, System>, + pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub token_metadata_program: Program<'info, Metadata>, +} + +/// Mints an NFT into the collection with caller-supplied metadata. +/// +/// `name`, `symbol`, and `uri` are validated against the Metaplex Token +/// Metadata limits (32, 10, and 200 bytes respectively). The collection +/// reference starts unverified; call `verify_collection` to verify it. +pub fn handle_mint_nft( + accounts: &mut MintNftAccountConstraints, + bumps: &MintNftAccountConstraintsBumps, + name: String, + symbol: String, + uri: String, +) -> Result<()> { + validate_metadata_strings(&name, &symbol, &uri)?; + + let metadata = &accounts.metadata.to_account_info(); + let master_edition = &accounts.master_edition.to_account_info(); + let mint = &accounts.mint.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let payer = &accounts.owner.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let spl_token_program = &accounts.token_program.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[&b"authority"[..], &[bumps.mint_authority]]; + let signer_seeds = &[&seeds[..]]; + + let cpi_accounts = MintTo { + mint: accounts.mint.to_account_info(), + to: accounts.destination.to_account_info(), + authority: accounts.mint_authority.to_account_info(), + }; + let cpi_ctx = + CpiContext::new_with_signer(accounts.token_program.key(), cpi_accounts, signer_seeds); + mint_to(cpi_ctx, 1)?; + msg!("NFT minted!"); + + let creator = vec![Creator { + address: accounts.mint_authority.key(), + verified: true, + share: 100, + }]; + + let metadata_account = CreateMetadataAccountV3Cpi::new( + spl_metadata_program, + CreateMetadataAccountV3CpiAccounts { + metadata, + mint, + mint_authority: authority, + payer, + update_authority: (authority, true), + system_program, + rent: None, + }, + CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: Some(creator), + collection: Some(Collection { + verified: false, + key: accounts.collection_mint.key(), + }), + uses: None, + }, + is_mutable: true, + collection_details: None, + }, + ); + metadata_account.invoke_signed(signer_seeds)?; + + let master_edition_account = CreateMasterEditionV3Cpi::new( + spl_metadata_program, + CreateMasterEditionV3CpiAccounts { + edition: master_edition, + update_authority: authority, + mint_authority: authority, + mint, + payer, + metadata, + token_program: spl_token_program, + system_program, + rent: None, + }, + CreateMasterEditionV3InstructionArgs { + max_supply: Some(0), + }, + ); + master_edition_account.invoke_signed(signer_seeds)?; + + Ok(()) +} diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mod.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mod.rs new file mode 100644 index 000000000..6321509ce --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/mod.rs @@ -0,0 +1,27 @@ +pub mod create_collection; +pub mod mint_nft; +pub mod verify_collection; + +pub use create_collection::*; +pub use mint_nft::*; +pub use verify_collection::*; + +use { + crate::error::MintNftError, + anchor_lang::prelude::*, + anchor_spl::metadata::mpl_token_metadata::{ + MAX_NAME_LENGTH, MAX_SYMBOL_LENGTH, MAX_URI_LENGTH, + }, +}; + +/// Rejects metadata strings that exceed the Metaplex Token Metadata limits, +/// so callers get a named error instead of an opaque CPI failure. +pub fn validate_metadata_strings(name: &str, symbol: &str, uri: &str) -> Result<()> { + require!(name.len() <= MAX_NAME_LENGTH, MintNftError::NameTooLong); + require!( + symbol.len() <= MAX_SYMBOL_LENGTH, + MintNftError::SymbolTooLong + ); + require!(uri.len() <= MAX_URI_LENGTH, MintNftError::UriTooLong); + Ok(()) +} diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/verify_collection.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/verify_collection.rs new file mode 100644 index 000000000..4748ec254 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/instructions/verify_collection.rs @@ -0,0 +1,77 @@ +use anchor_lang::prelude::*; + +use anchor_spl::metadata::mpl_token_metadata::instructions::{ + VerifyCollectionV1Cpi, + VerifyCollectionV1CpiAccounts, +}; +use anchor_spl::metadata::{ + MasterEditionAccount, + MetadataAccount, +}; +use anchor_spl::{ + token::Mint, + metadata::Metadata, +}; +// In Anchor 1.0, sysvar::instructions::ID moved - use the well-known address directly +const INSTRUCTIONS_SYSVAR_ID: Pubkey = anchor_lang::solana_program::pubkey::pubkey!("Sysvar1nstructions1111111111111111111111111"); + +#[derive(Accounts)] +pub struct VerifyCollectionMintAccountConstraints<'info> { + pub authority: Signer<'info>, + #[account(mut)] + pub metadata: Account<'info, MetadataAccount>, + pub mint: Account<'info, Mint>, + #[account( + seeds = [b"authority"], + bump, + )] + /// CHECK: This account is not initialized and is being used for signing purposes only + pub mint_authority: UncheckedAccount<'info>, + pub collection_mint: Account<'info, Mint>, + #[account(mut)] + pub collection_metadata: Account<'info, MetadataAccount>, + pub collection_master_edition: Account<'info, MasterEditionAccount>, + pub system_program: Program<'info, System>, + #[account(address = INSTRUCTIONS_SYSVAR_ID)] + /// CHECK: Sysvar instruction account that is being checked with an address constraint + pub sysvar_instruction: UncheckedAccount<'info>, + pub token_metadata_program: Program<'info, Metadata>, +} + +pub fn handle_verify_collection( + accounts: &mut VerifyCollectionMintAccountConstraints, + bumps: &VerifyCollectionMintAccountConstraintsBumps, +) -> Result<()> { + let metadata = &accounts.metadata.to_account_info(); + let authority = &accounts.mint_authority.to_account_info(); + let collection_mint = &accounts.collection_mint.to_account_info(); + let collection_metadata = &accounts.collection_metadata.to_account_info(); + let collection_master_edition = &accounts.collection_master_edition.to_account_info(); + let system_program = &accounts.system_program.to_account_info(); + let sysvar_instructions = &accounts.sysvar_instruction.to_account_info(); + let spl_metadata_program = &accounts.token_metadata_program.to_account_info(); + + let seeds = &[ + &b"authority"[..], + &[bumps.mint_authority] + ]; + let signer_seeds = &[&seeds[..]]; + + let verify_collection = VerifyCollectionV1Cpi::new( + spl_metadata_program, + VerifyCollectionV1CpiAccounts { + authority, + delegate_record: None, + metadata, + collection_mint, + collection_metadata: Some(collection_metadata), + collection_master_edition: Some(collection_master_edition), + system_program, + sysvar_instructions, + }); + verify_collection.invoke_signed(signer_seeds)?; + + msg!("Collection Verified!"); + + Ok(()) + } diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/src/lib.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/lib.rs new file mode 100644 index 000000000..2e1c3eac5 --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/src/lib.rs @@ -0,0 +1,50 @@ +use anchor_lang::prelude::*; + +declare_id!("3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa"); + +pub mod error; +pub mod instructions; + +pub use instructions::*; + +#[program] +pub mod mint_nft { + + use super::*; + + /// Create a collection NFT with the given metadata. + pub fn create_collection( + mut context: Context, + name: String, + symbol: String, + uri: String, + ) -> Result<()> { + instructions::create_collection::handle_create_collection( + &mut context.accounts, + &context.bumps, + name, + symbol, + uri, + ) + } + + /// Mint an NFT into the collection with the given metadata. + pub fn mint_nft( + mut context: Context, + name: String, + symbol: String, + uri: String, + ) -> Result<()> { + instructions::mint_nft::handle_mint_nft(&mut context.accounts, &context.bumps, name, symbol, uri) + } + + /// Verify an NFT as a member of the collection. + pub fn verify_collection( + mut context: Context, + ) -> Result<()> { + instructions::verify_collection::handle_verify_collection( + &mut context.accounts, + &context.bumps, + ) + } +} diff --git a/tokens/nft-operations/anchor-v1/programs/mint-nft/tests/test_nft_operations.rs b/tokens/nft-operations/anchor-v1/programs/mint-nft/tests/test_nft_operations.rs new file mode 100644 index 000000000..93bb7e51c --- /dev/null +++ b/tokens/nft-operations/anchor-v1/programs/mint-nft/tests/test_nft_operations.rs @@ -0,0 +1,372 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn instructions_sysvar_id() -> Pubkey { + "Sysvar1nstructions1111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_edition_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + metadata_pid.as_ref(), + mint.as_ref(), + b"edition", + ], + &metadata_pid, + ); + pda +} + +/// Returns true if `haystack` contains `needle` anywhere. Used to check that +/// caller-supplied metadata strings landed in the Metaplex metadata account +/// without fully deserializing the Metaplex layout. +fn contains_bytes(haystack: &[u8], needle: &[u8]) -> bool { + haystack.windows(needle.len()).any(|window| window == needle) +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = mint_nft::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/mint_nft.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_collection() { + let (mut svm, program_id, payer) = setup(); + let collection_keypair = Keypair::new(); + + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id); + + let metadata = derive_metadata_pda(&collection_keypair.pubkey()); + let master_edition = derive_edition_pda(&collection_keypair.pubkey()); + let destination = derive_ata(&payer.pubkey(), &collection_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::CreateCollection { + name: "Example Collection".to_string(), + symbol: "EXCO".to_string(), + uri: "https://example.com/collection.json".to_string(), + } + .data(), + mint_nft::accounts::CreateCollectionAccountConstraints { + user: payer.pubkey(), + mint: collection_keypair.pubkey(), + mint_authority, + metadata, + master_edition, + destination, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &collection_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify collection mint exists + let mint_account = svm + .get_account(&collection_keypair.pubkey()) + .expect("Collection mint should exist"); + assert!(!mint_account.data.is_empty()); + + // Verify metadata exists and carries the caller-supplied name + let meta_account = svm + .get_account(&metadata) + .expect("Metadata should exist"); + assert!(!meta_account.data.is_empty()); + assert!( + contains_bytes(&meta_account.data, b"Example Collection"), + "Metadata should contain the caller-supplied collection name" + ); + + // Verify master edition exists + let edition_account = svm + .get_account(&master_edition) + .expect("Master edition should exist"); + assert!(!edition_account.data.is_empty()); + + // Verify 1 token was minted to destination + let balance = get_token_account_balance(&svm, &destination).unwrap(); + assert_eq!(balance, 1, "Should have 1 collection token"); +} + +#[test] +fn test_mint_nft_to_collection() { + let (mut svm, program_id, payer) = setup(); + + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id); + + // Step 1: Create the collection + let collection_keypair = Keypair::new(); + let collection_metadata = derive_metadata_pda(&collection_keypair.pubkey()); + let collection_master_edition = derive_edition_pda(&collection_keypair.pubkey()); + let collection_destination = derive_ata(&payer.pubkey(), &collection_keypair.pubkey()); + + let create_collection_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::CreateCollection { + name: "Example Collection".to_string(), + symbol: "EXCO".to_string(), + uri: "https://example.com/collection.json".to_string(), + } + .data(), + mint_nft::accounts::CreateCollectionAccountConstraints { + user: payer.pubkey(), + mint: collection_keypair.pubkey(), + mint_authority, + metadata: collection_metadata, + master_edition: collection_master_edition, + destination: collection_destination, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![create_collection_ix], + &[&payer, &collection_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Step 2: Mint an NFT into the collection + svm.expire_blockhash(); + let nft_keypair = Keypair::new(); + let nft_metadata = derive_metadata_pda(&nft_keypair.pubkey()); + let nft_master_edition = derive_edition_pda(&nft_keypair.pubkey()); + let nft_destination = derive_ata(&payer.pubkey(), &nft_keypair.pubkey()); + + let mint_nft_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::MintNft { + name: "Example NFT #1".to_string(), + symbol: "EXNFT".to_string(), + uri: "https://example.com/nft-1.json".to_string(), + } + .data(), + mint_nft::accounts::MintNftAccountConstraints { + owner: payer.pubkey(), + mint: nft_keypair.pubkey(), + destination: nft_destination, + metadata: nft_metadata, + master_edition: nft_master_edition, + mint_authority, + collection_mint: collection_keypair.pubkey(), + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![mint_nft_ix], + &[&payer, &nft_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify NFT was minted + let balance = get_token_account_balance(&svm, &nft_destination).unwrap(); + assert_eq!(balance, 1, "Should have 1 NFT"); + + // Verify NFT metadata exists and carries the caller-supplied name + let nft_meta = svm + .get_account(&nft_metadata) + .expect("NFT metadata should exist"); + assert!(!nft_meta.data.is_empty()); + assert!( + contains_bytes(&nft_meta.data, b"Example NFT #1"), + "Metadata should contain the caller-supplied NFT name" + ); +} + +#[test] +fn test_verify_collection() { + let (mut svm, program_id, payer) = setup(); + + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id); + + // Step 1: Create collection + let collection_keypair = Keypair::new(); + let collection_metadata = derive_metadata_pda(&collection_keypair.pubkey()); + let collection_master_edition = derive_edition_pda(&collection_keypair.pubkey()); + let collection_destination = derive_ata(&payer.pubkey(), &collection_keypair.pubkey()); + + let create_collection_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::CreateCollection { + name: "Example Collection".to_string(), + symbol: "EXCO".to_string(), + uri: "https://example.com/collection.json".to_string(), + } + .data(), + mint_nft::accounts::CreateCollectionAccountConstraints { + user: payer.pubkey(), + mint: collection_keypair.pubkey(), + mint_authority, + metadata: collection_metadata, + master_edition: collection_master_edition, + destination: collection_destination, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![create_collection_ix], + &[&payer, &collection_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Step 2: Mint NFT + svm.expire_blockhash(); + let nft_keypair = Keypair::new(); + let nft_metadata = derive_metadata_pda(&nft_keypair.pubkey()); + let nft_master_edition = derive_edition_pda(&nft_keypair.pubkey()); + let nft_destination = derive_ata(&payer.pubkey(), &nft_keypair.pubkey()); + + let mint_nft_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::MintNft { + name: "Example NFT #1".to_string(), + symbol: "EXNFT".to_string(), + uri: "https://example.com/nft-1.json".to_string(), + } + .data(), + mint_nft::accounts::MintNftAccountConstraints { + owner: payer.pubkey(), + mint: nft_keypair.pubkey(), + destination: nft_destination, + metadata: nft_metadata, + master_edition: nft_master_edition, + mint_authority, + collection_mint: collection_keypair.pubkey(), + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![mint_nft_ix], + &[&payer, &nft_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Step 3: Verify collection + svm.expire_blockhash(); + let verify_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::VerifyCollection {}.data(), + mint_nft::accounts::VerifyCollectionMintAccountConstraints { + authority: payer.pubkey(), + metadata: nft_metadata, + mint: nft_keypair.pubkey(), + mint_authority, + collection_mint: collection_keypair.pubkey(), + collection_metadata, + collection_master_edition, + system_program: system_program::id(), + sysvar_instruction: instructions_sysvar_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![verify_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the metadata still exists after verification + let nft_meta = svm + .get_account(&nft_metadata) + .expect("NFT metadata should still exist after verification"); + assert!(!nft_meta.data.is_empty()); +} diff --git a/tokens/nft-operations/anchor-v1/tests/fixtures/mpl_token_metadata.so b/tokens/nft-operations/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Create an NFT collection, mint an NFT, and verify an NFT as part of a collection - all using Metaplex Token Metadata. ## Program setup diff --git a/tokens/pda-mint-authority/anchor-v1/Anchor.toml b/tokens/pda-mint-authority/anchor-v1/Anchor.toml new file mode 100644 index 000000000..ab7eb4e35 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/Anchor.toml @@ -0,0 +1,20 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +token_minter = "3LFrPHqwk5jMrmiz48BFj6NV2k4NjobgTe1jChzx3JGD" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# Rust + LiteSVM tests; Metaplex Token Metadata is loaded from a local +# fixture (tests/fixtures/mpl_token_metadata.so), no validator needed. +test = "cargo test" diff --git a/tokens/pda-mint-authority/anchor-v1/CHANGELOG.md b/tokens/pda-mint-authority/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/pda-mint-authority/anchor-v1/Cargo.toml b/tokens/pda-mint-authority/anchor-v1/Cargo.toml new file mode 100644 index 000000000..8ff52ccca --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/Cargo.toml @@ -0,0 +1,13 @@ +[workspace] +members = ["programs/*"] + +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/pda-mint-authority/anchor-v1/README.md b/tokens/pda-mint-authority/anchor-v1/README.md new file mode 100644 index 000000000..984e04a06 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/README.md @@ -0,0 +1,41 @@ +# PDA Mint Authority (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Mint tokens with a PDA as mint authority so the program controls issuance. + +See also: [Pda Mint Authority overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- PDA mint authority +- CPI mint_to +- Amounts: `mint_token` takes `amount` in **minor units**, the raw integer the token program operates on. Clients convert from major units offchain: 1 token with 9 decimals is `1 * 10^9` minor units. The program never scales amounts onchain. + +## Setup + +From this directory (`tokens/pda-mint-authority/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/pda-mint-authority/anchor-v1/prepare.mjs b/tokens/pda-mint-authority/anchor-v1/prepare.mjs new file mode 100644 index 000000000..fb6b26225 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/prepare.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/Cargo.toml b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/Cargo.toml new file mode 100644 index 000000000..42928e358 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "pda-mint-authority-anchor" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "token_minter" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/Xargo.toml b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/create.rs b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/create.rs new file mode 100644 index 000000000..75891fe9f --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/create.rs @@ -0,0 +1,92 @@ +// In this example the same PDA is used as both the address of the mint account and the mint authority +// This is to demonstrate that the same PDA can be used for both the address of an account and CPI signing +use { + anchor_lang::prelude::*, + anchor_spl::{ + metadata::{ + create_metadata_accounts_v3, mpl_token_metadata::types::DataV2, + CreateMetadataAccountsV3, Metadata, + }, + token::{Mint, Token}, + }, +}; + +#[derive(Accounts)] +pub struct CreateTokenAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + // Create mint account + // Same PDA as address of the account and mint/freeze authority + #[account( + init, + seeds = [b"mint"], + bump, + payer = payer, + mint::decimals = 9, + mint::authority = mint_account.key(), + mint::freeze_authority = mint_account.key(), + + )] + pub mint_account: Account<'info, Mint>, + + /// CHECK: Validate address by deriving pda + #[account( + mut, + seeds = [b"metadata", token_metadata_program.key().as_ref(), mint_account.key().as_ref()], + bump, + seeds::program = token_metadata_program.key(), + )] + pub metadata_account: UncheckedAccount<'info>, + + pub token_program: Program<'info, Token>, + pub token_metadata_program: Program<'info, Metadata>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, +} + +pub fn handle_create_token( + context: Context, + token_name: String, + token_symbol: String, + token_uri: String, +) -> Result<()> { + msg!("Creating metadata account"); + + // PDA signer seeds + let signer_seeds: &[&[&[u8]]] = &[&[b"mint", &[context.bumps.mint_account]]]; + + // Cross Program Invocation (CPI) signed by PDA + // Invoking the create_metadata_account_v3 instruction on the token metadata program + create_metadata_accounts_v3( + CpiContext::new( + context.accounts.token_metadata_program.key(), + CreateMetadataAccountsV3 { + metadata: context.accounts.metadata_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + mint_authority: context.accounts.mint_account.to_account_info(), // PDA is mint authority + update_authority: context.accounts.mint_account.to_account_info(), // PDA is update authority + payer: context.accounts.payer.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + rent: context.accounts.rent.to_account_info(), + }, + ) + .with_signer(signer_seeds), + DataV2 { + name: token_name, + symbol: token_symbol, + uri: token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + false, // Is mutable + true, // Update authority is signer + None, // Collection details + )?; + + msg!("Token created successfully."); + + Ok(()) +} diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mint.rs b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mint.rs new file mode 100644 index 000000000..eedae32c9 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mint.rs @@ -0,0 +1,74 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + associated_token::AssociatedToken, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, + }, +}; + +#[derive(Accounts)] +pub struct MintTokenAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + // Mint account address is a PDA + #[account( + mut, + seeds = [b"mint"], + bump + )] + pub mint_account: Account<'info, Mint>, + + // Create Associated Token Account, if needed + // This is the account that will hold the minted tokens + #[account( + init_if_needed, + payer = payer, + associated_token::mint = mint_account, + associated_token::authority = payer, + )] + pub associated_token_account: Account<'info, TokenAccount>, + + pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +/// Mints `amount` tokens to the payer's associated token account, signed by +/// the PDA mint authority. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. +pub fn handle_mint_token( + context: Context, + amount: u64, +) -> Result<()> { + msg!("Minting token to associated token account..."); + msg!("Mint: {}", &context.accounts.mint_account.key()); + msg!( + "Token Address: {}", + &context.accounts.associated_token_account.key() + ); + + // PDA signer seeds + let signer_seeds: &[&[&[u8]]] = &[&[b"mint", &[context.bumps.mint_account]]]; + + // Invoke the mint_to instruction on the token program + mint_to( + CpiContext::new( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.mint_account.to_account_info(), + to: context.accounts.associated_token_account.to_account_info(), + authority: context.accounts.mint_account.to_account_info(), // PDA mint authority, required as signer + }, + ) + .with_signer(signer_seeds), // using PDA to sign + amount, + )?; + + msg!("Token minted successfully."); + + Ok(()) +} diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mod.rs b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mod.rs new file mode 100644 index 000000000..b5fc4285b --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod create; +pub mod mint; + +pub use create::*; +pub use mint::*; diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/lib.rs b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/lib.rs new file mode 100644 index 000000000..fb5ba6795 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/src/lib.rs @@ -0,0 +1,27 @@ +use anchor_lang::prelude::*; +use instructions::*; +pub mod instructions; + +declare_id!("3LFrPHqwk5jMrmiz48BFj6NV2k4NjobgTe1jChzx3JGD"); + +#[program] +pub mod token_minter { + use super::*; + + pub fn create_token( + context: Context, + token_name: String, + token_symbol: String, + token_uri: String, + ) -> Result<()> { + create::handle_create_token(context, token_name, token_symbol, token_uri) + } + + /// Mint `amount` minor units of the token to the payer. + pub fn mint_token( + context: Context, + amount: u64, + ) -> Result<()> { + mint::handle_mint_token(context, amount) + } +} diff --git a/tokens/pda-mint-authority/anchor-v1/programs/token-minter/tests/test_pda_mint.rs b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/tests/test_pda_mint.rs new file mode 100644 index 000000000..f451e5a09 --- /dev/null +++ b/tokens/pda-mint-authority/anchor-v1/programs/token-minter/tests/test_pda_mint.rs @@ -0,0 +1,161 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +/// Decimals configured by the program's `mint::decimals` constraint in +/// `CreateTokenAccountConstraints`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's `mint_token` handler takes amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[ + wallet.as_ref(), + token_program_id().as_ref(), + mint.as_ref(), + ], + &associated_token_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = token_minter::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/token_minter.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token_and_mint() { + let (mut svm, program_id, payer) = setup(); + + // Derive the PDA mint account (seeds = [b"mint"]) + let (mint_pda, _bump) = Pubkey::find_program_address(&[b"mint"], &program_id); + let metadata_account = derive_metadata_pda(&mint_pda); + + // 1. Create token + let create_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::CreateToken { + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + token_minter::accounts::CreateTokenAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_pda, + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint created + let mint_account = svm.get_account(&mint_pda).expect("Mint PDA should exist"); + assert!(!mint_account.data.is_empty()); + + // Verify metadata created + let meta = svm + .get_account(&metadata_account) + .expect("Metadata should exist"); + assert!(!meta.data.is_empty()); + + // 2. Mint 100 tokens to the payer's ATA. The handler takes minor units. + svm.expire_blockhash(); + let ata = derive_ata(&payer.pubkey(), &mint_pda); + + let mint_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::MintToken { + amount: to_minor_units(100), + } + .data(), + token_minter::accounts::MintTokenAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_pda, + associated_token_account: ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![mint_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify 100 tokens minted (in minor units) + let balance = get_token_account_balance(&svm, &ata).unwrap(); + assert_eq!(balance, to_minor_units(100), "Should have 100 tokens"); +} diff --git a/tokens/pda-mint-authority/anchor-v1/tests/fixtures/mpl_token_metadata.so b/tokens/pda-mint-authority/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` z2OVLR<+Jvoz2^b&jrAq`@6F`D!-M(`I9>QQ%69a%^;tab^kP2S8PA^#FkM^4c6Cwz z+d)2r|0d;xvRJgUK`?8$S2`Fe)#TE_0sfN=7m&#P~Z3EJ}=)7s$OR3@4bNY^jGaetiP-m z`0fT=3;hkN$++t-fg7y+R{hIh^*5X!N$=NN(!B1Z_7KKWezE>uZD|A#@&g?!Ukm-E z{VwD_^f>gXRK1gYY8o%ys`*L(-DGLke|1ggbruSE{-?)Xn@N|&wX#m9{ha6T>>*^hG_+f3iK%Jld0RnC*$?nLSx)cE{%Do~i4#xMh zc0e42{`JNu)Bj4v(vD9bN%8SIOFKR{#!WsQ&=<(tD@50l_(>d>{7RKu6%XzuL?Cwf zAoB}yP7pfS*W(K%oe%nzzkdE&&F|BEje`VFxk$V&E?QLFsP!zeduC z6}N{qv*UG}2ObVoAJMK;UygQ+syz1PUPixEadu{oP}dmW1Hao}nPt~E{{(iO_!7H* z8u57cO7%R$UcESFuUf?$vs3n}G2Te*)$>yJO8H~)hHtN)y_@z*-q-95 z<8sk&OVdBdytJl$`N6nH#=lMZ%3t4}m|om3u~?}>J?hIHZ0kB#G|Bm;($ajeL*=$q zy^C}-+37nqKe5xdTH4uZ-dC6pUZwd@)L-X=9>c@$x0>hK+;?0Y;Dpr+Q}mpx>3nb+ z^XJ(*Ko9k741+fLjj@{pcOFu>2BYUjz3PX3Uar~d-|iR%U;C9`@&4J>y_w~rj%2>_ z7Oz~gf0pwI<&N2^_hIc)#T(ymTECd-o>_c9d?C~GEDk#6Fs(N_k$i~GVt+*ES-itx zSUk@r`$>prO?M`}uAOfG4eZcM)NZi7iGFNTzJ@o<&Bk+?X6wCwt@hELmWlU4;=OJ_ z5xDO^vi8q@K=_&1{UYJ7o8MF}Jx{%&prz@^rh0@qXVipeQj?4tohF(=Z)pN z8}>`b0OuWQ1J;lIOxMXjiEA}I@jUb7_RmI3IN#yNeZ8r99&L}=RrqT+{}{Ke6c}!2k>kvg@-opIr{+d+%ovZ!7uV%=1RjLoo`*4re z_mFo~oDY6L_!~G6(YNQNuf>$ZqKl`T+|H$*#pf7yTiWE-;$XkO zW}9ERT>1<2aen1xne_SdfRK}LJ^RN$*X$Q^u7tCriCuY{;&c7%zWa(gES|OVSmfMB z)kk*^a@4VkY3pZqu0cLnnMt3|zZ2*B{QJ@4;Gf^_v_8E?_zyXsBXHpV0V3yePJr>* z?4re=ZhmL5a;LsuWandD-53gzcgA`e5LiAXDU@b zsPD_gTeKfbcAkOEgId3`T(ZtSr1?>ic1!koTAKYY;~PuUZppl+rpqQ5r3&jQ7hk0L zGB0BAv~M!s>B=izgOwecUR0!g^!cmy$?OC8dEW@^`svzlkh2Trukyk4XD;r}2QSw5 zt?=yZ`;E(foXA~YZdTK}aGIV4U-RX|oj1K$>ksYRsL;;;+}XMa@S=Usxdr$(n7lAf zg#3#s5IbY?AJ6xUQ?6q@wQ*p4-slc}FY%(mnV%_cw|pBHR*1*>9hraT`-6ob`N{mG zrQ0lR>mwFFgv&HLUI&S228G@a>I=6XQtmK+7{@W@592t-{9zo&P+r{n-b8UsK6oeV zt5ELB#rG)PvOiJfOTHJ@^k9Yc%J@vvi;5%qlyg~4kF34Lk6XU^Wm{j0iZ^I}dF==J zT=@aQnV$=}-9q?g{>Av==K0ajTke7!A7K1!$+wKdy5*ZzlEVm{H z7Dq=#vl}Dk&okl$*kSPXz;VP2dD2_bhxk**wSL_CTbVP<2d654?~k7@Ir-p4nqR6i zo(?Tu3+rYNhs{q;xQ~tF9zXtCC4SQPe`-$#Nhkb9zx;`Iy!6q=e!ejkf8A<+=3;|C zGX)QS?BXvUZ#Uq?hT?~L{OypJs-?xq%tbkm9&vw4&kIq`n+F(0x$9WYugAeZFGY{~ zNs~*^ zWL?Pgo^fkdeNNuKruF?%?MqA_)i!wI@d?i(ipQg7Z;#${itfXMzuQOJlMg89zJB`W zYGuv$to{-FT(|m}zTC^{=WYPEC>NdbY{F-HmxXVIhcAiO{z>tTtc*isGavmm&50_-(ozaAM zdnR7a_n_T3i+ytalkk&{B)qO&dS2vO+MPZ}cah4Y)mPDK)i0|&SpNb4T`v**wqLk! z?;~tI#>EF_Z>znGLptVCFKcs|?&@Z`PWg#?W^3BT50N`x{Y2?-`9)`u4tL&!v#aF} z&QpZ7a}6*3U|4?{(>=CMJ$we!^EghJY&?*)f9M^c$Mh&4{8jbVm-E?TM`RvO$Bn*S z1pi>S-1zv0-!|&UK`HzEvefwax)gjH#y$4EyN~z10#{x#P5J5D>Ei`HT0(yN^lHDF z{-9rvZ?J#x-i`JTE-+hJ1Z9aH+3w&{eM^WIdv zbVLe%p}@y-Z0oRooN}n@CC3Yi{L@aTJ^d2mj@1?iaQu+O?VM2d+l~6%Ih81Xr?2q;*M2P4)9<3GW7|J?$h1&h@-4r9Disx1o61@ASo!naDV!dsA%iqJ+=h^sT0MZ`4RL|Si#5#-a6WkZ6t(ObD8Rw zi%)oe=3vGAK+)u(V)Y7*)vjlwuyAb{%xG;*uQOLI`(gz-^d3iYK4A0 z*)BQxpikiwzjn6jNm%9gdXe*=Res+m_cQQ)joq|mvQ*pc(}jL>@fPGdKgW-I zOkU%0;XT%G7N>N$^(c!|y0{J{-y2!{VCzs5oJZl)19=7=n?xV;!2+$%_ru_$&%ZN3 z{~+ZM?R}a2iSi#z@kRGLTKwh1yKc77<7(woGM`7j$$kcVPyI{V6~F!HKeTtI+An@6<+p=+ zNxS6h_g}^5HpjR0pRhX!(d51rrNh^^wVMA_ZKt1qh2}Gs*crY3BA=jlU!~Xajpx4j z_^uRuNu2Zrr6bXAvmbHXYW5?JTg`sNajVUbPOu&)-vwzsZoM(;TBGX^$BO&x6ngeM zU7IcUGOW^kpU+z$hgH7U@sRn|$L<85w`f22%^FXRX3}%D;+qUT-^irrO{AxqO^@7nqjHc%kNUqR{?JfO zhMv!5(!+T`vG0_hRDVSs12H}6alCw{OyVXfWJ49buJr zQMR*d1L>(h z%ybXw35Q8fG>`O7G!G)*D>wPicL*K%;P*}WpVNGvC*b$jX7QJDUWwA<`xnRq;utp{ z^44EB%F9iuxba~bw*Y>o)PsJ1OA3BS=R;VJk9UE}xseL={9y7oFONB4#`3tn`hOY`e#+R_N zRNL$NRpLEM&t^Y+d|GI6#0R82;xf+POjCVDyBp_k+B83`5Ra^HYkR{A`&IT^Xc~CX zA{mcp8h9G#aoDf2?rn4hhIgT*cW61k-H=m%9tU!e=7Z~Je;#L8&Y6_^f>pkf{+_}9 ztI&VQyph%`_dV!S_l=@|E$!a>^q~H*n#k3kYgux2wARyHZobxoe*5D6ps!uqFY{TN z-$3f{M~a^9l$Gwh(lf49K9^SsLL zoaI=bsb8RD(Vd9b+qB=@Im?9{=i~f#slIrA_);w=iYULlt|~R!HGkgN$Ft4s!w;mq zd|#&g^X*}~;@d&FshA#F{Ndx-F8T}lFB!|4*Rpbxp4TEBQO{voZ`5@VpB+!tC+rVe zD(5$9+Sx^)9^E%9I*T9XwIBze@5_=7>-{V@JfKg%T$bJO*PRbhdqex?*4+lpuPiF^ z-XYm9qIli@Ala8->20jn_U(%O)HK>7q&1wUH{&ZJe-%(K^vnCVK#l<@D#p=V`EhXSXFzb96P?U9`iiHo?QjK1=or_0 zACD|oYq?j5{`q>hOiH?VGatM`@g(;1&x$9k{!ZH!br?UZ4_cb-4r`Av-9>r^Egmin zvwUL5O%8Tv{$J?N2j`N$3eUqV7r72lsywW8mW%JzXS8yaJ_oH|7P^SbMsEhrC{QixXE<(N>A@e!8ry_=*{V(TSh5R?|`PFYn z)_%Z0W#Q{@M*c6pd&QYim&r%!oIcT4wcqZ%(P%BtJ5TqU-~TEPGS`Qnvln5V<4MTH z>LJ7r?EfTAp&|A0DxS*}jq20zILeXEq#WbRaD?r3`}5qm)y2jBe4TXDI2G08Q17Dtlg*2sA~h$bgO28xb{TW&ap$uckrWA{`Ai`eT(di9V6Kd>nEE9 zZ#qszJu|){erDZfwrgaIKK*`%-pjd@nh*G=1K#9A)|E9snl(!ail(>ox!A@P^QD0N zKqp9wrjxLyIGo@?^lrWfyr_Vj@5%DfTGk&~yM6i~hhdfd4f+mwk)kucp$U$vsNij!R_Fv8UvZy-QyQ`@N0NXaW1%og+|yqn2On&&{v&O@UR%c!P41 zrW5o%B=@|@zDKPO{qbw>K5+O6i~s@mV`01-zlT?oFWA=tj=1uGyI^c!TR}iM=>iYHo~gThZ}skB+4LX-@s1H4{JZB z@yNVP%l3UbvweS5d}%zsA9wor?M!;MYWddmY-&l*jhXcPY|`|6A(NhaNl(o0an>(( zCA|(*xdY?M$=CO(%=*St^=*vnYuheH-+s`)4{Cis(45Ke`{SAQeOAjS^0XnYZ&hl( z{GD3gwrZ=Q&<3Y4G7L znXd`!qwJsI4Vm^M9k;o-9p#Ie`uag7K*sxuZ&7iK`0d{GWWO5gm3c)Sf64jL3g_-e zLmVbmG{l!jNxb3naZK8=lkvXc+iuT5$15^!;dsyX*SPOiWISzj&bRm5H0{?n4nBH* z2Yy}dhf%)!1sE+W~J!5Lfh3&x=ilk zeOQ%Qq^n4K>$ekp1D&6~33}LR<4D>`#6i%gd~mBaROTNH&wPz5-S;LUH}MmtTJSX={DE}a`7&}31LeDB z?dYPs%eou+Hf;1yuqi$`zZO-MY#>@4>R3kdNs^?qIslaqH(7i zFS_{OpKp1G_6zyq=cA|c@*jSF{wbPI`{?Im9WI%-;kks#K3jed?!HfqIxe+#QXiwP ziz+e437E(xbLUncKj9iRv8@Q7{J|| zf*X~2booxy;Al4hcXtX-?X%gRu*!DBPIn5+0RM$YQv8wnWj;;u`f#_U;BcO0SY^9? zxSLaO_}(V0vfV!1O)0oF3deT)a3d+WO$x_$`*7719L_I^?SGB@#`$7yeE;Hc*xezW z|L)7ZNaH47PMm$d;*LhSfZTy^U%wslI$QP0FV`TKDL)B%`;G7KP0^b^PxSfHPQYJm z@b5~&qyJs|e7wuja4L7B+MmAP-YDf!Zm!{9k}8LFkwm^&-iNi}>fKN8yk=T|M>1pf~d{wMn-xgXKDuZW=KK0WzA`~}aQlJhm_|7v#L zR97d{bvtjWXBN}LJZ~zR*RJWw`U_tUocuh$h5Woj<%jcCvW~9&c-EnLrPqB2UdZvi z->!EGL|&tVMnAJu@|{2N=|H>&e!WTSJDTmQY@*$;b(X9+Y?_oq9M+wRcU~*)k@ZHk z|8C!U67Ni>pC}T)Plw~js!#gy4)rpLcWCgvc*oYK%l&7$=)Y6nE(K}01j$}M$dZOqW;s__t%ayL@T76p#o^q9?SApqOe@d_Z zDEb*z0+h-*JoM7}JKrw6Ck>}@XEQwm zDgC`BRgQ73(?^!~_5B?wc-k$(`F6$W?_z-u%}Kz#p`8?R!04LuvV_1Cr2x1$E%eyZJz&#!Dgw-S2d&MC%xPI{c6 z^9AcUKhigq`)Cq<8K)e^z(F*Y`xRzMeFg{J}ubW5*t`fBMln)da8_TT!?`Wf=$>N`>Di`Fh?x%J>a*Y6t73EZmv z5Bg@yeb+vI%BPbz+DX7YF9k>cMf>H>8vxw1Q*hK<@=4Yo<9d%v!J*&d^@Y`>8|~_p zKY{n@DZOaZ@kOFP4({L-9LGPT)5o`e3XbC+(&@uJRp7+mnO)yNd5X^m9Bm;Nlxxfj zsy-B(_Zzf}op5q4`>CmqHS!zdANi;49{v*IFvhp=6PVh`2hUOl`Tgen%lAZoCo@mB z{V$9g7pDB%A?n|@H`<2-+q6EJ_t1P{V$QJ0XI*U_%%o;_(=aApO0$iu_Wi= zn4X$HOYRSF@uK;q;*jadMtwT{P0qy;fzkR#?Y*O)MTVIF#_DTup z&8@!x-)EUUp?vxM20eD)`}yTQCFT73U>E%Q;OE>vF_i1J`qrUbMak8DZfbWteRgma z(BB9>-+Uh z7jp*axC=yNqeyPh9}G5rdQcEUE{CO#6Q7+*G~vQ>4q+ zn@%Z;`p=Sf`E=4xnO&FmJGj$QaPU)Zo)dg>a3`nW;HO+We7KVYF7Z<)Ke3;p{P=WH zE++OzeHw?%K|Do%@HQo^4DI@2T<>&D*N!Ct`Ph-GaW8mA-|P+Y_~U$+@(LGJUk%uLl1O zdxe>yvgPN4KPy038rNr5eEX@}Fn<2NzK@n{(s}=}OEjtHL#>iOeZEaY|6IoR;NMN( zk$pO&)0DnK+r2si6|EgtJkgSk#P>$SH`UJn8A- zs@!ZT=ga3WQt*GmxXkGG@%~ic$}9PuiaV#MslBG}VU7F&J#xi{e3xPEj^m^+Xv3Py zSFOEMq&=YfYNmnbW8hyCp3i3ExhN_3segg|r|Xx&zWm(1d)R;0De3U_7%ef_3`#ENP90{rTD{gC!ZIM z^I00uC)V8>?hTs9aY=lS-8|fehW@c}xn~#D&I~J>z|{}>{$)d>9K(Ldxh<3mk@1vRmRq$}{RIU@zeF6Z?|6d^Tzgd1K(=W;ls@lIGLAJxsbR-&(I6>W7fS* z8b2G~V|g{Z0RJnj)&AdlC+v@ni`LQJCw{m`2~NvD__asM&!PX2|2pwQpv#Z9-FE^0 zeBCLaJN9o+*Lvh0SZ!}qd_dbDR%s8Sj{BId(H=xy_b^?jJ&1bl(sXp_bj1@LCxpl^ zdLgWaJYS*@8UOM;=u(yAu5!l~!)xQNuFZy*@k7+JiRodBALflSJw!g0+YclDPEK@1 z-8|1C>V+2<*&`Y8x$H^3KO~+i*K1_|qNNLLe}~mmJDlk*(lJ;k9i?F_@95|y9pNzX zM7`X-SK+eDyHN0x)n^v>vc;ty*u$4 z>=5MhCXr8Ho}JvbrSf540UxCDVP}#5U!Oy~c^CEbZxGKd68ujjp1bVcCnui!%+DI_ z+(hx*`V@Stc&;vRyA#iKX2vUCdbt9b6JJN`cL z+_VjicA!-}w=EUV-HJHkU2NB6;<@ASo#`avxtV~g7{79|e>)Y=wd4IR#B&FTJ@WCj ziszmtaDUHuZk_1o?!F!5}mdyUE!ms80y3E7d_=)Sr zvfsqgTsM~cdsuIUbVNn2?}Y1(z6!@fQIYfWGB2#~GTzjBeETqf`D7a(V?6855Ble= zLZ^*8_m*J?=ABEG`?NgfU1VD5@$>Cj$ZA}h?Eq{lu zdkj{3EzNa7pDyhen?La9XAbLzU1WQb@$HeQPVU*|`r+7zH5v06{dwa?oZC1{UzF-> zM^k;q2fx0(`;+?QK1OYSvaWfy;*)hv-4+${*n1UZ{V_IWbB{SmXQhQHN=MSbdoE9cBCY zsvM_BM{(R6Ryj_Ojxu{`>t}A=d9Xx27IHI*&+eZq>~S>Hw$3|d^uX`PKe-XvYt0iIg8ix zHflOrvcdA*`Y_M+iWUs<{mM1^Y|@hp6n!vu4xixbzzMid^t-AbrP_2Y*SE(MU4OuO zs{E67iy@JpTVL(l!{h-k{`=+nWMJ2QP(V$6aRa$O=6hj zKE9^>6|(=#$<>(cXM$Yf2YmRmZ%?B~()h`FN{T1y;yh_Ak8XanLO9sN`Pe5~v$T|7 zgLK`}qDH=)hIXGA`1U86nk!Z2YdaHrcDNRF{R=w_k_x%!XujM37miS`aqm3dL(Xm< zk;zf}fp5|+IzK4px*;x9dX^Iqblm!4p<^BAE&KMmSo_QQJNe#B=T~Jt*6bSR=j9xB zrn@*lAJ)y!^st|zL(HBXD;3BuI?3$W9M+o;xIR*QYOm z?bMJ~Fj%GE?3=<0!z%se(NoT3f9F2>I7&LZln*|le%9AlU~>0lO8eDsjm=Q>(jRYE zz9;)LsW;^g>W%nq`dd@jLT;HB6gj6K+2ehh_Vo+rulwUe$PxNy_47nO>>QJ@+N_fup zX8+6yYbVc%+~#zhG#}ige0Tf`ce3BTTljCj{oH% z@AH7Yf&AxnRZr-u5+C?5OXSX-8wfhU6422h_?_J>+kR7De$#g48=udThk{lVuA@DX z^*+WaZl9UO4L)9{2iu=3a=zZ;u%M`T+vi3-)%D?!#i+sQZ3%_62 z$@{eb%?AwJB~BrIX79qf(LHQ&-uY(d=19e;$Lw4g2Z+e8Z1KON+nwj?*FPd~`QYoU zrv=?{JC`e3?T_P5ZIq|2W-kuDMdZ=!j_f;7yncOnl@B&*{u7OR^1<1UgQ8Gu6n^_j zAK?eN0S6X6_i?_rer?t>u3wDJ)?&&1z83`Bk%Rk{5II2Z_K{~kI0xC{pGV2BS6ZA{ zTw`hHuZJ`}cCCVE?w@FfU%ZU({kZ=Fr$BDGPSuy2t?{8-mxR9uVQwAU&mY%(u46|_ zIF9q*59oXPB|pDY^XZ?Wl^jp_^IA&hpa99wUw<5xH01sBKZX2S`)8P+Eppv4oT0^p z-c8yM;G_J*xoS*{-e^44LBHYKfi18{=4br;O`30hrAWUb-(e`f-8!bT6FZBW)Ly_C z%MZr|ZO3@r;(7UAh5dIq-=m%Pz9h?@FrXVN5zejS0{&~#k9oaiRm#QtIN2{@ypNOp zk?iASKZNlDyZxB0m||YdT)vuJ$wCVRBaM zWx9)U7S`u7-80VTbhDGQh%cILaypmwVtxc~Tt9+;Zx%b251y?6(Mrab{`~Sd=&xFN zkz;MoGNxgFI^|E`dDTxvU)PfFzTe&gdGpFI1wPMjcU$?FqWl8((-@qE{6Oz?z^CNS zulEco=hN%cH+B*6`0%Hoo+aeF@Bfsp)d_sJ{E2qW27Zqo<%iKD-?98RN&vruf3Cp0 z`5@U(pzodC8@m|L#G8|+xsPD%EX@w$d+(e-o6r91Yonj@{mZBni40Em^Cy-1Wc+j{>sv6*>Z4;x*C+SA^Zh!~ zHCARj!Pg;O?;#xtUeYc0`7eNsmIPYf$GZyOuUNkV&%BKSx0d_n!;f@p1)=q0IJ%1U zkF06JvsCb){5dGUWIM+>EBQSg>?$}f<1)<$-y8Q)k?t`5jxON%E&h&fhnDl{#&`Yx zcoqD0?FiSAPmVv>FC-$R^7j_y(~#1i@aY6?XV(5bA1~VX$cv=^?7j)PuT1guP3^Yv zr?tDdP2*UZS0f)fwlZB~`=hQcOxM|NId@*u6OTV>SLB=p#Vh9{vOj7(Us=u*WV-$^ z>+Kn3diVjR=ds=8V-M5zMkmn^MRRQb$obR@7ysooiiRJ0vg$iP>5_dKN_V;ASH{QB zXFZ}X6Inv+`RRN9~667(Pr!S2REh4JuKriz|RyA$lt0Iyy}5xmmS{s2%MaIul#ax zn;SR!_1$H9`}~{z@7@u;Hhu?=@7|q#bo`KWwH3~NXA>SeU(-H*ZMWGE(0`<7ryQO{ z54k=aeo)ag@I~>^EGr+TczBZX1PGT)Me@t~PIjTR7vu5isqy&xr5|Pgo63#jQ~dq; z=wi)Jw+rpL>U`J(v%6ETRy*LsK@KFoWce!F1-c#(d*%0QU#ed_Q+^%`7=Z5-6sY&? z6#P>KKCH4HA8(J!L7VzbcP=u<0}=*29!)1brOLS~Cped0LWE$ByoV(y+~*&z=+?B8qwpGoqj_nNEA|h+`vBc@mNx3+5cpK&cXs~w z9mh)G($LQeXWy;(@(#H5tRMS82hgw9Za?ln9B`us*Jj^$EHk>TUqRpWRK3s(@vG|J z-FMHvoa~d5lQxl~(EGjxJpsJ=6x?jg4_P~Wd_f9sKHy9*eYn3q(8$Mj;g9%3(phW% z9^=EGM_kmdad)E6hiiZPd`5dg@3+KW`T6Ka4%Gtnjf=xq2pnuYZfnbJ-~F`;)NcrJ53ZH zw9@Z<@F?qFXL|fb5it1`roKv_KHURiAHxxgFE7*ADj$bP|AeJ(&4}&ex&i9v==>)8 z*lT`env_HQx3`p(arJ)z0ph>LefVvfFL5gQvtU=_#(u3|){7NSSn0Ji`R%t){W8sq z-q)&r#oFo4tM>2rI8M&>mHA<_kM4U`Ti3AoPu5c@*A^!no%^v`GTB$GcDFCLg?w{% zblF^{570-0J*peuuDSvCaGv&?KTZK3^TB48cXn-gH`8VpOEubaw+;lo#81Be+^)}z z`Euoh&0{z|K%d^wr+TS;?aLkYB*nQOZfZB@8~>pEl=(mHk8;N)lwve=Rv* z?+VI&alW?0`Qg6Yq3U-_c5fx@Aq=70_agUrD7@Uap!$-`b5L(&-NoM1euzF;n*JF2 z2!4jk%??a~*O&B>`e=|xXK%NEhWoMZ6p(^Yf?rs*xcY!SH4VJ@l})bm!5!qwY7r#) zWyNFN7LRqN;;{>1$1B~mFNQCU$JWhlvNw*-56T=;X?;88b?QMWc_rVHaT)tLjK^i< zTNsbaOn!#h&ZxkEDLR_%iC#edMQ3XB8s_iC-97HU+m>}Y<%6%s2nF4GjX!VNE9Lxn zO7(J(_@T$J9MH@C9%%Hhhhh8+r1ArwXIi{?v7`Y%H3hGB(CnU%cTa&UubuuF@PsA& zU+_u4`t5OYTFC98@uFMLpCk1`5(;uS9-d*%{LKmTfhLIk#))W!q)+JP^Q2BbZQfMo zsoC!bYIaOV`n#WS*yc6naXz=z_d@Qw72gl|_742Xj|x5O=|B3W9z%L6Zai=PJ08z> zsy-!hGmGh1ZWzaelaw2||JUrA`)+@l;eS5$wyVwXbKN2837C%OdpZBRJ8_EBn~KCK zK7U+1^(WE$e872MUw(yU@pv#FY*qUG_!aSWyRa8gJ4@jBI7t~;jNm8?ryJYUx0!I-x`b(QYt zVO-FcyHV$_>&j|HI+OG(VcRh3{QlHOcSQ z()5Eb`4;k2Qu+9_+6CV(eOxHd2X9yU{rt6>&xWV#ar%jQq4a$gpOb~d=6MX__wjUM z+~nDfL7C5p<0`KVHvQZBPJQ}#+AaQnqm)NH_0K~0;QwLoTj1=fs=LokxMV;p zN#J4_0!+w*I3+qjjB$Jri(njIQMn{WT5`Fe#MIUdQOwCvn*_uVwI+ZPBahsBXEHO2 z8f%oO&v7J$=ibRAKHBg5{l5DPoZ0*Az4qE` zuh(Ataq6%8Pj-m+xbxRvdwrT_PAV7mxeB+@B~PBWN4NA>dnYePRF|9;4Q(zjFc zSq>@-<+e+D8q!Vkv%am8pY(3f=Z-a65A=dc#Jpma)vQ!w zd8YK4LMYI4R1Wx+3NMl;`%h2P?KjhJleF@GNH@`=LH|Vm+I)ulXu@%IJxBg}9QTR0 zj_<|Ne&*-6{sCd|3)^)&`6RZ6m7{&~K3*%2)Ne`Uc=jrNe}0cV)AglUT0U8B@sZbQ z`d8`id>=L_^LI?&r25bNkJR5W|0DI2&HqUK9kmaBk0tl<@fSC2elSzhOEG>_Al1{A zj>Tv}i~P#G#O4*rRIOKxE|PLt9LMx?8pm0o`Z|r{n0`*Lk4B_)h-SLe#nFLHSd%Uy?ZnZ7wF{1U>aK0zF~C13la_LueX5BjQ&e&V>B zK1%&9^Gm{W@&C1l{?EpV(>#4m z50Bogd`kEe#NX+XaV!^}ZT^nl(+s^J^r`x}_=cWGNbDRu^n$!k`u52adO_36_sY}t zU&zO#ug@z&`kse=rt2!3dIZ669F?y!IXa8<3&xFfPUkrRozEcLO=@StaS?gin9W#1pJj`Tf`q-Sa5jmt=lS zI9_YW2bXDiwzK`s(C_JfCA}{pu5A~-Oy?iZQs94=QTBJH~s#H;g!yda(EA~5xhb6HhReqghw;@A54D&6AO`uHl{Mq_P<>ycf6?fQv+ z^5GvL(|*Kr&c`+G%Pe1?_44J8iGmmLI~DK!p2K3aMj$xfaUiA^UnBX-PhtKd z$ydG%^CwIGTA3;;#$CmtklCOSw zi04+x*ZF+Ycp!iDM*I&y?sMtEljC{@p7S<7gW1vOI(bMOY%A%zQPcVH^Y}nwaRHA9 zke?pC5Bxc({!Q%r(i?|G5BYePqGt)9{1F`|Q1r2kv{dw2p&+{|NrL zbg8D3zAlL)_`Exwu~}ZE=W}Olu=FA+7tc@zfLvR8jlExIY4tn&JV^Yk74kl|_!aon z$}O>a9hP2X>B*K}Xz6K|mL&MR$I?CaewC%?T6%@0yDYuT($g%x!O|cQe$WS+o~a5r zp4%b$p*`Sza!KzRDVN&!o1~c7tDQg<>%%fXEf=0C{v^IT`!kk^`&|zo(e&GOT=VeV zkK(xf^#Z^fR{1D*oNen@hXuaxpTs^CO?PYDE^gTUbG-+ily(OcAKW7)>GA!7Kamb$ zT~**#yLT&H8v32`q<2`;_Wf?ejWj*@h~lw)yQGhQzxQXPy=47ip-ZykkUYcr2Jhbw z=gAxg*JHE?zR&Fw2cd^*0#5YpK(5}Sn0K-KEEFMqhjZomeIWPCL%0o;t8UpT^t<0o zVrA%+k}koZ&`)&z84oL8xjtk&kL||zHV4phW91DW=Y0Roc}@O;g4P* z9fUqHKG66C=1s;28lS*=l%{(hF+MQ9=zCbwMfs{B;)femUP=Y^2Q$CM&)KOwr|0l? zn4eu!IdK0cq`UOT{T}NV^pWrd>G5K0{c<@e6{d)sWc+69)G5CiU#I+Le4X-}^7VN9 zR+O(CFcjC_C7aku`mpEpD4dOypB z3#6YoFDC7k5MSpnj7#rCx)^og|IPWgAno57^6$TMoQSW-{o|UC(-?Zi#v`s9f12Kk z2UIT--|p8E-)Tml>HkCe=3;iYi4L3DFY|l-{6wbbbiCt+@w@3c+>0P|g+HNuKkj$_ z&X;!M+SO*4-7i>a>4Rb)v2VlDhb;Y8OCQ#>$$NRy6qzYj>^nb{SB{V0_lI+~QXcou zE1orl2R&|SZ4ds6r4=8N}S{^R&P_%ZI={j~LKiO3uMvHbUNKPBae9r2^~ zQvZ&Bx!)ebKV!P;$IpRJ(EaRO z*Wir182vl`4|yEwk#GHbmcl)S+NRJ+@*MROqztmpVOfPntUPJw_p^70@2iHt>rL0AbESWo9Bco^)2kfU zrge-q@vY*^LjChb`;PlUY0v2&+SR+bKe=1^EzA$?E&KJRCjR*=AyBBtCLyO7y~pH5 z^-{V&_huV6KM(HXIHYuGw=PS1LoUQGVEd1(Z?>P2#J~2d-(cg#a(g}xdp@M?aUEX# zWt)%1^-S-5lI3bv4x_|*Kjco~ZPI+g`)ID*0V$_&;<}C-%MG&Ju)%{HDfHW@X`EXU zxb!c2kj3(Mf`noF5#z(wkFeZrxpLeWj(xr@@ZO&*$9T2(H-xu2S8fU81$CvfpQ~a# zn(|0IXZ|7iX^D($7LQi{A;jP1ZyEGOnD27)G4PMu*>pd4ZG-Zq^Ml#5be~X7{fBsp z(lLwQsh`3$1uXeF_W#KEn0;hF-`$|zQNN%(=^SY=(<3@B%Sl8Q;f{{7U`J@~ozDt(B6_;#ya0+TvRA;FX$Q-lO&AOcy+p1)QaW4p-PY zo~t-|?e)5k6ZLvAS}x^6zNK8X=mFzn@)1X#^tu#$g!!-8#iOb>YaN!3%zjO_bcdzY z&+vV~c|O5DN#O^NbA|0)g!cSgS%|O5cPeMfPsHz%oF0(4UaAK&xqWt9`BwQt+)?l$ zyl3Uhab9TpDa5zO=yP^X&c>4OGjrv}lJ6 zxP_&4K8kpQq?7e?EkCkyU6$^!wDL914_R9I9{Y4Ht#T3ESE6vYsJ@A7)2y7%@8Y4w znqKdIqtZX~8;^+o&-_N4N1NZ6AII>XAC7n4kBA4lq&@Qa?B|hh)DOz^{cnh#xSsK1 z{PlKwmQHcM4T~B0h3%?6ReHF55dJ=VuPKyY+Ebr*h4%CdEH@%xBgU!8j~*{}J4tw- zWx2rKi(XIVT*sB=K812P|9XTFv-z(2V*I!s8nW6c`XoK)$D9`ueRWW*1Oa2bY@00vWUE>hdZkrc1Y@bB0 z&6@@^4w3ZPylT+n5IjxT%r7!-=Kr+YhjkL}P4#(osWAB8oGNDV18?8sRo?!iIuA(O z_juI-88_TBBJV5p_o+Qizn68hq_gj3y+hOK_p;uqY5QJQG5V3fDNWLT(eDIXKQ-?L z9~X6S;)|u*(P@F7M@zld^2Zt<*T16`t&jZ+BLC#C-$%T#h_6cU4aaXo9l~Ni#?v{( zr02REU;XrpYR8GE&tF(>Yp&e6Ukb`WH}E(5EPL8~y^Qb2@JG37UI%KuFG|({t^dUT z1@keE!^$7!j$iZmgY+lWcPDy}*SO!ES}*t}JJyKb(xhh?XROO>*+(zv> zsWcGQXS>AbC9iG9e{+Bj-@jou^wscY_3K8qDxGSIFW1x7v3x+M2Mq4(P>*~-m523F zkrVP|(|$r*uS#|t)^Xl)NS>^RsT1lQlr-x#?I-L!Ao+1^gW!{N9<}s3OCOPR*x&ta z#*=iW+{FV*cj3c7RJ_q-w6?QP=-zK}gteWoXc-5A8}RW4=y}*p)dPqFQ8bFtbo?Lf z45jfMd7qwRnJTZF?52;;2xP2e-x+tg5ATaQ1ph8JJIC=L-hMv27@aMEp&x}F)ozV{ zWcRliKI#1}7H>-LZ_$2?A79md3zhoA+OLMe88G;R+HP{yG{Gmi0*r-UvVfxu{+`28 zAf5C%R)5GBq-WbWmGRwQjAU`DbR9jXr+6EwFK?Pa*G*@O2X|A@S8LMDFXlUufO zoRtsDg|h{(mh#3Ip?qH0RzB4(j8&iQ-FXSx8!`QOO1d5-Kf6V~GX5FX zbjm-vP712KP45JHhT{?H$=~~C^LUM?hgapwQ{LjbwiCjw zqFi-{>fd-|q003s=L;Vs>$QA5v`F$VfU@J8(xe&kJ~n=Ff0g5S#(mI$_{rGt7#_2`M*Pd8ok%rm8aJ3aIIW9pfb z)C>K_3y{<9zF5W$viSZpq~5sq)cp_Wjh8`h6r)cn-H9ZAz8;?Rs$Jo=csz{Yb z`fT?n7lW>ieKKz4iF3?vRK4uq^YZ(mlJ0$GpOjun?_Nz0DBelmZb^^7PX08(D}$?k zNZhb?d(~g63_Kv?8xLB0SM?CCe3`@$_zb z-&#$_f&Rm8(YFhguj`hNLFTw29x3^uejI(Id3@iO^RqBrYg%{zT(0~E(YxAS2zL+4 zVVz0Zt9EXdaS8d7>-+va<}jal#&zXa^2h6k!~1O1zX{;f3-{d_#M_ zbRYfgJm0@u;KU=UHxLh!ew=gGl?s2GJY=5&^-0pH<-&GXu$@g>j{P_czY_bN1dh)S zu^uMrq*LjHIFqGq{DN^^0(gY;9l)WTnI!G1pWNz~t3Qr=R1Kc;wT}nnO8Aa&=)qy% zl%!kzbfpXSCmEbWQV#o^EPYVYVZRS^9-8Aj;{AB;dvBsgZd3aBdIifxZS}}}DHsnN z5j_zP9#uUb&`01Iy~FYSr-#~&uNr_5?~w1p`p|D~V^obkF&zU_iJ>IAEtvEfe zu=&dZG8*`P4!Ixxp{=tNqi+dcW&QZF+L!uQh0jy_Q-9FX-u{;~ZT6_&>_%l!>sPOu zF73dMsC~Lh{jFqy`sc|UEP&y+_6pT+#mMcG*_~fDfK5@S72H%GHzJ74F@bfH{ zyD{QNzl?d=H~xTpspEGd^RigvT*Su^I=6BA286W-p^RhR=g)Z5B-tFdPJ3k41HfH?i z|NVK{9YevqY^JbT)IUX^r2@Seo)dnW#B)l8)5QO$U&8Uiek;*8^h<_=c((7$YFF-H zQ#qaMv@5s2shsNFcIEa4G@aJuk(yFE*?`-gOzYIHh1Vgv2)-S98j{O;$*w+7(&aXvwOxej$Wpab## z_Ctz4UOz>=Q51dv{|~(IA6<|$G8nW0FUdW-@{tH8 zHaNPji*;>F`#N)E>B$DC!_pm=K49(my7M%B{~@JEN{1SIr{lfu35JJMQT`GNJ{ z)V99Gck0S7CF9Q)I6=Qww1wmGoypRl;};iOO|D$1(d}*yEC)eTU~U zOFv!vQGe9Zs=uqJOE%yt&JNe-PjTJg%{jyB8@xF=c($I=&QGR%kPaV(U32}GY}qGr z(Mm_c?aQjiNx?{KW zGagoc3HMoi7Jgi|U;lC)r<%#Jx7Nc&;AMY(bdrJUj!mU}_29KXld z&OR*2mFoa~;=0n=<2&Jg)US!3t?SC=!mPG>pY)srIm?e9^Or-fxPC82FBAe*YFDfL z*u4#zKW67)%pN4|?pY##4=SDAE;!!tKsLVr)kk}!_PAU)$Kut$YB^r0{j2NzJJV-+ z4nIltncnl1r25S6c{+wZBR`Rz-v&L~(Rm*7)3{4*rTG=pG%iwmv!%N%{Z>oQwe&kI z-6LrqpHksuIk`Z;65(F)mD#~-W+?s3xWAej9rtER{Ziq##j_0Y6FIm|%M<^tqm1+A z?Vb8LIBzBV&-U`?Dc&;}+9yVn)vrDo&)}XJ;j4`9zqlPaVs_*R+Al_z2o11LImL6; z51Z}o4T9(6R!;p%_9uUS<9DUp_oZA(4p2kC+5D2_qkn6Ld%cu@1G^19s&+d&&!GMu z?r}V#?^S=L=j8*xk@~*fxd$01lPk6#o_oN0i}W`h$n50J54Ib}Uc=Ay{xQDOwhDOA zZ|TVO^UtX-YOB;vOciiZx_@J2jpXO~i+okRlYFRlnSK;WSd7dswEeV6=Pcpxq|?qZ z+4uL7&I?rz>gJDk+rGBWM>W4;dZX9&T@0xIlgyeX2qtF$0sImTe`9=X-`g3+*Jdv` zPlFgem7FETf!`k*pQzknexmlargDjSwWU>VF;BF#%C+x@rv7|0K*sgSLZ8yH?w2(^ zG7J2~dJmvpDY{kgsGh0*nd{?XbhqTYe-{7J{Jz@-F598}`g|n2$MysAKHO)T_lF** z9WZ&J9d!R@`PX><(C1ysuc2KQ`@K==@B3QA`maO%kiTT#(Izb)mU|V-#oIJLKdxbW z^i$k#a(hL7eHFh?J!JJU9j2e+{fPs=d@;)f{)gaW?c!b|8E?Y7jOBJ2JP=j-Sz=6VY%~B z4*MwtU+6E9zYyPH*1NV9{@JMKe2aSGcZc;3qF!8A`x3TyhP0=AvexcPcl(F+zP9=% z9G{&Sn^t@F0YNa{VdoGUN<7>uLC{SnIrd@KAN;IlX2W72uC!T&z%4J)3!=Zt=* z%SFg9UjFZM?Fc_xKg0Qom;W1-ukKi(`r7zDl}n3bx!sJ@w918_cS_~J=PjnE?+3or zjO4G$e1h&wlg_I@3Oj~;jkG|&BR`pp3iyR_7ZgFhWJ~_x4`=or=f2JVa=oQ-qKu#C z>iaFqN3_p-?g{F5t3T!T!tDs+n_@3u@2$SZt^B?S@VDiA{A-Ef;c=;D_Fnxv+>@l~ z9g}rExuN~xclqw4U(wqk`Ef(#Ea{DG{Y}?X@%?ofAKXKrPdkSTe0AJv*3Zsq3a7Tv z@R@6A!`IGd?OP8ikU1Ism?73K;aji?_9Q2a%q23TV2>6@w z$8o=LHsyX;>{J%FxmXBN8QP=vt7i1U;4g!`vEEVK6X*9BlqU6xd}rr6Fv-Oa_fjc6 z>Z%9lO_gCp{xZqGU&E)coBsYkq+T()Ql1ryx5O5ghzCp$4Vr(k)BKku)1-W|NEtJ+ z@5xuY$lZ`9<5%prmo)ryAjzMc`rtPrFhrxlk$~@j!QhSPtx(A(cyAycVMr=y<9t9 zeXhovlG#QNi))1Z;p6%s#`|kJdV0?};pM3HB-Oc(@^!!G? zMZW1_`paE8fB7q%4_djr-%hx*-i!LqFE#Vyr)Ym!KGZ`je=f>raUDfGjoTcf-ZR;b z_cP#omzOsTJoVHy*K2>UzeVJ&RM3<0)RW=-GTx={uQ5GcI(eq(+dN&vIG6Z`fgPL- znC#EA1LMI;H3+T8oN9X;ZGxaf1Dn=uwH=6rFJwQ$=%Bo7U{=Y}^ZxRB;HM2WY zCE4U}E;Rk}!!6-BtdN3De1~$yNEyTRSE;bf;O`f{DiyA>w9XgP^Zah#+O+R}$a4`t z&g6Za_1EQnjip`QS6SNSe1)Y|ulhc!5PzPRCfyG-_47KzSN+-(!S}o-e7EQD-I~L9 za}M7PmR7p8!*_$>`}rn(U(<~5G3L9=Y`(iB$5%guTtKgjJb1h5e7Cm3?2__XNIxH^ z^F9PSv`g)J>13bxUTS!`zCM_v$AKI@OuyQGGx*=8*G9k z*Vp?jEoi}RX@BAwns&Y2?p~IAQN+)6gz~-u{GZCv6ocz=WuJGKz+m{rrniz#UB5_{ zTU@Bm))jhneS-3hfBf#T^uHawzm4zKW%}_Zu@_;v?Z7Lw&yH7WrwN_?xkl=R{^4Ha z`#d;lBbU@~l$ReiDEA)|KOn5XL*V{Y@fl_-h{=NddH+S`3mf%4{c~yz!d?59(0?_} z=Xm7j8Tt9b@8-(OJYZ8R+*K?W;3Iy2;7_dx<^kb+p^}5Y5AxT}@4p)5Vmk+f^#J2* z^ZPo7Eqzevg?r^JZGLFyUQLg|k3J5RD~?<-xuxyHY zUu@wMjsx~Jr*KxzL_daAzm_|mVexAB!_8l@_4A}#{S?3N3g00W_}F);a@(hVY3kpM z^BtWm4(0k>>6hsN_1`mlVDQtpnzf(C(+s~_GyWle(cp*jJlW=>3qdc^bq2;Y*`nhX zo1cyNm-@x{cnay9-ScC9TRM+WdbvLz+rHtX^IwHNaZULk>HLAEl~0n+zqhpVQPTO> zl6JkYwvApm40#Xx;d=Qqb?S*f8e`nmF0!Aqo5ua=Htsr({dVp&ZYUjNk2}tv#_r?3 zvx3fl=BuKK8&3$n$$Xs~uAQa&H?j4%V)Qn_r&60P^&EcEt@Aa+N3?#o>gUoa9l805 z`or{RDG#N>WbiilzkqyXgnWND@{7@R(w_Uj^pE)Sb>FZ&m;T%7#qE-RwZI|0wsKv| z{LH0z@!HSv7}O*$Us!XojrG4Hc^!pjAp{+hyF+j)xeZ%yH^?KJtY^=FTFc>OF6 zqWtY~Adi>$IT`jOFdj^H2KjlbAMyRpFXRUd@*;8~(S zTwYY}$|p~-@+z<8!pkHb;-z-Q;5CjaUtm(goyw&1g|8rf>fdDeJy+n6Upc>VKO~FC zpCj*a|A6Y>mURGKC&~7I*!ssz#XGk1s>w{7N1LA(;_d#;*U)dj|L>RGo}YUS_0F4v z{<^&n@$&V*HG!zo6O3Y^q`PWNZz=ZQT{^Aggnc|Ya&_j`!m9TfHv{`*fT^mr%|I+iCrLtbQl zMVI20?XS^vw!cQx+5Q?$dmLw6KgayAWB8+j??%Np)TgIGuOaRvcxQfv>E+JI{7Ti^ z;0sH4S^3G54%cTye^j)c(64pq;f z@c6G9_0~G!$I+SE-)#T1IxMBasp2=eKMDIIUb@D9pqIBYU%QSu3_vrk71HX62_h%I&W$dKa^mTV6_<Y2Q;-ZeqJOun8kbc=UczimHUX+nqO=ixEl9PR@l+`<>Q z??drvfm>HPmnP`^qaD1l&NV;r`F3!h-4-uj$0dGa!TXoC@Metx&&IQ%{L6km*0%n1 zrJwoR?e_O_957!KJ|mpJX$wakAfGQV4xisg^n;yYoT*dVrJPa%vi-PkR=#ZLcxL-? z?S9>vYS`oY)ykKtzPr-W&Hk9{9o#1;@3VbW1~1*eX7JMeYX?0BhtNmnPi(b(l|$%j%inDI2FLaTB~w*jVqH*C;D)srs>Bm!=D_7Z#~@XU##SQlAzvw7=O@H^gHXVw0eJ;t0(@|rdIfW#&W}& zFW;}FzZAfi{Sg6Piw*vtuwLN5@qRkDW1(N>Ab#6`;q6j zV7y*v>m8>x@g1X$t$gSE9$jyx>;5(M^GbzhNxg8K=E5GuyUbrTJlT)oT^yfgImqHg z#>YcF>gNXdPBZ(q6ZL7QIg`Qnw8f56PMYsy+o1M$z3IW4!c97r4_LoL>Z{&l{pNew zlplQE7x!8SJnWk=|8|X}!~V*+4+t6Ld$cm{*6-N%A@F`@dIY4y-p|n=Q+~_*yqyAo z>CE5zdw&4crsvb~p5poYM6ckyxx_Cy9`yXe zeP18L{#lPhb9~@h$dB|(Y+k~At2X~uvseVWmEb)Ch(jmSd1ioz7hEC}1`_a5ywToP*@)hn2fghs$+PT%98DBT; zL+dm>wSK3T>sJ0v)|-Aaeoxjbf8x7wT5kPrD?e=My_Vi*>HYTHV9x{g{-C7~$v*y>>3$<_g zbzaIl<+#?>ELS_>-&E?len)v>yf?l7WLWn{RfcqZjrGsR{>G3mc~1%R&$E4x4+Qiq zbzCBRMgN?1Bt7rJv)rLKl#%`)3(Ax4C~|~H|B~gmA?^CSI+fC-aQMvP(PuM>^)K7k zHDLR?26Y`UPW?&%X1PK2N8Qh?E~0c`{CgCBwM&wM$4O)Kw}AYjNEP&6{gp!hN@Jxw z;{lt0&8LRAtTgGFqUTDJIz``< zC;iz|)EKVki*h@1mM%@0Cwi(FeM#qGP*T*BUcNNpInqusdT5OIzi#`f9+dZ4J&hZe zCQKK+iqYrBs6W%@%Q|nMK5cIQJhLaC8l(Q%Vuy>-$K`#0L)S&i6F(;DxUoj;OL^jm zy+2^-p{J;y`x{@g^q{0GjYllqkn)vAB=)5|v1aLMk}gezAmCSw?veb_8IpuQt#;D; zLA%U$+#ZH}vl8~x?*$C=uZCTzJX7ISM)ZDY+7r^n&ryZt)t@zgDA=!f=yHss#evGW z7lL}EGNSW6-{*Key3vLFx7(BJ#captCmzo_XR69Y$k*>dIqaJdKF;Qm<}aDNCFwf2 z*_Zhy?>65|=BqucntT-_J$J%(pvHu@XePzy8uKSg6ISYe!y4bJeieVIZfOvm@eKMw z%K(e=^t3;Re%hh*^z}9OKPnBC$B?eefIv7;oCbVCzq|+O(!>`?gQbbRqF0^Xp*`3D zIB8r2`ze7A_(ad;kw0`?X9=9J9@~$vRr-`Bbjkbv+E>h<`+Z4!e9HIX^-q~A`I$eW z>p#8@7WOaiZ_0dNP^w3MeuH%TD9+7Rh8BxHu;_9rxlFfF3o3n zSnhK}9)E=Y#66&^rF|bQ$8D9pf8@_HJ|1=b8;tW0I8F@#7jd8aVbc4g>m;Le(n_WG zN!N%RmT=!KibSQ8+)w?4lncj|bT3AUr#HXJn`H9_M7@w{VX=3+a#iy&D z_IP(Zg`=JMj}`m=CjDWskMJk;!@Sc~;PKrt;rUE&s9vnpCJX(`h0CNLm5qkaCY7h8 zdz!qj+WDAb^a+7esdZVs9g^;^>G`@+VY{S5x^;2>SQB*9I9s^hy##>~=Wjn}T#W1- zSTMfA2R5D@->GGc|B%6jeiuKe4WGR0bIt7woB-}o*jeX~(W=5De8J23vy25Z@+bBa zN&no>$9^J98{K@r5)0#3#O*A6R%+@mR68G+I2^uAG7q8mVVUI>Sy4*qNJ_~erN6mNr(77gq&jZ4#^Mu|2XALm9*JD;*#M;pF&{p@@^db8GJ`FCRfs_R?l z=MaC9pNf{Jo}7U{S?@W4o=n#tenEaNMpsEg{dJ8a_`2y*w9An!O;o>_AwbP z|Gp;s%lB)$6;7+)0mXoy`%kowQhJx!<>hq^rE`vhEnuaGGCxt^U} zc(#o1QmAJP|5MlF*@gH1-Ig-;(Xl6f?~32&lBL~`>p`jJe%^t!-%@y-b##XK9@`C!No=w6>pgzDUxc zJc)l%$@+Er<<0#*z&Nw@J8oq0*{>~x9vyPMs{9tx`QrfT>nk3Q3F%3{kaX<32k_1A zwDO<(H42~f7CU0|wrpN|s&t@IGy9OfpDy`vP3=T7RUMVMrgkEks`FW#I~O~V*u1%_ zYO87deLnfEyXlAgf#~1S1xmMgnfi0HO&@dIh*5QhzAr{EAX`M(FRJZyMp8f7qUUYn z*XsQPh)c=)_ziZS$I{mC{wxOFd^||M;R`Sh!%M_YmOCbkJZI}*$_H`X;z`bD=2s`Z z%180QVzFOI-y-FgLBnsHeL=pT75Cgoe{kMF`?=oM+jbn%{?xQz$?C(B4*73UE*5M?J27%U7EDa(b@bmFBn2LRHdbL$3T}+70L9U5ZBte?7`qx2V4s@@Yu#xS``m z_>*woFXFsHH|j(3Wigr~i2HZxTj12SUtDJse5#rzyz}YL8$73H23Pf!)4Q^9t5oEB zN=7k)Fye=EjY8jkf%$I*+V znP@3qli{!)EbWyFvG5)34{Meu-Y5n8Yx|^rx$suW5A}okDT$P;)ODS_>UyzZ>*VP= zj;)iY>o~7eeqC<-x>NbJ+BIF^B|R$ViN~v!sQ&PCnNCNib20kk|5ZG2jzHRP;g?O4 zE$d5kX~-wD!KeMThlH-B!o^xI@Wt zJ@))mr66JWr+5?*| zqa1J3G~dsHKK8V?AJ%_rKk5hc*$w^KZ|4}w1wBU`!ru@0{q|is_ji{u-$Q<0gEt;G3iDrp{J3uVbgEQGx$EVRN?qqM)$XIBzvG6@V|tHhdcfu}eY)Q* z9(<|j=VZC=ON&pC??e6~y-B|(?~?ea;Ip<@<<;Y6F6Z2T2NFc21LfP-pPUcNh@bEm z_WR{XxAq%O6@F{Gm4Cx=5k9iiUmqJ?DQF45Mc5CT@vYt4W&GxNkiTZ23i0?f`KzY&>DT7lJ4kyS@ZS-%pT_a3 zS-Y!0o3)$iee+kgp&|UzdGodoOY76`Q)#yzM)@b6pT{_dc&@Pg`*Zp0EPqcff4k*x zKtA;+f5qq`;nV+3KKB0Ilf&2h_mNz__iuYH-}|>R=wC=L@)zm&A-=~r<6p%6Nc=I) zALWIAmJ4ccGCQqtMc;QtIPV9X4@xcY&-3*U-~UNJlJZ8l;z!cCz^@qnt~`@&wezFf zB`N0>SK!YO-vbyg-~Yn)rbxU{<5*>^TM$0%fZEZ{-C|F09!AsM!>69+}RX?9O zP3bZR2;=8*N57x97|oabkY4+9{%oFJ?g!7#^?$tk%FoM{mvJ$A#dcpO$HU>DC3M>< z{m9eJ=^Qtd|2Q7I#BWu;$n;i+_OB)nnLmg8$o;2_cfgq2k8tj8f-^<@gK~=?hueAt^N>D%4rk{_!u_YMcJbFyvlwC0h9Bj7lB9p6_P#b( z__b6xSKf#4h0p7fE%6lpj^S<6-r4ek@bC}c1=M+6SYPOG!;^U$HI?v)%l&qZ_@qvrk6uHZ>8S7O#4Z?>{*U}5A77Z z$_z;27uSXr&-!k|d#~ZWPoBvb-|@gX39UbD-Wnuq-PK0h5gB&57<{DU)cCe6)-s8q4p~tS}1sh zaJo$HK8Jd)NBp}-q(k$*Ipc@*Htt)LA6bta>HCyeuX(?mjx+Z0N&EgitGL!>Y31J# zuSLKswEL6?^1*)W13{cg>fwC7Ji~e{m#0fSY<|v7N)N($829Tr|7Chh*Xi=`uudlQ zXT8g2)6Q=AD08QcX3_ml5}r3J8yE)yVdNx(j)2He4KXvtAcpQm!qV&=?(Y) zGX8vv(x*PC{MT*#S^uD=l^^5A-J0%Ie(fJneyt2@{p@=@T0a@*dpvFji}GcIWvbN`}6L~#p#}wD^EY$*J(nyC!-wJ52f8|=L+>tHfDVB zihG;eeFxxxU!{C@&qSA0XyKC~lhYd%Uc2)`J3_w$N*ceA?{uH}7RetAPP=}u4)BYIRjuKr&uc$K7G z?9Y?&C>7o=X+QVteoJ-_uhOsG{s{6%yYsv?9!O7?x+ zV)Qa8&_bVM@WmAYeaeMPl^!*1hw%X7<$kvN&&T42O9ObBe$)BFxcqQi*1yF<_fgSz z*pDJ~kB@QB65}t#YdB|*_rcEMJ^p$Q@+@DG= z)^w@xLY+4wZp{!vF}hk_5_p|(5 zCiWYs-t5%*UcTMXZtVl!Dc{_z_{W3lPZ6IbJ((X=!u}7c^h}SNJxToxvnQ#aVfG~T zGt{0Oub&a(y%Xa`d~U*chxxR_%zq#9i_yix2OcM-eB}MK3BoTjtQePPNryxIF$p>C z{P8=G@Aj-1>HXay9>V`aHl8L&#OsM!pqKftrBm*RsGq`hd!c__(2)7g9grjU8)+9% zUE%?k{VDijNd4ikUHQ(ZszHehc=;Ehe6oJG*pKQCrF&RU^hnSy?Vrzg;{nru0Utcv z#0S0(^kG5V^`x(Fvfr!jK|ggGAb#5ljK#c-zp3SKKmq(@eF)DGugK(c(a)Oa&98)f za#}$-^LS}&ayoC5k0*>Hez^CzNnTIeDA`fJPLHA(GRB{;&nHtg9pWMMv2lzWMvnoN z3!a0x2K`|_mtGdihtuV90T|Nb3ev;6G*&x=H-d7RzIJ$+T;Z4O(DsupYB%B$_2c4U z_21%6Ht(|jl7ILk+%G}4TiOlApZ133F2woExUTvq9#XiaNh<|TvP1bh>9#n%wV&)b zDsqSW2viT>Y1w>eku z+ILcKDt$_Ys+9BbP3dCtId7`-%XLyNHat(`=4bpoZnk!&rbD_N2LF*xKm0K89CMzp z_BGTiUjZnb_YrxdAHbh~k0H~i1M)tu+q|v&E=$|It@{p3+q|v&eUdIl=Lx(_@4KIG zet+uco8O=M`R4bVpYQv7GdOk+NZsK)qT}0eI1g)jz~Sh*&+)%!^HQys!gYLe^OCy3 z?N&QdscXNh)^GnFaiy+wt9GlsiyKO}q*wRV#RE#Wq|fZ-pwcZ_uJ*JT%@cgGad0?3 ze|9)Ne|9*EPcixrsUPwQ^(pz}?i%>X;s)eL4!z&+U#TfSWd6@T3LNqW?QAhRH%)VZ zeLaW%%f7&W@%u#GZt(rGoO~?Zqk4e)lYF_Mp6OS@odNi)w=-97R#*@3_Xh8a(NDDB zR}nktm$~+|`BF%a?PxcRCtarHNT2Pf8xQUlII-<7!u(Xz14`%eN%W#nZeY9QCrd5P z^*jK;FS$VVO`>84x=ojSoZHg!otqV2&Gb~~22GC~*7sYsYI@kly=LRR^N_wjRnv$& zSb61}q;IdLckI^sHHDkleHw91+eQ3I%k}QmXZLn}E+3X>xDQt7WO@a9Sl;tq6#i&; z$Umgp^YG;U3-)}pg8$*i{3Y;je7-&U3yjNk|9@Pf;~5u@2gij!(w{@sZd}d@$7Pum z$M*?`f5yMkb+HRH-`B_D+mz2kIXY@~`uo36KjEnOIc0o*^GsBYZ|f2O`SMBkPHBhu z9SZ7|3ePZq{tU4r(4SH+ZaiJm(4U$fI7!oe`!zlIq_hkDDe2?&=bbN;E!!2&_JwWn z_4&Tred2wi%wx5`nZ8u{jqg;&lkd03SE$#j|I2d z7Vg&-?zTnJZ~v|U=PBWNO7{0t7^f_r)2ZdREpDl|e@CXrS?{Aw_0*whq01%#BmDZ{ z`QW4BNal;>jwu!|oUG$*-^qYKt?BMa{pv&g2kxX?eMt3bP3_6`sNV%pZ?`AEKZifjuC6bY3Jav6N=?6SSHk`kdY06` z=&rzG0snp-%b$dFyd4eVSL(P(o*{pT{@EniLeIUjuS)s9T=Yw7gy1pM$ zzZ2^lk`DFo)j$RNvt@iL!w<-Nr+Yj45_6w-lnV0;te>4v-(dLcmuGelh2nwp@CrZZ zzw4#hB5xOQ_?qJTdyy_iZ;<|mc+ld-%@Vh=JDnE$KF}~}w$n~i`d*sP}HQ$?{RZ?XSh(xev$FzMFurkpLTW&R58DYtq$E=jlYZ>SHcSFjIE%K5r4=2u!TJs;Ac z<8I%-!TO4&t)HD;miGS6wY2xUN7Bjq$@)BXk);>gbD=za9~$Ct(tfB1L@(EM%;}fV zE|5>&23~S`^?Ui+eg9{j#S4xi{>F2zr`zw#K+}mAND6> zUBk!G=++HSqo6BdssTDr$3;TEVySN|b2`P|o-|YbXCq<8GJDDHz z<72{MdpALc#v_V<`IM#5@RakphW|bpr?}pw>GU3alZW&ke4~fmgAe~f=v=A$JjnED zIuBC)6{qtc<>xq^2Pq$qHxDXCKUVtIO+R<5{zH6O`K;IIKVbJ(4C=iVe%?2+eRkEW z^gK^;1-S%%C?|jTh4goR`h?s&`aK(0x2GT^e(mD#yCKgUuY*B+NyZua7;(WSdz|i< zs_m70d`DTHAs)_$uY3{YV93UM(r<~M8J45`;C?%;AIQ;@@Q>(6%mTi|v=1W zTO`Z%99FyaX7O(Z6%Oft0eqQwMCGe|iaMOd$ku_z?8i$5KsesiAI>jvUHOvmf5dx} zYTBOrL(UiBJm?3xa@4oj-=q9v{xRV_#&RPD52i=@W1?@b#$JnokAOT*|spm-4Ou8XP1-)8dXc3I=(xR=HB)B~!w8m5Q5J=m4Zh|Uzg9HeyEx5Zohtle16~X9)OH%s;|=d zTwV25(%qx|Yp6X*dKXGMueW?&SG~pb){Tm1F?wwaUSsjcM|0yI>Wz>;26N@c;*Xuj z$sZs274gS)myka$lKzMO?7bjOF?v$?BlGW-U$8$y?S*~+6nfdx$}iXtU}@F2?Z*3a z7}v19d!)S|Nqb>FHBd47XUWg(quJTiJ}N$$eN=oh`>6O7qq7As_b2{u&}Y3(`b_Vc z$^4~Nif};%oT1Jtck% za`Gf`1k<;!pIGjqoP37z?(qheyO8CAxQ5WBU-5ANlKA!*ea;2GVgKgBAMo|&u-sX> za?4Q8@e9kH!EzOCFWzNzy4KoXt52@a00kMJPu_*{h9B|&4)vLFbWPxg1A;r|~Gk-y9z z^|)W^uc}^;8`^%-YkGe`@k{zNUKbB)f0E^3&$XQ}J$ryGh5JaNY{V z*b3)#g)?OH1>2wQ`&2yMAFeC8{oQ#t<5>WVpRfPAUtf$Aze@cPu@lv99iO=Iu%we- z8~=eXYP!$(V^HHae$Q*Au4&9Sq+C2;cn%(rbTN9P^4F<*C7tg-`~8IvHrtJjz}Mr~ zuFvVW;a`-Ud(ivsMwha87%!Wz@cb8}0qk${`LE|oxukot`eD7(63qew0t~^G?GiKRYG91-+%|?(LdxY}a(}R!t9V)pXxxNsq7B&lmiX z^&N_Dptm;X;=F=yAb)-?>6V9@`<1_c`Yy;Z<#iTX;&^PxmFM@KTz|5h!%a}Gx-?v4&jQb|}D@I3DpAFf#$C4fK8o~`I;`=EWPs*RK`Zctdt+%ju&HZ>W z(#7Zp0w4aoj#B`?2k*mv$T;0bC`#{z?;yRDFEafBhQ!b5&Uy6;rfbXvzXE5%L7Xhr zL(ge~84_;vwDw+F;` zAMi#TPw>s=L5DTnsq@9Kf8@J%^GBhd&6hCWQF`A_s-V4_^+`Vd@qMySS^AgJRo7uh z*J(M*{Z`fs=(>>l-S+!pom=X=zD>_JOwsy&?`v3pU(PNPU&cR<#}tXETcil>r_NDnQP^6~JZmU?roULWdFKeIu!BYGml?>jQ@J}CJt z$C(}086?el#Pl%U+qqZrlP$aTxqeumJB;5)wEwZmJAzN7Xn@YAM#m~l+Cv*G;b^=PjcRYhK~Kg{IwUWHp9RC#p! zQU9Q&4Ufj%nl^ia^DC0B3~K%C{EGH(yz?u#r%dHGkcZu%iTmNyhxzY>ti*oGW9h?p zN&j9ZaGlTM8PkwUI;*{mXMph}ZSplk^&R3Z(w}&Syymz_I^+-9J&&Jo{J7rc=O37+ z3Gnj|ar(Vby_X||)0LYag?h!~Y%YJ4lR41om0FkdE7K=>-x~Ha2tSl2JXa8pYw8Eh zn|g_)v+qu6KrO^W+BH9v?OX!BX|)IMR=C4PuMwlu?Mk=U>`5Lj;Vn6<9lTo&PxDu7 zKN6~x*+F##?7S~kH*4jQbm#eD7xy|t0Ce1eOgF1k5AfA`q zg>{PPPATB?n^Eu|e|-P0yC^qm`78Ao3LaJ8H{4LXl3v9#9=K5P?K`OW4$ji_a_v_! z(sU@7SD_vF2`a~dJS+iEd3+(HZ)u*RR zcKSWK*v1{_O!U3km3$o4_vt0e^}egI;;*T_9MN{@-!$>H(Vz5OiG3PP{lPduuB0D6 zzop&k_%VRkkM+L7`DXxs4duwkHQ?h*@!jYU{!W3f{!wh-+atVQmJ9q^@`L*gq5u8d z9K0^riMXzGBbIBOWllF=+BU&b}4D2f4pCL->K~uKZQ!*z-*Gg7WfSk(bPlEtK|gPFVFwZ;z%^ zKXb08Q$JJn>3Du-5tfv{N`1Q2$Gtz&ZrnIS(n+t%Z9MRFP4^wv_k$;CdifzqkJpa- zvmu?G{+}Cz{!d4KF~P#Urd=lh-mYm`49Iki$Pe2Xq@&I+r_q-l}mHkBh|hxq^S<_arvDG;MK|cwm~Q zJ-#yTe!TM)-yH{3p9K11GUcak_=2wlU(+Aq{PL5d&HZ{jH{YEF{%84F07W?%$(26@ z{T#}@&szsjuDa#0_*<~c^33L~cUbzDH*cK_youjuZ~q16t;0sgTa9i|$@JKdHE&&j z_KxMJy%?afdFy^1rvQEr-na0T`5Ej_Wj*zm@CmvLK6Yk4D-i{u>AprY_r;D7&Yt3IXJ(7n{IK^r0=+h@~sK4+ps+b<} zeLMWl03o|Q>2IhW^6w9@9)Iq4pL5wVN&Eh}r3SZLC`*3mzr6uD9yjuPdMow$(w}Pg zT(gH4svhg@()7SAP4`XH^q}@1>(`P#UVBlDHj15reNy^azvBVbtMQ=e+i~sgzYCnO zUspEu>tgBmuex8pUpH�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�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 [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Mint tokens with a PDA as mint authority so the program controls issuance. See also: [Pda Mint Authority overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/tokens/token-extensions/basics/anchor-v1/.gitignore b/tokens/token-extensions/basics/anchor-v1/.gitignore new file mode 100644 index 000000000..d243ecc13 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/.gitignore @@ -0,0 +1,7 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger diff --git a/tokens/token-extensions/basics/anchor-v1/.prettierignore b/tokens/token-extensions/basics/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/basics/anchor-v1/Anchor.toml b/tokens/token-extensions/basics/anchor-v1/Anchor.toml new file mode 100644 index 000000000..2d61cec09 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/Anchor.toml @@ -0,0 +1,17 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false +[programs.localnet] +anchor = "6qNqxkRF791FXFeQwqYQLEzAbGiqDULC5SSHVsfRoG89" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/basics/anchor-v1/Cargo.toml b/tokens/token-extensions/basics/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/basics/anchor-v1/README.md b/tokens/token-extensions/basics/anchor-v1/README.md new file mode 100644 index 000000000..763aa4ab8 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - Basics (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Create mints, mint tokens, and transfer using the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program). + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Extension-enabled mints +- Token Extensions CPI + +## Setup + +From this directory (`tokens/token-extensions/basics/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/Cargo.toml b/tokens/token-extensions/basics/anchor-v1/programs/basics/Cargo.toml new file mode 100644 index 000000000..fff167965 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "token-2022-basic-anchor" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "anchor" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-spl = "1.1.2" +anchor-lang = { version = "1.1.2", features= ["init-if-needed"]} + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/Xargo.toml b/tokens/token-extensions/basics/anchor-v1/programs/basics/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_associated_token_account.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_associated_token_account.rs new file mode 100644 index 000000000..9c00f4be1 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_associated_token_account.rs @@ -0,0 +1,25 @@ +use anchor_lang::prelude::*; +use anchor_spl::associated_token::AssociatedToken; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +#[derive(Accounts)] +pub struct CreateAssociatedTokenAccountAccountConstraints<'info> { + #[account(mut)] + pub signer: Signer<'info>, + pub mint: InterfaceAccount<'info, Mint>, + #[account( + init, + associated_token::mint = mint, + payer = signer, + associated_token::authority = signer, + )] + pub token_account: InterfaceAccount<'info, TokenAccount>, + pub system_program: Program<'info, System>, + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, +} + +pub fn handler(_context: Context) -> Result<()> { + msg!("Create Associated Token Account"); + Ok(()) +} diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token.rs new file mode 100644 index 000000000..bc08105ad --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token.rs @@ -0,0 +1,25 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenInterface}; + +#[derive(Accounts)] +#[instruction(token_name: String)] +pub struct CreateTokenAccountConstraints<'info> { + #[account(mut)] + pub signer: Signer<'info>, + #[account( + init, + payer = signer, + mint::decimals = 6, + mint::authority = signer.key(), + seeds = [b"token-2022-token", signer.key().as_ref(), token_name.as_bytes()], + bump, + )] + pub mint: InterfaceAccount<'info, Mint>, + pub system_program: Program<'info, System>, + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handler(_context: Context, _token_name: String) -> Result<()> { + msg!("Create Token"); + Ok(()) +} diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token_account.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token_account.rs new file mode 100644 index 000000000..d5e87541e --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/create_token_account.rs @@ -0,0 +1,25 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface}; + +#[derive(Accounts)] +pub struct CreateTokenAccountAccountConstraints<'info> { + #[account(mut)] + pub signer: Signer<'info>, + pub mint: InterfaceAccount<'info, Mint>, + #[account( + init, + token::mint = mint, + token::authority = signer, + payer = signer, + seeds = [b"token-2022-token-account", signer.key().as_ref(), mint.key().as_ref()], + bump, + )] + pub token_account: InterfaceAccount<'info, TokenAccount>, + pub system_program: Program<'info, System>, + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handler(_context: Context) -> Result<()> { + msg!("Create Token Account"); + Ok(()) +} diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mint_token.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mint_token.rs new file mode 100644 index 000000000..26798f219 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mint_token.rs @@ -0,0 +1,26 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{self, Mint, MintTo, TokenAccount, TokenInterface}; + +#[derive(Accounts)] +pub struct MintTokenAccountConstraints<'info> { + #[account(mut)] + pub signer: Signer<'info>, + #[account(mut)] + pub mint: InterfaceAccount<'info, Mint>, + #[account(mut)] + pub receiver: InterfaceAccount<'info, TokenAccount>, + pub token_program: Interface<'info, TokenInterface>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + let cpi_accounts = MintTo { + mint: context.accounts.mint.to_account_info().clone(), + to: context.accounts.receiver.to_account_info().clone(), + authority: context.accounts.signer.to_account_info(), + }; + let cpi_program = context.accounts.token_program.key(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token_interface::mint_to(cpi_context, amount)?; + msg!("Mint Token"); + Ok(()) +} diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mod.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mod.rs new file mode 100644 index 000000000..b9a1bb2ca --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/mod.rs @@ -0,0 +1,11 @@ +pub mod create_associated_token_account; +pub mod create_token; +pub mod create_token_account; +pub mod mint_token; +pub mod transfer_token; + +pub use create_associated_token_account::*; +pub use create_token::*; +pub use create_token_account::*; +pub use mint_token::*; +pub use transfer_token::*; diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/transfer_token.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/transfer_token.rs new file mode 100644 index 000000000..57ce4168a --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/instructions/transfer_token.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; +use anchor_spl::associated_token::AssociatedToken; +use anchor_spl::token_interface::{self, Mint, TokenAccount, TokenInterface, TransferChecked}; + +#[derive(Accounts)] +pub struct TransferTokenAccountConstraints<'info> { + #[account(mut)] + pub signer: Signer<'info>, + #[account(mut)] + pub from: InterfaceAccount<'info, TokenAccount>, + pub to: SystemAccount<'info>, + #[account( + init, + associated_token::mint = mint, + payer = signer, + associated_token::authority = to + )] + pub to_ata: InterfaceAccount<'info, TokenAccount>, + #[account(mut)] + pub mint: InterfaceAccount<'info, Mint>, + pub token_program: Interface<'info, TokenInterface>, + pub system_program: Program<'info, System>, + pub associated_token_program: Program<'info, AssociatedToken>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + let cpi_accounts = TransferChecked { + from: context.accounts.from.to_account_info().clone(), + mint: context.accounts.mint.to_account_info().clone(), + to: context.accounts.to_ata.to_account_info().clone(), + authority: context.accounts.signer.to_account_info(), + }; + let cpi_program = context.accounts.token_program.key(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token_interface::transfer_checked(cpi_context, amount, context.accounts.mint.decimals)?; + msg!("Transfer Token"); + Ok(()) +} diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/src/lib.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/lib.rs new file mode 100644 index 000000000..0eb3bbf0b --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/src/lib.rs @@ -0,0 +1,34 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("6qNqxkRF791FXFeQwqYQLEzAbGiqDULC5SSHVsfRoG89"); + +#[program] +pub mod anchor { + + use super::*; + + pub fn create_token(context: Context, token_name: String) -> Result<()> { + instructions::create_token::handler(context, token_name) + } + + pub fn create_token_account(context: Context) -> Result<()> { + instructions::create_token_account::handler(context) + } + + pub fn create_associated_token_account( + context: Context, + ) -> Result<()> { + instructions::create_associated_token_account::handler(context) + } + + pub fn transfer_token(context: Context, amount: u64) -> Result<()> { + instructions::transfer_token::handler(context, amount) + } + + pub fn mint_token(context: Context, amount: u64) -> Result<()> { + instructions::mint_token::handler(context, amount) + } +} diff --git a/tokens/token-extensions/basics/anchor-v1/programs/basics/tests/test_basics.rs b/tokens/token-extensions/basics/anchor-v1/programs/basics/tests/test_basics.rs new file mode 100644 index 000000000..21b5218c8 --- /dev/null +++ b/tokens/token-extensions/basics/anchor-v1/programs/basics/tests/test_basics.rs @@ -0,0 +1,169 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + get_token_extensions_account_address, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = anchor::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/anchor.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token_and_mint_and_transfer() { + let (mut svm, program_id, payer) = setup(); + + let token_name = "TestToken".to_string(); + + // Derive the mint PDA + let (mint, _bump) = Pubkey::find_program_address( + &[ + b"token-2022-token", + payer.pubkey().as_ref(), + token_name.as_bytes(), + ], + &program_id, + ); + + // Step 1: Create Token via the program's own instruction + let create_token_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::CreateToken { + token_name: token_name.clone(), + } + .data(), + anchor::accounts::CreateTokenAccountConstraints { + signer: payer.pubkey(), + mint, + system_program: system_program::id(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![create_token_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint account exists + let mint_account = svm.get_account(&mint).expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Create Associated Token Account for payer via the program's own instruction + let payer_ata = get_token_extensions_account_address(&payer.pubkey(), &mint); + + let create_ata_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::CreateAssociatedTokenAccount {}.data(), + anchor::accounts::CreateAssociatedTokenAccountAccountConstraints { + signer: payer.pubkey(), + mint, + token_account: payer_ata, + system_program: system_program::id(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: associated_token_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![create_ata_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify ATA exists + let ata_account = svm + .get_account(&payer_ata) + .expect("Payer ATA should exist"); + assert!(!ata_account.data.is_empty(), "ATA should have data"); + + svm.expire_blockhash(); + + // Step 3: Mint tokens to payer ATA via the program's own instruction + let mint_amount: u64 = 200_000_000; + + let mint_token_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::MintToken { + amount: mint_amount, + } + .data(), + anchor::accounts::MintTokenAccountConstraints { + signer: payer.pubkey(), + mint, + receiver: payer_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![mint_token_ix], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance( + &svm, + &payer_ata, + mint_amount, + &format!("Should have minted {} tokens", mint_amount), + ); + + svm.expire_blockhash(); + + // Step 4: Transfer tokens to receiver via the program's own instruction + let receiver = create_wallet(&mut svm, 1_000_000_000).unwrap(); + let receiver_ata = get_token_extensions_account_address(&receiver.pubkey(), &mint); + + let transfer_amount: u64 = 100; + + let transfer_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::TransferToken { + amount: transfer_amount, + } + .data(), + anchor::accounts::TransferTokenAccountConstraints { + signer: payer.pubkey(), + from: payer_ata, + to: receiver.pubkey(), + to_ata: receiver_ata, + mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + associated_token_program: associated_token_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance( + &svm, + &receiver_ata, + transfer_amount, + &format!("Receiver should have {} tokens", transfer_amount), + ); + assert_token_account_balance( + &svm, + &payer_ata, + mint_amount - transfer_amount, + "Payer should have remaining tokens", + ); +} diff --git a/tokens/token-extensions/basics/anchor/README.md b/tokens/token-extensions/basics/anchor/README.md index 6f4da49af..4da7c89f2 100644 --- a/tokens/token-extensions/basics/anchor/README.md +++ b/tokens/token-extensions/basics/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Basics (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Create mints, mint tokens, and transfer using the [Token Extensions Program](https://solana.com/docs/terminology#token-extensions-program). See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/.gitignore b/tokens/token-extensions/cpi-guard/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/.prettierignore b/tokens/token-extensions/cpi-guard/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/Anchor.toml b/tokens/token-extensions/cpi-guard/anchor-v1/Anchor.toml new file mode 100644 index 000000000..20bb5a8a5 --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +cpi_guard = "6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/Cargo.toml b/tokens/token-extensions/cpi-guard/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/README.md b/tokens/token-extensions/cpi-guard/anchor-v1/README.md new file mode 100644 index 000000000..6d6cae9bc --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - CPI Guard (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Enable CPI Guard so certain token actions cannot run inside a CPI context. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- CPI Guard extension +- Transfer restrictions in CPI + +## Setup + +From this directory (`tokens/token-extensions/cpi-guard/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Cargo.toml b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Cargo.toml new file mode 100644 index 000000000..6f37da297 --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "cpi-guard" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "cpi_guard" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Xargo.toml b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/src/lib.rs b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/src/lib.rs new file mode 100644 index 000000000..23f51a37f --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/src/lib.rs @@ -0,0 +1,56 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + token_2022::{transfer_checked, TransferChecked}, + token_interface::{Mint, Token2022, TokenAccount}, +}; + +// Note that you cannot initialize or update the CpiGuard extension through a CPI +// https://github.com/solana-labs/solana-program-library/blob/6968859e2ee0a1764da572de340cdb58e2b4586f/token/program-2022/src/extension/cpi_guard/processor.rs#L44-L46 +declare_id!("6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid"); + +#[program] +pub mod cpi_guard { + use super::*; + + pub fn cpi_transfer(context: Context) -> Result<()> { + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.sender_token_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + to: context.accounts.recipient_token_account.to_account_info(), + authority: context.accounts.sender.to_account_info(), + }, + ), + 1, + context.accounts.mint_account.decimals, + )?; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct CpiTransferAccountConstraints<'info> { + #[account(mut)] + pub sender: Signer<'info>, + + #[account( + mut, + token::mint = mint_account + )] + pub sender_token_account: InterfaceAccount<'info, TokenAccount>, + #[account( + init_if_needed, + payer = sender, + seeds = [b"pda"], + bump, + token::mint = mint_account, + token::authority = recipient_token_account, + token::token_program = token_program + )] + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} diff --git a/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/tests/test_cpi_guard.rs b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/tests/test_cpi_guard.rs new file mode 100644 index 000000000..6f2145cc8 --- /dev/null +++ b/tokens/token-extensions/cpi-guard/anchor-v1/programs/cpi-guard/tests/test_cpi_guard.rs @@ -0,0 +1,205 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_mint, mint_tokens_to_token_extensions_account, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = cpi_guard::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/cpi_guard.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +/// Create a basic Token Extensions token account (165 bytes, no extensions). +/// Uses explicit keypair - kite's ATA creation won't work here because +/// we need to reallocate and add the CPI Guard extension later. +fn create_basic_token_account_instructions( + payer: &Pubkey, + token_account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let rent_sysvar: Pubkey = "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap(); + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, + token_account, + 3_000_000, + 165, + &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + let init_account_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*mint, false), + AccountMeta::new_readonly(*owner, false), + AccountMeta::new_readonly(rent_sysvar, false), + ], + data: vec![1], // InitializeAccount + }; + vec![create_account_ix, init_account_ix] +} + +/// Reallocate instruction (instruction 29) to add extension types to a token account. +fn reallocate_instruction( + token_account: &Pubkey, + payer: &Pubkey, + owner: &Pubkey, + extension_types: &[u16], +) -> Instruction { + let mut data = vec![29u8]; + for et in extension_types { + data.extend_from_slice(&et.to_le_bytes()); + } + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new(*payer, true), + AccountMeta::new_readonly(system_program::id(), false), + AccountMeta::new_readonly(*owner, true), + ], + data, + } +} + +/// EnableCpiGuard instruction (instruction 34, sub-instruction 0). +fn enable_cpi_guard_instruction(token_account: &Pubkey, owner: &Pubkey) -> Instruction { + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*owner, true), + ], + data: vec![34, 0], + } +} + +/// DisableCpiGuard instruction (instruction 34, sub-instruction 1). +fn disable_cpi_guard_instruction(token_account: &Pubkey, owner: &Pubkey) -> Instruction { + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*owner, true), + ], + data: vec![34, 1], + } +} + +#[test] +fn test_cpi_guard_prevents_transfer_then_allows_after_disable() { + let (mut svm, program_id, payer) = setup(); + let token_keypair = Keypair::new(); + + // Step 1: Create a Token Extensions mint (no extensions needed on the mint itself) + let mint = create_token_extensions_mint(&mut svm, &payer, 2, None, &[]).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create basic token account (needs explicit keypair for reallocate flow) + let token_ixs = create_basic_token_account_instructions( + &payer.pubkey(), + &token_keypair.pubkey(), + &mint, + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, token_ixs, &[&payer, &token_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 3: Reallocate to add CPI Guard extension space + let cpi_guard_extension_type: u16 = 11; // ExtensionType::CpiGuard + let reallocate_ix = reallocate_instruction( + &token_keypair.pubkey(), + &payer.pubkey(), + &payer.pubkey(), + &[cpi_guard_extension_type], + ); + send_transaction_from_instructions(&mut svm, vec![reallocate_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Enable CPI Guard + let enable_ix = enable_cpi_guard_instruction(&token_keypair.pubkey(), &payer.pubkey()); + send_transaction_from_instructions(&mut svm, vec![enable_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Mint 1 token to the token account + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &token_keypair.pubkey(), + 1, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 6: Try CPI transfer - should fail because CPI Guard is enabled + let (recipient_token_account, _bump) = + Pubkey::find_program_address(&[b"pda"], &program_id); + + let transfer_ix = Instruction::new_with_bytes( + program_id, + &cpi_guard::instruction::CpiTransfer {}.data(), + cpi_guard::accounts::CpiTransferAccountConstraints { + sender: payer.pubkey(), + sender_token_account: token_keypair.pubkey(), + recipient_token_account, + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Transfer should fail when CPI Guard is enabled" + ); + svm.expire_blockhash(); + + // Step 7: Disable CPI Guard + let disable_ix = disable_cpi_guard_instruction(&token_keypair.pubkey(), &payer.pubkey()); + send_transaction_from_instructions(&mut svm, vec![disable_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 8: Transfer should now succeed + let transfer_ix2 = Instruction::new_with_bytes( + program_id, + &cpi_guard::instruction::CpiTransfer {}.data(), + cpi_guard::accounts::CpiTransferAccountConstraints { + sender: payer.pubkey(), + sender_token_account: token_keypair.pubkey(), + recipient_token_account, + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![transfer_ix2], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance(&svm, &recipient_token_account, 1, "Recipient should have 1 token"); +} diff --git a/tokens/token-extensions/cpi-guard/anchor/README.md b/tokens/token-extensions/cpi-guard/anchor/README.md index 81c91032b..0d06a7d47 100644 --- a/tokens/token-extensions/cpi-guard/anchor/README.md +++ b/tokens/token-extensions/cpi-guard/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - CPI Guard (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Enable CPI Guard so certain token actions cannot run inside a CPI context. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/default-account-state/anchor-v1/.gitignore b/tokens/token-extensions/default-account-state/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/default-account-state/anchor-v1/.prettierignore b/tokens/token-extensions/default-account-state/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/default-account-state/anchor-v1/Anchor.toml b/tokens/token-extensions/default-account-state/anchor-v1/Anchor.toml new file mode 100644 index 000000000..01c117519 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +default_account_state = "5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/default-account-state/anchor-v1/Cargo.toml b/tokens/token-extensions/default-account-state/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/default-account-state/anchor-v1/README.md b/tokens/token-extensions/default-account-state/anchor-v1/README.md new file mode 100644 index 000000000..e55aadae0 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - Default Account State (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +New token accounts are frozen by default until thawed. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Default account state extension +- Frozen token accounts + +## Setup + +From this directory (`tokens/token-extensions/default-account-state/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Cargo.toml b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Cargo.toml new file mode 100644 index 000000000..4073392e0 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "default-account-state" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "default_account_state" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Xargo.toml b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/initialize.rs b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/initialize.rs new file mode 100644 index 000000000..939241aba --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/initialize.rs @@ -0,0 +1,76 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; +use anchor_spl::{ + token_2022::{ + initialize_mint2, + spl_token_2022::{extension::ExtensionType, pod::PodMint, state::AccountState}, + InitializeMint2, + }, + token_interface::{ + default_account_state_initialize, DefaultAccountStateInitialize, Token2022, + }, +}; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub mint_account: Signer<'info>, + + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +// There is currently not an anchor constraint to automatically initialize the DefaultAccountState extension +// We can manually create and initialize the mint account via CPIs in the instruction handler +pub fn handler(context: Context) -> Result<()> { + // Calculate space required for mint and extension data + let mint_size = ExtensionType::try_calculate_account_len::(&[ + ExtensionType::DefaultAccountState, + ])?; + + // Calculate minimum lamports required for size of mint account with extensions + let lamports = (Rent::get()?).minimum_balance(mint_size); + + // Invoke System Program to create new account with space for mint and extension data + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.mint_account.to_account_info(), + }, + ), + lamports, // Lamports + mint_size as u64, // Space + &context.accounts.token_program.key(), // Owner Program + )?; + + // Initialize the NonTransferable extension + // This instruction must come before the instruction to initialize the mint data + default_account_state_initialize( + CpiContext::new( + context.accounts.token_program.key(), + DefaultAccountStateInitialize { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + }, + ), + &AccountState::Frozen, // default frozen token accounts + )?; + + // Initialize the standard mint account data + initialize_mint2( + CpiContext::new( + context.accounts.token_program.key(), + InitializeMint2 { + mint: context.accounts.mint_account.to_account_info(), + }, + ), + 2, // decimals + &context.accounts.payer.key(), // mint authority + Some(&context.accounts.payer.key()), // freeze authority + )?; + Ok(()) +} diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/mod.rs b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/mod.rs new file mode 100644 index 000000000..a4531fb8a --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize; +pub mod update_default_state; + +pub use initialize::*; +pub use update_default_state::*; diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/update_default_state.rs b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/update_default_state.rs new file mode 100644 index 000000000..7ed0ec0dc --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/instructions/update_default_state.rs @@ -0,0 +1,41 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + default_account_state_update, DefaultAccountStateUpdate, Mint, Token2022, +}; + +use crate::AnchorAccountState; + +#[derive(Accounts)] +pub struct UpdateDefaultStateAccountConstraints<'info> { + #[account(mut)] + pub freeze_authority: Signer<'info>, + #[account( + mut, + mint::freeze_authority = freeze_authority, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn handler( + context: Context, + account_state: AnchorAccountState, +) -> Result<()> { + // Convert AnchorAccountState to spl_token_2022::state::AccountState + let account_state = account_state.to_spl_account_state(); + + default_account_state_update( + CpiContext::new( + context.accounts.token_program.key(), + DefaultAccountStateUpdate { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + freeze_authority: context.accounts.freeze_authority.to_account_info(), + }, + ), + &account_state, + )?; + Ok(()) +} diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/lib.rs b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/lib.rs new file mode 100644 index 000000000..8d6ef76c6 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/src/lib.rs @@ -0,0 +1,43 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::state::AccountState; + +mod instructions; +use instructions::*; + +declare_id!("5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB"); + +#[program] +pub mod default_account_state { + use super::*; + + pub fn initialize(context: Context) -> Result<()> { + instructions::initialize::handler(context) + } + + pub fn update_default_state( + context: Context, + account_state: AnchorAccountState, + ) -> Result<()> { + instructions::update_default_state::handler(context, account_state) + } +} + +// Custom enum to implement AnchorSerialize and AnchorDeserialize +// This is required to pass the enum as an argument to the instruction +#[derive(AnchorSerialize, AnchorDeserialize)] +pub enum AnchorAccountState { + Uninitialized, + Initialized, + Frozen, +} + +// Implement conversion from AnchorAccountState to spl_token_2022::state::AccountState +impl AnchorAccountState { + pub fn to_spl_account_state(&self) -> AccountState { + match self { + AnchorAccountState::Uninitialized => AccountState::Uninitialized, + AnchorAccountState::Initialized => AccountState::Initialized, + AnchorAccountState::Frozen => AccountState::Frozen, + } + } +} diff --git a/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/tests/test_default_account_state.rs b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/tests/test_default_account_state.rs new file mode 100644 index 000000000..c23a86ef3 --- /dev/null +++ b/tokens/token-extensions/default-account-state/anchor-v1/programs/default-account-state/tests/test_default_account_state.rs @@ -0,0 +1,165 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + mint_tokens_to_token_extensions_account, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +/// Create a Token Extensions token account (165 bytes, no extra extensions). +/// Uses explicit keypair - not an ATA - so we can inspect account state bytes. +fn create_token_account_instruction( + payer: &Pubkey, + token_account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let rent_sysvar: Pubkey = "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap(); + let create_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, + token_account, + 3_000_000, + 165, + &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + let init_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*mint, false), + AccountMeta::new_readonly(*owner, false), + AccountMeta::new_readonly(rent_sysvar, false), + ], + data: vec![1], // InitializeAccount + }; + vec![create_ix, init_ix] +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = default_account_state::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/default_account_state.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_default_account_state() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Initialize mint with DefaultAccountState extension (frozen) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &default_account_state::instruction::Initialize {}.data(), + default_account_state::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify mint exists + let mint_account = svm.get_account(&mint_keypair.pubkey()).unwrap(); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + // Step 2: Create a token account (it will be frozen by default due to DefaultAccountState extension) + let token1 = Keypair::new(); + let create_token1_ixs = create_token_account_instruction( + &payer.pubkey(), + &token1.pubkey(), + &mint_keypair.pubkey(), + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_token1_ixs, &[&payer, &token1], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify token account state is frozen (byte 108 = account state: 0=uninitialized, 1=initialized, 2=frozen) + let token1_data = svm.get_account(&token1.pubkey()).unwrap(); + assert_eq!( + token1_data.data[108], 2, + "Token account should be frozen (state=2)" + ); + + // Step 3: Attempt to mint to the frozen account - should fail + let result = mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &token1.pubkey(), + 1, + &payer, + ); + assert!( + result.is_err(), + "Minting to a frozen account should fail" + ); + svm.expire_blockhash(); + + // Step 4: Update default state to Initialized + let update_ix = Instruction::new_with_bytes( + program_id, + &default_account_state::instruction::UpdateDefaultState { + account_state: default_account_state::AnchorAccountState::Initialized, + } + .data(), + default_account_state::accounts::UpdateDefaultStateAccountConstraints { + freeze_authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Create a new token account - should be initialized (not frozen) now + let token2 = Keypair::new(); + let create_token2_ixs = create_token_account_instruction( + &payer.pubkey(), + &token2.pubkey(), + &mint_keypair.pubkey(), + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_token2_ixs, &[&payer, &token2], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify token2 is initialized (not frozen) + let token2_data = svm.get_account(&token2.pubkey()).unwrap(); + assert_eq!( + token2_data.data[108], 1, + "Token account should be initialized (state=1)" + ); + + // Step 6: Mint to the new account - should succeed + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &token2.pubkey(), + 1, + &payer, + ).unwrap(); + + assert_token_account_balance(&svm, &token2.pubkey(), 1, "Should have minted 1 token"); +} diff --git a/tokens/token-extensions/default-account-state/anchor/README.md b/tokens/token-extensions/default-account-state/anchor/README.md index f219a9c53..f00a1fc59 100644 --- a/tokens/token-extensions/default-account-state/anchor/README.md +++ b/tokens/token-extensions/default-account-state/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Default Account State (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + New token accounts are frozen by default until thawed. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/group/anchor-v1/.gitignore b/tokens/token-extensions/group/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/group/anchor-v1/.prettierignore b/tokens/token-extensions/group/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/group/anchor-v1/Anchor.toml b/tokens/token-extensions/group/anchor-v1/Anchor.toml new file mode 100644 index 000000000..3a59a9660 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +group = "4XCDGMD8fsdjUzmYj6d9if8twFt1f23Ym52iDmWK8fFs" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/group/anchor-v1/Cargo.toml b/tokens/token-extensions/group/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/group/anchor-v1/README.md b/tokens/token-extensions/group/anchor-v1/README.md new file mode 100644 index 000000000..85b9a69e5 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - Group Pointer (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Link tokens to a group using the Group Pointer extension. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Group pointer extension +- Grouped mint metadata + +## Setup + +From this directory (`tokens/token-extensions/group/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/group/anchor-v1/programs/group/Cargo.toml b/tokens/token-extensions/group/anchor-v1/programs/group/Cargo.toml new file mode 100644 index 000000000..1081814e8 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/programs/group/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "group" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "group" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/group/anchor-v1/programs/group/Xargo.toml b/tokens/token-extensions/group/anchor-v1/programs/group/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/programs/group/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/mod.rs b/tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/mod.rs new file mode 100644 index 000000000..7d7c46e1e --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/mod.rs @@ -0,0 +1,3 @@ +pub mod test_initialize_group; + +pub use test_initialize_group::*; diff --git a/tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/test_initialize_group.rs b/tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/test_initialize_group.rs new file mode 100644 index 000000000..d7b992a0d --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/programs/group/src/instructions/test_initialize_group.rs @@ -0,0 +1,66 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::extension::group_pointer::GroupPointer; +use anchor_spl::token_interface::{ + spl_token_2022::{ + extension::{BaseStateWithExtensions, StateWithExtensions}, + state::Mint as MintState, + }, + Mint, Token2022, +}; + +#[derive(Accounts)] +pub struct InitializeGroupAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + seeds = [b"group"], + bump, + payer = payer, + mint::decimals = 2, + mint::authority = mint_account, + mint::freeze_authority = mint_account, + extensions::group_pointer::authority = mint_account, + extensions::group_pointer::group_address = mint_account, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +fn check_mint_data(accounts: &mut InitializeGroupAccountConstraints) -> Result<()> { + let mint = &accounts.mint_account.to_account_info(); + let mint_data = mint.data.borrow(); + let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; + let extension_data = mint_with_extension.get_extension::()?; + + msg!("{:?}", mint_with_extension); + msg!("{:?}", extension_data); + Ok(()) +} + +pub fn handler(mut context: Context) -> Result<()> { + check_mint_data(&mut context.accounts)?; + + // // Token Group and Token Member extensions features not enabled yet on the Token2022 program + // // This is temporary placeholder to update one extensions are live + // // Initializing the "pointers" works, but you can't initialize the group/member data yet + + // let signer_seeds: &[&[&[u8]]] = &[&[b"group", &[context.bumps.mint_account]]]; + // token_group_initialize( + // CpiContext::new( + // context.accounts.token_program.to_account_info(), + // TokenGroupInitialize { + // token_program_id: context.accounts.token_program.to_account_info(), + // group: context.accounts.mint_account.to_account_info(), + // mint: context.accounts.mint_account.to_account_info(), + // mint_authority: context.accounts.mint_account.to_account_info(), + // }, + // ) + // .with_signer(signer_seeds), + // Some(context.accounts.payer.key()), // update_authority + // 10, // max_size + // )?; + Ok(()) +} diff --git a/tokens/token-extensions/group/anchor-v1/programs/group/src/lib.rs b/tokens/token-extensions/group/anchor-v1/programs/group/src/lib.rs new file mode 100644 index 000000000..4c2219231 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/programs/group/src/lib.rs @@ -0,0 +1,16 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("4XCDGMD8fsdjUzmYj6d9if8twFt1f23Ym52iDmWK8fFs"); + +#[program] +pub mod group { + + use super::*; + + pub fn test_initialize_group(context: Context) -> Result<()> { + instructions::test_initialize_group::handler(context) + } +} diff --git a/tokens/token-extensions/group/anchor-v1/programs/group/tests/test_group.rs b/tokens/token-extensions/group/anchor-v1/programs/group/tests/test_group.rs new file mode 100644 index 000000000..331ca1fb3 --- /dev/null +++ b/tokens/token-extensions/group/anchor-v1/programs/group/tests/test_group.rs @@ -0,0 +1,50 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_signer::Signer, +}; + +#[test] +fn test_initialize_group() { + let program_id = group::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/group.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + // Derive the mint PDA + let (mint_account, _bump) = Pubkey::find_program_address(&[b"group"], &program_id); + + let instruction = Instruction::new_with_bytes( + program_id, + &group::instruction::TestInitializeGroup {}.data(), + group::accounts::InitializeGroupAccountConstraints { + payer: payer.pubkey(), + mint_account, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint was created with group pointer extension + let mint_data = svm + .get_account(&mint_account) + .expect("Mint account should exist"); + assert!( + mint_data.data.len() > 82, + "Mint should have extension data (size > 82, got {})", + mint_data.data.len() + ); +} diff --git a/tokens/token-extensions/group/anchor/README.md b/tokens/token-extensions/group/anchor/README.md index 8522b9b6b..e9a82a749 100644 --- a/tokens/token-extensions/group/anchor/README.md +++ b/tokens/token-extensions/group/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Group Pointer (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Link tokens to a group using the Group Pointer extension. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/.gitignore b/tokens/token-extensions/immutable-owner/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/.prettierignore b/tokens/token-extensions/immutable-owner/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/Anchor.toml b/tokens/token-extensions/immutable-owner/anchor-v1/Anchor.toml new file mode 100644 index 000000000..bc74ecb04 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +immutable_owner = "6g5URpqqurW8RbKjuGeRCVZBKky3J4kYcLeotQ6vj6UT" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/Cargo.toml b/tokens/token-extensions/immutable-owner/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/README.md b/tokens/token-extensions/immutable-owner/anchor-v1/README.md new file mode 100644 index 000000000..f10abe8ba --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/README.md @@ -0,0 +1,39 @@ +# Token Extensions - Immutable Owner (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Create token accounts whose owner field cannot be changed after creation. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Immutable owner extension + +## Setup + +From this directory (`tokens/token-extensions/immutable-owner/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Cargo.toml b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Cargo.toml new file mode 100644 index 000000000..ab8bfba85 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "immutable-owner" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "immutable_owner" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Xargo.toml b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/src/lib.rs b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/src/lib.rs new file mode 100644 index 000000000..e21a5e718 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/src/lib.rs @@ -0,0 +1,75 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; +use anchor_spl::{ + token_2022::{ + initialize_account3, + spl_token_2022::{extension::ExtensionType, pod::PodAccount}, + InitializeAccount3, + }, + token_interface::{immutable_owner_initialize, ImmutableOwnerInitialize, Mint, Token2022}, +}; + +declare_id!("6g5URpqqurW8RbKjuGeRCVZBKky3J4kYcLeotQ6vj6UT"); + +#[program] +pub mod immutable_owner { + use super::*; + + // There is currently not an anchor constraint to automatically initialize the ImmutableOwner extension + // We can manually create and initialize the token account via CPIs in the instruction handler + pub fn initialize(context: Context) -> Result<()> { + // Calculate space required for token and extension data + let token_account_size = ExtensionType::try_calculate_account_len::(&[ + ExtensionType::ImmutableOwner, + ])?; + + // Calculate minimum lamports required for size of token account with extensions + let lamports = (Rent::get()?).minimum_balance(token_account_size); + + // Invoke System Program to create new account with space for token account and extension data + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.token_account.to_account_info(), + }, + ), + lamports, // Lamports + token_account_size as u64, // Space + &context.accounts.token_program.key(), // Owner Program + )?; + + // Initialize the token account with the immutable owner extension + immutable_owner_initialize(CpiContext::new( + context.accounts.token_program.key(), + ImmutableOwnerInitialize { + token_program_id: context.accounts.token_program.to_account_info(), + token_account: context.accounts.token_account.to_account_info(), + }, + ))?; + + // Initialize the standard token account data + initialize_account3(CpiContext::new( + context.accounts.token_program.key(), + InitializeAccount3 { + account: context.accounts.token_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + authority: context.accounts.payer.to_account_info(), + }, + ))?; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account(mut)] + pub token_account: Signer<'info>, + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} diff --git a/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/tests/test_immutable_owner.rs b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/tests/test_immutable_owner.rs new file mode 100644 index 000000000..90710e4c9 --- /dev/null +++ b/tokens/token-extensions/immutable-owner/anchor-v1/programs/immutable-owner/tests/test_immutable_owner.rs @@ -0,0 +1,106 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{create_token_extensions_mint, TOKEN_EXTENSIONS_PROGRAM_ID}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +/// SetAuthority instruction for Token Extensions (instruction 6). +fn set_authority_instruction( + account: &Pubkey, + current_authority: &Pubkey, + new_authority: Option<&Pubkey>, + authority_type: u8, +) -> Instruction { + let mut data = vec![6u8, authority_type]; + match new_authority { + Some(new_auth) => { + data.push(1); // COption::Some + data.extend_from_slice(new_auth.as_ref()); + } + None => { + data.push(0); // COption::None + data.extend_from_slice(&[0u8; 32]); + } + } + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*account, false), + AccountMeta::new_readonly(*current_authority, true), + ], + data, + } +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = immutable_owner::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/immutable_owner.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token_account_with_immutable_owner() { + let (mut svm, program_id, payer) = setup(); + let token_keypair = Keypair::new(); + + // Step 1: Create a Token Extensions mint with 2 decimals (no extensions needed on mint) + let mint = create_token_extensions_mint(&mut svm, &payer, 2, None, &[]).unwrap(); + svm.expire_blockhash(); + + // Step 2: Call program to create token account with ImmutableOwner extension + let initialize_ix = Instruction::new_with_bytes( + program_id, + &immutable_owner::instruction::Initialize {}.data(), + immutable_owner::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + token_account: token_keypair.pubkey(), + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &token_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify token account was created + let token_data = svm + .get_account(&token_keypair.pubkey()) + .expect("Token account should exist"); + assert!( + token_data.data.len() > 165, + "Token account should have extension data (size > 165, got {})", + token_data.data.len() + ); + + // Step 3: Attempt to change the account owner - should fail due to immutable owner + let new_owner = Keypair::new(); + let set_authority_ix = set_authority_instruction( + &token_keypair.pubkey(), + &payer.pubkey(), + Some(&new_owner.pubkey()), + 2, // AuthorityType::AccountOwner + ); + let result = send_transaction_from_instructions(&mut svm, vec![set_authority_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Setting a new owner should fail due to ImmutableOwner extension" + ); +} diff --git a/tokens/token-extensions/immutable-owner/anchor/README.md b/tokens/token-extensions/immutable-owner/anchor/README.md index 3ce9be020..1a4b023b0 100644 --- a/tokens/token-extensions/immutable-owner/anchor/README.md +++ b/tokens/token-extensions/immutable-owner/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Immutable Owner (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Create token accounts whose owner field cannot be changed after creation. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/.gitignore b/tokens/token-extensions/interest-bearing/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/.prettierignore b/tokens/token-extensions/interest-bearing/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/Anchor.toml b/tokens/token-extensions/interest-bearing/anchor-v1/Anchor.toml new file mode 100644 index 000000000..3736da8f2 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +interest_bearing = "DMQdkzRJz8uQSN8Kx2QYmQJn6xLKhsu3LcPYxs314MgC" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/Cargo.toml b/tokens/token-extensions/interest-bearing/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/README.md b/tokens/token-extensions/interest-bearing/anchor-v1/README.md new file mode 100644 index 000000000..ed7512913 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - Interest Bearing (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Display balances that accrue interest over time using the interest-bearing extension. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Interest bearing extension +- Accrued balance reporting + +## Setup + +From this directory (`tokens/token-extensions/interest-bearing/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Cargo.toml b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Cargo.toml new file mode 100644 index 000000000..b7a89a7c3 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "interest-bearing" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "interest_bearing" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Xargo.toml b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/initialize.rs b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/initialize.rs new file mode 100644 index 000000000..cb34219a7 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/initialize.rs @@ -0,0 +1,80 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; +use anchor_spl::{ + token_2022::{ + initialize_mint2, + spl_token_2022::{extension::ExtensionType, pod::PodMint}, + InitializeMint2, + }, + token_interface::{interest_bearing_mint_initialize, InterestBearingMintInitialize, Token2022}, +}; + +use crate::check_mint_data; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub mint_account: Signer<'info>, + + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context, rate: i16) -> Result<()> { + // Calculate space required for mint and extension data + let mint_size = ExtensionType::try_calculate_account_len::(&[ + ExtensionType::InterestBearingConfig, + ])?; + + // Calculate minimum lamports required for size of mint account with extensions + let lamports = (Rent::get()?).minimum_balance(mint_size); + + // Invoke System Program to create new account with space for mint and extension data + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.mint_account.to_account_info(), + }, + ), + lamports, // Lamports + mint_size as u64, // Space + &context.accounts.token_program.key(), // Owner Program + )?; + + // Initialize the InterestBearingConfig extension + // This instruction must come before the instruction to initialize the mint data + interest_bearing_mint_initialize( + CpiContext::new( + context.accounts.token_program.key(), + InterestBearingMintInitialize { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + }, + ), + Some(context.accounts.payer.key()), + rate, + )?; + + // Initialize the standard mint account data + initialize_mint2( + CpiContext::new( + context.accounts.token_program.key(), + InitializeMint2 { + mint: context.accounts.mint_account.to_account_info(), + }, + ), + 2, // decimals + &context.accounts.payer.key(), // mint authority + Some(&context.accounts.payer.key()), // freeze authority + )?; + + check_mint_data( + &context.accounts.mint_account.to_account_info(), + &context.accounts.payer.key(), + )?; + Ok(()) +} diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/mod.rs b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/mod.rs new file mode 100644 index 000000000..29f3a957f --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize; +pub mod update_rate; + +pub use initialize::*; +pub use update_rate::*; diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/update_rate.rs b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/update_rate.rs new file mode 100644 index 000000000..87da63389 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/instructions/update_rate.rs @@ -0,0 +1,37 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + interest_bearing_mint_update_rate, InterestBearingMintUpdateRate, Mint, Token2022, +}; + +use crate::check_mint_data; + +#[derive(Accounts)] +pub struct UpdateRateAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context, rate: i16) -> Result<()> { + interest_bearing_mint_update_rate( + CpiContext::new( + context.accounts.token_program.key(), + InterestBearingMintUpdateRate { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + rate_authority: context.accounts.authority.to_account_info(), + }, + ), + rate, + )?; + + check_mint_data( + &context.accounts.mint_account.to_account_info(), + &context.accounts.authority.key(), + )?; + Ok(()) +} diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/lib.rs b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/lib.rs new file mode 100644 index 000000000..b09782186 --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/src/lib.rs @@ -0,0 +1,42 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::{ + extension::{ + interest_bearing_mint::InterestBearingConfig, BaseStateWithExtensions, + StateWithExtensions, + }, + state::Mint as MintState, +}; +use anchor_spl::token_interface::spl_pod::optional_keys::OptionalNonZeroPubkey; + +mod instructions; +use instructions::*; + +declare_id!("DMQdkzRJz8uQSN8Kx2QYmQJn6xLKhsu3LcPYxs314MgC"); + +#[program] +pub mod interest_bearing { + + use super::*; + + pub fn initialize(context: Context, rate: i16) -> Result<()> { + instructions::initialize::handler(context, rate) + } + + pub fn update_rate(context: Context, rate: i16) -> Result<()> { + instructions::update_rate::handler(context, rate) + } +} + +pub fn check_mint_data(mint_account_info: &AccountInfo, authority_key: &Pubkey) -> Result<()> { + let mint_data = mint_account_info.data.borrow(); + let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; + let extension_data = mint_with_extension.get_extension::()?; + + assert_eq!( + extension_data.rate_authority, + OptionalNonZeroPubkey::try_from(Some(*authority_key))? + ); + + msg!("{:?}", extension_data); + Ok(()) +} diff --git a/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/tests/test_interest_bearing.rs b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/tests/test_interest_bearing.rs new file mode 100644 index 000000000..c9954bccb --- /dev/null +++ b/tokens/token-extensions/interest-bearing/anchor-v1/programs/interest-bearing/tests/test_interest_bearing.rs @@ -0,0 +1,72 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = interest_bearing::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/interest_bearing.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_initialize_and_update_rate() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Initialize mint with InterestBearingConfig extension (rate=0) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &interest_bearing::instruction::Initialize { rate: 0 }.data(), + interest_bearing::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint account exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Update the interest rate to 100 + let update_rate_ix = Instruction::new_with_bytes( + program_id, + &interest_bearing::instruction::UpdateRate { rate: 100 }.data(), + interest_bearing::accounts::UpdateRateAccountConstraints { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_rate_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint still exists after rate update + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should still exist"); + assert!(!mint_account.data.is_empty(), "Mint should still have data"); +} diff --git a/tokens/token-extensions/interest-bearing/anchor/README.md b/tokens/token-extensions/interest-bearing/anchor/README.md index 5e09f728f..f371797a8 100644 --- a/tokens/token-extensions/interest-bearing/anchor/README.md +++ b/tokens/token-extensions/interest-bearing/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Interest Bearing (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Display balances that accrue interest over time using the interest-bearing extension. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/.gitignore b/tokens/token-extensions/memo-transfer/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/.prettierignore b/tokens/token-extensions/memo-transfer/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/Anchor.toml b/tokens/token-extensions/memo-transfer/anchor-v1/Anchor.toml new file mode 100644 index 000000000..ea61e0e1f --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +memo_transfer = "5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/Cargo.toml b/tokens/token-extensions/memo-transfer/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/README.md b/tokens/token-extensions/memo-transfer/anchor-v1/README.md new file mode 100644 index 000000000..7de688cb5 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - Memo Transfer (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Require a memo on every transfer via the memo-transfer extension. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Memo transfer extension +- Transfer with memo CPI + +## Setup + +From this directory (`tokens/token-extensions/memo-transfer/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Cargo.toml b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Cargo.toml new file mode 100644 index 000000000..2b821be8d --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "memo-transfer" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "memo_transfer" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Xargo.toml b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/disable.rs b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/disable.rs new file mode 100644 index 000000000..f38442c0d --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/disable.rs @@ -0,0 +1,27 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{memo_transfer_disable, MemoTransfer, Token2022, TokenAccount}; + +#[derive(Accounts)] +pub struct DisableAccountConstraints<'info> { + #[account(mut)] + pub owner: Signer<'info>, + + #[account( + mut, + token::authority = owner, + )] + pub token_account: InterfaceAccount<'info, TokenAccount>, + pub token_program: Program<'info, Token2022>, +} + +pub fn handler(context: Context) -> Result<()> { + memo_transfer_disable(CpiContext::new( + context.accounts.token_program.key(), + MemoTransfer { + token_program_id: context.accounts.token_program.to_account_info(), + account: context.accounts.token_account.to_account_info(), + owner: context.accounts.owner.to_account_info(), + }, + ))?; + Ok(()) +} diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/initialize.rs b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/initialize.rs new file mode 100644 index 000000000..b465e5423 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/initialize.rs @@ -0,0 +1,67 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; +use anchor_spl::{ + token_2022::{ + initialize_account3, + spl_token_2022::{extension::ExtensionType, pod::PodAccount}, + InitializeAccount3, + }, + token_interface::{memo_transfer_initialize, MemoTransfer, Mint, Token2022}, +}; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account(mut)] + pub token_account: Signer<'info>, + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn handler(context: Context) -> Result<()> { + // Calculate space required for token and extension data + let token_account_size = + ExtensionType::try_calculate_account_len::(&[ExtensionType::MemoTransfer])?; + + // Calculate minimum lamports required for size of token account with extensions + let lamports = (Rent::get()?).minimum_balance(token_account_size); + + // Invoke System Program to create new account with space for token account and extension data + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.token_account.to_account_info(), + }, + ), + lamports, // Lamports + token_account_size as u64, // Space + &context.accounts.token_program.key(), // Owner Program + )?; + + // Initialize the standard token account data + initialize_account3(CpiContext::new( + context.accounts.token_program.key(), + InitializeAccount3 { + account: context.accounts.token_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + authority: context.accounts.payer.to_account_info(), + }, + ))?; + + // Initialize the memo transfer extension + // This instruction must come after the token account initialization + memo_transfer_initialize(CpiContext::new( + context.accounts.token_program.key(), + MemoTransfer { + token_program_id: context.accounts.token_program.to_account_info(), + account: context.accounts.token_account.to_account_info(), + owner: context.accounts.payer.to_account_info(), + }, + ))?; + Ok(()) +} diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/mod.rs b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/mod.rs new file mode 100644 index 000000000..b49ae3153 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod disable; +pub mod initialize; + +pub use disable::*; +pub use initialize::*; diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/lib.rs b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/lib.rs new file mode 100644 index 000000000..d9e71f050 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/src/lib.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2"); + +#[program] +pub mod memo_transfer { + use super::*; + + pub fn initialize(context: Context) -> Result<()> { + instructions::initialize::handler(context) + } + + pub fn disable(context: Context) -> Result<()> { + instructions::disable::handler(context) + } +} diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/tests/test_memo_transfer.rs b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/tests/test_memo_transfer.rs new file mode 100644 index 000000000..e410f2347 --- /dev/null +++ b/tokens/token-extensions/memo-transfer/anchor-v1/programs/memo-transfer/tests/test_memo_transfer.rs @@ -0,0 +1,239 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_mint, mint_tokens_to_token_extensions_account, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn memo_program_id() -> Pubkey { + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" + .parse() + .unwrap() +} + +/// Create a Token Extensions token account (165 bytes, no extra extensions). +/// Uses explicit keypair - not an ATA - because the test needs multiple +/// source accounts for the same owner+mint. +fn create_token_account_instructions( + payer: &Pubkey, + token_account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let rent_sysvar: Pubkey = "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap(); + let create_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, + token_account, + 3_000_000, + 165, + &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + let init_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*mint, false), + AccountMeta::new_readonly(*owner, false), + AccountMeta::new_readonly(rent_sysvar, false), + ], + data: vec![1], // InitializeAccount + }; + vec![create_ix, init_ix] +} + +/// Transfer instruction for Token Extensions (instruction 3). +fn transfer_instruction( + source: &Pubkey, + dest: &Pubkey, + authority: &Pubkey, + amount: u64, +) -> Instruction { + let mut data = vec![3u8]; + data.extend_from_slice(&amount.to_le_bytes()); + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*source, false), + AccountMeta::new(*dest, false), + AccountMeta::new_readonly(*authority, true), + ], + data, + } +} + +/// Memo instruction: just the memo text as bytes. +fn memo_instruction(memo_text: &str, signers: &[&Pubkey]) -> Instruction { + let accounts: Vec = signers + .iter() + .map(|s| AccountMeta::new_readonly(**s, true)) + .collect(); + Instruction { + program_id: memo_program_id(), + accounts, + data: memo_text.as_bytes().to_vec(), + } +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = memo_transfer::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/memo_transfer.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // Load SPL Memo program (needed for memo instructions) + let memo_program_bytes = include_bytes!("../../../tests/fixtures/spl_memo.so"); + svm.add_program(memo_program_id(), memo_program_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_memo_transfer() { + let (mut svm, program_id, payer) = setup(); + let token_keypair = Keypair::new(); + + // Step 1: Create a standard Token Extensions mint (no extensions on the mint) + let mint = create_token_extensions_mint(&mut svm, &payer, 2, None, &[]).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create token account with RequiredMemo extension via program + let initialize_ix = Instruction::new_with_bytes( + program_id, + &memo_transfer::instruction::Initialize {}.data(), + memo_transfer::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + token_account: token_keypair.pubkey(), + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &token_keypair], &payer.pubkey()).unwrap(); + + // Verify token account exists + let token_account = svm + .get_account(&token_keypair.pubkey()) + .expect("Token account should exist"); + assert!( + !token_account.data.is_empty(), + "Token account should have data" + ); + + svm.expire_blockhash(); + + // Step 3: Create a source token account and mint tokens to it + let source_keypair = Keypair::new(); + let create_source_ixs = create_token_account_instructions( + &payer.pubkey(), + &source_keypair.pubkey(), + &mint, + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_source_ixs, &[&payer, &source_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_keypair.pubkey(), + 100, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer without memo - should fail + let transfer_ix = transfer_instruction( + &source_keypair.pubkey(), + &token_keypair.pubkey(), + &payer.pubkey(), + 1, + ); + let result = send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Transfer without memo should fail" + ); + svm.expire_blockhash(); + + // Step 5: Transfer with memo - should succeed + let memo_ix = memo_instruction("hello, world", &[&payer.pubkey()]); + let transfer_ix = transfer_instruction( + &source_keypair.pubkey(), + &token_keypair.pubkey(), + &payer.pubkey(), + 1, + ); + send_transaction_from_instructions(&mut svm, vec![memo_ix, transfer_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + assert_token_account_balance(&svm, &token_keypair.pubkey(), 1, "Should have 1 token after transfer with memo"); + + // Step 6: Disable RequiredMemo extension + let disable_ix = Instruction::new_with_bytes( + program_id, + &memo_transfer::instruction::Disable {}.data(), + memo_transfer::accounts::DisableAccountConstraints { + owner: payer.pubkey(), + token_account: token_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![disable_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 7: Transfer without memo should now succeed (memo disabled) + let source2_keypair = Keypair::new(); + let create_source2_ixs = create_token_account_instructions( + &payer.pubkey(), + &source2_keypair.pubkey(), + &mint, + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_source2_ixs, &[&payer, &source2_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source2_keypair.pubkey(), + 100, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let transfer_ix2 = transfer_instruction( + &source2_keypair.pubkey(), + &token_keypair.pubkey(), + &payer.pubkey(), + 1, + ); + send_transaction_from_instructions(&mut svm, vec![transfer_ix2], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance( + &svm, + &token_keypair.pubkey(), + 2, + "Should have 2 tokens after transfer without memo (memo disabled)", + ); +} diff --git a/tokens/token-extensions/memo-transfer/anchor-v1/tests/fixtures/spl_memo.so b/tokens/token-extensions/memo-transfer/anchor-v1/tests/fixtures/spl_memo.so new file mode 100644 index 0000000000000000000000000000000000000000..88385a01dec7b2f375cc33959fc8ee06e6eef409 GIT binary patch literal 74800 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 g^LN5a(; [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Require a memo on every transfer via the memo-transfer extension. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/metadata/anchor-v1/.gitignore b/tokens/token-extensions/metadata/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/metadata/anchor-v1/.prettierignore b/tokens/token-extensions/metadata/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/metadata/anchor-v1/Anchor.toml b/tokens/token-extensions/metadata/anchor-v1/Anchor.toml new file mode 100644 index 000000000..25d6d7655 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +metadata = "BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/metadata/anchor-v1/Cargo.toml b/tokens/token-extensions/metadata/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/metadata/anchor-v1/README.md b/tokens/token-extensions/metadata/anchor-v1/README.md new file mode 100644 index 000000000..5bef624ed --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/README.md @@ -0,0 +1,39 @@ +# Token Extensions - Onchain Metadata (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Store token metadata inside the mint account using Token Extensions metadata. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Onchain metadata extension + +## Setup + +From this directory (`tokens/token-extensions/metadata/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/Cargo.toml b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/Cargo.toml new file mode 100644 index 000000000..d686173a3 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "metadata" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "metadata" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" +spl-token-metadata-interface = "0.8.0" +spl-type-length-value = "0.9.1" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/Xargo.toml b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/emit.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/emit.rs new file mode 100644 index 000000000..b849ab82b --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/emit.rs @@ -0,0 +1,28 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::program::invoke; +use anchor_spl::token_interface::{Mint, Token2022}; +use spl_token_metadata_interface::instruction::emit; + +#[derive(Accounts)] +pub struct EmitAccountConstraints<'info> { + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, +} + +// Invoke the emit instruction from spl_token_metadata_interface directly +// There is not an anchor CpiContext for this instruction +pub fn process_emit(context: Context) -> Result<()> { + invoke( + &emit( + &context.accounts.token_program.key(), // token program id + &context.accounts.mint_account.key(), // "metadata" account + None, + None, + ), + &[ + context.accounts.token_program.to_account_info(), + context.accounts.mint_account.to_account_info(), + ], + )?; + Ok(()) +} diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/initialize.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/initialize.rs new file mode 100644 index 000000000..740b61bae --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/initialize.rs @@ -0,0 +1,80 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{transfer, Transfer}; +use anchor_spl::token_interface::{ + token_metadata_initialize, Mint, Token2022, TokenMetadataInitialize, +}; +use spl_token_metadata_interface::state::TokenMetadata; +use spl_type_length_value::variable_len_pack::VariableLenPack; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::decimals = 2, + mint::authority = payer, + extensions::metadata_pointer::authority = payer, + extensions::metadata_pointer::metadata_address = mint_account, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn process_initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { + let TokenMetadataArgs { name, symbol, uri } = args; + + // Define token metadata + let token_metadata = TokenMetadata { + name: name.clone(), + symbol: symbol.clone(), + uri: uri.clone(), + ..Default::default() + }; + + // Add 4 extra bytes for size of MetadataExtension (2 bytes for type, 2 bytes for length) + let data_len = 4 + token_metadata.get_packed_len()?; + + // Calculate lamports required for the additional metadata + let lamports = Rent::get()?.minimum_balance(data_len); + + // Transfer additional lamports to mint account + transfer( + CpiContext::new( + context.accounts.system_program.key(), + Transfer { + from: context.accounts.payer.to_account_info(), + to: context.accounts.mint_account.to_account_info(), + }, + ), + lamports, + )?; + + // Initialize token metadata + token_metadata_initialize( + CpiContext::new( + context.accounts.token_program.key(), + TokenMetadataInitialize { + program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + metadata: context.accounts.mint_account.to_account_info(), + mint_authority: context.accounts.payer.to_account_info(), + update_authority: context.accounts.payer.to_account_info(), + }, + ), + name, + symbol, + uri, + )?; + Ok(()) +} + +#[derive(AnchorDeserialize, AnchorSerialize)] +pub struct TokenMetadataArgs { + pub name: String, + pub symbol: String, + pub uri: String, +} diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/mod.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/mod.rs new file mode 100644 index 000000000..66abcd2db --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/mod.rs @@ -0,0 +1,10 @@ +pub use initialize::*; +pub mod initialize; +pub use update_field::*; +pub mod update_field; +pub use remove_key::*; +pub mod remove_key; +pub use emit::*; +pub mod emit; +pub use update_authority::*; +pub mod update_authority; diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/remove_key.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/remove_key.rs new file mode 100644 index 000000000..0114a4b26 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/remove_key.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; +use anchor_lang::solana_program::program::invoke; +use anchor_spl::token_interface::{Mint, Token2022}; +use spl_token_metadata_interface::instruction::remove_key; + +#[derive(Accounts)] +pub struct RemoveKeyAccountConstraints<'info> { + #[account(mut)] + pub update_authority: Signer<'info>, + + #[account( + mut, + extensions::metadata_pointer::metadata_address = mint_account, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +// Invoke the remove_key instruction from spl_token_metadata_interface directly +// There is not an anchor CpiContext for this instruction +pub fn process_remove_key(context: Context, key: String) -> Result<()> { + invoke( + &remove_key( + &context.accounts.token_program.key(), // token program id + &context.accounts.mint_account.key(), // "metadata" account + &context.accounts.update_authority.key(), // update authority + key, // key to remove + true, // idempotent flag, if true transaction will not fail if key does not exist + ), + &[ + context.accounts.token_program.to_account_info(), + context.accounts.mint_account.to_account_info(), + context.accounts.update_authority.to_account_info(), + ], + )?; + Ok(()) +} diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_authority.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_authority.rs new file mode 100644 index 000000000..ded7b65f7 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_authority.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + spl_pod::optional_keys::OptionalNonZeroPubkey, token_metadata_update_authority, Mint, + Token2022, TokenMetadataUpdateAuthority, +}; + +#[derive(Accounts)] +pub struct UpdateAuthorityAccountConstraints<'info> { + pub current_authority: Signer<'info>, + pub new_authority: Option>, + + #[account( + mut, + extensions::metadata_pointer::metadata_address = mint_account, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn process_update_authority(context: Context) -> Result<()> { + let new_authority_key = match &context.accounts.new_authority { + Some(account) => OptionalNonZeroPubkey::try_from(Some(account.key()))?, + None => OptionalNonZeroPubkey::try_from(None)?, + }; + + // Change update authority + token_metadata_update_authority( + CpiContext::new( + context.accounts.token_program.key(), + TokenMetadataUpdateAuthority { + program_id: context.accounts.token_program.to_account_info(), + metadata: context.accounts.mint_account.to_account_info(), + current_authority: context.accounts.current_authority.to_account_info(), + + // new authority isn't actually needed as account in the CPI + // using current_authority as a placeholder to satisfy the struct + new_authority: context.accounts.current_authority.to_account_info(), + }, + ), + new_authority_key, + )?; + Ok(()) +} diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_field.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_field.rs new file mode 100644 index 000000000..754fb8091 --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/instructions/update_field.rs @@ -0,0 +1,127 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{transfer, Transfer}; +use anchor_spl::{ + token_2022::spl_token_2022::{ + extension::{BaseStateWithExtensions, PodStateWithExtensions}, + pod::PodMint, + }, + token_interface::{token_metadata_update_field, Mint, Token2022, TokenMetadataUpdateField}, +}; +use spl_token_metadata_interface::state::{Field, TokenMetadata}; + +#[derive(Accounts)] +pub struct UpdateFieldAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + mut, + extensions::metadata_pointer::metadata_address = mint_account, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn process_update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { + let UpdateFieldArgs { field, value } = args; + + // Convert to Field type from spl_token_metadata_interface + let field = field.to_spl_field(); + msg!("Field: {:?}, Value: {}", field, value); + + let (current_lamports, required_lamports) = { + // Get the current state of the mint account + let mint = &context.accounts.mint_account.to_account_info(); + let buffer = mint.try_borrow_data()?; + let state = PodStateWithExtensions::::unpack(&buffer)?; + + // Get and update the token metadata + let mut token_metadata = state.get_variable_len_extension::()?; + token_metadata.update(field.clone(), value.clone()); + msg!("Updated TokenMetadata: {:?}", token_metadata); + + // Calculate the new account length with the updated metadata + let new_account_len = + state.try_get_new_account_len_for_variable_len_extension(&token_metadata)?; + + // Calculate the required lamports for the new account length + let required_lamports = Rent::get()?.minimum_balance(new_account_len); + // Get the current lamports of the mint account + let current_lamports = mint.lamports(); + + msg!("Required lamports: {}", required_lamports); + msg!("Current lamports: {}", current_lamports); + + (current_lamports, required_lamports) + }; + + // Transfer lamports to mint account for the additional metadata if needed + if required_lamports > current_lamports { + let lamport_difference = required_lamports - current_lamports; + transfer( + CpiContext::new( + context.accounts.system_program.key(), + Transfer { + from: context.accounts.authority.to_account_info(), + to: context.accounts.mint_account.to_account_info(), + }, + ), + lamport_difference, + )?; + msg!( + "Transferring {} lamports to metadata account", + lamport_difference + ); + } + + // Update token metadata + token_metadata_update_field( + CpiContext::new( + context.accounts.token_program.key(), + TokenMetadataUpdateField { + program_id: context.accounts.token_program.to_account_info(), + metadata: context.accounts.mint_account.to_account_info(), + update_authority: context.accounts.authority.to_account_info(), + }, + ), + field, + value, + )?; + Ok(()) +} + +// Custom struct to implement AnchorSerialize and AnchorDeserialize +// This is required to pass the struct as an argument to the instruction +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct UpdateFieldArgs { + /// Field to update in the metadata + pub field: AnchorField, + /// Value to write for the field + pub value: String, +} + +// Need to do this so the enum shows up in the IDL +#[derive(AnchorSerialize, AnchorDeserialize, Debug)] +pub enum AnchorField { + /// The name field, corresponding to `TokenMetadata.name` + Name, + /// The symbol field, corresponding to `TokenMetadata.symbol` + Symbol, + /// The uri field, corresponding to `TokenMetadata.uri` + Uri, + /// A custom field, whose key is given by the associated string + Key(String), +} + +// Convert AnchorField to Field from spl_token_metadata_interface +impl AnchorField { + fn to_spl_field(&self) -> Field { + match self { + AnchorField::Name => Field::Name, + AnchorField::Symbol => Field::Symbol, + AnchorField::Uri => Field::Uri, + AnchorField::Key(s) => Field::Key(s.clone()), + } + } +} diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/lib.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/lib.rs new file mode 100644 index 000000000..e086f704c --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/src/lib.rs @@ -0,0 +1,33 @@ +#![allow(clippy::diverging_sub_expression)] + +use anchor_lang::prelude::*; + +use instructions::*; +pub mod instructions; + +declare_id!("BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D"); + +#[program] +pub mod metadata { + use super::*; + + pub fn initialize(context: Context, args: TokenMetadataArgs) -> Result<()> { + process_initialize(context, args) + } + + pub fn update_field(context: Context, args: UpdateFieldArgs) -> Result<()> { + process_update_field(context, args) + } + + pub fn remove_key(context: Context, key: String) -> Result<()> { + process_remove_key(context, key) + } + + pub fn emit(context: Context) -> Result<()> { + process_emit(context) + } + + pub fn update_authority(context: Context) -> Result<()> { + process_update_authority(context) + } +} diff --git a/tokens/token-extensions/metadata/anchor-v1/programs/metadata/tests/test_metadata.rs b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/tests/test_metadata.rs new file mode 100644 index 000000000..8439e9d3c --- /dev/null +++ b/tokens/token-extensions/metadata/anchor-v1/programs/metadata/tests/test_metadata.rs @@ -0,0 +1,174 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = metadata::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/metadata.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_metadata_full_flow() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Initialize mint with MetadataPointer and TokenMetadata extensions + let initialize_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::Initialize { + args: metadata::instructions::TokenMetadataArgs { + name: "OPOS".to_string(), + symbol: "OPOS".to_string(), + uri: "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json".to_string(), + }, + } + .data(), + metadata::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![initialize_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Update existing metadata field (name) + let update_name_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::UpdateField { + args: metadata::instructions::UpdateFieldArgs { + field: metadata::instructions::AnchorField::Name, + value: "Solana".to_string(), + }, + } + .data(), + metadata::accounts::UpdateFieldAccountConstraints { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_name_ix], &[&payer], &payer.pubkey()) + .unwrap(); + svm.expire_blockhash(); + + // Step 3: Add custom field + let add_custom_field_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::UpdateField { + args: metadata::instructions::UpdateFieldArgs { + field: metadata::instructions::AnchorField::Key("color".to_string()), + value: "red".to_string(), + }, + } + .data(), + metadata::accounts::UpdateFieldAccountConstraints { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![add_custom_field_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + svm.expire_blockhash(); + + // Step 4: Remove custom field + let remove_key_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::RemoveKey { + key: "color".to_string(), + } + .data(), + metadata::accounts::RemoveKeyAccountConstraints { + update_authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![remove_key_ix], &[&payer], &payer.pubkey()) + .unwrap(); + svm.expire_blockhash(); + + // Step 5: Update authority to None + let update_authority_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::UpdateAuthority {}.data(), + metadata::accounts::UpdateAuthorityAccountConstraints { + current_authority: payer.pubkey(), + new_authority: None, + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![update_authority_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + svm.expire_blockhash(); + + // Step 6: Emit metadata (verify it doesn't fail) + let emit_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::Emit {}.data(), + metadata::accounts::EmitAccountConstraints { + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![emit_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify mint still exists after all operations + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should still exist after all metadata operations"); + assert!(!mint_account.data.is_empty(), "Mint should still have data"); +} diff --git a/tokens/token-extensions/metadata/anchor/README.md b/tokens/token-extensions/metadata/anchor/README.md index 68fb5d8de..19d8b6dcd 100644 --- a/tokens/token-extensions/metadata/anchor/README.md +++ b/tokens/token-extensions/metadata/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Onchain Metadata (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Store token metadata inside the mint account using Token Extensions metadata. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/.gitignore b/tokens/token-extensions/mint-close-authority/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/.prettierignore b/tokens/token-extensions/mint-close-authority/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/Anchor.toml b/tokens/token-extensions/mint-close-authority/anchor-v1/Anchor.toml new file mode 100644 index 000000000..418e3a339 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +mint_close_authority = "AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/Cargo.toml b/tokens/token-extensions/mint-close-authority/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/README.md b/tokens/token-extensions/mint-close-authority/anchor-v1/README.md new file mode 100644 index 000000000..45d16da75 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/README.md @@ -0,0 +1,39 @@ +# Token Extensions - Mint Close Authority (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Designate an account allowed to close the mint and reclaim lamports. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Mint close authority extension + +## Setup + +From this directory (`tokens/token-extensions/mint-close-authority/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Cargo.toml b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Cargo.toml new file mode 100644 index 000000000..0c4bc0de7 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "mint-close-authority" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "mint_close_authority" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Xargo.toml b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/close.rs b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/close.rs new file mode 100644 index 000000000..f87c3ccb3 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/close.rs @@ -0,0 +1,32 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + token_2022::{close_account, CloseAccount}, + token_interface::{Mint, Token2022}, +}; + +#[derive(Accounts)] +pub struct CloseAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + mut, + extensions::close_authority::authority = authority, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, +} + +pub fn handler(context: Context) -> Result<()> { + // cpi to token extensions programs to close mint account + // alternatively, this can also be done in the client + close_account(CpiContext::new( + context.accounts.token_program.key(), + CloseAccount { + account: context.accounts.mint_account.to_account_info(), + destination: context.accounts.authority.to_account_info(), + authority: context.accounts.authority.to_account_info(), + }, + ))?; + Ok(()) +} diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/initialize.rs b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/initialize.rs new file mode 100644 index 000000000..ba2f2a47a --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/initialize.rs @@ -0,0 +1,50 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + spl_pod::optional_keys::OptionalNonZeroPubkey, + spl_token_2022::{ + extension::{ + mint_close_authority::MintCloseAuthority, BaseStateWithExtensions, + StateWithExtensions, + }, + state::Mint as MintState, + }, + Mint, Token2022, +}; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::decimals = 2, + mint::authority = payer, + extensions::close_authority::authority = payer, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +pub fn handler(mut context: Context) -> Result<()> { + handle_check_mint_data(&mut context.accounts)?; + Ok(()) +} + +// helper to check mint data, and demonstrate how to read mint extension data within a program +fn handle_check_mint_data(accounts: &mut InitializeAccountConstraints) -> Result<()> { + let mint = &accounts.mint_account.to_account_info(); + let mint_data = mint.data.borrow(); + let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; + let extension_data = mint_with_extension.get_extension::()?; + + assert_eq!( + extension_data.close_authority, + OptionalNonZeroPubkey::try_from(Some(accounts.payer.key()))? + ); + + msg!("{:?}", extension_data); + Ok(()) +} diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/mod.rs b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/mod.rs new file mode 100644 index 000000000..5479927b9 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod close; +pub mod initialize; + +pub use close::*; +pub use initialize::*; diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/lib.rs b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/lib.rs new file mode 100644 index 000000000..c5ac6ba42 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/src/lib.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n"); + +#[program] +pub mod mint_close_authority { + use super::*; + + pub fn initialize(context: Context) -> Result<()> { + instructions::initialize::handler(context) + } + + pub fn close(context: Context) -> Result<()> { + instructions::close::handler(context) + } +} diff --git a/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/tests/test_mint_close_authority.rs b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/tests/test_mint_close_authority.rs new file mode 100644 index 000000000..156c92040 --- /dev/null +++ b/tokens/token-extensions/mint-close-authority/anchor-v1/programs/mint-close-authority/tests/test_mint_close_authority.rs @@ -0,0 +1,127 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = mint_close_authority::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/mint_close_authority.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_and_close_mint() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Create Mint with Close Authority + let initialize_ix = Instruction::new_with_bytes( + program_id, + &mint_close_authority::instruction::Initialize {}.data(), + mint_close_authority::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Close Mint using Anchor CPI + let close_ix = Instruction::new_with_bytes( + program_id, + &mint_close_authority::instruction::Close {}.data(), + mint_close_authority::accounts::CloseAccountConstraints { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![close_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint no longer exists (lamports returned to authority) + let mint_account = svm.get_account(&mint_keypair.pubkey()); + assert!( + mint_account.is_none(), + "Mint account should be closed" + ); + + svm.expire_blockhash(); + + // Step 3: Create Mint with Close Authority again (re-use same keypair) + let initialize_ix2 = Instruction::new_with_bytes( + program_id, + &mint_close_authority::instruction::Initialize {}.data(), + mint_close_authority::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix2], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint exists again + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist after re-creation"); + assert!( + !mint_account.data.is_empty(), + "Mint should have data after re-creation" + ); + + svm.expire_blockhash(); + + // Step 4: Close Mint directly using Token Extensions CloseAccount instruction + let close_direct_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + anchor_lang::solana_program::instruction::AccountMeta::new( + mint_keypair.pubkey(), + false, + ), + anchor_lang::solana_program::instruction::AccountMeta::new( + payer.pubkey(), + false, + ), + anchor_lang::solana_program::instruction::AccountMeta::new_readonly( + payer.pubkey(), + true, + ), + ], + data: vec![9], // CloseAccount + }; + send_transaction_from_instructions(&mut svm, vec![close_direct_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint is closed again + let mint_account = svm.get_account(&mint_keypair.pubkey()); + assert!( + mint_account.is_none(), + "Mint account should be closed via direct Token Extensions instruction" + ); +} diff --git a/tokens/token-extensions/mint-close-authority/anchor/README.md b/tokens/token-extensions/mint-close-authority/anchor/README.md index 4b581e6fd..0a98515a4 100644 --- a/tokens/token-extensions/mint-close-authority/anchor/README.md +++ b/tokens/token-extensions/mint-close-authority/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Mint Close Authority (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Designate an account allowed to close the mint and reclaim lamports. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.gitignore b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.gitignore new file mode 100644 index 000000000..f7c1adc6a --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.gitignore @@ -0,0 +1,7 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger \ No newline at end of file diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.prettierignore b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Anchor.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Anchor.toml new file mode 100644 index 000000000..c66ba0c6d --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Anchor.toml @@ -0,0 +1,16 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +[programs.localnet] +extension_nft = "9aZZ7TJ2fQZxY8hMtWXywp5y6BgqC4N2BPcr9FDT47sW" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Cargo.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/README.md b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/README.md new file mode 100644 index 000000000..1a3e75158 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/README.md @@ -0,0 +1,21 @@ +# Anchor Program + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +```bash +anchor build +anchor deploy +``` + +Copy the **[program](https://solana.com/docs/terminology#program) ID** from the output logs and paste it into `Anchor.toml` and `lib.rs`. Then rebuild, redeploy, and run the tests: + +```bash +anchor build +anchor deploy +pnpm install +anchor test +``` diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/package.json b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/package.json new file mode 100644 index 000000000..7ba4cb9de --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/package.json @@ -0,0 +1,12 @@ +{ + "name": "extension-nft-anchor", + "version": "1.0.0", + "description": "Anchor 'chop tree' game minting Token-2022 NFTs with the metadata-pointer extension. Tested with a Rust LiteSVM integration test (anchor test -> cargo test).", + "private": true, + "license": "MIT", + "scripts": { + "build": "anchor build", + "test": "anchor test", + "build-and-test": "anchor build && anchor test" + } +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/pnpm-lock.yaml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/pnpm-lock.yaml new file mode 100644 index 000000000..9b60ae178 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/pnpm-lock.yaml @@ -0,0 +1,9 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Cargo.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Cargo.toml new file mode 100644 index 000000000..4e71abdec --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Cargo.toml @@ -0,0 +1,49 @@ +[package] +name = "extension_nft" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "extension_nft" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] + +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2" } +# session-keys 3.1.1 is the first release that supports Anchor >=0.28,<2.0 +# (so it builds against Anchor 1.0). Earlier 2.x releases pin Anchor <=0.30 +# and fail to compile against the Anchor 1.0 / Solana 3.x API. Provides the +# gasless session-token lesson via `#[session_auth_or]` / `SessionToken`. +session-keys = { version = "3.1.1", features = ["no-entrypoint"] } +# Token-2022 + token-metadata access goes through anchor-spl's bundled +# re-exports (`anchor_spl::token_interface::spl_token_2022`, which is +# `spl-token-2022-interface`, and `anchor_spl::token_2022_extensions:: +# spl_token_metadata_interface`). Pinning standalone `spl-token-2022` / +# `spl-token-metadata-interface` here pulls a second copy on a different +# `solana-pubkey` major than anchor-lang/anchor-spl use, which breaks the +# CPI builders with `Pubkey` type mismatches. Relying on anchor-spl's +# re-exports keeps a single, consistent type universe. + +[dev-dependencies] +litesvm = "0.13.1" +solana-keypair = "3.0.1" +solana-signer = "3.0.0" +solana-instruction = "3.0.0" +solana-pubkey = "3.0.0" +solana-kite = "0.4.0" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Xargo.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/constants.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/constants.rs new file mode 100644 index 000000000..a2854482a --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/constants.rs @@ -0,0 +1,10 @@ +pub const TIME_TO_REFILL_ENERGY: i64 = 60; +pub const MAX_ENERGY: u64 = 100; +pub const MAX_WOOD_PER_TREE: u64 = 100000; + +/// Rough over-allocation for the inline SPL Token Metadata extension TLV +/// appended to the Mint account. The TLV is dynamic (name / symbol / uri / +/// key-value additional fields), so we cannot derive it via `InitSpace`. +/// 250 bytes is enough headroom for our fixture NFTs - raise if you add +/// longer strings or many extra fields. +pub const TOKEN_METADATA_EXTENSION_SPACE: usize = 250; diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/errors.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/errors.rs new file mode 100644 index 000000000..e855d93ec --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/errors.rs @@ -0,0 +1,15 @@ +use anchor_lang::error_code; + +// Anchor's IDL build allows only a single `#[error_code]` enum per program, so +// the game and program-level errors live in one enum. +#[error_code] +pub enum GameErrorCode { + #[msg("Not enough energy")] + NotEnoughEnergy, + #[msg("Wrong Authority")] + WrongAuthority, + #[msg("Invalid Mint account space")] + InvalidMintAccountSpace, + #[msg("Cant initialize metadata_pointer")] + CantInitializeMetadataPointer, +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/chop_tree.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/chop_tree.rs new file mode 100644 index 000000000..597f9f0c6 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/chop_tree.rs @@ -0,0 +1,106 @@ +pub use crate::errors::GameErrorCode; +pub use crate::state::game_data::GameData; +use crate::{state::player_data::PlayerData, NftAuthority}; +use anchor_lang::prelude::*; +use anchor_lang::solana_program::program::invoke_signed; +use anchor_spl::token_2022_extensions::spl_token_metadata_interface; +use anchor_spl::token_interface::{spl_token_2022, Token2022}; +use session_keys::{Session, SessionToken}; + +pub fn chop_tree(context: Context, counter: u16, amount: u64) -> Result<()> { + // Save game_data bump on first creation (init_if_needed). See init_player.rs + // for the same pattern. + let game_data_bump = context.bumps.game_data; + let account: &mut ChopTreeAccountConstraints<'_> = context.accounts; + account.player.update_energy()?; + account.player.print()?; + + if account.player.energy < amount { + return err!(GameErrorCode::NotEnoughEnergy); + } + + account.player.last_id = counter; + account.player.chop_tree(amount)?; + account.game_data.on_tree_chopped(amount)?; + if account.game_data.bump == 0 { + account.game_data.bump = game_data_bump; + } + + msg!( + "You chopped a tree and got 1 wood. You have {} wood and {} energy left.", + context.accounts.player.wood, + context.accounts.player.energy + ); + + // We use a PDA as a mint authority for the metadata account because we want to be able to update the NFT from + // the program. + let seeds = b"nft_authority"; + let bump = context.bumps.nft_authority; + let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]]; + + // Update the metadata account with an additional metadata field in this case the player level + invoke_signed( + &spl_token_metadata_interface::instruction::update_field( + &spl_token_2022::id(), + context.accounts.mint.to_account_info().key, + context.accounts.nft_authority.to_account_info().key, + spl_token_metadata_interface::state::Field::Key("wood".to_string()), + context.accounts.player.wood.to_string(), + ), + &[ + context.accounts.mint.to_account_info().clone(), + context.accounts.nft_authority.to_account_info().clone(), + ], + signer, + )?; + + Ok(()) +} + +#[derive(Accounts, Session)] +#[instruction(level_seed: String)] +pub struct ChopTreeAccountConstraints<'info> { + #[session( + // The ephemeral key pair signing the transaction + signer = signer, + // The authority of the user account which must have created the session + authority = player.authority.key() + )] + // Session Tokens are passed as optional accounts + pub session_token: Option>, + + // There is one PlayerData account + #[account( + mut, + seeds = [b"player".as_ref(), player.authority.key().as_ref()], + bump, + )] + pub player: Account<'info, PlayerData>, + + // There can be multiple levels the seed for the level is passed in the instruction + // First player starting a new level will pay for the account in the current setup + #[account( + init_if_needed, + payer = signer, + space = GameData::DISCRIMINATOR.len() + GameData::INIT_SPACE, + seeds = [level_seed.as_ref()], + bump, + )] + pub game_data: Account<'info, GameData>, + + #[account(mut)] + pub signer: Signer<'info>, + pub system_program: Program<'info, System>, + /// CHECK: Make sure the ata to the mint is actually owned by the signer + #[account(mut)] + pub mint: UncheckedAccount<'info>, + #[account( + init_if_needed, + seeds = [b"nft_authority".as_ref()], + bump, + space = NftAuthority::DISCRIMINATOR.len() + NftAuthority::INIT_SPACE, + payer = signer, + )] + pub nft_authority: Account<'info, NftAuthority>, + pub token_program: Program<'info, Token2022>, +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/init_player.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/init_player.rs new file mode 100644 index 000000000..c38c3ba64 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/init_player.rs @@ -0,0 +1,45 @@ +pub use crate::errors::GameErrorCode; +use crate::state::player_data::PlayerData; +use crate::{constants::MAX_ENERGY, GameData}; +use anchor_lang::prelude::*; + +pub fn handle_init_player(context: Context) -> Result<()> { + context.accounts.player.energy = MAX_ENERGY; + context.accounts.player.last_login = Clock::get()?.unix_timestamp; + context.accounts.player.authority = context.accounts.signer.key(); + context.accounts.player.bump = context.bumps.player; + // init_if_needed - only save bump if this is the first init. Subsequent + // calls reuse the existing account and must not overwrite the stored bump + // (they'd be equal anyway because PDA derivation is deterministic, but + // guarding keeps the intent crystal-clear). + if context.accounts.game_data.bump == 0 { + context.accounts.game_data.bump = context.bumps.game_data; + } + Ok(()) +} + +#[derive(Accounts)] +#[instruction(level_seed: String)] +pub struct InitPlayerAccountConstraints<'info> { + #[account( + init, + payer = signer, + space = PlayerData::DISCRIMINATOR.len() + PlayerData::INIT_SPACE, + seeds = [b"player".as_ref(), signer.key().as_ref()], + bump, + )] + pub player: Account<'info, PlayerData>, + + #[account( + init_if_needed, + payer = signer, + space = GameData::DISCRIMINATOR.len() + GameData::INIT_SPACE, + seeds = [level_seed.as_ref()], + bump, + )] + pub game_data: Account<'info, GameData>, + + #[account(mut)] + pub signer: Signer<'info>, + pub system_program: Program<'info, System>, +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mint_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mint_nft.rs new file mode 100644 index 000000000..22fa0c986 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mint_nft.rs @@ -0,0 +1,214 @@ +pub use crate::constants::TOKEN_METADATA_EXTENSION_SPACE; +pub use crate::errors::GameErrorCode; +pub use crate::state::game_data::GameData; +use anchor_lang::solana_program::program::{invoke, invoke_signed}; +use anchor_lang::{prelude::*, system_program}; +use anchor_spl::{ + associated_token::{self, AssociatedToken}, + token_2022, + token_2022_extensions::spl_token_metadata_interface, + token_interface::{ + spl_token_2022::{self, extension::ExtensionType, instruction::AuthorityType, state::Mint}, + Token2022, + }, +}; + +pub fn handle_mint_nft(context: Context) -> Result<()> { + msg!("Mint nft with meta data extension and additional meta data"); + + let space = + match ExtensionType::try_calculate_account_len::(&[ExtensionType::MetadataPointer]) { + Ok(space) => space, + Err(_) => { + return err!(GameErrorCode::InvalidMintAccountSpace); + } + }; + + // Space required for the inline SPL Token Metadata extension TLV. The + // metadata lives on the mint account itself (not a separate account) + // so we just over-allocate enough room at creation time. + let meta_data_space = TOKEN_METADATA_EXTENSION_SPACE; + + let lamports_required = Rent::get()?.minimum_balance(space + meta_data_space); + + msg!( + "Create Mint and metadata account size and cost: {} lamports: {}", + space as u64, + lamports_required + ); + + system_program::create_account( + CpiContext::new( + context.accounts.token_program.key(), + system_program::CreateAccount { + from: context.accounts.signer.to_account_info(), + to: context.accounts.mint.to_account_info(), + }, + ), + lamports_required, + space as u64, + &context.accounts.token_program.key(), + )?; + + // Assign the mint to the token program + system_program::assign( + CpiContext::new( + context.accounts.token_program.key(), + system_program::Assign { + account_to_assign: context.accounts.mint.to_account_info(), + }, + ), + &token_2022::ID, + )?; + + // Initialize the metadata pointer (Need to do this before initializing the mint) + let init_meta_data_pointer_ix = + match spl_token_2022::extension::metadata_pointer::instruction::initialize( + &Token2022::id(), + &context.accounts.mint.key(), + Some(context.accounts.nft_authority.key()), + Some(context.accounts.mint.key()), + ) { + Ok(ix) => ix, + Err(_) => { + return err!(GameErrorCode::CantInitializeMetadataPointer); + } + }; + + invoke( + &init_meta_data_pointer_ix, + &[ + context.accounts.mint.to_account_info(), + context.accounts.nft_authority.to_account_info(), + ], + )?; + + // Initialize the mint cpi + let mint_cpi_ix = CpiContext::new( + context.accounts.token_program.key(), + token_2022::InitializeMint2 { + mint: context.accounts.mint.to_account_info(), + }, + ); + + token_2022::initialize_mint2(mint_cpi_ix, 0, &context.accounts.nft_authority.key(), None) + .unwrap(); + + // We use a PDA as a mint authority for the metadata account because + // we want to be able to update the NFT from the program. + let seeds = b"nft_authority"; + let bump = context.bumps.nft_authority; + let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]]; + + msg!( + "Init metadata {0}", + context.accounts.nft_authority.to_account_info().key + ); + + // Init the metadata account + let init_token_meta_data_ix = &spl_token_metadata_interface::instruction::initialize( + &spl_token_2022::id(), + context.accounts.mint.key, + context.accounts.nft_authority.to_account_info().key, + context.accounts.mint.key, + context.accounts.nft_authority.to_account_info().key, + "Beaver".to_string(), + "BVA".to_string(), + "https://arweave.net/MHK3Iopy0GgvDoM7LkkiAdg7pQqExuuWvedApCnzfj0".to_string(), + ); + + invoke_signed( + init_token_meta_data_ix, + &[ + context.accounts.mint.to_account_info().clone(), + context.accounts.nft_authority.to_account_info().clone(), + ], + signer, + )?; + + // Update the metadata account with an additional metadata field in this case the player level + invoke_signed( + &spl_token_metadata_interface::instruction::update_field( + &spl_token_2022::id(), + context.accounts.mint.key, + context.accounts.nft_authority.to_account_info().key, + spl_token_metadata_interface::state::Field::Key("level".to_string()), + "1".to_string(), + ), + &[ + context.accounts.mint.to_account_info().clone(), + context.accounts.nft_authority.to_account_info().clone(), + ], + signer, + )?; + + // Create the associated token account + associated_token::create(CpiContext::new( + context.accounts.associated_token_program.key(), + associated_token::Create { + payer: context.accounts.signer.to_account_info(), + associated_token: context.accounts.token_account.to_account_info(), + authority: context.accounts.signer.to_account_info(), + mint: context.accounts.mint.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + token_program: context.accounts.token_program.to_account_info(), + }, + ))?; + + // Mint one token to the associated token account of the player + token_2022::mint_to( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + token_2022::MintTo { + mint: context.accounts.mint.to_account_info(), + to: context.accounts.token_account.to_account_info(), + authority: context.accounts.nft_authority.to_account_info(), + }, + signer, + ), + 1, + )?; + + // Freeze the mint authority so no more tokens can be minted to make it an NFT + token_2022::set_authority( + CpiContext::new_with_signer( + context.accounts.token_program.key(), + token_2022::SetAuthority { + current_authority: context.accounts.nft_authority.to_account_info(), + account_or_mint: context.accounts.mint.to_account_info(), + }, + signer, + ), + AuthorityType::MintTokens, + None, + )?; + + Ok(()) +} + +#[derive(Accounts)] +pub struct MintNftAccountConstraints<'info> { + #[account(mut)] + pub signer: Signer<'info>, + pub system_program: Program<'info, System>, + pub token_program: Program<'info, Token2022>, + /// CHECK: We will create this one for the user + #[account(mut)] + pub token_account: UncheckedAccount<'info>, + #[account(mut)] + pub mint: Signer<'info>, + pub rent: Sysvar<'info, Rent>, + pub associated_token_program: Program<'info, AssociatedToken>, + #[account( + init_if_needed, + seeds = [b"nft_authority".as_ref()], + bump, + space = NftAuthority::DISCRIMINATOR.len() + NftAuthority::INIT_SPACE, + payer = signer + )] + pub nft_authority: Account<'info, NftAuthority>, +} + +#[account] +#[derive(InitSpace)] +pub struct NftAuthority {} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mod.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mod.rs new file mode 100644 index 000000000..8c3f75b96 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/instructions/mod.rs @@ -0,0 +1,8 @@ +//! All instructions +pub mod chop_tree; +pub mod init_player; +pub mod mint_nft; + +pub use chop_tree::*; +pub use init_player::*; +pub use mint_nft::*; diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/lib.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/lib.rs new file mode 100644 index 000000000..6d513f1bc --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/lib.rs @@ -0,0 +1,49 @@ +// The Anchor `#[program]` macro expands to code that clippy flags as a +// diverging sub-expression; this allow is the accepted workaround in this repo. +#![allow(clippy::diverging_sub_expression)] + +pub use crate::errors::GameErrorCode; +pub use anchor_lang::prelude::*; +pub use session_keys::{session_auth_or, Session, SessionError}; +pub mod constants; +pub mod errors; +pub mod instructions; +pub mod state; +use instructions::*; + +// WARNING: This example depends on the `session-keys` crate, which has not +// been independently audited. It is included here purely for educational +// purposes - demonstrating how a game might let a player sign with a +// short-lived session token instead of their main wallet. Do not ship this +// crate (or this program) to mainnet in its current form: review the upstream +// `session-keys` source, get an audit, and harden the session-token issuance +// and expiry handling first. +declare_id!("9aZZ7TJ2fQZxY8hMtWXywp5y6BgqC4N2BPcr9FDT47sW"); + +#[program] +pub mod extension_nft { + use super::*; + + pub fn init_player(context: Context, _level_seed: String) -> Result<()> { + init_player::handle_init_player(context) + } + + // This function lets the player chop a tree and get 1 wood. The session_auth_or macro + // lets the player either use their session token or their main wallet. (The counter is only + // there so that the player can do multiple transactions in the same block. Without it multiple transactions + // in the same block would result in the same signature and therefore fail.) + // NOTE: the `#[session_auth_or]` macro injects code that refers to the + // context binding by the literal name `ctx`, so this handler's context + // parameter must be named `ctx` (not `context`) for the macro to expand. + #[session_auth_or( + ctx.accounts.player.authority.key() == ctx.accounts.signer.key(), + GameErrorCode::WrongAuthority + )] + pub fn chop_tree(ctx: Context, _level_seed: String, counter: u16) -> Result<()> { + chop_tree::chop_tree(ctx, counter, 1) + } + + pub fn mint_nft(context: Context) -> Result<()> { + mint_nft::handle_mint_nft(context) + } +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/game_data.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/game_data.rs new file mode 100644 index 000000000..03174be68 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/game_data.rs @@ -0,0 +1,32 @@ +use anchor_lang::prelude::*; + +use crate::constants::MAX_WOOD_PER_TREE; + +#[account] +#[derive(InitSpace)] +pub struct GameData { + pub total_wood_collected: u64, + /// Canonical bump for this PDA. + pub bump: u8, +} + +impl GameData { + pub fn on_tree_chopped(&mut self, amount_chopped: u64) -> Result<()> { + match self.total_wood_collected.checked_add(amount_chopped) { + Some(v) => { + if self.total_wood_collected >= MAX_WOOD_PER_TREE { + self.total_wood_collected = 0; + msg!("Tree successfully chopped. New Tree coming up."); + } else { + self.total_wood_collected = v; + msg!("Total wood chopped: {}", v); + } + } + None => { + msg!("The ever tree is completly chopped!"); + } + }; + + Ok(()) + } +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/mod.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/mod.rs new file mode 100644 index 000000000..29696d075 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/mod.rs @@ -0,0 +1,2 @@ +pub mod game_data; +pub mod player_data; diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/player_data.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/player_data.rs new file mode 100644 index 000000000..90c6fa64c --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/src/state/player_data.rs @@ -0,0 +1,79 @@ +use crate::constants::*; +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct PlayerData { + pub authority: Pubkey, + /// Player name. Capped at 32 bytes - a conservative upper bound for + /// display names; bump `#[max_len]` if you need room for emoji-heavy + /// or international names (each non-ASCII codepoint costs up to 4 bytes). + #[max_len(32)] + pub name: String, + pub level: u8, + pub xp: u64, + pub wood: u64, + pub energy: u64, + pub last_login: i64, + pub last_id: u16, + /// Canonical bump for this PDA. + pub bump: u8, +} + +impl PlayerData { + pub fn print(&mut self) -> Result<()> { + // Note that logging costs a lot of compute. So don't use it too much. + msg!( + "Authority: {} Wood: {} Energy: {}", + self.authority, + self.wood, + self.energy + ); + Ok(()) + } + + pub fn update_energy(&mut self) -> Result<()> { + // Get the current timestamp + let current_timestamp = Clock::get()?.unix_timestamp; + + // Calculate the time passed since the last login + let mut time_passed: i64 = current_timestamp - self.last_login; + + // Calculate the time spent refilling energy + let mut time_spent = 0; + + while time_passed >= TIME_TO_REFILL_ENERGY && self.energy < MAX_ENERGY { + self.energy += 1; + time_passed -= TIME_TO_REFILL_ENERGY; + time_spent += TIME_TO_REFILL_ENERGY; + } + + if self.energy >= MAX_ENERGY { + self.last_login = current_timestamp; + } else { + self.last_login += time_spent; + } + + Ok(()) + } + + pub fn chop_tree(&mut self, amount: u64) -> Result<()> { + match self.wood.checked_add(amount) { + Some(v) => { + self.wood = v; + } + None => { + msg!("Total wood reached!"); + } + }; + match self.energy.checked_sub(amount) { + Some(v) => { + self.energy = v; + } + None => { + self.energy = 0; + } + }; + Ok(()) + } +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/tests/test_extension_nft.rs b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/tests/test_extension_nft.rs new file mode 100644 index 000000000..74a58e906 --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/programs/extension_nft/tests/test_extension_nft.rs @@ -0,0 +1,225 @@ +//! LiteSVM integration test for the `extension_nft` "chop tree" game program. +//! +//! It drives the full happy path against an in-memory validator: +//! 1. `init_player` - create the player + game-data PDAs. +//! 2. `mint_nft` - mint a Token Extensions NFT that carries its metadata inline via +//! the metadata-pointer + token-metadata extensions. +//! 3. `chop_tree` - gain wood/lose energy and push the new wood total into the +//! NFT metadata as an additional field. +//! +//! The session-keys lesson (`#[session_auth_or]`) is exercised through its +//! *fallback* branch: `chop_tree` is signed directly by the player's main +//! wallet with `session_token = None`, so the macro checks +//! `player.authority == signer`. This keeps the test self-contained - it does +//! not need the onchain session-keys program as a fixture, because the program +//! never CPIs into it (the session token is only ever read as an account). +//! +//! IMPORTANT: CI runs `anchor keys sync` before building, which rewrites the +//! program's `declare_id!`. We therefore reference the id via `extension_nft::ID` +//! (the crate constant) rather than a hardcoded literal, so the test keeps +//! working after the id is regenerated. + +use { + anchor_lang::{ + prelude::Pubkey, solana_program::system_program, InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_instruction::Instruction, + solana_keypair::Keypair, + solana_kite::{create_wallet, get_pda_and_bump, send_transaction_from_instructions, Seed}, + solana_signer::Signer, +}; + +// Token Extensions and Associated-Token-Account program ids (the modern, fixed +// onchain addresses bundled by LiteSVM). +const TOKEN_2022_ID: Pubkey = Pubkey::from_str_const("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +const ASSOCIATED_TOKEN_ID: Pubkey = + Pubkey::from_str_const("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); +const RENT_SYSVAR_ID: Pubkey = + Pubkey::from_str_const("SysvarRent111111111111111111111111111111111"); + +const LEVEL_SEED: &str = "level1"; + +fn setup() -> (LiteSVM, Pubkey) { + let program_id = extension_nft::ID; + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/extension_nft.so"); + svm.add_program(program_id, bytes).unwrap(); + (svm, program_id) +} + +/// Derive the player PDA: seeds = [b"player", authority]. +fn player_pda(program_id: &Pubkey, authority: &Pubkey) -> Pubkey { + get_pda_and_bump( + &[Seed::from(b"player".as_ref()), Seed::from(*authority)], + program_id, + ) + .0 +} + +/// Derive the game-data PDA: seeds = [level_seed]. +fn game_data_pda(program_id: &Pubkey, level_seed: &str) -> Pubkey { + get_pda_and_bump(&[Seed::from(level_seed)], program_id).0 +} + +/// Derive the NFT-authority PDA: seeds = [b"nft_authority"]. +fn nft_authority_pda(program_id: &Pubkey) -> Pubkey { + get_pda_and_bump(&[Seed::from(b"nft_authority".as_ref())], program_id).0 +} + +/// Derive the associated token account for (wallet, mint) under Token Extensions. +fn associated_token_address(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[wallet.as_ref(), TOKEN_2022_ID.as_ref(), mint.as_ref()], + &ASSOCIATED_TOKEN_ID, + ) + .0 +} + +fn init_player_ix(program_id: &Pubkey, signer: &Pubkey) -> Instruction { + Instruction { + program_id: *program_id, + accounts: extension_nft::accounts::InitPlayerAccountConstraints { + player: player_pda(program_id, signer), + game_data: game_data_pda(program_id, LEVEL_SEED), + signer: *signer, + system_program: system_program::id(), + } + .to_account_metas(None), + data: extension_nft::instruction::InitPlayer { + _level_seed: LEVEL_SEED.to_string(), + } + .data(), + } +} + +fn mint_nft_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey) -> Instruction { + Instruction { + program_id: *program_id, + accounts: extension_nft::accounts::MintNftAccountConstraints { + signer: *signer, + system_program: system_program::id(), + token_program: TOKEN_2022_ID, + token_account: associated_token_address(signer, mint), + mint: *mint, + rent: RENT_SYSVAR_ID, + associated_token_program: ASSOCIATED_TOKEN_ID, + nft_authority: nft_authority_pda(program_id), + } + .to_account_metas(None), + data: extension_nft::instruction::MintNft {}.data(), + } +} + +fn chop_tree_ix(program_id: &Pubkey, signer: &Pubkey, mint: &Pubkey, counter: u16) -> Instruction { + Instruction { + program_id: *program_id, + accounts: extension_nft::accounts::ChopTreeAccountConstraints { + // session_token is optional; pass None -> the macro falls back to + // the main-wallet authority check. + session_token: None, + player: player_pda(program_id, signer), + game_data: game_data_pda(program_id, LEVEL_SEED), + signer: *signer, + system_program: system_program::id(), + mint: *mint, + nft_authority: nft_authority_pda(program_id), + token_program: TOKEN_2022_ID, + } + .to_account_metas(None), + data: extension_nft::instruction::ChopTree { + _level_seed: LEVEL_SEED.to_string(), + counter, + } + .data(), + } +} + +/// Decode the borsh `PlayerData` account (after the 8-byte discriminator). +struct Player { + wood: u64, + energy: u64, +} + +fn fetch_player(svm: &LiteSVM, player: &Pubkey) -> Player { + use anchor_lang::AnchorDeserialize; + let account = svm.get_account(player).expect("player account exists"); + // Skip the 8-byte Anchor discriminator. + let mut data = &account.data[8..]; + // PlayerData layout: authority(32) name(4+len) level(1) xp(8) wood(8) + // energy(8) last_login(8) last_id(2) bump(1). + let _authority = <[u8; 32]>::deserialize(&mut data).unwrap(); + let _name = String::deserialize(&mut data).unwrap(); + let _level = u8::deserialize(&mut data).unwrap(); + let _xp = u64::deserialize(&mut data).unwrap(); + let wood = u64::deserialize(&mut data).unwrap(); + let energy = u64::deserialize(&mut data).unwrap(); + Player { wood, energy } +} + +#[test] +fn test_init_player_mint_and_chop() { + let (mut svm, program_id) = setup(); + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + let signer = payer.pubkey(); + + // 1. init_player + send_transaction_from_instructions( + &mut svm, + vec![init_player_ix(&program_id, &signer)], + &[&payer], + &signer, + ) + .expect("init_player should succeed"); + + let player_addr = player_pda(&program_id, &signer); + let player = fetch_player(&svm, &player_addr); + assert_eq!(player.wood, 0, "fresh player starts with no wood"); + assert_eq!( + player.energy, 100, + "fresh player starts at max energy (100)" + ); + + // 2. mint_nft - the mint account is a fresh keypair (it's a Signer in the + // instruction because the program creates it via a system CPI). + let mint = Keypair::new(); + send_transaction_from_instructions( + &mut svm, + vec![mint_nft_ix(&program_id, &signer, &mint.pubkey())], + &[&payer, &mint], + &signer, + ) + .expect("mint_nft should succeed"); + + // The mint account is now owned by the Token Extensions program and holds the + // inline metadata extension, so it is comfortably larger than a bare mint. + let mint_account = svm.get_account(&mint.pubkey()).expect("mint exists"); + assert_eq!( + mint_account.owner, TOKEN_2022_ID, + "mint owned by Token Extensions" + ); + assert!( + mint_account.data.len() > 82, + "mint carries extension data (got {} bytes)", + mint_account.data.len() + ); + + // The associated token account should exist and hold the single NFT. + let ata = associated_token_address(&signer, &mint.pubkey()); + let ata_account = svm.get_account(&ata).expect("ATA created"); + assert_eq!(ata_account.owner, TOKEN_2022_ID, "ATA owned by Token Extensions"); + + // 3. chop_tree - needs the existing mint so it can push the new wood total + // into the NFT metadata. Signed by the player's main wallet (no session). + send_transaction_from_instructions( + &mut svm, + vec![chop_tree_ix(&program_id, &signer, &mint.pubkey(), 1)], + &[&payer], + &signer, + ) + .expect("chop_tree should succeed"); + + let player = fetch_player(&svm, &player_addr); + assert_eq!(player.wood, 1, "player gained 1 wood from chopping"); + assert_eq!(player.energy, 99, "player spent 1 energy chopping"); +} diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/rustfmt.toml b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/rustfmt.toml new file mode 100644 index 000000000..a4870d20f --- /dev/null +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor-v1/rustfmt.toml @@ -0,0 +1,11 @@ +comment_width = 80 +edition = "2021" +format_code_in_doc_comments = true +format_strings = true +group_imports = "One" +ignore = [ + "**/*/entrypoint.rs" +] +imports_granularity = "One" +use_field_init_shorthand = true +wrap_comments = true \ No newline at end of file diff --git a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/README.md b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/README.md index 9f15c62b3..dda4c04e7 100644 --- a/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/README.md +++ b/tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor/README.md @@ -1,5 +1,11 @@ # Anchor Program +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + ```bash anchor build anchor deploy diff --git a/tokens/token-extensions/non-transferable/anchor-v1/.gitignore b/tokens/token-extensions/non-transferable/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/non-transferable/anchor-v1/.prettierignore b/tokens/token-extensions/non-transferable/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/non-transferable/anchor-v1/Anchor.toml b/tokens/token-extensions/non-transferable/anchor-v1/Anchor.toml new file mode 100644 index 000000000..074b3bb08 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +non_transferable = "8Bz4wpHaUckiC169Rg5ZfaBHFemp5S8RwTSDTKzhJ9W" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/non-transferable/anchor-v1/Cargo.toml b/tokens/token-extensions/non-transferable/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/non-transferable/anchor-v1/README.md b/tokens/token-extensions/non-transferable/anchor-v1/README.md new file mode 100644 index 000000000..b1f4d51f7 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/README.md @@ -0,0 +1,39 @@ +# Token Extensions - Non-Transferable (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Create tokens that cannot be transferred between accounts. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Non-transferable extension + +## Setup + +From this directory (`tokens/token-extensions/non-transferable/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Cargo.toml b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Cargo.toml new file mode 100644 index 000000000..fb874ec2c --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "non-transferable" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "non_transferable" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" diff --git a/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Xargo.toml b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/src/lib.rs b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/src/lib.rs new file mode 100644 index 000000000..6e3447b08 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/src/lib.rs @@ -0,0 +1,77 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; +use anchor_spl::{ + token_2022::{ + initialize_mint2, + spl_token_2022::{extension::ExtensionType, pod::PodMint}, + InitializeMint2, + }, + token_interface::{non_transferable_mint_initialize, NonTransferableMintInitialize, Token2022}, +}; + +declare_id!("8Bz4wpHaUckiC169Rg5ZfaBHFemp5S8RwTSDTKzhJ9W"); + +#[program] +pub mod non_transferable { + use super::*; + + // There is currently not an anchor constraint to automatically initialize the NonTransferable extension + // We can manually create and initialize the mint account via CPIs in the instruction handler + pub fn initialize(context: Context) -> Result<()> { + // Calculate space required for mint and extension data + let mint_size = + ExtensionType::try_calculate_account_len::(&[ExtensionType::NonTransferable])?; + + // Calculate minimum lamports required for size of mint account with extensions + let lamports = (Rent::get()?).minimum_balance(mint_size); + + // Invoke System Program to create new account with space for mint and extension data + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.mint_account.to_account_info(), + }, + ), + lamports, // Lamports + mint_size as u64, // Space + &context.accounts.token_program.key(), // Owner Program + )?; + + // Initialize the NonTransferable extension + // This instruction must come before the instruction to initialize the mint data + non_transferable_mint_initialize(CpiContext::new( + context.accounts.token_program.key(), + NonTransferableMintInitialize { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + }, + ))?; + + // Initialize the standard mint account data + initialize_mint2( + CpiContext::new( + context.accounts.token_program.key(), + InitializeMint2 { + mint: context.accounts.mint_account.to_account_info(), + }, + ), + 2, // decimals + &context.accounts.payer.key(), // mint authority + Some(&context.accounts.payer.key()), // freeze authority + )?; + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub mint_account: Signer<'info>, + + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} diff --git a/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/tests/test_non_transferable.rs b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/tests/test_non_transferable.rs new file mode 100644 index 000000000..65f05d6a1 --- /dev/null +++ b/tokens/token-extensions/non-transferable/anchor-v1/programs/non-transferable/tests/test_non_transferable.rs @@ -0,0 +1,107 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, get_token_extensions_account_address, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = non_transferable::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/non_transferable.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_non_transferable_mint_and_attempt_transfer() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Create mint with NonTransferable extension via our program + let initialize_ix = Instruction::new_with_bytes( + program_id, + &non_transferable::instruction::Initialize {}.data(), + non_transferable::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify mint account was created and has extension data + let mint_data = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!( + mint_data.data.len() > 82, + "Mint should have extension data (size > 82, got {})", + mint_data.data.len() + ); + + // Step 2: Create ATAs for sender and recipient + let recipient = Keypair::new(); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Mint 1 token to sender + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &source_ata, + 1, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 4: Attempt transfer - should fail because mint is NonTransferable + let result = transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint_keypair.pubkey(), + &dest_ata, + &payer, + 1, + 2, // decimals + &[], + ); + assert!( + result.is_err(), + "Transfer should fail because the mint is non-transferable" + ); +} diff --git a/tokens/token-extensions/non-transferable/anchor/README.md b/tokens/token-extensions/non-transferable/anchor/README.md index b849e708c..6f6fb021e 100644 --- a/tokens/token-extensions/non-transferable/anchor/README.md +++ b/tokens/token-extensions/non-transferable/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Non-Transferable (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Create tokens that cannot be transferred between accounts. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/.gitignore b/tokens/token-extensions/permanent-delegate/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/.prettierignore b/tokens/token-extensions/permanent-delegate/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/Anchor.toml b/tokens/token-extensions/permanent-delegate/anchor-v1/Anchor.toml new file mode 100644 index 000000000..3c76e2ed4 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +permanent_delegate = "A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/Cargo.toml b/tokens/token-extensions/permanent-delegate/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/README.md b/tokens/token-extensions/permanent-delegate/anchor-v1/README.md new file mode 100644 index 000000000..be28152d9 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/README.md @@ -0,0 +1,39 @@ +# Token Extensions - Permanent Delegate (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Keep a permanent delegate with transfer rights over all token accounts for the mint. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Permanent delegate extension + +## Setup + +From this directory (`tokens/token-extensions/permanent-delegate/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Cargo.toml b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Cargo.toml new file mode 100644 index 000000000..4872f4272 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "permanent-delegate" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "permanent_delegate" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Xargo.toml b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/initialize.rs b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/initialize.rs new file mode 100644 index 000000000..0879e5e51 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/initialize.rs @@ -0,0 +1,50 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + token_2022::spl_token_2022::extension::permanent_delegate::PermanentDelegate, + token_interface::{ + spl_pod::optional_keys::OptionalNonZeroPubkey, + spl_token_2022::{ + extension::{BaseStateWithExtensions, StateWithExtensions}, + state::Mint as MintState, + }, + Mint, Token2022, + }, +}; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::decimals = 2, + mint::authority = payer, + extensions::permanent_delegate::delegate = payer, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +// helper to check mint data, and demonstrate how to read mint extension data within a program +fn check_mint_data(accounts: &mut InitializeAccountConstraints) -> Result<()> { + let mint = &accounts.mint_account.to_account_info(); + let mint_data = mint.data.borrow(); + let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; + let extension_data = mint_with_extension.get_extension::()?; + + assert_eq!( + extension_data.delegate, + OptionalNonZeroPubkey::try_from(Some(accounts.payer.key()))? + ); + + msg!("{:?}", extension_data); + Ok(()) +} + +pub fn handler(mut context: Context) -> Result<()> { + check_mint_data(&mut context.accounts)?; + Ok(()) +} diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/mod.rs b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/mod.rs new file mode 100644 index 000000000..b5a1d3129 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/instructions/mod.rs @@ -0,0 +1,3 @@ +pub mod initialize; + +pub use initialize::*; diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/lib.rs b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/lib.rs new file mode 100644 index 000000000..5c2005fa0 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/src/lib.rs @@ -0,0 +1,15 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1"); + +#[program] +pub mod permanent_delegate { + use super::*; + + pub fn initialize(context: Context) -> Result<()> { + instructions::initialize::handler(context) + } +} diff --git a/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/tests/test_permanent_delegate.rs b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/tests/test_permanent_delegate.rs new file mode 100644 index 000000000..034ac53f7 --- /dev/null +++ b/tokens/token-extensions/permanent-delegate/anchor-v1/programs/permanent-delegate/tests/test_permanent_delegate.rs @@ -0,0 +1,134 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + mint_tokens_to_token_extensions_account, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = permanent_delegate::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/permanent_delegate.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +/// Create a Token Extensions token account (CreateAccount + InitializeAccount3). +/// This creates a non-ATA token account with explicit keypair, which kite doesn't provide. +fn create_token_account_instructions( + payer: &Pubkey, + account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let space: u64 = 200; + let lamports: u64 = 3_000_000; + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, account, lamports, space, &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + // InitializeAccount3 (instruction 18): [18, owner(32)] + let mut init_data = vec![18u8]; + init_data.extend_from_slice(owner.as_ref()); + let init_account_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*account, false), + AccountMeta::new_readonly(*mint, false), + ], + data: init_data, + }; + vec![create_account_ix, init_account_ix] +} + +/// BurnChecked instruction for Token Extensions (instruction 15). +fn burn_checked_ix( + account: &Pubkey, + mint: &Pubkey, + authority: &Pubkey, + amount: u64, + decimals: u8, +) -> Instruction { + let mut data = vec![15u8]; + data.extend_from_slice(&amount.to_le_bytes()); + data.push(decimals); + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*account, false), + AccountMeta::new(*mint, false), + AccountMeta::new_readonly(*authority, true), + ], + data, + } +} + +#[test] +fn test_create_mint_with_permanent_delegate_and_burn() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Create mint with PermanentDelegate extension via program + let initialize_ix = Instruction::new_with_bytes( + program_id, + &permanent_delegate::instruction::Initialize {}.data(), + permanent_delegate::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create a token account owned by a random keypair + let random_owner = Keypair::new(); + let token_account = Keypair::new(); + let create_ata_ixs = create_token_account_instructions( + &payer.pubkey(), + &token_account.pubkey(), + &mint_keypair.pubkey(), + &random_owner.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_ata_ixs, &[&payer, &token_account], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 3: Mint 100 tokens to the token account + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &token_account.pubkey(), + 100, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 4: Burn all 100 tokens using the permanent delegate (payer) + let burn_ix = burn_checked_ix( + &token_account.pubkey(), + &mint_keypair.pubkey(), + &payer.pubkey(), + 100, + 2, // decimals + ); + send_transaction_from_instructions(&mut svm, vec![burn_ix], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance(&svm, &token_account.pubkey(), 0, "Token account balance should be 0 after burn"); +} diff --git a/tokens/token-extensions/permanent-delegate/anchor/README.md b/tokens/token-extensions/permanent-delegate/anchor/README.md index 61ef190bb..30d794c84 100644 --- a/tokens/token-extensions/permanent-delegate/anchor/README.md +++ b/tokens/token-extensions/permanent-delegate/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Permanent Delegate (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Keep a permanent delegate with transfer rights over all token accounts for the mint. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/.gitignore b/tokens/token-extensions/transfer-fee/anchor-v1/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-fee/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-fee/anchor-v1/Anchor.toml new file mode 100644 index 000000000..2dd47df15 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_fee = "4evptdGtALCNT8uTxJhbWBRZpBE8w5oNtmgfSyfQu7td" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-fee/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/README.md b/tokens/token-extensions/transfer-fee/anchor-v1/README.md new file mode 100644 index 000000000..01993ac6e --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Token Extensions - Transfer Fee (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Charge a fee on each transfer configured at the mint level. + +See also: the [repository catalog](../../../../README.md). + +## Major concepts + +- Transfer fee extension +- Fee withheld on transfer + +## Setup + +From this directory (`tokens/token-extensions/transfer-fee/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Cargo.toml b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Cargo.toml new file mode 100644 index 000000000..8de99e42a --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "transfer-fee" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_fee" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Xargo.toml b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/harvest.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/harvest.rs new file mode 100644 index 000000000..870e29474 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/harvest.rs @@ -0,0 +1,40 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + harvest_withheld_tokens_to_mint, HarvestWithheldTokensToMint, Mint, Token2022, TokenAccount, +}; + +#[derive(Accounts)] +pub struct HarvestAccountConstraints<'info> { + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, +} + +// transfer fees are stored directly on the recipient token account and must be "harvested" +// "harvesting" transfers fees accumulated on token accounts to the mint account +pub fn process_harvest<'info>(context: Context<'info, HarvestAccountConstraints<'info>>) -> Result<()> { + // Using remaining accounts to allow for passing in an unknown number of token accounts to harvest from + // Check that remaining accounts are token accounts for the mint to harvest to + let sources = context + .remaining_accounts + .iter() + .filter_map(|account| { + InterfaceAccount::::try_from(account) + .ok() + .filter(|token_account| token_account.mint == context.accounts.mint_account.key()) + .map(|_| account.to_account_info()) + }) + .collect::>(); + + harvest_withheld_tokens_to_mint( + CpiContext::new( + context.accounts.token_program.key(), + HarvestWithheldTokensToMint { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + }, + ), + sources, // token accounts to harvest from + )?; + Ok(()) +} diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/initialize.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/initialize.rs new file mode 100644 index 000000000..1ce456378 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/initialize.rs @@ -0,0 +1,114 @@ +use anchor_lang::prelude::*; +use anchor_lang::system_program::{create_account, CreateAccount}; +use anchor_spl::{ + token_2022::{ + initialize_mint2, + spl_token_2022::{ + extension::{ + transfer_fee::TransferFeeConfig, BaseStateWithExtensions, ExtensionType, + StateWithExtensions, + }, + pod::PodMint, + state::Mint as MintState, + }, + InitializeMint2, + }, + token_interface::{ + spl_pod::optional_keys::OptionalNonZeroPubkey, transfer_fee_initialize, Token2022, + TransferFeeInitialize, + }, +}; + +#[derive(Accounts)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + #[account(mut)] + pub mint_account: Signer<'info>, + + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +// There is currently not an anchor constraint to automatically initialize the TransferFeeConfig extension +// We can manually create and initialize the mint account via CPIs in the instruction handler +pub fn handle_process_initialize( + context: Context, + transfer_fee_basis_points: u16, + maximum_fee: u64, +) -> Result<()> { + // Calculate space required for mint and extension data + let mint_size = + ExtensionType::try_calculate_account_len::(&[ExtensionType::TransferFeeConfig])?; + + // Calculate minimum lamports required for size of mint account with extensions + let lamports = (Rent::get()?).minimum_balance(mint_size); + + // Invoke System Program to create new account with space for mint and extension data + create_account( + CpiContext::new( + context.accounts.system_program.key(), + CreateAccount { + from: context.accounts.payer.to_account_info(), + to: context.accounts.mint_account.to_account_info(), + }, + ), + lamports, // Lamports + mint_size as u64, // Space + &context.accounts.token_program.key(), // Owner Program + )?; + + // Initialize the transfer fee extension data + // This instruction must come before the instruction to initialize the mint data + transfer_fee_initialize( + CpiContext::new( + context.accounts.token_program.key(), + TransferFeeInitialize { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + }, + ), + Some(&context.accounts.payer.key()), // transfer fee config authority (update fee) + Some(&context.accounts.payer.key()), // withdraw authority (withdraw fees) + transfer_fee_basis_points, // transfer fee basis points (% fee per transfer) + maximum_fee, // maximum fee (maximum units of token per transfer) + )?; + + // Initialize the standard mint account data + initialize_mint2( + CpiContext::new( + context.accounts.token_program.key(), + InitializeMint2 { + mint: context.accounts.mint_account.to_account_info(), + }, + ), + 2, // decimals + &context.accounts.payer.key(), // mint authority + Some(&context.accounts.payer.key()), // freeze authority + )?; + + handle_check_mint_data(&context.accounts)?; + Ok(()) +} + +// helper to demonstrate how to read mint extension data within a program +pub fn handle_check_mint_data(accounts: &InitializeAccountConstraints) -> Result<()> { + let mint = &accounts.mint_account.to_account_info(); + let mint_data = mint.data.borrow(); + let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; + let extension_data = mint_with_extension.get_extension::()?; + + assert_eq!( + extension_data.transfer_fee_config_authority, + OptionalNonZeroPubkey::try_from(Some(accounts.payer.key()))? + ); + + assert_eq!( + extension_data.withdraw_withheld_authority, + OptionalNonZeroPubkey::try_from(Some(accounts.payer.key()))? + ); + + msg!("{:?}", extension_data); + Ok(()) +} + diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/mod.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/mod.rs new file mode 100644 index 000000000..82bf4dbed --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/mod.rs @@ -0,0 +1,10 @@ +pub mod transfer; +pub use transfer::*; +pub mod initialize; +pub use initialize::*; +pub mod harvest; +pub use harvest::*; +pub mod withdraw; +pub use withdraw::*; +pub mod update_fee; +pub use update_fee::*; diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/transfer.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/transfer.rs new file mode 100644 index 000000000..20846e2e7 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/transfer.rs @@ -0,0 +1,80 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_2022::spl_token_2022::{ + extension::{ + transfer_fee::TransferFeeConfig, BaseStateWithExtensions, StateWithExtensions, + }, + state::Mint as MintState, + }, + token_interface::{ + transfer_checked_with_fee, Mint, Token2022, TokenAccount, TransferCheckedWithFee, + }, +}; + +#[derive(Accounts)] +pub struct TransferAccountConstraints<'info> { + #[account(mut)] + pub sender: Signer<'info>, + pub recipient: SystemAccount<'info>, + + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + #[account( + mut, + associated_token::mint = mint_account, + associated_token::authority = sender, + associated_token::token_program = token_program + )] + pub sender_token_account: InterfaceAccount<'info, TokenAccount>, + #[account( + init_if_needed, + payer = sender, + associated_token::mint = mint_account, + associated_token::authority = recipient, + associated_token::token_program = token_program + )] + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + pub token_program: Program<'info, Token2022>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +// transfer fees are automatically deducted from the transfer amount +// recipients receives (transfer amount - fees) +// transfer fees are stored directly on the recipient token account and must be "harvested" +pub fn handle_process_transfer(context: Context, amount: u64) -> Result<()> { + // read mint account extension data + let mint = &context.accounts.mint_account.to_account_info(); + let mint_data = mint.data.borrow(); + let mint_with_extension = StateWithExtensions::::unpack(&mint_data)?; + let extension_data = mint_with_extension.get_extension::()?; + + // calculate expected fee + let epoch = Clock::get()?.epoch; + let fee = extension_data.calculate_epoch_fee(epoch, amount).unwrap(); + + // mint account decimals + let decimals = context.accounts.mint_account.decimals; + + transfer_checked_with_fee( + CpiContext::new( + context.accounts.token_program.key(), + TransferCheckedWithFee { + token_program_id: context.accounts.token_program.to_account_info(), + source: context.accounts.sender_token_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + destination: context.accounts.recipient_token_account.to_account_info(), + authority: context.accounts.sender.to_account_info(), + }, + ), + amount, // transfer amount + decimals, // decimals + fee, // fee + )?; + + msg!("transfer amount {}", amount); + msg!("fee amount {}", fee); + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/update_fee.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/update_fee.rs new file mode 100644 index 000000000..da0646bb5 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/update_fee.rs @@ -0,0 +1,34 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{transfer_fee_set, Mint, Token2022, TransferFeeSetTransferFee}; + +#[derive(Accounts)] +pub struct UpdateFeeAccountConstraints<'info> { + pub authority: Signer<'info>, + + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, +} + +// Note that there is a 2 epoch delay from when new fee updates take effect +// This is a safely feature built into the extension +// https://github.com/solana-program/token-2022/blob/2d18d97f083627d3f13ce43b16fa4305cbfac4de/program/src/extension/transfer_fee/processor.rs#L92-L109 +pub fn handle_process_update_fee( + context: Context, + transfer_fee_basis_points: u16, + maximum_fee: u64, +) -> Result<()> { + transfer_fee_set( + CpiContext::new( + context.accounts.token_program.key(), + TransferFeeSetTransferFee { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + authority: context.accounts.authority.to_account_info(), + }, + ), + transfer_fee_basis_points, // transfer fee basis points (% fee per transfer) + maximum_fee, // maximum fee (maximum units of token per transfer) + )?; + Ok(()) +} diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/withdraw.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/withdraw.rs new file mode 100644 index 000000000..ba9fb6659 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/instructions/withdraw.rs @@ -0,0 +1,31 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + withdraw_withheld_tokens_from_mint, Mint, Token2022, TokenAccount, + WithdrawWithheldTokensFromMint, +}; + +#[derive(Accounts)] +pub struct WithdrawAccountConstraints<'info> { + pub authority: Signer<'info>, + + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + #[account(mut)] + pub token_account: InterfaceAccount<'info, TokenAccount>, + pub token_program: Program<'info, Token2022>, +} + +// transfer fees "harvested" to the mint account can then be withdraw by the withdraw authority +// this transfers fees on the mint account to the specified token account +pub fn handle_process_withdraw(context: Context) -> Result<()> { + withdraw_withheld_tokens_from_mint(CpiContext::new( + context.accounts.token_program.key(), + WithdrawWithheldTokensFromMint { + token_program_id: context.accounts.token_program.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + destination: context.accounts.token_account.to_account_info(), + authority: context.accounts.authority.to_account_info(), + }, + ))?; + Ok(()) +} diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/lib.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/lib.rs new file mode 100644 index 000000000..811385357 --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/src/lib.rs @@ -0,0 +1,39 @@ +use anchor_lang::prelude::*; + +mod instructions; +use instructions::*; + +declare_id!("4evptdGtALCNT8uTxJhbWBRZpBE8w5oNtmgfSyfQu7td"); + +#[program] +pub mod transfer_fee { + use super::*; + + pub fn initialize( + context: Context, + transfer_fee_basis_points: u16, + maximum_fee: u64, + ) -> Result<()> { + handle_process_initialize(context, transfer_fee_basis_points, maximum_fee) + } + + pub fn transfer(context: Context, amount: u64) -> Result<()> { + handle_process_transfer(context, amount) + } + + pub fn harvest<'info>(context: Context<'info, HarvestAccountConstraints<'info>>) -> Result<()> { + process_harvest(context) + } + + pub fn withdraw(context: Context) -> Result<()> { + handle_process_withdraw(context) + } + + pub fn update_fee( + context: Context, + transfer_fee_basis_points: u16, + maximum_fee: u64, + ) -> Result<()> { + handle_process_update_fee(context, transfer_fee_basis_points, maximum_fee) + } +} diff --git a/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/tests/test_transfer_fee.rs b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/tests/test_transfer_fee.rs new file mode 100644 index 000000000..087f1ae6d --- /dev/null +++ b/tokens/token-extensions/transfer-fee/anchor-v1/programs/transfer-fee/tests/test_transfer_fee.rs @@ -0,0 +1,172 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, get_token_extensions_account_address, + mint_tokens_to_token_extensions_account, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_fee::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_fee.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_fee_full_flow() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let recipient = Keypair::new(); + let ata_program = associated_token_program_id(); + + let sender_ata = get_token_extensions_account_address(&payer.pubkey(), &mint_keypair.pubkey()); + let recipient_ata = get_token_extensions_account_address(&recipient.pubkey(), &mint_keypair.pubkey()); + + // Step 1: Create mint with transfer fee (100 basis points = 1%, max fee = 1) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Initialize { + transfer_fee_basis_points: 100, + maximum_fee: 1, + } + .data(), + transfer_fee::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create sender ATA and mint 300 tokens + create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &sender_ata, + 300, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Transfer 100 tokens (fee = min(1% * 100 = 1, max_fee = 1) = 1) + let transfer_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Transfer { amount: 100 }.data(), + transfer_fee::accounts::TransferAccountConstraints { + sender: payer.pubkey(), + recipient: recipient.pubkey(), + mint_account: mint_keypair.pubkey(), + sender_token_account: sender_ata, + recipient_token_account: recipient_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: ata_program, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer 200 tokens (fee = min(1% * 200 = 2, max_fee = 1) = 1, capped by maximumFee) + let transfer_ix2 = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Transfer { amount: 200 }.data(), + transfer_fee::accounts::TransferAccountConstraints { + sender: payer.pubkey(), + recipient: recipient.pubkey(), + mint_account: mint_keypair.pubkey(), + sender_token_account: sender_ata, + recipient_token_account: recipient_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: ata_program, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![transfer_ix2], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Harvest transfer fees from recipient token account to mint + let harvest_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Harvest {}.data(), + { + let mut metas = transfer_fee::accounts::HarvestAccountConstraints { + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None); + metas.push(AccountMeta::new(recipient_ata, false)); + metas + }, + ); + send_transaction_from_instructions(&mut svm, vec![harvest_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 6: Withdraw harvested fees from mint to sender's token account + let withdraw_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Withdraw {}.data(), + transfer_fee::accounts::WithdrawAccountConstraints { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_account: sender_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![withdraw_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 7: Update transfer fee to 0 + let update_fee_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::UpdateFee { + transfer_fee_basis_points: 0, + maximum_fee: 0, + } + .data(), + transfer_fee::accounts::UpdateFeeAccountConstraints { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_fee_ix], &[&payer], &payer.pubkey()).unwrap(); +} diff --git a/tokens/token-extensions/transfer-fee/anchor/README.md b/tokens/token-extensions/transfer-fee/anchor/README.md index 4e5c38daa..9968442f4 100644 --- a/tokens/token-extensions/transfer-fee/anchor/README.md +++ b/tokens/token-extensions/transfer-fee/anchor/README.md @@ -1,5 +1,11 @@ # Token Extensions - Transfer Fee (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Charge a fee on each transfer configured at the mint level. See also: the [repository catalog](../../../../README.md). diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Anchor.toml new file mode 100644 index 000000000..060a1d43e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_hook = "1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/README.md new file mode 100644 index 000000000..fb7de0377 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/README.md @@ -0,0 +1,135 @@ +# Using Token Account Data as a Seed in a Transfer Hook + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Sometimes you want to use [account](https://solana.com/docs/terminology#account) data to derive additional accounts in the extra-account-metas. For example, you might want to use the [token account](https://solana.com/docs/terminology#token-account)'s owner as a seed for a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). + +When creating an `ExtraAccountMeta`, the data of any account can be used as an extra seed. In this example we derive a counter account from the token account owner and the literal `"counter"`. The counter records how many times that owner has transferred tokens. + +This is the setup in `extra_account_metas()`: + +```rust +// Define extra account metas to store on the extra_account_meta_list account +impl<'info> InitializeExtraAccountMetaList<'info> { + pub fn extra_account_metas() -> Result> { + Ok(vec![ExtraAccountMeta::new_with_seeds( + &[ + Seed::Literal { bytes: b"counter".to_vec() }, + Seed::AccountData { + account_index: 0, + data_index: 32, + length: 32, + }, + ], + false, // is_signer + true, // is_writable + )?]) + } +} +``` + +The token account layout is what makes `data_index: 32, length: 32` mean "the owner field". Bytes 0..32 are the [mint](https://solana.com/docs/terminology#token-mint) and bytes 32..64 are the owner: + +```rust +/// Token account data. +#[repr(C)] +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Account { + pub mint: Pubkey, + pub owner: Pubkey, + pub amount: u64, + pub delegate: COption, + pub state: AccountState, + pub is_native: COption, + pub delegated_amount: u64, + pub close_authority: COption, +} +``` + +`account_index: 0` means the source token account, which is always the first account in a transfer hook's accounts array. The second is always the mint; the third is always the destination token account. The order matches the legacy token program. + +Because we derive the counter account from the *sender's* token account owner, we `init` the counter PDA when we initialize the `ExtraAccountMeta` list. Once initialized, the transfer hook increments the counter on every transfer: + +```rust +#[derive(Accounts)] +pub struct InitializeExtraAccountMetaList<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// CHECK: ExtraAccountMetaList account, must use these seeds. + #[account( + init, + seeds = [b"extra-account-metas", mint.key().as_ref()], + bump, + space = ExtraAccountMetaList::size_of( + InitializeExtraAccountMetaList::extra_account_metas()?.len() + )?, + payer = payer, + )] + pub extra_account_meta_list: AccountInfo<'info>, + pub mint: InterfaceAccount<'info, Mint>, + #[account( + init, + seeds = [b"counter", payer.key().as_ref()], + bump, + payer = payer, + space = COUNTER_ACCOUNT_SIZE, + )] + pub counter_account: Account<'info, CounterAccount>, + pub token_program: Program<'info, Token2022>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} +``` + +The counter account also has to appear on the `TransferHook` struct - the [program](https://solana.com/docs/terminology#program) needs to know about every account passed in by the runtime: + +```rust +#[derive(Accounts)] +pub struct TransferHook<'info> { + #[account(token::mint = mint, token::authority = owner)] + pub source_token: InterfaceAccount<'info, TokenAccount>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(token::mint = mint)] + pub destination_token: InterfaceAccount<'info, TokenAccount>, + /// CHECK: source token account owner; may be a SystemAccount or a PDA owned by another program. + pub owner: UncheckedAccount<'info>, + /// CHECK: ExtraAccountMetaList account. + #[account(seeds = [b"extra-account-metas", mint.key().as_ref()], bump)] + pub extra_account_meta_list: UncheckedAccount<'info>, + #[account(seeds = [b"counter", owner.key().as_ref()], bump)] + pub counter_account: Account<'info, CounterAccount>, +} +``` + +On the client side, the helper resolves the extra account for you: + +```typescript +const transferInstructionWithHelper = await createTransferCheckedWithTransferHookInstruction( + connection, + sourceTokenAccount, + mint.publicKey, + destinationTokenAccount, + wallet.publicKey, + amountBigInt, + decimals, + [], + "confirmed", + TOKEN_2022_PROGRAM_ID, +); +``` + +If you wanted to derive the counter PDA manually: + +```typescript +const [counterPDA] = PublicKey.findProgramAddressSync( + [Buffer.from("counter"), wallet.publicKey.toBuffer()], + program.programId, +); +``` + +Note: the counter account must exist before a transfer, since the hook reads/writes it. In this example we initialize it alongside the extra-account-metas, so there's only ever one counter - the one for the wallet that initialized the metas. If you want a counter per holder, you'd need to expose an opt-in handler to create it (a "sign up for counter" button in your dapp, for example). diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Cargo.toml b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Cargo.toml new file mode 100644 index 000000000..81d3422a3 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "transfer-hook" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_hook" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" +spl-discriminator = "0.4.1" +spl-tlv-account-resolution = "0.9.0" +spl-transfer-hook-interface = "0.9.0" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Xargo.toml b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs new file mode 100644 index 000000000..34c854ce9 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -0,0 +1,51 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_2022::Token2022, + token_interface::Mint, +}; +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{handle_extra_account_metas, handle_extra_account_metas_count, CounterAccount}; + +#[derive(Accounts)] +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// CHECK: ExtraAccountMetaList Account, must use these seeds + #[account( + init, + seeds = [b"extra-account-metas", mint.key().as_ref()], + bump, + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input + space = ExtraAccountMetaList::size_of( + handle_extra_account_metas_count() + ).unwrap(), + payer = payer + )] + pub extra_account_meta_list: UncheckedAccount<'info>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(init, seeds = [b"counter", payer.key().as_ref()], bump, payer = payer, space = CounterAccount::DISCRIMINATOR.len() + CounterAccount::INIT_SPACE)] + pub counter_account: Account<'info, CounterAccount>, + pub token_program: Program<'info, Token2022>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +pub fn handler(mut context: Context) -> Result<()> { + let extra_account_metas = handle_extra_account_metas()?; + + // initialize ExtraAccountMetaList account with extra accounts + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + ExtraAccountMetaList::init::( + &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, + &extra_account_metas, + ).map_err(|_| ProgramError::InvalidAccountData)?; + + context.accounts.counter_account.bump = context.bumps.counter_account; + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/mod.rs new file mode 100644 index 000000000..541fb4b7f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize_extra_account_meta_list; +pub mod transfer_hook; + +pub use initialize_extra_account_meta_list::*; +pub use transfer_hook::*; diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs new file mode 100644 index 000000000..62aafc317 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -0,0 +1,47 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount}; + +use crate::{check_is_transferring, CounterAccount, TransferError}; + +// Order of accounts matters for this struct. +// The first 4 accounts are the accounts required for token transfer (source, mint, destination, owner) +// Remaining accounts are the extra accounts required from the ExtraAccountMetaList account +// These accounts are provided via CPI to this program from the token2022 program +#[derive(Accounts)] +pub struct TransferHookAccountConstraints<'info> { + #[account(token::mint = mint, token::authority = owner)] + pub source_token: InterfaceAccount<'info, TokenAccount>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(token::mint = mint)] + pub destination_token: InterfaceAccount<'info, TokenAccount>, + /// CHECK: source token account owner, can be SystemAccount or PDA owned by another program + pub owner: UncheckedAccount<'info>, + /// CHECK: ExtraAccountMetaList Account, + #[account(seeds = [b"extra-account-metas", mint.key().as_ref()], bump)] + pub extra_account_meta_list: UncheckedAccount<'info>, + #[account(seeds = [b"counter", owner.key().as_ref()], bump)] + pub counter_account: Account<'info, CounterAccount>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + // Fail this instruction if it is not called from within a transfer hook + check_is_transferring(&context)?; + + // Check if the amount is too big + if amount > 50 { + msg!("The amount is too big: {}", amount); + //return err!(TransferError::AmountTooBig); + } + + // Increment the transfer count safely + let count = context + .accounts + .counter_account + .counter + .checked_add(1) + .ok_or(TransferError::AmountTooBig)?; + + msg!("This token has been transferred {} times", count); + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/lib.rs new file mode 100644 index 000000000..c83525603 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/src/lib.rs @@ -0,0 +1,95 @@ +use std::cell::RefMut; + +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::{ + extension::{ + transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, + PodStateWithExtensionsMut, + }, + pod::PodAccount, +}; +use spl_tlv_account_resolution::{account::ExtraAccountMeta, seeds::Seed}; +use spl_discriminator::SplDiscriminate; +use spl_transfer_hook_interface::instruction::{ + ExecuteInstruction, InitializeExtraAccountMetaListInstruction, +}; + +mod instructions; +use instructions::*; + +declare_id!("1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK"); + +#[error_code] +pub enum TransferError { + #[msg("The amount is too big")] + AmountTooBig, + #[msg("The token is not currently transferring")] + IsNotCurrentlyTransferring, +} + +#[program] +pub mod transfer_hook { + use super::*; + + #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn initialize_extra_account_meta_list( + context: Context, + ) -> Result<()> { + instructions::initialize_extra_account_meta_list::handler(context) + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + instructions::transfer_hook::handler(context, amount) + } +} + +pub fn check_is_transferring(context: &Context) -> Result<()> { + let source_token_info = context.accounts.source_token.to_account_info(); + let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; + // .map_err() needed because spl-token-2022 uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) + .map_err(|_| ProgramError::InvalidAccountData)?; + let account_extension = account.get_extension_mut::() + .map_err(|_| ProgramError::InvalidAccountData)?; + + if !bool::from(account_extension.transferring) { + return err!(TransferError::IsNotCurrentlyTransferring); + } + + Ok(()) +} + +// Define extra account metas to store on extra_account_meta_list account +pub fn handle_extra_account_metas() -> Result> { + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + Ok(vec![ExtraAccountMeta::new_with_seeds( + &[ + Seed::Literal { + bytes: b"counter".to_vec(), + }, + Seed::AccountData { + account_index: 0, + data_index: 32, + length: 32, + }, + ], + false, // is_signer + true, // is_writable + ).map_err(|_| ProgramError::InvalidArgument)?]) +} + +/// Returns the count of extra account metas (avoids the error conversion issue in #[account] attributes) +pub fn handle_extra_account_metas_count() -> usize { + 1 // one extra account: the counter PDA +} + +#[account] +#[derive(InitSpace)] +pub struct CounterAccount { + pub counter: u64, + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..4b083e01c --- /dev/null +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,154 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_hook_account_data_as_seed() { + let (mut svm, program_id, payer) = setup(); + let recipient = Keypair::new(); + let decimals: u8 = 9; + + // PDAs + let (counter_pda, _) = + Pubkey::find_program_address(&[b"counter", payer.pubkey().as_ref()], &program_id); + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Initialize ExtraAccountMetaList (also creates counter PDA) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + counter_account: counter_pda, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer with hook + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: counter_pda, + is_signer: false, + is_writable: true, + }], + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); + svm.expire_blockhash(); + + // Step 5: Try calling transfer_hook directly (should fail - not transferring) + let direct_hook_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::TransferHook { amount: 1 }.data(), + transfer_hook::accounts::TransferHookAccountConstraints { + source_token: source_ata, + mint, + destination_token: dest_ata, + owner: payer.pubkey(), + extra_account_meta_list, + counter_account: counter_pda, + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions(&mut svm, vec![direct_hook_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Calling transfer_hook directly should fail because token is not transferring" + ); +} diff --git a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md index 7b3093828..e882b48a0 100644 --- a/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/account-data-as-seed/anchor/README.md @@ -1,5 +1,11 @@ # Using Token Account Data as a Seed in a Transfer Hook +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Sometimes you want to use [account](https://solana.com/docs/terminology#account) data to derive additional accounts in the extra-account-metas. For example, you might want to use the [token account](https://solana.com/docs/terminology#token-account)'s owner as a seed for a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). When creating an `ExtraAccountMeta`, the data of any account can be used as an extra seed. In this example we derive a counter account from the token account owner and the literal `"counter"`. The counter records how many times that owner has transferred tokens. diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.gitignore new file mode 100644 index 000000000..ef0f05ecf --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.gitignore @@ -0,0 +1,13 @@ +.anchor +.DS_Store +target/debug +target/deploy +target/release +target/sbf-solana-solana +target/test-ledger +target/.rustc_info.json +**/*.rs.bk +node_modules +test-ledger +.yarn +ledger \ No newline at end of file diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Anchor.toml new file mode 100644 index 000000000..9ef6acb87 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +abl-token = "EYBRvArz4kb5YLtzjD4TW6DbWhS8qjcMYqBU4wHLW3qj" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md new file mode 100644 index 000000000..03183e2d1 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md @@ -0,0 +1,41 @@ +# Transfer Hook - Allow/Block List (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Restrict transfers using an onchain allow/block list enforced by a transfer hook program. + +See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Transfer hook +- Extra account metas +- List authority + +## Setup + +From this directory (`tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Cargo.toml b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Cargo.toml new file mode 100644 index 000000000..387b5b193 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "abl-token" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "abl_token" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + + +[dependencies] +# interface-instructions feature removed in Anchor 1.0 +anchor-lang = "1.1.2" +anchor-spl = { version = "1.1.2", features = [ + "token_2022_extensions", + "token_2022", +] } + +spl-tlv-account-resolution = "0.11.1" +spl-transfer-hook-interface = { version = "2.1.0" } +spl-discriminator = "0.5.1" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Xargo.toml b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/constants.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/constants.rs new file mode 100644 index 000000000..e098e7e6a --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/constants.rs @@ -0,0 +1,3 @@ +pub const META_LIST_ACCOUNT_SEED: &[u8] = b"extra-account-metas"; +pub const CONFIG_SEED: &[u8] = b"config"; +pub const AB_WALLET_SEED: &[u8] = b"ab_wallet"; diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/errors.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/errors.rs new file mode 100644 index 000000000..baabd5524 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/errors.rs @@ -0,0 +1,16 @@ +use anchor_lang::error_code; + +#[error_code] +pub enum ABListError { + #[msg("Invalid metadata")] + InvalidMetadata, + + #[msg("Wallet not allowed")] + WalletNotAllowed, + + #[msg("Amount not allowed")] + AmountNotAllowed, + + #[msg("Wallet blocked")] + WalletBlocked, +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/attach_to_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/attach_to_mint.rs new file mode 100644 index 000000000..750c21c57 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/attach_to_mint.rs @@ -0,0 +1,59 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + token_2022::Token2022, + token_interface::{transfer_hook_update, Mint, TransferHookUpdate}, +}; + +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{get_extra_account_metas, get_meta_list_size, META_LIST_ACCOUNT_SEED}; + +#[derive(Accounts)] +pub struct AttachToMintAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + mut, + mint::token_program = token_program, + )] + pub mint: Box>, + + #[account( + init, + space = get_meta_list_size()?, + seeds = [META_LIST_ACCOUNT_SEED, mint.key().as_ref()], + bump, + payer = payer, + )] + /// CHECK: extra metas account + pub extra_metas_account: UncheckedAccount<'info>, + + pub system_program: Program<'info, System>, + + pub token_program: Program<'info, Token2022>, +} + +impl AttachToMintAccountConstraints<'_> { + pub fn attach_to_mint(&mut self) -> Result<()> { + let tx_hook_accs = TransferHookUpdate { + token_program_id: self.token_program.to_account_info(), + mint: self.mint.to_account_info(), + authority: self.payer.to_account_info(), + }; + + let context = CpiContext::new(self.token_program.key(), tx_hook_accs); + + transfer_hook_update(context, Some(crate::ID_CONST))?; + + // initialize the extra metas account + let extra_metas_account = &self.extra_metas_account; + let metas = get_extra_account_metas()?; + let mut data = extra_metas_account.try_borrow_mut_data()?; + ExtraAccountMetaList::init::(&mut data, &metas) + .map_err(|_| ProgramError::InvalidAccountData)?; + + Ok(()) + } +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/change_mode.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/change_mode.rs new file mode 100644 index 000000000..81fde1820 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/change_mode.rs @@ -0,0 +1,106 @@ +use anchor_lang::solana_program::program::invoke; +use anchor_lang::{prelude::*, solana_program::system_instruction::transfer}; +use anchor_spl::token_interface::spl_token_metadata_interface::state::TokenMetadata; +use anchor_spl::{ + token_2022::{ + spl_token_2022::extension::{BaseStateWithExtensions, StateWithExtensions}, + spl_token_2022::state::Mint, + Token2022, + }, + token_interface::{ + spl_token_metadata_interface::state::Field, token_metadata_update_field, + Mint as MintAccount, TokenMetadataUpdateField, + }, +}; + +use crate::Mode; + +#[derive(Accounts)] +pub struct ChangeModeAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + mut, + mint::token_program = token_program, + )] + pub mint: InterfaceAccount<'info, MintAccount>, + + pub token_program: Program<'info, Token2022>, + + pub system_program: Program<'info, System>, +} + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct ChangeModeArgs { + pub mode: Mode, + pub threshold: u64, +} + +impl ChangeModeAccountConstraints<'_> { + pub fn change_mode(&mut self, args: ChangeModeArgs) -> Result<()> { + let cpi_accounts = TokenMetadataUpdateField { + metadata: self.mint.to_account_info(), + update_authority: self.authority.to_account_info(), + program_id: self.token_program.to_account_info(), + }; + let cpi_program = self.token_program.key(); + let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); + + token_metadata_update_field(cpi_ctx, Field::Key("AB".to_string()), args.mode.to_string())?; + + if args.mode == Mode::Mixed || self.has_threshold()? { + let threshold = if args.mode == Mode::Mixed { + args.threshold + } else { + 0 + }; + + let cpi_accounts = TokenMetadataUpdateField { + metadata: self.mint.to_account_info(), + update_authority: self.authority.to_account_info(), + program_id: self.token_program.to_account_info(), + }; + let cpi_program = self.token_program.key(); + let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); + + token_metadata_update_field( + cpi_ctx, + Field::Key("threshold".to_string()), + threshold.to_string(), + )?; + } + + let data = self.mint.to_account_info().data_len(); + let min_balance = Rent::get()?.minimum_balance(data); + if min_balance > self.mint.to_account_info().get_lamports() { + invoke( + &transfer( + &self.authority.key(), + &self.mint.to_account_info().key(), + min_balance - self.mint.to_account_info().get_lamports(), + ), + &[ + self.authority.to_account_info(), + self.mint.to_account_info(), + self.system_program.to_account_info(), + ], + )?; + } + + Ok(()) + } + + fn has_threshold(&self) -> Result { + let mint_info = self.mint.to_account_info(); + let mint_data = mint_info.data.borrow(); + let mint = StateWithExtensions::::unpack(&mint_data)?; + let metadata = mint.get_variable_len_extension::(); + Ok(metadata.is_ok() + && metadata + .unwrap() + .additional_metadata + .iter() + .any(|(key, _)| key == "threshold")) + } +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_config.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_config.rs new file mode 100644 index 000000000..67142441b --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_config.rs @@ -0,0 +1,30 @@ +use crate::{Config, CONFIG_SEED}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct InitConfigAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + space = Config::DISCRIMINATOR.len() + Config::INIT_SPACE, + seeds = [CONFIG_SEED], + bump, + )] + pub config: Box>, + + pub system_program: Program<'info, System>, +} + +impl InitConfigAccountConstraints<'_> { + pub fn init_config(&mut self, config_bump: u8) -> Result<()> { + self.config.set_inner(Config { + authority: self.payer.key(), + bump: config_bump, + }); + + Ok(()) + } +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_mint.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_mint.rs new file mode 100644 index 000000000..cfbfb90cb --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_mint.rs @@ -0,0 +1,130 @@ +use anchor_lang::{ + prelude::*, solana_program::program::invoke, solana_program::system_instruction::transfer, +}; +use anchor_spl::{ + token_2022::Token2022, + token_interface::{ + spl_token_metadata_interface::state::Field, token_metadata_initialize, + token_metadata_update_field, Mint, TokenMetadataInitialize, TokenMetadataUpdateField, + }, +}; + +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{get_extra_account_metas, get_meta_list_size, Mode, META_LIST_ACCOUNT_SEED}; + +#[derive(Accounts)] +#[instruction(args: InitMintArgs)] +pub struct InitMintAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::token_program = token_program, + mint::decimals = args.decimals, + mint::authority = payer.key(), + mint::freeze_authority = args.freeze_authority, + extensions::permanent_delegate::delegate = args.permanent_delegate, + extensions::transfer_hook::authority = args.transfer_hook_authority, + extensions::transfer_hook::program_id = crate::id(), + extensions::metadata_pointer::authority = payer.key(), + extensions::metadata_pointer::metadata_address = mint.key(), + )] + pub mint: Box>, + + #[account( + init, + space = get_meta_list_size()?, + seeds = [META_LIST_ACCOUNT_SEED, mint.key().as_ref()], + bump, + payer = payer, + )] + /// CHECK: extra metas account + pub extra_metas_account: UncheckedAccount<'info>, + + pub system_program: Program<'info, System>, + + pub token_program: Program<'info, Token2022>, +} + +impl InitMintAccountConstraints<'_> { + pub fn init_mint(&mut self, args: InitMintArgs) -> Result<()> { + let cpi_accounts = TokenMetadataInitialize { + program_id: self.token_program.to_account_info(), + mint: self.mint.to_account_info(), + metadata: self.mint.to_account_info(), // metadata account is the mint, since data is stored in mint + mint_authority: self.payer.to_account_info(), + update_authority: self.payer.to_account_info(), + }; + let cpi_ctx = CpiContext::new(self.token_program.key(), cpi_accounts); + token_metadata_initialize(cpi_ctx, args.name, args.symbol, args.uri)?; + + let cpi_accounts = TokenMetadataUpdateField { + metadata: self.mint.to_account_info(), + update_authority: self.payer.to_account_info(), + program_id: self.token_program.to_account_info(), + }; + + let cpi_ctx = CpiContext::new(self.token_program.key(), cpi_accounts); + + token_metadata_update_field(cpi_ctx, Field::Key("AB".to_string()), args.mode.to_string())?; + + if args.mode == Mode::Mixed { + let cpi_accounts = TokenMetadataUpdateField { + metadata: self.mint.to_account_info(), + update_authority: self.payer.to_account_info(), + program_id: self.token_program.to_account_info(), + }; + let cpi_ctx = CpiContext::new(self.token_program.key(), cpi_accounts); + + token_metadata_update_field( + cpi_ctx, + Field::Key("threshold".to_string()), + args.threshold.to_string(), + )?; + } + + let data = self.mint.to_account_info().data_len(); + let min_balance = Rent::get()?.minimum_balance(data); + if min_balance > self.mint.to_account_info().get_lamports() { + invoke( + &transfer( + &self.payer.key(), + &self.mint.to_account_info().key(), + min_balance - self.mint.to_account_info().get_lamports(), + ), + &[ + self.payer.to_account_info(), + self.mint.to_account_info(), + self.system_program.to_account_info(), + ], + )?; + } + + // initialize the extra metas account + let extra_metas_account = &self.extra_metas_account; + let metas = get_extra_account_metas()?; + let mut data = extra_metas_account.try_borrow_mut_data()?; + ExtraAccountMetaList::init::(&mut data, &metas) + .map_err(|_| ProgramError::InvalidAccountData)?; + + Ok(()) + } +} + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitMintArgs { + pub decimals: u8, + pub mint_authority: Pubkey, + pub freeze_authority: Pubkey, + pub permanent_delegate: Pubkey, + pub transfer_hook_authority: Pubkey, + pub mode: Mode, + pub threshold: u64, + pub name: String, + pub symbol: String, + pub uri: String, +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_wallet.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_wallet.rs new file mode 100644 index 000000000..f1eb1b95a --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/init_wallet.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; + +use crate::{ABWallet, Config, AB_WALLET_SEED, CONFIG_SEED}; + +#[derive(Accounts)] +pub struct InitWalletAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + seeds = [CONFIG_SEED], + bump = config.bump, + has_one = authority, + )] + pub config: Box>, + + pub wallet: SystemAccount<'info>, + + #[account( + init, + payer = authority, + space = ABWallet::DISCRIMINATOR.len() + ABWallet::INIT_SPACE, + seeds = [AB_WALLET_SEED, wallet.key().as_ref()], + bump, + )] + pub ab_wallet: Account<'info, ABWallet>, + + pub system_program: Program<'info, System>, +} + +impl InitWalletAccountConstraints<'_> { + pub fn init_wallet(&mut self, args: InitWalletArgs, bump: u8) -> Result<()> { + let ab_wallet = &mut self.ab_wallet; + ab_wallet.wallet = self.wallet.key(); + ab_wallet.allowed = args.allowed; + ab_wallet.bump = bump; + Ok(()) + } +} + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitWalletArgs { + pub allowed: bool, +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/mod.rs new file mode 100644 index 000000000..dd7b6053c --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/mod.rs @@ -0,0 +1,15 @@ +pub mod attach_to_mint; +pub mod change_mode; +pub mod init_config; +pub mod init_mint; +pub mod init_wallet; +pub mod remove_wallet; +pub mod tx_hook; + +pub use attach_to_mint::*; +pub use change_mode::*; +pub use init_config::*; +pub use init_mint::*; +pub use init_wallet::*; +pub use remove_wallet::*; +pub use tx_hook::*; diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/remove_wallet.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/remove_wallet.rs new file mode 100644 index 000000000..a505f085e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/remove_wallet.rs @@ -0,0 +1,30 @@ +use anchor_lang::prelude::*; + +use crate::{ABWallet, Config}; + +#[derive(Accounts)] +pub struct RemoveWalletAccountConstraints<'info> { + #[account(mut)] + pub authority: Signer<'info>, + + #[account( + seeds = [b"config"], + bump = config.bump, + has_one = authority, + )] + pub config: Box>, + + #[account( + mut, + close = authority, + )] + pub ab_wallet: Account<'info, ABWallet>, + + pub system_program: Program<'info, System>, +} + +impl RemoveWalletAccountConstraints<'_> { + pub fn remove_wallet(&mut self) -> Result<()> { + Ok(()) + } +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/tx_hook.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/tx_hook.rs new file mode 100644 index 000000000..0c3f6291e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/instructions/tx_hook.rs @@ -0,0 +1,119 @@ +use std::str::FromStr; + +use anchor_lang::prelude::*; +use anchor_spl::{ + token_2022::spl_token_2022::{ + extension::{BaseStateWithExtensions, StateWithExtensions}, + state::Mint, + }, + token_interface::spl_token_metadata_interface::state::TokenMetadata, +}; + +use crate::{ABListError, ABWallet, Mode}; + +#[derive(Accounts)] +pub struct TxHookAccountConstraints<'info> { + /// CHECK: + pub source_token_account: UncheckedAccount<'info>, + /// CHECK: + pub mint: UncheckedAccount<'info>, + /// CHECK: + pub destination_token_account: UncheckedAccount<'info>, + /// CHECK: + pub owner_delegate: UncheckedAccount<'info>, + /// CHECK: + pub meta_list: UncheckedAccount<'info>, + /// CHECK: + pub ab_wallet: UncheckedAccount<'info>, +} + +impl TxHookAccountConstraints<'_> { + pub fn tx_hook(&self, amount: u64) -> Result<()> { + let mint_info = self.mint.to_account_info(); + let mint_data = mint_info.data.borrow(); + let mint = StateWithExtensions::::unpack(&mint_data)?; + + let metadata = mint.get_variable_len_extension::()?; + let decoded_mode = Self::decode_metadata(&metadata)?; + let decoded_wallet_mode = self.decode_wallet_mode()?; + + match (decoded_mode, decoded_wallet_mode) { + // first check the force allow modes + (DecodedMintMode::Allow, DecodedWalletMode::Allow) => Ok(()), + (DecodedMintMode::Allow, _) => Err(ABListError::WalletNotAllowed.into()), + // then check if the wallet is blocked + (_, DecodedWalletMode::Block) => Err(ABListError::WalletBlocked.into()), + (DecodedMintMode::Block, _) => Ok(()), + // lastly check the threshold mode + (DecodedMintMode::Threshold(threshold), DecodedWalletMode::None) + if amount >= threshold => + { + Err(ABListError::AmountNotAllowed.into()) + } + (DecodedMintMode::Threshold(_), _) => Ok(()), + } + } + + fn decode_wallet_mode(&self) -> Result { + if self.ab_wallet.data_is_empty() { + return Ok(DecodedWalletMode::None); + } + + let wallet_data = &mut self.ab_wallet.data.borrow(); + let wallet = ABWallet::try_deserialize(&mut &wallet_data[..])?; + + if wallet.allowed { + Ok(DecodedWalletMode::Allow) + } else { + Ok(DecodedWalletMode::Block) + } + } + + fn decode_metadata(metadata: &TokenMetadata) -> Result { + let mut mode = Mode::Allow; + let mut threshold = 0; + + for (key, value) in metadata.additional_metadata.iter() { + if key == "AB" { + mode = Mode::from_str(value).map_err(|_| ABListError::InvalidMetadata)?; + if mode == Mode::Allow { + return Ok(DecodedMintMode::Allow); + } else if mode == Mode::Block { + return Ok(DecodedMintMode::Block); + } else if mode == Mode::Mixed && threshold > 0 { + return Ok(DecodedMintMode::Threshold(threshold)); + } + } else if key == "threshold" { + threshold = u64::from_str(value).map_err(|_| ABListError::InvalidMetadata)?; + if threshold > 0 { + return Ok(DecodedMintMode::Threshold(threshold)); + } + } + } + + // we have early returns above, but we can reach here if metadata is meddled with + // which is why we have this fallback + // also, anchor doesn't yet support removing keys from metadata, which means that if we set threshold, we can never remove the KV pair + // only set it to 0 + + if mode == Mode::Allow { + return Ok(DecodedMintMode::Allow); + } else if mode == Mode::Block { + return Ok(DecodedMintMode::Block); + } + + Ok(DecodedMintMode::Threshold(threshold)) + } +} + +enum DecodedMintMode { + Allow, + Block, + Threshold(u64), +} + +enum DecodedWalletMode { + Allow, + Block, + None, +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/lib.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/lib.rs new file mode 100644 index 000000000..517ef28d2 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/lib.rs @@ -0,0 +1,52 @@ +use anchor_lang::prelude::*; +use spl_discriminator::SplDiscriminate; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +pub mod constants; +pub mod errors; +pub mod instructions; +pub mod state; +pub mod utils; +pub use constants::*; +pub use errors::*; +pub use instructions::*; +pub use state::*; +pub use utils::*; + +declare_id!("3ku1ZEGvBEEfhaYsAzBZuecTPEa58ZRhoVqHVGpGxVGi"); + +#[program] +pub mod abl_token { + + use super::*; + + pub fn init_mint(context: Context, args: InitMintArgs) -> Result<()> { + context.accounts.init_mint(args) + } + + pub fn init_config(context: Context) -> Result<()> { + context.accounts.init_config(context.bumps.config) + } + + pub fn attach_to_mint(context: Context) -> Result<()> { + context.accounts.attach_to_mint() + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn tx_hook(context: Context, amount: u64) -> Result<()> { + context.accounts.tx_hook(amount) + } + + pub fn init_wallet(context: Context, args: InitWalletArgs) -> Result<()> { + let bump = context.bumps.ab_wallet; + context.accounts.init_wallet(args, bump) + } + + pub fn remove_wallet(context: Context) -> Result<()> { + context.accounts.remove_wallet() + } + + pub fn change_mode(context: Context, args: ChangeModeArgs) -> Result<()> { + context.accounts.change_mode(args) + } +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/state.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/state.rs new file mode 100644 index 000000000..bf2df39df --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/state.rs @@ -0,0 +1,52 @@ +use std::{ + fmt::{self, Display}, + str::FromStr, +}; + +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct ABWallet { + pub wallet: Pubkey, + pub allowed: bool, + /// Canonical bump for this PDA. + pub bump: u8, +} + +#[account] +#[derive(InitSpace)] +pub struct Config { + pub authority: Pubkey, + pub bump: u8, +} + +#[derive(AnchorSerialize, AnchorDeserialize, PartialEq)] +pub enum Mode { + Allow, + Block, + Mixed, +} + +impl FromStr for Mode { + type Err = (); + + fn from_str(s: &str) -> std::result::Result { + match s { + "Allow" => Ok(Mode::Allow), + "Block" => Ok(Mode::Block), + "Mixed" => Ok(Mode::Mixed), + _ => Err(()), + } + } +} + +impl Display for Mode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Mode::Allow => write!(f, "Allow"), + Mode::Block => write!(f, "Block"), + Mode::Mixed => write!(f, "Mixed"), + } + } +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/utils.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/utils.rs new file mode 100644 index 000000000..7ffc952ad --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/src/utils.rs @@ -0,0 +1,31 @@ +use anchor_lang::prelude::*; + +use spl_tlv_account_resolution::{ + account::ExtraAccountMeta, seeds::Seed, state::ExtraAccountMetaList, +}; + +use crate::AB_WALLET_SEED; + +pub fn get_meta_list_size() -> Result { + Ok(ExtraAccountMetaList::size_of(1).map_err(|_| ProgramError::InvalidArgument)?) +} + +pub fn get_extra_account_metas() -> Result> { + Ok(vec![ + // [5] ab_wallet for destination token account wallet + ExtraAccountMeta::new_with_seeds( + &[ + Seed::Literal { + bytes: AB_WALLET_SEED.to_vec(), + }, + Seed::AccountData { + account_index: 2, + data_index: 32, + length: 32, + }, + ], + false, + false, + ).map_err(|_| ProgramError::InvalidArgument)?, // [2] destination token account + ]) +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/tests/test_abl_token.rs b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/tests/test_abl_token.rs new file mode 100644 index 000000000..ccc5712cd --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/programs/abl-token/tests/test_abl_token.rs @@ -0,0 +1,86 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = abl_token::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/abl_token.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_init_config_and_init_mint() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Derive PDAs + let (config_pda, _) = + Pubkey::find_program_address(&[b"config"], &program_id); + let (extra_account_meta_list, _) = Pubkey::find_program_address( + &[b"extra-account-metas", mint_keypair.pubkey().as_ref()], + &program_id, + ); + + // Step 1: Initialize config + let init_config_ix = Instruction::new_with_bytes( + program_id, + &abl_token::instruction::InitConfig {}.data(), + abl_token::accounts::InitConfigAccountConstraints { + payer: payer.pubkey(), + config: config_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_config_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Initialize mint with transfer hook and metadata + let init_mint_args = abl_token::instructions::InitMintArgs { + name: "Test Token".to_string(), + symbol: "TEST".to_string(), + uri: "https://test.com".to_string(), + decimals: 6, + mint_authority: payer.pubkey(), + freeze_authority: payer.pubkey(), + permanent_delegate: payer.pubkey(), + transfer_hook_authority: payer.pubkey(), + mode: abl_token::Mode::Allow, + threshold: 0, + }; + let init_mint_ix = Instruction::new_with_bytes( + program_id, + &abl_token::instruction::InitMint { + args: init_mint_args, + } + .data(), + abl_token::accounts::InitMintAccountConstraints { + payer: payer.pubkey(), + mint: mint_keypair.pubkey(), + extra_metas_account: extra_account_meta_list, + system_program: system_program::id(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_mint_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); +} diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/abl-token-exports.ts b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/abl-token-exports.ts new file mode 100644 index 000000000..9e147ff51 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/abl-token-exports.ts @@ -0,0 +1,36 @@ +// Here we export some useful types and functions for interacting with the Anchor program. +import { type AnchorProvider, Program } from "@anchor-lang/core"; +import { type Cluster, PublicKey } from "@solana/web3.js"; +import ABLTokenIDL from "../target/idl/abl_token.json"; +import type { AblToken } from "../target/types/abl_token"; + +// Re-export the generated IDL and type +export { ABLTokenIDL }; + +// The programId is imported from the program IDL. +export const ABL_TOKEN_PROGRAM_ID = new PublicKey(ABLTokenIDL.address); + +// This is a helper function to get the Basic Anchor program. +export function getABLTokenProgram(provider: AnchorProvider, address?: PublicKey): Program { + return new Program( + { + ...ABLTokenIDL, + address: address ? address.toBase58() : ABLTokenIDL.address, + } as AblToken, + provider, + ); +} + +// This is a helper function to get the program ID for the Basic program depending on the cluster. +export function getABLTokenProgramId(cluster: Cluster) { + switch (cluster) { + case "devnet": + case "testnet": + // This is the program ID for the Basic program on devnet and testnet. + return new PublicKey("6z68wfurCMYkZG51s1Et9BJEd9nJGUusjHXNt4dGbNNF"); + default: + return ABL_TOKEN_PROGRAM_ID; + } +} + +//ABLTokenIDL.types["mode"] diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/index.ts b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/index.ts new file mode 100644 index 000000000..d7552798e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/src/index.ts @@ -0,0 +1 @@ +export * from "./abl-token-exports"; diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md index 53978479d..5b5f638d8 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md @@ -1,5 +1,11 @@ # Transfer Hook - Allow/Block List (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Restrict transfers using an onchain allow/block list enforced by a transfer hook program. See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/counter/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-hook/counter/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/counter/anchor-v1/Anchor.toml new file mode 100644 index 000000000..060a1d43e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_hook = "1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/counter/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/counter/anchor-v1/README.md new file mode 100644 index 000000000..23d33938e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Transfer Hook - Counter (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Count how many times tokens have been transferred using hook-side state. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- PDA counter updated on transfer + +## Setup + +From this directory (`tokens/token-extensions/transfer-hook/counter/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Cargo.toml b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Cargo.toml new file mode 100644 index 000000000..81d3422a3 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "transfer-hook" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_hook" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" +spl-discriminator = "0.4.1" +spl-tlv-account-resolution = "0.9.0" +spl-transfer-hook-interface = "0.9.0" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Xargo.toml b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs new file mode 100644 index 000000000..7aef4af81 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -0,0 +1,51 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_2022::Token2022, + token_interface::Mint, +}; +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{handle_extra_account_metas, handle_extra_account_metas_count, CounterAccount}; + +#[derive(Accounts)] +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// CHECK: ExtraAccountMetaList Account, must use these seeds + #[account( + init, + seeds = [b"extra-account-metas", mint.key().as_ref()], + bump, + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input + space = ExtraAccountMetaList::size_of( + handle_extra_account_metas_count() + ).unwrap(), + payer = payer + )] + pub extra_account_meta_list: AccountInfo<'info>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(init, seeds = [b"counter"], bump, payer = payer, space = CounterAccount::DISCRIMINATOR.len() + CounterAccount::INIT_SPACE)] + pub counter_account: Account<'info, CounterAccount>, + pub token_program: Program<'info, Token2022>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +pub fn handler(mut context: Context) -> Result<()> { + let extra_account_metas = handle_extra_account_metas()?; + + // initialize ExtraAccountMetaList account with extra accounts + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + ExtraAccountMetaList::init::( + &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, + &extra_account_metas, + ).map_err(|_| ProgramError::InvalidAccountData)?; + + context.accounts.counter_account.bump = context.bumps.counter_account; + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/mod.rs new file mode 100644 index 000000000..541fb4b7f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize_extra_account_meta_list; +pub mod transfer_hook; + +pub use initialize_extra_account_meta_list::*; +pub use transfer_hook::*; diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs new file mode 100644 index 000000000..31ee75fc4 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -0,0 +1,47 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount}; + +use crate::{check_is_transferring, CounterAccount, TransferError}; + +// Order of accounts matters for this struct. +// The first 4 accounts are the accounts required for token transfer (source, mint, destination, owner) +// Remaining accounts are the extra accounts required from the ExtraAccountMetaList account +// These accounts are provided via CPI to this program from the token2022 program +#[derive(Accounts)] +pub struct TransferHookAccountConstraints<'info> { + #[account(token::mint = mint, token::authority = owner)] + pub source_token: InterfaceAccount<'info, TokenAccount>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(token::mint = mint)] + pub destination_token: InterfaceAccount<'info, TokenAccount>, + /// CHECK: source token account owner, can be SystemAccount or PDA owned by another program + pub owner: UncheckedAccount<'info>, + /// CHECK: ExtraAccountMetaList Account, + #[account(seeds = [b"extra-account-metas", mint.key().as_ref()], bump)] + pub extra_account_meta_list: UncheckedAccount<'info>, + #[account(seeds = [b"counter"], bump)] + pub counter_account: Account<'info, CounterAccount>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + // Fail this instruction if it is not called from within a transfer hook + check_is_transferring(&context)?; + + // Check if the amount is too big + if amount > 50 { + msg!("The amount is too big: {}", amount); + //return err!(TransferError::AmountTooBig); + } + + // Increment the transfer count safely + let count = context + .accounts + .counter_account + .counter + .checked_add(1) + .ok_or(TransferError::AmountTooBig)?; + + msg!("This token has been transferred {} times", count); + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/lib.rs new file mode 100644 index 000000000..7fabbb4b0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/src/lib.rs @@ -0,0 +1,84 @@ +use std::cell::RefMut; + +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::{ + extension::{ + transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, + PodStateWithExtensionsMut, + }, + pod::PodAccount, +}; +use spl_tlv_account_resolution::{account::ExtraAccountMeta, seeds::Seed}; +use spl_discriminator::SplDiscriminate; +use spl_transfer_hook_interface::instruction::{ + ExecuteInstruction, InitializeExtraAccountMetaListInstruction, +}; + +mod instructions; +use instructions::*; + +declare_id!("1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK"); + +#[error_code] +pub enum TransferError { + #[msg("The amount is too big")] + AmountTooBig, + #[msg("The token is not currently transferring")] + IsNotCurrentlyTransferring, +} + +#[program] +pub mod transfer_hook { + use super::*; + + #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn initialize_extra_account_meta_list( + context: Context, + ) -> Result<()> { + instructions::initialize_extra_account_meta_list::handler(context) + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + instructions::transfer_hook::handler(context, amount) + } +} + +pub fn check_is_transferring(context: &Context) -> Result<()> { + let source_token_info = context.accounts.source_token.to_account_info(); + let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; + let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref)?; + let account_extension = account.get_extension_mut::()?; + + if !bool::from(account_extension.transferring) { + return err!(TransferError::IsNotCurrentlyTransferring); + } + + Ok(()) +} + +// Define extra account metas to store on extra_account_meta_list account +pub fn handle_extra_account_metas() -> Result> { + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + Ok(vec![ExtraAccountMeta::new_with_seeds( + &[Seed::Literal { + bytes: b"counter".to_vec(), + }], + false, // is_signer + true, // is_writable + ).map_err(|_| ProgramError::InvalidArgument)?]) +} + +/// Returns the count of extra account metas (avoids the error conversion issue in #[account] attributes) +pub fn handle_extra_account_metas_count() -> usize { + 1 // one extra account: the counter PDA +} + +#[account] +#[derive(InitSpace)] +pub struct CounterAccount { + pub counter: u64, + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/tests/test_transfer_hook_counter.rs b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/tests/test_transfer_hook_counter.rs new file mode 100644 index 000000000..ae927cd15 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/counter/anchor-v1/programs/transfer-hook/tests/test_transfer_hook_counter.rs @@ -0,0 +1,154 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_hook_counter() { + let (mut svm, program_id, payer) = setup(); + let decimals: u8 = 9; + + // PDAs + let (counter_pda, _) = Pubkey::find_program_address(&[b"counter"], &program_id); + + // Step 1: Create mint with TransferHook extension via kite + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let recipient = Keypair::new(); + let amount: u64 = 100 * 10u64.pow(decimals as u32); + + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Initialize ExtraAccountMetaList (also creates counter PDA) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + counter_account: counter_pda, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer with hook (this triggers the counter increment) + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: counter_pda, + is_signer: false, + is_writable: true, + }], + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); + svm.expire_blockhash(); + + // Step 5: Try calling transfer_hook directly (should fail - not transferring) + let direct_hook_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::TransferHook { amount: 1 }.data(), + transfer_hook::accounts::TransferHookAccountConstraints { + source_token: source_ata, + mint, + destination_token: dest_ata, + owner: payer.pubkey(), + extra_account_meta_list, + counter_account: counter_pda, + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions(&mut svm, vec![direct_hook_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Calling transfer_hook directly should fail because token is not transferring" + ); +} diff --git a/tokens/token-extensions/transfer-hook/counter/anchor/README.md b/tokens/token-extensions/transfer-hook/counter/anchor/README.md index 9598489e2..c0ddf681f 100644 --- a/tokens/token-extensions/transfer-hook/counter/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/counter/anchor/README.md @@ -1,5 +1,11 @@ # Transfer Hook - Counter (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Count how many times tokens have been transferred using hook-side state. See also: the [repository catalog](../../../../../README.md). diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Anchor.toml new file mode 100644 index 000000000..44e6023b7 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Anchor.toml @@ -0,0 +1,23 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_hook = "jY5DfVksJT8Le38LCaQhz5USeiGu4rUeVSS8QRAMoba" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +# Transfer-hook tests use the real local validator (not bankrun). +# No external program clones needed - this project doesn't use Metaplex. +# The previous [[test.validator.clone]] of metaplex was unnecessary and +# caused 5-minute timeouts in CI trying to fetch from devnet. diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/README.md new file mode 100644 index 000000000..a172bb7d6 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Transfer Hook - Hello World (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Minimal transfer hook that runs custom logic on every token transfer. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook program +- Extra account meta list + +## Setup + +From this directory (`tokens/token-extensions/transfer-hook/hello-world/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Cargo.toml b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Cargo.toml new file mode 100644 index 000000000..81d3422a3 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "transfer-hook" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_hook" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" +spl-discriminator = "0.4.1" +spl-tlv-account-resolution = "0.9.0" +spl-transfer-hook-interface = "0.9.0" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Xargo.toml b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize.rs new file mode 100644 index 000000000..7cc60c7bf --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize.rs @@ -0,0 +1,64 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{ + spl_pod::optional_keys::OptionalNonZeroPubkey, + spl_token_2022::{ + extension::{ + transfer_hook::TransferHook as TransferHookExtension, BaseStateWithExtensions, + StateWithExtensions, + }, + state::Mint as MintState, + }, + Mint, Token2022, +}; + +#[derive(Accounts)] +#[instruction(_decimals: u8)] +pub struct InitializeAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::decimals = _decimals, + mint::authority = payer, + extensions::transfer_hook::authority = payer, + extensions::transfer_hook::program_id = crate::ID + )] + pub mint_account: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub system_program: Program<'info, System>, +} + +// create a mint account that specifies this program as the transfer hook program +pub fn handler(mut context: Context, _decimals: u8) -> Result<()> { + handle_check_mint_data(&mut context.accounts)?; + Ok(()) +} + +// helper to check mint data, and demonstrate how to read mint extension data within a program +fn handle_check_mint_data(accounts: &mut InitializeAccountConstraints) -> Result<()> { + let mint = &accounts.mint_account.to_account_info(); + let mint_data = mint.data.borrow(); + // .map_err() needed because spl-token-2022 uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + let mint_with_extension = StateWithExtensions::::unpack(&mint_data) + .map_err(|_| ProgramError::InvalidAccountData)?; + let extension_data = mint_with_extension.get_extension::() + .map_err(|_| ProgramError::InvalidAccountData)?; + + assert_eq!( + extension_data.authority, + OptionalNonZeroPubkey::try_from(Some(accounts.payer.key())) + .map_err(|_| ProgramError::InvalidArgument)? + ); + + assert_eq!( + extension_data.program_id, + OptionalNonZeroPubkey::try_from(Some(crate::ID)) + .map_err(|_| ProgramError::InvalidArgument)? + ); + + msg!("{:?}", extension_data); + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs new file mode 100644 index 000000000..5a858e593 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -0,0 +1,46 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{Mint, Token2022}, +}; +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{handle_extra_account_metas, handle_extra_account_metas_count}; + +#[derive(Accounts)] +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// CHECK: ExtraAccountMetaList Account, must use these seeds + #[account( + init, + seeds = [b"extra-account-metas", mint.key().as_ref()], + bump, + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input + space = ExtraAccountMetaList::size_of( + handle_extra_account_metas_count() + ).unwrap(), + payer = payer + )] + pub extra_account_meta_list: UncheckedAccount<'info>, + pub mint: InterfaceAccount<'info, Mint>, + pub token_program: Program<'info, Token2022>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +pub fn handler(mut context: Context) -> Result<()> { + let extra_account_metas = handle_extra_account_metas()?; + + // initialize ExtraAccountMetaList account with extra accounts + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + ExtraAccountMetaList::init::( + &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, + &extra_account_metas, + ).map_err(|_| ProgramError::InvalidAccountData)?; + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/mod.rs new file mode 100644 index 000000000..9f83a18b6 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/mod.rs @@ -0,0 +1,7 @@ +pub mod initialize; +pub mod initialize_extra_account_meta_list; +pub mod transfer_hook; + +pub use initialize::*; +pub use initialize_extra_account_meta_list::*; +pub use transfer_hook::*; diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs new file mode 100644 index 000000000..e7b3a5be8 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -0,0 +1,31 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount}; + +use crate::check_is_transferring; + +// Order of accounts matters for this struct. +// The first 4 accounts are the accounts required for token transfer (source, mint, destination, owner) +// Remaining accounts are the extra accounts required from the ExtraAccountMetaList account +// These accounts are provided via CPI to this program from the token2022 program +#[derive(Accounts)] +pub struct TransferHookAccountConstraints<'info> { + #[account(token::mint = mint, token::authority = owner)] + pub source_token: InterfaceAccount<'info, TokenAccount>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(token::mint = mint)] + pub destination_token: InterfaceAccount<'info, TokenAccount>, + /// CHECK: source token account owner, can be SystemAccount or PDA owned by another program + pub owner: UncheckedAccount<'info>, + /// CHECK: ExtraAccountMetaList Account, + #[account(seeds = [b"extra-account-metas", mint.key().as_ref()], bump)] + pub extra_account_meta_list: UncheckedAccount<'info>, +} + +pub fn handler(context: Context, _amount: u64) -> Result<()> { + // Fail this instruction if it is not called from within a transfer hook + check_is_transferring(&context)?; + + msg!("Hello Transfer Hook!"); + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/lib.rs new file mode 100644 index 000000000..9ef5d2be4 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/src/lib.rs @@ -0,0 +1,75 @@ +use std::cell::RefMut; + +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::{ + extension::{ + transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, + PodStateWithExtensionsMut, + }, + pod::PodAccount, +}; +use spl_tlv_account_resolution::account::ExtraAccountMeta; +use spl_discriminator::SplDiscriminate; +use spl_transfer_hook_interface::instruction::{ + ExecuteInstruction, InitializeExtraAccountMetaListInstruction, +}; + +mod instructions; +use instructions::*; + +declare_id!("jY5DfVksJT8Le38LCaQhz5USeiGu4rUeVSS8QRAMoba"); + +#[error_code] +pub enum TransferError { + #[msg("The token is not currently transferring")] + IsNotCurrentlyTransferring, +} + +#[program] +pub mod transfer_hook { + use super::*; + + pub fn initialize(context: Context, decimals: u8) -> Result<()> { + instructions::initialize::handler(context, decimals) + } + + #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn initialize_extra_account_meta_list( + context: Context, + ) -> Result<()> { + instructions::initialize_extra_account_meta_list::handler(context) + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + instructions::transfer_hook::handler(context, amount) + } +} + +pub fn check_is_transferring(context: &Context) -> Result<()> { + let source_token_info = context.accounts.source_token.to_account_info(); + let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; + // .map_err() needed because spl-token-2022 uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) + .map_err(|_| ProgramError::InvalidAccountData)?; + let account_extension = account.get_extension_mut::() + .map_err(|_| ProgramError::InvalidAccountData)?; + + if !bool::from(account_extension.transferring) { + return err!(TransferError::IsNotCurrentlyTransferring); + } + + Ok(()) +} + +// Define extra account metas to store on extra_account_meta_list account +// In this example there are none +pub fn handle_extra_account_metas() -> Result> { + Ok(vec![]) +} + +/// Returns the count of extra account metas (avoids the error conversion issue in #[account] attributes) +pub fn handle_extra_account_metas_count() -> usize { + 0 // no extra accounts in this example +} diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..7471118f0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,154 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, get_token_extensions_account_address, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_hook_hello_world() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let recipient = Keypair::new(); + let ata_program = associated_token_program_id(); + let decimals: u8 = 2; + + // ExtraAccountMetaList PDA + let extra_account_meta_list = + get_hook_accounts_address(&mint_keypair.pubkey(), &program_id); + + // Step 1: Create mint with transfer hook extension pointing to our program + // (uses the program's own Initialize instruction, not kite, since it sets up + // the mint with the program as the hook authority) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::Initialize { + decimals, + } + .data(), + transfer_hook::accounts::InitializeAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Create ExtraAccountMetaList account + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { + payer: payer.pubkey(), + extra_account_meta_list, + mint: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: ata_program, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer with transfer hook + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint_keypair.pubkey(), + &program_id, + &[], // hello-world hook has no user-defined extra accounts + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint_keypair.pubkey(), + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); + svm.expire_blockhash(); + + // Step 5: Try calling transfer_hook directly (should fail - not transferring) + let direct_hook_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::TransferHook { amount: 1 }.data(), + transfer_hook::accounts::TransferHookAccountConstraints { + source_token: source_ata, + mint: mint_keypair.pubkey(), + destination_token: dest_ata, + owner: payer.pubkey(), + extra_account_meta_list, + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions(&mut svm, vec![direct_hook_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Calling transfer_hook directly should fail because token is not transferring" + ); +} diff --git a/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md b/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md index 5a6cbb8af..ce61425f7 100644 --- a/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/hello-world/anchor/README.md @@ -1,5 +1,11 @@ # Transfer Hook - Hello World (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Minimal transfer hook that runs custom logic on every token transfer. See also: the [repository catalog](../../../../../README.md). diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Anchor.toml new file mode 100644 index 000000000..f4be4351a --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_hook = "FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/README.md new file mode 100644 index 000000000..fa36e3bd8 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Transfer Hook - Transfer Cost (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Charge an additional fee on each transfer via hook logic. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Fee collection on transfer + +## Setup + +From this directory (`tokens/token-extensions/transfer-hook/transfer-cost/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Cargo.toml b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Cargo.toml new file mode 100644 index 000000000..53c6e80ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "transfer-hook" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_hook" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = "1.1.2" +anchor-spl = "1.1.2" +# SPL crates v3.x-compatible - uses solana-program-error 3.x matching anchor-lang 1.0 +spl-discriminator = "0.5.2" +spl-tlv-account-resolution = "0.11.1" +spl-transfer-hook-interface = "2.1.0" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Xargo.toml b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs new file mode 100644 index 000000000..d19d662fe --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{handle_extra_account_metas, handle_extra_account_metas_count, CounterAccount}; + +#[derive(Accounts)] +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// CHECK: ExtraAccountMetaList Account, must use these seeds + #[account( + init, + seeds = [b"extra-account-metas", mint.key().as_ref()], + bump, + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input + space = ExtraAccountMetaList::size_of( + handle_extra_account_metas_count() + ).unwrap(), + payer = payer + )] + pub extra_account_meta_list: UncheckedAccount<'info>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(init, seeds = [b"counter"], bump, payer = payer, space = CounterAccount::DISCRIMINATOR.len() + CounterAccount::INIT_SPACE)] + pub counter_account: Account<'info, CounterAccount>, + pub system_program: Program<'info, System>, +} + +pub fn handler(mut context: Context) -> Result<()> { + let extra_account_metas = handle_extra_account_metas()?; + + // initialize ExtraAccountMetaList account with extra accounts + ExtraAccountMetaList::init::( + &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, + &extra_account_metas, + ) + .map_err(|_| ProgramError::InvalidAccountData)?; + + context.accounts.counter_account.bump = context.bumps.counter_account; + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/mod.rs new file mode 100644 index 000000000..541fb4b7f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod initialize_extra_account_meta_list; +pub mod transfer_hook; + +pub use initialize_extra_account_meta_list::*; +pub use transfer_hook::*; diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs new file mode 100644 index 000000000..c7f5b9ec1 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -0,0 +1,103 @@ +use anchor_lang::prelude::*; +use anchor_spl::{ + associated_token::AssociatedToken, + token::Token, + token_interface::{transfer_checked, Mint, TokenAccount, TransferChecked}, +}; + +use crate::{check_is_transferring, CounterAccount, TransferError}; + +// Order of accounts matters for this struct. +// The first 4 accounts are the accounts required for token transfer (source, mint, destination, owner) +// Remaining accounts are the extra accounts required from the ExtraAccountMetaList account +// These accounts are provided via CPI to this program from the token2022 program +// +// Box used for source_token, destination_token, wsol_mint, +// delegate_wsol_token_account, and sender_wsol_token_account to avoid exceeding +// the 4096-byte BPF stack frame limit in try_accounts deserialization. +// This struct has 12 accounts - without Box, the generated code uses ~4160 bytes of stack. +#[derive(Accounts)] +pub struct TransferHookAccountConstraints<'info> { + #[account(token::mint = mint, token::authority = owner)] + pub source_token: Box>, + pub mint: Box>, + #[account(token::mint = mint)] + pub destination_token: Box>, + /// CHECK: source token account owner, can be SystemAccount or PDA owned by another program + pub owner: UncheckedAccount<'info>, + /// CHECK: ExtraAccountMetaList Account, + #[account(seeds = [b"extra-account-metas", mint.key().as_ref()], bump)] + pub extra_account_meta_list: UncheckedAccount<'info>, + pub wsol_mint: Box>, + pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, + #[account( + mut, + seeds = [b"delegate"], + bump + )] + pub delegate: SystemAccount<'info>, + #[account( + mut, + token::mint = wsol_mint, + token::authority = delegate, + )] + pub delegate_wsol_token_account: Box>, + #[account( + mut, + token::mint = wsol_mint, + token::authority = owner, + )] + pub sender_wsol_token_account: Box>, + #[account(seeds = [b"counter"], bump)] + pub counter_account: Account<'info, CounterAccount>, +} + +pub fn handler(context: Context, amount: u64) -> Result<()> { + // Fail this instruction if it is not called from within a transfer hook + check_is_transferring(&context)?; + + if amount > 50 { + msg!("The amount is too big {0}", amount); + } + + context.accounts.counter_account.counter += 1; + + msg!( + "This token has been transferred {0} times", + context.accounts.counter_account.counter + ); + + msg!( + "Is writable mint {0}", + context.accounts.mint.to_account_info().is_writable + ); + msg!( + "Is destination mint {0}", + context.accounts.destination_token.to_account_info().is_writable + ); + msg!( + "Is source mint {0}", + context.accounts.source_token.to_account_info().is_writable + ); + + let signer_seeds: &[&[&[u8]]] = &[&[b"delegate", &[context.bumps.delegate]]]; + + // Transfer WSOL from sender to delegate token account using delegate PDA + // transfer lamports amount equal to token transfer amount + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.sender_wsol_token_account.to_account_info(), + mint: context.accounts.wsol_mint.to_account_info(), + to: context.accounts.delegate_wsol_token_account.to_account_info(), + authority: context.accounts.delegate.to_account_info(), + }, + ) + .with_signer(signer_seeds), + amount, + context.accounts.wsol_mint.decimals, + )?; + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/lib.rs new file mode 100644 index 000000000..7c17b8ecb --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/src/lib.rs @@ -0,0 +1,149 @@ +use anchor_lang::{prelude::*, solana_program::pubkey::Pubkey}; +use anchor_spl::{ + associated_token::AssociatedToken, + token::Token, + token_2022::spl_token_2022::{ + extension::{ + transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, + PodStateWithExtensionsMut, + }, + pod::PodAccount, + }, + token_interface::Mint, +}; +use spl_discriminator::SplDiscriminate; +use spl_tlv_account_resolution::{ + account::ExtraAccountMeta, seeds::Seed, state::ExtraAccountMetaList, +}; +use spl_transfer_hook_interface::instruction::{ + ExecuteInstruction, InitializeExtraAccountMetaListInstruction, +}; +use std::{cell::RefMut, str::FromStr}; + +// transfer-hook program that charges a SOL fee on token transfer +// use a delegate and wrapped SOL because signers from initial transfer are not accessible + +mod instructions; +use instructions::*; + +declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); + +#[error_code] +pub enum TransferError { + #[msg("Amount Too big")] + AmountTooBig, + #[msg("The token is not currently transferring")] + IsNotCurrentlyTransferring, +} + +#[program] +pub mod transfer_hook { + use super::*; + + #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn initialize_extra_account_meta_list( + context: Context, + ) -> Result<()> { + instructions::initialize_extra_account_meta_list::handler(context) + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + instructions::transfer_hook::handler(context, amount) + } +} + +pub fn check_is_transferring(context: &Context) -> Result<()> { + let source_token_info = context.accounts.source_token.to_account_info(); + let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; + let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) + .map_err(|_| ProgramError::InvalidAccountData)?; + let account_extension = account + .get_extension_mut::() + .map_err(|_| ProgramError::InvalidAccountData)?; + + if !bool::from(account_extension.transferring) { + return err!(TransferError::IsNotCurrentlyTransferring); + } + + Ok(()) +} + +// Define extra account metas to store on extra_account_meta_list account +pub fn handle_extra_account_metas() -> Result> { + // When the token2022 program CPIs to the transfer_hook instruction on this program, + // the accounts are provided in order defined specified the list: + + // index 0-3 are the accounts required for token transfer (source, mint, destination, owner) + // index 4 is address of ExtraAccountMetaList account + + let wsol_mint = Pubkey::from_str("So11111111111111111111111111111111111111112").unwrap(); + let token_program_id = Token::id(); + let ata_program_id = AssociatedToken::id(); + + Ok(vec![ + // index 5, wrapped SOL mint + ExtraAccountMeta::new_with_pubkey(&wsol_mint, false, false) + .map_err(|_| ProgramError::InvalidArgument)?, + // index 6, token program (for wsol token transfer) + ExtraAccountMeta::new_with_pubkey(&token_program_id, false, false) + .map_err(|_| ProgramError::InvalidArgument)?, + // index 7, associated token program + ExtraAccountMeta::new_with_pubkey(&ata_program_id, false, false) + .map_err(|_| ProgramError::InvalidArgument)?, + // index 8, delegate PDA + ExtraAccountMeta::new_with_seeds( + &[Seed::Literal { + bytes: b"delegate".to_vec(), + }], + false, // is_signer + true, // is_writable + ) + .map_err(|_| ProgramError::InvalidArgument)?, + // index 9, delegate wrapped SOL token account + ExtraAccountMeta::new_external_pda_with_seeds( + 7, // associated token program index + &[ + Seed::AccountKey { index: 8 }, // owner index (delegate PDA) + Seed::AccountKey { index: 6 }, // token program index + Seed::AccountKey { index: 5 }, // wsol mint index + ], + false, // is_signer + true, // is_writable + ) + .map_err(|_| ProgramError::InvalidArgument)?, + // index 10, sender wrapped SOL token account + ExtraAccountMeta::new_external_pda_with_seeds( + 7, // associated token program index + &[ + Seed::AccountKey { index: 3 }, // owner index + Seed::AccountKey { index: 6 }, // token program index + Seed::AccountKey { index: 5 }, // wsol mint index + ], + false, // is_signer + true, // is_writable + ) + .map_err(|_| ProgramError::InvalidArgument)?, + ExtraAccountMeta::new_with_seeds( + &[Seed::Literal { + bytes: b"counter".to_vec(), + }], + false, // is_signer + true, // is_writable + ) + .map_err(|_| ProgramError::InvalidArgument)?, + ]) +} + +/// Returns the count of extra account metas (avoids the error conversion issue in #[account] attributes) +pub fn handle_extra_account_metas_count() -> usize { + 7 // wsol_mint, token_program, ata_program, delegate, delegate_wsol, sender_wsol, counter +} + +#[account] +#[derive(InitSpace)] +pub struct CounterAccount { + pub counter: u8, + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..3912dd921 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,84 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_mint, MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::get_hook_accounts_address, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_initialize_extra_account_meta_list() { + let (mut svm, program_id, payer) = setup(); + let decimals: u8 = 9; + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + // PDAs + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + let (counter_pda, _) = Pubkey::find_program_address(&[b"counter"], &program_id); + + // Step 2: Initialize ExtraAccountMetaList (also creates counter PDA) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + counter_account: counter_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify the ExtraAccountMetaList account was created + let account = svm.get_account(&extra_account_meta_list); + assert!( + account.is_some(), + "ExtraAccountMetaList account should exist after initialization" + ); + + // Verify the counter account was created + let counter = svm.get_account(&counter_pda); + assert!( + counter.is_some(), + "Counter account should exist after initialization" + ); +} diff --git a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md index 8c082fd08..aa5f03a98 100644 --- a/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/transfer-cost/anchor/README.md @@ -1,5 +1,11 @@ # Transfer Hook - Transfer Cost (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Charge an additional fee on each transfer via hook logic. See also: the [repository catalog](../../../../../README.md). diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Anchor.toml new file mode 100644 index 000000000..eabc93dc2 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_switch = "FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/README.md new file mode 100644 index 000000000..648dbd698 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/README.md @@ -0,0 +1,40 @@ +# Transfer Hook - Transfer Switch (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Enable or disable transfers globally with onchain switch state. + +See also: the [repository catalog](../../../../../README.md). + +## Major concepts + +- Transfer hook +- Admin-controlled switch + +## Setup + +From this directory (`tokens/token-extensions/transfer-hook/transfer-switch/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Cargo.toml b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Cargo.toml new file mode 100644 index 000000000..bc41fd69c --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "transfer-switch" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_switch" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" +spl-discriminator = "0.4.1" +spl-tlv-account-resolution = "0.9.0" +spl-transfer-hook-interface = "0.9.0" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Xargo.toml b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/error.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/error.rs new file mode 100644 index 000000000..444f8ab1b --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/error.rs @@ -0,0 +1,10 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum TransferError { + #[msg("The token is not currently transferring")] + IsNotCurrentlyTransferring, + + #[msg("The transfer switch is currently not on")] + SwitchNotOn, +} diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/configure_admin.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/configure_admin.rs new file mode 100644 index 000000000..b9fc5800e --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/configure_admin.rs @@ -0,0 +1,49 @@ +use {crate::state::AdminConfig, anchor_lang::prelude::*}; + +#[derive(Accounts)] +pub struct ConfigureAdminAccountConstraints<'info> { + #[account(mut)] + pub admin: Signer<'info>, + + /// CHECK: the new admin + #[account(mut)] + pub new_admin: UncheckedAccount<'info>, + + /// To hold the address of the admin that controls switches + #[account( + init_if_needed, + payer=admin, + space = AdminConfig::DISCRIMINATOR.len() + AdminConfig::INIT_SPACE, + seeds = [b"admin-config"], + bump + )] + pub admin_config: Account<'info, AdminConfig>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_is_admin(accounts: &mut ConfigureAdminAccountConstraints) -> Result<()> { + // check if we are not creating the account for the first time, + // ensure it's the admin that is making the change + // + if accounts.admin_config.is_initialised { + // make sure it's the admin + // + require_keys_eq!(accounts.admin.key(), accounts.admin_config.admin,); + + // make sure the admin is not reentering their key + // + require_keys_neq!(accounts.admin.key(), accounts.new_admin.key()); + } + Ok(()) + } + +pub fn handle_configure_admin(accounts: &mut ConfigureAdminAccountConstraints, bump: u8) -> Result<()> { + accounts.admin_config.set_inner(AdminConfig { + admin: accounts.new_admin.key(), // set the admin pubkey that can switch transfers on/off + is_initialised: true, // let us know an admin has been set + bump, // canonical bump for the admin-config PDA + }); + Ok(()) + } + diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs new file mode 100644 index 000000000..e97028e60 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/initialise_extra_account_metas_list.rs @@ -0,0 +1,82 @@ +use { + anchor_lang::{ + prelude::*, + system_program::{create_account, CreateAccount}, + }, + anchor_spl::token_interface::Mint, + spl_tlv_account_resolution::{ + account::ExtraAccountMeta, seeds::Seed, state::ExtraAccountMetaList, + }, + spl_transfer_hook_interface::instruction::ExecuteInstruction, +}; + +#[derive(Accounts)] +pub struct InitializeExtraAccountMetasAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account()] + pub token_mint: InterfaceAccount<'info, Mint>, + + /// CHECK: extra accoumt metas list + #[account( + mut, + seeds = [b"extra-account-metas", token_mint.key().as_ref()], + bump, + )] + pub extra_account_metas_list: UncheckedAccount<'info>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_initialize_extra_account_metas_list(accounts: &mut InitializeExtraAccountMetasAccountConstraints, bumps: InitializeExtraAccountMetasAccountConstraintsBumps) -> Result<()> { + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + let account_metas = vec![ + // 5 - wallet (sender) config account + ExtraAccountMeta::new_with_seeds( + &[ + Seed::AccountKey { index: 3 }, // sender index + ], + false, // is_signer + false, // is_writable + ).map_err(|_| ProgramError::InvalidArgument)?, + ]; + + // calculate account size + // unwrap is safe for known-good input (count of metas we just created) + let account_size = ExtraAccountMetaList::size_of(account_metas.len()).unwrap() as u64; + + // calculate minimum required lamports + let lamports = Rent::get()?.minimum_balance(account_size as usize); + + let mint = accounts.token_mint.key(); + let signer_seeds: &[&[&[u8]]] = &[&[ + b"extra-account-metas", + mint.as_ref(), + &[bumps.extra_account_metas_list], + ]]; + + create_account( + CpiContext::new( + accounts.system_program.key(), + CreateAccount { + from: accounts.payer.to_account_info(), + to: accounts.extra_account_metas_list.to_account_info(), + }, + ) + .with_signer(signer_seeds), + lamports, + account_size, + &crate::ID, + )?; + + // Initialize the account data to store the list of ExtraAccountMetas + ExtraAccountMetaList::init::( + &mut accounts.extra_account_metas_list.try_borrow_mut_data()?, + &account_metas, + ).map_err(|_| ProgramError::InvalidAccountData)?; + + Ok(()) + } + diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/mod.rs new file mode 100644 index 000000000..39a3f9363 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/mod.rs @@ -0,0 +1,9 @@ +pub mod configure_admin; +pub mod initialise_extra_account_metas_list; +pub mod switch; +pub mod transfer_hook; + +pub use configure_admin::*; +pub use initialise_extra_account_metas_list::*; +pub use switch::*; +pub use transfer_hook::*; diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/switch.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/switch.rs new file mode 100644 index 000000000..f33d67d3b --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/switch.rs @@ -0,0 +1,54 @@ +use { + crate::state::{AdminConfig, TransferSwitch}, + anchor_lang::prelude::*, +}; + +#[derive(Accounts)] +pub struct SwitchAccountConstraints<'info> { + /// admin that controls the switch + #[account(mut)] + pub admin: Signer<'info>, + + /// CHECK: wallet - transfer sender + #[account(mut)] + pub wallet: UncheckedAccount<'info>, + + /// admin config + #[account( + has_one=admin, + seeds=[b"admin-config"], + bump, + )] + pub admin_config: Account<'info, AdminConfig>, + + /// the wallet (sender) transfer switch + #[account( + init_if_needed, + payer=admin, + space = TransferSwitch::DISCRIMINATOR.len() + TransferSwitch::INIT_SPACE, + seeds = [wallet.key().as_ref()], + bump, + )] + pub wallet_switch: Account<'info, TransferSwitch>, + + pub system_program: Program<'info, System>, +} + +pub fn handle_switch(accounts: &mut SwitchAccountConstraints, on: bool, bump: u8) -> Result<()> { + // toggle switch on/off for the given wallet + // + accounts.wallet_switch.set_inner(TransferSwitch { + wallet: accounts.wallet.key(), + on, + bump, // canonical bump for this wallet's PDA + }); + Ok(()) + } + +// admin_config is validated via `seeds=[b"admin-config"], bump` - Anchor +// re-derives it and fails if it doesn't match, so storing AdminConfig.bump +// isn't strictly needed to validate `admin_config` inside `Switch` (the +// bump field on AdminConfig is still populated on creation to satisfy the +// 'every PDA struct stores its bump' rule and save derivation cost in any +// future call sites). + diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/transfer_hook.rs new file mode 100644 index 000000000..c35671596 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/instructions/transfer_hook.rs @@ -0,0 +1,72 @@ +use { + crate::{error::TransferError, state::TransferSwitch}, + anchor_lang::prelude::*, + anchor_spl::{ + token_2022::spl_token_2022::{ + extension::{ + transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, + PodStateWithExtensionsMut, + }, + pod::PodAccount, + }, + token_interface::Mint, + }, +}; + +#[derive(Accounts)] +pub struct TransferHookAccountConstraints<'info> { + /// CHECK: Sender token account + #[account()] + pub source_token_account: UncheckedAccount<'info>, + + /// The mint of the token transferring + #[account()] + pub token_mint: InterfaceAccount<'info, Mint>, + + /// CHECK: Recipient token account + #[account()] + pub receiver_token_account: UncheckedAccount<'info>, + + /// CHECK: the transfer sender + #[account()] + pub wallet: UncheckedAccount<'info>, + + /// CHECK: extra account metas + #[account( + seeds = [b"extra-account-metas", token_mint.key().as_ref()], + bump, + )] + pub extra_account_metas_list: UncheckedAccount<'info>, + + /// sender transfer switch + #[account( + seeds=[wallet.key().as_ref()], + bump, + )] + pub wallet_switch: Account<'info, TransferSwitch>, +} + +pub fn handle_assert_switch_is_on(accounts: &mut TransferHookAccountConstraints) -> Result<()> { + if !accounts.wallet_switch.on { + return err!(TransferError::SwitchNotOn); + } + Ok(()) + } + +pub fn handle_assert_is_transferring(accounts: &mut TransferHookAccountConstraints) -> Result<()> { + let source_token_info = accounts.source_token_account.to_account_info(); + let mut account_data_ref = source_token_info.try_borrow_mut_data()?; + // .map_err() needed because spl-token-2022 uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) + .map_err(|_| ProgramError::InvalidAccountData)?; + let account_extension = account.get_extension_mut::() + .map_err(|_| ProgramError::InvalidAccountData)?; + + if !bool::from(account_extension.transferring) { + return err!(TransferError::IsNotCurrentlyTransferring); + } + + Ok(()) + } + diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/lib.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/lib.rs new file mode 100644 index 000000000..c392c703c --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/lib.rs @@ -0,0 +1,41 @@ +mod error; +mod instructions; +mod state; + +use anchor_lang::prelude::*; +use instructions::*; +use spl_discriminator::SplDiscriminate; +use spl_transfer_hook_interface::instruction::{ + ExecuteInstruction, InitializeExtraAccountMetaListInstruction, +}; + +declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); + +#[program] +pub mod transfer_switch { + use super::*; + + pub fn configure_admin(mut context: Context) -> Result<()> { + let bump = context.bumps.admin_config; + handle_is_admin(&mut context.accounts)?; + handle_configure_admin(&mut context.accounts, bump) + } + + #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn initialize_extra_account_metas_list( + mut context: Context, + ) -> Result<()> { + handle_initialize_extra_account_metas_list(&mut context.accounts, context.bumps) + } + + pub fn switch(mut context: Context, on: bool) -> Result<()> { + let bump = context.bumps.wallet_switch; + handle_switch(&mut context.accounts, on, bump) + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn transfer_hook(mut context: Context, _amount: u64) -> Result<()> { + handle_assert_is_transferring(&mut context.accounts)?; + handle_assert_switch_is_on(&mut context.accounts) + } +} diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/state.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/state.rs new file mode 100644 index 000000000..3bbcddd12 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/src/state.rs @@ -0,0 +1,19 @@ +use anchor_lang::prelude::*; + +#[account] +#[derive(InitSpace)] +pub struct TransferSwitch { + pub wallet: Pubkey, + pub on: bool, + /// Canonical bump for this PDA. + pub bump: u8, +} + +#[account] +#[derive(InitSpace)] +pub struct AdminConfig { + pub is_initialised: bool, + pub admin: Pubkey, + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/tests/test_transfer_switch.rs b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/tests/test_transfer_switch.rs new file mode 100644 index 000000000..5696596ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor-v1/programs/transfer-switch/tests/test_transfer_switch.rs @@ -0,0 +1,190 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_switch::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_switch.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_switch() { + let (mut svm, program_id, payer) = setup(); + let sender = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let recipient = Keypair::new(); + let decimals: u8 = 9; + + // Derive PDAs + let (admin_config, _) = Pubkey::find_program_address(&[b"admin-config"], &program_id); + let (sender_switch, _) = + Pubkey::find_program_address(&[sender.pubkey().as_ref()], &program_id); + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &sender.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Configure admin + let configure_admin_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::ConfigureAdmin {}.data(), + transfer_switch::accounts::ConfigureAdminAccountConstraints { + admin: payer.pubkey(), + new_admin: payer.pubkey(), + admin_config, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![configure_admin_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Initialize extra account metas list + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::InitializeExtraAccountMetasList {}.data(), + transfer_switch::accounts::InitializeExtraAccountMetasAccountConstraints { + payer: payer.pubkey(), + token_mint: mint, + extra_account_metas_list: extra_account_meta_list, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Turn transfers OFF for sender + let switch_off_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::Switch { on: false }.data(), + transfer_switch::accounts::SwitchAccountConstraints { + admin: payer.pubkey(), + wallet: sender.pubkey(), + admin_config, + wallet_switch: sender_switch, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![switch_off_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 6: Try transfer - should FAIL (switch is off) + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: sender_switch, + is_signer: false, + is_writable: false, + }], + ); + let result = transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &sender, + transfer_amount, + decimals, + &extra_accounts, + ); + assert!( + result.is_err(), + "Transfer should fail when switch is off" + ); + svm.expire_blockhash(); + + // Step 7: Turn transfers ON for sender + let switch_on_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::Switch { on: true }.data(), + transfer_switch::accounts::SwitchAccountConstraints { + admin: payer.pubkey(), + wallet: sender.pubkey(), + admin_config, + wallet_switch: sender_switch, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![switch_on_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 8: Transfer - should SUCCEED (switch is on) + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &sender, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); +} diff --git a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md index 036eeb342..1986271d9 100644 --- a/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/transfer-switch/anchor/README.md @@ -1,5 +1,11 @@ # Transfer Hook - Transfer Switch (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Enable or disable transfers globally with onchain switch state. See also: the [repository catalog](../../../../../README.md). diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.gitignore b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.gitignore new file mode 100644 index 000000000..8d401163f --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.prettierignore b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.prettierignore new file mode 100644 index 000000000..c1a0b75f0 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Anchor.toml b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Anchor.toml new file mode 100644 index 000000000..4754ca4f5 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Anchor.toml @@ -0,0 +1,23 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +seeds = false +skip-lint = false + +[programs.localnet] +transfer_hook = "DrWbQtYJGtsoRwzKqAbHKHKsCJJfpysudF39GBVFSxub" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +# Transfer-hook tests use the real local validator (not bankrun). +# No external program clones needed - this project doesn't use Metaplex. +# The previous [[test.validator.clone]] of metaplex was unnecessary and +# caused 5-minute timeouts in CI trying to fetch from devnet. diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Cargo.toml b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/README.md new file mode 100644 index 000000000..0af4b8873 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/README.md @@ -0,0 +1,11 @@ +# Transfer Hook - Whitelist (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +A whitelist enforced by a [Token Extensions](https://solana.com/docs/terminology#token-extensions-program) transfer hook. The whitelist is stored inline on a single [account](https://solana.com/docs/terminology#account). + +This approach doesn't scale: the whitelist eventually runs out of account space. For larger lists, store entries in external [PDAs](https://solana.com/docs/terminology#program-derived-address-pda) (one PDA per whitelisted wallet) - see the [`block-list`](../../block-list/) example for that pattern. diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Cargo.toml b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Cargo.toml new file mode 100644 index 000000000..57df243ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "transfer-hook" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_hook" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = "1.1.2" +spl-discriminator = "0.4.1" +spl-tlv-account-resolution = "0.9.0" +spl-transfer-hook-interface = "0.9.0" + +[dev-dependencies] +litesvm = "0.13.1" +solana-kite = "0.4.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Xargo.toml b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/add_to_whitelist.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/add_to_whitelist.rs new file mode 100644 index 000000000..86e100ef5 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/add_to_whitelist.rs @@ -0,0 +1,39 @@ +use anchor_lang::prelude::*; + +use crate::WhiteList; + +#[derive(Accounts)] +pub struct AddToWhiteListAccountConstraints<'info> { + /// CHECK: New account to add to white list + #[account()] + pub new_account: UncheckedAccount<'info>, + #[account( + mut, + seeds = [b"white_list"], + bump + )] + pub white_list: Account<'info, WhiteList>, + #[account(mut)] + pub signer: Signer<'info>, +} + +pub fn handler(context: Context) -> Result<()> { + if context.accounts.white_list.authority != context.accounts.signer.key() { + panic!("Only the authority can add to the white list!"); + } + + context.accounts + .white_list + .white_list + .push(context.accounts.new_account.key()); + msg!( + "New account white listed! {0}", + context.accounts.new_account.key().to_string() + ); + msg!( + "White list length! {0}", + context.accounts.white_list.white_list.len() + ); + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs new file mode 100644 index 000000000..a8c5f6def --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/initialize_extra_account_meta_list.rs @@ -0,0 +1,46 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::Mint; +use spl_tlv_account_resolution::state::ExtraAccountMetaList; +use spl_transfer_hook_interface::instruction::ExecuteInstruction; + +use crate::{handle_extra_account_metas, handle_extra_account_metas_count, WhiteList}; + +#[derive(Accounts)] +pub struct InitializeExtraAccountMetaListAccountConstraints<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// CHECK: ExtraAccountMetaList Account, must use these seeds + #[account( + init, + seeds = [b"extra-account-metas", mint.key().as_ref()], + bump, + // size_of returns Result with spl's ProgramError - unwrap is safe for known-good input + space = ExtraAccountMetaList::size_of( + handle_extra_account_metas_count() + ).unwrap(), + payer = payer + )] + pub extra_account_meta_list: UncheckedAccount<'info>, + pub mint: InterfaceAccount<'info, Mint>, + pub system_program: Program<'info, System>, + #[account(init_if_needed, seeds = [b"white_list"], bump, payer = payer, space = WhiteList::DISCRIMINATOR.len() + WhiteList::INIT_SPACE)] + pub white_list: Account<'info, WhiteList>, +} + +pub fn handler(mut context: Context) -> Result<()> { + // set authority field on white_list account as payer address + context.accounts.white_list.authority = context.accounts.payer.key(); + context.accounts.white_list.bump = context.bumps.white_list; + + let extra_account_metas = handle_extra_account_metas()?; + + // initialize ExtraAccountMetaList account with extra accounts + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + ExtraAccountMetaList::init::( + &mut context.accounts.extra_account_meta_list.try_borrow_mut_data()?, + &extra_account_metas, + ).map_err(|_| ProgramError::InvalidAccountData)?; + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/mod.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/mod.rs new file mode 100644 index 000000000..9608cbc21 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/mod.rs @@ -0,0 +1,7 @@ +pub mod add_to_whitelist; +pub mod initialize_extra_account_meta_list; +pub mod transfer_hook; + +pub use add_to_whitelist::*; +pub use initialize_extra_account_meta_list::*; +pub use transfer_hook::*; diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs new file mode 100644 index 000000000..d0279a605 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/instructions/transfer_hook.rs @@ -0,0 +1,42 @@ +use anchor_lang::prelude::*; +use anchor_spl::token_interface::{Mint, TokenAccount}; + +use crate::{check_is_transferring, WhiteList}; + +// Order of accounts matters for this struct. +// The first 4 accounts are the accounts required for token transfer (source, mint, destination, owner) +// Remaining accounts are the extra accounts required from the ExtraAccountMetaList account +// These accounts are provided via CPI to this program from the token2022 program +#[derive(Accounts)] +pub struct TransferHookAccountConstraints<'info> { + #[account(token::mint = mint, token::authority = owner)] + pub source_token: InterfaceAccount<'info, TokenAccount>, + pub mint: InterfaceAccount<'info, Mint>, + #[account(token::mint = mint)] + pub destination_token: InterfaceAccount<'info, TokenAccount>, + /// CHECK: source token account owner, can be SystemAccount or PDA owned by another program + pub owner: UncheckedAccount<'info>, + /// CHECK: ExtraAccountMetaList Account, + #[account(seeds = [b"extra-account-metas", mint.key().as_ref()], bump)] + pub extra_account_meta_list: UncheckedAccount<'info>, + #[account(seeds = [b"white_list"], bump)] + pub white_list: Account<'info, WhiteList>, +} + +pub fn handler(context: Context, _amount: u64) -> Result<()> { + // Fail this instruction if it is not called from within a transfer hook + check_is_transferring(&context)?; + + if !context + .accounts + .white_list + .white_list + .contains(&context.accounts.destination_token.key()) + { + panic!("Account not in white list!"); + } + + msg!("Account in white list, all good!"); + + Ok(()) +} diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/lib.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/lib.rs new file mode 100644 index 000000000..08089435b --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/src/lib.rs @@ -0,0 +1,92 @@ +use std::cell::RefMut; + +use anchor_lang::prelude::*; +use anchor_spl::token_2022::spl_token_2022::{ + extension::{ + transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, + PodStateWithExtensionsMut, + }, + pod::PodAccount, +}; +use spl_tlv_account_resolution::{account::ExtraAccountMeta, seeds::Seed}; +use spl_discriminator::SplDiscriminate; +use spl_transfer_hook_interface::instruction::{ + ExecuteInstruction, InitializeExtraAccountMetaListInstruction, +}; + +mod instructions; +use instructions::*; + +declare_id!("DrWbQtYJGtsoRwzKqAbHKHKsCJJfpysudF39GBVFSxub"); + +#[error_code] +pub enum TransferError { + #[msg("The token is not currently transferring")] + IsNotCurrentlyTransferring, +} + +#[program] +pub mod transfer_hook { + use super::*; + + #[instruction(discriminator = InitializeExtraAccountMetaListInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn initialize_extra_account_meta_list( + context: Context, + ) -> Result<()> { + instructions::initialize_extra_account_meta_list::handler(context) + } + + #[instruction(discriminator = ExecuteInstruction::SPL_DISCRIMINATOR_SLICE)] + pub fn transfer_hook(context: Context, amount: u64) -> Result<()> { + instructions::transfer_hook::handler(context, amount) + } + + pub fn add_to_whitelist(context: Context) -> Result<()> { + instructions::add_to_whitelist::handler(context) + } +} + +pub fn check_is_transferring(context: &Context) -> Result<()> { + let source_token_info = context.accounts.source_token.to_account_info(); + let mut account_data_ref: RefMut<&mut [u8]> = source_token_info.try_borrow_mut_data()?; + // .map_err() needed because spl-token-2022 uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + let mut account = PodStateWithExtensionsMut::::unpack(*account_data_ref) + .map_err(|_| ProgramError::InvalidAccountData)?; + let account_extension = account.get_extension_mut::() + .map_err(|_| ProgramError::InvalidAccountData)?; + + if !bool::from(account_extension.transferring) { + return err!(TransferError::IsNotCurrentlyTransferring); + } + + Ok(()) +} + +// Define extra account metas to store on extra_account_meta_list account +pub fn handle_extra_account_metas() -> Result> { + // .map_err() needed because spl-tlv-account-resolution uses solana-program-error 2.x + // while anchor-lang 1.0 uses 3.x - structurally identical but different semver types + Ok(vec![ExtraAccountMeta::new_with_seeds( + &[Seed::Literal { + bytes: "white_list".as_bytes().to_vec(), + }], + false, // is_signer + true, // is_writable + ).map_err(|_| ProgramError::InvalidArgument)?]) +} + +/// Returns the count of extra account metas (avoids the error conversion issue in #[account] attributes) +pub fn handle_extra_account_metas_count() -> usize { + 1 // one extra account: the whitelist PDA +} + +#[account] +#[derive(InitSpace)] +pub struct WhiteList { + pub authority: Pubkey, + #[max_len(11)] + pub white_list: Vec, + /// Canonical bump for this PDA. + pub bump: u8, +} diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..8911293e8 --- /dev/null +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor-v1/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,138 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_whitelist_transfer_hook() { + let (mut svm, program_id, payer) = setup(); + let recipient = Keypair::new(); + let decimals: u8 = 9; + + // Derive PDAs + let (white_list_pda, _) = Pubkey::find_program_address(&[b"white_list"], &program_id); + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Initialize ExtraAccountMetaList (also creates whitelist) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaListAccountConstraints { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + system_program: system_program::id(), + white_list: white_list_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Add destination token account to whitelist + let add_to_whitelist_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::AddToWhitelist {}.data(), + transfer_hook::accounts::AddToWhiteListAccountConstraints { + new_account: dest_ata, + white_list: white_list_pda, + signer: payer.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![add_to_whitelist_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Transfer - should succeed (destination is whitelisted) + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: white_list_pda, + is_signer: false, + is_writable: true, + }], + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); +} diff --git a/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md b/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md index 36946b192..ad01690d8 100644 --- a/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/whitelist/anchor/README.md @@ -1,5 +1,11 @@ # Transfer Hook - Whitelist (Anchor) +> [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + A whitelist enforced by a [Token Extensions](https://solana.com/docs/terminology#token-extensions-program) transfer hook. The whitelist is stored inline on a single [account](https://solana.com/docs/terminology#account). This approach doesn't scale: the whitelist eventually runs out of account space. For larger lists, store entries in external [PDAs](https://solana.com/docs/terminology#program-derived-address-pda) (one PDA per whitelisted wallet) - see the [`block-list`](../../block-list/) example for that pattern. diff --git a/tokens/token-minter/anchor-v1/Anchor.toml b/tokens/token-minter/anchor-v1/Anchor.toml new file mode 100644 index 000000000..980e7d3a2 --- /dev/null +++ b/tokens/token-minter/anchor-v1/Anchor.toml @@ -0,0 +1,20 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +token_minter = "3of89Z9jwek9zrFgpCWc9jZvQvitpVMxpZNsrAD2vQUD" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# Rust + LiteSVM tests; Metaplex Token Metadata is loaded from a local +# fixture (tests/fixtures/mpl_token_metadata.so), no validator needed. +test = "cargo test" diff --git a/tokens/token-minter/anchor-v1/CHANGELOG.md b/tokens/token-minter/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/token-minter/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/token-minter/anchor-v1/Cargo.toml b/tokens/token-minter/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/token-minter/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/token-minter/anchor-v1/README.md b/tokens/token-minter/anchor-v1/README.md new file mode 100644 index 000000000..543d81655 --- /dev/null +++ b/tokens/token-minter/anchor-v1/README.md @@ -0,0 +1,41 @@ +# Token Minter (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Mint tokens from inside your program using the [Classic Token Program](https://solana.com/docs/terminology#token-program). + +See also: [Token Minter overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Mint authority on a PDA or signer +- Token account initialization +- Amounts: `mint_token` takes `amount` in **minor units**, the raw integer the token program operates on. Clients convert from major units offchain: 1 token with 9 decimals is `1 * 10^9` minor units. The program never scales amounts onchain. + +## Setup + +From this directory (`tokens/token-minter/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/token-minter/anchor-v1/prepare.mjs b/tokens/token-minter/anchor-v1/prepare.mjs new file mode 100644 index 000000000..fb6b26225 --- /dev/null +++ b/tokens/token-minter/anchor-v1/prepare.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/Cargo.toml b/tokens/token-minter/anchor-v1/programs/token-minter/Cargo.toml new file mode 100644 index 000000000..aabe1312a --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "token-minter" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "token_minter" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/Xargo.toml b/tokens/token-minter/anchor-v1/programs/token-minter/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/create.rs b/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/create.rs new file mode 100644 index 000000000..95be34e0d --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/create.rs @@ -0,0 +1,81 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + metadata::{ + create_metadata_accounts_v3, mpl_token_metadata::types::DataV2, + CreateMetadataAccountsV3, Metadata, + }, + token::{Mint, Token}, + }, +}; + +#[derive(Accounts)] +pub struct CreateTokenAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::decimals = 9, + mint::authority = payer.key(), + mint::freeze_authority = payer.key(), + + )] + pub mint_account: Account<'info, Mint>, + /// CHECK: Validate address by deriving pda + #[account( + mut, + seeds = [b"metadata", token_metadata_program.key().as_ref(), mint_account.key().as_ref()], + bump, + seeds::program = token_metadata_program.key(), + )] + pub metadata_account: UncheckedAccount<'info>, + + pub token_program: Program<'info, Token>, + pub token_metadata_program: Program<'info, Metadata>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, +} + +pub fn handle_create_token( + context: Context, + token_name: String, + token_symbol: String, + token_uri: String, +) -> Result<()> { + msg!("Creating metadata account"); + + // Cross Program Invocation (CPI) + // Invoking the create_metadata_account_v3 instruction on the token metadata program + create_metadata_accounts_v3( + CpiContext::new( + context.accounts.token_metadata_program.key(), + CreateMetadataAccountsV3 { + metadata: context.accounts.metadata_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + mint_authority: context.accounts.payer.to_account_info(), + update_authority: context.accounts.payer.to_account_info(), + payer: context.accounts.payer.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + rent: context.accounts.rent.to_account_info(), + }, + ), + DataV2 { + name: token_name, + symbol: token_symbol, + uri: token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + false, // Is mutable + true, // Update authority is signer + None, // Collection details + )?; + + msg!("Token created successfully."); + + Ok(()) +} diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mint.rs b/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mint.rs new file mode 100644 index 000000000..7d731da01 --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mint.rs @@ -0,0 +1,64 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + associated_token::AssociatedToken, + token::{mint_to, Mint, MintTo, Token, TokenAccount}, + }, +}; + +#[derive(Accounts)] +pub struct MintTokenAccountConstraints<'info> { + #[account(mut)] + pub mint_authority: Signer<'info>, + + pub recipient: SystemAccount<'info>, + + #[account(mut)] + pub mint_account: Account<'info, Mint>, + + #[account( + init_if_needed, + payer = mint_authority, + associated_token::mint = mint_account, + associated_token::authority = recipient, + )] + pub associated_token_account: Account<'info, TokenAccount>, + + pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +/// Mints `amount` tokens to the recipient's associated token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. +pub fn handle_mint_token( + context: Context, + amount: u64, +) -> Result<()> { + msg!("Minting tokens to associated token account..."); + msg!("Mint: {}", &context.accounts.mint_account.key()); + msg!( + "Token Address: {}", + &context.accounts.associated_token_account.key() + ); + + // Invoke the mint_to instruction on the token program + mint_to( + CpiContext::new( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.mint_account.to_account_info(), + to: context.accounts.associated_token_account.to_account_info(), + authority: context.accounts.mint_authority.to_account_info(), + }, + ), + amount, + )?; + + msg!("Token minted successfully."); + + Ok(()) +} diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mod.rs b/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mod.rs new file mode 100644 index 000000000..b5fc4285b --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/src/instructions/mod.rs @@ -0,0 +1,5 @@ +pub mod create; +pub mod mint; + +pub use create::*; +pub use mint::*; diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/src/lib.rs b/tokens/token-minter/anchor-v1/programs/token-minter/src/lib.rs new file mode 100644 index 000000000..8033bddbb --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/src/lib.rs @@ -0,0 +1,28 @@ +use anchor_lang::prelude::*; + +pub mod instructions; +use instructions::*; + +declare_id!("3of89Z9jwek9zrFgpCWc9jZvQvitpVMxpZNsrAD2vQUD"); + +#[program] +pub mod token_minter { + use super::*; + + pub fn create_token( + context: Context, + token_name: String, + token_symbol: String, + token_uri: String, + ) -> Result<()> { + create::handle_create_token(context, token_name, token_symbol, token_uri) + } + + /// Mint `amount` minor units of the token to the recipient. + pub fn mint_token( + context: Context, + amount: u64, + ) -> Result<()> { + mint::handle_mint_token(context, amount) + } +} diff --git a/tokens/token-minter/anchor-v1/programs/token-minter/tests/test_token_minter.rs b/tokens/token-minter/anchor-v1/programs/token-minter/tests/test_token_minter.rs new file mode 100644 index 000000000..487a185f3 --- /dev/null +++ b/tokens/token-minter/anchor-v1/programs/token-minter/tests/test_token_minter.rs @@ -0,0 +1,196 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +/// Decimals configured by the program's `mint::decimals` constraint in +/// `CreateTokenAccountConstraints`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's `mint_token` handler takes amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[ + wallet.as_ref(), + token_program_id().as_ref(), + mint.as_ref(), + ], + &associated_token_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = token_minter::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/token_minter.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + let create_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::CreateToken { + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + token_minter::accounts::CreateTokenAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint created + let mint = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint should exist"); + assert!(!mint.data.is_empty()); + + // Verify metadata created + let meta = svm + .get_account(&metadata_account) + .expect("Metadata should exist"); + assert!(!meta.data.is_empty()); +} + +#[test] +fn test_create_and_mint_tokens() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + // 1. Create token + let create_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::CreateToken { + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + token_minter::accounts::CreateTokenAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // 2. Mint 100 tokens. The handler takes minor units. + svm.expire_blockhash(); + let ata = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); + + let mint_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::MintToken { + amount: to_minor_units(100), + } + .data(), + token_minter::accounts::MintTokenAccountConstraints { + mint_authority: payer.pubkey(), + recipient: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + associated_token_account: ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![mint_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify 100 tokens minted (in minor units) + let balance = get_token_account_balance(&svm, &ata).unwrap(); + assert_eq!(balance, to_minor_units(100), "Should have 100 tokens"); +} diff --git a/tokens/token-minter/anchor-v1/tests/fixtures/mpl_token_metadata.so b/tokens/token-minter/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Mint tokens from inside your program using the [Classic Token Program](https://solana.com/docs/terminology#token-program). See also: [Token Minter overview](../README.md) and the [repository catalog](../../../README.md). diff --git a/tokens/transfer-tokens/anchor-v1/Anchor.toml b/tokens/transfer-tokens/anchor-v1/Anchor.toml new file mode 100644 index 000000000..151ebea8c --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/Anchor.toml @@ -0,0 +1,20 @@ +[toolchain] +# Match the repo package manager (pnpm-lock.yaml at root); avoids Anchor's yarn default. +package_manager = "pnpm" +solana_version = "3.1.8" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +transfer_tokens = "nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67" + +[provider] +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +# Rust + LiteSVM tests; Metaplex Token Metadata is loaded from a local +# fixture (tests/fixtures/mpl_token_metadata.so), no validator needed. +test = "cargo test" diff --git a/tokens/transfer-tokens/anchor-v1/CHANGELOG.md b/tokens/transfer-tokens/anchor-v1/CHANGELOG.md new file mode 100644 index 000000000..4f1163881 --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 2026-07-07 + +Added this changelog. Changes prior to this date were tracked in git history only. diff --git a/tokens/transfer-tokens/anchor-v1/Cargo.toml b/tokens/transfer-tokens/anchor-v1/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/tokens/transfer-tokens/anchor-v1/README.md b/tokens/transfer-tokens/anchor-v1/README.md new file mode 100644 index 000000000..b1c8d5f0b --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/README.md @@ -0,0 +1,42 @@ +# Transfer Tokens (Anchor) + +> [!NOTE] +> This is the **Anchor v1** copy of this example, kept for programs staying on the +> Anchor v1 LTS line. Every `anchor` command on this page needs the v1 CLI: +> `avm install 1.1.2 && avm use 1.1.2`. The Anchor v2 version of this example is in +> [`../anchor`](../anchor/). + +Transfer tokens between token accounts via CPI to the token program. + +See also: [Transfer Tokens overview](../README.md) and the [repository catalog](../../../README.md). + +## Major concepts + +- Associated token accounts +- `transfer_checked`, which carries the mint and decimals through the CPI +- `anchor_spl::token_interface` types, so the same program works against both the Classic Token Program and the Token Extensions Program +- Amounts: `mint_token` and `transfer_tokens` take `amount` in **minor units**, the raw integer the token program operates on. Clients convert from major units offchain: 1 token with 9 decimals is `1 * 10^9` minor units. The program never scales amounts onchain. + +## Setup + +From this directory (`tokens/transfer-tokens/anchor/`): + +```bash +anchor build +``` + +Prerequisites: [Agave](https://docs.anza.xyz/) CLI (version in `Anchor.toml` `[toolchain]`), [Anchor](https://www.anchor-lang.com/docs). + +## Testing + +Tests run in-process with [LiteSVM](https://www.anchor-lang.com/docs/testing/litesvm). No local validator. + +```bash +anchor test +``` + +This runs `cargo test` as configured in `Anchor.toml`. Tests call instruction handlers and check onchain state. + +## Usage + +Read the program `programs/` source and `Anchor.toml` for deployed program IDs. For deployment, use `anchor build && anchor deploy` against your target cluster. diff --git a/tokens/transfer-tokens/anchor-v1/prepare.mjs b/tokens/transfer-tokens/anchor-v1/prepare.mjs new file mode 100644 index 000000000..fb6b26225 --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/prepare.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Cargo.toml b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Cargo.toml new file mode 100644 index 000000000..e846a7232 --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "transfer-tokens" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "transfer_tokens" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-heap = [] +custom-panic = [] + +[dependencies] +anchor-lang = { version = "1.1.2", features = ["init-if-needed"] } +anchor-spl = { version = "1.1.2", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.13.1" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.4.0" +borsh = "1.6.1" + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Xargo.toml b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/create.rs b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/create.rs new file mode 100644 index 000000000..6670117d2 --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/create.rs @@ -0,0 +1,82 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + metadata::{ + create_metadata_accounts_v3, mpl_token_metadata::types::DataV2, + CreateMetadataAccountsV3, Metadata, + }, + token_interface::{Mint, TokenInterface}, + }, +}; + +#[derive(Accounts)] +pub struct CreateTokenAccountConstraints<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + init, + payer = payer, + mint::decimals = 9, + mint::authority = payer.key(), + mint::freeze_authority = payer.key(), + mint::token_program = token_program, + )] + pub mint_account: InterfaceAccount<'info, Mint>, + + /// CHECK: Validate address by deriving pda + #[account( + mut, + seeds = [b"metadata", token_metadata_program.key().as_ref(), mint_account.key().as_ref()], + bump, + seeds::program = token_metadata_program.key(), + )] + pub metadata_account: UncheckedAccount<'info>, + + pub token_program: Interface<'info, TokenInterface>, + pub token_metadata_program: Program<'info, Metadata>, + pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, +} + +pub fn handle_create_token( + context: Context, + token_name: String, + token_symbol: String, + token_uri: String, +) -> Result<()> { + msg!("Creating metadata account"); + + // Cross Program Invocation (CPI) + // Invoking the create_metadata_account_v3 instruction on the token metadata program + create_metadata_accounts_v3( + CpiContext::new( + context.accounts.token_metadata_program.key(), + CreateMetadataAccountsV3 { + metadata: context.accounts.metadata_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + mint_authority: context.accounts.payer.to_account_info(), + update_authority: context.accounts.payer.to_account_info(), + payer: context.accounts.payer.to_account_info(), + system_program: context.accounts.system_program.to_account_info(), + rent: context.accounts.rent.to_account_info(), + }, + ), + DataV2 { + name: token_name, + symbol: token_symbol, + uri: token_uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + false, // Is mutable + true, // Update authority is signer + None, // Collection details + )?; + + msg!("Token created successfully."); + + Ok(()) +} diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mint.rs b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mint.rs new file mode 100644 index 000000000..f57df043a --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mint.rs @@ -0,0 +1,65 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{mint_to, Mint, MintTo, TokenAccount, TokenInterface}, + }, +}; + +#[derive(Accounts)] +pub struct MintTokenAccountConstraints<'info> { + #[account(mut)] + pub mint_authority: Signer<'info>, + + pub recipient: SystemAccount<'info>, + + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + + #[account( + init_if_needed, + payer = mint_authority, + associated_token::mint = mint_account, + associated_token::authority = recipient, + associated_token::token_program = token_program, + )] + pub associated_token_account: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +/// Mints `amount` tokens to the recipient's associated token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. +pub fn handle_mint_token( + context: Context, + amount: u64, +) -> Result<()> { + msg!("Minting tokens to associated token account..."); + msg!("Mint: {}", &context.accounts.mint_account.key()); + msg!( + "Token Address: {}", + &context.accounts.associated_token_account.key() + ); + + // Invoke the mint_to instruction on the token program + mint_to( + CpiContext::new( + context.accounts.token_program.key(), + MintTo { + mint: context.accounts.mint_account.to_account_info(), + to: context.accounts.associated_token_account.to_account_info(), + authority: context.accounts.mint_authority.to_account_info(), + }, + ), + amount, + )?; + + msg!("Token minted successfully."); + + Ok(()) +} diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mod.rs b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mod.rs new file mode 100644 index 000000000..5aa6a8a8c --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/mod.rs @@ -0,0 +1,7 @@ +pub mod create; +pub mod mint; +pub mod transfer; + +pub use create::*; +pub use mint::*; +pub use transfer::*; diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/transfer.rs b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/transfer.rs new file mode 100644 index 000000000..b471124df --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/instructions/transfer.rs @@ -0,0 +1,85 @@ +use { + anchor_lang::prelude::*, + anchor_spl::{ + associated_token::AssociatedToken, + token_interface::{transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked}, + }, +}; + +#[derive(Accounts)] +pub struct TransferTokensAccountConstraints<'info> { + #[account(mut)] + pub sender: Signer<'info>, + + pub recipient: SystemAccount<'info>, + + #[account(mut)] + pub mint_account: InterfaceAccount<'info, Mint>, + + #[account( + mut, + associated_token::mint = mint_account, + associated_token::authority = sender, + associated_token::token_program = token_program, + )] + pub sender_token_account: InterfaceAccount<'info, TokenAccount>, + + #[account( + init_if_needed, + payer = sender, + associated_token::mint = mint_account, + associated_token::authority = recipient, + associated_token::token_program = token_program, + )] + pub recipient_token_account: InterfaceAccount<'info, TokenAccount>, + + pub token_program: Interface<'info, TokenInterface>, + pub associated_token_program: Program<'info, AssociatedToken>, + pub system_program: Program<'info, System>, +} + +/// Transfers `amount` tokens from the sender's to the recipient's associated +/// token account. +/// +/// `amount` is in minor units (the raw integer the token program operates +/// on). Clients convert from major units, e.g. 1 token with 9 decimals is +/// `1 * 10u64.pow(9)` minor units. `transfer_checked` carries the mint and +/// decimals through the CPI so a wrong-mint or wrong-decimals account fails +/// the CPI instead of silently moving the wrong quantity. +pub fn handle_transfer_tokens( + context: Context, + amount: u64, +) -> Result<()> { + msg!("Transferring tokens..."); + msg!( + "Mint: {}", + &context.accounts.mint_account.to_account_info().key() + ); + msg!( + "From Token Address: {}", + &context.accounts.sender_token_account.key() + ); + msg!( + "To Token Address: {}", + &context.accounts.recipient_token_account.key() + ); + + // Invoke the transfer_checked instruction on the token program + transfer_checked( + CpiContext::new( + context.accounts.token_program.key(), + TransferChecked { + from: context.accounts.sender_token_account.to_account_info(), + mint: context.accounts.mint_account.to_account_info(), + to: context.accounts.recipient_token_account.to_account_info(), + authority: context.accounts.sender.to_account_info(), + }, + ), + amount, + context.accounts.mint_account.decimals, + )?; + + msg!("Tokens transferred successfully."); + + Ok(()) +} diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/lib.rs b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/lib.rs new file mode 100644 index 000000000..3d008421e --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/src/lib.rs @@ -0,0 +1,37 @@ +use anchor_lang::prelude::*; + +pub mod instructions; + +use instructions::*; + +declare_id!("nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67"); + +#[program] +pub mod transfer_tokens { + use super::*; + + pub fn create_token( + context: Context, + token_title: String, + token_symbol: String, + token_uri: String, + ) -> Result<()> { + create::handle_create_token(context, token_title, token_symbol, token_uri) + } + + /// Mint `amount` minor units of the token to the recipient. + pub fn mint_token( + context: Context, + amount: u64, + ) -> Result<()> { + mint::handle_mint_token(context, amount) + } + + /// Transfer `amount` minor units of the token from sender to recipient. + pub fn transfer_tokens( + context: Context, + amount: u64, + ) -> Result<()> { + transfer::handle_transfer_tokens(context, amount) + } +} diff --git a/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/tests/test_transfer_tokens.rs b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/tests/test_transfer_tokens.rs new file mode 100644 index 000000000..bf0052e93 --- /dev/null +++ b/tokens/transfer-tokens/anchor-v1/programs/transfer-tokens/tests/test_transfer_tokens.rs @@ -0,0 +1,197 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, get_token_account_balance, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Decimals configured by the program's `mint::decimals` constraint in +/// `CreateTokenAccountConstraints`. +const MINT_DECIMALS: u32 = 9; + +/// Converts a whole-token (major unit) count to minor units, the form the +/// program's instruction handlers take amounts in. +fn to_minor_units(major_units: u64) -> u64 { + major_units.checked_mul(10u64.pow(MINT_DECIMALS)).unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[ + wallet.as_ref(), + token_program_id().as_ref(), + mint.as_ref(), + ], + &associated_token_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_tokens::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_tokens.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_mint_and_transfer() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + // 1. Create token (with metadata) + let create_ix = Instruction::new_with_bytes( + program_id, + &transfer_tokens::instruction::CreateToken { + token_title: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + transfer_tokens::accounts::CreateTokenAccountConstraints { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint created + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint should exist"); + assert!(!mint_account.data.is_empty()); + + // 2. Mint 100 tokens to payer's ATA. The handler takes minor units. + svm.expire_blockhash(); + let sender_ata = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); + + let mint_ix = Instruction::new_with_bytes( + program_id, + &transfer_tokens::instruction::MintToken { + amount: to_minor_units(100), + } + .data(), + transfer_tokens::accounts::MintTokenAccountConstraints { + mint_authority: payer.pubkey(), + recipient: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + associated_token_account: sender_ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![mint_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify 100 tokens minted (in minor units) + assert_eq!( + get_token_account_balance(&svm, &sender_ata).unwrap(), + to_minor_units(100) + ); + + // 3. Transfer 50 tokens to recipient. The handler takes minor units. + svm.expire_blockhash(); + let recipient = Keypair::new(); + let recipient_ata = derive_ata(&recipient.pubkey(), &mint_keypair.pubkey()); + + let transfer_ix = Instruction::new_with_bytes( + program_id, + &transfer_tokens::instruction::TransferTokens { + amount: to_minor_units(50), + } + .data(), + transfer_tokens::accounts::TransferTokensAccountConstraints { + sender: payer.pubkey(), + recipient: recipient.pubkey(), + mint_account: mint_keypair.pubkey(), + sender_token_account: sender_ata, + recipient_token_account: recipient_ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![transfer_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify: sender 50 tokens, recipient 50 tokens (in minor units) + assert_eq!( + get_token_account_balance(&svm, &sender_ata).unwrap(), + to_minor_units(50) + ); + assert_eq!( + get_token_account_balance(&svm, &recipient_ata).unwrap(), + to_minor_units(50) + ); +} diff --git a/tokens/transfer-tokens/anchor-v1/tests/fixtures/mpl_token_metadata.so b/tokens/transfer-tokens/anchor-v1/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` z2OVLR<+Jvoz2^b&jrAq`@6F`D!-M(`I9>QQ%69a%^;tab^kP2S8PA^#FkM^4c6Cwz z+d)2r|0d;xvRJgUK`?8$S2`Fe)#TE_0sfN=7m&#P~Z3EJ}=)7s$OR3@4bNY^jGaetiP-m z`0fT=3;hkN$++t-fg7y+R{hIh^*5X!N$=NN(!B1Z_7KKWezE>uZD|A#@&g?!Ukm-E z{VwD_^f>gXRK1gYY8o%ys`*L(-DGLke|1ggbruSE{-?)Xn@N|&wX#m9{ha6T>>*^hG_+f3iK%Jld0RnC*$?nLSx)cE{%Do~i4#xMh zc0e42{`JNu)Bj4v(vD9bN%8SIOFKR{#!WsQ&=<(tD@50l_(>d>{7RKu6%XzuL?Cwf zAoB}yP7pfS*W(K%oe%nzzkdE&&F|BEje`VFxk$V&E?QLFsP!zeduC z6}N{qv*UG}2ObVoAJMK;UygQ+syz1PUPixEadu{oP}dmW1Hao}nPt~E{{(iO_!7H* z8u57cO7%R$UcESFuUf?$vs3n}G2Te*)$>yJO8H~)hHtN)y_@z*-q-95 z<8sk&OVdBdytJl$`N6nH#=lMZ%3t4}m|om3u~?}>J?hIHZ0kB#G|Bm;($ajeL*=$q zy^C}-+37nqKe5xdTH4uZ-dC6pUZwd@)L-X=9>c@$x0>hK+;?0Y;Dpr+Q}mpx>3nb+ z^XJ(*Ko9k741+fLjj@{pcOFu>2BYUjz3PX3Uar~d-|iR%U;C9`@&4J>y_w~rj%2>_ z7Oz~gf0pwI<&N2^_hIc)#T(ymTECd-o>_c9d?C~GEDk#6Fs(N_k$i~GVt+*ES-itx zSUk@r`$>prO?M`}uAOfG4eZcM)NZi7iGFNTzJ@o<&Bk+?X6wCwt@hELmWlU4;=OJ_ z5xDO^vi8q@K=_&1{UYJ7o8MF}Jx{%&prz@^rh0@qXVipeQj?4tohF(=Z)pN z8}>`b0OuWQ1J;lIOxMXjiEA}I@jUb7_RmI3IN#yNeZ8r99&L}=RrqT+{}{Ke6c}!2k>kvg@-opIr{+d+%ovZ!7uV%=1RjLoo`*4re z_mFo~oDY6L_!~G6(YNQNuf>$ZqKl`T+|H$*#pf7yTiWE-;$XkO zW}9ERT>1<2aen1xne_SdfRK}LJ^RN$*X$Q^u7tCriCuY{;&c7%zWa(gES|OVSmfMB z)kk*^a@4VkY3pZqu0cLnnMt3|zZ2*B{QJ@4;Gf^_v_8E?_zyXsBXHpV0V3yePJr>* z?4re=ZhmL5a;LsuWandD-53gzcgA`e5LiAXDU@b zsPD_gTeKfbcAkOEgId3`T(ZtSr1?>ic1!koTAKYY;~PuUZppl+rpqQ5r3&jQ7hk0L zGB0BAv~M!s>B=izgOwecUR0!g^!cmy$?OC8dEW@^`svzlkh2Trukyk4XD;r}2QSw5 zt?=yZ`;E(foXA~YZdTK}aGIV4U-RX|oj1K$>ksYRsL;;;+}XMa@S=Usxdr$(n7lAf zg#3#s5IbY?AJ6xUQ?6q@wQ*p4-slc}FY%(mnV%_cw|pBHR*1*>9hraT`-6ob`N{mG zrQ0lR>mwFFgv&HLUI&S228G@a>I=6XQtmK+7{@W@592t-{9zo&P+r{n-b8UsK6oeV zt5ELB#rG)PvOiJfOTHJ@^k9Yc%J@vvi;5%qlyg~4kF34Lk6XU^Wm{j0iZ^I}dF==J zT=@aQnV$=}-9q?g{>Av==K0ajTke7!A7K1!$+wKdy5*ZzlEVm{H z7Dq=#vl}Dk&okl$*kSPXz;VP2dD2_bhxk**wSL_CTbVP<2d654?~k7@Ir-p4nqR6i zo(?Tu3+rYNhs{q;xQ~tF9zXtCC4SQPe`-$#Nhkb9zx;`Iy!6q=e!ejkf8A<+=3;|C zGX)QS?BXvUZ#Uq?hT?~L{OypJs-?xq%tbkm9&vw4&kIq`n+F(0x$9WYugAeZFGY{~ zNs~*^ zWL?Pgo^fkdeNNuKruF?%?MqA_)i!wI@d?i(ipQg7Z;#${itfXMzuQOJlMg89zJB`W zYGuv$to{-FT(|m}zTC^{=WYPEC>NdbY{F-HmxXVIhcAiO{z>tTtc*isGavmm&50_-(ozaAM zdnR7a_n_T3i+ytalkk&{B)qO&dS2vO+MPZ}cah4Y)mPDK)i0|&SpNb4T`v**wqLk! z?;~tI#>EF_Z>znGLptVCFKcs|?&@Z`PWg#?W^3BT50N`x{Y2?-`9)`u4tL&!v#aF} z&QpZ7a}6*3U|4?{(>=CMJ$we!^EghJY&?*)f9M^c$Mh&4{8jbVm-E?TM`RvO$Bn*S z1pi>S-1zv0-!|&UK`HzEvefwax)gjH#y$4EyN~z10#{x#P5J5D>Ei`HT0(yN^lHDF z{-9rvZ?J#x-i`JTE-+hJ1Z9aH+3w&{eM^WIdv zbVLe%p}@y-Z0oRooN}n@CC3Yi{L@aTJ^d2mj@1?iaQu+O?VM2d+l~6%Ih81Xr?2q;*M2P4)9<3GW7|J?$h1&h@-4r9Disx1o61@ASo!naDV!dsA%iqJ+=h^sT0MZ`4RL|Si#5#-a6WkZ6t(ObD8Rw zi%)oe=3vGAK+)u(V)Y7*)vjlwuyAb{%xG;*uQOLI`(gz-^d3iYK4A0 z*)BQxpikiwzjn6jNm%9gdXe*=Res+m_cQQ)joq|mvQ*pc(}jL>@fPGdKgW-I zOkU%0;XT%G7N>N$^(c!|y0{J{-y2!{VCzs5oJZl)19=7=n?xV;!2+$%_ru_$&%ZN3 z{~+ZM?R}a2iSi#z@kRGLTKwh1yKc77<7(woGM`7j$$kcVPyI{V6~F!HKeTtI+An@6<+p=+ zNxS6h_g}^5HpjR0pRhX!(d51rrNh^^wVMA_ZKt1qh2}Gs*crY3BA=jlU!~Xajpx4j z_^uRuNu2Zrr6bXAvmbHXYW5?JTg`sNajVUbPOu&)-vwzsZoM(;TBGX^$BO&x6ngeM zU7IcUGOW^kpU+z$hgH7U@sRn|$L<85w`f22%^FXRX3}%D;+qUT-^irrO{AxqO^@7nqjHc%kNUqR{?JfO zhMv!5(!+T`vG0_hRDVSs12H}6alCw{OyVXfWJ49buJr zQMR*d1L>(h z%ybXw35Q8fG>`O7G!G)*D>wPicL*K%;P*}WpVNGvC*b$jX7QJDUWwA<`xnRq;utp{ z^44EB%F9iuxba~bw*Y>o)PsJ1OA3BS=R;VJk9UE}xseL={9y7oFONB4#`3tn`hOY`e#+R_N zRNL$NRpLEM&t^Y+d|GI6#0R82;xf+POjCVDyBp_k+B83`5Ra^HYkR{A`&IT^Xc~CX zA{mcp8h9G#aoDf2?rn4hhIgT*cW61k-H=m%9tU!e=7Z~Je;#L8&Y6_^f>pkf{+_}9 ztI&VQyph%`_dV!S_l=@|E$!a>^q~H*n#k3kYgux2wARyHZobxoe*5D6ps!uqFY{TN z-$3f{M~a^9l$Gwh(lf49K9^SsLL zoaI=bsb8RD(Vd9b+qB=@Im?9{=i~f#slIrA_);w=iYULlt|~R!HGkgN$Ft4s!w;mq zd|#&g^X*}~;@d&FshA#F{Ndx-F8T}lFB!|4*Rpbxp4TEBQO{voZ`5@VpB+!tC+rVe zD(5$9+Sx^)9^E%9I*T9XwIBze@5_=7>-{V@JfKg%T$bJO*PRbhdqex?*4+lpuPiF^ z-XYm9qIli@Ala8->20jn_U(%O)HK>7q&1wUH{&ZJe-%(K^vnCVK#l<@D#p=V`EhXSXFzb96P?U9`iiHo?QjK1=or_0 zACD|oYq?j5{`q>hOiH?VGatM`@g(;1&x$9k{!ZH!br?UZ4_cb-4r`Av-9>r^Egmin zvwUL5O%8Tv{$J?N2j`N$3eUqV7r72lsywW8mW%JzXS8yaJ_oH|7P^SbMsEhrC{QixXE<(N>A@e!8ry_=*{V(TSh5R?|`PFYn z)_%Z0W#Q{@M*c6pd&QYim&r%!oIcT4wcqZ%(P%BtJ5TqU-~TEPGS`Qnvln5V<4MTH z>LJ7r?EfTAp&|A0DxS*}jq20zILeXEq#WbRaD?r3`}5qm)y2jBe4TXDI2G08Q17Dtlg*2sA~h$bgO28xb{TW&ap$uckrWA{`Ai`eT(di9V6Kd>nEE9 zZ#qszJu|){erDZfwrgaIKK*`%-pjd@nh*G=1K#9A)|E9snl(!ail(>ox!A@P^QD0N zKqp9wrjxLyIGo@?^lrWfyr_Vj@5%DfTGk&~yM6i~hhdfd4f+mwk)kucp$U$vsNij!R_Fv8UvZy-QyQ`@N0NXaW1%og+|yqn2On&&{v&O@UR%c!P41 zrW5o%B=@|@zDKPO{qbw>K5+O6i~s@mV`01-zlT?oFWA=tj=1uGyI^c!TR}iM=>iYHo~gThZ}skB+4LX-@s1H4{JZB z@yNVP%l3UbvweS5d}%zsA9wor?M!;MYWddmY-&l*jhXcPY|`|6A(NhaNl(o0an>(( zCA|(*xdY?M$=CO(%=*St^=*vnYuheH-+s`)4{Cis(45Ke`{SAQeOAjS^0XnYZ&hl( z{GD3gwrZ=Q&<3Y4G7L znXd`!qwJsI4Vm^M9k;o-9p#Ie`uag7K*sxuZ&7iK`0d{GWWO5gm3c)Sf64jL3g_-e zLmVbmG{l!jNxb3naZK8=lkvXc+iuT5$15^!;dsyX*SPOiWISzj&bRm5H0{?n4nBH* z2Yy}dhf%)!1sE+W~J!5Lfh3&x=ilk zeOQ%Qq^n4K>$ekp1D&6~33}LR<4D>`#6i%gd~mBaROTNH&wPz5-S;LUH}MmtTJSX={DE}a`7&}31LeDB z?dYPs%eou+Hf;1yuqi$`zZO-MY#>@4>R3kdNs^?qIslaqH(7i zFS_{OpKp1G_6zyq=cA|c@*jSF{wbPI`{?Im9WI%-;kks#K3jed?!HfqIxe+#QXiwP ziz+e437E(xbLUncKj9iRv8@Q7{J|| zf*X~2booxy;Al4hcXtX-?X%gRu*!DBPIn5+0RM$YQv8wnWj;;u`f#_U;BcO0SY^9? zxSLaO_}(V0vfV!1O)0oF3deT)a3d+WO$x_$`*7719L_I^?SGB@#`$7yeE;Hc*xezW z|L)7ZNaH47PMm$d;*LhSfZTy^U%wslI$QP0FV`TKDL)B%`;G7KP0^b^PxSfHPQYJm z@b5~&qyJs|e7wuja4L7B+MmAP-YDf!Zm!{9k}8LFkwm^&-iNi}>fKN8yk=T|M>1pf~d{wMn-xgXKDuZW=KK0WzA`~}aQlJhm_|7v#L zR97d{bvtjWXBN}LJZ~zR*RJWw`U_tUocuh$h5Woj<%jcCvW~9&c-EnLrPqB2UdZvi z->!EGL|&tVMnAJu@|{2N=|H>&e!WTSJDTmQY@*$;b(X9+Y?_oq9M+wRcU~*)k@ZHk z|8C!U67Ni>pC}T)Plw~js!#gy4)rpLcWCgvc*oYK%l&7$=)Y6nE(K}01j$}M$dZOqW;s__t%ayL@T76p#o^q9?SApqOe@d_Z zDEb*z0+h-*JoM7}JKrw6Ck>}@XEQwm zDgC`BRgQ73(?^!~_5B?wc-k$(`F6$W?_z-u%}Kz#p`8?R!04LuvV_1Cr2x1$E%eyZJz&#!Dgw-S2d&MC%xPI{c6 z^9AcUKhigq`)Cq<8K)e^z(F*Y`xRzMeFg{J}ubW5*t`fBMln)da8_TT!?`Wf=$>N`>Di`Fh?x%J>a*Y6t73EZmv z5Bg@yeb+vI%BPbz+DX7YF9k>cMf>H>8vxw1Q*hK<@=4Yo<9d%v!J*&d^@Y`>8|~_p zKY{n@DZOaZ@kOFP4({L-9LGPT)5o`e3XbC+(&@uJRp7+mnO)yNd5X^m9Bm;Nlxxfj zsy-B(_Zzf}op5q4`>CmqHS!zdANi;49{v*IFvhp=6PVh`2hUOl`Tgen%lAZoCo@mB z{V$9g7pDB%A?n|@H`<2-+q6EJ_t1P{V$QJ0XI*U_%%o;_(=aApO0$iu_Wi= zn4X$HOYRSF@uK;q;*jadMtwT{P0qy;fzkR#?Y*O)MTVIF#_DTup z&8@!x-)EUUp?vxM20eD)`}yTQCFT73U>E%Q;OE>vF_i1J`qrUbMak8DZfbWteRgma z(BB9>-+Uh z7jp*axC=yNqeyPh9}G5rdQcEUE{CO#6Q7+*G~vQ>4q+ zn@%Z;`p=Sf`E=4xnO&FmJGj$QaPU)Zo)dg>a3`nW;HO+We7KVYF7Z<)Ke3;p{P=WH zE++OzeHw?%K|Do%@HQo^4DI@2T<>&D*N!Ct`Ph-GaW8mA-|P+Y_~U$+@(LGJUk%uLl1O zdxe>yvgPN4KPy038rNr5eEX@}Fn<2NzK@n{(s}=}OEjtHL#>iOeZEaY|6IoR;NMN( zk$pO&)0DnK+r2si6|EgtJkgSk#P>$SH`UJn8A- zs@!ZT=ga3WQt*GmxXkGG@%~ic$}9PuiaV#MslBG}VU7F&J#xi{e3xPEj^m^+Xv3Py zSFOEMq&=YfYNmnbW8hyCp3i3ExhN_3segg|r|Xx&zWm(1d)R;0De3U_7%ef_3`#ENP90{rTD{gC!ZIM z^I00uC)V8>?hTs9aY=lS-8|fehW@c}xn~#D&I~J>z|{}>{$)d>9K(Ldxh<3mk@1vRmRq$}{RIU@zeF6Z?|6d^Tzgd1K(=W;ls@lIGLAJxsbR-&(I6>W7fS* z8b2G~V|g{Z0RJnj)&AdlC+v@ni`LQJCw{m`2~NvD__asM&!PX2|2pwQpv#Z9-FE^0 zeBCLaJN9o+*Lvh0SZ!}qd_dbDR%s8Sj{BId(H=xy_b^?jJ&1bl(sXp_bj1@LCxpl^ zdLgWaJYS*@8UOM;=u(yAu5!l~!)xQNuFZy*@k7+JiRodBALflSJw!g0+YclDPEK@1 z-8|1C>V+2<*&`Y8x$H^3KO~+i*K1_|qNNLLe}~mmJDlk*(lJ;k9i?F_@95|y9pNzX zM7`X-SK+eDyHN0x)n^v>vc;ty*u$4 z>=5MhCXr8Ho}JvbrSf540UxCDVP}#5U!Oy~c^CEbZxGKd68ujjp1bVcCnui!%+DI_ z+(hx*`V@Stc&;vRyA#iKX2vUCdbt9b6JJN`cL z+_VjicA!-}w=EUV-HJHkU2NB6;<@ASo#`avxtV~g7{79|e>)Y=wd4IR#B&FTJ@WCj ziszmtaDUHuZk_1o?!F!5}mdyUE!ms80y3E7d_=)Sr zvfsqgTsM~cdsuIUbVNn2?}Y1(z6!@fQIYfWGB2#~GTzjBeETqf`D7a(V?6855Ble= zLZ^*8_m*J?=ABEG`?NgfU1VD5@$>Cj$ZA}h?Eq{lu zdkj{3EzNa7pDyhen?La9XAbLzU1WQb@$HeQPVU*|`r+7zH5v06{dwa?oZC1{UzF-> zM^k;q2fx0(`;+?QK1OYSvaWfy;*)hv-4+${*n1UZ{V_IWbB{SmXQhQHN=MSbdoE9cBCY zsvM_BM{(R6Ryj_Ojxu{`>t}A=d9Xx27IHI*&+eZq>~S>Hw$3|d^uX`PKe-XvYt0iIg8ix zHflOrvcdA*`Y_M+iWUs<{mM1^Y|@hp6n!vu4xixbzzMid^t-AbrP_2Y*SE(MU4OuO zs{E67iy@JpTVL(l!{h-k{`=+nWMJ2QP(V$6aRa$O=6hj zKE9^>6|(=#$<>(cXM$Yf2YmRmZ%?B~()h`FN{T1y;yh_Ak8XanLO9sN`Pe5~v$T|7 zgLK`}qDH=)hIXGA`1U86nk!Z2YdaHrcDNRF{R=w_k_x%!XujM37miS`aqm3dL(Xm< zk;zf}fp5|+IzK4px*;x9dX^Iqblm!4p<^BAE&KMmSo_QQJNe#B=T~Jt*6bSR=j9xB zrn@*lAJ)y!^st|zL(HBXD;3BuI?3$W9M+o;xIR*QYOm z?bMJ~Fj%GE?3=<0!z%se(NoT3f9F2>I7&LZln*|le%9AlU~>0lO8eDsjm=Q>(jRYE zz9;)LsW;^g>W%nq`dd@jLT;HB6gj6K+2ehh_Vo+rulwUe$PxNy_47nO>>QJ@+N_fup zX8+6yYbVc%+~#zhG#}ige0Tf`ce3BTTljCj{oH% z@AH7Yf&AxnRZr-u5+C?5OXSX-8wfhU6422h_?_J>+kR7De$#g48=udThk{lVuA@DX z^*+WaZl9UO4L)9{2iu=3a=zZ;u%M`T+vi3-)%D?!#i+sQZ3%_62 z$@{eb%?AwJB~BrIX79qf(LHQ&-uY(d=19e;$Lw4g2Z+e8Z1KON+nwj?*FPd~`QYoU zrv=?{JC`e3?T_P5ZIq|2W-kuDMdZ=!j_f;7yncOnl@B&*{u7OR^1<1UgQ8Gu6n^_j zAK?eN0S6X6_i?_rer?t>u3wDJ)?&&1z83`Bk%Rk{5II2Z_K{~kI0xC{pGV2BS6ZA{ zTw`hHuZJ`}cCCVE?w@FfU%ZU({kZ=Fr$BDGPSuy2t?{8-mxR9uVQwAU&mY%(u46|_ zIF9q*59oXPB|pDY^XZ?Wl^jp_^IA&hpa99wUw<5xH01sBKZX2S`)8P+Eppv4oT0^p z-c8yM;G_J*xoS*{-e^44LBHYKfi18{=4br;O`30hrAWUb-(e`f-8!bT6FZBW)Ly_C z%MZr|ZO3@r;(7UAh5dIq-=m%Pz9h?@FrXVN5zejS0{&~#k9oaiRm#QtIN2{@ypNOp zk?iASKZNlDyZxB0m||YdT)vuJ$wCVRBaM zWx9)U7S`u7-80VTbhDGQh%cILaypmwVtxc~Tt9+;Zx%b251y?6(Mrab{`~Sd=&xFN zkz;MoGNxgFI^|E`dDTxvU)PfFzTe&gdGpFI1wPMjcU$?FqWl8((-@qE{6Oz?z^CNS zulEco=hN%cH+B*6`0%Hoo+aeF@Bfsp)d_sJ{E2qW27Zqo<%iKD-?98RN&vruf3Cp0 z`5@U(pzodC8@m|L#G8|+xsPD%EX@w$d+(e-o6r91Yonj@{mZBni40Em^Cy-1Wc+j{>sv6*>Z4;x*C+SA^Zh!~ zHCARj!Pg;O?;#xtUeYc0`7eNsmIPYf$GZyOuUNkV&%BKSx0d_n!;f@p1)=q0IJ%1U zkF06JvsCb){5dGUWIM+>EBQSg>?$}f<1)<$-y8Q)k?t`5jxON%E&h&fhnDl{#&`Yx zcoqD0?FiSAPmVv>FC-$R^7j_y(~#1i@aY6?XV(5bA1~VX$cv=^?7j)PuT1guP3^Yv zr?tDdP2*UZS0f)fwlZB~`=hQcOxM|NId@*u6OTV>SLB=p#Vh9{vOj7(Us=u*WV-$^ z>+Kn3diVjR=ds=8V-M5zMkmn^MRRQb$obR@7ysooiiRJ0vg$iP>5_dKN_V;ASH{QB zXFZ}X6Inv+`RRN9~667(Pr!S2REh4JuKriz|RyA$lt0Iyy}5xmmS{s2%MaIul#ax zn;SR!_1$H9`}~{z@7@u;Hhu?=@7|q#bo`KWwH3~NXA>SeU(-H*ZMWGE(0`<7ryQO{ z54k=aeo)ag@I~>^EGr+TczBZX1PGT)Me@t~PIjTR7vu5isqy&xr5|Pgo63#jQ~dq; z=wi)Jw+rpL>U`J(v%6ETRy*LsK@KFoWce!F1-c#(d*%0QU#ed_Q+^%`7=Z5-6sY&? z6#P>KKCH4HA8(J!L7VzbcP=u<0}=*29!)1brOLS~Cped0LWE$ByoV(y+~*&z=+?B8qwpGoqj_nNEA|h+`vBc@mNx3+5cpK&cXs~w z9mh)G($LQeXWy;(@(#H5tRMS82hgw9Za?ln9B`us*Jj^$EHk>TUqRpWRK3s(@vG|J z-FMHvoa~d5lQxl~(EGjxJpsJ=6x?jg4_P~Wd_f9sKHy9*eYn3q(8$Mj;g9%3(phW% z9^=EGM_kmdad)E6hiiZPd`5dg@3+KW`T6Ka4%Gtnjf=xq2pnuYZfnbJ-~F`;)NcrJ53ZH zw9@Z<@F?qFXL|fb5it1`roKv_KHURiAHxxgFE7*ADj$bP|AeJ(&4}&ex&i9v==>)8 z*lT`env_HQx3`p(arJ)z0ph>LefVvfFL5gQvtU=_#(u3|){7NSSn0Ji`R%t){W8sq z-q)&r#oFo4tM>2rI8M&>mHA<_kM4U`Ti3AoPu5c@*A^!no%^v`GTB$GcDFCLg?w{% zblF^{570-0J*peuuDSvCaGv&?KTZK3^TB48cXn-gH`8VpOEubaw+;lo#81Be+^)}z z`Euoh&0{z|K%d^wr+TS;?aLkYB*nQOZfZB@8~>pEl=(mHk8;N)lwve=Rv* z?+VI&alW?0`Qg6Yq3U-_c5fx@Aq=70_agUrD7@Uap!$-`b5L(&-NoM1euzF;n*JF2 z2!4jk%??a~*O&B>`e=|xXK%NEhWoMZ6p(^Yf?rs*xcY!SH4VJ@l})bm!5!qwY7r#) zWyNFN7LRqN;;{>1$1B~mFNQCU$JWhlvNw*-56T=;X?;88b?QMWc_rVHaT)tLjK^i< zTNsbaOn!#h&ZxkEDLR_%iC#edMQ3XB8s_iC-97HU+m>}Y<%6%s2nF4GjX!VNE9Lxn zO7(J(_@T$J9MH@C9%%Hhhhh8+r1ArwXIi{?v7`Y%H3hGB(CnU%cTa&UubuuF@PsA& zU+_u4`t5OYTFC98@uFMLpCk1`5(;uS9-d*%{LKmTfhLIk#))W!q)+JP^Q2BbZQfMo zsoC!bYIaOV`n#WS*yc6naXz=z_d@Qw72gl|_742Xj|x5O=|B3W9z%L6Zai=PJ08z> zsy-!hGmGh1ZWzaelaw2||JUrA`)+@l;eS5$wyVwXbKN2837C%OdpZBRJ8_EBn~KCK zK7U+1^(WE$e872MUw(yU@pv#FY*qUG_!aSWyRa8gJ4@jBI7t~;jNm8?ryJYUx0!I-x`b(QYt zVO-FcyHV$_>&j|HI+OG(VcRh3{QlHOcSQ z()5Eb`4;k2Qu+9_+6CV(eOxHd2X9yU{rt6>&xWV#ar%jQq4a$gpOb~d=6MX__wjUM z+~nDfL7C5p<0`KVHvQZBPJQ}#+AaQnqm)NH_0K~0;QwLoTj1=fs=LokxMV;p zN#J4_0!+w*I3+qjjB$Jri(njIQMn{WT5`Fe#MIUdQOwCvn*_uVwI+ZPBahsBXEHO2 z8f%oO&v7J$=ibRAKHBg5{l5DPoZ0*Az4qE` zuh(Ataq6%8Pj-m+xbxRvdwrT_PAV7mxeB+@B~PBWN4NA>dnYePRF|9;4Q(zjFc zSq>@-<+e+D8q!Vkv%am8pY(3f=Z-a65A=dc#Jpma)vQ!w zd8YK4LMYI4R1Wx+3NMl;`%h2P?KjhJleF@GNH@`=LH|Vm+I)ulXu@%IJxBg}9QTR0 zj_<|Ne&*-6{sCd|3)^)&`6RZ6m7{&~K3*%2)Ne`Uc=jrNe}0cV)AglUT0U8B@sZbQ z`d8`id>=L_^LI?&r25bNkJR5W|0DI2&HqUK9kmaBk0tl<@fSC2elSzhOEG>_Al1{A zj>Tv}i~P#G#O4*rRIOKxE|PLt9LMx?8pm0o`Z|r{n0`*Lk4B_)h-SLe#nFLHSd%Uy?ZnZ7wF{1U>aK0zF~C13la_LueX5BjQ&e&V>B zK1%&9^Gm{W@&C1l{?EpV(>#4m z50Bogd`kEe#NX+XaV!^}ZT^nl(+s^J^r`x}_=cWGNbDRu^n$!k`u52adO_36_sY}t zU&zO#ug@z&`kse=rt2!3dIZ669F?y!IXa8<3&xFfPUkrRozEcLO=@StaS?gin9W#1pJj`Tf`q-Sa5jmt=lS zI9_YW2bXDiwzK`s(C_JfCA}{pu5A~-Oy?iZQs94=QTBJH~s#H;g!yda(EA~5xhb6HhReqghw;@A54D&6AO`uHl{Mq_P<>ycf6?fQv+ z^5GvL(|*Kr&c`+G%Pe1?_44J8iGmmLI~DK!p2K3aMj$xfaUiA^UnBX-PhtKd z$ydG%^CwIGTA3;;#$CmtklCOSw zi04+x*ZF+Ycp!iDM*I&y?sMtEljC{@p7S<7gW1vOI(bMOY%A%zQPcVH^Y}nwaRHA9 zke?pC5Bxc({!Q%r(i?|G5BYePqGt)9{1F`|Q1r2kv{dw2p&+{|NrL zbg8D3zAlL)_`Exwu~}ZE=W}Olu=FA+7tc@zfLvR8jlExIY4tn&JV^Yk74kl|_!aon z$}O>a9hP2X>B*K}Xz6K|mL&MR$I?CaewC%?T6%@0yDYuT($g%x!O|cQe$WS+o~a5r zp4%b$p*`Sza!KzRDVN&!o1~c7tDQg<>%%fXEf=0C{v^IT`!kk^`&|zo(e&GOT=VeV zkK(xf^#Z^fR{1D*oNen@hXuaxpTs^CO?PYDE^gTUbG-+ily(OcAKW7)>GA!7Kamb$ zT~**#yLT&H8v32`q<2`;_Wf?ejWj*@h~lw)yQGhQzxQXPy=47ip-ZykkUYcr2Jhbw z=gAxg*JHE?zR&Fw2cd^*0#5YpK(5}Sn0K-KEEFMqhjZomeIWPCL%0o;t8UpT^t<0o zVrA%+k}koZ&`)&z84oL8xjtk&kL||zHV4phW91DW=Y0Roc}@O;g4P* z9fUqHKG66C=1s;28lS*=l%{(hF+MQ9=zCbwMfs{B;)femUP=Y^2Q$CM&)KOwr|0l? zn4eu!IdK0cq`UOT{T}NV^pWrd>G5K0{c<@e6{d)sWc+69)G5CiU#I+Le4X-}^7VN9 zR+O(CFcjC_C7aku`mpEpD4dOypB z3#6YoFDC7k5MSpnj7#rCx)^og|IPWgAno57^6$TMoQSW-{o|UC(-?Zi#v`s9f12Kk z2UIT--|p8E-)Tml>HkCe=3;iYi4L3DFY|l-{6wbbbiCt+@w@3c+>0P|g+HNuKkj$_ z&X;!M+SO*4-7i>a>4Rb)v2VlDhb;Y8OCQ#>$$NRy6qzYj>^nb{SB{V0_lI+~QXcou zE1orl2R&|SZ4ds6r4=8N}S{^R&P_%ZI={j~LKiO3uMvHbUNKPBae9r2^~ zQvZ&Bx!)ebKV!P;$IpRJ(EaRO z*Wir182vl`4|yEwk#GHbmcl)S+NRJ+@*MROqztmpVOfPntUPJw_p^70@2iHt>rL0AbESWo9Bco^)2kfU zrge-q@vY*^LjChb`;PlUY0v2&+SR+bKe=1^EzA$?E&KJRCjR*=AyBBtCLyO7y~pH5 z^-{V&_huV6KM(HXIHYuGw=PS1LoUQGVEd1(Z?>P2#J~2d-(cg#a(g}xdp@M?aUEX# zWt)%1^-S-5lI3bv4x_|*Kjco~ZPI+g`)ID*0V$_&;<}C-%MG&Ju)%{HDfHW@X`EXU zxb!c2kj3(Mf`noF5#z(wkFeZrxpLeWj(xr@@ZO&*$9T2(H-xu2S8fU81$CvfpQ~a# zn(|0IXZ|7iX^D($7LQi{A;jP1ZyEGOnD27)G4PMu*>pd4ZG-Zq^Ml#5be~X7{fBsp z(lLwQsh`3$1uXeF_W#KEn0;hF-`$|zQNN%(=^SY=(<3@B%Sl8Q;f{{7U`J@~ozDt(B6_;#ya0+TvRA;FX$Q-lO&AOcy+p1)QaW4p-PY zo~t-|?e)5k6ZLvAS}x^6zNK8X=mFzn@)1X#^tu#$g!!-8#iOb>YaN!3%zjO_bcdzY z&+vV~c|O5DN#O^NbA|0)g!cSgS%|O5cPeMfPsHz%oF0(4UaAK&xqWt9`BwQt+)?l$ zyl3Uhab9TpDa5zO=yP^X&c>4OGjrv}lJ6 zxP_&4K8kpQq?7e?EkCkyU6$^!wDL914_R9I9{Y4Ht#T3ESE6vYsJ@A7)2y7%@8Y4w znqKdIqtZX~8;^+o&-_N4N1NZ6AII>XAC7n4kBA4lq&@Qa?B|hh)DOz^{cnh#xSsK1 z{PlKwmQHcM4T~B0h3%?6ReHF55dJ=VuPKyY+Ebr*h4%CdEH@%xBgU!8j~*{}J4tw- zWx2rKi(XIVT*sB=K812P|9XTFv-z(2V*I!s8nW6c`XoK)$D9`ueRWW*1Oa2bY@00vWUE>hdZkrc1Y@bB0 z&6@@^4w3ZPylT+n5IjxT%r7!-=Kr+YhjkL}P4#(osWAB8oGNDV18?8sRo?!iIuA(O z_juI-88_TBBJV5p_o+Qizn68hq_gj3y+hOK_p;uqY5QJQG5V3fDNWLT(eDIXKQ-?L z9~X6S;)|u*(P@F7M@zld^2Zt<*T16`t&jZ+BLC#C-$%T#h_6cU4aaXo9l~Ni#?v{( zr02REU;XrpYR8GE&tF(>Yp&e6Ukb`WH}E(5EPL8~y^Qb2@JG37UI%KuFG|({t^dUT z1@keE!^$7!j$iZmgY+lWcPDy}*SO!ES}*t}JJyKb(xhh?XROO>*+(zv> zsWcGQXS>AbC9iG9e{+Bj-@jou^wscY_3K8qDxGSIFW1x7v3x+M2Mq4(P>*~-m523F zkrVP|(|$r*uS#|t)^Xl)NS>^RsT1lQlr-x#?I-L!Ao+1^gW!{N9<}s3OCOPR*x&ta z#*=iW+{FV*cj3c7RJ_q-w6?QP=-zK}gteWoXc-5A8}RW4=y}*p)dPqFQ8bFtbo?Lf z45jfMd7qwRnJTZF?52;;2xP2e-x+tg5ATaQ1ph8JJIC=L-hMv27@aMEp&x}F)ozV{ zWcRliKI#1}7H>-LZ_$2?A79md3zhoA+OLMe88G;R+HP{yG{Gmi0*r-UvVfxu{+`28 zAf5C%R)5GBq-WbWmGRwQjAU`DbR9jXr+6EwFK?Pa*G*@O2X|A@S8LMDFXlUufO zoRtsDg|h{(mh#3Ip?qH0RzB4(j8&iQ-FXSx8!`QOO1d5-Kf6V~GX5FX zbjm-vP712KP45JHhT{?H$=~~C^LUM?hgapwQ{LjbwiCjw zqFi-{>fd-|q003s=L;Vs>$QA5v`F$VfU@J8(xe&kJ~n=Ff0g5S#(mI$_{rGt7#_2`M*Pd8ok%rm8aJ3aIIW9pfb z)C>K_3y{<9zF5W$viSZpq~5sq)cp_Wjh8`h6r)cn-H9ZAz8;?Rs$Jo=csz{Yb z`fT?n7lW>ieKKz4iF3?vRK4uq^YZ(mlJ0$GpOjun?_Nz0DBelmZb^^7PX08(D}$?k zNZhb?d(~g63_Kv?8xLB0SM?CCe3`@$_zb z-&#$_f&Rm8(YFhguj`hNLFTw29x3^uejI(Id3@iO^RqBrYg%{zT(0~E(YxAS2zL+4 zVVz0Zt9EXdaS8d7>-+va<}jal#&zXa^2h6k!~1O1zX{;f3-{d_#M_ zbRYfgJm0@u;KU=UHxLh!ew=gGl?s2GJY=5&^-0pH<-&GXu$@g>j{P_czY_bN1dh)S zu^uMrq*LjHIFqGq{DN^^0(gY;9l)WTnI!G1pWNz~t3Qr=R1Kc;wT}nnO8Aa&=)qy% zl%!kzbfpXSCmEbWQV#o^EPYVYVZRS^9-8Aj;{AB;dvBsgZd3aBdIifxZS}}}DHsnN z5j_zP9#uUb&`01Iy~FYSr-#~&uNr_5?~w1p`p|D~V^obkF&zU_iJ>IAEtvEfe zu=&dZG8*`P4!Ixxp{=tNqi+dcW&QZF+L!uQh0jy_Q-9FX-u{;~ZT6_&>_%l!>sPOu zF73dMsC~Lh{jFqy`sc|UEP&y+_6pT+#mMcG*_~fDfK5@S72H%GHzJ74F@bfH{ zyD{QNzl?d=H~xTpspEGd^RigvT*Su^I=6BA286W-p^RhR=g)Z5B-tFdPJ3k41HfH?i z|NVK{9YevqY^JbT)IUX^r2@Seo)dnW#B)l8)5QO$U&8Uiek;*8^h<_=c((7$YFF-H zQ#qaMv@5s2shsNFcIEa4G@aJuk(yFE*?`-gOzYIHh1Vgv2)-S98j{O;$*w+7(&aXvwOxej$Wpab## z_Ctz4UOz>=Q51dv{|~(IA6<|$G8nW0FUdW-@{tH8 zHaNPji*;>F`#N)E>B$DC!_pm=K49(my7M%B{~@JEN{1SIr{lfu35JJMQT`GNJ{ z)V99Gck0S7CF9Q)I6=Qww1wmGoypRl;};iOO|D$1(d}*yEC)eTU~U zOFv!vQGe9Zs=uqJOE%yt&JNe-PjTJg%{jyB8@xF=c($I=&QGR%kPaV(U32}GY}qGr z(Mm_c?aQjiNx?{KW zGagoc3HMoi7Jgi|U;lC)r<%#Jx7Nc&;AMY(bdrJUj!mU}_29KXld z&OR*2mFoa~;=0n=<2&Jg)US!3t?SC=!mPG>pY)srIm?e9^Or-fxPC82FBAe*YFDfL z*u4#zKW67)%pN4|?pY##4=SDAE;!!tKsLVr)kk}!_PAU)$Kut$YB^r0{j2NzJJV-+ z4nIltncnl1r25S6c{+wZBR`Rz-v&L~(Rm*7)3{4*rTG=pG%iwmv!%N%{Z>oQwe&kI z-6LrqpHksuIk`Z;65(F)mD#~-W+?s3xWAej9rtER{Ziq##j_0Y6FIm|%M<^tqm1+A z?Vb8LIBzBV&-U`?Dc&;}+9yVn)vrDo&)}XJ;j4`9zqlPaVs_*R+Al_z2o11LImL6; z51Z}o4T9(6R!;p%_9uUS<9DUp_oZA(4p2kC+5D2_qkn6Ld%cu@1G^19s&+d&&!GMu z?r}V#?^S=L=j8*xk@~*fxd$01lPk6#o_oN0i}W`h$n50J54Ib}Uc=Ay{xQDOwhDOA zZ|TVO^UtX-YOB;vOciiZx_@J2jpXO~i+okRlYFRlnSK;WSd7dswEeV6=Pcpxq|?qZ z+4uL7&I?rz>gJDk+rGBWM>W4;dZX9&T@0xIlgyeX2qtF$0sImTe`9=X-`g3+*Jdv` zPlFgem7FETf!`k*pQzknexmlargDjSwWU>VF;BF#%C+x@rv7|0K*sgSLZ8yH?w2(^ zG7J2~dJmvpDY{kgsGh0*nd{?XbhqTYe-{7J{Jz@-F598}`g|n2$MysAKHO)T_lF** z9WZ&J9d!R@`PX><(C1ysuc2KQ`@K==@B3QA`maO%kiTT#(Izb)mU|V-#oIJLKdxbW z^i$k#a(hL7eHFh?J!JJU9j2e+{fPs=d@;)f{)gaW?c!b|8E?Y7jOBJ2JP=j-Sz=6VY%~B z4*MwtU+6E9zYyPH*1NV9{@JMKe2aSGcZc;3qF!8A`x3TyhP0=AvexcPcl(F+zP9=% z9G{&Sn^t@F0YNa{VdoGUN<7>uLC{SnIrd@KAN;IlX2W72uC!T&z%4J)3!=Zt=* z%SFg9UjFZM?Fc_xKg0Qom;W1-ukKi(`r7zDl}n3bx!sJ@w918_cS_~J=PjnE?+3or zjO4G$e1h&wlg_I@3Oj~;jkG|&BR`pp3iyR_7ZgFhWJ~_x4`=or=f2JVa=oQ-qKu#C z>iaFqN3_p-?g{F5t3T!T!tDs+n_@3u@2$SZt^B?S@VDiA{A-Ef;c=;D_Fnxv+>@l~ z9g}rExuN~xclqw4U(wqk`Ef(#Ea{DG{Y}?X@%?ofAKXKrPdkSTe0AJv*3Zsq3a7Tv z@R@6A!`IGd?OP8ikU1Ism?73K;aji?_9Q2a%q23TV2>6@w z$8o=LHsyX;>{J%FxmXBN8QP=vt7i1U;4g!`vEEVK6X*9BlqU6xd}rr6Fv-Oa_fjc6 z>Z%9lO_gCp{xZqGU&E)coBsYkq+T()Ql1ryx5O5ghzCp$4Vr(k)BKku)1-W|NEtJ+ z@5xuY$lZ`9<5%prmo)ryAjzMc`rtPrFhrxlk$~@j!QhSPtx(A(cyAycVMr=y<9t9 zeXhovlG#QNi))1Z;p6%s#`|kJdV0?};pM3HB-Oc(@^!!G? zMZW1_`paE8fB7q%4_djr-%hx*-i!LqFE#Vyr)Ym!KGZ`je=f>raUDfGjoTcf-ZR;b z_cP#omzOsTJoVHy*K2>UzeVJ&RM3<0)RW=-GTx={uQ5GcI(eq(+dN&vIG6Z`fgPL- znC#EA1LMI;H3+T8oN9X;ZGxaf1Dn=uwH=6rFJwQ$=%Bo7U{=Y}^ZxRB;HM2WY zCE4U}E;Rk}!!6-BtdN3De1~$yNEyTRSE;bf;O`f{DiyA>w9XgP^Zah#+O+R}$a4`t z&g6Za_1EQnjip`QS6SNSe1)Y|ulhc!5PzPRCfyG-_47KzSN+-(!S}o-e7EQD-I~L9 za}M7PmR7p8!*_$>`}rn(U(<~5G3L9=Y`(iB$5%guTtKgjJb1h5e7Cm3?2__XNIxH^ z^F9PSv`g)J>13bxUTS!`zCM_v$AKI@OuyQGGx*=8*G9k z*Vp?jEoi}RX@BAwns&Y2?p~IAQN+)6gz~-u{GZCv6ocz=WuJGKz+m{rrniz#UB5_{ zTU@Bm))jhneS-3hfBf#T^uHawzm4zKW%}_Zu@_;v?Z7Lw&yH7WrwN_?xkl=R{^4Ha z`#d;lBbU@~l$ReiDEA)|KOn5XL*V{Y@fl_-h{=NddH+S`3mf%4{c~yz!d?59(0?_} z=Xm7j8Tt9b@8-(OJYZ8R+*K?W;3Iy2;7_dx<^kb+p^}5Y5AxT}@4p)5Vmk+f^#J2* z^ZPo7Eqzevg?r^JZGLFyUQLg|k3J5RD~?<-xuxyHY zUu@wMjsx~Jr*KxzL_daAzm_|mVexAB!_8l@_4A}#{S?3N3g00W_}F);a@(hVY3kpM z^BtWm4(0k>>6hsN_1`mlVDQtpnzf(C(+s~_GyWle(cp*jJlW=>3qdc^bq2;Y*`nhX zo1cyNm-@x{cnay9-ScC9TRM+WdbvLz+rHtX^IwHNaZULk>HLAEl~0n+zqhpVQPTO> zl6JkYwvApm40#Xx;d=Qqb?S*f8e`nmF0!Aqo5ua=Htsr({dVp&ZYUjNk2}tv#_r?3 zvx3fl=BuKK8&3$n$$Xs~uAQa&H?j4%V)Qn_r&60P^&EcEt@Aa+N3?#o>gUoa9l805 z`or{RDG#N>WbiilzkqyXgnWND@{7@R(w_Uj^pE)Sb>FZ&m;T%7#qE-RwZI|0wsKv| z{LH0z@!HSv7}O*$Us!XojrG4Hc^!pjAp{+hyF+j)xeZ%yH^?KJtY^=FTFc>OF6 zqWtY~Adi>$IT`jOFdj^H2KjlbAMyRpFXRUd@*;8~(S zTwYY}$|p~-@+z<8!pkHb;-z-Q;5CjaUtm(goyw&1g|8rf>fdDeJy+n6Upc>VKO~FC zpCj*a|A6Y>mURGKC&~7I*!ssz#XGk1s>w{7N1LA(;_d#;*U)dj|L>RGo}YUS_0F4v z{<^&n@$&V*HG!zo6O3Y^q`PWNZz=ZQT{^Aggnc|Ya&_j`!m9TfHv{`*fT^mr%|I+iCrLtbQl zMVI20?XS^vw!cQx+5Q?$dmLw6KgayAWB8+j??%Np)TgIGuOaRvcxQfv>E+JI{7Ti^ z;0sH4S^3G54%cTye^j)c(64pq;f z@c6G9_0~G!$I+SE-)#T1IxMBasp2=eKMDIIUb@D9pqIBYU%QSu3_vrk71HX62_h%I&W$dKa^mTV6_<Y2Q;-ZeqJOun8kbc=UczimHUX+nqO=ixEl9PR@l+`<>Q z??drvfm>HPmnP`^qaD1l&NV;r`F3!h-4-uj$0dGa!TXoC@Metx&&IQ%{L6km*0%n1 zrJwoR?e_O_957!KJ|mpJX$wakAfGQV4xisg^n;yYoT*dVrJPa%vi-PkR=#ZLcxL-? z?S9>vYS`oY)ykKtzPr-W&Hk9{9o#1;@3VbW1~1*eX7JMeYX?0BhtNmnPi(b(l|$%j%inDI2FLaTB~w*jVqH*C;D)srs>Bm!=D_7Z#~@XU##SQlAzvw7=O@H^gHXVw0eJ;t0(@|rdIfW#&W}& zFW;}FzZAfi{Sg6Piw*vtuwLN5@qRkDW1(N>Ab#6`;q6j zV7y*v>m8>x@g1X$t$gSE9$jyx>;5(M^GbzhNxg8K=E5GuyUbrTJlT)oT^yfgImqHg z#>YcF>gNXdPBZ(q6ZL7QIg`Qnw8f56PMYsy+o1M$z3IW4!c97r4_LoL>Z{&l{pNew zlplQE7x!8SJnWk=|8|X}!~V*+4+t6Ld$cm{*6-N%A@F`@dIY4y-p|n=Q+~_*yqyAo z>CE5zdw&4crsvb~p5poYM6ckyxx_Cy9`yXe zeP18L{#lPhb9~@h$dB|(Y+k~At2X~uvseVWmEb)Ch(jmSd1ioz7hEC}1`_a5ywToP*@)hn2fghs$+PT%98DBT; zL+dm>wSK3T>sJ0v)|-Aaeoxjbf8x7wT5kPrD?e=My_Vi*>HYTHV9x{g{-C7~$v*y>>3$<_g zbzaIl<+#?>ELS_>-&E?len)v>yf?l7WLWn{RfcqZjrGsR{>G3mc~1%R&$E4x4+Qiq zbzCBRMgN?1Bt7rJv)rLKl#%`)3(Ax4C~|~H|B~gmA?^CSI+fC-aQMvP(PuM>^)K7k zHDLR?26Y`UPW?&%X1PK2N8Qh?E~0c`{CgCBwM&wM$4O)Kw}AYjNEP&6{gp!hN@Jxw z;{lt0&8LRAtTgGFqUTDJIz``< zC;iz|)EKVki*h@1mM%@0Cwi(FeM#qGP*T*BUcNNpInqusdT5OIzi#`f9+dZ4J&hZe zCQKK+iqYrBs6W%@%Q|nMK5cIQJhLaC8l(Q%Vuy>-$K`#0L)S&i6F(;DxUoj;OL^jm zy+2^-p{J;y`x{@g^q{0GjYllqkn)vAB=)5|v1aLMk}gezAmCSw?veb_8IpuQt#;D; zLA%U$+#ZH}vl8~x?*$C=uZCTzJX7ISM)ZDY+7r^n&ryZt)t@zgDA=!f=yHss#evGW z7lL}EGNSW6-{*Key3vLFx7(BJ#captCmzo_XR69Y$k*>dIqaJdKF;Qm<}aDNCFwf2 z*_Zhy?>65|=BqucntT-_J$J%(pvHu@XePzy8uKSg6ISYe!y4bJeieVIZfOvm@eKMw z%K(e=^t3;Re%hh*^z}9OKPnBC$B?eefIv7;oCbVCzq|+O(!>`?gQbbRqF0^Xp*`3D zIB8r2`ze7A_(ad;kw0`?X9=9J9@~$vRr-`Bbjkbv+E>h<`+Z4!e9HIX^-q~A`I$eW z>p#8@7WOaiZ_0dNP^w3MeuH%TD9+7Rh8BxHu;_9rxlFfF3o3n zSnhK}9)E=Y#66&^rF|bQ$8D9pf8@_HJ|1=b8;tW0I8F@#7jd8aVbc4g>m;Le(n_WG zN!N%RmT=!KibSQ8+)w?4lncj|bT3AUr#HXJn`H9_M7@w{VX=3+a#iy&D z_IP(Zg`=JMj}`m=CjDWskMJk;!@Sc~;PKrt;rUE&s9vnpCJX(`h0CNLm5qkaCY7h8 zdz!qj+WDAb^a+7esdZVs9g^;^>G`@+VY{S5x^;2>SQB*9I9s^hy##>~=Wjn}T#W1- zSTMfA2R5D@->GGc|B%6jeiuKe4WGR0bIt7woB-}o*jeX~(W=5De8J23vy25Z@+bBa zN&no>$9^J98{K@r5)0#3#O*A6R%+@mR68G+I2^uAG7q8mVVUI>Sy4*qNJ_~erN6mNr(77gq&jZ4#^Mu|2XALm9*JD;*#M;pF&{p@@^db8GJ`FCRfs_R?l z=MaC9pNf{Jo}7U{S?@W4o=n#tenEaNMpsEg{dJ8a_`2y*w9An!O;o>_AwbP z|Gp;s%lB)$6;7+)0mXoy`%kowQhJx!<>hq^rE`vhEnuaGGCxt^U} zc(#o1QmAJP|5MlF*@gH1-Ig-;(Xl6f?~32&lBL~`>p`jJe%^t!-%@y-b##XK9@`C!No=w6>pgzDUxc zJc)l%$@+Er<<0#*z&Nw@J8oq0*{>~x9vyPMs{9tx`QrfT>nk3Q3F%3{kaX<32k_1A zwDO<(H42~f7CU0|wrpN|s&t@IGy9OfpDy`vP3=T7RUMVMrgkEks`FW#I~O~V*u1%_ zYO87deLnfEyXlAgf#~1S1xmMgnfi0HO&@dIh*5QhzAr{EAX`M(FRJZyMp8f7qUUYn z*XsQPh)c=)_ziZS$I{mC{wxOFd^||M;R`Sh!%M_YmOCbkJZI}*$_H`X;z`bD=2s`Z z%180QVzFOI-y-FgLBnsHeL=pT75Cgoe{kMF`?=oM+jbn%{?xQz$?C(B4*73UE*5M?J27%U7EDa(b@bmFBn2LRHdbL$3T}+70L9U5ZBte?7`qx2V4s@@Yu#xS``m z_>*woFXFsHH|j(3Wigr~i2HZxTj12SUtDJse5#rzyz}YL8$73H23Pf!)4Q^9t5oEB zN=7k)Fye=EjY8jkf%$I*+V znP@3qli{!)EbWyFvG5)34{Meu-Y5n8Yx|^rx$suW5A}okDT$P;)ODS_>UyzZ>*VP= zj;)iY>o~7eeqC<-x>NbJ+BIF^B|R$ViN~v!sQ&PCnNCNib20kk|5ZG2jzHRP;g?O4 zE$d5kX~-wD!KeMThlH-B!o^xI@Wt zJ@))mr66JWr+5?*| zqa1J3G~dsHKK8V?AJ%_rKk5hc*$w^KZ|4}w1wBU`!ru@0{q|is_ji{u-$Q<0gEt;G3iDrp{J3uVbgEQGx$EVRN?qqM)$XIBzvG6@V|tHhdcfu}eY)Q* z9(<|j=VZC=ON&pC??e6~y-B|(?~?ea;Ip<@<<;Y6F6Z2T2NFc21LfP-pPUcNh@bEm z_WR{XxAq%O6@F{Gm4Cx=5k9iiUmqJ?DQF45Mc5CT@vYt4W&GxNkiTZ23i0?f`KzY&>DT7lJ4kyS@ZS-%pT_a3 zS-Y!0o3)$iee+kgp&|UzdGodoOY76`Q)#yzM)@b6pT{_dc&@Pg`*Zp0EPqcff4k*x zKtA;+f5qq`;nV+3KKB0Ilf&2h_mNz__iuYH-}|>R=wC=L@)zm&A-=~r<6p%6Nc=I) zALWIAmJ4ccGCQqtMc;QtIPV9X4@xcY&-3*U-~UNJlJZ8l;z!cCz^@qnt~`@&wezFf zB`N0>SK!YO-vbyg-~Yn)rbxU{<5*>^TM$0%fZEZ{-C|F09!AsM!>69+}RX?9O zP3bZR2;=8*N57x97|oabkY4+9{%oFJ?g!7#^?$tk%FoM{mvJ$A#dcpO$HU>DC3M>< z{m9eJ=^Qtd|2Q7I#BWu;$n;i+_OB)nnLmg8$o;2_cfgq2k8tj8f-^<@gK~=?hueAt^N>D%4rk{_!u_YMcJbFyvlwC0h9Bj7lB9p6_P#b( z__b6xSKf#4h0p7fE%6lpj^S<6-r4ek@bC}c1=M+6SYPOG!;^U$HI?v)%l&qZ_@qvrk6uHZ>8S7O#4Z?>{*U}5A77Z z$_z;27uSXr&-!k|d#~ZWPoBvb-|@gX39UbD-Wnuq-PK0h5gB&57<{DU)cCe6)-s8q4p~tS}1sh zaJo$HK8Jd)NBp}-q(k$*Ipc@*Htt)LA6bta>HCyeuX(?mjx+Z0N&EgitGL!>Y31J# zuSLKswEL6?^1*)W13{cg>fwC7Ji~e{m#0fSY<|v7N)N($829Tr|7Chh*Xi=`uudlQ zXT8g2)6Q=AD08QcX3_ml5}r3J8yE)yVdNx(j)2He4KXvtAcpQm!qV&=?(Y) zGX8vv(x*PC{MT*#S^uD=l^^5A-J0%Ie(fJneyt2@{p@=@T0a@*dpvFji}GcIWvbN`}6L~#p#}wD^EY$*J(nyC!-wJ52f8|=L+>tHfDVB zihG;eeFxxxU!{C@&qSA0XyKC~lhYd%Uc2)`J3_w$N*ceA?{uH}7RetAPP=}u4)BYIRjuKr&uc$K7G z?9Y?&C>7o=X+QVteoJ-_uhOsG{s{6%yYsv?9!O7?x+ zV)Qa8&_bVM@WmAYeaeMPl^!*1hw%X7<$kvN&&T42O9ObBe$)BFxcqQi*1yF<_fgSz z*pDJ~kB@QB65}t#YdB|*_rcEMJ^p$Q@+@DG= z)^w@xLY+4wZp{!vF}hk_5_p|(5 zCiWYs-t5%*UcTMXZtVl!Dc{_z_{W3lPZ6IbJ((X=!u}7c^h}SNJxToxvnQ#aVfG~T zGt{0Oub&a(y%Xa`d~U*chxxR_%zq#9i_yix2OcM-eB}MK3BoTjtQePPNryxIF$p>C z{P8=G@Aj-1>HXay9>V`aHl8L&#OsM!pqKftrBm*RsGq`hd!c__(2)7g9grjU8)+9% zUE%?k{VDijNd4ikUHQ(ZszHehc=;Ehe6oJG*pKQCrF&RU^hnSy?Vrzg;{nru0Utcv z#0S0(^kG5V^`x(Fvfr!jK|ggGAb#5ljK#c-zp3SKKmq(@eF)DGugK(c(a)Oa&98)f za#}$-^LS}&ayoC5k0*>Hez^CzNnTIeDA`fJPLHA(GRB{;&nHtg9pWMMv2lzWMvnoN z3!a0x2K`|_mtGdihtuV90T|Nb3ev;6G*&x=H-d7RzIJ$+T;Z4O(DsupYB%B$_2c4U z_21%6Ht(|jl7ILk+%G}4TiOlApZ133F2woExUTvq9#XiaNh<|TvP1bh>9#n%wV&)b zDsqSW2viT>Y1w>eku z+ILcKDt$_Ys+9BbP3dCtId7`-%XLyNHat(`=4bpoZnk!&rbD_N2LF*xKm0K89CMzp z_BGTiUjZnb_YrxdAHbh~k0H~i1M)tu+q|v&E=$|It@{p3+q|v&eUdIl=Lx(_@4KIG zet+uco8O=M`R4bVpYQv7GdOk+NZsK)qT}0eI1g)jz~Sh*&+)%!^HQys!gYLe^OCy3 z?N&QdscXNh)^GnFaiy+wt9GlsiyKO}q*wRV#RE#Wq|fZ-pwcZ_uJ*JT%@cgGad0?3 ze|9)Ne|9*EPcixrsUPwQ^(pz}?i%>X;s)eL4!z&+U#TfSWd6@T3LNqW?QAhRH%)VZ zeLaW%%f7&W@%u#GZt(rGoO~?Zqk4e)lYF_Mp6OS@odNi)w=-97R#*@3_Xh8a(NDDB zR}nktm$~+|`BF%a?PxcRCtarHNT2Pf8xQUlII-<7!u(Xz14`%eN%W#nZeY9QCrd5P z^*jK;FS$VVO`>84x=ojSoZHg!otqV2&Gb~~22GC~*7sYsYI@kly=LRR^N_wjRnv$& zSb61}q;IdLckI^sHHDkleHw91+eQ3I%k}QmXZLn}E+3X>xDQt7WO@a9Sl;tq6#i&; z$Umgp^YG;U3-)}pg8$*i{3Y;je7-&U3yjNk|9@Pf;~5u@2gij!(w{@sZd}d@$7Pum z$M*?`f5yMkb+HRH-`B_D+mz2kIXY@~`uo36KjEnOIc0o*^GsBYZ|f2O`SMBkPHBhu z9SZ7|3ePZq{tU4r(4SH+ZaiJm(4U$fI7!oe`!zlIq_hkDDe2?&=bbN;E!!2&_JwWn z_4&Tred2wi%wx5`nZ8u{jqg;&lkd03SE$#j|I2d z7Vg&-?zTnJZ~v|U=PBWNO7{0t7^f_r)2ZdREpDl|e@CXrS?{Aw_0*whq01%#BmDZ{ z`QW4BNal;>jwu!|oUG$*-^qYKt?BMa{pv&g2kxX?eMt3bP3_6`sNV%pZ?`AEKZifjuC6bY3Jav6N=?6SSHk`kdY06` z=&rzG0snp-%b$dFyd4eVSL(P(o*{pT{@EniLeIUjuS)s9T=Yw7gy1pM$ zzZ2^lk`DFo)j$RNvt@iL!w<-Nr+Yj45_6w-lnV0;te>4v-(dLcmuGelh2nwp@CrZZ zzw4#hB5xOQ_?qJTdyy_iZ;<|mc+ld-%@Vh=JDnE$KF}~}w$n~i`d*sP}HQ$?{RZ?XSh(xev$FzMFurkpLTW&R58DYtq$E=jlYZ>SHcSFjIE%K5r4=2u!TJs;Ac z<8I%-!TO4&t)HD;miGS6wY2xUN7Bjq$@)BXk);>gbD=za9~$Ct(tfB1L@(EM%;}fV zE|5>&23~S`^?Ui+eg9{j#S4xi{>F2zr`zw#K+}mAND6> zUBk!G=++HSqo6BdssTDr$3;TEVySN|b2`P|o-|YbXCq<8GJDDHz z<72{MdpALc#v_V<`IM#5@RakphW|bpr?}pw>GU3alZW&ke4~fmgAe~f=v=A$JjnED zIuBC)6{qtc<>xq^2Pq$qHxDXCKUVtIO+R<5{zH6O`K;IIKVbJ(4C=iVe%?2+eRkEW z^gK^;1-S%%C?|jTh4goR`h?s&`aK(0x2GT^e(mD#yCKgUuY*B+NyZua7;(WSdz|i< zs_m70d`DTHAs)_$uY3{YV93UM(r<~M8J45`;C?%;AIQ;@@Q>(6%mTi|v=1W zTO`Z%99FyaX7O(Z6%Oft0eqQwMCGe|iaMOd$ku_z?8i$5KsesiAI>jvUHOvmf5dx} zYTBOrL(UiBJm?3xa@4oj-=q9v{xRV_#&RPD52i=@W1?@b#$JnokAOT*|spm-4Ou8XP1-)8dXc3I=(xR=HB)B~!w8m5Q5J=m4Zh|Uzg9HeyEx5Zohtle16~X9)OH%s;|=d zTwV25(%qx|Yp6X*dKXGMueW?&SG~pb){Tm1F?wwaUSsjcM|0yI>Wz>;26N@c;*Xuj z$sZs274gS)myka$lKzMO?7bjOF?v$?BlGW-U$8$y?S*~+6nfdx$}iXtU}@F2?Z*3a z7}v19d!)S|Nqb>FHBd47XUWg(quJTiJ}N$$eN=oh`>6O7qq7As_b2{u&}Y3(`b_Vc z$^4~Nif};%oT1Jtck% za`Gf`1k<;!pIGjqoP37z?(qheyO8CAxQ5WBU-5ANlKA!*ea;2GVgKgBAMo|&u-sX> za?4Q8@e9kH!EzOCFWzNzy4KoXt52@a00kMJPu_*{h9B|&4)vLFbWPxg1A;r|~Gk-y9z z^|)W^uc}^;8`^%-YkGe`@k{zNUKbB)f0E^3&$XQ}J$ryGh5JaNY{V z*b3)#g)?OH1>2wQ`&2yMAFeC8{oQ#t<5>WVpRfPAUtf$Aze@cPu@lv99iO=Iu%we- z8~=eXYP!$(V^HHae$Q*Au4&9Sq+C2;cn%(rbTN9P^4F<*C7tg-`~8IvHrtJjz}Mr~ zuFvVW;a`-Ud(ivsMwha87%!Wz@cb8}0qk${`LE|oxukot`eD7(63qew0t~^G?GiKRYG91-+%|?(LdxY}a(}R!t9V)pXxxNsq7B&lmiX z^&N_Dptm;X;=F=yAb)-?>6V9@`<1_c`Yy;Z<#iTX;&^PxmFM@KTz|5h!%a}Gx-?v4&jQb|}D@I3DpAFf#$C4fK8o~`I;`=EWPs*RK`Zctdt+%ju&HZ>W z(#7Zp0w4aoj#B`?2k*mv$T;0bC`#{z?;yRDFEafBhQ!b5&Uy6;rfbXvzXE5%L7Xhr zL(ge~84_;vwDw+F;` zAMi#TPw>s=L5DTnsq@9Kf8@J%^GBhd&6hCWQF`A_s-V4_^+`Vd@qMySS^AgJRo7uh z*J(M*{Z`fs=(>>l-S+!pom=X=zD>_JOwsy&?`v3pU(PNPU&cR<#}tXETcil>r_NDnQP^6~JZmU?roULWdFKeIu!BYGml?>jQ@J}CJt z$C(}086?el#Pl%U+qqZrlP$aTxqeumJB;5)wEwZmJAzN7Xn@YAM#m~l+Cv*G;b^=PjcRYhK~Kg{IwUWHp9RC#p! zQU9Q&4Ufj%nl^ia^DC0B3~K%C{EGH(yz?u#r%dHGkcZu%iTmNyhxzY>ti*oGW9h?p zN&j9ZaGlTM8PkwUI;*{mXMph}ZSplk^&R3Z(w}&Syymz_I^+-9J&&Jo{J7rc=O37+ z3Gnj|ar(Vby_X||)0LYag?h!~Y%YJ4lR41om0FkdE7K=>-x~Ha2tSl2JXa8pYw8Eh zn|g_)v+qu6KrO^W+BH9v?OX!BX|)IMR=C4PuMwlu?Mk=U>`5Lj;Vn6<9lTo&PxDu7 zKN6~x*+F##?7S~kH*4jQbm#eD7xy|t0Ce1eOgF1k5AfA`q zg>{PPPATB?n^Eu|e|-P0yC^qm`78Ao3LaJ8H{4LXl3v9#9=K5P?K`OW4$ji_a_v_! z(sU@7SD_vF2`a~dJS+iEd3+(HZ)u*RR zcKSWK*v1{_O!U3km3$o4_vt0e^}egI;;*T_9MN{@-!$>H(Vz5OiG3PP{lPduuB0D6 zzop&k_%VRkkM+L7`DXxs4duwkHQ?h*@!jYU{!W3f{!wh-+atVQmJ9q^@`L*gq5u8d z9K0^riMXzGBbIBOWllF=+BU&b}4D2f4pCL->K~uKZQ!*z-*Gg7WfSk(bPlEtK|gPFVFwZ;z%^ zKXb08Q$JJn>3Du-5tfv{N`1Q2$Gtz&ZrnIS(n+t%Z9MRFP4^wv_k$;CdifzqkJpa- zvmu?G{+}Cz{!d4KF~P#Urd=lh-mYm`49Iki$Pe2Xq@&I+r_q-l}mHkBh|hxq^S<_arvDG;MK|cwm~Q zJ-#yTe!TM)-yH{3p9K11GUcak_=2wlU(+Aq{PL5d&HZ{jH{YEF{%84F07W?%$(26@ z{T#}@&szsjuDa#0_*<~c^33L~cUbzDH*cK_youjuZ~q16t;0sgTa9i|$@JKdHE&&j z_KxMJy%?afdFy^1rvQEr-na0T`5Ej_Wj*zm@CmvLK6Yk4D-i{u>AprY_r;D7&Yt3IXJ(7n{IK^r0=+h@~sK4+ps+b<} zeLMWl03o|Q>2IhW^6w9@9)Iq4pL5wVN&Eh}r3SZLC`*3mzr6uD9yjuPdMow$(w}Pg zT(gH4svhg@()7SAP4`XH^q}@1>(`P#UVBlDHj15reNy^azvBVbtMQ=e+i~sgzYCnO zUspEu>tgBmuex8pUpH�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�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 [!NOTE] +> This is the **Anchor v2** copy of this example. Every `anchor` command on this page +> needs the v2 CLI: `cargo install anchor-cli --version 2.0.0-rc.1 --locked` (avm has +> no prebuilt binary for this pre-release). The Anchor v1 version of this example is in +> [`../anchor-v1`](../anchor-v1/). + Transfer tokens between token accounts via CPI to the token program. See also: [Transfer Tokens overview](../README.md) and the [repository catalog](../../../README.md). From b2f3a19642a6e681c25d83049b8091ad311d158b Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 22 Aug 2026 01:06:10 +0000 Subject: [PATCH 2/3] ci: give the Anchor v1 jobs their own check names anchor-v1.yml was copied from anchor.yml verbatim, so both files declared jobs named `changes`, `summary` and `build-and-test-group-N`. GitHub reports check names from job names, not the workflow's `name:`, so a pull request touching both trees showed two `changes`, two `summary` and up to 28 indistinguishable `build-and-test-group-N` rows with nothing to say which Anchor each belonged to. The v1 jobs are now `changes (Anchor v1)`, `anchor-v1-group-N` and `summary (Anchor v1)`. Job ids are unchanged, so the `needs:` edges still resolve; only the reported names differ. anchor.yml keeps its existing names, so nothing outside the repository that refers to them has to change. Also fixes six broken relative links. Three READMEs pointed at the repository catalog one directory short of the root - `../../README.md` from `basics/counter/anchor/` is `basics/README.md`, which does not exist. The restore mirrored each into anchor-v1, doubling them, so all six are corrected here. Verified: no check name is now shared between the two workflows, and every relative link in all 110 Anchor READMEs resolves on disk. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01BMDApPWRHM1StJwtyDSrEM --- .github/workflows/anchor-v1.yml | 4 +++- basics/counter/anchor-v1/README.md | 2 +- basics/counter/anchor/README.md | 2 +- basics/favorites/anchor-v1/README.md | 2 +- basics/favorites/anchor/README.md | 2 +- .../transfer-hook/allow-block-list-token/anchor-v1/README.md | 2 +- .../transfer-hook/allow-block-list-token/anchor/README.md | 2 +- 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/anchor-v1.yml b/.github/workflows/anchor-v1.yml index b3b5296f9..d52484d5a 100644 --- a/.github/workflows/anchor-v1.yml +++ b/.github/workflows/anchor-v1.yml @@ -22,6 +22,7 @@ env: jobs: changes: + name: changes (Anchor v1) runs-on: ubuntu-latest permissions: pull-requests: read @@ -151,7 +152,7 @@ jobs: fail-fast: false matrix: index: ${{ fromJson(needs.changes.outputs.matrix) }} - name: build-and-test-group-${{ matrix.index }} + name: anchor-v1-group-${{ matrix.index }} outputs: failed_projects: ${{ steps.set-failed.outputs.failed_projects }} steps: @@ -328,6 +329,7 @@ jobs: run: sccache --show-stats summary: + name: summary (Anchor v1) needs: [changes, build-and-test] if: always() runs-on: ubuntu-latest diff --git a/basics/counter/anchor-v1/README.md b/basics/counter/anchor-v1/README.md index eb7dba01c..9f9f269b8 100644 --- a/basics/counter/anchor-v1/README.md +++ b/basics/counter/anchor-v1/README.md @@ -8,7 +8,7 @@ Increment a global counter stored in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Anchor](https://solana.com/docs/terminology#anchor) adds an explicit `initialize` handler that the native variant handles differently. -See also: the [repository catalog](../../README.md). +See also: the [repository catalog](../../../README.md). ## Major concepts diff --git a/basics/counter/anchor/README.md b/basics/counter/anchor/README.md index b425e98ad..938a2454e 100644 --- a/basics/counter/anchor/README.md +++ b/basics/counter/anchor/README.md @@ -8,7 +8,7 @@ Increment a global counter stored in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Anchor](https://solana.com/docs/terminology#anchor) adds an explicit `initialize_counter` handler that the native variant handles differently. -See also: the [repository catalog](../../README.md). +See also: the [repository catalog](../../../README.md). ## Major concepts diff --git a/basics/favorites/anchor-v1/README.md b/basics/favorites/anchor-v1/README.md index d30ce843b..e14d8c79b 100644 --- a/basics/favorites/anchor-v1/README.md +++ b/basics/favorites/anchor-v1/README.md @@ -8,7 +8,7 @@ Store per-user favorites in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Account](https://solana.com/docs/terminology#account) constraints ensure each user can only modify their own data. -See also: the [repository catalog](../../README.md). +See also: the [repository catalog](../../../README.md). ## Major concepts diff --git a/basics/favorites/anchor/README.md b/basics/favorites/anchor/README.md index 1b49da05b..2ff9e9c97 100644 --- a/basics/favorites/anchor/README.md +++ b/basics/favorites/anchor/README.md @@ -8,7 +8,7 @@ Store per-user favorites in a [PDA](https://solana.com/docs/terminology#program-derived-address-pda). [Account](https://solana.com/docs/terminology#account) constraints ensure each user can only modify their own data. -See also: the [repository catalog](../../README.md). +See also: the [repository catalog](../../../README.md). ## Major concepts diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md index 03183e2d1..363747d3c 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor-v1/README.md @@ -8,7 +8,7 @@ Restrict transfers using an onchain allow/block list enforced by a transfer hook program. -See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../README.md). +See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../../../README.md). ## Major concepts diff --git a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md index 5b5f638d8..9b0bdf8db 100644 --- a/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md +++ b/tokens/token-extensions/transfer-hook/allow-block-list-token/anchor/README.md @@ -8,7 +8,7 @@ Restrict transfers using an onchain allow/block list enforced by a transfer hook program. -See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../README.md). +See also: [Allow Block List Token overview](../README.md) and the [repository catalog](../../../../../README.md). ## Major concepts From b180f249dc43bf20f9a9132cc63600fd1fc05b54 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 22 Aug 2026 03:51:01 +0000 Subject: [PATCH 3/3] ci: pin the Anchor v1 CLI to crates.io, and schedule both Anchor workflows Two fixes to the Anchor v1 job, both inherited from the workflow it was restored from rather than introduced by the restore. The v1 job installed avm with `cargo install --git https://github.com/coral-xyz/anchor avm`, which builds avm from the tip of anchor's main branch. What CI installs then drifts with whatever landed there, and it costs a full avm build on every cold cache. The v2 job already moved off avm because avm has no prebuilt binary for the 2.0.0-rc.1 pre-release. 1.1.2 is an ordinary published release, so the v1 job can use the same shape for the simpler reason that it is pinned and reproducible: cargo install anchor-cli --version 1.1.2 --locked --force The cache key changes with it, so an entry holding an avm-built binary is never restored over the registry one. Both workflows also gain a weekly schedule - v2 Mondays 03:00 UTC, v1 05:00 UTC, staggered so 110 project builds do not land at once. The analyze step has always treated `github.event_name == 'schedule'` as "build every project", but neither workflow declared a schedule, so that branch had never run. It earns its place because no Anchor project commits a Cargo.lock (.gitignore ignores **/*/Cargo.lock) and Dependabot is configured for directory "/", the root workspace, which the anchor-v1 crates are not members of. Dependency drift in either tree was otherwise invisible until an unrelated pull request happened to touch those files. Also corrects a comment both files carried claiming these steps install "Anchor via avm", which stopped being true for v2 several commits ago and is not true for v1 now. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01BMDApPWRHM1StJwtyDSrEM --- .github/workflows/anchor-v1.yml | 39 ++++++++++++++++++++++----------- .github/workflows/anchor.yml | 20 ++++++++++++----- CHANGELOG.md | 14 ++++++++++++ 3 files changed, 55 insertions(+), 18 deletions(-) diff --git a/.github/workflows/anchor-v1.yml b/.github/workflows/anchor-v1.yml index d52484d5a..16720e05f 100644 --- a/.github/workflows/anchor-v1.yml +++ b/.github/workflows/anchor-v1.yml @@ -8,6 +8,15 @@ on: types: [opened, synchronize, reopened] branches: - main + # These projects have no committed Cargo.lock (.gitignore ignores **/*/Cargo.lock), + # so their transitive dependencies resolve fresh on every run and can break with + # nobody touching the code. Dependabot does not cover them either: it is configured + # for directory "/", which is the root workspace, and the anchor-v1 crates are not members of it. A weekly + # build catches that drift on a cadence instead of at whatever unrelated pull request + # happens to touch these files next. The analyze step already treats a scheduled run + # as "build everything". + schedule: + - cron: '0 5 * * 1' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -177,11 +186,11 @@ jobs: # runs `anchor --version | awk '{print $2}'` and writes the result straight to # $GITHUB_OUTPUT. `anchor --version` now prints more than one line, so the value # becomes multi-line and the step dies with "Invalid format", aborting the whole - # job before any project is built. These steps install the same toolchain (Solana - # via the Anza installer, Anchor via avm) and read the version from the first line - # only. The other workflows that use setup-anchor (native, quasar, pinocchio, - # solana-asm) hit the same latent bug once their matrices run; migrate them the - # same way once this is confirmed green. + # job before any project is built. These steps install the toolchain directly + # (Solana via the Anza installer, the Anchor CLI from crates.io) and read the + # version from the first line only. The other workflows that use setup-anchor + # (native, quasar, pinocchio, solana-asm) hit the same latent bug once their + # matrices run; migrate them the same way once this is confirmed green. - uses: actions/setup-node@v4 with: node-version: lts/* @@ -194,23 +203,27 @@ jobs: with: path: | ~/.cargo/bin/anchor - ~/.cargo/bin/avm - ~/.avm # Pinned to match the anchor-lang/anchor-spl crate version the programs depend on. - key: anchor-toolchain-${{ runner.os }}-1.1.2 + # The key deliberately differs from the old avm-based one so a cache entry + # holding an avm-built binary is never restored over this. + key: anchor-cli-crates-io-${{ runner.os }}-1.1.2 - name: Install Anchor 1.1.2 run: | - export PATH="$HOME/.cargo/bin:$HOME/.avm/bin:$PATH" + export PATH="$HOME/.cargo/bin:$PATH" # `anchor --version` can emit more than one line; read the first line only so # a multi-line value never reaches downstream parsing. current="$(anchor --version 2>/dev/null | head -n1 | awk '{print $2}' || true)" if [ "$current" != "1.1.2" ]; then - cargo install --git https://github.com/coral-xyz/anchor avm --force - avm install 1.1.2 - avm use 1.1.2 + # Install the CLI from crates.io rather than through avm, matching the + # Anchor v2 job. `cargo install --git ... avm` builds avm from the tip of + # anchor's main branch, so what CI installs drifts with whatever landed + # there. 1.1.2 is an ordinary published release — unlike the 2.0.0-rc.1 + # pre-release that forced the v2 job off avm — so the CLI comes straight + # from the registry. --locked builds it against its own published lockfile + # so the result does not drift with the registry either. + cargo install anchor-cli --version 1.1.2 --locked --force fi echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" - echo "$HOME/.avm/bin" >> "$GITHUB_PATH" - name: Install Surfpool run: curl -sL https://run.surfpool.run/ | bash - name: Display Versions diff --git a/.github/workflows/anchor.yml b/.github/workflows/anchor.yml index 191c5c202..e8d9ab2ae 100644 --- a/.github/workflows/anchor.yml +++ b/.github/workflows/anchor.yml @@ -8,6 +8,16 @@ on: types: [opened, synchronize, reopened] branches: - main + # These projects have no committed Cargo.lock (.gitignore ignores **/*/Cargo.lock), + # so their transitive dependencies resolve fresh on every run and can break with + # nobody touching the code. Dependabot does not cover them either: it is configured + # for directory "/", which is the root workspace, and the per-project anchor/ workspaces are + # what `anchor build` actually resolves. A weekly + # build catches that drift on a cadence instead of at whatever unrelated pull request + # happens to touch these files next. The analyze step already treats a scheduled run + # as "build everything". + schedule: + - cron: '0 3 * * 1' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -177,11 +187,11 @@ jobs: # runs `anchor --version | awk '{print $2}'` and writes the result straight to # $GITHUB_OUTPUT. `anchor --version` now prints more than one line, so the value # becomes multi-line and the step dies with "Invalid format", aborting the whole - # job before any project is built. These steps install the same toolchain (Solana - # via the Anza installer, Anchor via avm) and read the version from the first line - # only. The other workflows that use setup-anchor (native, quasar, pinocchio, - # solana-asm) hit the same latent bug once their matrices run; migrate them the - # same way once this is confirmed green. + # job before any project is built. These steps install the toolchain directly + # (Solana via the Anza installer, the Anchor CLI from crates.io) and read the + # version from the first line only. The other workflows that use setup-anchor + # (native, quasar, pinocchio, solana-asm) hit the same latent bug once their + # matrices run; migrate them the same way once this is confirmed green. - uses: actions/setup-node@v4 with: node-version: lts/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 93d091b7a..773b599c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,20 @@ tested by its own CI job. filename, triggers and `find -type d -name "anchor"` discovery are unchanged. Both workflows match a directory name exactly, so neither can ever see the other's projects. +- Both Anchor workflows install the CLI from crates.io (`cargo install anchor-cli + --version --locked`). The v1 job started out installing avm from the tip of + anchor's `main` branch, which meant what CI installed drifted with whatever landed + there; 1.1.2 is an ordinary published release, so it comes from the registry like + 2.0.0-rc.1 does. +- Both Anchor workflows now run weekly (v2 Mondays 03:00 UTC, v1 05:00 UTC). The + analyze step has always treated a scheduled run as "build everything", but nothing + declared a schedule, so that path had never executed. It is worth having because no + Anchor project commits a `Cargo.lock` and Dependabot only covers the root workspace, + so dependency drift in either tree is otherwise invisible until an unrelated pull + request happens to touch it. +- The two workflows no longer report colliding check names. Both declared jobs called + `changes`, `summary` and `build-and-test-group-N`; the v1 job names are now + `changes (Anchor v1)`, `anchor-v1-group-N` and `summary (Anchor v1)`. - Every Anchor example README now names the CLI its commands need, on both sides: `anchor/` pages say Anchor v2 and `anchor-v1/` pages say Anchor v1. A bare `anchor build` was unambiguous while the repository had one Anchor and is not

+ {status.message}{" "} + + {shortAddress(status.signature, 6)} ↗ + +