diff --git a/.github/actions/cache-node/action.yml b/.github/actions/cache-node/action.yml new file mode 100644 index 0000000..37df5c9 --- /dev/null +++ b/.github/actions/cache-node/action.yml @@ -0,0 +1,45 @@ +name: cache-node +description: install and Cache Node Modules +runs: + using: composite + steps: + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'yarn' + cache-dependency-path: | + yarn.lock + ui/yarn.lock + + - name: Cache top-level node modules + id: top-node-modules + uses: actions/cache@v4 + with: + key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + path: node_modules + + - name: Cache ui node modules + id: ui-node-modules + uses: actions/cache@v4 + with: + key: node_modules-${{ runner.os }}-${{ hashFiles('ui/yarn.lock') }} + path: ui/node_modules + + - name: Cache nextjs build cache + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/ui/.next/cache + # Generate a new cache whenever packages or source files change. + key: nextjs-${{ runner.os }}-${{ hashFiles('ui/src/yarn.lock') }}-${{ hashFiles('ui/src/**/*.ts', 'ui/src/**/*.tsx') }} + # If source files changed but packages didn't, rebuild from a prior cache. + restore-keys: | + nextjs-${{ runner.os }}-${{ hashFiles('ui/src/yarn.lock') }}- + + - name: Install dependencies + shell: bash + run: | + echo "Before installing dependencies" $(date "+%F %T.%3N") + yarn --frozen-lockfile --network-concurrency 2 + (cd ui && yarn --frozen-lockfile --network-concurrency 2) + echo "After installing dependencies" $(date "+%F %T.%3N") \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 188f291..32a7e02 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,7 @@ on: [push, pull_request] env: FOUNDRY_PROFILE: ci + FOUNDRY_FORK_BLOCK_NUMBER: 61373304 jobs: common: @@ -12,22 +13,11 @@ jobs: - name: Check out code uses: actions/checkout@v4 - - name: Cache solana + - name: Install and cache solana uses: ./.github/actions/cache-solana - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'yarn' - cache-dependency-path: | - yarn.lock - ui/yarn.lock - - - name: Install dependencies - run: | - yarn --frozen-lockfile --network-concurrency 2 - (cd ui && yarn --frozen-lockfile --network-concurrency 2) + - name: Install and cache node modules + uses: ./.github/actions/cache-node - uses: dtolnay/rust-toolchain@stable with: @@ -35,11 +25,14 @@ jobs: - name: Cache rust uses: Swatinem/rust-cache@v2 + with: + workspaces: solana-contract - - name: install essentials - run: | - sudo apt-get update - sudo apt-get install -y pkg-config build-essential libudev-dev + - name: Install essentials + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: pkg-config build-essential libudev-dev + version: 1.0 evm: runs-on: ubuntu-latest @@ -62,8 +55,10 @@ jobs: forge build --sizes - name: Run Forge tests + env: + RPC: ${{ secrets.POLYGON_RPC }} working-directory: evm-contract - run: forge test -vvv + run: forge test -vvv --fork-url $RPC --fork-block-number $FOUNDRY_FORK_BLOCK_NUMBER solana: needs: common @@ -77,6 +72,11 @@ jobs: - name: Cache rust uses: Swatinem/rust-cache@v2 + with: + workspaces: solana-contract + + - name: Install and cache solana + uses: ./.github/actions/cache-solana - name: Run fmt working-directory: solana-contract @@ -117,14 +117,8 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'yarn' - cache-dependency-path: | - yarn.lock - ui/yarn.lock + - name: Install and cache node modules + uses: ./.github/actions/cache-node - name: Check that all deps are restored run: | diff --git a/.gitmodules b/.gitmodules index e2bd5e0..3616096 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "evm-contract/lib/forge-std"] path = evm-contract/lib/forge-std url = https://github.com/foundry-rs/forge-std -[submodule "evm-contract/lib/contracts"] - path = evm-contract/lib/contracts - url = https://github.com/ToucanProtocol/contracts [submodule "evm-contract/lib/OffsetHelper"] path = evm-contract/lib/OffsetHelper url = https://github.com/ToucanProtocol/OffsetHelper @@ -15,3 +12,6 @@ path = evm-contract/lib/openzeppelin-contracts-upgradeable url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable branch = release-v4.9 +[submodule "evm-contract/lib/ToucanProtocol"] + path = evm-contract/lib/ToucanProtocol + url = https://github.com/ToucanProtocol/contracts diff --git a/docs/Solana Carbon Retirement.puml b/docs/Solana Carbon Retirement.puml index 214b60f..bcdf031 100644 --- a/docs/Solana Carbon Retirement.puml +++ b/docs/Solana Carbon Retirement.puml @@ -47,17 +47,10 @@ TX 3 - Redeem bridged tokens end note User->Wormhole_P: Poll for VAA -note left -TODO is this correct? -end note Wormhole_P-->User: <> User->HoldingContract_P: Redeem from Bridge HoldingContract_P->Wormhole_P:Redeem VAA Wormhole_P-->HoldingContract_P: <> -note left -TODO can we store the originator -of the bridge here, ie the solana address? -end note HoldingContract_P-->User: <> note left of User @@ -78,11 +71,6 @@ CarbonOffsetSettler_P->TCO2Contract_P:retireAndMintCertificate TCO2Contract_P-->CarbonOffsetSettler_P:<> CarbonOffsetSettler_P-->HoldingContract_P: <> HoldingContract_P-->User: <> - -note left -TODO any work required here to convert it to an ERC721? -end note - note left of User TX 5 - Bridge Retirement Certificate end note @@ -97,9 +85,6 @@ TX 6 - Redeem Retirement Certificate end note User->Wormhole_S: Poll for VAA -note left -TODO is this correct? -end note Wormhole_S-->User: <> User->RetirementProgram_S: Redeem ticket (pass VAA) RetirementProgram_S->Wormhole_S: Redeem VAA diff --git a/evm-contract/lib/contracts b/evm-contract/lib/ToucanProtocol similarity index 100% rename from evm-contract/lib/contracts rename to evm-contract/lib/ToucanProtocol diff --git a/evm-contract/lib/forge-std b/evm-contract/lib/forge-std index 58d3051..4695fac 160000 --- a/evm-contract/lib/forge-std +++ b/evm-contract/lib/forge-std @@ -1 +1 @@ -Subproject commit 58d30519826c313ce47345abedfdc07679e944d1 +Subproject commit 4695fac44b2934aaa6d7150e2eaf0256fdc566a7 diff --git a/evm-contract/remappings.txt b/evm-contract/remappings.txt index a725e46..9e33298 100644 --- a/evm-contract/remappings.txt +++ b/evm-contract/remappings.txt @@ -1,5 +1,5 @@ forge-std/=lib/forge-std/src/ @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ @openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ -toucan/=lib/contracts/contracts +toucan/=lib/ToucanProtocol/contracts @OffsetHelper/=lib/OffsetHelper/contracts \ No newline at end of file diff --git a/evm-contract/src/CarbonOffsetSettler.sol b/evm-contract/src/CarbonOffsetSettler.sol index 7064af6..5e32825 100644 --- a/evm-contract/src/CarbonOffsetSettler.sol +++ b/evm-contract/src/CarbonOffsetSettler.sol @@ -9,8 +9,6 @@ import "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeab import "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol"; import "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721Upgradeable.sol"; import "forge-std/console.sol"; -import "toucan/RetirementCertificates.sol"; -import "forge-std/console.sol"; contract CarbonOffsetSettler is OwnableUpgradeable, IERC721Receiver { address public constant NCT = 0xD838290e877E0188a4A44700463419ED96c16107; diff --git a/evm-contract/src/test/HoldingContract.t.sol b/evm-contract/src/test/HoldingContract.t.sol index 644d037..70e9ac1 100644 --- a/evm-contract/src/test/HoldingContract.t.sol +++ b/evm-contract/src/test/HoldingContract.t.sol @@ -7,17 +7,24 @@ import "src/CarbonOffsetSettler.sol"; import "src/HoldingContractFactory.sol"; import "forge-std/console.sol"; import "lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721Upgradeable.sol"; +import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; contract HoldingContractTest is Test { HoldingContract holdingImplementation; CarbonOffsetSettler carbonOffsetSettler; HoldingContractFactory factory; address proxy; - address usdc = 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174; +// address usdc = 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174; address public constant CERT = 0x5e377f16E4ec6001652befD737341a28889Af002; + IERC20 public constant usdc = IERC20(0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174); + address user = address(1234); - address tco2 = 0x463de2a5c6E8Bb0c87F4Aa80a02689e6680F72C7; + + // TCO2 contract address for carbon credit project + // https://registry.verra.org/app/projectDetail/VCS/875 + // 208k supply remaining at polygon block # 61373304 + address tco2 = 0x0BCCAB36F518f55E00f3efe2e828aE63cd2ac1B9; string beneficiaryName = "0x0"; bytes32 SolanaAccountAddress = ""; @@ -110,12 +117,12 @@ contract HoldingContractTest is Test { assertEq(HoldingContract(proxy).beneficiary(), address(146)); IERC721Upgradeable cert = IERC721Upgradeable(CERT); - deal(usdc, proxy, 100 * 1e6); + deal(address(usdc), proxy, 100 * 1e6); HoldingContract(proxy).offset("entity", "msg"); assertEq(IERC20(usdc).balanceOf(proxy), 0); assertEq(cert.balanceOf(proxy), 1); - // deal(usdc, proxy, 100 * 1e6); + // deal(address(usdc), proxy, 100 * 1e6); // HoldingContract(proxy).offset("2nd entity", "msg"); // assertEq(cert.balanceOf(proxy), 2); @@ -132,7 +139,7 @@ contract HoldingContractTest is Test { ); HoldingContract(proxy).setBeneficiary(address(6143), "Solana"); assertEq(HoldingContract(proxy).beneficiary(), address(6143)); - deal(usdc, proxy, 100 * 1e6); + deal(address(usdc), proxy, 100 * 1e6); HoldingContract(proxy).offset("entity", "msg"); assertEq(IERC20(usdc).balanceOf(proxy), 0); @@ -148,7 +155,7 @@ contract HoldingContractTest is Test { function test_Offset() public { // fund holding contract with USDC uint amount = 100 * 1e6; - deal(usdc, proxy, amount); + deal(address(usdc), proxy, amount); // vm.prank(0x19aB546E77d0cD3245B2AAD46bd80dc4707d6307); // usdc.call( // abi.encodeWithSignature( @@ -161,7 +168,6 @@ contract HoldingContractTest is Test { IERC721Upgradeable cert = IERC721Upgradeable(CERT); assertEq(cert.balanceOf(proxy), 0); assertEq(IERC20(usdc).balanceOf(proxy), 100 * 1e6); - // Call offset and emit event vm.expectEmit(true, true, true, true); @@ -201,7 +207,7 @@ contract HoldingContractTest is Test { // Fund holding contract with USDC uint amount = 100 * 1e6; - deal(usdc, proxy, amount); + deal(address(usdc), proxy, amount); // vm.prank(0x19aB546E77d0cD3245B2AAD46bd80dc4707d6307); // usdc.call( // abi.encodeWithSignature( @@ -236,12 +242,27 @@ contract HoldingContractTest is Test { function test_bridge() public { uint amount = 100 * 1e6; - deal(usdc, proxy, amount); + deal(address(usdc), proxy, amount); vm.startPrank(user); + + vm.recordLogs(); HoldingContract(proxy).offset("entity", "msg"); - HoldingContract(proxy).bridgeToAddress(4054, SolanaAccountAddress); - IERC721Upgradeable cert = IERC721Upgradeable(CERT); + bytes32 topic = keccak256("Transfer(address,address,uint256)"); + uint256 tokenId; + Vm.Log[] memory logs = vm.getRecordedLogs(); + for (uint i = 0; i < logs.length; i++) { + if (logs[i].topics[0] == topic && logs[i].topics.length > 3) { + // from address (0) is topic 1 + // to address (holding contract) is topic 2 + // tokenId is topic 3 + tokenId = uint256(logs[i].topics[3]); + } + } + + HoldingContract(proxy).bridgeToAddress(tokenId, SolanaAccountAddress); + + IERC721Upgradeable cert = IERC721Upgradeable(CERT); assertEq(cert.balanceOf(proxy), 0); } } diff --git a/package.json b/package.json index 1395f2e..f378ce8 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", "@jup-ag/api": "^6.0.10", "@solana/spl-token": "0.4.6", - "@solana/web3.js": "^1.76.0", + "@solana/web3.js": "^1.95.3", "bs58": "^5.0.0", "ethers": "^5.7.2", "jsbi": "^4.3.0", @@ -34,15 +34,11 @@ "version": "1.0.0", "main": "index.js", "scripts": { - "build": "tsc", - "initialize": "ts-node scripts/initialize.ts", - "wrap-sol": "ts-node scripts/wrapSOL.ts", - "deposit-usdc": "ts-node scripts/depositUSDC.ts", - "swap": "ts-node scripts/swap.ts", - "bridge": "ts-node scripts/bridge.ts", - "redeem": "ts-node scripts/redeemPolygonVAA.ts", - "retire": "ts-node scripts/retireFunds.ts", - "bridge-nft": "ts-node scripts/bridgeNFT.ts" + "install:all": "yarn install && (cd ui && yarn install)", + "build:ui": "cd ui && yarn build", + "start:ui": "cd ui && yarn dev", + "build:evm": "cd evm-contract && forge build", + "build:solana": "cd solana-contract && anchor build" }, "repository": { "type": "git", diff --git a/scripts/bridge.ts b/scripts/bridge.ts index 59c82fa..9e3d8ef 100644 --- a/scripts/bridge.ts +++ b/scripts/bridge.ts @@ -1,5 +1,5 @@ // Transfer from Solana to Polygon using Wormhole SDK -import { PublicKey, Connection, Keypair, TransactionInstruction } from "@solana/web3.js"; +import {PublicKey, Connection, Keypair, TransactionInstruction, GetVersionedTransactionConfig} from "@solana/web3.js"; import * as Wormhole from "@certusone/wormhole-sdk"; import { parseUnits } from "@ethersproject/units"; import { ethers } from "ethers"; @@ -149,7 +149,9 @@ async function bridge() { console.log("Transaction confirmed:", txSig); // Get the sequence number and emitter address required to fetch the signedVAA of our message - const info = await solanaConnection.getTransaction(txSig); + const info = await solanaConnection.getTransaction(txSig, { + maxSupportedTransactionVersion: 0 + }); if (!info) { throw new Error( "An error occurred while fetching the transaction info" diff --git a/solana-contract/programs/swap-bridge/src/lib.rs b/solana-contract/programs/swap-bridge/src/lib.rs index 09bc128..d4952df 100644 --- a/solana-contract/programs/swap-bridge/src/lib.rs +++ b/solana-contract/programs/swap-bridge/src/lib.rs @@ -60,7 +60,7 @@ pub mod swap_bridge { let mut router_accounts = vec![]; let state_address = ctx.accounts.state.key(); let (token_authority, token_authority_bump) = State::get_token_authority(&state_address); - for account in &ctx.remaining_accounts[..] { + for account in ctx.remaining_accounts { let is_signer = account.key == &token_authority; router_accounts.push(if account.is_writable { AccountMeta::new(*account.key, is_signer) @@ -81,17 +81,13 @@ pub mod swap_bridge { &[token_authority_bump], ]; - program::invoke_signed( - &swap_ix, - &ctx.remaining_accounts[..], - &[&authority_seeds[..]], - )?; + program::invoke_signed(&swap_ix, ctx.remaining_accounts, &[&authority_seeds[..]])?; Ok(()) } - pub fn bridge<'a, 'b, 'c, 'info>( - ctx: Context<'a, 'b, 'c, 'info, Bridge<'info>>, + pub fn bridge<'info>( + ctx: Context<'_, '_, '_, 'info, Bridge<'info>>, amount: u64, bridge_data: Vec, ) -> Result<()> { @@ -130,7 +126,7 @@ pub mod swap_bridge { call_bridge( bridge_data, - &ctx.remaining_accounts, + ctx.remaining_accounts, &ctx.accounts.token_account_authority.to_account_info(), &ctx.accounts.wormhole_program, &authority_seeds, @@ -224,13 +220,7 @@ impl State { pub fn space(holding_contract: String, token_chain_id: String) -> usize { // find space needed for state account for current config - 4 + (holding_contract.len() as usize) - + 4 - + (token_chain_id.len() as usize) - + 4 - + 32 - + 32 - + 8 /* Discriminator */ + 4 + holding_contract.len() + 4 + token_chain_id.len() + 4 + 32 + 32 + 8 /* Discriminator */ } pub fn get_token_authority(state_address: &Pubkey) -> (Pubkey, u8) { diff --git a/solana-contract/programs/swap-bridge/src/util/bridge.rs b/solana-contract/programs/swap-bridge/src/util/bridge.rs index f126de6..1e4b0cc 100644 --- a/solana-contract/programs/swap-bridge/src/util/bridge.rs +++ b/solana-contract/programs/swap-bridge/src/util/bridge.rs @@ -16,15 +16,15 @@ impl Id for Wormhole { } } -pub fn call_bridge<'a, 'b>( +pub fn call_bridge<'a>( bridge_data: Vec, - accounts: &'b [AccountInfo<'a>], + accounts: &[AccountInfo<'a>], token_account_authority: &AccountInfo<'a>, wormhole_program: &Program<'a, Wormhole>, signer_seeds: &[&[u8]], ) -> Result<()> { let mut router_accounts = vec![]; - for account in &accounts[..] { + for account in accounts { // transaction signers are: // - the source of the funds (input account PDA) // - the message account (generated by the client and must cosign the original transaction) @@ -46,7 +46,7 @@ pub fn call_bridge<'a, 'b>( msg!("Invoking bridge with {} accounts", accounts.len()); - program::invoke_signed(&bridge_ix, &accounts[..], &[&signer_seeds[..]])?; + program::invoke_signed(&bridge_ix, accounts, &[signer_seeds])?; Ok(()) } diff --git a/solana-contract/programs/swap-bridge/src/util/token.rs b/solana-contract/programs/swap-bridge/src/util/token.rs index f9897e7..47bd49c 100644 --- a/solana-contract/programs/swap-bridge/src/util/token.rs +++ b/solana-contract/programs/swap-bridge/src/util/token.rs @@ -11,7 +11,7 @@ pub fn approve_delegate<'a>( signer_seeds: &[&[u8]], ) -> Result<()> { msg!("Approving delegate for {}", amount); - let seeds = [&signer_seeds[..]]; + let seeds = [signer_seeds]; let cpi_accounts = Approve { to: token_account.clone(), delegate: delegate.clone(), @@ -33,7 +33,7 @@ pub fn wrap_sol<'a>( let cpi_accounts = SyncNative { account: token_account.to_account_info(), }; - let seeds = [&signer_seeds[..]]; + let seeds = [signer_seeds]; let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, &seeds); sync_native(cpi_ctx) } diff --git a/ui/package.json b/ui/package.json index a418a13..111b8f2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,7 +21,7 @@ "@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.91.7", + "@solana/web3.js": "^1.95.3", "@types/bs58": "^4.0.1", "@types/node": "20.2.5", "@types/react": "18.2.8", diff --git a/ui/yarn.lock b/ui/yarn.lock index 61bda4b..496dc5b 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -4376,7 +4376,7 @@ rpc-websockets "^7.5.0" superstruct "^0.14.2" -"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.33.0", "@solana/web3.js@^1.35.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.0", "@solana/web3.js@^1.41.1", "@solana/web3.js@^1.42.0", "@solana/web3.js@^1.43.5", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.52.0", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.0", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.90.2", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.91.7": +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.33.0", "@solana/web3.js@^1.35.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.0", "@solana/web3.js@^1.41.1", "@solana/web3.js@^1.42.0", "@solana/web3.js@^1.43.5", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.52.0", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.0", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.90.2", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.95.3": version "1.95.3" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.3.tgz#70b5f4d76823f56b5af6403da51125fffeb65ff3" integrity sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og== diff --git a/yarn.lock b/yarn.lock index 380fae2..adb577e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,6 +41,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + "@certusone/wormhole-sdk-proto-web@0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/@certusone/wormhole-sdk-proto-web/-/wormhole-sdk-proto-web-0.0.6.tgz#cd26f724b39e565cde5573e20f0a29e659d146d3" @@ -909,6 +916,13 @@ dependencies: "@noble/hashes" "1.4.0" +"@noble/curves@^1.4.2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.5.0.tgz#7a9b9b507065d516e6dce275a1e31db8d2a100dd" + integrity sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/hashes@1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" @@ -1165,7 +1179,7 @@ dependencies: buffer "^6.0.3" -"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.76.0": +"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0": version "1.93.4" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.93.4.tgz#f16c9f8584e3bd518186e95c4a6347e269dede4f" integrity sha512-6hHtSYmkUPwcm3eGeqBanMT3pDAhTprrm2IUoboSjNN4gKCBEkY9uIeS2TZKLpsGY+R6fDub5pRi+e4xFVv55w== @@ -1186,6 +1200,27 @@ rpc-websockets "^9.0.2" superstruct "^1.0.4" +"@solana/web3.js@^1.95.3": + version "1.95.3" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.3.tgz#70b5f4d76823f56b5af6403da51125fffeb65ff3" + integrity sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og== + dependencies: + "@babel/runtime" "^7.25.0" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.1" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + "@suchipi/femver@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@suchipi/femver/-/femver-1.0.0.tgz#4909dcc069695e07bd23a64c4bfe411d11d9692f" @@ -2780,6 +2815,24 @@ jayson@^4.0.0, jayson@^4.1.0: uuid "^8.3.2" ws "^7.4.5" +jayson@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e" + integrity sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.5.10" + js-base64@^3.6.1: version "3.7.7" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" @@ -3695,6 +3748,11 @@ superstruct@^1.0.3, superstruct@^1.0.4: resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== +superstruct@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -4059,7 +4117,7 @@ ws@8.17.1, ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -ws@^7, ws@^7.4.5, ws@^7.5.8, ws@^7.5.9: +ws@^7, ws@^7.4.5, ws@^7.5.10, ws@^7.5.8, ws@^7.5.9: version "7.5.10" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==