From 375137ecf00df6077f12724216a78c98ca93a77b Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Thu, 8 Dec 2022 18:06:17 -0500 Subject: [PATCH 01/11] introducing referrals program. --- Cargo.lock | 89 ++++++++++++++++++ programs/referrals/Cargo.toml | 25 ++++++ programs/referrals/Xargo.toml | 2 + programs/referrals/src/instructions/mod.rs | 0 programs/referrals/src/lib.rs | 100 +++++++++++++++++++++ 5 files changed, 216 insertions(+) create mode 100644 programs/referrals/Cargo.toml create mode 100644 programs/referrals/Xargo.toml create mode 100644 programs/referrals/src/instructions/mod.rs create mode 100644 programs/referrals/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 9ac5d37..632c4db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -789,6 +789,51 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mpl-token-metadata" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "971c30b15f9c6d8baeec960256560431b500f0329de2ca98b652d005070b6be8" +dependencies = [ + "arrayref", + "borsh", + "mpl-token-vault", + "mpl-utils", + "num-derive", + "num-traits", + "shank", + "solana-program", + "spl-associated-token-account", + "spl-token", + "thiserror", +] + +[[package]] +name = "mpl-token-vault" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade4ef15bc06a6033076c4ff28cba9b42521df5ec61211d6f419415ace2746a" +dependencies = [ + "borsh", + "num-derive", + "num-traits", + "solana-program", + "spl-token", + "thiserror", +] + +[[package]] +name = "mpl-utils" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330468b3ea93d306ed5ae5e389b0b64cfbc43fcd29a4eeae74e20f13c979e7a5" +dependencies = [ + "arrayref", + "borsh", + "solana-program", + "spl-token", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -1040,6 +1085,16 @@ dependencies = [ "bitflags", ] +[[package]] +name = "referrals" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "mpl-token-metadata", + "plege", +] + [[package]] name = "regex" version = "1.6.0" @@ -1164,6 +1219,40 @@ dependencies = [ "keccak", ] +[[package]] +name = "shank" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63e565b5e95ad88ab38f312e89444c749360641c509ef2de0093b49f55974a5" +dependencies = [ + "shank_macro", +] + +[[package]] +name = "shank_macro" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63927d22a1e8b74bda98cc6e151fcdf178b7abb0dc6c4f81e0bbf5ffe2fc4ec8" +dependencies = [ + "proc-macro2", + "quote", + "shank_macro_impl", + "syn", +] + +[[package]] +name = "shank_macro_impl" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce03403df682f80f4dc1efafa87a4d0cb89b03726d0565e6364bdca5b9a441" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "serde", + "syn", +] + [[package]] name = "sized-chunks" version = "0.6.5" diff --git a/programs/referrals/Cargo.toml b/programs/referrals/Cargo.toml new file mode 100644 index 0000000..32e7547 --- /dev/null +++ b/programs/referrals/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "referrals" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "referrals" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[profile.release] +overflow-checks = true + +[dependencies] +anchor-lang = "0.25.0" +anchor-spl = "0.25.0" +mpl-token-metadata = { version = "1.6.2", features = ["no-entrypoint"] } +plege = { path = "../plege", features = ["no-entrypoint"] } diff --git a/programs/referrals/Xargo.toml b/programs/referrals/Xargo.toml new file mode 100644 index 0000000..475fb71 --- /dev/null +++ b/programs/referrals/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/programs/referrals/src/instructions/mod.rs b/programs/referrals/src/instructions/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs new file mode 100644 index 0000000..42a8f55 --- /dev/null +++ b/programs/referrals/src/lib.rs @@ -0,0 +1,100 @@ +use anchor_lang::prelude::*; +use anchor_spl::token::{Mint, Token, TokenAccount}; +use plege::state::App; + +declare_id!("DWPZARiryrryvhsmvvkV18pzCafD69ZjpGkhnEGwbSgt"); + +const REFERRAL_AGENT: &str = "referral_agent"; + +#[program] +pub mod referrals { + use super::*; + + pub fn create_referralship(ctx: Context) -> Result<()> { + Ok(()) + } + + pub fn subscribe_with_referral(ctx: Context) -> Result<()> { + Ok(()) + } + + pub fn split_payment(ctx: Context) -> Result<()> { + Ok(()) + } +} + +#[derive(Accounts)] +pub struct CreateReferralship<'info> { + pub referralship: Account<'info, Referralship>, + pub app: Account<'info, App>, + pub referral_agents_collection_nft_mint: Account<'info, Mint>, + pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, + pub app_authority: Signer<'info>, + pub system_program: Program<'info, System>, +} + +#[derive(Accounts)] +pub struct SubscribeWithReferral<'info> { + pub subscriber: AccountInfo<'info>, + pub referral: AccountInfo<'info>, +} + +#[derive(Accounts)] +pub struct SplitPayment<'info> { + pub referralship: Account<'info, Referralship>, + pub referral_agent: AccountInfo<'info>, + pub referral_agents_collection_nft_mint: Account<'info, TokenAccount>, + /// CHECK: This account will be manually deserialized and checked. + pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, + pub token_program: Program<'info, Token>, +} + +#[account] +pub struct Referralship { + pub app: Pubkey, + pub referral_agents_collection_nft_mint: Pubkey, + pub splits: Splits8, +} + +#[derive(AnchorDeserialize, AnchorSerialize, Clone, Default)] +pub struct AddressWithWeight { + address: Pubkey, + weight: u8, +} + +#[derive(AnchorDeserialize, AnchorSerialize, Clone)] +pub struct Splits8 { + pub referral_agent: u8, + pub slot_1: Option, + pub slot_2: Option, + pub slot_3: Option, + pub slot_4: Option, + pub slot_5: Option, + pub slot_6: Option, + pub slot_7: Option, +} + +impl Splits8 { + pub fn validate_weights(&self) -> Result<()> { + let total_weight = self.referral_agent + + self.slot_1.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_2.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_3.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_4.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_5.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_6.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_7.as_ref().map(|a| a.weight).unwrap_or(0); + + if total_weight != 100 { + return Err(ReferralError::TotalWeightIsNot100.into()); + } + + Ok(()) + } +} + +#[error_code] +pub enum ReferralError { + ReferralAgentSplitNotSet, + TotalWeightIsNot100, +} From a2b95748a5687c173fc9ed0105e5e7f773284e77 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Thu, 8 Dec 2022 22:51:32 -0500 Subject: [PATCH 02/11] reorg --- programs/referrals/src/error.rs | 8 ++ .../src/instructions/create_referralship.rs | 44 +++++++++ programs/referrals/src/instructions/mod.rs | 7 ++ .../src/instructions/split_payment.rs | 21 ++++ .../instructions/subscribe_with_referral.rs | 15 +++ programs/referrals/src/lib.rs | 98 +++---------------- programs/referrals/src/state/mod.rs | 9 ++ programs/referrals/src/state/referral.rs | 8 ++ programs/referrals/src/state/referralship.rs | 9 ++ programs/referrals/src/state/splits.rs | 40 ++++++++ 10 files changed, 175 insertions(+), 84 deletions(-) create mode 100644 programs/referrals/src/error.rs create mode 100644 programs/referrals/src/instructions/create_referralship.rs create mode 100644 programs/referrals/src/instructions/split_payment.rs create mode 100644 programs/referrals/src/instructions/subscribe_with_referral.rs create mode 100644 programs/referrals/src/state/mod.rs create mode 100644 programs/referrals/src/state/referral.rs create mode 100644 programs/referrals/src/state/referralship.rs create mode 100644 programs/referrals/src/state/splits.rs diff --git a/programs/referrals/src/error.rs b/programs/referrals/src/error.rs new file mode 100644 index 0000000..942bda2 --- /dev/null +++ b/programs/referrals/src/error.rs @@ -0,0 +1,8 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum ReferralError { + ReferralAgentSplitNotSet, + TotalWeightIsNot100, + InvalidAppAuthority, +} diff --git a/programs/referrals/src/instructions/create_referralship.rs b/programs/referrals/src/instructions/create_referralship.rs new file mode 100644 index 0000000..fbde59c --- /dev/null +++ b/programs/referrals/src/instructions/create_referralship.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; +use anchor_spl::token::{Mint, Token, TokenAccount}; +use mpl_token_metadata::state::{CollectionDetails, Metadata}; +use plege::{program::Plege, state::App}; + +use crate::{ + error::ReferralError, + state::{Referralship, Splits8}, +}; + +#[derive(Accounts)] +#[instruction(splits: Splits8, app_id: u8)] +pub struct CreateReferralship<'info> { + #[account( + init, + payer = app_authority, + space = 1000, + seeds = [], + bump + )] + pub referralship: Account<'info, Referralship>, + #[account( + seeds = ["APP".as_bytes(), app.auth.key().as_ref(), app_id.to_be_bytes().as_ref()], + bump, + owner = plege_program.key() + )] + pub app: Account<'info, App>, + pub referral_agents_collection_nft_mint: Account<'info, Mint>, + /// CHECK: we will manually deserialize and check this account + pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, + #[account(mut)] + #[account(constraint = app_authority.key() == app.auth.key() @ ReferralError::InvalidAppAuthority)] + pub app_authority: Signer<'info>, + pub plege_program: Program<'info, Plege>, + pub system_program: Program<'info, System>, +} + +pub fn create_referralship( + ctx: Context, + splits: Splits8, + app_id: u8, +) -> Result<()> { + Ok(()) +} diff --git a/programs/referrals/src/instructions/mod.rs b/programs/referrals/src/instructions/mod.rs index e69de29..9c8fe89 100644 --- a/programs/referrals/src/instructions/mod.rs +++ b/programs/referrals/src/instructions/mod.rs @@ -0,0 +1,7 @@ +mod create_referralship; +mod split_payment; +mod subscribe_with_referral; + +pub use create_referralship::*; +pub use split_payment::*; +pub use subscribe_with_referral::*; diff --git a/programs/referrals/src/instructions/split_payment.rs b/programs/referrals/src/instructions/split_payment.rs new file mode 100644 index 0000000..11de1e9 --- /dev/null +++ b/programs/referrals/src/instructions/split_payment.rs @@ -0,0 +1,21 @@ +use anchor_lang::prelude::*; +use anchor_spl::token::{Mint, Token, TokenAccount}; +use mpl_token_metadata::state::{CollectionDetails, Metadata}; + +use crate::state::Referralship; + +#[derive(Accounts)] +pub struct SplitPayment<'info> { + pub referralship: Account<'info, Referralship>, + pub referral_agent_nft_token_account: Account<'info, TokenAccount>, + /// CHECK: This account will be manually deserialized and checked. + pub referral_agent_nft_token_metadata: UncheckedAccount<'info>, + pub referral_agents_collection_nft_mint: Account<'info, Mint>, + /// CHECK: This account will be manually deserialized and checked. + pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, + pub token_program: Program<'info, Token>, +} + +pub fn split_payment(ctx: Context) -> Result<()> { + Ok(()) +} diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs new file mode 100644 index 0000000..a4bffb2 --- /dev/null +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -0,0 +1,15 @@ +use anchor_lang::prelude::*; +use plege::state::App; + +use crate::state::Referral; + +#[derive(Accounts)] +pub struct SubscribeWithReferral<'info> { + pub app: Account<'info, App>, + pub referral: Account<'info, Referral>, + pub subscriber: Signer<'info>, +} + +pub fn subscribe_with_referral(ctx: Context) -> Result<()> { + Ok(()) +} diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index 42a8f55..b641ff1 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -1,100 +1,30 @@ +mod error; +mod instructions; +mod state; + use anchor_lang::prelude::*; -use anchor_spl::token::{Mint, Token, TokenAccount}; -use plege::state::App; +use instructions::*; +use state::Splits8; declare_id!("DWPZARiryrryvhsmvvkV18pzCafD69ZjpGkhnEGwbSgt"); -const REFERRAL_AGENT: &str = "referral_agent"; - #[program] pub mod referrals { use super::*; - pub fn create_referralship(ctx: Context) -> Result<()> { - Ok(()) + pub fn create_referralship( + ctx: Context, + splits: Splits8, + app_id: u8, + ) -> Result<()> { + instructions::create_referralship(ctx, splits, app_id) } pub fn subscribe_with_referral(ctx: Context) -> Result<()> { - Ok(()) + instructions::subscribe_with_referral(ctx) } pub fn split_payment(ctx: Context) -> Result<()> { - Ok(()) + instructions::split_payment(ctx) } } - -#[derive(Accounts)] -pub struct CreateReferralship<'info> { - pub referralship: Account<'info, Referralship>, - pub app: Account<'info, App>, - pub referral_agents_collection_nft_mint: Account<'info, Mint>, - pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, - pub app_authority: Signer<'info>, - pub system_program: Program<'info, System>, -} - -#[derive(Accounts)] -pub struct SubscribeWithReferral<'info> { - pub subscriber: AccountInfo<'info>, - pub referral: AccountInfo<'info>, -} - -#[derive(Accounts)] -pub struct SplitPayment<'info> { - pub referralship: Account<'info, Referralship>, - pub referral_agent: AccountInfo<'info>, - pub referral_agents_collection_nft_mint: Account<'info, TokenAccount>, - /// CHECK: This account will be manually deserialized and checked. - pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, - pub token_program: Program<'info, Token>, -} - -#[account] -pub struct Referralship { - pub app: Pubkey, - pub referral_agents_collection_nft_mint: Pubkey, - pub splits: Splits8, -} - -#[derive(AnchorDeserialize, AnchorSerialize, Clone, Default)] -pub struct AddressWithWeight { - address: Pubkey, - weight: u8, -} - -#[derive(AnchorDeserialize, AnchorSerialize, Clone)] -pub struct Splits8 { - pub referral_agent: u8, - pub slot_1: Option, - pub slot_2: Option, - pub slot_3: Option, - pub slot_4: Option, - pub slot_5: Option, - pub slot_6: Option, - pub slot_7: Option, -} - -impl Splits8 { - pub fn validate_weights(&self) -> Result<()> { - let total_weight = self.referral_agent - + self.slot_1.as_ref().map(|a| a.weight).unwrap_or(0) - + self.slot_2.as_ref().map(|a| a.weight).unwrap_or(0) - + self.slot_3.as_ref().map(|a| a.weight).unwrap_or(0) - + self.slot_4.as_ref().map(|a| a.weight).unwrap_or(0) - + self.slot_5.as_ref().map(|a| a.weight).unwrap_or(0) - + self.slot_6.as_ref().map(|a| a.weight).unwrap_or(0) - + self.slot_7.as_ref().map(|a| a.weight).unwrap_or(0); - - if total_weight != 100 { - return Err(ReferralError::TotalWeightIsNot100.into()); - } - - Ok(()) - } -} - -#[error_code] -pub enum ReferralError { - ReferralAgentSplitNotSet, - TotalWeightIsNot100, -} diff --git a/programs/referrals/src/state/mod.rs b/programs/referrals/src/state/mod.rs new file mode 100644 index 0000000..75516d3 --- /dev/null +++ b/programs/referrals/src/state/mod.rs @@ -0,0 +1,9 @@ +mod referral; +mod referralship; +mod splits; + +pub use referral::*; +pub use referralship::*; +pub use splits::*; + +pub const REFERRAL_AGENT: &str = "referral_agent"; diff --git a/programs/referrals/src/state/referral.rs b/programs/referrals/src/state/referral.rs new file mode 100644 index 0000000..776941d --- /dev/null +++ b/programs/referrals/src/state/referral.rs @@ -0,0 +1,8 @@ +use anchor_lang::prelude::*; + +#[account] +pub struct Referral { + pub app: Pubkey, + pub referral_agent_nft_mint: Pubkey, + pub subscription: Pubkey, +} diff --git a/programs/referrals/src/state/referralship.rs b/programs/referrals/src/state/referralship.rs new file mode 100644 index 0000000..87e1805 --- /dev/null +++ b/programs/referrals/src/state/referralship.rs @@ -0,0 +1,9 @@ +use crate::state::Splits8; +use anchor_lang::prelude::*; + +#[account] +pub struct Referralship { + pub app: Pubkey, + pub referral_agents_collection_nft_mint: Pubkey, + pub splits: Splits8, +} diff --git a/programs/referrals/src/state/splits.rs b/programs/referrals/src/state/splits.rs new file mode 100644 index 0000000..6ca3ace --- /dev/null +++ b/programs/referrals/src/state/splits.rs @@ -0,0 +1,40 @@ +use anchor_lang::prelude::*; + +use crate::error::ReferralError; + +#[derive(AnchorDeserialize, AnchorSerialize, Clone, Default)] +pub struct AddressWithWeight { + address: Pubkey, + weight: u8, +} + +#[derive(AnchorDeserialize, AnchorSerialize, Clone)] +pub struct Splits8 { + pub referral_agent: u8, + pub slot_1: Option, + pub slot_2: Option, + pub slot_3: Option, + pub slot_4: Option, + pub slot_5: Option, + pub slot_6: Option, + pub slot_7: Option, +} + +impl Splits8 { + pub fn validate_weights(&self) -> Result<()> { + let total_weight = self.referral_agent + + self.slot_1.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_2.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_3.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_4.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_5.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_6.as_ref().map(|a| a.weight).unwrap_or(0) + + self.slot_7.as_ref().map(|a| a.weight).unwrap_or(0); + + if total_weight != 100 { + return Err(ReferralError::TotalWeightIsNot100.into()); + } + + Ok(()) + } +} From 92e65ffd90fba25fbb9cc7509713485319567d17 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Fri, 9 Dec 2022 17:52:54 -0500 Subject: [PATCH 03/11] finish create_referralship. --- Anchor.toml | 3 +- package.json | 1 + programs/plege/src/lib.rs | 2 +- programs/referrals/src/error.rs | 3 + .../src/instructions/create_referralship.rs | 82 +- programs/referrals/src/lib.rs | 7 +- programs/referrals/src/state/mod.rs | 4 +- programs/referrals/src/state/referralship.rs | 1 + programs/referrals/src/state/splits.rs | 4 +- tests/basic.ts | 150 +- tests/referrals.ts | 159 ++ tests/tiers.ts | 122 +- tests/utils/basic-functions.ts | 63 +- yarn.lock | 1777 ++++++++++++++++- 14 files changed, 2187 insertions(+), 191 deletions(-) create mode 100644 tests/referrals.ts diff --git a/Anchor.toml b/Anchor.toml index 21a9d6d..2b74766 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -3,7 +3,8 @@ seeds = true skip-lint = false [programs.localnet] -plege = "CoQBfJd641bD85WYv6g2vXZvD6ae43b63VyQ1DBeXgAs" +plege = "CdEWFt6UP8LGX878nQA5qH2GUoEaHmae7RSnDWxVMww8" +referrals = 'DWPZARiryrryvhsmvvkV18pzCafD69ZjpGkhnEGwbSgt' [registry] url = "https://api.apr.dev" diff --git a/package.json b/package.json index 8f1646f..15909f3 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" }, "dependencies": { + "@metaplex-foundation/js": "^0.17.9", "@project-serum/anchor": "^0.25.0", "@solana/spl-token": "^0.3.6" }, diff --git a/programs/plege/src/lib.rs b/programs/plege/src/lib.rs index f5e8a66..09b4881 100644 --- a/programs/plege/src/lib.rs +++ b/programs/plege/src/lib.rs @@ -7,7 +7,7 @@ pub mod state; use instructions::*; use state::Interval; -declare_id!("CoQBfJd641bD85WYv6g2vXZvD6ae43b63VyQ1DBeXgAs"); +declare_id!("CdEWFt6UP8LGX878nQA5qH2GUoEaHmae7RSnDWxVMww8"); #[program] pub mod plege { diff --git a/programs/referrals/src/error.rs b/programs/referrals/src/error.rs index 942bda2..cb2e7ae 100644 --- a/programs/referrals/src/error.rs +++ b/programs/referrals/src/error.rs @@ -5,4 +5,7 @@ pub enum ReferralError { ReferralAgentSplitNotSet, TotalWeightIsNot100, InvalidAppAuthority, + TooManySplitsProvided, + InvalidCollectionMetadata, + CollectionMetadataMintMismatch, } diff --git a/programs/referrals/src/instructions/create_referralship.rs b/programs/referrals/src/instructions/create_referralship.rs index fbde59c..f409f1d 100644 --- a/programs/referrals/src/instructions/create_referralship.rs +++ b/programs/referrals/src/instructions/create_referralship.rs @@ -1,28 +1,33 @@ +use std::borrow::Borrow; + use anchor_lang::prelude::*; use anchor_spl::token::{Mint, Token, TokenAccount}; -use mpl_token_metadata::state::{CollectionDetails, Metadata}; +use mpl_token_metadata::{ + assertions::assert_owned_by, + state::{CollectionDetails, Metadata, TokenMetadataAccount}, +}; use plege::{program::Plege, state::App}; use crate::{ error::ReferralError, - state::{Referralship, Splits8}, + state::{AddressWithWeight, Referralship, Splits8, APP, REFERRALSHIP}, }; #[derive(Accounts)] -#[instruction(splits: Splits8, app_id: u8)] +#[instruction(app_id: u8)] pub struct CreateReferralship<'info> { #[account( init, payer = app_authority, - space = 1000, - seeds = [], + space = 1000, + seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref()], bump )] pub referralship: Account<'info, Referralship>, #[account( - seeds = ["APP".as_bytes(), app.auth.key().as_ref(), app_id.to_be_bytes().as_ref()], + seeds = [APP.as_bytes(), app_authority.key().as_ref(), app_id.to_be_bytes().as_ref()], + seeds::program = plege_program.key(), bump, - owner = plege_program.key() )] pub app: Account<'info, App>, pub referral_agents_collection_nft_mint: Account<'info, Mint>, @@ -37,8 +42,69 @@ pub struct CreateReferralship<'info> { pub fn create_referralship( ctx: Context, - splits: Splits8, app_id: u8, + referral_agent_split: u8, + splits: Vec, ) -> Result<()> { + let app = &ctx.accounts.app; + let referralship = &mut ctx.accounts.referralship; + let referral_agents_collection_nft_mint = &ctx.accounts.referral_agents_collection_nft_mint; + let maybe_referral_agents_collection_nft_metadata = + &ctx.accounts.referral_agents_collection_nft_metadata; + + if splits.len() > 7 { + return Err(ReferralError::TooManySplitsProvided.into()); + } + + let mut splits_iter = splits.into_iter(); + + // iterate over the addresses provided as splits, if there are fewer than 7, fill the rest with + // None. + let splits = Splits8 { + referral_agent: referral_agent_split, + slot_1: splits_iter.next(), + slot_2: splits_iter.next(), + slot_3: splits_iter.next(), + slot_4: splits_iter.next(), + slot_5: splits_iter.next(), + slot_6: splits_iter.next(), + slot_7: splits_iter.next(), + }; + + // make sure the splits add up to 100 + splits.validate_weights()?; + + // make sure the metadata belongs to the metaplex token metadata program; + assert_owned_by( + maybe_referral_agents_collection_nft_metadata + .to_account_info() + .borrow(), + &mpl_token_metadata::id(), + )?; + + // make sure the metadata can be deserialized. + let collection_metadata = Metadata::from_account_info( + maybe_referral_agents_collection_nft_metadata + .to_account_info() + .borrow(), + ) + .map_err(|_| ReferralError::InvalidCollectionMetadata)?; + + // make sure the mint account matches the mint in the metadata + if collection_metadata.mint != referral_agents_collection_nft_mint.key() { + return Err(ReferralError::CollectionMetadataMintMismatch.into()); + } + + // make sure the metadata is for a collection NFT + if collection_metadata.collection_details.is_none() { + return Err(ReferralError::InvalidCollectionMetadata.into()); + } + + // set referralship state + referralship.app = app.key(); + referralship.app_id = app_id; + referralship.referral_agents_collection_nft_mint = referral_agents_collection_nft_mint.key(); + referralship.splits = splits; + Ok(()) } diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index b641ff1..2e6ee07 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -4,7 +4,7 @@ mod state; use anchor_lang::prelude::*; use instructions::*; -use state::Splits8; +use state::{AddressWithWeight, Splits8}; declare_id!("DWPZARiryrryvhsmvvkV18pzCafD69ZjpGkhnEGwbSgt"); @@ -14,10 +14,11 @@ pub mod referrals { pub fn create_referralship( ctx: Context, - splits: Splits8, app_id: u8, + referral_agent_split: u8, + splits: Vec, ) -> Result<()> { - instructions::create_referralship(ctx, splits, app_id) + instructions::create_referralship(ctx, app_id, referral_agent_split, splits) } pub fn subscribe_with_referral(ctx: Context) -> Result<()> { diff --git a/programs/referrals/src/state/mod.rs b/programs/referrals/src/state/mod.rs index 75516d3..c41115e 100644 --- a/programs/referrals/src/state/mod.rs +++ b/programs/referrals/src/state/mod.rs @@ -6,4 +6,6 @@ pub use referral::*; pub use referralship::*; pub use splits::*; -pub const REFERRAL_AGENT: &str = "referral_agent"; +pub const REFERRAL_AGENT: &str = "REFERRAL_AGENT"; +pub const REFERRALSHIP: &str = "REFERRALSHIP"; +pub const APP: &str = "APP"; diff --git a/programs/referrals/src/state/referralship.rs b/programs/referrals/src/state/referralship.rs index 87e1805..68ae256 100644 --- a/programs/referrals/src/state/referralship.rs +++ b/programs/referrals/src/state/referralship.rs @@ -4,6 +4,7 @@ use anchor_lang::prelude::*; #[account] pub struct Referralship { pub app: Pubkey, + pub app_id: u8, pub referral_agents_collection_nft_mint: Pubkey, pub splits: Splits8, } diff --git a/programs/referrals/src/state/splits.rs b/programs/referrals/src/state/splits.rs index 6ca3ace..f353627 100644 --- a/programs/referrals/src/state/splits.rs +++ b/programs/referrals/src/state/splits.rs @@ -2,13 +2,13 @@ use anchor_lang::prelude::*; use crate::error::ReferralError; -#[derive(AnchorDeserialize, AnchorSerialize, Clone, Default)] +#[derive(AnchorDeserialize, AnchorSerialize, Clone, Default, Debug)] pub struct AddressWithWeight { address: Pubkey, weight: u8, } -#[derive(AnchorDeserialize, AnchorSerialize, Clone)] +#[derive(AnchorDeserialize, AnchorSerialize, Clone, Default)] pub struct Splits8 { pub referral_agent: u8, pub slot_1: Option, diff --git a/tests/basic.ts b/tests/basic.ts index cd1cb5a..3d54432 100644 --- a/tests/basic.ts +++ b/tests/basic.ts @@ -1,13 +1,13 @@ -import * as anchor from "@project-serum/anchor" +import * as anchor from "@project-serum/anchor"; import { createAssociatedTokenAccount, getAccount, mintToChecked, -} from "@solana/spl-token" -import { BN } from "@project-serum/anchor" -import { expect } from "chai" +} from "@solana/spl-token"; +import { BN } from "@project-serum/anchor"; +import { expect } from "chai"; -describe("basic flow", () => { +xdescribe("basic flow", () => { it("creates user", async () => { await global.program.methods .createUser() @@ -15,8 +15,8 @@ describe("basic flow", () => { auth: global.testKeypairs.colossal.publicKey, }) .signers([global.testKeypairs.colossal]) - .rpc() - }) + .rpc(); + }); it("creates app", async () => { await global.program.methods @@ -26,13 +26,13 @@ describe("basic flow", () => { treasury: global.testKeypairs.colossal.publicKey, }) .signers([global.testKeypairs.colossal]) - .rpc() + .rpc(); - const appPDA = await global.program.account.app.fetch(app) + const appPDA = await global.program.account.app.fetch(app); expect(appPDA.auth.toBase58()).to.equal( - global.testKeypairs.colossal.publicKey.toBase58() - ) - }) + global.testKeypairs.colossal.publicKey.toBase58(), + ); + }); it("create tier", async () => { await global.program.methods @@ -43,14 +43,14 @@ describe("basic flow", () => { signer: global.testKeypairs.colossal.publicKey, }) .signers([global.testKeypairs.colossal]) - .rpc() + .rpc(); - const tierPDA = await global.program.account.tier.fetch(tier) - expect(tierPDA.app.toBase58()).to.equal(app.toBase58()) - expect(tierPDA.mint.toBase58()).to.equal(global.mint.toBase58()) - expect(tierPDA.price.toNumber()).to.equal(10) - expect(tierPDA.interval.month !== undefined) - }) + const tierPDA = await global.program.account.tier.fetch(tier); + expect(tierPDA.app.toBase58()).to.equal(app.toBase58()); + expect(tierPDA.mint.toBase58()).to.equal(global.mint.toBase58()); + expect(tierPDA.price.toNumber()).to.equal(10); + expect(tierPDA.interval.month !== undefined); + }); it("create subscription", async () => { await global.program.methods @@ -62,22 +62,22 @@ describe("basic flow", () => { subscriberAta, }) .signers([global.testKeypairs.subscriber]) - .rpc() + .rpc(); const subscriptionPDA = await global.program.account.subscription.fetch( - subscription - ) + subscription, + ); - expect(subscriptionPDA.app.toBase58()).to.equal(app.toBase58()) - expect(subscriptionPDA.tier.toBase58()).to.equal(tier.toBase58()) + expect(subscriptionPDA.app.toBase58()).to.equal(app.toBase58()); + expect(subscriptionPDA.tier.toBase58()).to.equal(tier.toBase58()); expect(subscriptionPDA.subscriber.toBase58()).to.equal( - global.testKeypairs.subscriber.publicKey.toBase58() - ) - const startTime = new Date(subscriptionPDA.start * 1000) - expect(new Date().getTime() - startTime.getTime()).to.be.lessThan(5000) - expect(subscriptionPDA.amountPaid.toNumber()).to.equal(0) - expect(subscriptionPDA.active).to.equal(true) - }) + global.testKeypairs.subscriber.publicKey.toBase58(), + ); + const startTime = new Date(subscriptionPDA.start * 1000); + expect(new Date().getTime() - startTime.getTime()).to.be.lessThan(5000); + expect(subscriptionPDA.amountPaid.toNumber()).to.equal(0); + expect(subscriptionPDA.active).to.equal(true); + }); it("completes payment", async () => { await global.program.methods @@ -89,17 +89,17 @@ describe("basic flow", () => { subscriberAta, subscription, }) - .rpc() + .rpc(); const subscriptionPDA = await global.program.account.subscription.fetch( - subscription - ) + subscription, + ); - const ownerATA = await getAccount(global.connection, colossalAta) + const ownerATA = await getAccount(global.connection, colossalAta); - expect(subscriptionPDA.amountPaid.toNumber()).to.equal(10) - expect(Number(ownerATA.amount)).to.equal(10) - }) + expect(subscriptionPDA.amountPaid.toNumber()).to.equal(10); + expect(Number(ownerATA.amount)).to.equal(10); + }); it("cancels subscription", async () => { await global.program.methods @@ -111,11 +111,13 @@ describe("basic flow", () => { subscriberAta, }) .signers([global.testKeypairs.subscriber]) - .rpc() + .rpc(); - const subscriptionPDA = await global.connection.getAccountInfo(subscription) - expect(subscriptionPDA).to.equal(null) - }) + const subscriptionPDA = await global.connection.getAccountInfo( + subscription, + ); + expect(subscriptionPDA).to.equal(null); + }); it("creates subscription again", async () => { await global.program.methods @@ -127,69 +129,69 @@ describe("basic flow", () => { subscriberAta, }) .signers([global.testKeypairs.subscriber]) - .rpc() + .rpc(); const subscriptionPDA = await global.program.account.subscription.fetch( - subscription - ) + subscription, + ); - expect(subscriptionPDA.app.toBase58()).to.equal(app.toBase58()) - expect(subscriptionPDA.tier.toBase58()).to.equal(tier.toBase58()) + expect(subscriptionPDA.app.toBase58()).to.equal(app.toBase58()); + expect(subscriptionPDA.tier.toBase58()).to.equal(tier.toBase58()); expect(subscriptionPDA.subscriber.toBase58()).to.equal( - global.testKeypairs.subscriber.publicKey.toBase58() - ) - const startTime = new Date(subscriptionPDA.start * 1000) - expect(new Date().getTime() - startTime.getTime()).to.be.lessThan(5000) - expect(subscriptionPDA.amountPaid.toNumber()).to.equal(0) - expect(subscriptionPDA.active).to.equal(true) - }) + global.testKeypairs.subscriber.publicKey.toBase58(), + ); + const startTime = new Date(subscriptionPDA.start * 1000); + expect(new Date().getTime() - startTime.getTime()).to.be.lessThan(5000); + expect(subscriptionPDA.amountPaid.toNumber()).to.equal(0); + expect(subscriptionPDA.active).to.equal(true); + }); before(async () => { - ;[app] = anchor.web3.PublicKey.findProgramAddressSync( + [app] = anchor.web3.PublicKey.findProgramAddressSync( [ Buffer.from("APP"), global.testKeypairs.colossal.publicKey.toBuffer(), new BN([1]).toArrayLike(Buffer, "be", 1), ], - global.program.programId - ) - ;[tier] = anchor.web3.PublicKey.findProgramAddressSync( + global.program.programId, + ); + [tier] = anchor.web3.PublicKey.findProgramAddressSync( [ Buffer.from("SUBSCRIPTION_TIER"), app.toBuffer(), new BN([1]).toArrayLike(Buffer, "be", 1), ], - global.program.programId - ) - ;[subscription] = anchor.web3.PublicKey.findProgramAddressSync( + global.program.programId, + ); + [subscription] = anchor.web3.PublicKey.findProgramAddressSync( [ Buffer.from("SUBSCRIPTION"), app.toBuffer(), global.testKeypairs.subscriber.publicKey.toBuffer(), ], - global.program.programId - ) + global.program.programId, + ); colossalAta = await createAssociatedTokenAccount( global.connection, global.testKeypairs.colossal, global.mint, - global.testKeypairs.colossal.publicKey - ) + global.testKeypairs.colossal.publicKey, + ); subscriberAta = await createAssociatedTokenAccount( global.connection, global.testKeypairs.subscriber, global.mint, - global.testKeypairs.subscriber.publicKey - ) + global.testKeypairs.subscriber.publicKey, + ); hackerAta = await createAssociatedTokenAccount( global.connection, global.testKeypairs.hacker, global.mint, - global.testKeypairs.hacker.publicKey - ) + global.testKeypairs.hacker.publicKey, + ); await mintToChecked( global.connection, @@ -198,9 +200,9 @@ describe("basic flow", () => { subscriberAta, global.testKeypairs.colossal.publicKey, 1000 * 10 ** 5, - 5 - ) - }) -}) + 5, + ); + }); +}); -let colossalAta, subscriberAta, hackerAta, app, tier, subscription +let colossalAta, subscriberAta, hackerAta, app, tier, subscription; diff --git a/tests/referrals.ts b/tests/referrals.ts new file mode 100644 index 0000000..b54e92b --- /dev/null +++ b/tests/referrals.ts @@ -0,0 +1,159 @@ +import { assert } from "chai"; +import { + Keypair, + PublicKey, + SystemProgram, + Transaction, +} from "@solana/web3.js"; +import * as anchor from "@project-serum/anchor"; +import { Referrals } from "../target/types/referrals"; +import { Plege } from "../target/types/plege"; +import generateFundedKeypair from "./utils/keypair"; +import { + findAppAddress, + numberToAppId, + userAccountKeyFromPubkey, +} from "./utils/basic-functions"; +import { createAssociatedTokenAccount, createMint } from "@solana/spl-token"; +import { + keypairIdentity, + Metaplex, + mockStorage, +} from "@metaplex-foundation/js"; + +function findReferralshipAddress( + app: PublicKey, + programId: PublicKey, +): [PublicKey, number] { + return PublicKey.findProgramAddressSync([ + Buffer.from("REFERRALSHIP"), + app.toBuffer(), + ], programId); +} + +describe("referrals", () => { + anchor.setProvider(anchor.AnchorProvider.env()); + const referralProgram = anchor.workspace.Referrals as anchor.Program< + Referrals + >; + const subscriptionProgram = anchor.workspace.Plege as anchor.Program< + Plege + >; + + it("creates a referralship", async () => { + // create app authority + const appAuthorityKeypair = await generateFundedKeypair( + anchor.getProvider().connection, + ); + + const treasuryAuthorityKeypair = await generateFundedKeypair( + anchor.getProvider().connection, + ); + + // create a token mint + let treasuryMint = await createMint( + anchor.getProvider().connection, + treasuryAuthorityKeypair, + treasuryAuthorityKeypair.publicKey, + treasuryAuthorityKeypair.publicKey, + 0, + ); + + let treasuryTokenAccount = await createAssociatedTokenAccount( + anchor.getProvider().connection, + treasuryAuthorityKeypair, + treasuryMint, + treasuryAuthorityKeypair.publicKey, + ); + + const metaplex = Metaplex.make(anchor.getProvider().connection).use( + keypairIdentity(treasuryAuthorityKeypair), + ).use(mockStorage()); + + let userMetaAddress = userAccountKeyFromPubkey( + appAuthorityKeypair.publicKey, + ); + + // create user meta -- required by the subscription program's createApp instruction + const createUserMetaIx = await subscriptionProgram.methods.createUser() + .accounts({ + userMeta: userMetaAddress, + auth: appAuthorityKeypair.publicKey, + systemProgram: SystemProgram.programId, + }).instruction(); + + // create an app + let appId = 1; + let formattedAppId = numberToAppId(appId); + let [appAddress] = findAppAddress( + appAuthorityKeypair.publicKey, + appId, + subscriptionProgram.programId, + ); + + const createAppIx = await subscriptionProgram.methods.createApp( + appId, + "nil studios super app", + ) + .accounts( + { + app: appAddress, + auth: appAuthorityKeypair.publicKey, + userMeta: userMetaAddress, + treasury: treasuryTokenAccount, + systemProgram: SystemProgram.programId, + }, + ).instruction(); + + let createUserAndAppTx = new Transaction() + .add(createUserMetaIx) + .add(createAppIx); + + await anchor.getProvider().sendAndConfirm(createUserAndAppTx, [ + appAuthorityKeypair, + ], { skipPreflight: true }); + + let [referralshipAddress] = findReferralshipAddress( + appAddress, + referralProgram.programId, + ); + + let referralAgentsCollectionNFT = await metaplex.nfts().create({ + name: "Referral Agents", + uri: "https://example.com/nil", + symbol: "REFAG", + sellerFeeBasisPoints: 0, + isCollection: true, + collectionAuthority: appAuthorityKeypair, + }); + + // create a referralship account + let createReferralshipIx = await referralProgram.methods + .createReferralship(appId, 90, [{ + address: Keypair.generate().publicKey, + weight: 10, + }]).accounts({ + referralship: referralshipAddress, + app: appAddress, + appAuthority: appAuthorityKeypair.publicKey, + referralAgentsCollectionNftMint: + referralAgentsCollectionNFT.mintAddress, + referralAgentsCollectionNftMetadata: + referralAgentsCollectionNFT.metadataAddress, + plegeProgram: subscriptionProgram.programId, + systemProgram: SystemProgram.programId, + }).instruction(); + + let createReferralshipTx = new Transaction().add(createReferralshipIx); + + await anchor.getProvider().sendAndConfirm(createReferralshipTx, [ + appAuthorityKeypair, + ], { skipPreflight: true }); + + let referralship = await referralProgram.account.referralship.fetch( + referralshipAddress, + ); + + console.log(referralship); + }); +}); diff --git a/tests/tiers.ts b/tests/tiers.ts index 268775f..83c815c 100644 --- a/tests/tiers.ts +++ b/tests/tiers.ts @@ -1,13 +1,13 @@ -import * as anchor from "@project-serum/anchor" -import { createAssociatedTokenAccount, mintToChecked } from "@solana/spl-token" -import { expect } from "chai" +import * as anchor from "@project-serum/anchor"; +import { createAssociatedTokenAccount, mintToChecked } from "@solana/spl-token"; +import { expect } from "chai"; import { createUserAppTier, subscriptionAccountKey, -} from "./utils/basic-functions" -import generateFundedKeypair from "./utils/keypair" +} from "./utils/basic-functions"; +import generateFundedKeypair from "./utils/keypair"; -describe("tier functionality", () => { +xdescribe("tier functionality", () => { it("new tier accepts subscribers", async () => { await global.program.methods .createSubscription() @@ -18,7 +18,7 @@ describe("tier functionality", () => { subscriberAta: subscriber1Ata, }) .signers([subscriber1]) - .rpc() + .rpc(); await global.program.methods .createSubscription() @@ -29,21 +29,21 @@ describe("tier functionality", () => { subscriberAta: subscriber2Ata, }) .signers([subscriber2]) - .rpc() + .rpc(); - const subscription1 = subscriptionAccountKey(subscriber1.publicKey, app) + const subscription1 = subscriptionAccountKey(subscriber1.publicKey, app); const subscription1PDA = await global.program.account.subscription.fetch( - subscription1 - ) + subscription1, + ); - const subscription2 = subscriptionAccountKey(subscriber1.publicKey, app) + const subscription2 = subscriptionAccountKey(subscriber1.publicKey, app); const subscription2PDA = await global.program.account.subscription.fetch( - subscription2 - ) + subscription2, + ); - expect(subscription1PDA) - expect(subscription2PDA) - }) + expect(subscription1PDA); + expect(subscription2PDA); + }); it("tier can stop accepting subscribers", async () => { await global.program.methods @@ -54,7 +54,7 @@ describe("tier functionality", () => { auth: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); try { await global.program.methods @@ -66,11 +66,11 @@ describe("tier functionality", () => { subscriberAta: subscriber2Ata, }) .signers([subscriber2]) - .rpc() + .rpc(); } catch (error) { - expect(error.error.errorCode.number).to.equal(2003) + expect(error.error.errorCode.number).to.equal(2003); } - }) + }); it("tier can accept subscribers again", async () => { await global.program.methods @@ -81,13 +81,13 @@ describe("tier functionality", () => { auth: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); await global.program.methods .allowNewSubscribers() .accounts({ app, tier, auth: auth.publicKey }) .signers([auth]) - .rpc() + .rpc(); await global.program.methods .createSubscription() @@ -98,15 +98,15 @@ describe("tier functionality", () => { subscriberAta: subscriber1Ata, }) .signers([subscriber1]) - .rpc() + .rpc(); - const subscription1 = subscriptionAccountKey(subscriber1.publicKey, app) + const subscription1 = subscriptionAccountKey(subscriber1.publicKey, app); const subscription1PDA = await global.program.account.subscription.fetch( - subscription1 - ) + subscription1, + ); - expect(subscription1PDA) - }) + expect(subscription1PDA); + }); it("disabled tier cannot add subscribers", async () => { await global.program.methods @@ -117,7 +117,7 @@ describe("tier functionality", () => { auth: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); try { await global.program.methods @@ -129,11 +129,11 @@ describe("tier functionality", () => { subscriberAta: subscriber2Ata, }) .signers([subscriber2]) - .rpc() + .rpc(); } catch (error) { - expect(error.error.errorCode.number).to.equal(2003) + expect(error.error.errorCode.number).to.equal(2003); } - }) + }); it("disabling a tier stops future payments", async () => { await global.program.methods @@ -145,9 +145,9 @@ describe("tier functionality", () => { subscriberAta: subscriber1Ata, }) .signers([subscriber1]) - .rpc() + .rpc(); - const subscription1 = subscriptionAccountKey(subscriber1.publicKey, app) + const subscription1 = subscriptionAccountKey(subscriber1.publicKey, app); await global.program.methods .disableTier() @@ -157,14 +157,14 @@ describe("tier functionality", () => { auth: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); let destination = await createAssociatedTokenAccount( global.connection, auth, global.mint, - auth.publicKey - ) + auth.publicKey, + ); try { await global.program.methods @@ -176,11 +176,11 @@ describe("tier functionality", () => { subscriberAta: subscriber1Ata, subscription: subscription1, }) - .rpc() + .rpc(); } catch (error) { - expect(error.error.errorCode.number).to.equal(2003) + expect(error.error.errorCode.number).to.equal(2003); } - }) + }); let user, app, @@ -189,34 +189,34 @@ describe("tier functionality", () => { subscriber1, subscriber1Ata, subscriber2, - subscriber2Ata + subscriber2Ata; beforeEach(async () => { - ;({ user, app, tier, auth } = await createUserAppTier()) - let subscriber = await generateFundedKeypair(global.connection) - subscriber1 = await generateFundedKeypair(global.connection) - subscriber2 = await generateFundedKeypair(global.connection) + ({ user, app, tier, auth } = await createUserAppTier()); + let subscriber = await generateFundedKeypair(global.connection); + subscriber1 = await generateFundedKeypair(global.connection); + subscriber2 = await generateFundedKeypair(global.connection); let subscriberAta = await createAssociatedTokenAccount( global.connection, subscriber, global.mint, - subscriber.publicKey - ) + subscriber.publicKey, + ); subscriber1Ata = await createAssociatedTokenAccount( global.connection, subscriber1, global.mint, - subscriber1.publicKey - ) + subscriber1.publicKey, + ); subscriber2Ata = await createAssociatedTokenAccount( global.connection, subscriber2, global.mint, - subscriber2.publicKey - ) + subscriber2.publicKey, + ); await mintToChecked( global.connection, @@ -225,8 +225,8 @@ describe("tier functionality", () => { subscriberAta, global.testKeypairs.colossal.publicKey, 1000 * 10 ** 5, - 5 - ) + 5, + ); await mintToChecked( global.connection, @@ -235,8 +235,8 @@ describe("tier functionality", () => { subscriber1Ata, global.testKeypairs.colossal.publicKey, 1000 * 10 ** 5, - 5 - ) + 5, + ); await mintToChecked( global.connection, @@ -245,8 +245,8 @@ describe("tier functionality", () => { subscriber2Ata, global.testKeypairs.colossal.publicKey, 1000 * 10 ** 5, - 5 - ) + 5, + ); await global.program.methods .createSubscription() @@ -257,6 +257,6 @@ describe("tier functionality", () => { subscriberAta: subscriberAta, }) .signers([subscriber]) - .rpc() - }) -}) + .rpc(); + }); +}); diff --git a/tests/utils/basic-functions.ts b/tests/utils/basic-functions.ts index 4c68407..1f478e3 100644 --- a/tests/utils/basic-functions.ts +++ b/tests/utils/basic-functions.ts @@ -1,18 +1,18 @@ -import { BN, web3 } from "@project-serum/anchor" -import generateFundedKeypair from "./keypair" +import { BN, web3 } from "@project-serum/anchor"; +import generateFundedKeypair from "./keypair"; export function userAccountKeyFromPubkey( - pubkey: web3.PublicKey + pubkey: web3.PublicKey, ): web3.PublicKey { return web3.PublicKey.findProgramAddressSync( [Buffer.from("USER_META"), pubkey.toBuffer()], - global.program.programId - )[0] + global.program.programId, + )[0]; } export function appAccountKey( auth: web3.PublicKey, - appId: number + appId: number, ): web3.PublicKey { return web3.PublicKey.findProgramAddressSync( [ @@ -20,13 +20,32 @@ export function appAccountKey( auth.toBuffer(), new BN(appId).toArrayLike(Buffer, "be", 1), ], - global.program.programId - )[0] + global.program.programId, + )[0]; +} + +export function findAppAddress( + auth: web3.PublicKey, + appId: number, + programId: web3.PublicKey, +) { + return web3.PublicKey.findProgramAddressSync( + [ + Buffer.from("APP"), + auth.toBuffer(), + new BN(appId).toArrayLike(Buffer, "be", 1), + ], + programId, + ); +} + +export function numberToAppId(appId: number): Buffer { + return new BN(appId).toArrayLike(Buffer, "be", 1); } export function tierAccountKey( app: web3.PublicKey, - tierId: number + tierId: number, ): web3.PublicKey { return web3.PublicKey.findProgramAddressSync( [ @@ -34,25 +53,25 @@ export function tierAccountKey( app.toBuffer(), new BN(tierId).toArrayLike(Buffer, "be", 1), ], - global.program.programId - )[0] + global.program.programId, + )[0]; } export function subscriptionAccountKey( subscriber: web3.PublicKey, - app: web3.PublicKey + app: web3.PublicKey, ): web3.PublicKey { return web3.PublicKey.findProgramAddressSync( [Buffer.from("SUBSCRIPTION"), app.toBuffer(), subscriber.toBuffer()], - global.program.programId - )[0] + global.program.programId, + )[0]; } export async function createUserAppTier(): Promise<{ user; app; tier; auth }> { - const auth = await generateFundedKeypair(global.connection) - const user = userAccountKeyFromPubkey(auth.publicKey) - const app = appAccountKey(auth.publicKey, 1) - const tier = tierAccountKey(app, 1) + const auth = await generateFundedKeypair(global.connection); + const user = userAccountKeyFromPubkey(auth.publicKey); + const app = appAccountKey(auth.publicKey, 1); + const tier = tierAccountKey(app, 1); await global.program.methods .createUser() @@ -60,7 +79,7 @@ export async function createUserAppTier(): Promise<{ user; app; tier; auth }> { auth: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); await global.program.methods .createApp(1, "Test App") @@ -69,7 +88,7 @@ export async function createUserAppTier(): Promise<{ user; app; tier; auth }> { treasury: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); await global.program.methods .createTier(new BN(1), "Test Tier", new BN(10), { month: {} }) @@ -79,12 +98,12 @@ export async function createUserAppTier(): Promise<{ user; app; tier; auth }> { signer: auth.publicKey, }) .signers([auth]) - .rpc() + .rpc(); return { auth, user, app, tier, - } + }; } diff --git a/yarn.lock b/yarn.lock index 4ef0c39..9c3b177 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,7 +9,512 @@ dependencies: regenerator-runtime "^0.13.10" -"@noble/ed25519@^1.7.0": +"@bundlr-network/client@^0.8.8": + version "0.8.9" + resolved "https://registry.yarnpkg.com/@bundlr-network/client/-/client-0.8.9.tgz#58e969a5d80f8d25d212d46bb7a060730a3c1736" + integrity sha512-SJ7BAt/KhONeFQ0+nbqrw2DUWrsev6y6cmlXt+3x7fPCkw7OJwudtxV/h2nBteZd65NXjqw8yzkmLiLfZ7CCRA== + dependencies: + "@solana/wallet-adapter-base" "^0.9.2" + "@solana/web3.js" "^1.36.0" + "@supercharge/promise-pool" "^2.1.0" + algosdk "^1.13.1" + arbundles "^0.6.21" + arweave "^1.11.4" + async-retry "^1.3.3" + axios "^0.25.0" + base64url "^3.0.1" + bignumber.js "^9.0.1" + bs58 "^4.0.1" + commander "^8.2.0" + csv "^6.0.5" + ethers "^5.5.1" + inquirer "^8.2.0" + js-sha256 "^0.9.0" + mime-types "^2.1.34" + near-api-js "^0.44.2" + near-seed-phrase "^0.2.0" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@metaplex-foundation/beet-solana@^0.3.0", "@metaplex-foundation/beet-solana@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz#4b37cda5c7f32ffd2bdd8b3164edc05c6463ab35" + integrity sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g== + dependencies: + "@metaplex-foundation/beet" ">=0.1.0" + "@solana/web3.js" "^1.56.2" + bs58 "^5.0.0" + debug "^4.3.4" + +"@metaplex-foundation/beet-solana@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet-solana/-/beet-solana-0.4.0.tgz#52891e78674aaa54e0031f1bca5bfbc40de12e8d" + integrity sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ== + dependencies: + "@metaplex-foundation/beet" ">=0.1.0" + "@solana/web3.js" "^1.56.2" + bs58 "^5.0.0" + debug "^4.3.4" + +"@metaplex-foundation/beet@0.7.1", "@metaplex-foundation/beet@>=0.1.0", "@metaplex-foundation/beet@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.7.1.tgz#0975314211643f87b5f6f3e584fa31abcf4c612c" + integrity sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/beet@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.4.0.tgz#eb2a0a6eb084bb25d67dd9bed2f7387ee7e63a55" + integrity sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/beet@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.6.1.tgz#6331bdde0648bf2cae6f9e482f8e3552db05d69f" + integrity sha512-OYgnijLFzw0cdUlRKH5POp0unQECPOW9muJ2X3QIVyak5G6I6l/rKo72sICgPLIFKdmsi2jmnkuLY7wp14iXdw== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/cusper@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/cusper/-/cusper-0.0.2.tgz#dc2032a452d6c269e25f016aa4dd63600e2af975" + integrity sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA== + +"@metaplex-foundation/js@^0.17.9": + version "0.17.9" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/js/-/js-0.17.9.tgz#2dfa77bfe23acc118d35ff8678825036391eb7a1" + integrity sha512-msMGWSYetSVWmIXpDKI5Y3WZtTrCjF6QRQ8BpsXKoNs6xAKPvSuT9OGay/mbOs+/pMNHVPt8lFfl281yBN/MxA== + dependencies: + "@bundlr-network/client" "^0.8.8" + "@metaplex-foundation/beet" "0.7.1" + "@metaplex-foundation/mpl-auction-house" "^2.3.0" + "@metaplex-foundation/mpl-candy-guard" "^0.3.0" + "@metaplex-foundation/mpl-candy-machine" "^5.0.0" + "@metaplex-foundation/mpl-candy-machine-core" "^0.1.2" + "@metaplex-foundation/mpl-token-metadata" "^2.3.3" + "@noble/ed25519" "^1.7.1" + "@noble/hashes" "^1.1.3" + "@solana/spl-token" "^0.3.5" + "@solana/web3.js" "^1.63.1" + bignumber.js "^9.0.2" + bn.js "^5.2.1" + bs58 "^5.0.0" + buffer "^6.0.3" + debug "^4.3.4" + eventemitter3 "^4.0.7" + lodash.clonedeep "^4.5.0" + lodash.isequal "^4.5.0" + merkletreejs "^0.2.32" + mime "^3.0.0" + node-fetch "^2.6.7" + +"@metaplex-foundation/mpl-auction-house@^2.3.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-auction-house/-/mpl-auction-house-2.3.1.tgz#9c3713c6f0812418952db1c0ad12b677aacc6f48" + integrity sha512-OqMKwjm0+afXPc4DuONP1YBrmzwjlhhX2qUc09jZm7n/uIb1Eb9XgupCAVK7Kc9WvaneJ3dEZgn9HrcNtUPsMg== + dependencies: + "@metaplex-foundation/beet" "^0.6.1" + "@metaplex-foundation/beet-solana" "^0.3.1" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.5" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-guard@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-guard/-/mpl-candy-guard-0.3.0.tgz#e049abf8031665759ec0f9e965dedf93962b90fe" + integrity sha512-YJOZPtAirPqBMd48GOUQ+lav71C70QrA9OQnXsuAbbdl7jKlvbL72C9CnSNBTfdW2I+zPOmDL5H3CQddvgIWlA== + dependencies: + "@metaplex-foundation/beet" "^0.4.0" + "@metaplex-foundation/beet-solana" "^0.3.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-machine-core@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-machine-core/-/mpl-candy-machine-core-0.1.2.tgz#07e19558d0ef120fac1d8612ae4de90d52cd4d1f" + integrity sha512-jjDkRvMR+iykt7guQ7qVnOHTZedql0lq3xqWDMaenAUCH3Xrf2zKATThhJppIVNX1/YtgBOO3lGqhaFbaI4pCw== + dependencies: + "@metaplex-foundation/beet" "^0.4.0" + "@metaplex-foundation/beet-solana" "^0.3.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-machine@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-machine/-/mpl-candy-machine-5.0.0.tgz#2eae8f02a1479c62ef9b9b521215988d6fc06818" + integrity sha512-df2OmZ4s8PJXQXtGAyfZIIitwJPKebtj4f8tab/o5VNhYsW5M9YKfMyAEBBNHm1n/xz+C8Lxy05e6qo3nU/30g== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.6" + "@solana/web3.js" "^1.66.2" + +"@metaplex-foundation/mpl-token-metadata@^2.3.3": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-2.5.2.tgz#ec84464e2bf65bf491abdc71c3882e5973dd9978" + integrity sha512-lAjQjj2gGtyLq8MOkp4tWZSC5DK9NWgPd3EoH0KQ9gMs3sKIJRik0CBaZg+JA0uLwzkiErY2Izus4vbWtRADJQ== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.6" + "@solana/web3.js" "^1.66.2" + bn.js "^5.2.0" + debug "^4.3.4" + +"@noble/ed25519@^1.6.1", "@noble/ed25519@^1.7.0", "@noble/ed25519@^1.7.1": version "1.7.1" resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.1.tgz" integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== @@ -19,6 +524,11 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.3.tgz" integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== +"@noble/hashes@^1.1.3": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.4.tgz#2611ebf5764c1bf754da7c7794de4fb30512336d" + integrity sha512-+PYsVPrTSqtVjatKt2A/Proukn2Yrz61OBThOCKErc5w2/r1Fh37vbDv0Eah7pyNltrmacjwTvdw3JoR+WE4TA== + "@noble/secp256k1@^1.6.3": version "1.7.0" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.0.tgz" @@ -53,6 +563,18 @@ bn.js "^5.1.2" buffer-layout "^1.2.0" +"@randlabs/communication-bridge@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3" + integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== + +"@randlabs/myalgo-connect@^1.1.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05" + integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA== + dependencies: + "@randlabs/communication-bridge" "1.0.1" + "@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" @@ -70,7 +592,7 @@ dependencies: buffer "~6.0.3" -"@solana/spl-token@^0.3.6": +"@solana/spl-token@^0.3.5", "@solana/spl-token@^0.3.6": version "0.3.6" resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.6.tgz" integrity sha512-P9pTXjDIRvVbjr3J0mCnSamYqLnICeds7IoH1/Ro2R9OBuOHdp5pqKZoscfZ3UYrgnCWUc1bc9M2m/YPHjw+1g== @@ -79,6 +601,13 @@ "@solana/buffer-layout-utils" "^0.2.0" buffer "^6.0.3" +"@solana/wallet-adapter-base@^0.9.2": + version "0.9.19" + resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.19.tgz#8b493705cabdc641824853405f79781f9ddc1bd5" + integrity sha512-c/F3xyuSNDUjbYM6E4be5bMx9YmNqE6XIpLcM9U3ohviwDF8hO+v5N8KSvnMaztL4Lr6+TEtCLi3Q5AT0r06JA== + dependencies: + eventemitter3 "^4.0.0" + "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0": version "1.66.2" resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.66.2.tgz" @@ -100,6 +629,32 @@ rpc-websockets "^7.5.0" superstruct "^0.14.2" +"@solana/web3.js@^1.56.2", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.2": + version "1.70.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.70.0.tgz#14ad207f431861397db85921aad8df4e8374e7c8" + integrity sha512-HwdI9LaHaszfpzgxJI44iP68mJWUeqK1TeSheKQsGkH5zlVyGWGmim50MyDWu2vXiuL8Akf2xEMSrDYyLordgg== + dependencies: + "@babel/runtime" "^7.12.5" + "@noble/ed25519" "^1.7.0" + "@noble/hashes" "^1.1.2" + "@noble/secp256k1" "^1.6.3" + "@solana/buffer-layout" "^4.0.0" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.1" + fast-stable-stringify "^1.0.0" + jayson "^3.4.4" + node-fetch "2" + rpc-websockets "^7.5.0" + superstruct "^0.14.2" + +"@supercharge/promise-pool@^2.1.0": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-2.3.2.tgz#6366894a7e7bc699bb65e58d8c828113729cf481" + integrity sha512-f5+C7zv+QQivcUO1FH5lXi7GcuJ3CFuJF3Eg06iArhUs5ma0szCLEQwIY4+VQyh7m/RLVZdzvr4E4ZDnLe9MNg== + "@types/bn.js@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" @@ -134,11 +689,30 @@ resolved "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/node@^12.12.54": version "12.20.55" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" @@ -159,11 +733,44 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +algo-msgpack-with-bigint@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" + integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== + +algosdk@^1.13.1: + version "1.24.0" + resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.24.0.tgz#9f4e2fdf94d100561b2251c0a6591047fe0e2556" + integrity sha512-Q+rOpHTyn92OaL1ta0jEGz8fUQnfGiH2u5wkHj4phy5YKC9mkUrXc1+3Qk3v5fsttTV6pZlYPpzvBTNAlgIAyQ== + dependencies: + algo-msgpack-with-bigint "^2.1.1" + buffer "^6.0.2" + cross-fetch "^3.1.5" + hi-base32 "^0.5.1" + js-sha256 "^0.9.0" + js-sha3 "^0.8.0" + js-sha512 "^0.8.0" + json-bigint "^1.0.0" + tweetnacl "^1.0.3" + vlq "^2.0.4" + ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -176,6 +783,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansicolors@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" @@ -184,6 +796,35 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arbundles@^0.6.21: + version "0.6.22" + resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.6.22.tgz#0fd58ec76514f1d6c2db7c5870a6232314f52de6" + integrity sha512-QlSavBHk59mNqgQ6ScxlqaBJlDbSmSrK/uTcF3HojLAZ/4aufTkVTBjl1hSfZ/ZN45oIPgJC05R8SmVARF+8VA== + dependencies: + "@noble/ed25519" "^1.6.1" + "@randlabs/myalgo-connect" "^1.1.2" + "@solana/wallet-adapter-base" "^0.9.2" + algosdk "^1.13.1" + arweave "^1.11.4" + arweave-stream-tx "^1.1.0" + avsc "https://github.com/Bundlr-Network/avsc#csp-fixes" + axios "^0.21.3" + base64url "^3.0.1" + bs58 "^4.0.1" + ethers "^5.5.1" + keccak "^3.0.2" + multistream "^4.1.0" + process "^0.11.10" + secp256k1 "^4.0.2" + tmp-promise "^3.0.2" + +arconnect@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.4.2.tgz#83de7638fb46183e82d7ec7efb5594c5f7cdc806" + integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw== + dependencies: + arweave "^1.10.13" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" @@ -194,11 +835,83 @@ arrify@^1.0.0: resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +arweave-stream-tx@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f" + integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== + dependencies: + exponential-backoff "^3.1.0" + +arweave@^1.10.13, arweave@^1.11.4: + version "1.11.8" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.11.8.tgz#09376e0c6cec40a661cbb27a306cb11c0a663cd8" + integrity sha512-58ODeNPIC4OjaOCl2bXjKbOFGsiVZFs+DkQg3BvQGvFWNqw1zTJ4Jp01xGUz+GbdOaDyJcCC0g3l0HwdJfFPyw== + dependencies: + arconnect "^0.4.2" + asn1.js "^5.4.1" + axios "^0.27.2" + base64-js "^1.5.1" + bignumber.js "^9.0.2" + util "^0.12.4" + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +"avsc@https://github.com/Bundlr-Network/avsc#csp-fixes": + version "5.4.7" + resolved "https://github.com/Bundlr-Network/avsc#a730cc8018b79e114b6a3381bbb57760a24c6cef" + +axios@^0.21.3: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -211,11 +924,26 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + 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== +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + bigint-buffer@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" @@ -223,6 +951,11 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" +bignumber.js@^9.0.0, bignumber.js@^9.0.2: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + bignumber.js@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz" @@ -240,11 +973,67 @@ bindings@^1.3.0: dependencies: file-uri-to-path "1.0.0" -bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0: +bip39-light@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/bip39-light/-/bip39-light-1.0.7.tgz#06a72f251b89389a136d3f177f29b03342adc5ba" + integrity sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + +bip39@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.2.tgz#2baf42ff3071fc9ddd5103de92e8f80d9257ee32" + integrity sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +bn.js@^4.0.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.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== +borsh@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.6.0.tgz#a7c9eeca6a31ca9e0607cb49f329cb659eb791e1" + integrity sha512-sl5k89ViqsThXQpYa9XDtz1sBl3l1lI313cFUY1HKr+wvMILnb+58xpkqTNrYbelh99dY7K8usxoCusQmqix9Q== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + borsh@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz" @@ -269,11 +1058,28 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" @@ -281,6 +1087,22 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -291,6 +1113,16 @@ 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-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + buffer@6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz" @@ -299,7 +1131,15 @@ buffer@6.0.1: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@^6.0.3, buffer@~6.0.3: +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.2, 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== @@ -314,6 +1154,14 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -324,6 +1172,11 @@ camelcase@^6.0.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +capability@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/capability/-/capability-0.2.5.tgz#51ad87353f1936ffd77f2f21c74633a4dea88801" + integrity sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg== + chai@^4.3.4: version "4.3.6" resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" @@ -337,7 +1190,7 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^4.1.0: +chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -345,6 +1198,11 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + check-error@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" @@ -365,6 +1223,31 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -374,6 +1257,11 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -386,16 +1274,51 @@ 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.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.20.3: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@1.1.7, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-fetch@^3.1.5: version "3.1.5" resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" @@ -408,6 +1331,36 @@ 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== +crypto-js@^3.1.9-1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +csv-generate@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.2.1.tgz#2a0c5f0d9a5b6f7a0c1fee40f028707af048b31b" + integrity sha512-w6GFHjvApv6bcJ2xdi9JGsH6ZvUBfC+vUdfefnEzurXG6hMRwzkBLnhztU2H7v7+zfCk1I/knnQ+tGbgpxWrBw== + +csv-parse@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.3.3.tgz#3b75d2279e2edb550cbc54c65b25cbbf3d0033ad" + integrity sha512-kEWkAPleNEdhFNkHQpFHu9RYPogsFj3dx6bCxL847fsiLgidzWg0z/O0B1kVWMJUc5ky64zGp18LX2T3DQrOfw== + +csv-stringify@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.2.3.tgz#fefd25e66fd48f8f42f43b85a66a4663a2c3e796" + integrity sha512-4qGjUMwnlaRc00gc2jrIYh2w/h1fo25B0mTuY9K8fBiIgtmCX3LcgUbrEGViL98Ci4Se/F5LFEtu8k+dItJVZQ== + +csv@^6.0.5: + version "6.2.5" + resolved "https://registry.yarnpkg.com/csv/-/csv-6.2.5.tgz#e01fd3db2f0856a120ae9140bd179c1a186ee2b9" + integrity sha512-T+K0H7MIrlrnP6KxYKo3lK+uLl6OC2Gmwdd81TG/VdkhKvpatl35sR7tyRSpDLGl22y2T+q9KvNHnVtn4OAscQ== + dependencies: + csv-generate "^4.2.1" + csv-parse "^5.3.3" + csv-stringify "^6.2.3" + stream-transform "^3.2.1" + debug@4.3.3: version "4.3.3" resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" @@ -415,6 +1368,13 @@ debug@4.3.3: dependencies: ms "2.1.2" +debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" @@ -427,11 +1387,33 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + delay@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + diff@5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" @@ -450,11 +1432,33 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +elliptic@6.5.4, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +error-polyfill@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/error-polyfill/-/error-polyfill-0.1.3.tgz#df848b61ad8834f7a5db69a70b9913df86721d15" + integrity sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg== + dependencies: + capability "^0.2.5" + o3 "^1.0.3" + u3 "^0.1.1" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" @@ -477,11 +1481,121 @@ escape-string-regexp@4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eventemitter3@^4.0.7: +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-util@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +eventemitter3@^4.0.0, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exponential-backoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.0.tgz#9409c7e579131f8bd4b32d7d8094a911040f2e68" + integrity sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + eyes@^0.1.8: version "0.1.8" resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" @@ -492,6 +1606,13 @@ 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== +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + 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" @@ -517,6 +1638,27 @@ flat@^5.0.2: resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +follow-redirects@^1.14.0, follow-redirects@^1.14.7, follow-redirects@^1.14.9: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + 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" @@ -527,6 +1669,11 @@ fsevents@~2.3.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + 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" @@ -537,6 +1684,15 @@ get-func-name@^2.0.0: resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -556,6 +1712,25 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + growl@1.10.5: version "1.10.5" resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" @@ -566,12 +1741,80 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + he@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -ieee754@^1.2.1: +hi-base32@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@^1.7.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -584,11 +1827,40 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inquirer@^8.2.0: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -596,6 +1868,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" @@ -606,6 +1883,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -613,6 +1897,16 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" @@ -623,6 +1917,17 @@ is-plain-obj@^2.1.0: resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" @@ -662,6 +1967,16 @@ js-sha256@^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-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha512@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== + js-yaml@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" @@ -669,6 +1984,13 @@ js-yaml@4.1.0: dependencies: argparse "^2.0.1" +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" @@ -686,6 +2008,15 @@ jsonparse@^1.2.0: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -693,12 +2024,22 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash@^4.17.20: +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash@^4.17.20, 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: +log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -725,6 +2066,58 @@ make-error@^1.1.1: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merkletreejs@^0.2.32: + version "0.2.32" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" + integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^3.1.9-1" + treeify "^1.1.0" + web3-utils "^1.3.4" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@4.2.1: version "4.2.1" resolved "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz" @@ -732,7 +2125,7 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4: +minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -791,11 +2184,65 @@ ms@2.1.3: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + +mustache@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nanoid@3.3.1: version "3.3.1" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +near-api-js@^0.44.2: + version "0.44.2" + resolved "https://registry.yarnpkg.com/near-api-js/-/near-api-js-0.44.2.tgz#e451f68f2c56bd885c7b918db5818a3e6e9423d0" + integrity sha512-eMnc4V+geggapEUa3nU2p8HSHn/njtloI4P2mceHQWO8vDE1NGpnAw8FuTBrLmXSgIv9m6oocgFc9t3VNf5zwg== + dependencies: + bn.js "5.2.0" + borsh "^0.6.0" + bs58 "^4.0.0" + depd "^2.0.0" + error-polyfill "^0.1.3" + http-errors "^1.7.2" + js-sha256 "^0.9.0" + mustache "^4.0.0" + node-fetch "^2.6.1" + text-encoding-utf-8 "^1.0.2" + tweetnacl "^1.0.1" + +near-hd-key@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/near-hd-key/-/near-hd-key-1.2.1.tgz#f508ff15436cf8a439b543220f3cc72188a46756" + integrity sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg== + dependencies: + bip39 "3.0.2" + create-hmac "1.1.7" + tweetnacl "1.0.3" + +near-seed-phrase@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/near-seed-phrase/-/near-seed-phrase-0.2.0.tgz#fb7cf89682112b1160ab68abb50dc821f49be18a" + integrity sha512-NpmrnejpY1AdlRpDZ0schJQJtfBaoUheRfiYtQpcq9TkwPgqKZCRULV5L3hHmLc0ep7KRtikbPQ9R2ztN/3cyQ== + dependencies: + bip39-light "^1.0.7" + bs58 "^4.0.1" + near-hd-key "^1.2.1" + tweetnacl "^1.0.2" + no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -804,14 +2251,19 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@2, node-fetch@2.6.7: +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2, node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.3.0: +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.5.0" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== @@ -821,13 +2273,55 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -once@^1.3.0: +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +o3@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/o3/-/o3-1.0.3.tgz#192ce877a882dfa6751f0412a865fafb2da1dac0" + integrity sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ== + dependencies: + capability "^0.2.5" + +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" @@ -862,6 +2356,17 @@ pathval@^1.1.1: resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +pbkdf2@^3.0.17, pbkdf2@^3.0.9: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" @@ -872,13 +2377,27 @@ prettier@^2.6.2: resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -randombytes@^2.1.0: +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -896,6 +2415,41 @@ 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== +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + rpc-websockets@^7.5.0: version "7.5.0" resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.0.tgz" @@ -909,11 +2463,42 @@ rpc-websockets@^7.5.0: bufferutil "^4.0.1" utf-8-validate "^5.0.2" -safe-buffer@^5.0.1, safe-buffer@^5.1.0: +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^7.5.5: + version "7.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2" + integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1, secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" @@ -921,6 +2506,29 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" @@ -942,6 +2550,16 @@ source-map@^0.6.0: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-transform@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.2.1.tgz#4c8cbdd3e4fa7254c770ef34a962cec68349fcb0" + integrity sha512-ApK+WTJ5bCOf0A2tlec1qhvr8bGEBM/sgXXB7mysdCYgZJO5DZeaV3h3G+g0HnAQ372P5IhiGqnW29zoLOfTzQ== + string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -951,6 +2569,13 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -963,6 +2588,13 @@ strip-bom@^3.0.0: resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" @@ -997,11 +2629,32 @@ text-encoding-utf-8@^1.0.2: resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== -"through@>=2.2.7 <3": +"through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -1009,6 +2662,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + toml@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz" @@ -1019,6 +2677,11 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + ts-mocha@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz" @@ -1052,21 +2715,36 @@ tsconfig-paths@^3.5.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.3: +tslib@^2.0.3, tslib@^2.1.0: version "2.4.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tweetnacl@1.0.3, tweetnacl@^1.0.1, tweetnacl@^1.0.2, tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + typescript@^4.3.5: version "4.8.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +u3@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/u3/-/u3-0.1.1.tgz#5f52044f42ee76cd8de33148829e14528494b73b" + integrity sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w== + 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" @@ -1074,11 +2752,57 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "^4.3.0" +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +vlq@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041" + integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.4: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" + integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -1092,6 +2816,18 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-typed-array@^1.1.2: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -1118,6 +2854,11 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@^7.4.5: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" From 55a687674d9b43d0bbda27c1dd7362a1d7526e43 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Fri, 9 Dec 2022 18:50:51 -0500 Subject: [PATCH 04/11] build subscribe_with_referral --- programs/referrals/src/error.rs | 10 +- .../src/instructions/create_referralship.rs | 11 +- .../instructions/subscribe_with_referral.rs | 139 +++++++++++++++++- programs/referrals/src/state/referralship.rs | 1 + tests/referrals.ts | 10 +- 5 files changed, 162 insertions(+), 9 deletions(-) diff --git a/programs/referrals/src/error.rs b/programs/referrals/src/error.rs index cb2e7ae..64d77e4 100644 --- a/programs/referrals/src/error.rs +++ b/programs/referrals/src/error.rs @@ -2,10 +2,16 @@ use anchor_lang::prelude::*; #[error_code] pub enum ReferralError { - ReferralAgentSplitNotSet, - TotalWeightIsNot100, InvalidAppAuthority, + InvalidTreasuryMint, + ReferralAgentSplitNotSet, TooManySplitsProvided, + TotalWeightIsNot100, + InvalidCollection, InvalidCollectionMetadata, CollectionMetadataMintMismatch, + InvalidReferralAgentMetadata, + ReferralAgentNFTMintMismatch, + InvalidSubscriberTokenAccount, + InvalidTier, } diff --git a/programs/referrals/src/instructions/create_referralship.rs b/programs/referrals/src/instructions/create_referralship.rs index f409f1d..28a4171 100644 --- a/programs/referrals/src/instructions/create_referralship.rs +++ b/programs/referrals/src/instructions/create_referralship.rs @@ -30,6 +30,7 @@ pub struct CreateReferralship<'info> { bump, )] pub app: Account<'info, App>, + pub treasury_mint: Account<'info, Mint>, pub referral_agents_collection_nft_mint: Account<'info, Mint>, /// CHECK: we will manually deserialize and check this account pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, @@ -47,10 +48,16 @@ pub fn create_referralship( splits: Vec, ) -> Result<()> { let app = &ctx.accounts.app; + let app_authority = &ctx.accounts.app_authority; let referralship = &mut ctx.accounts.referralship; let referral_agents_collection_nft_mint = &ctx.accounts.referral_agents_collection_nft_mint; let maybe_referral_agents_collection_nft_metadata = &ctx.accounts.referral_agents_collection_nft_metadata; + let treasury_mint = &ctx.accounts.treasury_mint; + + if treasury_mint.key() == referral_agents_collection_nft_mint.key() { + return Err(ReferralError::InvalidTreasuryMint.into()); + } if splits.len() > 7 { return Err(ReferralError::TooManySplitsProvided.into()); @@ -87,8 +94,7 @@ pub fn create_referralship( maybe_referral_agents_collection_nft_metadata .to_account_info() .borrow(), - ) - .map_err(|_| ReferralError::InvalidCollectionMetadata)?; + )?; // make sure the mint account matches the mint in the metadata if collection_metadata.mint != referral_agents_collection_nft_mint.key() { @@ -105,6 +111,7 @@ pub fn create_referralship( referralship.app_id = app_id; referralship.referral_agents_collection_nft_mint = referral_agents_collection_nft_mint.key(); referralship.splits = splits; + referralship.treasury_mint = treasury_mint.key(); Ok(()) } diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs index a4bffb2..9f096fe 100644 --- a/programs/referrals/src/instructions/subscribe_with_referral.rs +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -1,15 +1,148 @@ +use std::borrow::Borrow; + use anchor_lang::prelude::*; -use plege::state::App; +use anchor_spl::token::{Mint, Token, TokenAccount}; +use mpl_token_metadata::{ + assertions::assert_owned_by, + state::{Metadata, TokenMetadataAccount}, +}; + +use plege::{ + cpi::accounts::CreateSubscription, + program::Plege, + state::{App, Subscription, Tier}, +}; -use crate::state::Referral; +use crate::{ + error::ReferralError, + state::{Referral, Referralship}, +}; #[derive(Accounts)] pub struct SubscribeWithReferral<'info> { - pub app: Account<'info, App>, pub referral: Account<'info, Referral>, + pub referralship: Box>, + pub referral_agent_nft_mint: Account<'info, Mint>, + /// CHECK: we will manually deserialize and check this account + pub referral_agent_nft_metadata: UncheckedAccount<'info>, + pub referralship_collection_nft_mint: Account<'info, Mint>, + /// CHECK: we will manually deserialize and check this account + pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, + pub treasury_mint: Account<'info, Mint>, + pub app: Account<'info, App>, + pub subscription: Account<'info, Subscription>, + // The subscriber needs to sign because they need to delegate tokens to the subscription program. pub subscriber: Signer<'info>, + pub subscriber_token_account: Account<'info, TokenAccount>, + pub tier: Account<'info, Tier>, + pub plege_program: Program<'info, Plege>, + pub token_program: Program<'info, Token>, + pub system_program: Program<'info, System>, } pub fn subscribe_with_referral(ctx: Context) -> Result<()> { + let referral = &mut ctx.accounts.referral; + let referralship = &ctx.accounts.referralship; + let referral_agent_nft_mint = &ctx.accounts.referral_agent_nft_mint; + let maybe_referral_agent_nft_metadata = &ctx.accounts.referral_agent_nft_metadata; + let maybe_referral_agents_collection_nft_metadata = + &ctx.accounts.referral_agents_collection_nft_metadata; + let treasury_mint = &ctx.accounts.treasury_mint; + let subscriber_token_account = &ctx.accounts.subscriber_token_account; + let subscriber = &ctx.accounts.subscriber; + let subscription = &ctx.accounts.subscription; + let app = &ctx.accounts.app; + let tier = &ctx.accounts.tier; + let plege_program = &ctx.accounts.plege_program; + let token_program = &ctx.accounts.token_program; + let system_program = &ctx.accounts.system_program; + + // make sure the treasury mint matches what's stored in the referralship. + if treasury_mint.key() != referralship.treasury_mint.key() { + return Err(ReferralError::InvalidTreasuryMint.into()); + } + + // make sure the collection NFT metadata is owned by the token metadata program. + assert_owned_by( + maybe_referral_agents_collection_nft_metadata, + &mpl_token_metadata::id(), + )?; + + // make sure the referral agent's NFT metadata is owned by the token metadata program. + assert_owned_by(maybe_referral_agent_nft_metadata, &mpl_token_metadata::id())?; + + // make sure the we can deserialize the metadata. + let collection_metadata = Metadata::from_account_info( + maybe_referral_agents_collection_nft_metadata + .to_account_info() + .borrow(), + )?; + + // make sure the referralship_collection_nft_mint matches what's stored in the referral. + if referralship.referral_agents_collection_nft_mint.key() != collection_metadata.mint.key() { + return Err(ReferralError::InvalidCollectionMetadata.into()); + } + + // make sure the referral agent's NFT metadata can be deserialized. + let referral_agent_metadata = + Metadata::from_account_info(maybe_referral_agent_nft_metadata.to_account_info().borrow())?; + + // make sure the referral agent's NFT mint matches the specified mint. + if referral_agent_metadata.mint.key() != referral_agent_nft_mint.key() { + return Err(ReferralError::InvalidReferralAgentMetadata.into()); + } + + // make sure the referrer's nft is a member of the collection. + match referral_agent_metadata.collection { + Some(collection) => { + if collection.key != referralship.referral_agents_collection_nft_mint.key() + || !collection.verified + { + return Err(ReferralError::InvalidCollection.into()); + } + } + None => { + return Err(ReferralError::InvalidCollection.into()); + } + } + + // make sure the subscriber's token account belongs to the treasury mint. + if subscriber_token_account.mint.key() != treasury_mint.key() { + return Err(ReferralError::InvalidSubscriberTokenAccount.into()); + } + + // make sure the subscriber's token account belongs to the subscriber. + if subscriber_token_account.owner.key() != subscriber.key() { + return Err(ReferralError::InvalidSubscriberTokenAccount.into()); + } + + // make sure the tier belongs to the app. + if tier.app.key() != app.key() { + return Err(ReferralError::InvalidTier.into()); + } + + // call the subscription program to create a subscription. + let create_subscription_accounts = CreateSubscription { + app: app.to_account_info(), + tier: tier.to_account_info(), + subscription: subscription.to_account_info(), + subscriber: subscriber.to_account_info(), + subscriber_ata: subscriber_token_account.to_account_info(), + token_program: token_program.to_account_info(), + system_program: system_program.to_account_info(), + }; + + let create_subscription_context = CpiContext::new( + plege_program.to_account_info(), + create_subscription_accounts, + ); + + plege::cpi::create_subscription(create_subscription_context)?; + + // set the referral account state + referral.app = app.key(); + referral.referral_agent_nft_mint = referral_agent_nft_mint.key(); + referral.subscription = subscription.key(); + Ok(()) } diff --git a/programs/referrals/src/state/referralship.rs b/programs/referrals/src/state/referralship.rs index 68ae256..4006695 100644 --- a/programs/referrals/src/state/referralship.rs +++ b/programs/referrals/src/state/referralship.rs @@ -5,6 +5,7 @@ use anchor_lang::prelude::*; pub struct Referralship { pub app: Pubkey, pub app_id: u8, + pub treasury_mint: Pubkey, pub referral_agents_collection_nft_mint: Pubkey, pub splits: Splits8, } diff --git a/tests/referrals.ts b/tests/referrals.ts index b54e92b..3b99466 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -45,7 +45,12 @@ describe("referrals", () => { const appAuthorityKeypair = await generateFundedKeypair( anchor.getProvider().connection, ); - + const referralAgentKeypair = await generateFundedKeypair( + anchor.getProvider().connection, + ); + const subscriber = await generateFundedKeypair( + anchor.getProvider().connection, + ); const treasuryAuthorityKeypair = await generateFundedKeypair( anchor.getProvider().connection, ); @@ -121,7 +126,7 @@ describe("referrals", () => { let referralAgentsCollectionNFT = await metaplex.nfts().create({ name: "Referral Agents", uri: "https://example.com/nil", - symbol: "REFAG", + symbol: "REF_AG", sellerFeeBasisPoints: 0, isCollection: true, collectionAuthority: appAuthorityKeypair, @@ -136,6 +141,7 @@ describe("referrals", () => { referralship: referralshipAddress, app: appAddress, appAuthority: appAuthorityKeypair.publicKey, + treasuryMint: treasuryMint, referralAgentsCollectionNftMint: referralAgentsCollectionNFT.mintAddress, referralAgentsCollectionNftMetadata: From f156cf5604a016ebc8d409fb31827ba26bc2c3c0 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Fri, 9 Dec 2022 20:39:11 -0500 Subject: [PATCH 05/11] working on subscribe_with_referral --- .../src/instructions/create_subscription.rs | 2 +- programs/plege/src/state/subscription.rs | 1 + programs/referrals/Cargo.toml | 2 +- .../instructions/subscribe_with_referral.rs | 42 +++- programs/referrals/src/state/mod.rs | 1 + programs/referrals/src/state/referral.rs | 1 + tests/referrals.ts | 229 +++++++++++++++--- tests/utils/basic-functions.ts | 19 ++ 8 files changed, 254 insertions(+), 43 deletions(-) diff --git a/programs/plege/src/instructions/create_subscription.rs b/programs/plege/src/instructions/create_subscription.rs index 4743ce9..33ec779 100644 --- a/programs/plege/src/instructions/create_subscription.rs +++ b/programs/plege/src/instructions/create_subscription.rs @@ -5,7 +5,7 @@ use anchor_spl::token::{approve, Approve, Token, TokenAccount}; #[derive(Accounts)] pub struct CreateSubscription<'info> { pub app: Account<'info, App>, - #[account(mut, + #[account( has_one = app, constraint = tier.active == true, constraint = tier.accepting_new_subs == true diff --git a/programs/plege/src/state/subscription.rs b/programs/plege/src/state/subscription.rs index 71e7294..18b0cf7 100644 --- a/programs/plege/src/state/subscription.rs +++ b/programs/plege/src/state/subscription.rs @@ -2,6 +2,7 @@ use crate::borsh::{BorshDeserialize, BorshSerialize}; use anchor_lang::prelude::*; #[account] +#[derive(Debug)] pub struct Subscription { pub app: Pubkey, pub tier: Pubkey, diff --git a/programs/referrals/Cargo.toml b/programs/referrals/Cargo.toml index 32e7547..3626ac5 100644 --- a/programs/referrals/Cargo.toml +++ b/programs/referrals/Cargo.toml @@ -22,4 +22,4 @@ overflow-checks = true anchor-lang = "0.25.0" anchor-spl = "0.25.0" mpl-token-metadata = { version = "1.6.2", features = ["no-entrypoint"] } -plege = { path = "../plege", features = ["no-entrypoint"] } +plege = { path = "../plege", features = ["cpi"] } diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs index 9f096fe..37f45d6 100644 --- a/programs/referrals/src/instructions/subscribe_with_referral.rs +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -15,26 +15,47 @@ use plege::{ use crate::{ error::ReferralError, - state::{Referral, Referralship}, + state::{Referral, Referralship, REFERRAL}, }; #[derive(Accounts)] pub struct SubscribeWithReferral<'info> { - pub referral: Account<'info, Referral>, + #[account( + init, + payer = subscriber, + space = 8 + 32 + 32 + 32 + 32, + seeds = [ + REFERRAL.as_bytes(), + app.key().as_ref(), + subscription.key().as_ref(), + referral_agent_nft_mint.key().as_ref() + ], + bump + )] + pub referral: Box>, pub referralship: Box>, - pub referral_agent_nft_mint: Account<'info, Mint>, + pub referral_agent_nft_mint: Box>, /// CHECK: we will manually deserialize and check this account pub referral_agent_nft_metadata: UncheckedAccount<'info>, - pub referralship_collection_nft_mint: Account<'info, Mint>, + pub referralship_collection_nft_mint: Box>, /// CHECK: we will manually deserialize and check this account pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, - pub treasury_mint: Account<'info, Mint>, - pub app: Account<'info, App>, - pub subscription: Account<'info, Subscription>, + pub treasury_mint: Box>, + pub app: Box>, + /// CHECK: this account is uninitialized, and is initialized by the subscription program. + #[account( + mut, + seeds = ["SUBSCRIPTION".as_bytes(), app.key().as_ref(), subscriber.key().as_ref()], + seeds::program = plege_program.key(), + bump + )] + pub subscription: UncheckedAccount<'info>, // The subscriber needs to sign because they need to delegate tokens to the subscription program. + #[account(mut)] pub subscriber: Signer<'info>, - pub subscriber_token_account: Account<'info, TokenAccount>, - pub tier: Account<'info, Tier>, + #[account(mut)] + pub subscriber_token_account: Box>, + pub tier: Box>, pub plege_program: Program<'info, Plege>, pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, @@ -139,10 +160,13 @@ pub fn subscribe_with_referral(ctx: Context) -> Result<() plege::cpi::create_subscription(create_subscription_context)?; + let sub = Subscription::try_from_slice(*subscription.to_account_info().try_borrow_data()?)?; + msg!("sub? {:#?}", sub); // set the referral account state referral.app = app.key(); referral.referral_agent_nft_mint = referral_agent_nft_mint.key(); referral.subscription = subscription.key(); + msg!("referral? {:#?}", referral); Ok(()) } diff --git a/programs/referrals/src/state/mod.rs b/programs/referrals/src/state/mod.rs index c41115e..b06c537 100644 --- a/programs/referrals/src/state/mod.rs +++ b/programs/referrals/src/state/mod.rs @@ -6,6 +6,7 @@ pub use referral::*; pub use referralship::*; pub use splits::*; +pub const REFERRAL: &str = "REFERRAL"; pub const REFERRAL_AGENT: &str = "REFERRAL_AGENT"; pub const REFERRALSHIP: &str = "REFERRALSHIP"; pub const APP: &str = "APP"; diff --git a/programs/referrals/src/state/referral.rs b/programs/referrals/src/state/referral.rs index 776941d..c99b738 100644 --- a/programs/referrals/src/state/referral.rs +++ b/programs/referrals/src/state/referral.rs @@ -1,6 +1,7 @@ use anchor_lang::prelude::*; #[account] +#[derive(Debug)] pub struct Referral { pub app: Pubkey, pub referral_agent_nft_mint: Pubkey, diff --git a/tests/referrals.ts b/tests/referrals.ts index 3b99466..587d7fc 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -11,10 +11,17 @@ import { Plege } from "../target/types/plege"; import generateFundedKeypair from "./utils/keypair"; import { findAppAddress, + findSubscriptionAddress, numberToAppId, + tierAccountKey, userAccountKeyFromPubkey, } from "./utils/basic-functions"; -import { createAssociatedTokenAccount, createMint } from "@solana/spl-token"; +import { + createAssociatedTokenAccount, + createMint, + mintTo, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; import { keypairIdentity, Metaplex, @@ -31,6 +38,20 @@ function findReferralshipAddress( ], programId); } +function findReferralAddress( + app: PublicKey, + subscription: PublicKey, + referralAgentNFTMint: PublicKey, + programId: PublicKey, +) { + return PublicKey.findProgramAddressSync([ + Buffer.from("REFERRAL"), + app.toBuffer(), + subscription.toBuffer(), + referralAgentNFTMint.toBuffer(), + ], programId); +} + describe("referrals", () => { anchor.setProvider(anchor.AnchorProvider.env()); const referralProgram = anchor.workspace.Referrals as anchor.Program< @@ -41,22 +62,16 @@ describe("referrals", () => { >; it("creates a referralship", async () => { - // create app authority - const appAuthorityKeypair = await generateFundedKeypair( - anchor.getProvider().connection, - ); - const referralAgentKeypair = await generateFundedKeypair( - anchor.getProvider().connection, - ); - const subscriber = await generateFundedKeypair( - anchor.getProvider().connection, - ); - const treasuryAuthorityKeypair = await generateFundedKeypair( - anchor.getProvider().connection, - ); + const { connection } = anchor.getProvider(); + const appAuthorityKeypair = await generateFundedKeypair(connection); + const referralAgentKeypair = await generateFundedKeypair(connection); + const subscriberKeypair = await generateFundedKeypair(connection); + const stakeholder1Keypair = await generateFundedKeypair(connection); + const stakeholder2Keypair = await generateFundedKeypair(connection); + const treasuryAuthorityKeypair = await generateFundedKeypair(connection); // create a token mint - let treasuryMint = await createMint( + const treasuryMint = await createMint( anchor.getProvider().connection, treasuryAuthorityKeypair, treasuryAuthorityKeypair.publicKey, @@ -64,18 +79,46 @@ describe("referrals", () => { 0, ); - let treasuryTokenAccount = await createAssociatedTokenAccount( - anchor.getProvider().connection, + const treasuryTokenAccount = await createAssociatedTokenAccount( + connection, treasuryAuthorityKeypair, treasuryMint, treasuryAuthorityKeypair.publicKey, ); + const referralAgentTokenAccount = await createAssociatedTokenAccount( + connection, + referralAgentKeypair, + treasuryMint, + referralAgentKeypair.publicKey, + ); + + const subscriberTokenAccount = await createAssociatedTokenAccount( + connection, + subscriberKeypair, + treasuryMint, + subscriberKeypair.publicKey, + ); + + const stakeholder1TokenAccount = await createAssociatedTokenAccount( + connection, + stakeholder1Keypair, + treasuryMint, + stakeholder1Keypair.publicKey, + ); + + const stakeholder2TokenAccount = await createAssociatedTokenAccount( + connection, + stakeholder1Keypair, + treasuryMint, + stakeholder2Keypair.publicKey, + ); + const metaplex = Metaplex.make(anchor.getProvider().connection).use( - keypairIdentity(treasuryAuthorityKeypair), + keypairIdentity(appAuthorityKeypair), ).use(mockStorage()); - let userMetaAddress = userAccountKeyFromPubkey( + const userMetaAddress = userAccountKeyFromPubkey( appAuthorityKeypair.publicKey, ); @@ -88,9 +131,8 @@ describe("referrals", () => { }).instruction(); // create an app - let appId = 1; - let formattedAppId = numberToAppId(appId); - let [appAddress] = findAppAddress( + const appId = 1; + const [appAddress] = findAppAddress( appAuthorityKeypair.publicKey, appId, subscriptionProgram.programId, @@ -98,7 +140,7 @@ describe("referrals", () => { const createAppIx = await subscriptionProgram.methods.createApp( appId, - "nil studios super app", + "super app", ) .accounts( { @@ -110,30 +152,62 @@ describe("referrals", () => { }, ).instruction(); - let createUserAndAppTx = new Transaction() + const tierArgs = { + name: "basic", + id: 1, + price: 100, + interval: { month: {} }, // monthly + }; + const tierAddress = tierAccountKey(appAddress, 1); + + const createTierIx = await subscriptionProgram.methods.createTier( + tierArgs.id, + tierArgs.name, + new anchor.BN(tierArgs.price), + tierArgs.interval, + ) + .accounts({ + tier: tierAddress, + app: appAddress, + mint: treasuryMint, + signer: appAuthorityKeypair.publicKey, + systemProgram: SystemProgram.programId, + }).instruction(); + + const createUserAndAppTx = new Transaction() .add(createUserMetaIx) - .add(createAppIx); + .add(createAppIx) + .add(createTierIx); await anchor.getProvider().sendAndConfirm(createUserAndAppTx, [ appAuthorityKeypair, ], { skipPreflight: true }); - let [referralshipAddress] = findReferralshipAddress( + const [referralshipAddress] = findReferralshipAddress( appAddress, referralProgram.programId, ); - let referralAgentsCollectionNFT = await metaplex.nfts().create({ + const referralAgentsCollectionNFT = await metaplex.nfts().create({ name: "Referral Agents", uri: "https://example.com/nil", - symbol: "REF_AG", + symbol: "REF_AGENTS", sellerFeeBasisPoints: 0, isCollection: true, collectionAuthority: appAuthorityKeypair, }); + const referralAgentNFT = await metaplex.nfts().create({ + name: "Referral Agent", + uri: "https://example.com/nil/agent", + symbol: "REF_AGENT", + sellerFeeBasisPoints: 0, + collection: referralAgentsCollectionNFT.mintAddress, + collectionAuthority: appAuthorityKeypair, + }); + // create a referralship account - let createReferralshipIx = await referralProgram.methods + const createReferralshipIx = await referralProgram.methods .createReferralship(appId, 90, [{ address: Keypair.generate().publicKey, weight: 10, @@ -150,16 +224,107 @@ describe("referrals", () => { systemProgram: SystemProgram.programId, }).instruction(); - let createReferralshipTx = new Transaction().add(createReferralshipIx); + const createReferralshipTx = new Transaction().add(createReferralshipIx); await anchor.getProvider().sendAndConfirm(createReferralshipTx, [ appAuthorityKeypair, ], { skipPreflight: true }); - let referralship = await referralProgram.account.referralship.fetch( + const referralship = await referralProgram.account.referralship.fetch( referralshipAddress, ); - console.log(referralship); + assert.equal(referralship.appId, appId); + assert.equal(referralship.app.toBase58(), appAddress.toBase58()); + assert.equal(referralship.treasuryMint.toBase58(), treasuryMint.toBase58()); + + const [subscriptionAddress] = findSubscriptionAddress( + subscriberKeypair.publicKey, + appAddress, + ); + + const [referralAddress] = findReferralAddress( + appAddress, + subscriptionAddress, + referralAgentNFT.mintAddress, + referralProgram.programId, + ); + + const ixAccounts = { + referral: referralAddress, + referralship: referralshipAddress, + subscription: subscriptionAddress, + subscriber: subscriberKeypair.publicKey, + app: appAddress, + treasuryMint: treasuryMint, + referralAgentNftMint: referralAgentNFT.mintAddress, + referralAgentNftMetadata: referralAgentNFT.metadataAddress, + referralAgentsCollectionNftMetadata: + referralAgentsCollectionNFT.metadataAddress, + referralshipCollectionNftMint: referralAgentsCollectionNFT.mintAddress, + subscriberTokenAccount, + tier: tierAddress, + plegeProgram: subscriptionProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }; + + for (let key in ixAccounts) { + console.log(key, ixAccounts[key].toBase58()); + } + + await mintTo( + connection, + subscriberKeypair, + treasuryMint, + subscriberTokenAccount, + treasuryAuthorityKeypair, + 100, + ); + + const subscribeWithReferralIx = await referralProgram.methods + .subscribeWithReferral().accounts({ + referral: referralAddress, + referralship: referralshipAddress, + subscription: subscriptionAddress, + subscriber: subscriberKeypair.publicKey, + app: appAddress, + treasuryMint: treasuryMint, + referralAgentNftMint: referralAgentNFT.mintAddress, + referralAgentNftMetadata: referralAgentNFT.metadataAddress, + referralAgentsCollectionNftMetadata: + referralAgentsCollectionNFT.metadataAddress, + referralshipCollectionNftMint: referralAgentsCollectionNFT.mintAddress, + subscriberTokenAccount, + tier: tierAddress, + plegeProgram: subscriptionProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }).instruction(); + + const subscribeWithReferralTx = new Transaction().add( + subscribeWithReferralIx, + ); + + anchor.getProvider().sendAndConfirm(subscribeWithReferralTx, [ + subscriberKeypair, + ], { skipPreflight: true }); + + let referralshipAfter = await referralProgram.account.referralship.fetch( + referralshipAddress, + ); + + let subscription = await subscriptionProgram.account.subscription + .fetchNullable( + subscriptionAddress, + ); + let referral = await referralProgram.account.referral.fetchNullable( + referralAddress, + ); + let app = await subscriptionProgram.account.app.fetchNullable(appAddress); + console.log(referral); + console.log(subscription); + console.log(referralshipAfter); + console.log(app); }); }); diff --git a/tests/utils/basic-functions.ts b/tests/utils/basic-functions.ts index 1f478e3..c0db0b6 100644 --- a/tests/utils/basic-functions.ts +++ b/tests/utils/basic-functions.ts @@ -10,6 +10,15 @@ export function userAccountKeyFromPubkey( )[0]; } +export function findUserMetaAddress( + pubkey: web3.PublicKey, +) { + return web3.PublicKey.findProgramAddressSync( + [Buffer.from("USER_META"), pubkey.toBuffer()], + global.program.programId, + ); +} + export function appAccountKey( auth: web3.PublicKey, appId: number, @@ -67,6 +76,16 @@ export function subscriptionAccountKey( )[0]; } +export function findSubscriptionAddress( + subscriber: web3.PublicKey, + app: web3.PublicKey, +) { + return web3.PublicKey.findProgramAddressSync( + [Buffer.from("SUBSCRIPTION"), app.toBuffer(), subscriber.toBuffer()], + global.program.programId, + ); +} + export async function createUserAppTier(): Promise<{ user; app; tier; auth }> { const auth = await generateFundedKeypair(global.connection); const user = userAccountKeyFromPubkey(auth.publicKey); From 1c9e8c2d6fabd50305f55bb222ab202072f9889b Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Fri, 9 Dec 2022 22:35:59 -0500 Subject: [PATCH 06/11] working on subscribe_with_referral. --- Anchor.toml | 4 ++-- programs/plege/src/lib.rs | 2 +- programs/referrals/Cargo.toml | 2 +- .../referrals/src/instructions/subscribe_with_referral.rs | 5 +---- programs/referrals/src/lib.rs | 2 +- tests/referrals.ts | 3 ++- tests/utils/basic-functions.ts | 3 ++- 7 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Anchor.toml b/Anchor.toml index 2b74766..8b5724f 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -3,8 +3,8 @@ seeds = true skip-lint = false [programs.localnet] -plege = "CdEWFt6UP8LGX878nQA5qH2GUoEaHmae7RSnDWxVMww8" -referrals = 'DWPZARiryrryvhsmvvkV18pzCafD69ZjpGkhnEGwbSgt' +plege = "3xRXzaS1gJ8jvh5jjsXqyhn7tE1qrEet9wNSYqPfgtAH" +referrals = "2kY5DJedxxDkGXohsSQh5kLNz4bpjEZ2YGVSrsgNQdG1" [registry] url = "https://api.apr.dev" diff --git a/programs/plege/src/lib.rs b/programs/plege/src/lib.rs index 09b4881..2a9f2b9 100644 --- a/programs/plege/src/lib.rs +++ b/programs/plege/src/lib.rs @@ -7,7 +7,7 @@ pub mod state; use instructions::*; use state::Interval; -declare_id!("CdEWFt6UP8LGX878nQA5qH2GUoEaHmae7RSnDWxVMww8"); +declare_id!("3xRXzaS1gJ8jvh5jjsXqyhn7tE1qrEet9wNSYqPfgtAH"); #[program] pub mod plege { diff --git a/programs/referrals/Cargo.toml b/programs/referrals/Cargo.toml index 3626ac5..a05993f 100644 --- a/programs/referrals/Cargo.toml +++ b/programs/referrals/Cargo.toml @@ -19,7 +19,7 @@ default = [] overflow-checks = true [dependencies] -anchor-lang = "0.25.0" +anchor-lang = { version = "0.25.0", features = ["init-if-needed"] } anchor-spl = "0.25.0" mpl-token-metadata = { version = "1.6.2", features = ["no-entrypoint"] } plege = { path = "../plege", features = ["cpi"] } diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs index 37f45d6..52b0992 100644 --- a/programs/referrals/src/instructions/subscribe_with_referral.rs +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -23,7 +23,7 @@ pub struct SubscribeWithReferral<'info> { #[account( init, payer = subscriber, - space = 8 + 32 + 32 + 32 + 32, + space = 8 + 32 + 32 + 32, seeds = [ REFERRAL.as_bytes(), app.key().as_ref(), @@ -160,13 +160,10 @@ pub fn subscribe_with_referral(ctx: Context) -> Result<() plege::cpi::create_subscription(create_subscription_context)?; - let sub = Subscription::try_from_slice(*subscription.to_account_info().try_borrow_data()?)?; - msg!("sub? {:#?}", sub); // set the referral account state referral.app = app.key(); referral.referral_agent_nft_mint = referral_agent_nft_mint.key(); referral.subscription = subscription.key(); - msg!("referral? {:#?}", referral); Ok(()) } diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index 2e6ee07..df8f830 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -6,7 +6,7 @@ use anchor_lang::prelude::*; use instructions::*; use state::{AddressWithWeight, Splits8}; -declare_id!("DWPZARiryrryvhsmvvkV18pzCafD69ZjpGkhnEGwbSgt"); +declare_id!("2kY5DJedxxDkGXohsSQh5kLNz4bpjEZ2YGVSrsgNQdG1"); #[program] pub mod referrals { diff --git a/tests/referrals.ts b/tests/referrals.ts index 587d7fc..862e5c2 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -241,6 +241,7 @@ describe("referrals", () => { const [subscriptionAddress] = findSubscriptionAddress( subscriberKeypair.publicKey, appAddress, + subscriptionProgram.programId, ); const [referralAddress] = findReferralAddress( @@ -306,7 +307,7 @@ describe("referrals", () => { subscribeWithReferralIx, ); - anchor.getProvider().sendAndConfirm(subscribeWithReferralTx, [ + await anchor.getProvider().sendAndConfirm(subscribeWithReferralTx, [ subscriberKeypair, ], { skipPreflight: true }); diff --git a/tests/utils/basic-functions.ts b/tests/utils/basic-functions.ts index c0db0b6..c0e0c6f 100644 --- a/tests/utils/basic-functions.ts +++ b/tests/utils/basic-functions.ts @@ -79,10 +79,11 @@ export function subscriptionAccountKey( export function findSubscriptionAddress( subscriber: web3.PublicKey, app: web3.PublicKey, + programId: web3.PublicKey, ) { return web3.PublicKey.findProgramAddressSync( [Buffer.from("SUBSCRIPTION"), app.toBuffer(), subscriber.toBuffer()], - global.program.programId, + programId, ); } From d2c786681554f005830d4546b245e9ad666e3979 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Sat, 10 Dec 2022 15:40:59 -0500 Subject: [PATCH 07/11] working on split_payment instruction. --- programs/plege/src/state/app.rs | 1 + programs/referrals/src/assertions.rs | 20 +++ programs/referrals/src/error.rs | 9 +- .../src/instructions/create_referralship.rs | 39 +++-- .../src/instructions/split_payment.rs | 164 +++++++++++++++++- programs/referrals/src/lib.rs | 5 +- programs/referrals/src/state/referral.rs | 2 + programs/referrals/src/state/splits.rs | 52 ++++-- tests/referrals.ts | 104 ++++++----- 9 files changed, 320 insertions(+), 76 deletions(-) create mode 100644 programs/referrals/src/assertions.rs diff --git a/programs/plege/src/state/app.rs b/programs/plege/src/state/app.rs index b3bc5ee..24b60f0 100644 --- a/programs/plege/src/state/app.rs +++ b/programs/plege/src/state/app.rs @@ -1,6 +1,7 @@ use anchor_lang::prelude::*; #[account] +#[derive(Debug)] pub struct App { pub auth: Pubkey, pub name: String, diff --git a/programs/referrals/src/assertions.rs b/programs/referrals/src/assertions.rs new file mode 100644 index 0000000..2d8ff77 --- /dev/null +++ b/programs/referrals/src/assertions.rs @@ -0,0 +1,20 @@ +use std::collections::HashSet; + +use anchor_lang::prelude::*; + +use crate::{error::ReferralError, state::PubkeyWithWeight}; + +pub fn assert_unique_split( + split: Option, + visited: &mut HashSet, +) -> Result> { + if let Some(PubkeyWithWeight { address, .. }) = split { + if visited.contains(&address) { + return Err(ReferralError::DuplicateSplit.into()); + } + + visited.insert(address); + } + + Ok(split) +} diff --git a/programs/referrals/src/error.rs b/programs/referrals/src/error.rs index 64d77e4..c1e1fe9 100644 --- a/programs/referrals/src/error.rs +++ b/programs/referrals/src/error.rs @@ -4,6 +4,8 @@ use anchor_lang::prelude::*; pub enum ReferralError { InvalidAppAuthority, InvalidTreasuryMint, + InvalidSubscriberTokenAccount, + InvalidTier, ReferralAgentSplitNotSet, TooManySplitsProvided, TotalWeightIsNot100, @@ -11,7 +13,10 @@ pub enum ReferralError { InvalidCollectionMetadata, CollectionMetadataMintMismatch, InvalidReferralAgentMetadata, + InvalidReferralAgentNftTokenAccount, + InvalidReferralAgentTreasuryTokenAccount, ReferralAgentNFTMintMismatch, - InvalidSubscriberTokenAccount, - InvalidTier, + InvalidSplitRecipientTreasuryTokenAccount, + InvalidSplit, + DuplicateSplit, } diff --git a/programs/referrals/src/instructions/create_referralship.rs b/programs/referrals/src/instructions/create_referralship.rs index 28a4171..153265a 100644 --- a/programs/referrals/src/instructions/create_referralship.rs +++ b/programs/referrals/src/instructions/create_referralship.rs @@ -1,4 +1,4 @@ -use std::borrow::Borrow; +use std::{borrow::Borrow, collections::HashSet}; use anchor_lang::prelude::*; use anchor_spl::token::{Mint, Token, TokenAccount}; @@ -9,8 +9,9 @@ use mpl_token_metadata::{ use plege::{program::Plege, state::App}; use crate::{ + assertions::assert_unique_split, error::ReferralError, - state::{AddressWithWeight, Referralship, Splits8, APP, REFERRALSHIP}, + state::{PubkeyWithWeight, Referralship, Splits8, APP, REFERRALSHIP}, }; #[derive(Accounts)] @@ -45,10 +46,9 @@ pub fn create_referralship( ctx: Context, app_id: u8, referral_agent_split: u8, - splits: Vec, + splits: Vec, ) -> Result<()> { let app = &ctx.accounts.app; - let app_authority = &ctx.accounts.app_authority; let referralship = &mut ctx.accounts.referralship; let referral_agents_collection_nft_mint = &ctx.accounts.referral_agents_collection_nft_mint; let maybe_referral_agents_collection_nft_metadata = @@ -67,19 +67,26 @@ pub fn create_referralship( // iterate over the addresses provided as splits, if there are fewer than 7, fill the rest with // None. - let splits = Splits8 { - referral_agent: referral_agent_split, - slot_1: splits_iter.next(), - slot_2: splits_iter.next(), - slot_3: splits_iter.next(), - slot_4: splits_iter.next(), - slot_5: splits_iter.next(), - slot_6: splits_iter.next(), - slot_7: splits_iter.next(), - }; - // make sure the splits add up to 100 - splits.validate_weights()?; + // entering a local scope so we can drop the hashset after we're done with it. + let splits = { + let mut visited = HashSet::new(); + + let tmp = Splits8 { + referral_agent: referral_agent_split, + slot_1: assert_unique_split(splits_iter.next(), &mut visited)?, + slot_2: assert_unique_split(splits_iter.next(), &mut visited)?, + slot_3: assert_unique_split(splits_iter.next(), &mut visited)?, + slot_4: assert_unique_split(splits_iter.next(), &mut visited)?, + slot_5: assert_unique_split(splits_iter.next(), &mut visited)?, + slot_6: assert_unique_split(splits_iter.next(), &mut visited)?, + slot_7: assert_unique_split(splits_iter.next(), &mut visited)?, + }; + + // make sure the splits add up to 100 + tmp.validate_weights()?; + tmp + }; // make sure the metadata belongs to the metaplex token metadata program; assert_owned_by( diff --git a/programs/referrals/src/instructions/split_payment.rs b/programs/referrals/src/instructions/split_payment.rs index 11de1e9..ab614e8 100644 --- a/programs/referrals/src/instructions/split_payment.rs +++ b/programs/referrals/src/instructions/split_payment.rs @@ -1,21 +1,171 @@ +use std::borrow::Borrow; + use anchor_lang::prelude::*; -use anchor_spl::token::{Mint, Token, TokenAccount}; -use mpl_token_metadata::state::{CollectionDetails, Metadata}; +use anchor_spl::token::{self, Mint, Token, TokenAccount, Transfer}; +use mpl_token_metadata::{ + assertions::assert_owned_by, + state::{CollectionDetails, Metadata, TokenMetadataAccount}, +}; +use plege::state::{App, Subscription, Tier}; -use crate::state::Referralship; +use crate::{ + error::ReferralError, + state::{Referral, Referralship, Splits8, REFERRAL}, +}; #[derive(Accounts)] pub struct SplitPayment<'info> { - pub referralship: Account<'info, Referralship>, - pub referral_agent_nft_token_account: Account<'info, TokenAccount>, + // #[account( + // seeds = ["APP".as_bytes(), app.auth.key().as_ref(), referralship.app_id.to_be_bytes().as_ref()], + // seeds::program = plege_program.key(), + // bump + // )] + pub app: Box>, + // #[account( + // seeds = ["SUBSCRIPTION".as_bytes(), app.key().as_ref(), subscriber.key().as_ref()], + // seeds::program = plege_program.key(), + // bump + // )] + pub subscription: Box>, + /// CHECK: Just needs to be a system account. + pub subscriber: UncheckedAccount<'info>, + // #[account( + // seeds = ["SUBSCRIPTION_TIER".as_bytes(), app.key().as_ref(), tier_id.to_be_bytes().as_ref()], + // seeds::program = plege_program.key(), + // bump + // )] + pub tier: Box>, + // #[account( + // seeds = [ + // REFERRAL.as_bytes(), + // app.key().as_ref(), + // subscription.key().as_ref(), + // referral_agent_nft_mint.key().as_ref() + // ], + // bump + // )] + pub referral: Box>, + pub referralship: Box>, + pub referral_agent_nft_mint: Box>, /// CHECK: This account will be manually deserialized and checked. - pub referral_agent_nft_token_metadata: UncheckedAccount<'info>, - pub referral_agents_collection_nft_mint: Account<'info, Mint>, + pub referral_agent_nft_metadata: UncheckedAccount<'info>, + pub referral_agent_nft_token_account: Box>, + #[account(mut)] + pub referral_agent_treasury_token_account: Box>, + pub referral_agents_collection_nft_mint: Box>, /// CHECK: This account will be manually deserialized and checked. pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, + pub treasury_mint: Box>, + #[account(mut)] + pub treasury_token_account: Box>, + pub treasury_authority: Signer<'info>, pub token_program: Program<'info, Token>, } pub fn split_payment(ctx: Context) -> Result<()> { + let app = &ctx.accounts.app; + let subscription = &ctx.accounts.subscription; + let tier = &ctx.accounts.tier; + let referralship = &ctx.accounts.referralship; + let referral_agent_nft_mint = &ctx.accounts.referral_agent_nft_mint; + let referral_agent_nft_token_account = &ctx.accounts.referral_agent_nft_token_account; + let referral_agent_treasury_token_account = &ctx.accounts.referral_agent_treasury_token_account; + let maybe_referral_agent_nft_metadata = &ctx.accounts.referral_agent_nft_metadata; + let referral_agents_collection_nft_mint = &ctx.accounts.referral_agents_collection_nft_mint; + let maybe_referral_agents_collection_nft_metadata = + &ctx.accounts.referral_agents_collection_nft_metadata; + let treasury_mint = &ctx.accounts.treasury_mint; + let treasury_token_account = &ctx.accounts.treasury_token_account; + let treasury_authority = &ctx.accounts.treasury_authority; + let token_program = &ctx.accounts.token_program; + + // make sure the referral agents collection nft metadata belongs to the token metadata program + assert_owned_by( + maybe_referral_agents_collection_nft_metadata, + &mpl_token_metadata::id(), + )?; + + // make sure the referral agents collection nft metadata is valid + let collection_metadata = Metadata::from_account_info( + maybe_referral_agents_collection_nft_metadata + .to_account_info() + .borrow(), + )?; + + // make sure the referral agents collection nft matches what's stored in the referralship + if collection_metadata.mint.key() != referralship.referral_agents_collection_nft_mint.key() { + return Err(ReferralError::InvalidReferralAgentMetadata.into()); + } + + // make sure the referral agent nft metadata is owned by the token metadata program + assert_owned_by(maybe_referral_agent_nft_metadata, &mpl_token_metadata::id())?; + + // make sure the referral agent nft metadata is valid + let referral_agent_metadata = + Metadata::from_account_info(maybe_referral_agent_nft_metadata.to_account_info().borrow())?; + + // make sure the referral agent nft metadata is a member of the referral agents collection nft + match referral_agent_metadata.collection { + Some(collection) => { + if collection.key.key() != referral_agents_collection_nft_mint.key() { + return Err(ReferralError::InvalidReferralAgentMetadata.into()); + } + } + None => return Err(ReferralError::InvalidReferralAgentMetadata.into()), + } + + // make sure the referral agent nft metadata matches the referral agent nft token mint + if referral_agent_metadata.mint.key() != referral_agent_nft_mint.key() { + return Err(ReferralError::InvalidReferralAgentMetadata.into()); + } + + // make sure the referral agent nft token account matches the referral agent nft token mint + if referral_agent_nft_mint.key() != referral_agent_nft_token_account.mint.key() { + return Err(ReferralError::InvalidReferralAgentNftTokenAccount.into()); + } + + // make sure the referral agent treasury token account matches the treasury token mint + if referral_agent_treasury_token_account.mint.key() != treasury_mint.key() { + return Err(ReferralError::InvalidReferralAgentTreasuryTokenAccount.into()); + } + + // make sure the treasury mint matches what's stored in the tier + if treasury_mint.key() != tier.mint.key() { + return Err(ReferralError::InvalidTreasuryMint.into()); + } + + // make sure the referral agent treasury token account belongs to the same account as the referral agent nft token account + if referral_agent_nft_token_account.owner.key() + != referral_agent_treasury_token_account.owner.key() + { + return Err(ReferralError::InvalidReferralAgentTreasuryTokenAccount.into()); + } + + // let hm = referralship.splits.as_hashmap(); + + // msg!("hm: {:?}", hm); + + // calculate the referral agent's split amount + let referral_agent_claim_amount = + Splits8::calculate_amount(referralship.splits.referral_agent, tier.price); + + // transfer the referral agent's split amount to their treasury token account + let transfer_accounts = Transfer { + from: treasury_token_account.to_account_info(), + to: referral_agent_treasury_token_account.to_account_info(), + authority: treasury_authority.to_account_info(), + }; + + let transfer_context = CpiContext::new(token_program.to_account_info(), transfer_accounts); + token::transfer(transfer_context, referral_agent_claim_amount)?; + // for each split in the referralship's splits: + // get the next account from ctx.remaining_accounts + // make sure the next account is a token account + // make sure the next account's mint matches the treasury mint + // calculate their split amount + // transfer the split amount to their token account + // TODO: emit an event for each split + // TODO: create a new SplitReceipt account. + Ok(()) } diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index df8f830..4d8589b 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -1,10 +1,11 @@ +mod assertions; mod error; mod instructions; mod state; use anchor_lang::prelude::*; use instructions::*; -use state::{AddressWithWeight, Splits8}; +use state::{PubkeyWithWeight, Splits8}; declare_id!("2kY5DJedxxDkGXohsSQh5kLNz4bpjEZ2YGVSrsgNQdG1"); @@ -16,7 +17,7 @@ pub mod referrals { ctx: Context, app_id: u8, referral_agent_split: u8, - splits: Vec, + splits: Vec, ) -> Result<()> { instructions::create_referralship(ctx, app_id, referral_agent_split, splits) } diff --git a/programs/referrals/src/state/referral.rs b/programs/referrals/src/state/referral.rs index c99b738..3131354 100644 --- a/programs/referrals/src/state/referral.rs +++ b/programs/referrals/src/state/referral.rs @@ -6,4 +6,6 @@ pub struct Referral { pub app: Pubkey, pub referral_agent_nft_mint: Pubkey, pub subscription: Pubkey, + // pub app_id: u8, + // pub tier_id: u8, } diff --git a/programs/referrals/src/state/splits.rs b/programs/referrals/src/state/splits.rs index f353627..d7ea8f0 100644 --- a/programs/referrals/src/state/splits.rs +++ b/programs/referrals/src/state/splits.rs @@ -1,23 +1,25 @@ +use std::collections::{HashMap, HashSet}; + use anchor_lang::prelude::*; use crate::error::ReferralError; #[derive(AnchorDeserialize, AnchorSerialize, Clone, Default, Debug)] -pub struct AddressWithWeight { - address: Pubkey, - weight: u8, +pub struct PubkeyWithWeight { + pub address: Pubkey, + pub weight: u8, } #[derive(AnchorDeserialize, AnchorSerialize, Clone, Default)] pub struct Splits8 { pub referral_agent: u8, - pub slot_1: Option, - pub slot_2: Option, - pub slot_3: Option, - pub slot_4: Option, - pub slot_5: Option, - pub slot_6: Option, - pub slot_7: Option, + pub slot_1: Option, + pub slot_2: Option, + pub slot_3: Option, + pub slot_4: Option, + pub slot_5: Option, + pub slot_6: Option, + pub slot_7: Option, } impl Splits8 { @@ -37,4 +39,34 @@ impl Splits8 { Ok(()) } + + pub fn as_hashmap(&self) -> HashMap { + self.into() + } + + pub fn calculate_amount(weight: u8, amount: u64) -> u64 { + amount * weight as u64 / 100 + } +} + +impl From<&Splits8> for HashMap { + fn from(splits: &Splits8) -> Self { + let all_splits = vec![ + splits.slot_1.as_ref(), + splits.slot_2.as_ref(), + splits.slot_3.as_ref(), + splits.slot_4.as_ref(), + splits.slot_5.as_ref(), + splits.slot_6.as_ref(), + splits.slot_7.as_ref(), + ]; + + let mut tmp = HashMap::new(); + + for split in all_splits.into_iter().flatten() { + tmp.insert(split.address, split.weight); + } + + tmp + } } diff --git a/tests/referrals.ts b/tests/referrals.ts index 862e5c2..b46fcac 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -155,7 +155,7 @@ describe("referrals", () => { const tierArgs = { name: "basic", id: 1, - price: 100, + price: 102, interval: { month: {} }, // monthly }; const tierAddress = tierAccountKey(appAddress, 1); @@ -204,6 +204,7 @@ describe("referrals", () => { sellerFeeBasisPoints: 0, collection: referralAgentsCollectionNFT.mintAddress, collectionAuthority: appAuthorityKeypair, + tokenOwner: referralAgentKeypair.publicKey, }); // create a referralship account @@ -251,28 +252,8 @@ describe("referrals", () => { referralProgram.programId, ); - const ixAccounts = { - referral: referralAddress, - referralship: referralshipAddress, - subscription: subscriptionAddress, - subscriber: subscriberKeypair.publicKey, - app: appAddress, - treasuryMint: treasuryMint, - referralAgentNftMint: referralAgentNFT.mintAddress, - referralAgentNftMetadata: referralAgentNFT.metadataAddress, - referralAgentsCollectionNftMetadata: - referralAgentsCollectionNFT.metadataAddress, - referralshipCollectionNftMint: referralAgentsCollectionNFT.mintAddress, - subscriberTokenAccount, - tier: tierAddress, - plegeProgram: subscriptionProgram.programId, - tokenProgram: TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - }; - - for (let key in ixAccounts) { - console.log(key, ixAccounts[key].toBase58()); - } + let treasuryInitialBalance = 100_000_000; + let subscriberInitialBalance = 100_000_000; await mintTo( connection, @@ -280,7 +261,16 @@ describe("referrals", () => { treasuryMint, subscriberTokenAccount, treasuryAuthorityKeypair, - 100, + subscriberInitialBalance, + ); + + await mintTo( + connection, + treasuryAuthorityKeypair, + treasuryMint, + treasuryTokenAccount, + treasuryAuthorityKeypair, + treasuryInitialBalance, ); const subscribeWithReferralIx = await referralProgram.methods @@ -311,21 +301,57 @@ describe("referrals", () => { subscriberKeypair, ], { skipPreflight: true }); - let referralshipAfter = await referralProgram.account.referralship.fetch( - referralshipAddress, - ); + let ixAccounts = { + app: appAddress, + subscription: subscriptionAddress, + tier: tierAddress, + subscriber: subscriberKeypair.publicKey, + referral: referralAddress, + referralship: referralshipAddress, + referralAgentNftMint: referralAgentNFT.mintAddress, + referralAgentNftMetadata: referralAgentNFT.metadataAddress, + referralAgentNftTokenAccount: referralAgentNFT.tokenAddress, + referralAgentTreasuryTokenAccount: referralAgentTokenAccount, + referralAgentsCollectionNftMint: referralAgentsCollectionNFT.mintAddress, + referralAgentsCollectionNftMetadata: + referralAgentsCollectionNFT.metadataAddress, + treasuryMint: treasuryMint, + treasuryTokenAccount: treasuryTokenAccount, + treasuryAuthority: treasuryAuthorityKeypair.publicKey, + tokenProgram: TOKEN_PROGRAM_ID, + }; - let subscription = await subscriptionProgram.account.subscription - .fetchNullable( - subscriptionAddress, - ); - let referral = await referralProgram.account.referral.fetchNullable( - referralAddress, - ); - let app = await subscriptionProgram.account.app.fetchNullable(appAddress); - console.log(referral); - console.log(subscription); - console.log(referralshipAfter); - console.log(app); + for (let account in ixAccounts) { + console.log(account, ixAccounts[account].toBase58()); + } + + // simulate a call from the subscription program to split payments + let splitIx = await referralProgram.methods.splitPayment().accounts({ + app: appAddress, + subscription: subscriptionAddress, + tier: tierAddress, + subscriber: subscriberKeypair.publicKey, + referral: referralAddress, + referralship: referralshipAddress, + referralAgentNftMint: referralAgentNFT.mintAddress, + referralAgentNftMetadata: referralAgentNFT.metadataAddress, + referralAgentNftTokenAccount: referralAgentNFT.tokenAddress, + referralAgentTreasuryTokenAccount: referralAgentTokenAccount, + referralAgentsCollectionNftMint: referralAgentsCollectionNFT.mintAddress, + referralAgentsCollectionNftMetadata: + referralAgentsCollectionNFT.metadataAddress, + treasuryMint: treasuryMint, + treasuryTokenAccount: treasuryTokenAccount, + treasuryAuthority: treasuryAuthorityKeypair.publicKey, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .instruction(); + + let splitTx = new Transaction().add(splitIx); + await anchor.getProvider().sendAndConfirm(splitTx, [ + treasuryAuthorityKeypair, + ], { + skipPreflight: true, + }); }); }); From f838beee1fad97f573325979112160c4fad63196 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Sat, 10 Dec 2022 17:46:04 -0500 Subject: [PATCH 08/11] transfer for each split --- .../src/instructions/split_payment.rs | 63 ++++++++++++++----- programs/referrals/src/lib.rs | 4 +- tests/referrals.ts | 21 +++++-- 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/programs/referrals/src/instructions/split_payment.rs b/programs/referrals/src/instructions/split_payment.rs index ab614e8..d4e7961 100644 --- a/programs/referrals/src/instructions/split_payment.rs +++ b/programs/referrals/src/instructions/split_payment.rs @@ -1,6 +1,6 @@ -use std::borrow::Borrow; +use std::{borrow::Borrow, collections::HashSet}; -use anchor_lang::prelude::*; +use anchor_lang::{prelude::*, solana_program::program_pack::Pack}; use anchor_spl::token::{self, Mint, Token, TokenAccount, Transfer}; use mpl_token_metadata::{ assertions::assert_owned_by, @@ -62,7 +62,7 @@ pub struct SplitPayment<'info> { pub token_program: Program<'info, Token>, } -pub fn split_payment(ctx: Context) -> Result<()> { +pub fn split_payment<'info>(ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>) -> Result<()> { let app = &ctx.accounts.app; let subscription = &ctx.accounts.subscription; let tier = &ctx.accounts.tier; @@ -141,10 +141,6 @@ pub fn split_payment(ctx: Context) -> Result<()> { return Err(ReferralError::InvalidReferralAgentTreasuryTokenAccount.into()); } - // let hm = referralship.splits.as_hashmap(); - - // msg!("hm: {:?}", hm); - // calculate the referral agent's split amount let referral_agent_claim_amount = Splits8::calculate_amount(referralship.splits.referral_agent, tier.price); @@ -158,14 +154,53 @@ pub fn split_payment(ctx: Context) -> Result<()> { let transfer_context = CpiContext::new(token_program.to_account_info(), transfer_accounts); token::transfer(transfer_context, referral_agent_claim_amount)?; + + let splits = referralship.splits.as_hashmap(); + + // get the account infos here because we can't get them inside the loop, + // or our references will be invalidated + let token_program_account_info = token_program.to_account_info().clone(); + // for each split in the referralship's splits: - // get the next account from ctx.remaining_accounts - // make sure the next account is a token account - // make sure the next account's mint matches the treasury mint - // calculate their split amount - // transfer the split amount to their token account - // TODO: emit an event for each split - // TODO: create a new SplitReceipt account. + let mut visited = HashSet::new(); + + for token_account_info in ctx.remaining_accounts { + if visited.contains(&token_account_info.key()) { + return Err(ReferralError::DuplicateSplit.into()); + } + + // make sure it's present in the splits hashmap + let weight = splits + .get(&token_account_info.key()) + .ok_or(ReferralError::InvalidSplit)?; + + // make sure it's owned by the token program + assert_owned_by(token_account_info, &token_program.key())?; + + // make sure it can be deserialized into an token Account + let token_account = + token::spl_token::state::Account::unpack(&token_account_info.try_borrow_data()?)?; + + // make sure the next account's mint matches the treasury mint + if token_account.mint.key() != treasury_mint.key() { + return Err(ReferralError::InvalidSplitRecipientTreasuryTokenAccount.into()); + } + + // calculate their split amount + let split_recipient_claim_amount = Splits8::calculate_amount(*weight, tier.price); + + // transfer the split amount to their token account + let transfer_accounts = Transfer { + from: treasury_token_account.to_account_info(), + to: token_account_info.clone(), + authority: treasury_authority.to_account_info(), + }; + let transfer_context = + CpiContext::new(token_program_account_info.clone(), transfer_accounts); + + token::transfer(transfer_context, split_recipient_claim_amount)?; + visited.insert(token_account_info.key()); + } Ok(()) } diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index 4d8589b..9be8f12 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -26,7 +26,9 @@ pub mod referrals { instructions::subscribe_with_referral(ctx) } - pub fn split_payment(ctx: Context) -> Result<()> { + pub fn split_payment<'info>( + ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>, + ) -> Result<()> { instructions::split_payment(ctx) } } diff --git a/tests/referrals.ts b/tests/referrals.ts index b46fcac..0799e32 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; import { + AccountMeta, Keypair, PublicKey, SystemProgram, @@ -209,10 +210,10 @@ describe("referrals", () => { // create a referralship account const createReferralshipIx = await referralProgram.methods - .createReferralship(appId, 90, [{ - address: Keypair.generate().publicKey, - weight: 10, - }]).accounts({ + .createReferralship(appId, 80, [ + { address: stakeholder1TokenAccount, weight: 10 }, + { address: stakeholder2TokenAccount, weight: 10 }, + ]).accounts({ referralship: referralshipAddress, app: appAddress, appAuthority: appAuthorityKeypair.publicKey, @@ -345,6 +346,18 @@ describe("referrals", () => { treasuryAuthority: treasuryAuthorityKeypair.publicKey, tokenProgram: TOKEN_PROGRAM_ID, }) + .remainingAccounts([ + { + pubkey: stakeholder1TokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: stakeholder2TokenAccount, + isWritable: true, + isSigner: false, + }, + ]) .instruction(); let splitTx = new Transaction().add(splitIx); From 58a42c6e35f4f4587f48ced8f20480cdb8578f1d Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Sat, 10 Dec 2022 23:42:37 -0500 Subject: [PATCH 09/11] seed accounts --- .../src/instructions/split_payment.rs | 73 ++++++++++++------- .../instructions/subscribe_with_referral.rs | 23 +++++- programs/referrals/src/lib.rs | 7 +- programs/referrals/src/state/mod.rs | 3 + tests/referrals.ts | 45 +++++++----- 5 files changed, 97 insertions(+), 54 deletions(-) diff --git a/programs/referrals/src/instructions/split_payment.rs b/programs/referrals/src/instructions/split_payment.rs index d4e7961..8206037 100644 --- a/programs/referrals/src/instructions/split_payment.rs +++ b/programs/referrals/src/instructions/split_payment.rs @@ -6,45 +6,58 @@ use mpl_token_metadata::{ assertions::assert_owned_by, state::{CollectionDetails, Metadata, TokenMetadataAccount}, }; -use plege::state::{App, Subscription, Tier}; +use plege::{ + program::Plege, + state::{App, Subscription, Tier}, +}; use crate::{ error::ReferralError, - state::{Referral, Referralship, Splits8, REFERRAL}, + state::{ + Referral, Referralship, Splits8, APP, REFERRAL, REFERRALSHIP, SUBSCRIPTION, + SUBSCRIPTION_TIER, + }, }; #[derive(Accounts)] +#[instruction(tier_id: u8)] pub struct SplitPayment<'info> { - // #[account( - // seeds = ["APP".as_bytes(), app.auth.key().as_ref(), referralship.app_id.to_be_bytes().as_ref()], - // seeds::program = plege_program.key(), - // bump - // )] - pub app: Box>, - // #[account( - // seeds = ["SUBSCRIPTION".as_bytes(), app.key().as_ref(), subscriber.key().as_ref()], - // seeds::program = plege_program.key(), - // bump - // )] + #[account( + seeds = [APP.as_bytes(), app_authority.key().as_ref(), referralship.app_id.to_be_bytes().as_ref()], + seeds::program = plege_program.key(), + bump + )] + pub app: Account<'info, App>, + /// CHECK: only being used for seeds. + pub app_authority: UncheckedAccount<'info>, + #[account( + seeds = [SUBSCRIPTION.as_bytes(), app.key().as_ref(), subscriber.key().as_ref()], + seeds::program = plege_program.key(), + bump + )] pub subscription: Box>, /// CHECK: Just needs to be a system account. pub subscriber: UncheckedAccount<'info>, - // #[account( - // seeds = ["SUBSCRIPTION_TIER".as_bytes(), app.key().as_ref(), tier_id.to_be_bytes().as_ref()], - // seeds::program = plege_program.key(), - // bump - // )] + #[account( + seeds = [SUBSCRIPTION_TIER.as_bytes(), app.key().as_ref(), tier_id.to_be_bytes().as_ref()], + seeds::program = plege_program.key(), + bump + )] pub tier: Box>, - // #[account( - // seeds = [ - // REFERRAL.as_bytes(), - // app.key().as_ref(), - // subscription.key().as_ref(), - // referral_agent_nft_mint.key().as_ref() - // ], - // bump - // )] + #[account( + seeds = [ + REFERRAL.as_bytes(), + app.key().as_ref(), + subscription.key().as_ref(), + referral_agent_nft_mint.key().as_ref() + ], + bump + )] pub referral: Box>, + #[account( + seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref()], + bump + )] pub referralship: Box>, pub referral_agent_nft_mint: Box>, /// CHECK: This account will be manually deserialized and checked. @@ -59,10 +72,14 @@ pub struct SplitPayment<'info> { #[account(mut)] pub treasury_token_account: Box>, pub treasury_authority: Signer<'info>, + pub plege_program: Program<'info, Plege>, pub token_program: Program<'info, Token>, } -pub fn split_payment<'info>(ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>) -> Result<()> { +pub fn split_payment<'info>( + ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>, + _tier_id: u8, +) -> Result<()> { let app = &ctx.accounts.app; let subscription = &ctx.accounts.subscription; let tier = &ctx.accounts.tier; diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs index 52b0992..566092e 100644 --- a/programs/referrals/src/instructions/subscribe_with_referral.rs +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -15,10 +15,11 @@ use plege::{ use crate::{ error::ReferralError, - state::{Referral, Referralship, REFERRAL}, + state::{Referral, Referralship, REFERRAL, APP, REFERRALSHIP, SUBSCRIPTION_TIER}, }; #[derive(Accounts)] +#[instruction(tier_id: u8)] pub struct SubscribeWithReferral<'info> { #[account( init, @@ -33,6 +34,10 @@ pub struct SubscribeWithReferral<'info> { bump )] pub referral: Box>, + #[account( + seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref()], + bump + )] pub referralship: Box>, pub referral_agent_nft_mint: Box>, /// CHECK: we will manually deserialize and check this account @@ -41,7 +46,12 @@ pub struct SubscribeWithReferral<'info> { /// CHECK: we will manually deserialize and check this account pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, pub treasury_mint: Box>, - pub app: Box>, + #[account( + seeds = [APP.as_bytes(), app_authority.key().as_ref(), referralship.app_id.to_be_bytes().as_ref()], + seeds::program = plege_program.key(), + bump, + )] + pub app: Account<'info, App>, /// CHECK: this account is uninitialized, and is initialized by the subscription program. #[account( mut, @@ -55,13 +65,20 @@ pub struct SubscribeWithReferral<'info> { pub subscriber: Signer<'info>, #[account(mut)] pub subscriber_token_account: Box>, + #[account( + seeds = [SUBSCRIPTION_TIER.as_bytes(), app.key().as_ref(), tier_id.to_be_bytes().as_ref()], + seeds::program = plege_program.key(), + bump + )] pub tier: Box>, + /// CHECK: not being used, only for seeds + pub app_authority: UncheckedAccount<'info>, pub plege_program: Program<'info, Plege>, pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, } -pub fn subscribe_with_referral(ctx: Context) -> Result<()> { +pub fn subscribe_with_referral(ctx: Context, _tier_id: u8) -> Result<()> { let referral = &mut ctx.accounts.referral; let referralship = &ctx.accounts.referralship; let referral_agent_nft_mint = &ctx.accounts.referral_agent_nft_mint; diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index 9be8f12..effe77a 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -22,13 +22,14 @@ pub mod referrals { instructions::create_referralship(ctx, app_id, referral_agent_split, splits) } - pub fn subscribe_with_referral(ctx: Context) -> Result<()> { - instructions::subscribe_with_referral(ctx) + pub fn subscribe_with_referral(ctx: Context, tier_id: u8) -> Result<()> { + instructions::subscribe_with_referral(ctx, tier_id) } pub fn split_payment<'info>( ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>, + tier_id: u8, ) -> Result<()> { - instructions::split_payment(ctx) + instructions::split_payment(ctx, tier_id) } } diff --git a/programs/referrals/src/state/mod.rs b/programs/referrals/src/state/mod.rs index b06c537..939c75d 100644 --- a/programs/referrals/src/state/mod.rs +++ b/programs/referrals/src/state/mod.rs @@ -9,4 +9,7 @@ pub use splits::*; pub const REFERRAL: &str = "REFERRAL"; pub const REFERRAL_AGENT: &str = "REFERRAL_AGENT"; pub const REFERRALSHIP: &str = "REFERRALSHIP"; +// TODO: Move these to plege program lib. pub const APP: &str = "APP"; +pub const SUBSCRIPTION: &str = "SUBSCRIPTION"; +pub const SUBSCRIPTION_TIER: &str = "SUBSCRIPTION_TIER"; diff --git a/tests/referrals.ts b/tests/referrals.ts index 0799e32..6613f2d 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -275,7 +275,7 @@ describe("referrals", () => { ); const subscribeWithReferralIx = await referralProgram.methods - .subscribeWithReferral().accounts({ + .subscribeWithReferral(tierArgs.id).accounts({ referral: referralAddress, referralship: referralshipAddress, subscription: subscriptionAddress, @@ -289,6 +289,7 @@ describe("referrals", () => { referralshipCollectionNftMint: referralAgentsCollectionNFT.mintAddress, subscriberTokenAccount, tier: tierAddress, + appAuthority: appAuthorityKeypair.publicKey, plegeProgram: subscriptionProgram.programId, tokenProgram: TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, @@ -327,25 +328,29 @@ describe("referrals", () => { } // simulate a call from the subscription program to split payments - let splitIx = await referralProgram.methods.splitPayment().accounts({ - app: appAddress, - subscription: subscriptionAddress, - tier: tierAddress, - subscriber: subscriberKeypair.publicKey, - referral: referralAddress, - referralship: referralshipAddress, - referralAgentNftMint: referralAgentNFT.mintAddress, - referralAgentNftMetadata: referralAgentNFT.metadataAddress, - referralAgentNftTokenAccount: referralAgentNFT.tokenAddress, - referralAgentTreasuryTokenAccount: referralAgentTokenAccount, - referralAgentsCollectionNftMint: referralAgentsCollectionNFT.mintAddress, - referralAgentsCollectionNftMetadata: - referralAgentsCollectionNFT.metadataAddress, - treasuryMint: treasuryMint, - treasuryTokenAccount: treasuryTokenAccount, - treasuryAuthority: treasuryAuthorityKeypair.publicKey, - tokenProgram: TOKEN_PROGRAM_ID, - }) + let splitIx = await referralProgram.methods.splitPayment(tierArgs.id) + .accounts({ + app: appAddress, + appAuthority: appAuthorityKeypair.publicKey, + subscription: subscriptionAddress, + tier: tierAddress, + subscriber: subscriberKeypair.publicKey, + referral: referralAddress, + referralship: referralshipAddress, + referralAgentNftMint: referralAgentNFT.mintAddress, + referralAgentNftMetadata: referralAgentNFT.metadataAddress, + referralAgentNftTokenAccount: referralAgentNFT.tokenAddress, + referralAgentTreasuryTokenAccount: referralAgentTokenAccount, + referralAgentsCollectionNftMint: + referralAgentsCollectionNFT.mintAddress, + referralAgentsCollectionNftMetadata: + referralAgentsCollectionNFT.metadataAddress, + treasuryMint: treasuryMint, + treasuryTokenAccount: treasuryTokenAccount, + treasuryAuthority: treasuryAuthorityKeypair.publicKey, + plegeProgram: subscriptionProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, + }) .remainingAccounts([ { pubkey: stakeholder1TokenAccount, From 3ced8389c2c292a8aba455ec9fd94c72206e4de5 Mon Sep 17 00:00:00 2001 From: nilz3ro Date: Sun, 11 Dec 2022 00:31:19 -0500 Subject: [PATCH 10/11] seed accounts; create treasury pda --- programs/referrals/src/error.rs | 1 + .../src/instructions/create_referralship.rs | 21 ++++++-- .../src/instructions/split_payment.rs | 52 +++++++++++++++---- .../instructions/subscribe_with_referral.rs | 2 +- programs/referrals/src/state/mod.rs | 1 + tests/referrals.ts | 42 +++++++++------ 6 files changed, 88 insertions(+), 31 deletions(-) diff --git a/programs/referrals/src/error.rs b/programs/referrals/src/error.rs index c1e1fe9..d95f637 100644 --- a/programs/referrals/src/error.rs +++ b/programs/referrals/src/error.rs @@ -19,4 +19,5 @@ pub enum ReferralError { InvalidSplitRecipientTreasuryTokenAccount, InvalidSplit, DuplicateSplit, + InvalidBump, } diff --git a/programs/referrals/src/instructions/create_referralship.rs b/programs/referrals/src/instructions/create_referralship.rs index 153265a..18fe4be 100644 --- a/programs/referrals/src/instructions/create_referralship.rs +++ b/programs/referrals/src/instructions/create_referralship.rs @@ -11,7 +11,7 @@ use plege::{program::Plege, state::App}; use crate::{ assertions::assert_unique_split, error::ReferralError, - state::{PubkeyWithWeight, Referralship, Splits8, APP, REFERRALSHIP}, + state::{PubkeyWithWeight, Referralship, Splits8, APP, REFERRALSHIP, TREASURY}, }; #[derive(Accounts)] @@ -24,22 +24,33 @@ pub struct CreateReferralship<'info> { seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref()], bump )] - pub referralship: Account<'info, Referralship>, + pub referralship: Box>, #[account( seeds = [APP.as_bytes(), app_authority.key().as_ref(), app_id.to_be_bytes().as_ref()], seeds::program = plege_program.key(), bump, )] - pub app: Account<'info, App>, - pub treasury_mint: Account<'info, Mint>, - pub referral_agents_collection_nft_mint: Account<'info, Mint>, + pub app: Box>, + #[account( + init, + payer = app_authority, + token::mint = treasury_mint, + token::authority = referralship, + seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref(), TREASURY.as_bytes(), treasury_mint.key().as_ref()], + bump + )] + pub treasury_token_account: Box>, + pub treasury_mint: Box>, + pub referral_agents_collection_nft_mint: Box>, /// CHECK: we will manually deserialize and check this account pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, #[account(mut)] #[account(constraint = app_authority.key() == app.auth.key() @ ReferralError::InvalidAppAuthority)] pub app_authority: Signer<'info>, pub plege_program: Program<'info, Plege>, + pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, + pub rent: Sysvar<'info, Rent>, } pub fn create_referralship( diff --git a/programs/referrals/src/instructions/split_payment.rs b/programs/referrals/src/instructions/split_payment.rs index 8206037..9cce5c6 100644 --- a/programs/referrals/src/instructions/split_payment.rs +++ b/programs/referrals/src/instructions/split_payment.rs @@ -15,7 +15,7 @@ use crate::{ error::ReferralError, state::{ Referral, Referralship, Splits8, APP, REFERRAL, REFERRALSHIP, SUBSCRIPTION, - SUBSCRIPTION_TIER, + SUBSCRIPTION_TIER, TREASURY, }, }; @@ -69,9 +69,14 @@ pub struct SplitPayment<'info> { /// CHECK: This account will be manually deserialized and checked. pub referral_agents_collection_nft_metadata: UncheckedAccount<'info>, pub treasury_mint: Box>, - #[account(mut)] + #[account( + mut, + token::mint = treasury_mint, + token::authority = referralship, + seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref(), TREASURY.as_bytes(), treasury_mint.key().as_ref()], + bump + )] pub treasury_token_account: Box>, - pub treasury_authority: Signer<'info>, pub plege_program: Program<'info, Plege>, pub token_program: Program<'info, Token>, } @@ -93,7 +98,6 @@ pub fn split_payment<'info>( &ctx.accounts.referral_agents_collection_nft_metadata; let treasury_mint = &ctx.accounts.treasury_mint; let treasury_token_account = &ctx.accounts.treasury_token_account; - let treasury_authority = &ctx.accounts.treasury_authority; let token_program = &ctx.accounts.token_program; // make sure the referral agents collection nft metadata belongs to the token metadata program @@ -162,14 +166,41 @@ pub fn split_payment<'info>( let referral_agent_claim_amount = Splits8::calculate_amount(referralship.splits.referral_agent, tier.price); + // let signer_seeds: &[&[&[u8]]] = &[&[ + // b"canvas".as_ref(), + // canvas.creator.as_ref(), + // canvas.canvas_model.as_ref(), + // canvas.name.as_bytes(), + // bump_vector.as_ref(), + // ]]; + + let wrapped_referralship_bump = ctx + .bumps + .get("referralship") + .ok_or(ReferralError::InvalidBump)? + .to_le_bytes(); + + // seeds = [REFERRALSHIP.as_bytes(), app.key().as_ref()], + let app_key = app.key(); + let referralship_signer_seeds: &[&[&[u8]]] = &[&[ + REFERRALSHIP.as_bytes(), + app_key.as_ref(), + wrapped_referralship_bump.as_ref(), + ]]; + // transfer the referral agent's split amount to their treasury token account + let transfer_accounts = Transfer { from: treasury_token_account.to_account_info(), to: referral_agent_treasury_token_account.to_account_info(), - authority: treasury_authority.to_account_info(), + authority: referralship.to_account_info(), }; - let transfer_context = CpiContext::new(token_program.to_account_info(), transfer_accounts); + let transfer_context = CpiContext::new_with_signer( + token_program.to_account_info(), + transfer_accounts, + referralship_signer_seeds, + ); token::transfer(transfer_context, referral_agent_claim_amount)?; let splits = referralship.splits.as_hashmap(); @@ -210,10 +241,13 @@ pub fn split_payment<'info>( let transfer_accounts = Transfer { from: treasury_token_account.to_account_info(), to: token_account_info.clone(), - authority: treasury_authority.to_account_info(), + authority: referralship.to_account_info(), }; - let transfer_context = - CpiContext::new(token_program_account_info.clone(), transfer_accounts); + let transfer_context = CpiContext::new_with_signer( + token_program_account_info.clone(), + transfer_accounts, + referralship_signer_seeds, + ); token::transfer(transfer_context, split_recipient_claim_amount)?; visited.insert(token_account_info.key()); diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs index 566092e..3107c7b 100644 --- a/programs/referrals/src/instructions/subscribe_with_referral.rs +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -15,7 +15,7 @@ use plege::{ use crate::{ error::ReferralError, - state::{Referral, Referralship, REFERRAL, APP, REFERRALSHIP, SUBSCRIPTION_TIER}, + state::{Referral, Referralship, REFERRAL, APP, REFERRALSHIP, SUBSCRIPTION_TIER, TREASURY}, }; #[derive(Accounts)] diff --git a/programs/referrals/src/state/mod.rs b/programs/referrals/src/state/mod.rs index 939c75d..2df07f4 100644 --- a/programs/referrals/src/state/mod.rs +++ b/programs/referrals/src/state/mod.rs @@ -9,6 +9,7 @@ pub use splits::*; pub const REFERRAL: &str = "REFERRAL"; pub const REFERRAL_AGENT: &str = "REFERRAL_AGENT"; pub const REFERRALSHIP: &str = "REFERRALSHIP"; +pub const TREASURY: &str = "TREASURY"; // TODO: Move these to plege program lib. pub const APP: &str = "APP"; pub const SUBSCRIPTION: &str = "SUBSCRIPTION"; diff --git a/tests/referrals.ts b/tests/referrals.ts index 6613f2d..c94431c 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -53,6 +53,19 @@ function findReferralAddress( ], programId); } +function findReferralshipTreasuryAccountAddress( + app: PublicKey, + treasuryMint: PublicKey, + programId: PublicKey, +) { + return PublicKey.findProgramAddressSync([ + Buffer.from("REFERRALSHIP"), + app.toBuffer(), + Buffer.from("TREASURY"), + treasuryMint.toBuffer(), + ], programId); +} + describe("referrals", () => { anchor.setProvider(anchor.AnchorProvider.env()); const referralProgram = anchor.workspace.Referrals as anchor.Program< @@ -80,13 +93,6 @@ describe("referrals", () => { 0, ); - const treasuryTokenAccount = await createAssociatedTokenAccount( - connection, - treasuryAuthorityKeypair, - treasuryMint, - treasuryAuthorityKeypair.publicKey, - ); - const referralAgentTokenAccount = await createAssociatedTokenAccount( connection, referralAgentKeypair, @@ -139,6 +145,13 @@ describe("referrals", () => { subscriptionProgram.programId, ); + const [referralshipTreasuryAddress] = + findReferralshipTreasuryAccountAddress( + appAddress, + treasuryMint, + referralProgram.programId, + ); + const createAppIx = await subscriptionProgram.methods.createApp( appId, "super app", @@ -148,7 +161,7 @@ describe("referrals", () => { app: appAddress, auth: appAuthorityKeypair.publicKey, userMeta: userMetaAddress, - treasury: treasuryTokenAccount, + treasury: referralshipTreasuryAddress, systemProgram: SystemProgram.programId, }, ).instruction(); @@ -156,7 +169,7 @@ describe("referrals", () => { const tierArgs = { name: "basic", id: 1, - price: 102, + price: 100, interval: { month: {} }, // monthly }; const tierAddress = tierAccountKey(appAddress, 1); @@ -269,7 +282,7 @@ describe("referrals", () => { connection, treasuryAuthorityKeypair, treasuryMint, - treasuryTokenAccount, + referralshipTreasuryAddress, treasuryAuthorityKeypair, treasuryInitialBalance, ); @@ -318,7 +331,7 @@ describe("referrals", () => { referralAgentsCollectionNftMetadata: referralAgentsCollectionNFT.metadataAddress, treasuryMint: treasuryMint, - treasuryTokenAccount: treasuryTokenAccount, + treasuryTokenAccount: referralshipTreasuryAddress, treasuryAuthority: treasuryAuthorityKeypair.publicKey, tokenProgram: TOKEN_PROGRAM_ID, }; @@ -346,8 +359,7 @@ describe("referrals", () => { referralAgentsCollectionNftMetadata: referralAgentsCollectionNFT.metadataAddress, treasuryMint: treasuryMint, - treasuryTokenAccount: treasuryTokenAccount, - treasuryAuthority: treasuryAuthorityKeypair.publicKey, + treasuryTokenAccount: referralshipTreasuryAddress, plegeProgram: subscriptionProgram.programId, tokenProgram: TOKEN_PROGRAM_ID, }) @@ -366,9 +378,7 @@ describe("referrals", () => { .instruction(); let splitTx = new Transaction().add(splitIx); - await anchor.getProvider().sendAndConfirm(splitTx, [ - treasuryAuthorityKeypair, - ], { + await anchor.getProvider().sendAndConfirm(splitTx, [], { skipPreflight: true, }); }); From 8e1ded1a162cd2fcd0f4b2208023841c1f0b260d Mon Sep 17 00:00:00 2001 From: James Pacheco Date: Sun, 11 Dec 2022 17:14:04 -0700 Subject: [PATCH 11/11] WIP --- Anchor.toml | 4 +- Cargo.lock | 213 +- Cargo.toml | 2 - client/types/idl/payment.ts | 139 + client/types/idl/referrals.ts | 1575 +++++++++ programs/payment/Cargo.toml | 23 + programs/payment/Xargo.toml | 2 + programs/payment/src/lib.rs | 167 + programs/plege/Cargo.toml | 2 +- .../src/instructions/complete_payment.rs | 117 - .../src/instructions/create_subscription.rs | 2 +- programs/plege/src/instructions/mod.rs | 2 - programs/plege/src/lib.rs | 8 +- programs/referrals/Cargo.toml | 1 + .../src/instructions/split_payment.rs | 24 +- .../instructions/subscribe_with_referral.rs | 18 + programs/referrals/src/lib.rs | 11 +- tests/referrals.ts | 281 +- yarn.lock | 2901 +++++++++++++++++ 19 files changed, 5156 insertions(+), 336 deletions(-) create mode 100644 client/types/idl/payment.ts create mode 100644 client/types/idl/referrals.ts create mode 100644 programs/payment/Cargo.toml create mode 100644 programs/payment/Xargo.toml create mode 100644 programs/payment/src/lib.rs delete mode 100644 programs/plege/src/instructions/complete_payment.rs create mode 100644 yarn.lock diff --git a/Anchor.toml b/Anchor.toml index e853711..ead3233 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -3,8 +3,8 @@ seeds = true skip-lint = false [programs.localnet] -referrals = "2kY5DJedxxDkGXohsSQh5kLNz4bpjEZ2YGVSrsgNQdG1" -plege = "2KiKoVaRF894axqfgEbuQhgHmNWbMY1fgC1NBEqQNu4c" +referrals = "Dr5siFa8o6Q2rttbvDdKK9zjE7SrVWgK1UhWr5nur3v5" +plege = "CYQMznorG2nDLjPhn8UgR58zEnae8BM7G2xFZaxnoUSS" [registry] url = "https://api.apr.dev" diff --git a/Cargo.lock b/Cargo.lock index 632c4db..9a76e30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,9 +15,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.19" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] @@ -257,16 +257,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" +checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "digest 0.10.5", + "digest 0.10.6", ] [[package]] @@ -362,18 +362,18 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aec14f5d4e6e3f927cd0c81f72e5710d95ee9019fbeb4b3021193867491bfd8" +checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9" +checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4" dependencies = [ "proc-macro2", "quote", @@ -388,9 +388,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.74" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" [[package]] name = "cfg-if" @@ -408,6 +408,61 @@ dependencies = [ "num-traits", ] +[[package]] +name = "clockwork-cron" +version = "1.3.9" +source = "git+https://github.com/clockwork-xyz/clockwork?tag=v1.3.9#092f86072ad0fa087c990ec9f01e26a227913046" +dependencies = [ + "chrono", + "nom", + "once_cell", +] + +[[package]] +name = "clockwork-network-program" +version = "1.3.9" +source = "git+https://github.com/clockwork-xyz/clockwork?tag=v1.3.9#092f86072ad0fa087c990ec9f01e26a227913046" +dependencies = [ + "anchor-lang", + "anchor-spl", + "clockwork-utils", +] + +[[package]] +name = "clockwork-sdk" +version = "1.3.9" +source = "git+https://github.com/clockwork-xyz/clockwork?tag=v1.3.9#092f86072ad0fa087c990ec9f01e26a227913046" +dependencies = [ + "chrono", + "clockwork-thread-program", + "nom", + "once_cell", +] + +[[package]] +name = "clockwork-thread-program" +version = "1.3.9" +source = "git+https://github.com/clockwork-xyz/clockwork?tag=v1.3.9#092f86072ad0fa087c990ec9f01e26a227913046" +dependencies = [ + "anchor-lang", + "chrono", + "clockwork-cron", + "clockwork-network-program", + "clockwork-utils", + "static-pubkey", + "version", +] + +[[package]] +name = "clockwork-utils" +version = "1.3.9" +source = "git+https://github.com/clockwork-xyz/clockwork?tag=v1.3.9#092f86072ad0fa087c990ec9f01e26a227913046" +dependencies = [ + "anchor-lang", + "base64 0.13.1", + "static-pubkey", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -430,9 +485,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.1.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" [[package]] name = "cpufeatures" @@ -466,9 +521,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.11" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg", "cfg-if", @@ -479,9 +534,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", ] @@ -536,9 +591,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer 0.10.3", "crypto-common", @@ -682,9 +737,12 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] [[package]] name = "lazy_static" @@ -694,9 +752,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "libsecp256k1" @@ -773,22 +831,28 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" +checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "mpl-token-metadata" version = "1.6.2" @@ -834,6 +898,16 @@ dependencies = [ "spl-token", ] +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -866,9 +940,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ "hermit-abi", "libc", @@ -919,9 +993,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", @@ -930,6 +1004,17 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "payment" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "clockwork-sdk", + "plege", + "referrals", +] + [[package]] name = "plege" version = "0.1.0" @@ -937,13 +1022,14 @@ dependencies = [ "anchor-lang", "anchor-spl", "chrono", + "clockwork-sdk", ] [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" @@ -1054,21 +1140,19 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.3" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1091,15 +1175,16 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", + "clockwork-sdk", "mpl-token-metadata", "plege", ] [[package]] name = "regex" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -1108,9 +1193,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.27" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "rustc_version" @@ -1147,9 +1232,9 @@ checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055" dependencies = [ "serde_derive", ] @@ -1165,9 +1250,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "b4eae9b04cbffdfd550eb462ed33bc6a1b68c935127d008b27444d08380f94e4" dependencies = [ "proc-macro2", "quote", @@ -1176,9 +1261,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "itoa", "ryu", @@ -1206,7 +1291,7 @@ checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.5", + "digest 0.10.6", ] [[package]] @@ -1215,7 +1300,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" dependencies = [ - "digest 0.10.5", + "digest 0.10.6", "keccak", ] @@ -1384,6 +1469,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "static-pubkey" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0547d5945c93f55e1b18bf2a67d1a3d0548561f2687645b22c1c1d4fbb9a8e90" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "subtle" version = "2.4.1" @@ -1392,9 +1489,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" dependencies = [ "proc-macro2", "quote", @@ -1432,9 +1529,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" @@ -1448,6 +1545,12 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +[[package]] +name = "version" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a449064fee414fcc201356a3e6c1510f6c8829ed28bb06b91c54ebe208ce065" + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 53d1352..13086ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,4 @@ incremental = false codegen-units = 1 [patch.crates-io] -anchor-lang = { git = "https://github.com/clockwork-xyz/anchor", branch = "0.25.0-solana.1.13.4" } -anchor-spl = { git = "https://github.com/clockwork-xyz/anchor", branch = "0.25.0-solana.1.13.4" } clockwork-sdk = { git = "https://github.com/clockwork-xyz/clockwork", tag = "v1.3.9" } \ No newline at end of file diff --git a/client/types/idl/payment.ts b/client/types/idl/payment.ts new file mode 100644 index 0000000..591059e --- /dev/null +++ b/client/types/idl/payment.ts @@ -0,0 +1,139 @@ +export type Payment = { + "version": "0.1.0", + "name": "payment", + "instructions": [ + { + "name": "completePayment", + "accounts": [ + { + "name": "subscription", + "isMut": true, + "isSigner": false + }, + { + "name": "app", + "isMut": true, + "isSigner": false + }, + { + "name": "tier", + "isMut": true, + "isSigner": false + }, + { + "name": "destination", + "isMut": true, + "isSigner": false + }, + { + "name": "subscriberAta", + "isMut": true, + "isSigner": false + }, + { + "name": "subscriptionThread", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [], + "returns": { + "defined": "ThreadResponse" + } + } + ], + "errors": [ + { + "code": 6000, + "name": "MissingAccount" + }, + { + "code": 6001, + "name": "TooManyAccounts" + }, + { + "code": 6002, + "name": "WrongReferralsProgram" + } + ] +}; + +export const IDL: Payment = { + "version": "0.1.0", + "name": "payment", + "instructions": [ + { + "name": "completePayment", + "accounts": [ + { + "name": "subscription", + "isMut": true, + "isSigner": false + }, + { + "name": "app", + "isMut": true, + "isSigner": false + }, + { + "name": "tier", + "isMut": true, + "isSigner": false + }, + { + "name": "destination", + "isMut": true, + "isSigner": false + }, + { + "name": "subscriberAta", + "isMut": true, + "isSigner": false + }, + { + "name": "subscriptionThread", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [], + "returns": { + "defined": "ThreadResponse" + } + } + ], + "errors": [ + { + "code": 6000, + "name": "MissingAccount" + }, + { + "code": 6001, + "name": "TooManyAccounts" + }, + { + "code": 6002, + "name": "WrongReferralsProgram" + } + ] +}; diff --git a/client/types/idl/referrals.ts b/client/types/idl/referrals.ts new file mode 100644 index 0000000..150b8f0 --- /dev/null +++ b/client/types/idl/referrals.ts @@ -0,0 +1,1575 @@ +export type Referrals = { + "version": "0.1.0", + "name": "referrals", + "instructions": [ + { + "name": "createReferralship", + "accounts": [ + { + "name": "referralship", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + } + ] + } + }, + { + "name": "app", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "APP" + }, + { + "kind": "account", + "type": "publicKey", + "path": "app_authority" + }, + { + "kind": "arg", + "type": "u8", + "path": "app_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "treasuryTokenAccount", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "const", + "type": "string", + "value": "TREASURY" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "treasury_mint" + } + ] + } + }, + { + "name": "treasuryMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "appAuthority", + "isMut": true, + "isSigner": true + }, + { + "name": "plegeProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "appId", + "type": "u8" + }, + { + "name": "referralAgentSplit", + "type": "u8" + }, + { + "name": "splits", + "type": { + "vec": { + "defined": "PubkeyWithWeight" + } + } + } + ] + }, + { + "name": "subscribeWithReferral", + "accounts": [ + { + "name": "referral", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRAL" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "path": "subscription" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "referral_agent_nft_mint" + } + ] + } + }, + { + "name": "referralship", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + } + ] + } + }, + { + "name": "referralAgentNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "referralshipCollectionNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "treasuryMint", + "isMut": false, + "isSigner": false + }, + { + "name": "app", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "APP" + }, + { + "kind": "account", + "type": "publicKey", + "path": "app_authority" + }, + { + "kind": "account", + "type": "u8", + "account": "Referralship", + "path": "referralship.app_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "subscription", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "SUBSCRIPTION" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "path": "subscriber" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "subscriber", + "isMut": true, + "isSigner": true + }, + { + "name": "subscriberTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tier", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "SUBSCRIPTION_TIER" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "arg", + "type": "u8", + "path": "tier_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "appAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "plegeProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "subscriptionThread", + "isMut": true, + "isSigner": false + }, + { + "name": "threadProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "tierId", + "type": "u8" + } + ] + }, + { + "name": "splitPayment", + "accounts": [ + { + "name": "app", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "APP" + }, + { + "kind": "account", + "type": "publicKey", + "path": "app_authority" + }, + { + "kind": "account", + "type": "u8", + "account": "Referralship", + "path": "referralship.app_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "appAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "subscription", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "SUBSCRIPTION" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "path": "subscriber" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "subscriber", + "isMut": false, + "isSigner": false + }, + { + "name": "tier", + "isMut": false, + "isSigner": false + }, + { + "name": "referral", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRAL" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Subscription", + "path": "subscription" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "referral_agent_nft_mint" + } + ] + } + }, + { + "name": "referralship", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + } + ] + } + }, + { + "name": "referralAgentNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentNftTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentTreasuryTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "treasuryMint", + "isMut": false, + "isSigner": false + }, + { + "name": "treasuryTokenAccount", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "const", + "type": "string", + "value": "TREASURY" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "treasury_mint" + } + ] + } + }, + { + "name": "plegeProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + } + ], + "accounts": [ + { + "name": "referral", + "type": { + "kind": "struct", + "fields": [ + { + "name": "app", + "type": "publicKey" + }, + { + "name": "referralAgentNftMint", + "type": "publicKey" + }, + { + "name": "subscription", + "type": "publicKey" + } + ] + } + }, + { + "name": "referralship", + "type": { + "kind": "struct", + "fields": [ + { + "name": "app", + "type": "publicKey" + }, + { + "name": "appId", + "type": "u8" + }, + { + "name": "treasuryMint", + "type": "publicKey" + }, + { + "name": "referralAgentsCollectionNftMint", + "type": "publicKey" + }, + { + "name": "splits", + "type": { + "defined": "Splits8" + } + } + ] + } + } + ], + "types": [ + { + "name": "PubkeyWithWeight", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "weight", + "type": "u8" + } + ] + } + }, + { + "name": "Splits8", + "type": { + "kind": "struct", + "fields": [ + { + "name": "referralAgent", + "type": "u8" + }, + { + "name": "slot1", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot2", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot3", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot4", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot5", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot6", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot7", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + } + ] + } + } + ], + "errors": [ + { + "code": 6000, + "name": "InvalidAppAuthority" + }, + { + "code": 6001, + "name": "InvalidTreasuryMint" + }, + { + "code": 6002, + "name": "InvalidSubscriberTokenAccount" + }, + { + "code": 6003, + "name": "InvalidTier" + }, + { + "code": 6004, + "name": "ReferralAgentSplitNotSet" + }, + { + "code": 6005, + "name": "TooManySplitsProvided" + }, + { + "code": 6006, + "name": "TotalWeightIsNot100" + }, + { + "code": 6007, + "name": "InvalidCollection" + }, + { + "code": 6008, + "name": "InvalidCollectionMetadata" + }, + { + "code": 6009, + "name": "CollectionMetadataMintMismatch" + }, + { + "code": 6010, + "name": "InvalidReferralAgentMetadata" + }, + { + "code": 6011, + "name": "InvalidReferralAgentNftTokenAccount" + }, + { + "code": 6012, + "name": "InvalidReferralAgentTreasuryTokenAccount" + }, + { + "code": 6013, + "name": "ReferralAgentNFTMintMismatch" + }, + { + "code": 6014, + "name": "InvalidSplitRecipientTreasuryTokenAccount" + }, + { + "code": 6015, + "name": "InvalidSplit" + }, + { + "code": 6016, + "name": "DuplicateSplit" + }, + { + "code": 6017, + "name": "InvalidBump" + } + ] +}; + +export const IDL: Referrals = { + "version": "0.1.0", + "name": "referrals", + "instructions": [ + { + "name": "createReferralship", + "accounts": [ + { + "name": "referralship", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + } + ] + } + }, + { + "name": "app", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "APP" + }, + { + "kind": "account", + "type": "publicKey", + "path": "app_authority" + }, + { + "kind": "arg", + "type": "u8", + "path": "app_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "treasuryTokenAccount", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "const", + "type": "string", + "value": "TREASURY" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "treasury_mint" + } + ] + } + }, + { + "name": "treasuryMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "appAuthority", + "isMut": true, + "isSigner": true + }, + { + "name": "plegeProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "appId", + "type": "u8" + }, + { + "name": "referralAgentSplit", + "type": "u8" + }, + { + "name": "splits", + "type": { + "vec": { + "defined": "PubkeyWithWeight" + } + } + } + ] + }, + { + "name": "subscribeWithReferral", + "accounts": [ + { + "name": "referral", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRAL" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "path": "subscription" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "referral_agent_nft_mint" + } + ] + } + }, + { + "name": "referralship", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + } + ] + } + }, + { + "name": "referralAgentNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "referralshipCollectionNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "treasuryMint", + "isMut": false, + "isSigner": false + }, + { + "name": "app", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "APP" + }, + { + "kind": "account", + "type": "publicKey", + "path": "app_authority" + }, + { + "kind": "account", + "type": "u8", + "account": "Referralship", + "path": "referralship.app_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "subscription", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "SUBSCRIPTION" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "path": "subscriber" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "subscriber", + "isMut": true, + "isSigner": true + }, + { + "name": "subscriberTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tier", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "SUBSCRIPTION_TIER" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "arg", + "type": "u8", + "path": "tier_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "appAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "plegeProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "subscriptionThread", + "isMut": true, + "isSigner": false + }, + { + "name": "threadProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "tierId", + "type": "u8" + } + ] + }, + { + "name": "splitPayment", + "accounts": [ + { + "name": "app", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "APP" + }, + { + "kind": "account", + "type": "publicKey", + "path": "app_authority" + }, + { + "kind": "account", + "type": "u8", + "account": "Referralship", + "path": "referralship.app_id" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "appAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "subscription", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "SUBSCRIPTION" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "path": "subscriber" + } + ], + "programId": { + "kind": "account", + "type": "publicKey", + "path": "plege_program" + } + } + }, + { + "name": "subscriber", + "isMut": false, + "isSigner": false + }, + { + "name": "tier", + "isMut": false, + "isSigner": false + }, + { + "name": "referral", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRAL" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Subscription", + "path": "subscription" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "referral_agent_nft_mint" + } + ] + } + }, + { + "name": "referralship", + "isMut": false, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + } + ] + } + }, + { + "name": "referralAgentNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentNftTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentTreasuryTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMint", + "isMut": false, + "isSigner": false + }, + { + "name": "referralAgentsCollectionNftMetadata", + "isMut": false, + "isSigner": false + }, + { + "name": "treasuryMint", + "isMut": false, + "isSigner": false + }, + { + "name": "treasuryTokenAccount", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ + { + "kind": "const", + "type": "string", + "value": "REFERRALSHIP" + }, + { + "kind": "account", + "type": "publicKey", + "account": "App", + "path": "app" + }, + { + "kind": "const", + "type": "string", + "value": "TREASURY" + }, + { + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "treasury_mint" + } + ] + } + }, + { + "name": "plegeProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + } + ], + "accounts": [ + { + "name": "referral", + "type": { + "kind": "struct", + "fields": [ + { + "name": "app", + "type": "publicKey" + }, + { + "name": "referralAgentNftMint", + "type": "publicKey" + }, + { + "name": "subscription", + "type": "publicKey" + } + ] + } + }, + { + "name": "referralship", + "type": { + "kind": "struct", + "fields": [ + { + "name": "app", + "type": "publicKey" + }, + { + "name": "appId", + "type": "u8" + }, + { + "name": "treasuryMint", + "type": "publicKey" + }, + { + "name": "referralAgentsCollectionNftMint", + "type": "publicKey" + }, + { + "name": "splits", + "type": { + "defined": "Splits8" + } + } + ] + } + } + ], + "types": [ + { + "name": "PubkeyWithWeight", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "weight", + "type": "u8" + } + ] + } + }, + { + "name": "Splits8", + "type": { + "kind": "struct", + "fields": [ + { + "name": "referralAgent", + "type": "u8" + }, + { + "name": "slot1", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot2", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot3", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot4", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot5", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot6", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + }, + { + "name": "slot7", + "type": { + "option": { + "defined": "PubkeyWithWeight" + } + } + } + ] + } + } + ], + "errors": [ + { + "code": 6000, + "name": "InvalidAppAuthority" + }, + { + "code": 6001, + "name": "InvalidTreasuryMint" + }, + { + "code": 6002, + "name": "InvalidSubscriberTokenAccount" + }, + { + "code": 6003, + "name": "InvalidTier" + }, + { + "code": 6004, + "name": "ReferralAgentSplitNotSet" + }, + { + "code": 6005, + "name": "TooManySplitsProvided" + }, + { + "code": 6006, + "name": "TotalWeightIsNot100" + }, + { + "code": 6007, + "name": "InvalidCollection" + }, + { + "code": 6008, + "name": "InvalidCollectionMetadata" + }, + { + "code": 6009, + "name": "CollectionMetadataMintMismatch" + }, + { + "code": 6010, + "name": "InvalidReferralAgentMetadata" + }, + { + "code": 6011, + "name": "InvalidReferralAgentNftTokenAccount" + }, + { + "code": 6012, + "name": "InvalidReferralAgentTreasuryTokenAccount" + }, + { + "code": 6013, + "name": "ReferralAgentNFTMintMismatch" + }, + { + "code": 6014, + "name": "InvalidSplitRecipientTreasuryTokenAccount" + }, + { + "code": 6015, + "name": "InvalidSplit" + }, + { + "code": 6016, + "name": "DuplicateSplit" + }, + { + "code": 6017, + "name": "InvalidBump" + } + ] +}; diff --git a/programs/payment/Cargo.toml b/programs/payment/Cargo.toml new file mode 100644 index 0000000..9e4107d --- /dev/null +++ b/programs/payment/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "payment" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "payment" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = "0.25.0" +plege = { path = "../plege", features = ["cpi"] } +referrals = { path = "../referrals", features = ["cpi"] } +anchor-spl = "0.25.0" +clockwork-sdk = { version = "=1.3.9", features = ["thread"] } \ No newline at end of file diff --git a/programs/payment/Xargo.toml b/programs/payment/Xargo.toml new file mode 100644 index 0000000..475fb71 --- /dev/null +++ b/programs/payment/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/programs/payment/src/lib.rs b/programs/payment/src/lib.rs new file mode 100644 index 0000000..b67fc9d --- /dev/null +++ b/programs/payment/src/lib.rs @@ -0,0 +1,167 @@ +use anchor_lang::{prelude::*}; +use anchor_spl::token::{transfer, Token, TokenAccount, Transfer}; +use clockwork_sdk::ThreadResponse; +use clockwork_sdk::thread_program::accounts::Thread; +use plege::state::*; +use plege::error::PlegeError; +use referrals::cpi::{ accounts::SplitPayment }; + + +declare_id!("ov9EhgYsv4QZozmTrXx8jnkC7LESA5kaCsXqRg2d6NM"); + +#[program] +pub mod payment { + use super::*; + + pub fn complete_payment<'info>(ctx: Context<'_, '_, '_, 'info, CompletePayment<'info>>) -> Result { + let subscription = &mut ctx.accounts.subscription; + let app = &mut ctx.accounts.app; + let tier = &mut ctx.accounts.tier; + let destination = ctx.accounts.destination.to_account_info(); + let subscriber_ata = &mut ctx.accounts.subscriber_ata.to_account_info(); + let token_program = ctx.accounts.token_program.to_account_info(); + + let now_timestamp = Clock::get().unwrap().unix_timestamp; + + let last_pay_period: i64 = subscription.pay_period_expiration; + + require!(tier.interval.grace_period() > now_timestamp - last_pay_period, PlegeError::MissedPayment); + require!(subscription.accept_new_payments, PlegeError::InactiveSubscription); + + let balance = tier.price - subscription.credits; + + msg!("balance is {:?}", balance); + + if balance > 0 { + let transfer_accounts = Transfer { + from: subscriber_ata.clone(), + to: destination.clone(), + authority: subscription.to_account_info().clone(), + }; + + let app_key = app.key(); + let subscriber_key = subscription.subscriber; + let subscription_bump = subscription.bump; + let seeds = &["SUBSCRIPTION".as_bytes(), app_key.as_ref(), subscriber_key.as_ref(), &[subscription_bump]]; + let signers = [&seeds[..]]; + let transfer_amount = balance; + + let transfer_ctx = + CpiContext::new_with_signer(token_program.clone(), transfer_accounts, &signers); + + transfer(transfer_ctx, transfer_amount)?; + } else { + subscription.credits -= tier.price; + } + + subscription.last_payment_time = Some(now_timestamp); + subscription.pay_period_start = subscription.pay_period_expiration; + subscription.pay_period_expiration = tier.interval.increment(last_pay_period); + + if ctx.remaining_accounts.len() > 0 { + let mut iter = ctx.remaining_accounts.into_iter(); + + let maybe_app_authority = iter.next().ok_or(PaymentError::MissingAccount)?; + let maybe_subscriber = iter.next().ok_or(PaymentError::MissingAccount)?; + let maybe_referral = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referral = Referral::try_from_slice(*maybe_referral.try_borrow_data()?)?; + let maybe_referralship = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referralship = Referralship::try_from_slice(*maybe_referralship.try_borrow_data()?)?; + let maybe_referral_agent_nft_mint = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referral_agent_nft_mint = anchor_spl::token::spl_token::state::Mint::unpack(&maybe_referral_agent_nft_mint.try_borrow_data()?)?; + let maybe_referral_agent_nft_metadata = iter.next().ok_or(PaymentError::MissingAccount)?; + let maybe_referral_agent_nft_token_account = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referral_agent_nft_token_account = anchor_spl::token::spl_token::state::Account::unpack(&maybe_referral_agent_nft_mint.try_borrow_data()?)?; + let maybe_referral_agent_treasury_token_account = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referral_agent_treasury_token_account = anchor_spl::token::spl_token::state::Account::unpack(&maybe_referral_agent_nft_mint.try_borrow_data()?)?; + let maybe_referral_agents_collection_nft_mint = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referral_agents_collection_nft_mint = anchor_spl::token::spl_token::state::Mint::unpack(&maybe_referral_agent_nft_mint.try_borrow_data()?)?; + let maybe_referral_agents_collection_nft_metadata = iter.next().ok_or(PaymentError::MissingAccount)?; + let maybe_treasury_mint = iter.next().ok_or(PaymentError::MissingAccount)?; + // let referral_agent_nft_token_account = anchor_spl::token::spl_token::state::Account::unpack(&maybe_referral_agent_nft_mint.try_borrow_data()?)?; + let maybe_treasury_token_account = iter.next().ok_or(PaymentError::MissingAccount)?; + // TokenAccount + let maybe_plege_program = iter.next().ok_or(PaymentError::MissingAccount)?; + let maybe_referrals_program = iter.next().ok_or(PaymentError::MissingAccount)?; + + require!(maybe_referrals_program.key() == referrals::ID, PaymentError::WrongReferralsProgram); + require!(iter.next().is_some(), PaymentError::TooManyAccounts); + + let split_payment_accounts = SplitPayment { + app: app.to_account_info(), + app_authority: maybe_app_authority.to_owned(), + subscriber: maybe_subscriber.to_owned(), + subscription: subscription.to_account_info(), + tier: tier.to_account_info(), + referral: maybe_referral.to_owned(), + referralship: maybe_referralship.to_owned(), + referral_agent_nft_mint: maybe_referral_agent_nft_mint.to_owned(), + referral_agent_nft_metadata: maybe_referral_agent_nft_metadata.to_owned(), + referral_agent_nft_token_account: maybe_referral_agent_nft_token_account.to_owned(), + referral_agent_treasury_token_account: maybe_referral_agent_treasury_token_account.to_owned(), + referral_agents_collection_nft_mint: maybe_referral_agents_collection_nft_mint.to_owned(), + referral_agents_collection_nft_metadata: maybe_referral_agents_collection_nft_metadata.to_owned(), + treasury_mint: maybe_treasury_mint.to_owned(), + treasury_token_account: maybe_treasury_token_account.to_owned(), + plege_program: maybe_plege_program.to_owned(), + token_program: token_program, + }; + + let app_key = app.key(); + let subscriber_key = maybe_subscriber.key(); + let seeds: &[&[&[u8]]] = &[&[ + "SUBSCRIPTION".as_bytes(), + app_key.as_ref(), + subscriber_key.as_ref(), + &[subscription.bump] + ]]; + + let context = CpiContext::new_with_signer( + maybe_referrals_program.to_owned(), + split_payment_accounts, + seeds + ); + + referrals::cpi::split_payment(context)?; + } + + Ok(ThreadResponse::default()) + } +} + +#[derive(Accounts)] +pub struct CompletePayment<'info> { + #[account(mut, + // constraint = {msg!("subscription");subscription.expiration < Clock::get().unwrap().unix_timestamp}, + )] + pub subscription: Account<'info, Subscription>, + #[account(mut)] + pub app: Account<'info, App>, + #[account(mut, + constraint = tier.app == app.key() && tier.key() == subscription.tier, + constraint = tier.active == true + )] + pub tier: Account<'info, Tier>, + #[account(mut, + constraint = {msg!("destination"); destination.owner == app.treasury.key() && destination.mint == app.mint}, + )] + pub destination: Account<'info, TokenAccount>, + #[account(mut, constraint = {msg!("subscriber_ata"); subscriber_ata.owner == subscription.subscriber.key() + && subscriber_ata.mint == app.mint && subscriber_ata.amount >= tier.price}, + )] + pub subscriber_ata: Account<'info, TokenAccount>, + #[account( + constraint = subscription_thread.authority == subscription.key(), + constraint = subscription_thread.id == "subscriber_thread" + )] + pub subscription_thread: Box>, + pub token_program: Program<'info, Token>, + pub system_program: Program<'info, System>, +} + +#[error_code] +pub enum PaymentError { + MissingAccount, + TooManyAccounts, + WrongReferralsProgram +} \ No newline at end of file diff --git a/programs/plege/Cargo.toml b/programs/plege/Cargo.toml index 4da5d30..6ae762a 100644 --- a/programs/plege/Cargo.toml +++ b/programs/plege/Cargo.toml @@ -19,4 +19,4 @@ default = [] chrono = { version = "0.4.23", default-features = false } anchor-lang = { version = "0.25.0", features = ["init-if-needed"] } anchor-spl = "0.25.0" -clockwork-sdk = { version = "=1.3.9", features = ["thread"] } +clockwork-sdk = { version = "=1.3.9", features = ["thread"] } \ No newline at end of file diff --git a/programs/plege/src/instructions/complete_payment.rs b/programs/plege/src/instructions/complete_payment.rs deleted file mode 100644 index 1c0af1b..0000000 --- a/programs/plege/src/instructions/complete_payment.rs +++ /dev/null @@ -1,117 +0,0 @@ -use anchor_lang::prelude::*; -use anchor_spl::token::{transfer, Token, TokenAccount, Transfer}; -use clockwork_sdk::ThreadResponse; -use clockwork_sdk::thread_program::accounts::Thread; -use crate::state::*; -use crate::error::PlegeError; - -#[derive(Accounts)] -pub struct CompletePayment<'info> { - #[account(mut, - // constraint = {msg!("subscription");subscription.expiration < Clock::get().unwrap().unix_timestamp}, - )] - pub subscription: Account<'info, Subscription>, - #[account(mut)] - pub app: Account<'info, App>, - #[account(mut, - constraint = tier.app == app.key() && tier.key() == subscription.tier, - constraint = tier.active == true - )] - pub tier: Account<'info, Tier>, - #[account(mut, - constraint = {msg!("destination"); destination.owner == app.treasury.key() && destination.mint == app.mint}, - )] - pub destination: Account<'info, TokenAccount>, - #[account(mut, constraint = {msg!("subscriber_ata"); subscriber_ata.owner == subscription.subscriber.key() - && subscriber_ata.mint == app.mint && subscriber_ata.amount >= tier.price}, - )] - pub subscriber_ata: Account<'info, TokenAccount>, - #[account( - constraint = subscription_thread.authority == subscription.key(), - constraint = subscription_thread.id == "subscriber_thread" - )] - pub subscription_thread: Box>, - pub token_program: Program<'info, Token>, - pub system_program: Program<'info, System>, -} - -pub fn complete_payment(ctx: Context) -> Result { - let subscription = &mut ctx.accounts.subscription; - let app = &mut ctx.accounts.app; - let tier = &mut ctx.accounts.tier; - let destination = ctx.accounts.destination.to_account_info(); - let subscriber_ata = &mut ctx.accounts.subscriber_ata.to_account_info(); - let token_program = ctx.accounts.token_program.to_account_info(); - - let now_timestamp = Clock::get().unwrap().unix_timestamp; - - let last_pay_period: i64 = subscription.pay_period_expiration; - - require!(tier.interval.grace_period() > now_timestamp - last_pay_period, PlegeError::MissedPayment); - require!(subscription.accept_new_payments, PlegeError::InactiveSubscription); - - let balance = tier.price - subscription.credits; - - msg!("balance is {:?}", balance); - - if balance > 0 { - let transfer_accounts = Transfer { - from: subscriber_ata.clone(), - to: destination.clone(), - authority: subscription.to_account_info().clone(), - }; - - let app_key = app.key(); - let subscriber_key = subscription.subscriber; - let subscription_bump = subscription.bump; - let seeds = &["SUBSCRIPTION".as_bytes(), app_key.as_ref(), subscriber_key.as_ref(), &[subscription_bump]]; - let signers = [&seeds[..]]; - let transfer_amount = balance; - - let transfer_ctx = - CpiContext::new_with_signer(token_program.clone(), transfer_accounts, &signers); - - transfer(transfer_ctx, transfer_amount)?; - } else { - subscription.credits -= tier.price; - } - - subscription.last_payment_time = Some(now_timestamp); - subscription.pay_period_start = subscription.pay_period_expiration; - subscription.pay_period_expiration = tier.interval.increment(last_pay_period); - - Ok(ThreadResponse::default()) -} - - -// pub fn intervals_since_start(start: i64, now: i64, interval: Interval) -> u32 { -// let now = NaiveDateTime::from_timestamp_opt(now, 0).unwrap(); -// let start = NaiveDateTime::from_timestamp_opt(start, 0).unwrap(); - -// match interval { -// Interval::Month => months_since_start(start, now) + 1, -// Interval::Year => years_since_start(start, now) + 1 -// } -// } - -// pub fn months_since_start(start: NaiveDateTime, now: NaiveDateTime) -> u32 { -// let years = now.year() - start.year(); -// let months = now.month() - start.month(); - -// let mut months = (years as u32)*12 + months; -// if now.day() < start.day() { -// months -= 1; -// } - -// return months; -// } - -// pub fn years_since_start(start: NaiveDateTime, now: NaiveDateTime) -> u32 { -// let years = now.year() - start.year(); -// if (now.month() == start.month() && now.day() >= start.day()) || -// now.month() > start.month() { -// return years as u32; -// } else { -// return max(0, (years as u32) - 1); -// } -// } \ No newline at end of file diff --git a/programs/plege/src/instructions/create_subscription.rs b/programs/plege/src/instructions/create_subscription.rs index 6d67140..3a214a3 100644 --- a/programs/plege/src/instructions/create_subscription.rs +++ b/programs/plege/src/instructions/create_subscription.rs @@ -79,7 +79,7 @@ pub fn create_subscription(ctx: Context) -> Result<()> { let now_timestamp = Clock::get().unwrap().unix_timestamp; let complete_payment_ix = Instruction { - program_id: crate::ID, + program_id: Pubkey::new(b"ov9EhgYsv4QZozmTrXx8jnkC7LESA5kaCsXqRg2d6NM"), accounts: vec![ AccountMeta::new(subscription.key(), true), AccountMeta::new_readonly(app.key(), false), diff --git a/programs/plege/src/instructions/mod.rs b/programs/plege/src/instructions/mod.rs index 8f74ce4..034a2fc 100644 --- a/programs/plege/src/instructions/mod.rs +++ b/programs/plege/src/instructions/mod.rs @@ -1,6 +1,5 @@ mod cancel_subscription; mod close_subscription_account; -mod complete_payment; mod create_app; mod create_subscription; mod create_tier; @@ -10,7 +9,6 @@ mod toggle_new_subscribers; pub use cancel_subscription::*; pub use close_subscription_account::*; -pub use complete_payment::*; pub use create_app::*; pub use create_subscription::*; pub use create_tier::*; diff --git a/programs/plege/src/lib.rs b/programs/plege/src/lib.rs index e89f500..3d5ab93 100644 --- a/programs/plege/src/lib.rs +++ b/programs/plege/src/lib.rs @@ -7,7 +7,9 @@ pub mod state; use instructions::*; use state::Interval; -declare_id!("2KiKoVaRF894axqfgEbuQhgHmNWbMY1fgC1NBEqQNu4c"); +use clockwork_sdk::ThreadResponse; + +declare_id!("CYQMznorG2nDLjPhn8UgR58zEnae8BM7G2xFZaxnoUSS"); #[program] pub mod plege { @@ -48,10 +50,6 @@ pub mod plege { instructions::close_subscription_account(ctx, subscription_bump) } - pub fn complete_payment(ctx: Context) -> Result { - instructions::complete_payment(ctx) - } - pub fn disallow_new_subscribers(ctx: Context) -> Result<()> { instructions::disallow_new_subscribers(ctx) } diff --git a/programs/referrals/Cargo.toml b/programs/referrals/Cargo.toml index a05993f..6e9d63d 100644 --- a/programs/referrals/Cargo.toml +++ b/programs/referrals/Cargo.toml @@ -23,3 +23,4 @@ anchor-lang = { version = "0.25.0", features = ["init-if-needed"] } anchor-spl = "0.25.0" mpl-token-metadata = { version = "1.6.2", features = ["no-entrypoint"] } plege = { path = "../plege", features = ["cpi"] } +clockwork-sdk = { version = "=1.3.9", features = ["thread"] } \ No newline at end of file diff --git a/programs/referrals/src/instructions/split_payment.rs b/programs/referrals/src/instructions/split_payment.rs index 9cce5c6..b0b3748 100644 --- a/programs/referrals/src/instructions/split_payment.rs +++ b/programs/referrals/src/instructions/split_payment.rs @@ -19,8 +19,13 @@ use crate::{ }, }; +use clockwork_sdk::thread_program::{ + self, + accounts::{Thread, Trigger}, + ThreadProgram, +}; + #[derive(Accounts)] -#[instruction(tier_id: u8)] pub struct SplitPayment<'info> { #[account( seeds = [APP.as_bytes(), app_authority.key().as_ref(), referralship.app_id.to_be_bytes().as_ref()], @@ -33,15 +38,17 @@ pub struct SplitPayment<'info> { #[account( seeds = [SUBSCRIPTION.as_bytes(), app.key().as_ref(), subscriber.key().as_ref()], seeds::program = plege_program.key(), - bump + bump, + has_one = tier )] pub subscription: Box>, /// CHECK: Just needs to be a system account. pub subscriber: UncheckedAccount<'info>, #[account( - seeds = [SUBSCRIPTION_TIER.as_bytes(), app.key().as_ref(), tier_id.to_be_bytes().as_ref()], - seeds::program = plege_program.key(), - bump + constraint = subscription.tier == tier.key(), + // seeds = [SUBSCRIPTION_TIER.as_bytes(), app.key().as_ref(), tier_id.to_be_bytes().as_ref()], + // seeds::program = plege_program.key(), + // bump )] pub tier: Box>, #[account( @@ -81,10 +88,7 @@ pub struct SplitPayment<'info> { pub token_program: Program<'info, Token>, } -pub fn split_payment<'info>( - ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>, - _tier_id: u8, -) -> Result<()> { +pub fn split_payment<'info>(ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>) -> Result<()> { let app = &ctx.accounts.app; let subscription = &ctx.accounts.subscription; let tier = &ctx.accounts.tier; @@ -151,7 +155,7 @@ pub fn split_payment<'info>( } // make sure the treasury mint matches what's stored in the tier - if treasury_mint.key() != tier.mint.key() { + if treasury_mint.key() != app.mint.key() { return Err(ReferralError::InvalidTreasuryMint.into()); } diff --git a/programs/referrals/src/instructions/subscribe_with_referral.rs b/programs/referrals/src/instructions/subscribe_with_referral.rs index 3107c7b..1dc2581 100644 --- a/programs/referrals/src/instructions/subscribe_with_referral.rs +++ b/programs/referrals/src/instructions/subscribe_with_referral.rs @@ -13,6 +13,12 @@ use plege::{ state::{App, Subscription, Tier}, }; +use clockwork_sdk::thread_program::{ + self, + accounts::{Thread, Trigger}, + ThreadProgram, + }; + use crate::{ error::ReferralError, state::{Referral, Referralship, REFERRAL, APP, REFERRALSHIP, SUBSCRIPTION_TIER, TREASURY}, @@ -74,6 +80,11 @@ pub struct SubscribeWithReferral<'info> { /// CHECK: not being used, only for seeds pub app_authority: UncheckedAccount<'info>, pub plege_program: Program<'info, Plege>, + /// CHECK: checked via PDA derivation + #[account(mut, address = Thread::pubkey(subscription.key(),"subscriber_thread".to_string()))] + pub subscription_thread: UncheckedAccount<'info>, + #[account(address = thread_program::ID)] + pub thread_program: Program<'info, ThreadProgram>, pub token_program: Program<'info, Token>, pub system_program: Program<'info, System>, } @@ -94,6 +105,8 @@ pub fn subscribe_with_referral(ctx: Context, _tier_id: u let plege_program = &ctx.accounts.plege_program; let token_program = &ctx.accounts.token_program; let system_program = &ctx.accounts.system_program; + let subscription_thread = ctx.accounts.subscription_thread.to_account_info(); + let thread_program = ctx.accounts.thread_program.to_account_info(); // make sure the treasury mint matches what's stored in the referralship. if treasury_mint.key() != referralship.treasury_mint.key() { @@ -166,6 +179,8 @@ pub fn subscribe_with_referral(ctx: Context, _tier_id: u subscription: subscription.to_account_info(), subscriber: subscriber.to_account_info(), subscriber_ata: subscriber_token_account.to_account_info(), + subscription_thread: subscription_thread.to_account_info(), + thread_program: thread_program.to_account_info(), token_program: token_program.to_account_info(), system_program: system_program.to_account_info(), }; @@ -177,6 +192,9 @@ pub fn subscribe_with_referral(ctx: Context, _tier_id: u plege::cpi::create_subscription(create_subscription_context)?; + // CPI to add callback + // plege::cpi::add_subscription_callback() + // set the referral account state referral.app = app.key(); referral.referral_agent_nft_mint = referral_agent_nft_mint.key(); diff --git a/programs/referrals/src/lib.rs b/programs/referrals/src/lib.rs index effe77a..d001074 100644 --- a/programs/referrals/src/lib.rs +++ b/programs/referrals/src/lib.rs @@ -1,13 +1,13 @@ mod assertions; mod error; -mod instructions; -mod state; +pub mod instructions; +pub mod state; use anchor_lang::prelude::*; use instructions::*; -use state::{PubkeyWithWeight, Splits8}; +use state::*; -declare_id!("2kY5DJedxxDkGXohsSQh5kLNz4bpjEZ2YGVSrsgNQdG1"); +declare_id!("Dr5siFa8o6Q2rttbvDdKK9zjE7SrVWgK1UhWr5nur3v5"); #[program] pub mod referrals { @@ -28,8 +28,7 @@ pub mod referrals { pub fn split_payment<'info>( ctx: Context<'_, '_, '_, 'info, SplitPayment<'info>>, - tier_id: u8, ) -> Result<()> { - instructions::split_payment(ctx, tier_id) + instructions::split_payment(ctx) } } diff --git a/tests/referrals.ts b/tests/referrals.ts index c94431c..366c04d 100644 --- a/tests/referrals.ts +++ b/tests/referrals.ts @@ -1,88 +1,87 @@ -import { assert } from "chai"; +import { assert } from "chai" import { AccountMeta, Keypair, PublicKey, SystemProgram, Transaction, -} from "@solana/web3.js"; -import * as anchor from "@project-serum/anchor"; -import { Referrals } from "../target/types/referrals"; -import { Plege } from "../target/types/plege"; -import generateFundedKeypair from "./utils/keypair"; +} from "@solana/web3.js" +import * as anchor from "@project-serum/anchor" +import { Referrals } from "../target/types/referrals" +import { Plege } from "../target/types/plege" +import generateFundedKeypair from "./utils/keypair" import { findAppAddress, findSubscriptionAddress, numberToAppId, tierAccountKey, userAccountKeyFromPubkey, -} from "./utils/basic-functions"; +} from "./utils/basic-functions" import { createAssociatedTokenAccount, createMint, mintTo, TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; -import { - keypairIdentity, - Metaplex, - mockStorage, -} from "@metaplex-foundation/js"; +} from "@solana/spl-token" +import { keypairIdentity, Metaplex, mockStorage } from "@metaplex-foundation/js" function findReferralshipAddress( app: PublicKey, - programId: PublicKey, + programId: PublicKey ): [PublicKey, number] { - return PublicKey.findProgramAddressSync([ - Buffer.from("REFERRALSHIP"), - app.toBuffer(), - ], programId); + return PublicKey.findProgramAddressSync( + [Buffer.from("REFERRALSHIP"), app.toBuffer()], + programId + ) } function findReferralAddress( app: PublicKey, subscription: PublicKey, referralAgentNFTMint: PublicKey, - programId: PublicKey, + programId: PublicKey ) { - return PublicKey.findProgramAddressSync([ - Buffer.from("REFERRAL"), - app.toBuffer(), - subscription.toBuffer(), - referralAgentNFTMint.toBuffer(), - ], programId); + return PublicKey.findProgramAddressSync( + [ + Buffer.from("REFERRAL"), + app.toBuffer(), + subscription.toBuffer(), + referralAgentNFTMint.toBuffer(), + ], + programId + ) } function findReferralshipTreasuryAccountAddress( app: PublicKey, treasuryMint: PublicKey, - programId: PublicKey, + programId: PublicKey ) { - return PublicKey.findProgramAddressSync([ - Buffer.from("REFERRALSHIP"), - app.toBuffer(), - Buffer.from("TREASURY"), - treasuryMint.toBuffer(), - ], programId); + return PublicKey.findProgramAddressSync( + [ + Buffer.from("REFERRALSHIP"), + app.toBuffer(), + Buffer.from("TREASURY"), + treasuryMint.toBuffer(), + ], + programId + ) } describe("referrals", () => { - anchor.setProvider(anchor.AnchorProvider.env()); - const referralProgram = anchor.workspace.Referrals as anchor.Program< - Referrals - >; - const subscriptionProgram = anchor.workspace.Plege as anchor.Program< - Plege - >; + anchor.setProvider(anchor.AnchorProvider.env()) + const referralProgram = anchor.workspace + .Referrals as anchor.Program + const subscriptionProgram = anchor.workspace.Plege as anchor.Program it("creates a referralship", async () => { - const { connection } = anchor.getProvider(); - const appAuthorityKeypair = await generateFundedKeypair(connection); - const referralAgentKeypair = await generateFundedKeypair(connection); - const subscriberKeypair = await generateFundedKeypair(connection); - const stakeholder1Keypair = await generateFundedKeypair(connection); - const stakeholder2Keypair = await generateFundedKeypair(connection); - const treasuryAuthorityKeypair = await generateFundedKeypair(connection); + const { connection } = anchor.getProvider() + const appAuthorityKeypair = await generateFundedKeypair(connection) + const referralAgentKeypair = await generateFundedKeypair(connection) + const subscriberKeypair = await generateFundedKeypair(connection) + const stakeholder1Keypair = await generateFundedKeypair(connection) + const stakeholder2Keypair = await generateFundedKeypair(connection) + const treasuryAuthorityKeypair = await generateFundedKeypair(connection) // create a token mint const treasuryMint = await createMint( @@ -90,117 +89,120 @@ describe("referrals", () => { treasuryAuthorityKeypair, treasuryAuthorityKeypair.publicKey, treasuryAuthorityKeypair.publicKey, - 0, - ); + 0 + ) const referralAgentTokenAccount = await createAssociatedTokenAccount( connection, referralAgentKeypair, treasuryMint, - referralAgentKeypair.publicKey, - ); + referralAgentKeypair.publicKey + ) const subscriberTokenAccount = await createAssociatedTokenAccount( connection, subscriberKeypair, treasuryMint, - subscriberKeypair.publicKey, - ); + subscriberKeypair.publicKey + ) const stakeholder1TokenAccount = await createAssociatedTokenAccount( connection, stakeholder1Keypair, treasuryMint, - stakeholder1Keypair.publicKey, - ); + stakeholder1Keypair.publicKey + ) const stakeholder2TokenAccount = await createAssociatedTokenAccount( connection, stakeholder1Keypair, treasuryMint, - stakeholder2Keypair.publicKey, - ); + stakeholder2Keypair.publicKey + ) - const metaplex = Metaplex.make(anchor.getProvider().connection).use( - keypairIdentity(appAuthorityKeypair), - ).use(mockStorage()); + const metaplex = Metaplex.make(anchor.getProvider().connection) + .use(keypairIdentity(appAuthorityKeypair)) + .use(mockStorage()) const userMetaAddress = userAccountKeyFromPubkey( - appAuthorityKeypair.publicKey, - ); + appAuthorityKeypair.publicKey + ) // create user meta -- required by the subscription program's createApp instruction - const createUserMetaIx = await subscriptionProgram.methods.createUser() + const createUserMetaIx = await subscriptionProgram.methods + .createUser() .accounts({ userMeta: userMetaAddress, auth: appAuthorityKeypair.publicKey, systemProgram: SystemProgram.programId, - }).instruction(); + }) + .instruction() // create an app - const appId = 1; + const appId = 1 const [appAddress] = findAppAddress( appAuthorityKeypair.publicKey, appId, - subscriptionProgram.programId, - ); + subscriptionProgram.programId + ) const [referralshipTreasuryAddress] = findReferralshipTreasuryAccountAddress( appAddress, treasuryMint, - referralProgram.programId, - ); + referralProgram.programId + ) - const createAppIx = await subscriptionProgram.methods.createApp( - appId, - "super app", - ) - .accounts( - { - app: appAddress, - auth: appAuthorityKeypair.publicKey, - userMeta: userMetaAddress, - treasury: referralshipTreasuryAddress, - systemProgram: SystemProgram.programId, - }, - ).instruction(); + const createAppIx = await subscriptionProgram.methods + .createApp(appId, "super app") + .accounts({ + app: appAddress, + auth: appAuthorityKeypair.publicKey, + userMeta: userMetaAddress, + treasury: referralshipTreasuryAddress, + systemProgram: SystemProgram.programId, + }) + .instruction() const tierArgs = { name: "basic", id: 1, price: 100, interval: { month: {} }, // monthly - }; - const tierAddress = tierAccountKey(appAddress, 1); - - const createTierIx = await subscriptionProgram.methods.createTier( - tierArgs.id, - tierArgs.name, - new anchor.BN(tierArgs.price), - tierArgs.interval, - ) + } + const tierAddress = tierAccountKey(appAddress, 1) + + const createTierIx = await subscriptionProgram.methods + .createTier( + tierArgs.id, + tierArgs.name, + new anchor.BN(tierArgs.price), + tierArgs.interval + ) .accounts({ tier: tierAddress, app: appAddress, mint: treasuryMint, signer: appAuthorityKeypair.publicKey, systemProgram: SystemProgram.programId, - }).instruction(); + }) + .instruction() const createUserAndAppTx = new Transaction() .add(createUserMetaIx) .add(createAppIx) - .add(createTierIx); + .add(createTierIx) - await anchor.getProvider().sendAndConfirm(createUserAndAppTx, [ - appAuthorityKeypair, - ], { skipPreflight: true }); + await anchor + .getProvider() + .sendAndConfirm(createUserAndAppTx, [appAuthorityKeypair], { + skipPreflight: true, + }) const [referralshipAddress] = findReferralshipAddress( appAddress, - referralProgram.programId, - ); + referralProgram.programId + ) const referralAgentsCollectionNFT = await metaplex.nfts().create({ name: "Referral Agents", @@ -209,7 +211,7 @@ describe("referrals", () => { sellerFeeBasisPoints: 0, isCollection: true, collectionAuthority: appAuthorityKeypair, - }); + }) const referralAgentNFT = await metaplex.nfts().create({ name: "Referral Agent", @@ -219,14 +221,15 @@ describe("referrals", () => { collection: referralAgentsCollectionNFT.mintAddress, collectionAuthority: appAuthorityKeypair, tokenOwner: referralAgentKeypair.publicKey, - }); + }) // create a referralship account const createReferralshipIx = await referralProgram.methods .createReferralship(appId, 80, [ { address: stakeholder1TokenAccount, weight: 10 }, { address: stakeholder2TokenAccount, weight: 10 }, - ]).accounts({ + ]) + .accounts({ referralship: referralshipAddress, app: appAddress, appAuthority: appAuthorityKeypair.publicKey, @@ -237,37 +240,40 @@ describe("referrals", () => { referralAgentsCollectionNFT.metadataAddress, plegeProgram: subscriptionProgram.programId, systemProgram: SystemProgram.programId, - }).instruction(); + }) + .instruction() - const createReferralshipTx = new Transaction().add(createReferralshipIx); + const createReferralshipTx = new Transaction().add(createReferralshipIx) - await anchor.getProvider().sendAndConfirm(createReferralshipTx, [ - appAuthorityKeypair, - ], { skipPreflight: true }); + await anchor + .getProvider() + .sendAndConfirm(createReferralshipTx, [appAuthorityKeypair], { + skipPreflight: true, + }) const referralship = await referralProgram.account.referralship.fetch( - referralshipAddress, - ); + referralshipAddress + ) - assert.equal(referralship.appId, appId); - assert.equal(referralship.app.toBase58(), appAddress.toBase58()); - assert.equal(referralship.treasuryMint.toBase58(), treasuryMint.toBase58()); + assert.equal(referralship.appId, appId) + assert.equal(referralship.app.toBase58(), appAddress.toBase58()) + assert.equal(referralship.treasuryMint.toBase58(), treasuryMint.toBase58()) const [subscriptionAddress] = findSubscriptionAddress( subscriberKeypair.publicKey, appAddress, - subscriptionProgram.programId, - ); + subscriptionProgram.programId + ) const [referralAddress] = findReferralAddress( appAddress, subscriptionAddress, referralAgentNFT.mintAddress, - referralProgram.programId, - ); + referralProgram.programId + ) - let treasuryInitialBalance = 100_000_000; - let subscriberInitialBalance = 100_000_000; + let treasuryInitialBalance = 100_000_000 + let subscriberInitialBalance = 100_000_000 await mintTo( connection, @@ -275,8 +281,8 @@ describe("referrals", () => { treasuryMint, subscriberTokenAccount, treasuryAuthorityKeypair, - subscriberInitialBalance, - ); + subscriberInitialBalance + ) await mintTo( connection, @@ -284,11 +290,12 @@ describe("referrals", () => { treasuryMint, referralshipTreasuryAddress, treasuryAuthorityKeypair, - treasuryInitialBalance, - ); + treasuryInitialBalance + ) const subscribeWithReferralIx = await referralProgram.methods - .subscribeWithReferral(tierArgs.id).accounts({ + .subscribeWithReferral(tierArgs.id) + .accounts({ referral: referralAddress, referralship: referralshipAddress, subscription: subscriptionAddress, @@ -306,15 +313,18 @@ describe("referrals", () => { plegeProgram: subscriptionProgram.programId, tokenProgram: TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, - }).instruction(); + }) + .instruction() const subscribeWithReferralTx = new Transaction().add( - subscribeWithReferralIx, - ); + subscribeWithReferralIx + ) - await anchor.getProvider().sendAndConfirm(subscribeWithReferralTx, [ - subscriberKeypair, - ], { skipPreflight: true }); + await anchor + .getProvider() + .sendAndConfirm(subscribeWithReferralTx, [subscriberKeypair], { + skipPreflight: true, + }) let ixAccounts = { app: appAddress, @@ -334,14 +344,15 @@ describe("referrals", () => { treasuryTokenAccount: referralshipTreasuryAddress, treasuryAuthority: treasuryAuthorityKeypair.publicKey, tokenProgram: TOKEN_PROGRAM_ID, - }; + } for (let account in ixAccounts) { - console.log(account, ixAccounts[account].toBase58()); + console.log(account, ixAccounts[account].toBase58()) } // simulate a call from the subscription program to split payments - let splitIx = await referralProgram.methods.splitPayment(tierArgs.id) + let splitIx = await referralProgram.methods + .splitPayment(tierArgs.id) .accounts({ app: appAddress, appAuthority: appAuthorityKeypair.publicKey, @@ -375,11 +386,11 @@ describe("referrals", () => { isSigner: false, }, ]) - .instruction(); + .instruction() - let splitTx = new Transaction().add(splitIx); + let splitTx = new Transaction().add(splitIx) await anchor.getProvider().sendAndConfirm(splitTx, [], { skipPreflight: true, - }); - }); -}); + }) + }) +}) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..96f6c3f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2901 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@bundlr-network/client@^0.8.8": + version "0.8.9" + resolved "https://registry.yarnpkg.com/@bundlr-network/client/-/client-0.8.9.tgz#58e969a5d80f8d25d212d46bb7a060730a3c1736" + integrity sha512-SJ7BAt/KhONeFQ0+nbqrw2DUWrsev6y6cmlXt+3x7fPCkw7OJwudtxV/h2nBteZd65NXjqw8yzkmLiLfZ7CCRA== + dependencies: + "@solana/wallet-adapter-base" "^0.9.2" + "@solana/web3.js" "^1.36.0" + "@supercharge/promise-pool" "^2.1.0" + algosdk "^1.13.1" + arbundles "^0.6.21" + arweave "^1.11.4" + async-retry "^1.3.3" + axios "^0.25.0" + base64url "^3.0.1" + bignumber.js "^9.0.1" + bs58 "^4.0.1" + commander "^8.2.0" + csv "^6.0.5" + ethers "^5.5.1" + inquirer "^8.2.0" + js-sha256 "^0.9.0" + mime-types "^2.1.34" + near-api-js "^0.44.2" + near-seed-phrase "^0.2.0" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@metaplex-foundation/beet-solana@^0.3.0", "@metaplex-foundation/beet-solana@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz#4b37cda5c7f32ffd2bdd8b3164edc05c6463ab35" + integrity sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g== + dependencies: + "@metaplex-foundation/beet" ">=0.1.0" + "@solana/web3.js" "^1.56.2" + bs58 "^5.0.0" + debug "^4.3.4" + +"@metaplex-foundation/beet-solana@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet-solana/-/beet-solana-0.4.0.tgz#52891e78674aaa54e0031f1bca5bfbc40de12e8d" + integrity sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ== + dependencies: + "@metaplex-foundation/beet" ">=0.1.0" + "@solana/web3.js" "^1.56.2" + bs58 "^5.0.0" + debug "^4.3.4" + +"@metaplex-foundation/beet@0.7.1", "@metaplex-foundation/beet@>=0.1.0", "@metaplex-foundation/beet@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.7.1.tgz#0975314211643f87b5f6f3e584fa31abcf4c612c" + integrity sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/beet@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.4.0.tgz#eb2a0a6eb084bb25d67dd9bed2f7387ee7e63a55" + integrity sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/beet@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.6.1.tgz#6331bdde0648bf2cae6f9e482f8e3552db05d69f" + integrity sha512-OYgnijLFzw0cdUlRKH5POp0unQECPOW9muJ2X3QIVyak5G6I6l/rKo72sICgPLIFKdmsi2jmnkuLY7wp14iXdw== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/cusper@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/cusper/-/cusper-0.0.2.tgz#dc2032a452d6c269e25f016aa4dd63600e2af975" + integrity sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA== + +"@metaplex-foundation/js@^0.17.9": + version "0.17.9" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/js/-/js-0.17.9.tgz#2dfa77bfe23acc118d35ff8678825036391eb7a1" + integrity sha512-msMGWSYetSVWmIXpDKI5Y3WZtTrCjF6QRQ8BpsXKoNs6xAKPvSuT9OGay/mbOs+/pMNHVPt8lFfl281yBN/MxA== + dependencies: + "@bundlr-network/client" "^0.8.8" + "@metaplex-foundation/beet" "0.7.1" + "@metaplex-foundation/mpl-auction-house" "^2.3.0" + "@metaplex-foundation/mpl-candy-guard" "^0.3.0" + "@metaplex-foundation/mpl-candy-machine" "^5.0.0" + "@metaplex-foundation/mpl-candy-machine-core" "^0.1.2" + "@metaplex-foundation/mpl-token-metadata" "^2.3.3" + "@noble/ed25519" "^1.7.1" + "@noble/hashes" "^1.1.3" + "@solana/spl-token" "^0.3.5" + "@solana/web3.js" "^1.63.1" + bignumber.js "^9.0.2" + bn.js "^5.2.1" + bs58 "^5.0.0" + buffer "^6.0.3" + debug "^4.3.4" + eventemitter3 "^4.0.7" + lodash.clonedeep "^4.5.0" + lodash.isequal "^4.5.0" + merkletreejs "^0.2.32" + mime "^3.0.0" + node-fetch "^2.6.7" + +"@metaplex-foundation/mpl-auction-house@^2.3.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-auction-house/-/mpl-auction-house-2.3.1.tgz#9c3713c6f0812418952db1c0ad12b677aacc6f48" + integrity sha512-OqMKwjm0+afXPc4DuONP1YBrmzwjlhhX2qUc09jZm7n/uIb1Eb9XgupCAVK7Kc9WvaneJ3dEZgn9HrcNtUPsMg== + dependencies: + "@metaplex-foundation/beet" "^0.6.1" + "@metaplex-foundation/beet-solana" "^0.3.1" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.5" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-guard@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-guard/-/mpl-candy-guard-0.3.0.tgz#e049abf8031665759ec0f9e965dedf93962b90fe" + integrity sha512-YJOZPtAirPqBMd48GOUQ+lav71C70QrA9OQnXsuAbbdl7jKlvbL72C9CnSNBTfdW2I+zPOmDL5H3CQddvgIWlA== + dependencies: + "@metaplex-foundation/beet" "^0.4.0" + "@metaplex-foundation/beet-solana" "^0.3.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-machine-core@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-machine-core/-/mpl-candy-machine-core-0.1.2.tgz#07e19558d0ef120fac1d8612ae4de90d52cd4d1f" + integrity sha512-jjDkRvMR+iykt7guQ7qVnOHTZedql0lq3xqWDMaenAUCH3Xrf2zKATThhJppIVNX1/YtgBOO3lGqhaFbaI4pCw== + dependencies: + "@metaplex-foundation/beet" "^0.4.0" + "@metaplex-foundation/beet-solana" "^0.3.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-machine@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-machine/-/mpl-candy-machine-5.0.0.tgz#2eae8f02a1479c62ef9b9b521215988d6fc06818" + integrity sha512-df2OmZ4s8PJXQXtGAyfZIIitwJPKebtj4f8tab/o5VNhYsW5M9YKfMyAEBBNHm1n/xz+C8Lxy05e6qo3nU/30g== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.6" + "@solana/web3.js" "^1.66.2" + +"@metaplex-foundation/mpl-token-metadata@^2.3.3": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-2.5.2.tgz#ec84464e2bf65bf491abdc71c3882e5973dd9978" + integrity sha512-lAjQjj2gGtyLq8MOkp4tWZSC5DK9NWgPd3EoH0KQ9gMs3sKIJRik0CBaZg+JA0uLwzkiErY2Izus4vbWtRADJQ== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.6" + "@solana/web3.js" "^1.66.2" + bn.js "^5.2.0" + debug "^4.3.4" + +"@noble/ed25519@^1.6.1", "@noble/ed25519@^1.7.0", "@noble/ed25519@^1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.1.tgz#6899660f6fbb97798a6fbd227227c4589a454724" + integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== + +"@noble/hashes@^1.1.2", "@noble/hashes@^1.1.3": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.4.tgz#2611ebf5764c1bf754da7c7794de4fb30512336d" + integrity sha512-+PYsVPrTSqtVjatKt2A/Proukn2Yrz61OBThOCKErc5w2/r1Fh37vbDv0Eah7pyNltrmacjwTvdw3JoR+WE4TA== + +"@noble/secp256k1@^1.6.3": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1" + integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw== + +"@project-serum/anchor@^0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.25.0.tgz#88ee4843336005cf5a64c80636ce626f0996f503" + integrity sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A== + dependencies: + "@project-serum/borsh" "^0.2.5" + "@solana/web3.js" "^1.36.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^5.3.1" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + +"@project-serum/borsh@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.5.tgz#6059287aa624ecebbfc0edd35e4c28ff987d8663" + integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@randlabs/communication-bridge@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3" + integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== + +"@randlabs/myalgo-connect@^1.1.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05" + integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA== + dependencies: + "@randlabs/communication-bridge" "1.0.1" + +"@solana/buffer-layout-utils@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" + integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/web3.js" "^1.32.0" + bigint-buffer "^1.1.5" + bignumber.js "^9.0.1" + +"@solana/buffer-layout@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/spl-token@^0.3.5", "@solana/spl-token@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.3.6.tgz#35473ad2ed71fe91e5754a2ac72901e1b8b26a42" + integrity sha512-P9pTXjDIRvVbjr3J0mCnSamYqLnICeds7IoH1/Ro2R9OBuOHdp5pqKZoscfZ3UYrgnCWUc1bc9M2m/YPHjw+1g== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + buffer "^6.0.3" + +"@solana/wallet-adapter-base@^0.9.2": + version "0.9.19" + resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.19.tgz#8b493705cabdc641824853405f79781f9ddc1bd5" + integrity sha512-c/F3xyuSNDUjbYM6E4be5bMx9YmNqE6XIpLcM9U3ohviwDF8hO+v5N8KSvnMaztL4Lr6+TEtCLi3Q5AT0r06JA== + dependencies: + eventemitter3 "^4.0.0" + +"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.2": + version "1.70.1" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.70.1.tgz#4a2df47cc32a0f67be5161e772b2ceb6512281fa" + integrity sha512-AnaqCF1cJ3w7d0yhvLGAKAcRI+n5o+ursQihhoTe4cUh8/9d4gbT73SoHYElS7e67OtAgLmSfbcC5hcOAgdvnQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@noble/ed25519" "^1.7.0" + "@noble/hashes" "^1.1.2" + "@noble/secp256k1" "^1.6.3" + "@solana/buffer-layout" "^4.0.0" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.1" + fast-stable-stringify "^1.0.0" + jayson "^3.4.4" + node-fetch "2" + rpc-websockets "^7.5.0" + superstruct "^0.14.2" + +"@supercharge/promise-pool@^2.1.0": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-2.3.2.tgz#6366894a7e7bc699bb65e58d8c828113729cf481" + integrity sha512-f5+C7zv+QQivcUO1FH5lXi7GcuJ3CFuJF3Eg06iArhUs5ma0szCLEQwIY4+VQyh7m/RLVZdzvr4E4ZDnLe9MNg== + +"@types/bn.js@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.0": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== + +"@types/connect@^3.4.33": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mocha@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "18.11.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.13.tgz#dff34f226ec1ac0432ae3b136ec5552bd3b9c0fe" + integrity sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w== + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +algo-msgpack-with-bigint@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" + integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== + +algosdk@^1.13.1: + version "1.24.0" + resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.24.0.tgz#9f4e2fdf94d100561b2251c0a6591047fe0e2556" + integrity sha512-Q+rOpHTyn92OaL1ta0jEGz8fUQnfGiH2u5wkHj4phy5YKC9mkUrXc1+3Qk3v5fsttTV6pZlYPpzvBTNAlgIAyQ== + dependencies: + algo-msgpack-with-bigint "^2.1.1" + buffer "^6.0.2" + cross-fetch "^3.1.5" + hi-base32 "^0.5.1" + js-sha256 "^0.9.0" + js-sha3 "^0.8.0" + js-sha512 "^0.8.0" + json-bigint "^1.0.0" + tweetnacl "^1.0.3" + vlq "^2.0.4" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansicolors@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arbundles@^0.6.21: + version "0.6.22" + resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.6.22.tgz#0fd58ec76514f1d6c2db7c5870a6232314f52de6" + integrity sha512-QlSavBHk59mNqgQ6ScxlqaBJlDbSmSrK/uTcF3HojLAZ/4aufTkVTBjl1hSfZ/ZN45oIPgJC05R8SmVARF+8VA== + dependencies: + "@noble/ed25519" "^1.6.1" + "@randlabs/myalgo-connect" "^1.1.2" + "@solana/wallet-adapter-base" "^0.9.2" + algosdk "^1.13.1" + arweave "^1.11.4" + arweave-stream-tx "^1.1.0" + avsc "https://github.com/Bundlr-Network/avsc#csp-fixes" + axios "^0.21.3" + base64url "^3.0.1" + bs58 "^4.0.1" + ethers "^5.5.1" + keccak "^3.0.2" + multistream "^4.1.0" + process "^0.11.10" + secp256k1 "^4.0.2" + tmp-promise "^3.0.2" + +arconnect@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.4.2.tgz#83de7638fb46183e82d7ec7efb5594c5f7cdc806" + integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw== + dependencies: + arweave "^1.10.13" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +arweave-stream-tx@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f" + integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== + dependencies: + exponential-backoff "^3.1.0" + +arweave@^1.10.13, arweave@^1.11.4: + version "1.11.8" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.11.8.tgz#09376e0c6cec40a661cbb27a306cb11c0a663cd8" + integrity sha512-58ODeNPIC4OjaOCl2bXjKbOFGsiVZFs+DkQg3BvQGvFWNqw1zTJ4Jp01xGUz+GbdOaDyJcCC0g3l0HwdJfFPyw== + dependencies: + arconnect "^0.4.2" + asn1.js "^5.4.1" + axios "^0.27.2" + base64-js "^1.5.1" + bignumber.js "^9.0.2" + util "^0.12.4" + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +"avsc@https://github.com/Bundlr-Network/avsc#csp-fixes": + version "5.4.7" + resolved "https://github.com/Bundlr-Network/avsc#a730cc8018b79e114b6a3381bbb57760a24c6cef" + +axios@^0.21.3: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bip39-light@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/bip39-light/-/bip39-light-1.0.7.tgz#06a72f251b89389a136d3f177f29b03342adc5ba" + integrity sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + +bip39@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.2.tgz#2baf42ff3071fc9ddd5103de92e8f80d9257ee32" + integrity sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +bn.js@^4.0.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.6.0.tgz#a7c9eeca6a31ca9e0607cb49f329cb659eb791e1" + integrity sha512-sl5k89ViqsThXQpYa9XDtz1sBl3l1lI313cFUY1HKr+wvMILnb+58xpkqTNrYbelh99dY7K8usxoCusQmqix9Q== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-layout@^1.2.0, buffer-layout@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.2, buffer@^6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +capability@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/capability/-/capability-0.2.5.tgz#51ad87353f1936ffd77f2f21c74633a4dea88801" + integrity sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg== + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@^4.3.4: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@1.1.7, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +crypto-js@^3.1.9-1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +csv-generate@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.2.1.tgz#2a0c5f0d9a5b6f7a0c1fee40f028707af048b31b" + integrity sha512-w6GFHjvApv6bcJ2xdi9JGsH6ZvUBfC+vUdfefnEzurXG6hMRwzkBLnhztU2H7v7+zfCk1I/knnQ+tGbgpxWrBw== + +csv-parse@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.3.3.tgz#3b75d2279e2edb550cbc54c65b25cbbf3d0033ad" + integrity sha512-kEWkAPleNEdhFNkHQpFHu9RYPogsFj3dx6bCxL847fsiLgidzWg0z/O0B1kVWMJUc5ky64zGp18LX2T3DQrOfw== + +csv-stringify@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.2.3.tgz#fefd25e66fd48f8f42f43b85a66a4663a2c3e796" + integrity sha512-4qGjUMwnlaRc00gc2jrIYh2w/h1fo25B0mTuY9K8fBiIgtmCX3LcgUbrEGViL98Ci4Se/F5LFEtu8k+dItJVZQ== + +csv@^6.0.5: + version "6.2.5" + resolved "https://registry.yarnpkg.com/csv/-/csv-6.2.5.tgz#e01fd3db2f0856a120ae9140bd179c1a186ee2b9" + integrity sha512-T+K0H7MIrlrnP6KxYKo3lK+uLl6OC2Gmwdd81TG/VdkhKvpatl35sR7tyRSpDLGl22y2T+q9KvNHnVtn4OAscQ== + dependencies: + csv-generate "^4.2.1" + csv-parse "^5.3.3" + csv-stringify "^6.2.3" + stream-transform "^3.2.1" + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +elliptic@6.5.4, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-polyfill@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/error-polyfill/-/error-polyfill-0.1.3.tgz#df848b61ad8834f7a5db69a70b9913df86721d15" + integrity sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg== + dependencies: + capability "^0.2.5" + o3 "^1.0.3" + u3 "^0.1.1" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-util@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +eventemitter3@^4.0.0, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exponential-backoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.0.tgz#9409c7e579131f8bd4b32d7d8094a911040f2e68" + integrity sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.14.0, follow-redirects@^1.14.7, follow-redirects@^1.14.9: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + 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.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hi-base32@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@^1.7.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.2.0: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^3.4.4: + version "3.7.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" + integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^8.3.2" + ws "^7.4.5" + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha512@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + dependencies: + get-func-name "^2.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merkletreejs@^0.2.32: + version "0.2.32" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" + integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^3.1.9-1" + treeify "^1.1.0" + web3-utils "^1.3.4" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@^9.0.3: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + +mustache@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +near-api-js@^0.44.2: + version "0.44.2" + resolved "https://registry.yarnpkg.com/near-api-js/-/near-api-js-0.44.2.tgz#e451f68f2c56bd885c7b918db5818a3e6e9423d0" + integrity sha512-eMnc4V+geggapEUa3nU2p8HSHn/njtloI4P2mceHQWO8vDE1NGpnAw8FuTBrLmXSgIv9m6oocgFc9t3VNf5zwg== + dependencies: + bn.js "5.2.0" + borsh "^0.6.0" + bs58 "^4.0.0" + depd "^2.0.0" + error-polyfill "^0.1.3" + http-errors "^1.7.2" + js-sha256 "^0.9.0" + mustache "^4.0.0" + node-fetch "^2.6.1" + text-encoding-utf-8 "^1.0.2" + tweetnacl "^1.0.1" + +near-hd-key@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/near-hd-key/-/near-hd-key-1.2.1.tgz#f508ff15436cf8a439b543220f3cc72188a46756" + integrity sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg== + dependencies: + bip39 "3.0.2" + create-hmac "1.1.7" + tweetnacl "1.0.3" + +near-seed-phrase@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/near-seed-phrase/-/near-seed-phrase-0.2.0.tgz#fb7cf89682112b1160ab68abb50dc821f49be18a" + integrity sha512-NpmrnejpY1AdlRpDZ0schJQJtfBaoUheRfiYtQpcq9TkwPgqKZCRULV5L3hHmLc0ep7KRtikbPQ9R2ztN/3cyQ== + dependencies: + bip39-light "^1.0.7" + bs58 "^4.0.1" + near-hd-key "^1.2.1" + tweetnacl "^1.0.2" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2, node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +o3@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/o3/-/o3-1.0.3.tgz#192ce877a882dfa6751f0412a865fafb2da1dac0" + integrity sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ== + dependencies: + capability "^0.2.5" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17, pbkdf2@^3.0.9: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prettier@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +randombytes@^2.0.1, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rpc-websockets@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748" + integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ== + dependencies: + "@babel/runtime" "^7.17.2" + eventemitter3 "^4.0.7" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^7.5.5: + version "7.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2" + integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1, secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-transform@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.2.1.tgz#4c8cbdd3e4fa7254c770ef34a962cec68349fcb0" + integrity sha512-ApK+WTJ5bCOf0A2tlec1qhvr8bGEBM/sgXXB7mysdCYgZJO5DZeaV3h3G+g0HnAQ372P5IhiGqnW29zoLOfTzQ== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +superstruct@^0.15.4: + version "0.15.5" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" + integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +"through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + +ts-mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" + integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.3, tslib@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tweetnacl@1.0.3, tweetnacl@^1.0.1, tweetnacl@^1.0.2, tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@^4.3.5: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + +u3@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/u3/-/u3-0.1.1.tgz#5f52044f42ee76cd8de33148829e14528494b73b" + integrity sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.4: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vlq@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041" + integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.4: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" + integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.2: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^7.4.5: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.5.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==