diff --git a/Anchor.toml b/Anchor.toml index 29e97ed..ddb8aaf 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -11,8 +11,52 @@ donaproto = "HbNNG85aBuR9W5F8YobTeDRRmXWFbDhLDS6WbLzWbLhH" url = "https://api.apr.dev" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" +[workspace] +types = "app/src/idl/" + [scripts] -test = "yarn run mocha -t 1000000 tests/*" +test = "yarn run mocha -t 1000000 tests/" + +[test] +startup_wait = 10000 + +[test.validator] +url = "https://api.devnet.solana.com" + +### Download the program from the mainnet-beta cluster +# solana program dump --url mainnet-beta TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA token.so +[[test.genesis]] +address = "devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH" +program = "raydium_amm_v3.so" +upgradeable = true + +# CLMM Config +# { +# id: 'GVSwm4smQBYcgAJU7qjFHLQBHTc4AdB3F2HbZp6KqKof', +# index: 2, +# protocolFeeRate: 120000, +# tradeFeeRate: 500, +# tickSpacing: 10, +# fundFeeRate: 40000, +# } +# let (amm_config_key, __bump) = Pubkey::find_program_address( +# &[ +# raydium_amm_v3::states::AMM_CONFIG_SEED.as_bytes(), +# &config_index.to_be_bytes(), +# ], +# &pool_config.raydium_v3_program, +# ); +[[test.validator.clone]] +address = 'GVSwm4smQBYcgAJU7qjFHLQBHTc4AdB3F2HbZp6KqKof' + +# # AMM Program +# ALERT! not working +# `Transaction simulation failed: This program may not be used for executing instructions` +# [[test.validator.clone]] +# address = "devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH" +# executable = true + + diff --git a/app/src/idl/raydium-amm.json b/app/src/idl/raydium-amm.json new file mode 100644 index 0000000..2b3bbf4 --- /dev/null +++ b/app/src/idl/raydium-amm.json @@ -0,0 +1,2857 @@ +{ + "version": "0.1.0", + "name": "amm_v3", + "instructions": [ + { + "name": "createAmmConfig", + "accounts": [ + { + "name": "owner", + "isMut": true, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": true, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "index", + "type": "u16" + }, + { + "name": "tickSpacing", + "type": "u16" + }, + { + "name": "tradeFeeRate", + "type": "u32" + }, + { + "name": "protocolFeeRate", + "type": "u32" + }, + { + "name": "fundFeeRate", + "type": "u32" + } + ] + }, + { + "name": "updateAmmConfig", + "accounts": [ + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "param", + "type": "u8" + }, + { + "name": "value", + "type": "u32" + } + ] + }, + { + "name": "createPool", + "accounts": [ + { + "name": "poolCreator", + "isMut": true, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenMint0", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMint1", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "observationState", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayBitmap", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram0", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram1", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "sqrtPriceX64", + "type": "u128" + }, + { + "name": "openTime", + "type": "u64" + } + ] + }, + { + "name": "updatePoolStatus", + "accounts": [ + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "status", + "type": "u8" + } + ] + }, + { + "name": "createOperationAccount", + "accounts": [ + { + "name": "owner", + "isMut": true, + "isSigner": true + }, + { + "name": "operationState", + "isMut": true, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "updateOperationAccount", + "accounts": [ + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "operationState", + "isMut": true, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "param", + "type": "u8" + }, + { + "name": "keys", + "type": { + "vec": "publicKey" + } + } + ] + }, + { + "name": "transferRewardOwner", + "accounts": [ + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "newOwner", + "type": "publicKey" + } + ] + }, + { + "name": "initializeReward", + "accounts": [ + { + "name": "rewardFunder", + "isMut": true, + "isSigner": true + }, + { + "name": "funderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "operationState", + "isMut": false, + "isSigner": false + }, + { + "name": "rewardTokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "rewardTokenVault", + "isMut": true, + "isSigner": false + }, + { + "name": "rewardTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "param", + "type": { + "defined": "InitializeRewardParam" + } + } + ] + }, + { + "name": "collectRemainingRewards", + "accounts": [ + { + "name": "rewardFunder", + "isMut": false, + "isSigner": true + }, + { + "name": "funderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "rewardTokenVault", + "isMut": false, + "isSigner": false + }, + { + "name": "rewardVaultMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "rewardIndex", + "type": "u8" + } + ] + }, + { + "name": "updateRewardInfos", + "accounts": [ + { + "name": "poolState", + "isMut": true, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "setRewardParams", + "accounts": [ + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "operationState", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "rewardIndex", + "type": "u8" + }, + { + "name": "emissionsPerSecondX64", + "type": "u128" + }, + { + "name": "openTime", + "type": "u64" + }, + { + "name": "endTime", + "type": "u64" + } + ] + }, + { + "name": "collectProtocolFee", + "accounts": [ + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "vault0Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "vault1Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "recipientTokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "recipientTokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amount0Requested", + "type": "u64" + }, + { + "name": "amount1Requested", + "type": "u64" + } + ] + }, + { + "name": "collectFundFee", + "accounts": [ + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "vault0Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "vault1Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "recipientTokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "recipientTokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amount0Requested", + "type": "u64" + }, + { + "name": "amount1Requested", + "type": "u64" + } + ] + }, + { + "name": "openPosition", + "accounts": [ + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "positionNftOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "positionNftMint", + "isMut": true, + "isSigner": true + }, + { + "name": "positionNftAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "metadataAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "protocolPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "metadataProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "tickLowerIndex", + "type": "i32" + }, + { + "name": "tickUpperIndex", + "type": "i32" + }, + { + "name": "tickArrayLowerStartIndex", + "type": "i32" + }, + { + "name": "tickArrayUpperStartIndex", + "type": "i32" + }, + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "amount0Max", + "type": "u64" + }, + { + "name": "amount1Max", + "type": "u64" + } + ] + }, + { + "name": "openPositionV2", + "accounts": [ + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "positionNftOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "positionNftMint", + "isMut": true, + "isSigner": true + }, + { + "name": "positionNftAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "metadataAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "protocolPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "metadataProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + }, + { + "name": "vault0Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "vault1Mint", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "tickLowerIndex", + "type": "i32" + }, + { + "name": "tickUpperIndex", + "type": "i32" + }, + { + "name": "tickArrayLowerStartIndex", + "type": "i32" + }, + { + "name": "tickArrayUpperStartIndex", + "type": "i32" + }, + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "amount0Max", + "type": "u64" + }, + { + "name": "amount1Max", + "type": "u64" + }, + { + "name": "withMatedata", + "type": "bool" + }, + { + "name": "baseFlag", + "type": { + "option": "bool" + } + } + ] + }, + { + "name": "closePosition", + "accounts": [ + { + "name": "nftOwner", + "isMut": true, + "isSigner": true + }, + { + "name": "positionNftMint", + "isMut": true, + "isSigner": false + }, + { + "name": "positionNftAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "increaseLiquidity", + "accounts": [ + { + "name": "nftOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "nftAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "protocolPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "amount0Max", + "type": "u64" + }, + { + "name": "amount1Max", + "type": "u64" + } + ] + }, + { + "name": "increaseLiquidityV2", + "accounts": [ + { + "name": "nftOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "nftAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "protocolPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + }, + { + "name": "vault0Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "vault1Mint", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "amount0Max", + "type": "u64" + }, + { + "name": "amount1Max", + "type": "u64" + }, + { + "name": "baseFlag", + "type": { + "option": "bool" + } + } + ] + }, + { + "name": "decreaseLiquidity", + "accounts": [ + { + "name": "nftOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "nftAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "protocolPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "recipientTokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "recipientTokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "amount0Min", + "type": "u64" + }, + { + "name": "amount1Min", + "type": "u64" + } + ] + }, + { + "name": "decreaseLiquidityV2", + "accounts": [ + { + "name": "nftOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "nftAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "personalPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "protocolPosition", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault0", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenVault1", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayLower", + "isMut": true, + "isSigner": false + }, + { + "name": "tickArrayUpper", + "isMut": true, + "isSigner": false + }, + { + "name": "recipientTokenAccount0", + "isMut": true, + "isSigner": false + }, + { + "name": "recipientTokenAccount1", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "vault0Mint", + "isMut": false, + "isSigner": false + }, + { + "name": "vault1Mint", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "amount0Min", + "type": "u64" + }, + { + "name": "amount1Min", + "type": "u64" + } + ] + }, + { + "name": "swap", + "accounts": [ + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "inputTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "outputTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "inputVault", + "isMut": true, + "isSigner": false + }, + { + "name": "outputVault", + "isMut": true, + "isSigner": false + }, + { + "name": "observationState", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tickArray", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + }, + { + "name": "otherAmountThreshold", + "type": "u64" + }, + { + "name": "sqrtPriceLimitX64", + "type": "u128" + }, + { + "name": "isBaseInput", + "type": "bool" + } + ] + }, + { + "name": "swapV2", + "accounts": [ + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "poolState", + "isMut": true, + "isSigner": false + }, + { + "name": "inputTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "outputTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "inputVault", + "isMut": true, + "isSigner": false + }, + { + "name": "outputVault", + "isMut": true, + "isSigner": false + }, + { + "name": "observationState", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "inputVaultMint", + "isMut": false, + "isSigner": false + }, + { + "name": "outputVaultMint", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + }, + { + "name": "otherAmountThreshold", + "type": "u64" + }, + { + "name": "sqrtPriceLimitX64", + "type": "u128" + }, + { + "name": "isBaseInput", + "type": "bool" + } + ] + }, + { + "name": "swapRouterBaseIn", + "accounts": [ + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "inputTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "inputTokenMint", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram2022", + "isMut": false, + "isSigner": false + }, + { + "name": "memoProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amountIn", + "type": "u64" + }, + { + "name": "amountOutMinimum", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "index", + "type": "u16" + }, + { + "name": "owner", + "type": "publicKey" + }, + { + "name": "protocolFeeRate", + "type": "u32" + }, + { + "name": "tradeFeeRate", + "type": "u32" + }, + { + "name": "tickSpacing", + "type": "u16" + }, + { + "name": "fundFeeRate", + "type": "u32" + }, + { + "name": "paddingU32", + "type": "u32" + }, + { + "name": "fundOwner", + "type": "publicKey" + }, + { + "name": "padding", + "type": { + "array": [ + "u64", + 3 + ] + } + } + ] + } + }, + { + "name": "OperationState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "operationOwners", + "type": { + "array": [ + "publicKey", + 10 + ] + } + }, + { + "name": "whitelistMints", + "type": { + "array": [ + "publicKey", + 100 + ] + } + } + ] + } + }, + { + "name": "ObservationState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "initialized", + "type": "bool" + }, + { + "name": "poolId", + "type": "publicKey" + }, + { + "name": "observations", + "type": { + "array": [ + { + "defined": "Observation" + }, + 1000 + ] + } + }, + { + "name": "padding", + "type": { + "array": [ + "u128", + 5 + ] + } + } + ] + } + }, + { + "name": "PersonalPositionState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "nftMint", + "type": "publicKey" + }, + { + "name": "poolId", + "type": "publicKey" + }, + { + "name": "tickLowerIndex", + "type": "i32" + }, + { + "name": "tickUpperIndex", + "type": "i32" + }, + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "feeGrowthInside0LastX64", + "type": "u128" + }, + { + "name": "feeGrowthInside1LastX64", + "type": "u128" + }, + { + "name": "tokenFeesOwed0", + "type": "u64" + }, + { + "name": "tokenFeesOwed1", + "type": "u64" + }, + { + "name": "rewardInfos", + "type": { + "array": [ + { + "defined": "PositionRewardInfo" + }, + 3 + ] + } + }, + { + "name": "padding", + "type": { + "array": [ + "u64", + 8 + ] + } + } + ] + } + }, + { + "name": "PoolState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": { + "array": [ + "u8", + 1 + ] + } + }, + { + "name": "ammConfig", + "type": "publicKey" + }, + { + "name": "owner", + "type": "publicKey" + }, + { + "name": "tokenMint0", + "type": "publicKey" + }, + { + "name": "tokenMint1", + "type": "publicKey" + }, + { + "name": "tokenVault0", + "type": "publicKey" + }, + { + "name": "tokenVault1", + "type": "publicKey" + }, + { + "name": "observationKey", + "type": "publicKey" + }, + { + "name": "mintDecimals0", + "type": "u8" + }, + { + "name": "mintDecimals1", + "type": "u8" + }, + { + "name": "tickSpacing", + "type": "u16" + }, + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "sqrtPriceX64", + "type": "u128" + }, + { + "name": "tickCurrent", + "type": "i32" + }, + { + "name": "observationIndex", + "type": "u16" + }, + { + "name": "observationUpdateDuration", + "type": "u16" + }, + { + "name": "feeGrowthGlobal0X64", + "type": "u128" + }, + { + "name": "feeGrowthGlobal1X64", + "type": "u128" + }, + { + "name": "protocolFeesToken0", + "type": "u64" + }, + { + "name": "protocolFeesToken1", + "type": "u64" + }, + { + "name": "swapInAmountToken0", + "type": "u128" + }, + { + "name": "swapOutAmountToken1", + "type": "u128" + }, + { + "name": "swapInAmountToken1", + "type": "u128" + }, + { + "name": "swapOutAmountToken0", + "type": "u128" + }, + { + "name": "status", + "type": "u8" + }, + { + "name": "padding", + "type": { + "array": [ + "u8", + 7 + ] + } + }, + { + "name": "rewardInfos", + "type": { + "array": [ + { + "defined": "RewardInfo" + }, + 3 + ] + } + }, + { + "name": "tickArrayBitmap", + "type": { + "array": [ + "u64", + 16 + ] + } + }, + { + "name": "totalFeesToken0", + "type": "u64" + }, + { + "name": "totalFeesClaimedToken0", + "type": "u64" + }, + { + "name": "totalFeesToken1", + "type": "u64" + }, + { + "name": "totalFeesClaimedToken1", + "type": "u64" + }, + { + "name": "fundFeesToken0", + "type": "u64" + }, + { + "name": "fundFeesToken1", + "type": "u64" + }, + { + "name": "openTime", + "type": "u64" + }, + { + "name": "padding1", + "type": { + "array": [ + "u64", + 25 + ] + } + }, + { + "name": "padding2", + "type": { + "array": [ + "u64", + 32 + ] + } + } + ] + } + }, + { + "name": "ProtocolPositionState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "poolId", + "type": "publicKey" + }, + { + "name": "tickLowerIndex", + "type": "i32" + }, + { + "name": "tickUpperIndex", + "type": "i32" + }, + { + "name": "liquidity", + "type": "u128" + }, + { + "name": "feeGrowthInside0LastX64", + "type": "u128" + }, + { + "name": "feeGrowthInside1LastX64", + "type": "u128" + }, + { + "name": "tokenFeesOwed0", + "type": "u64" + }, + { + "name": "tokenFeesOwed1", + "type": "u64" + }, + { + "name": "rewardGrowthInside", + "type": { + "array": [ + "u128", + 3 + ] + } + }, + { + "name": "padding", + "type": { + "array": [ + "u64", + 8 + ] + } + } + ] + } + }, + { + "name": "TickArrayState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "poolId", + "type": "publicKey" + }, + { + "name": "startTickIndex", + "type": "i32" + }, + { + "name": "ticks", + "type": { + "array": [ + { + "defined": "TickState" + }, + 60 + ] + } + }, + { + "name": "initializedTickCount", + "type": "u8" + }, + { + "name": "padding", + "type": { + "array": [ + "u8", + 115 + ] + } + } + ] + } + }, + { + "name": "TickArrayBitmapExtension", + "type": { + "kind": "struct", + "fields": [ + { + "name": "poolId", + "type": "publicKey" + }, + { + "name": "positiveTickArrayBitmap", + "type": { + "array": [ + { + "array": [ + "u64", + 8 + ] + }, + 14 + ] + } + }, + { + "name": "negativeTickArrayBitmap", + "type": { + "array": [ + { + "array": [ + "u64", + 8 + ] + }, + 14 + ] + } + } + ] + } + } + ], + "types": [ + { + "name": "InitializeRewardParam", + "type": { + "kind": "struct", + "fields": [ + { + "name": "openTime", + "type": "u64" + }, + { + "name": "endTime", + "type": "u64" + }, + { + "name": "emissionsPerSecondX64", + "type": "u128" + } + ] + } + }, + { + "name": "Observation", + "type": { + "kind": "struct", + "fields": [ + { + "name": "blockTimestamp", + "type": "u32" + }, + { + "name": "sqrtPriceX64", + "type": "u128" + }, + { + "name": "cumulativeTimePriceX64", + "type": "u128" + }, + { + "name": "padding", + "type": "u128" + } + ] + } + }, + { + "name": "PositionRewardInfo", + "type": { + "kind": "struct", + "fields": [ + { + "name": "growthInsideLastX64", + "type": "u128" + }, + { + "name": "rewardAmountOwed", + "type": "u64" + } + ] + } + }, + { + "name": "RewardInfo", + "type": { + "kind": "struct", + "fields": [ + { + "name": "rewardState", + "type": "u8" + }, + { + "name": "openTime", + "type": "u64" + }, + { + "name": "endTime", + "type": "u64" + }, + { + "name": "lastUpdateTime", + "type": "u64" + }, + { + "name": "emissionsPerSecondX64", + "type": "u128" + }, + { + "name": "rewardTotalEmissioned", + "type": "u64" + }, + { + "name": "rewardClaimed", + "type": "u64" + }, + { + "name": "tokenMint", + "type": "publicKey" + }, + { + "name": "tokenVault", + "type": "publicKey" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "rewardGrowthGlobalX64", + "type": "u128" + } + ] + } + }, + { + "name": "TickState", + "type": { + "kind": "struct", + "fields": [ + { + "name": "tick", + "type": "i32" + }, + { + "name": "liquidityNet", + "type": "i128" + }, + { + "name": "liquidityGross", + "type": "u128" + }, + { + "name": "feeGrowthOutside0X64", + "type": "u128" + }, + { + "name": "feeGrowthOutside1X64", + "type": "u128" + }, + { + "name": "rewardGrowthsOutsideX64", + "type": { + "array": [ + "u128", + 3 + ] + } + }, + { + "name": "padding", + "type": { + "array": [ + "u32", + 13 + ] + } + } + ] + } + }, + { + "name": "PoolStatusBitIndex", + "type": { + "kind": "enum", + "variants": [ + { + "name": "OpenPositionOrIncreaseLiquidity" + }, + { + "name": "DecreaseLiquidity" + }, + { + "name": "CollectFee" + }, + { + "name": "CollectReward" + }, + { + "name": "Swap" + } + ] + } + }, + { + "name": "PoolStatusBitFlag", + "type": { + "kind": "enum", + "variants": [ + { + "name": "Enable" + }, + { + "name": "Disable" + } + ] + } + }, + { + "name": "RewardState", + "type": { + "kind": "enum", + "variants": [ + { + "name": "Uninitialized" + }, + { + "name": "Initialized" + }, + { + "name": "Opening" + }, + { + "name": "Ended" + } + ] + } + }, + { + "name": "TickArryBitmap", + "type": { + "kind": "alias", + "value": { + "array": [ + "u64", + 8 + ] + } + } + } + ], + "events": [ + { + "name": "ConfigChangeEvent", + "fields": [ + { + "name": "index", + "type": "u16", + "index": false + }, + { + "name": "owner", + "type": "publicKey", + "index": true + }, + { + "name": "protocolFeeRate", + "type": "u32", + "index": false + }, + { + "name": "tradeFeeRate", + "type": "u32", + "index": false + }, + { + "name": "tickSpacing", + "type": "u16", + "index": false + }, + { + "name": "fundFeeRate", + "type": "u32", + "index": false + }, + { + "name": "fundOwner", + "type": "publicKey", + "index": false + } + ] + }, + { + "name": "CreatePersonalPositionEvent", + "fields": [ + { + "name": "poolState", + "type": "publicKey", + "index": false + }, + { + "name": "minter", + "type": "publicKey", + "index": false + }, + { + "name": "nftOwner", + "type": "publicKey", + "index": false + }, + { + "name": "tickLowerIndex", + "type": "i32", + "index": false + }, + { + "name": "tickUpperIndex", + "type": "i32", + "index": false + }, + { + "name": "liquidity", + "type": "u128", + "index": false + }, + { + "name": "depositAmount0", + "type": "u64", + "index": false + }, + { + "name": "depositAmount1", + "type": "u64", + "index": false + }, + { + "name": "depositAmount0TransferFee", + "type": "u64", + "index": false + }, + { + "name": "depositAmount1TransferFee", + "type": "u64", + "index": false + } + ] + }, + { + "name": "IncreaseLiquidityEvent", + "fields": [ + { + "name": "positionNftMint", + "type": "publicKey", + "index": false + }, + { + "name": "liquidity", + "type": "u128", + "index": false + }, + { + "name": "amount0", + "type": "u64", + "index": false + }, + { + "name": "amount1", + "type": "u64", + "index": false + }, + { + "name": "amount0TransferFee", + "type": "u64", + "index": false + }, + { + "name": "amount1TransferFee", + "type": "u64", + "index": false + } + ] + }, + { + "name": "DecreaseLiquidityEvent", + "fields": [ + { + "name": "positionNftMint", + "type": "publicKey", + "index": false + }, + { + "name": "liquidity", + "type": "u128", + "index": false + }, + { + "name": "decreaseAmount0", + "type": "u64", + "index": false + }, + { + "name": "decreaseAmount1", + "type": "u64", + "index": false + }, + { + "name": "feeAmount0", + "type": "u64", + "index": false + }, + { + "name": "feeAmount1", + "type": "u64", + "index": false + }, + { + "name": "rewardAmounts", + "type": { + "array": [ + "u64", + 3 + ] + }, + "index": false + }, + { + "name": "transferFee0", + "type": "u64", + "index": false + }, + { + "name": "transferFee1", + "type": "u64", + "index": false + } + ] + }, + { + "name": "LiquidityCalculateEvent", + "fields": [ + { + "name": "poolLiquidity", + "type": "u128", + "index": false + }, + { + "name": "poolSqrtPriceX64", + "type": "u128", + "index": false + }, + { + "name": "poolTick", + "type": "i32", + "index": false + }, + { + "name": "calcAmount0", + "type": "u64", + "index": false + }, + { + "name": "calcAmount1", + "type": "u64", + "index": false + }, + { + "name": "tradeFeeOwed0", + "type": "u64", + "index": false + }, + { + "name": "tradeFeeOwed1", + "type": "u64", + "index": false + }, + { + "name": "transferFee0", + "type": "u64", + "index": false + }, + { + "name": "transferFee1", + "type": "u64", + "index": false + } + ] + }, + { + "name": "CollectPersonalFeeEvent", + "fields": [ + { + "name": "positionNftMint", + "type": "publicKey", + "index": false + }, + { + "name": "recipientTokenAccount0", + "type": "publicKey", + "index": false + }, + { + "name": "recipientTokenAccount1", + "type": "publicKey", + "index": false + }, + { + "name": "amount0", + "type": "u64", + "index": false + }, + { + "name": "amount1", + "type": "u64", + "index": false + } + ] + }, + { + "name": "UpdateRewardInfosEvent", + "fields": [ + { + "name": "rewardGrowthGlobalX64", + "type": { + "array": [ + "u128", + 3 + ] + }, + "index": false + } + ] + }, + { + "name": "PoolCreatedEvent", + "fields": [ + { + "name": "tokenMint0", + "type": "publicKey", + "index": false + }, + { + "name": "tokenMint1", + "type": "publicKey", + "index": false + }, + { + "name": "tickSpacing", + "type": "u16", + "index": false + }, + { + "name": "poolState", + "type": "publicKey", + "index": false + }, + { + "name": "sqrtPriceX64", + "type": "u128", + "index": false + }, + { + "name": "tick", + "type": "i32", + "index": false + }, + { + "name": "tokenVault0", + "type": "publicKey", + "index": false + }, + { + "name": "tokenVault1", + "type": "publicKey", + "index": false + } + ] + }, + { + "name": "CollectProtocolFeeEvent", + "fields": [ + { + "name": "poolState", + "type": "publicKey", + "index": false + }, + { + "name": "recipientTokenAccount0", + "type": "publicKey", + "index": false + }, + { + "name": "recipientTokenAccount1", + "type": "publicKey", + "index": false + }, + { + "name": "amount0", + "type": "u64", + "index": false + }, + { + "name": "amount1", + "type": "u64", + "index": false + } + ] + }, + { + "name": "SwapEvent", + "fields": [ + { + "name": "poolState", + "type": "publicKey", + "index": false + }, + { + "name": "sender", + "type": "publicKey", + "index": false + }, + { + "name": "tokenAccount0", + "type": "publicKey", + "index": false + }, + { + "name": "tokenAccount1", + "type": "publicKey", + "index": false + }, + { + "name": "amount0", + "type": "u64", + "index": false + }, + { + "name": "amount1", + "type": "u64", + "index": false + }, + { + "name": "zeroForOne", + "type": "bool", + "index": false + }, + { + "name": "sqrtPriceX64", + "type": "u128", + "index": false + }, + { + "name": "liquidity", + "type": "u128", + "index": false + }, + { + "name": "tick", + "type": "i32", + "index": false + } + ] + }, + { + "name": "LiquidityChangeEvent", + "fields": [ + { + "name": "poolState", + "type": "publicKey", + "index": false + }, + { + "name": "tick", + "type": "i32", + "index": false + }, + { + "name": "tickLower", + "type": "i32", + "index": false + }, + { + "name": "tickUpper", + "type": "i32", + "index": false + }, + { + "name": "liquidityBefore", + "type": "u128", + "index": false + }, + { + "name": "liquidityAfter", + "type": "u128", + "index": false + } + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "LOK", + "msg": "LOK" + }, + { + "code": 6001, + "name": "NotApproved", + "msg": "Not approved" + }, + { + "code": 6002, + "name": "InvalidUpdateConfigFlag", + "msg": "invalid update amm config flag" + }, + { + "code": 6003, + "name": "AccountLack", + "msg": "Account lack" + }, + { + "code": 6004, + "name": "ClosePositionErr", + "msg": "Remove liquitity, collect fees owed and reward then you can close position account" + }, + { + "code": 6005, + "name": "ZeroMintAmount", + "msg": "Minting amount should be greater than 0" + }, + { + "code": 6006, + "name": "InvaildTickIndex", + "msg": "Tick out of range" + }, + { + "code": 6007, + "name": "TickInvaildOrder", + "msg": "The lower tick must be below the upper tick" + }, + { + "code": 6008, + "name": "TickLowerOverflow", + "msg": "The tick must be greater, or equal to the minimum tick(-221818)" + }, + { + "code": 6009, + "name": "TickUpperOverflow", + "msg": "The tick must be lesser than, or equal to the maximum tick(221818)" + }, + { + "code": 6010, + "name": "TickAndSpacingNotMatch", + "msg": "tick % tick_spacing must be zero" + }, + { + "code": 6011, + "name": "InvalidTickArray", + "msg": "Invaild tick array account" + }, + { + "code": 6012, + "name": "InvalidTickArrayBoundary", + "msg": "Invaild tick array boundary" + }, + { + "code": 6013, + "name": "SqrtPriceLimitOverflow", + "msg": "Square root price limit overflow" + }, + { + "code": 6014, + "name": "SqrtPriceX64", + "msg": "sqrt_price_x64 out of range" + }, + { + "code": 6015, + "name": "LiquiditySubValueErr", + "msg": "Liquidity sub delta L must be smaller than before" + }, + { + "code": 6016, + "name": "LiquidityAddValueErr", + "msg": "Liquidity add delta L must be greater, or equal to before" + }, + { + "code": 6017, + "name": "InvaildLiquidity", + "msg": "Invaild liquidity when update position" + }, + { + "code": 6018, + "name": "ForbidBothZeroForSupplyLiquidity", + "msg": "Both token amount must not be zero while supply liquidity" + }, + { + "code": 6019, + "name": "LiquidityInsufficient", + "msg": "Liquidity insufficient" + }, + { + "code": 6020, + "name": "TransactionTooOld", + "msg": "Transaction too old" + }, + { + "code": 6021, + "name": "PriceSlippageCheck", + "msg": "Price slippage check" + }, + { + "code": 6022, + "name": "TooLittleOutputReceived", + "msg": "Too little output received" + }, + { + "code": 6023, + "name": "TooMuchInputPaid", + "msg": "Too much input paid" + }, + { + "code": 6024, + "name": "InvaildSwapAmountSpecified", + "msg": "Swap special amount can not be zero" + }, + { + "code": 6025, + "name": "InvalidInputPoolVault", + "msg": "Input pool vault is invalid" + }, + { + "code": 6026, + "name": "TooSmallInputOrOutputAmount", + "msg": "Swap input or output amount is too small" + }, + { + "code": 6027, + "name": "NotEnoughTickArrayAccount", + "msg": "Not enought tick array account" + }, + { + "code": 6028, + "name": "InvalidFirstTickArrayAccount", + "msg": "Invaild first tick array account" + }, + { + "code": 6029, + "name": "InvalidRewardIndex", + "msg": "Invalid reward index" + }, + { + "code": 6030, + "name": "FullRewardInfo", + "msg": "The init reward token reach to the max" + }, + { + "code": 6031, + "name": "RewardTokenAlreadyInUse", + "msg": "The init reward token already in use" + }, + { + "code": 6032, + "name": "ExceptPoolVaultMint", + "msg": "The reward tokens must contain one of pool vault mint except the last reward" + }, + { + "code": 6033, + "name": "InvalidRewardInitParam", + "msg": "Invalid reward init param" + }, + { + "code": 6034, + "name": "InvalidRewardDesiredAmount", + "msg": "Invalid collect reward desired amount" + }, + { + "code": 6035, + "name": "InvalidRewardInputAccountNumber", + "msg": "Invalid collect reward input account number" + }, + { + "code": 6036, + "name": "InvalidRewardPeriod", + "msg": "Invalid reward period" + }, + { + "code": 6037, + "name": "NotApproveUpdateRewardEmissiones", + "msg": "Modification of emissiones is allowed within 72 hours from the end of the previous cycle" + }, + { + "code": 6038, + "name": "UnInitializedRewardInfo", + "msg": "uninitialized reward info" + }, + { + "code": 6039, + "name": "NotSupportMint", + "msg": "Not support token_2022 mint extension" + }, + { + "code": 6040, + "name": "MissingTickArrayBitmapExtensionAccount", + "msg": "Missing tickarray bitmap extension account" + }, + { + "code": 6041, + "name": "InsufficientLiquidityForDirection", + "msg": "Insufficient liquidity for this direction" + } + ] +} \ No newline at end of file diff --git a/ci/build-and-test.sh b/ci/build-and-test.sh deleted file mode 100755 index 6a1ca2e..0000000 --- a/ci/build-and-test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -e -cd "$(dirname "$0")/.." - -set -x -solana config set --url localhost - -solana-keygen new - -anchor test - -exit 0 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7cb0150..eff84fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,13 @@ "@coral-xyz/anchor": "^0.29.0" }, "devDependencies": { + "@raydium-io/raydium-sdk-v2": "^0.1.9-alpha", "@solana/spl-token": "^0.4.3", "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.0", "@types/mocha": "^9.0.0", "chai": "^4.3.4", + "decimal.js": "^10.4.3", "mocha": "^9.0.3", "prettier": "^2.6.2", "ts-mocha": "^10.0.0", @@ -20,10 +22,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -96,6 +97,144 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@project-serum/anchor": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz", + "integrity": "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==", + "dev": true, + "dependencies": { + "@project-serum/borsh": "^0.2.2", + "@solana/web3.js": "^1.17.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.0", + "camelcase": "^5.3.1", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "find": "^0.3.0", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@project-serum/anchor/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@project-serum/borsh": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", + "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" + } + }, + "node_modules/@project-serum/serum": { + "version": "0.13.65", + "resolved": "https://registry.npmjs.org/@project-serum/serum/-/serum-0.13.65.tgz", + "integrity": "sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA==", + "dev": true, + "dependencies": { + "@project-serum/anchor": "^0.11.1", + "@solana/spl-token": "^0.1.6", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@project-serum/serum/node_modules/@solana/spl-token": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.8.tgz", + "integrity": "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.5", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.0", + "buffer": "6.0.3", + "buffer-layout": "^1.2.0", + "dotenv": "10.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@raydium-io/raydium-sdk-v2": { + "version": "0.1.9-alpha", + "resolved": "https://registry.npmjs.org/@raydium-io/raydium-sdk-v2/-/raydium-sdk-v2-0.1.9-alpha.tgz", + "integrity": "sha512-sqgnxEk2lLiU9ZykXofIVnO8uPyIQY28cKZb8clO90J4dCej4gRgtDhmZe9pWOnsWKzrE5oHvU1FaWWhs7IgwA==", + "dev": true, + "dependencies": { + "@project-serum/serum": "^0.13.65", + "@solana/buffer-layout": "^4.0.1", + "@solana/spl-token": "^0.4.6", + "@solana/web3.js": "^1.91.8", + "axios": "^1.1.3", + "big.js": "^6.2.1", + "bn.js": "^5.2.1", + "buffer": "^6.0.3", + "dayjs": "^1.11.5", + "decimal.js-light": "^2.5.1", + "lodash": "^4.17.21", + "toformat": "^2.0.0" + } + }, + "node_modules/@raydium-io/raydium-sdk-v2/node_modules/@solana/spl-token": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", + "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "dev": true, + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/@raydium-io/raydium-sdk-v2/node_modules/@solana/spl-token-group": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", + "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "dev": true, + "dependencies": { + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, "node_modules/@solana/buffer-layout": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", @@ -260,71 +399,19 @@ } }, "node_modules/@solana/spl-token-metadata": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz", - "integrity": "sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", + "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", "dev": true, "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-data-structures": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508", - "@solana/codecs-strings": "2.0.0-experimental.8618508", - "@solana/options": "2.0.0-experimental.8618508", + "@solana/codecs": "2.0.0-preview.2", "@solana/spl-type-length-value": "0.1.0" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.87.6" - } - }, - "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-core": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA==", - "dev": true - }, - "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==", - "dev": true, - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - } - }, - "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-numbers": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==", - "dev": true, - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508" - } - }, - "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-strings": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==", - "dev": true, - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22" - } - }, - "node_modules/@solana/spl-token-metadata/node_modules/@solana/options": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==", - "dev": true, - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" + "@solana/web3.js": "^1.91.6" } }, "node_modules/@solana/spl-type-length-value": { @@ -340,14 +427,13 @@ } }, "node_modules/@solana/web3.js": { - "version": "1.91.1", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.1.tgz", - "integrity": "sha512-cPgjZXm688oM9cULvJ8u2VH6Qp5rvptE1N1VODVxn2mAbpZsWrvWNPjmASkMYT/HzyrtqFkPvFdSHg8Xjt7aQA==", - "license": "MIT", + "version": "1.92.3", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.92.3.tgz", + "integrity": "sha512-NVBWvb9zdJIAx6X+caXaIICCEQfQaQ8ygykCjJW4u2z/sIKcvPj3ZIIllnx0MWMc3IxGq15ozGYDOQIMbwUcHw==", "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.3", + "@babel/runtime": "^7.24.6", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "agentkeepalive": "^4.5.0", "bigint-buffer": "^1.1.5", @@ -358,15 +444,17 @@ "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.0", "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" + "rpc-websockets": "^8.0.1", + "superstruct": "^1.0.4" } }, "node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", - "license": "MIT" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/@types/bn.js": { "version": "5.1.5", @@ -523,6 +611,23 @@ "node": "*" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -559,6 +664,19 @@ ], "license": "MIT" }, + "node_modules/big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, "node_modules/bigint-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", @@ -848,6 +966,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -882,6 +1012,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/dayjs": { + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", + "dev": true + }, "node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -920,6 +1056,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "dev": true + }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -945,6 +1093,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -965,6 +1122,15 @@ "tslib": "^2.0.3" } }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1056,6 +1222,15 @@ "node": ">=8" } }, + "node_modules/find": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", + "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", + "dev": true, + "dependencies": { + "traverse-chain": "~0.1.0" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1083,6 +1258,40 @@ "flat": "cli.js" } }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1361,6 +1570,12 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "license": "MIT" }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1435,6 +1650,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1478,6 +1699,27 @@ "dev": true, "license": "ISC" }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", @@ -1736,6 +1978,12 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1762,8 +2010,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/require-directory": { "version": "2.1.1", @@ -1776,12 +2023,10 @@ } }, "node_modules/rpc-websockets": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.9.0.tgz", - "integrity": "sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==", - "license": "LGPL-3.0-only", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-8.0.1.tgz", + "integrity": "sha512-PptrPRK40uQvifq5sCcObmqInVcZXhy+RRrirzdE5KUPvDI47y1wPvfckD2QzqngOU9xaPW/dT+G+b+wj6M1MQ==", "dependencies": { - "@babel/runtime": "^7.17.2", "eventemitter3": "^4.0.7", "uuid": "^8.3.2", "ws": "^8.5.0" @@ -1796,10 +2041,9 @@ } }, "node_modules/rpc-websockets/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "license": "MIT", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -1975,6 +2219,12 @@ "node": ">=8.0" } }, + "node_modules/toformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==", + "dev": true + }, "node_modules/toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", @@ -1987,6 +2237,12 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true + }, "node_modules/ts-mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", @@ -2291,9 +2547,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -2341,6 +2597,120 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" }, + "@project-serum/anchor": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz", + "integrity": "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==", + "dev": true, + "requires": { + "@project-serum/borsh": "^0.2.2", + "@solana/web3.js": "^1.17.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.0", + "camelcase": "^5.3.1", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "find": "^0.3.0", + "js-sha256": "^0.9.0", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "toml": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@project-serum/borsh": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", + "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", + "dev": true, + "requires": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + } + }, + "@project-serum/serum": { + "version": "0.13.65", + "resolved": "https://registry.npmjs.org/@project-serum/serum/-/serum-0.13.65.tgz", + "integrity": "sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA==", + "dev": true, + "requires": { + "@project-serum/anchor": "^0.11.1", + "@solana/spl-token": "^0.1.6", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "dependencies": { + "@solana/spl-token": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.8.tgz", + "integrity": "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.5", + "@solana/web3.js": "^1.21.0", + "bn.js": "^5.1.0", + "buffer": "6.0.3", + "buffer-layout": "^1.2.0", + "dotenv": "10.0.0" + } + } + } + }, + "@raydium-io/raydium-sdk-v2": { + "version": "0.1.9-alpha", + "resolved": "https://registry.npmjs.org/@raydium-io/raydium-sdk-v2/-/raydium-sdk-v2-0.1.9-alpha.tgz", + "integrity": "sha512-sqgnxEk2lLiU9ZykXofIVnO8uPyIQY28cKZb8clO90J4dCej4gRgtDhmZe9pWOnsWKzrE5oHvU1FaWWhs7IgwA==", + "dev": true, + "requires": { + "@project-serum/serum": "^0.13.65", + "@solana/buffer-layout": "^4.0.1", + "@solana/spl-token": "^0.4.6", + "@solana/web3.js": "^1.91.8", + "axios": "^1.1.3", + "big.js": "^6.2.1", + "bn.js": "^5.2.1", + "buffer": "^6.0.3", + "dayjs": "^1.11.5", + "decimal.js-light": "^2.5.1", + "lodash": "^4.17.21", + "toformat": "^2.0.0" + }, + "dependencies": { + "@solana/spl-token": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", + "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "dev": true, + "requires": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "buffer": "^6.0.3" + } + }, + "@solana/spl-token-group": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", + "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "dev": true, + "requires": { + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + } + } + } + }, "@solana/buffer-layout": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", @@ -2473,64 +2843,13 @@ } }, "@solana/spl-token-metadata": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz", - "integrity": "sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", + "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", "dev": true, "requires": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-data-structures": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508", - "@solana/codecs-strings": "2.0.0-experimental.8618508", - "@solana/options": "2.0.0-experimental.8618508", + "@solana/codecs": "2.0.0-preview.2", "@solana/spl-type-length-value": "0.1.0" - }, - "dependencies": { - "@solana/codecs-core": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA==", - "dev": true - }, - "@solana/codecs-data-structures": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==", - "dev": true, - "requires": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - } - }, - "@solana/codecs-numbers": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==", - "dev": true, - "requires": { - "@solana/codecs-core": "2.0.0-experimental.8618508" - } - }, - "@solana/codecs-strings": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==", - "dev": true, - "requires": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - } - }, - "@solana/options": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==", - "dev": true, - "requires": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" - } - } } }, "@solana/spl-type-length-value": { @@ -2543,13 +2862,13 @@ } }, "@solana/web3.js": { - "version": "1.91.1", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.1.tgz", - "integrity": "sha512-cPgjZXm688oM9cULvJ8u2VH6Qp5rvptE1N1VODVxn2mAbpZsWrvWNPjmASkMYT/HzyrtqFkPvFdSHg8Xjt7aQA==", + "version": "1.92.3", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.92.3.tgz", + "integrity": "sha512-NVBWvb9zdJIAx6X+caXaIICCEQfQaQ8ygykCjJW4u2z/sIKcvPj3ZIIllnx0MWMc3IxGq15ozGYDOQIMbwUcHw==", "requires": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.3", + "@babel/runtime": "^7.24.6", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "agentkeepalive": "^4.5.0", "bigint-buffer": "^1.1.5", @@ -2560,14 +2879,14 @@ "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.0", "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" + "rpc-websockets": "^8.0.1", + "superstruct": "^1.0.4" }, "dependencies": { "superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==" } } }, @@ -2686,6 +3005,23 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2705,6 +3041,12 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "dev": true + }, "bigint-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", @@ -2902,6 +3244,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -2926,6 +3277,12 @@ "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==" }, + "dayjs": { + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==", + "dev": true + }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -2949,6 +3306,18 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "dev": true + }, "deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -2963,6 +3332,12 @@ "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==" }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -2978,6 +3353,12 @@ "tslib": "^2.0.3" } }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3045,6 +3426,15 @@ "to-regex-range": "^5.0.1" } }, + "find": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", + "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", + "dev": true, + "requires": { + "traverse-chain": "~0.1.0" + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3061,6 +3451,23 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3246,6 +3653,12 @@ } } }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3293,6 +3706,12 @@ "p-locate": "^5.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3326,6 +3745,21 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", @@ -3484,6 +3918,12 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -3514,11 +3954,10 @@ "dev": true }, "rpc-websockets": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.9.0.tgz", - "integrity": "sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-8.0.1.tgz", + "integrity": "sha512-PptrPRK40uQvifq5sCcObmqInVcZXhy+RRrirzdE5KUPvDI47y1wPvfckD2QzqngOU9xaPW/dT+G+b+wj6M1MQ==", "requires": { - "@babel/runtime": "^7.17.2", "bufferutil": "^4.0.1", "eventemitter3": "^4.0.7", "utf-8-validate": "^5.0.2", @@ -3527,9 +3966,9 @@ }, "dependencies": { "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "requires": {} } } @@ -3639,6 +4078,12 @@ "is-number": "^7.0.0" } }, + "toformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==", + "dev": true + }, "toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", @@ -3649,6 +4094,12 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true + }, "ts-mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", diff --git a/package.json b/package.json index 5eac7c9..fc312e6 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,22 @@ "scripts": { "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", - "test": "mocha --timeout 100000000 tests/" + "test": "mocha --timeout 100000000 tests/authorizeClmm.test.js" }, "dependencies": { "@coral-xyz/anchor": "^0.29.0" }, "devDependencies": { - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", + "@raydium-io/raydium-sdk-v2": "^0.1.9-alpha", + "@solana/spl-token": "^0.4.3", "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.0", "@types/mocha": "^9.0.0", - "typescript": "^4.3.5", + "chai": "^4.3.4", + "mocha": "^9.0.3", "prettier": "^2.6.2", - "@solana/spl-token": "^0.4.3" + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5", + "decimal.js": "^10.4.3" } } diff --git a/programs/donaproto/Cargo.toml b/programs/donaproto/Cargo.toml index 3d90540..8e39adf 100644 --- a/programs/donaproto/Cargo.toml +++ b/programs/donaproto/Cargo.toml @@ -21,4 +21,6 @@ anchor-spl = { version = "0.29.0" } raydium-amm-v3 = { git = "https://github.com/raydium-io/raydium-clmm", features = [ "no-entrypoint", "cpi", + "devnet" ] } +# TODO: add feature devnet dependent on build profile: test or release diff --git a/programs/donaproto/src/instructions/authorize_clmm.rs b/programs/donaproto/src/instructions/authorize_clmm.rs index cd41744..a8e2a39 100644 --- a/programs/donaproto/src/instructions/authorize_clmm.rs +++ b/programs/donaproto/src/instructions/authorize_clmm.rs @@ -5,12 +5,13 @@ use crate::states::{AuthorizedClmm, DonationProtocolData, DISCRIMINATOR_LEN}; pub const AUTHORIZED_CLMM_PREFIX: &str = "authorized_clmm"; #[derive(Accounts)] +#[instruction(program_id: Pubkey)] pub struct AuthorizeClmm<'info> { #[account(init, payer = payer, space = DISCRIMINATOR_LEN + AuthorizedClmm::INIT_SPACE, seeds = [ AUTHORIZED_CLMM_PREFIX.as_bytes(), - donation_protocol.to_account_info().key.as_ref(), - clmm_program_id.key.as_ref(), + donation_protocol.key().as_ref(), + program_id.as_ref(), ], bump, )] @@ -19,17 +20,15 @@ pub struct AuthorizeClmm<'info> { constraint = donation_protocol.authority == payer.key(), )] pub donation_protocol: Account<'info, DonationProtocolData>, - /// CHECK: Program address of CLMM, TODO: implement with Interface - pub clmm_program_id: AccountInfo<'info>, #[account(mut)] pub payer: Signer<'info>, pub system_program: Program<'info, System>, pub rent: Sysvar<'info, Rent>, } -pub fn authorize_clmm(ctx: Context) -> Result<()> { +pub fn authorize_clmm(ctx: Context, program_id: Pubkey) -> Result<()> { let authorized_clmm = &mut ctx.accounts.authorized_clmm; - authorized_clmm.program_id = ctx.accounts.clmm_program_id.key(); + authorized_clmm.program_id = program_id; authorized_clmm.donation_protocol = ctx.accounts.donation_protocol.key(); Ok(()) diff --git a/programs/donaproto/src/instructions/authorize_pool.rs b/programs/donaproto/src/instructions/authorize_pool.rs index 8df80a1..bb7f676 100644 --- a/programs/donaproto/src/instructions/authorize_pool.rs +++ b/programs/donaproto/src/instructions/authorize_pool.rs @@ -1,35 +1,33 @@ use anchor_lang::prelude::*; use anchor_spl::token::Mint; -use raydium_amm_v3::states::{AmmConfig, PoolState, POOL_SEED}; +use raydium_amm_v3::states::{AmmConfig, PoolState}; -use crate::states::{AuthorizedClmm, AuthorizedPool, DonationProtocolData, DISCRIMINATOR_LEN}; +use crate::states::{AuthorizedClmm, AuthorizedClmmPool, DonationProtocolData, DISCRIMINATOR_LEN}; -pub const AUTHORIZED_POOL_PREFIX: &str = "authorized_pool"; +pub const AUTHORIZED_CLMM_POOL_PREFIX: &str = "authorized_clmm_pool"; #[derive(Accounts)] -pub struct AuthorizePool<'info> { - #[account(init, payer = payer, space = DISCRIMINATOR_LEN + AuthorizedPool::INIT_SPACE, +pub struct AuthorizeClmmPool<'info> { + #[account(init, payer = payer, space = DISCRIMINATOR_LEN + AuthorizedClmmPool::INIT_SPACE, seeds = [ - AUTHORIZED_POOL_PREFIX.as_bytes(), + AUTHORIZED_CLMM_POOL_PREFIX.as_bytes(), donation_protocol.key().as_ref(), pool_state.key().as_ref(), ], bump, )] - pub authorized_pool: Account<'info, AuthorizedPool>, + pub authorized_clmm_pool: Account<'info, AuthorizedClmmPool>, /// DEX pool state with current token pair price #[account( - seeds = [ - POOL_SEED.as_bytes(), - amm_config.key().as_ref(), - donation_amm_mint.key().as_ref(), - donation_protocol.donation_mint.key().as_ref(), - ], - seeds::program = authorized_clmm.program_id.key(), - bump, + constraint = (pool_state.load()?.token_mint_0 == donation_protocol.donation_mint && pool_state.load()?.token_mint_1 == donation_amm_mint.key()) + || (pool_state.load()?.token_mint_1 == donation_protocol.donation_mint && pool_state.load()?.token_mint_0 == donation_amm_mint.key()), + constraint = pool_state.load()?.amm_config == amm_config.key(), )] pub pool_state: AccountLoader<'info, PoolState>, pub amm_config: Box>, + #[account( + constraint = donation_protocol.authority == payer.key(), + )] pub donation_protocol: Account<'info, DonationProtocolData>, pub donation_amm_mint: Account<'info, Mint>, #[account( @@ -42,12 +40,12 @@ pub struct AuthorizePool<'info> { pub rent: Sysvar<'info, Rent>, } -pub fn authorize_pool(ctx: Context) -> Result<()> { - let authorized_pool = &mut ctx.accounts.authorized_pool; - authorized_pool.pool_state = ctx.accounts.pool_state.key(); - authorized_pool.program_id = ctx.accounts.authorized_clmm.program_id; - authorized_pool.token = ctx.accounts.donation_amm_mint.key(); - authorized_pool.donation_protocol = ctx.accounts.donation_protocol.key(); +pub fn authorize_clmm_pool(ctx: Context) -> Result<()> { + let authorized_clmm_pool = &mut ctx.accounts.authorized_clmm_pool; + authorized_clmm_pool.pool_state = ctx.accounts.pool_state.key(); + authorized_clmm_pool.program_id = ctx.accounts.authorized_clmm.program_id; + authorized_clmm_pool.token = ctx.accounts.donation_amm_mint.key(); + authorized_clmm_pool.donation_protocol = ctx.accounts.donation_protocol.key(); Ok(()) } diff --git a/programs/donaproto/src/lib.rs b/programs/donaproto/src/lib.rs index 2832521..91548c1 100644 --- a/programs/donaproto/src/lib.rs +++ b/programs/donaproto/src/lib.rs @@ -50,4 +50,12 @@ pub mod donaproto { pub fn withdraw_funds(ctx: Context) -> Result<()> { instructions::withdraw_funds(ctx) } + + pub fn authorize_clmm(ctx: Context, program_id: Pubkey) -> Result<()> { + instructions::authorize_clmm(ctx, program_id) + } + + pub fn authorize_clmm_pool(ctx: Context) -> Result<()> { + instructions::authorize_clmm_pool(ctx) + } } diff --git a/programs/donaproto/src/states/authorized_pool.rs b/programs/donaproto/src/states/authorized_pool.rs index d239bfb..747e4aa 100644 --- a/programs/donaproto/src/states/authorized_pool.rs +++ b/programs/donaproto/src/states/authorized_pool.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; #[account] #[derive(Default)] #[derive(InitSpace)] -pub struct AuthorizedPool { +pub struct AuthorizedClmmPool { pub pool_state: Pubkey, pub program_id: Pubkey, pub token: Pubkey, diff --git a/raydium_amm_v3.so b/raydium_amm_v3.so new file mode 100644 index 0000000..33c3e58 Binary files /dev/null and b/raydium_amm_v3.so differ diff --git a/tests/authorizeClmm.test.js b/tests/authorizeClmm.test.js new file mode 100644 index 0000000..3b904dd --- /dev/null +++ b/tests/authorizeClmm.test.js @@ -0,0 +1,147 @@ +const anchor = require("@coral-xyz/anchor"); +const { + createMint, + getOrCreateAssociatedTokenAccount +} = require('@solana/spl-token'); +const os = require('os'); +const assert = require('assert'); +const { rechargeWallet } = require("./common/utils"); + +const TREASURY_PREFIX = 'treasury'; +const AUTHORIZED_CLMM_PREFIX = 'authorized_clmm'; + +describe("Authorize CLMM program", () => { + const homedir = os.homedir(); + process.env.ANCHOR_WALLET = `${homedir}/.config/solana/id.json`; + const program = anchor.workspace.Donaproto; + const provider = anchor.AnchorProvider.local(); + anchor.setProvider(provider); + const connection = provider.connection; + const { payer } = program.provider.wallet + const donationMintAuthority = payer; + const donationMintDecimals = 6; + let donationMintPubKey, rewardsMintPubKey + const rewardMintAuthority = payer; + const rewardMintDecimals = 9; + const minAmountToCollect = new anchor.BN(1_000_000); + const clmmProgramId = new anchor.web3.PublicKey("devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH"); + const minAmountToEarn = new anchor.BN(1000); + const donationProtocolData = anchor.web3.Keypair.generate(); + const [treasuryOwnerPK, treasuryOwnerBump] = anchor.web3.PublicKey.findProgramAddressSync( + [ + Buffer.from(TREASURY_PREFIX), + donationProtocolData.publicKey.toBuffer(), + ], + program.programId, + ); + const [authorizedClmmPubkey] = anchor.web3.PublicKey.findProgramAddressSync( + [ + Buffer.from(AUTHORIZED_CLMM_PREFIX), + donationProtocolData.publicKey.toBuffer(), + clmmProgramId.toBuffer(), + ], + program.programId, + ); + const wrongAuthority = anchor.web3.Keypair.generate(); + + before(async () => { + await rechargeWallet(connection, wrongAuthority.publicKey, 1e9); + donationMintPubKey = await createMint( + provider.connection, + payer, + donationMintAuthority.publicKey, + null, + donationMintDecimals + ); + + rewardsMintPubKey = await createMint( + connection, + payer, + rewardMintAuthority.publicKey, + null, + rewardMintDecimals + ) + }) + + it("initializes donation protocol data", async () => { + const treasuryTokenAccount = await getOrCreateAssociatedTokenAccount( + connection, + payer, + rewardsMintPubKey, + treasuryOwnerPK, + allowOwnerOffCurve = true + ) + console.log(`treasuryPK: ${treasuryTokenAccount.address}`); + + const tx = await program.rpc.initializeDonationProtocol( + minAmountToEarn, + minAmountToCollect, + treasuryOwnerBump, + { + accounts: { + donationProtocolData: donationProtocolData.publicKey, + treasury: treasuryTokenAccount.address, + treasuryOwner: treasuryOwnerPK, + treasuryMint: rewardsMintPubKey, + donationMint: donationMintPubKey, + payer: payer.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [donationProtocolData], + } + ); + console.log("Your transaction signature", tx); + + const onchainDonationProtocolData = await program.account.donationProtocolData.fetch(donationProtocolData.publicKey); + assert.deepEqual(onchainDonationProtocolData.treasuryMint, rewardsMintPubKey); + assert.deepEqual(onchainDonationProtocolData.treasury, treasuryTokenAccount.address); + assert.deepEqual(onchainDonationProtocolData.donationMint, donationMintPubKey); + assert.equal(onchainDonationProtocolData.minAmountToEarn.toString(), minAmountToEarn.toString()); + assert.equal(onchainDonationProtocolData.treasuryOwnerBump.toString(), treasuryOwnerBump.toString()); + assert.deepEqual(onchainDonationProtocolData.authority, payer.publicKey); + }); + + it("fails to authorize clmm with wrong authority", async () => { + try { + await program.rpc.authorizeClmm( + clmmProgramId, + { + accounts: { + authorizedClmm: authorizedClmmPubkey, + donationProtocol: donationProtocolData.publicKey, + payer: wrongAuthority.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [wrongAuthority], + } + ); + assert.ok(false); + } catch (err) { + assert.equal(err.error.errorCode.code, "ConstraintRaw"); + assert.equal(err.error.errorCode.number, 2003); + assert.equal(err.error.errorMessage, "A raw constraint was violated"); + } + }); + + it("authorizes clmm", async () => { + const tx = await program.rpc.authorizeClmm( + clmmProgramId, + { + accounts: { + authorizedClmm: authorizedClmmPubkey, + donationProtocol: donationProtocolData.publicKey, + payer: payer.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + } + ); + console.log("Authorize CLMM transaction signature", tx); + + const onchainAuthorizedClmm = await program.account.authorizedClmm.fetch(authorizedClmmPubkey); + assert.deepEqual(onchainAuthorizedClmm.donationProtocol, donationProtocolData.publicKey); + assert.deepEqual(onchainAuthorizedClmm.programId, clmmProgramId); + }); +}); diff --git a/tests/authorizeClmmPool.test.js b/tests/authorizeClmmPool.test.js new file mode 100644 index 0000000..a38f7b4 --- /dev/null +++ b/tests/authorizeClmmPool.test.js @@ -0,0 +1,197 @@ +const anchor = require("@coral-xyz/anchor"); +const { + createMint, + getOrCreateAssociatedTokenAccount, + getMint +} = require('@solana/spl-token'); +const os = require('os'); +const assert = require('assert'); +const { rechargeWallet, loadObjectFromJsonFile } = require("./common/utils"); +const { createPoolState } = require("./common/amm_helper"); + +const TREASURY_PREFIX = 'treasury'; +const AUTHORIZED_CLMM_PREFIX = 'authorized_clmm'; +const AUTHORIZED_CLMM_POOL_PREFIX = 'authorized_clmm_pool'; + +const raydiumAmmIdl = loadObjectFromJsonFile('./app/src/idl/raydium-amm.json'); + +describe("Authorize CLMM pool", () => { + const homedir = os.homedir(); + process.env.ANCHOR_WALLET = `${homedir}/.config/solana/id.json`; + const program = anchor.workspace.Donaproto; + const provider = anchor.AnchorProvider.local(); + anchor.setProvider(provider); + const clmmProgramId = new anchor.web3.PublicKey("devi51mZmdwUJGU9hjN27vEz64Gps7uUefqxg27EAtH"); + const ammConfigPubkey = new anchor.web3.PublicKey("GVSwm4smQBYcgAJU7qjFHLQBHTc4AdB3F2HbZp6KqKof"); + const clmmProgram = new anchor.Program( + raydiumAmmIdl, + clmmProgramId, + provider + ) + + const connection = provider.connection; + const { payer } = program.provider.wallet + const donationMintAuthority = payer; + const donationMintDecimals = 6; + let donationMintPubKey, rewardsMintPubKey + const rewardMintAuthority = payer; + const rewardMintDecimals = 9; + const minAmountToCollect = new anchor.BN(1_000_000); + const minAmountToEarn = new anchor.BN(1000); + const donationProtocolData = anchor.web3.Keypair.generate(); + const [treasuryOwnerPK, treasuryOwnerBump] = anchor.web3.PublicKey.findProgramAddressSync( + [ + Buffer.from(TREASURY_PREFIX), + donationProtocolData.publicKey.toBuffer(), + ], + program.programId, + ); + const [authorizedClmmPubkey] = anchor.web3.PublicKey.findProgramAddressSync( + [ + Buffer.from(AUTHORIZED_CLMM_PREFIX), + donationProtocolData.publicKey.toBuffer(), + clmmProgramId.toBuffer(), + ], + program.programId, + ); + const wrongAuthority = anchor.web3.Keypair.generate(); + + before(async () => { + await rechargeWallet(connection, wrongAuthority.publicKey, 1e9); + donationMintPubKey = await createMint( + provider.connection, + payer, + donationMintAuthority.publicKey, + null, + donationMintDecimals + ); + + rewardsMintPubKey = await createMint( + connection, + payer, + rewardMintAuthority.publicKey, + null, + rewardMintDecimals + ) + }) + + it("initializes donation protocol data", async () => { + const treasuryTokenAccount = await getOrCreateAssociatedTokenAccount( + connection, + payer, + rewardsMintPubKey, + treasuryOwnerPK, + allowOwnerOffCurve = true + ) + + const tx = await program.rpc.initializeDonationProtocol( + minAmountToEarn, + minAmountToCollect, + treasuryOwnerBump, + { + accounts: { + donationProtocolData: donationProtocolData.publicKey, + treasury: treasuryTokenAccount.address, + treasuryOwner: treasuryOwnerPK, + treasuryMint: rewardsMintPubKey, + donationMint: donationMintPubKey, + payer: payer.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + signers: [donationProtocolData], + } + ); + console.log("Your transaction signature", tx); + + const onchainDonationProtocolData = await program.account.donationProtocolData.fetch(donationProtocolData.publicKey); + assert.deepEqual(onchainDonationProtocolData.treasuryMint, rewardsMintPubKey); + assert.deepEqual(onchainDonationProtocolData.treasury, treasuryTokenAccount.address); + assert.deepEqual(onchainDonationProtocolData.donationMint, donationMintPubKey); + assert.equal(onchainDonationProtocolData.minAmountToEarn.toString(), minAmountToEarn.toString()); + assert.equal(onchainDonationProtocolData.treasuryOwnerBump.toString(), treasuryOwnerBump.toString()); + assert.deepEqual(onchainDonationProtocolData.authority, payer.publicKey); + }); + + it("authorizes clmm", async () => { + const tx = await program.rpc.authorizeClmm( + clmmProgramId, + { + accounts: { + authorizedClmm: authorizedClmmPubkey, + donationProtocol: donationProtocolData.publicKey, + payer: payer.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + } + ); + console.log("Authorize CLMM transaction signature", tx); + + const onchainAuthorizedClmm = await program.account.authorizedClmm.fetch(authorizedClmmPubkey); + assert.deepEqual(onchainAuthorizedClmm.donationProtocol, donationProtocolData.publicKey); + assert.deepEqual(onchainAuthorizedClmm.programId, clmmProgramId); + }); + + it("authorizes clmm pool", async () => { + const newMintDecimals = 5; // BONK has 5 decimals + const newDonationMintPubKey = await createMint( + connection, + payer, + donationMintAuthority.publicKey, + null, + newMintDecimals + ); + + const tokenMint0 = await getMint(connection, donationMintPubKey); + const tokenMint1 = await getMint(connection, newDonationMintPubKey); + + const price = 36626.12336; // USDC(token0) per BONK(token1) = 36626.12336 + const openTime = new anchor.BN(0); + const poolStateResult = await createPoolState( + clmmProgram, + connection, + payer, + { + ammConfigPubkey, + tokenMint0, + tokenMint1, + price, + openTime, + } + ); + const [authorizedClmmPoolPubkey] = anchor.web3.PublicKey.findProgramAddressSync( + [ + Buffer.from(AUTHORIZED_CLMM_POOL_PREFIX), + donationProtocolData.publicKey.toBuffer(), + poolStateResult.poolId.toBuffer(), + ], + program.programId, + ); + console.log("authorizedClmmPoolPubkey", authorizedClmmPoolPubkey.toString()); + console.log("authorizedClmmPubkey", authorizedClmmPubkey.toString()); + + const tx = await program.rpc.authorizeClmmPool( + { + accounts: { + authorizedClmmPool: authorizedClmmPoolPubkey, + poolState: poolStateResult.poolId, + ammConfig: ammConfigPubkey, + donationProtocol: donationProtocolData.publicKey, + donationAmmMint: newDonationMintPubKey, + authorizedClmm: authorizedClmmPubkey, + payer: payer.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + }, + } + ); + console.log("Authorize CLMM Pool transaction signature", tx); + + const onchainAuthorizedClmmPool = await program.account.authorizedClmmPool.fetch(authorizedClmmPoolPubkey); + assert.deepEqual(onchainAuthorizedClmmPool.donationProtocol, donationProtocolData.publicKey); + assert.deepEqual(onchainAuthorizedClmmPool.poolState, poolStateResult.poolId); + assert.deepEqual(onchainAuthorizedClmmPool.programId, clmmProgramId); + assert.deepEqual(onchainAuthorizedClmmPool.token, newDonationMintPubKey); + }); +}); diff --git a/tests/common/amm_helper.js b/tests/common/amm_helper.js new file mode 100644 index 0000000..2780798 --- /dev/null +++ b/tests/common/amm_helper.js @@ -0,0 +1,80 @@ +const anchor = require("@coral-xyz/anchor"); +const { SqrtPriceMath, ClmmInstrument, getPdaPoolId } = require("@raydium-io/raydium-sdk-v2"); +const { + TOKEN_PROGRAM_ID, +} = require('@solana/spl-token'); +const Decimal = require('decimal.js'); + +async function createPoolState( + program, + connection, + payer, + { + ammConfigPubkey, + tokenMint0, + tokenMint1, + price, + openTime, + } +) { + const [mintA, mintB, initPrice] = new anchor.BN(new anchor.web3.PublicKey(tokenMint0.address).toBuffer()).gt( + new anchor.BN(new anchor.web3.PublicKey(tokenMint1.address).toBuffer()), + ) + ? [tokenMint1, tokenMint0, new Decimal(1).div(new Decimal(price))] + : [tokenMint0, tokenMint1, new Decimal(price)]; + + const initialPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(initPrice, mintA.decimals, mintB.decimals); + try { + const { publicKey: poolId } = await getPdaPoolId(program.programId, ammConfigPubkey, mintA.address, mintB.address); + const createPoolStateInstData = await ClmmInstrument.createPoolInstructions({ + connection, + programId: program.programId, + owner: payer.publicKey, + mintA, + mintB, + ammConfigId: ammConfigPubkey, + initialPriceX64, + startTime: openTime, + forerunCreate: false, + }) + + const tx = new anchor.web3.Transaction().add(...createPoolStateInstData.instructions); + const txSignature = await anchor.web3.sendAndConfirmTransaction(connection, tx, [payer, ...createPoolStateInstData.signers]); + console.log(`Pool state account created: ${txSignature}`); + + return { + poolId, + mintA, + mintB, + success: true, + } + } catch (err) { + console.error('Error creating pool state account:', err); + throw err; + } +} + +async function createObservation(connection, clmmProgramId, payer, observationKeypair) { + const tx = new anchor.web3.Transaction(); + const OBSERVATION_SIZE = 41 + 80 + 52 * 1000; + + const inst = anchor.web3.SystemProgram.createAccount({ + fromPubkey: payer.publicKey, + newAccountPubkey: observationKeypair.publicKey, + lamports: await connection.getMinimumBalanceForRentExemption( + OBSERVATION_SIZE + ), + space: OBSERVATION_SIZE, + programId: clmmProgramId, + }); + + tx.add(inst) + + const txSignature = await anchor.web3.sendAndConfirmTransaction(connection, tx, [payer, observationKeypair]); + console.log(`Observation transaction signature: ${txSignature}`); +} + +module.exports = { + createObservation, + createPoolState, +}; diff --git a/tests/common/utils.js b/tests/common/utils.js index c41ce97..0a80bc8 100644 --- a/tests/common/utils.js +++ b/tests/common/utils.js @@ -1,5 +1,6 @@ const borsh = require('borsh'); const anchor = require("@coral-xyz/anchor"); +const fs = require('fs'); async function getNowTs(provider) { const accountInfo = await provider.connection.getAccountInfo(anchor.web3.SYSVAR_CLOCK_PUBKEY); @@ -19,7 +20,19 @@ async function rechargeWallet(connection, wallet, lamports) { return wallet; } +const loadObjectFromJsonFile = (filePath) => { + try { + const jsonString = fs.readFileSync(filePath, 'utf8'); + const object = JSON.parse(jsonString); + return object; + } catch (err) { + console.error(`Error loading object from JSON file: ${err}`); + return null; + } +}; + module.exports = { getNowTs, rechargeWallet, + loadObjectFromJsonFile, }; diff --git a/yarn.lock b/yarn.lock index 782f279..c25232a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== +"@babel/runtime@^7.10.5", "@babel/runtime@^7.24.6": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: regenerator-runtime "^0.14.0" @@ -37,18 +37,75 @@ bn.js "^5.1.2" buffer-layout "^1.2.0" -"@noble/curves@^1.2.0": +"@noble/curves@^1.4.0": version "1.4.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz" integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== dependencies: "@noble/hashes" "1.4.0" -"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.3": +"@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0", "@noble/hashes@1.4.0": version "1.4.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== +"@project-serum/anchor@^0.11.1": + version "0.11.1" + resolved "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz" + integrity sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA== + dependencies: + "@project-serum/borsh" "^0.2.2" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.0" + camelcase "^5.3.1" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + +"@project-serum/borsh@^0.2.2": + version "0.2.5" + resolved "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz" + integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@project-serum/serum@^0.13.65": + version "0.13.65" + resolved "https://registry.npmjs.org/@project-serum/serum/-/serum-0.13.65.tgz" + integrity sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA== + dependencies: + "@project-serum/anchor" "^0.11.1" + "@solana/spl-token" "^0.1.6" + "@solana/web3.js" "^1.21.0" + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@raydium-io/raydium-sdk-v2@^0.1.9-alpha": + version "0.1.9-alpha" + resolved "https://registry.npmjs.org/@raydium-io/raydium-sdk-v2/-/raydium-sdk-v2-0.1.9-alpha.tgz" + integrity sha512-sqgnxEk2lLiU9ZykXofIVnO8uPyIQY28cKZb8clO90J4dCej4gRgtDhmZe9pWOnsWKzrE5oHvU1FaWWhs7IgwA== + dependencies: + "@project-serum/serum" "^0.13.65" + "@solana/buffer-layout" "^4.0.1" + "@solana/spl-token" "^0.4.6" + "@solana/web3.js" "^1.91.8" + axios "^1.1.3" + big.js "^6.2.1" + bn.js "^5.2.1" + buffer "^6.0.3" + dayjs "^1.11.5" + decimal.js-light "^2.5.1" + lodash "^4.17.21" + toformat "^2.0.0" + "@solana/buffer-layout-utils@^0.2.0": version "0.2.0" resolved "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz" @@ -66,11 +123,6 @@ dependencies: buffer "~6.0.3" -"@solana/codecs-core@2.0.0-experimental.8618508": - version "2.0.0-experimental.8618508" - resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz" - integrity sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA== - "@solana/codecs-core@2.0.0-preview.2": version "2.0.0-preview.2" resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz" @@ -78,14 +130,6 @@ dependencies: "@solana/errors" "2.0.0-preview.2" -"@solana/codecs-data-structures@2.0.0-experimental.8618508": - version "2.0.0-experimental.8618508" - resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz" - integrity sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw== - dependencies: - "@solana/codecs-core" "2.0.0-experimental.8618508" - "@solana/codecs-numbers" "2.0.0-experimental.8618508" - "@solana/codecs-data-structures@2.0.0-preview.2": version "2.0.0-preview.2" resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz" @@ -95,13 +139,6 @@ "@solana/codecs-numbers" "2.0.0-preview.2" "@solana/errors" "2.0.0-preview.2" -"@solana/codecs-numbers@2.0.0-experimental.8618508": - version "2.0.0-experimental.8618508" - resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz" - integrity sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q== - dependencies: - "@solana/codecs-core" "2.0.0-experimental.8618508" - "@solana/codecs-numbers@2.0.0-preview.2": version "2.0.0-preview.2" resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz" @@ -110,14 +147,6 @@ "@solana/codecs-core" "2.0.0-preview.2" "@solana/errors" "2.0.0-preview.2" -"@solana/codecs-strings@2.0.0-experimental.8618508": - version "2.0.0-experimental.8618508" - resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz" - integrity sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA== - dependencies: - "@solana/codecs-core" "2.0.0-experimental.8618508" - "@solana/codecs-numbers" "2.0.0-experimental.8618508" - "@solana/codecs-strings@2.0.0-preview.2": version "2.0.0-preview.2" resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz" @@ -146,14 +175,6 @@ chalk "^5.3.0" commander "^12.0.0" -"@solana/options@2.0.0-experimental.8618508": - version "2.0.0-experimental.8618508" - resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-experimental.8618508.tgz" - integrity sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg== - dependencies: - "@solana/codecs-core" "2.0.0-experimental.8618508" - "@solana/codecs-numbers" "2.0.0-experimental.8618508" - "@solana/options@2.0.0-preview.2": version "2.0.0-preview.2" resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz" @@ -170,18 +191,34 @@ "@solana/codecs" "2.0.0-preview.2" "@solana/spl-type-length-value" "0.1.0" -"@solana/spl-token-metadata@^0.1.2": - version "0.1.2" - resolved "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz" - integrity sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw== +"@solana/spl-token-group@^0.0.4": + version "0.0.4" + resolved "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz" + integrity sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw== dependencies: - "@solana/codecs-core" "2.0.0-experimental.8618508" - "@solana/codecs-data-structures" "2.0.0-experimental.8618508" - "@solana/codecs-numbers" "2.0.0-experimental.8618508" - "@solana/codecs-strings" "2.0.0-experimental.8618508" - "@solana/options" "2.0.0-experimental.8618508" + "@solana/codecs" "2.0.0-preview.2" + "@solana/spl-type-length-value" "0.1.0" + +"@solana/spl-token-metadata@^0.1.2", "@solana/spl-token-metadata@^0.1.4": + version "0.1.4" + resolved "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz" + integrity sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ== + dependencies: + "@solana/codecs" "2.0.0-preview.2" "@solana/spl-type-length-value" "0.1.0" +"@solana/spl-token@^0.1.6": + version "0.1.8" + resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.8.tgz" + integrity sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ== + dependencies: + "@babel/runtime" "^7.10.5" + "@solana/web3.js" "^1.21.0" + bn.js "^5.1.0" + buffer "6.0.3" + buffer-layout "^1.2.0" + dotenv "10.0.0" + "@solana/spl-token@^0.4.3": version "0.4.3" resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.3.tgz" @@ -193,6 +230,17 @@ "@solana/spl-token-metadata" "^0.1.2" buffer "^6.0.3" +"@solana/spl-token@^0.4.6": + version "0.4.6" + resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz" + integrity sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + "@solana/spl-token-group" "^0.0.4" + "@solana/spl-token-metadata" "^0.1.4" + buffer "^6.0.3" + "@solana/spl-type-length-value@0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz" @@ -200,14 +248,14 @@ dependencies: buffer "^6.0.3" -"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.68.0": - version "1.91.1" - resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.1.tgz" - integrity sha512-cPgjZXm688oM9cULvJ8u2VH6Qp5rvptE1N1VODVxn2mAbpZsWrvWNPjmASkMYT/HzyrtqFkPvFdSHg8Xjt7aQA== +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.2.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.91.1", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.91.8": + version "1.92.3" + resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.92.3.tgz" + integrity sha512-NVBWvb9zdJIAx6X+caXaIICCEQfQaQ8ygykCjJW4u2z/sIKcvPj3ZIIllnx0MWMc3IxGq15ozGYDOQIMbwUcHw== dependencies: - "@babel/runtime" "^7.23.4" - "@noble/curves" "^1.2.0" - "@noble/hashes" "^1.3.3" + "@babel/runtime" "^7.24.6" + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" "@solana/buffer-layout" "^4.0.1" agentkeepalive "^4.5.0" bigint-buffer "^1.1.5" @@ -218,8 +266,8 @@ fast-stable-stringify "^1.0.0" jayson "^4.1.0" node-fetch "^2.7.0" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" + rpc-websockets "^8.0.1" + superstruct "^1.0.4" "@types/bn.js@^5.1.0": version "5.1.5" @@ -274,14 +322,6 @@ resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - agentkeepalive@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" @@ -329,6 +369,20 @@ assertion-error@^1.1.0: resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.1.3: + version "1.7.2" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -341,11 +395,16 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -base64-js@^1.3.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +big.js@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz" + integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== + bigint-buffer@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" @@ -370,7 +429,7 @@ bindings@^1.3.0: dependencies: file-uri-to-path "1.0.0" -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.1.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -421,7 +480,7 @@ buffer-layout@^1.2.0, buffer-layout@^1.2.2: resolved "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== -buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: +buffer@^6.0.3, buffer@~6.0.3, buffer@6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -436,6 +495,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.0.0, camelcase@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" @@ -510,6 +574,13 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^12.0.0: version "12.0.0" resolved "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz" @@ -537,6 +608,11 @@ crypto-hash@^1.3.0: resolved "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz" integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== +dayjs@^1.11.5: + version "1.11.11" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz" + integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + debug@4.3.3: version "4.3.3" resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" @@ -549,6 +625,16 @@ decamelize@^4.0.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js-light@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" @@ -561,16 +647,21 @@ delay@^5.0.0: resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== diff@^3.1.0: version "3.5.0" resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" @@ -579,6 +670,11 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dotenv@10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -621,6 +717,11 @@ fast-stable-stringify@^1.0.0: resolved "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz" integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== +fastestsmallesttextencoderdecoder@^1.0.22: + version "1.0.22" + resolved "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz" + integrity sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw== + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" @@ -641,21 +742,37 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/find/-/find-0.3.0.tgz" + integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== + dependencies: + traverse-chain "~0.1.0" + flat@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" @@ -782,16 +899,21 @@ jayson@^4.1.0: "@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" + JSONStream "^1.3.5" uuid "^8.3.2" ws "^7.4.5" +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + js-yaml@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -816,6 +938,14 @@ jsonparse@^1.2.0: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -823,6 +953,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" @@ -850,12 +985,17 @@ make-error@^1.1.1: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - brace-expansion "^1.1.7" + mime-db "1.52.0" minimatch@^3.0.4: version "3.1.2" @@ -864,6 +1004,13 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -876,7 +1023,7 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mocha@^9.0.3: +"mocha@^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X", mocha@^9.0.3: version "9.2.2" resolved "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz" integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== @@ -906,16 +1053,16 @@ mocha@^9.0.3: yargs-parser "20.2.4" yargs-unparser "2.0.0" +ms@^2.0.0, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - nanoid@3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz" @@ -997,6 +1144,11 @@ prettier@^2.6.2: resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" @@ -1021,12 +1173,11 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -rpc-websockets@^7.5.1: - version "7.9.0" - resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.9.0.tgz" - integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== +rpc-websockets@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-8.0.1.tgz" + integrity sha512-PptrPRK40uQvifq5sCcObmqInVcZXhy+RRrirzdE5KUPvDI47y1wPvfckD2QzqngOU9xaPW/dT+G+b+wj6M1MQ== dependencies: - "@babel/runtime" "^7.17.2" eventemitter3 "^4.0.7" uuid "^8.3.2" ws "^8.5.0" @@ -1093,22 +1244,15 @@ strip-json-comments@3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - superstruct@^0.15.4: version "0.15.5" resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.15.5.tgz" integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" +superstruct@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== supports-color@^7.1.0: version "7.2.0" @@ -1117,6 +1261,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + text-encoding-utf-8@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" @@ -1134,6 +1285,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toformat@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz" + integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== + toml@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz" @@ -1144,6 +1300,11 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +traverse-chain@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz" + integrity sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg== + ts-mocha@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz" @@ -1197,7 +1358,7 @@ undici-types@~5.26.4: resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -utf-8-validate@^5.0.2: +utf-8-validate@^5.0.2, utf-8-validate@>=5.0.2: version "5.0.10" resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz" integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== @@ -1248,31 +1409,31 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^7.4.5: +ws@*, ws@^7.4.5: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.5.0: - version "8.16.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + version "8.17.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz"