├── .gitignore ├── programs └── permissioned-markets │ ├── Xargo.toml │ ├── Cargo.toml │ └── src │ └── lib.rs ├── Cargo.toml ├── .gitmodules ├── Anchor.toml ├── migrations └── deploy.js ├── scripts ├── list-market.js ├── localnet.sh └── trade-bot.js ├── .travis.yml ├── tests ├── utils │ ├── common.js │ ├── market-proxy.js │ ├── index.js │ ├── faucet.js │ ├── market-maker.js │ └── market-lister.js └── permissioned-markets.js ├── package.json ├── README.md ├── Cargo.lock └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | target/ 3 | localnet-logs/ 4 | test-ledger/ 5 | .anchor/ -------------------------------------------------------------------------------- /programs/permissioned-markets/Xargo.toml: -------------------------------------------------------------------------------- 1 | [target.bpfel-unknown-unknown.dependencies.std] 2 | features = [] 3 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "programs/*" 4 | ] 5 | 6 | exclude = [ 7 | "deps/serum-dex", 8 | ] -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "deps/serum-dex"] 2 | path = deps/serum-dex 3 | url = https://github.com/project-serum/serum-dex 4 | -------------------------------------------------------------------------------- /Anchor.toml: -------------------------------------------------------------------------------- 1 | [provider] 2 | cluster = "localnet" 3 | wallet = "~/.config/solana/id.json" 4 | 5 | [[test.genesis]] 6 | address = "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" 7 | program = "./deps/serum-dex/dex/target/deploy/serum_dex.so" 8 | 9 | [scripts] 10 | test = "mocha -t 1000000 tests/" 11 | -------------------------------------------------------------------------------- /programs/permissioned-markets/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "permissioned-markets" 3 | version = "0.1.0" 4 | description = "Created with Anchor" 5 | edition = "2018" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | name = "permissioned_markets" 10 | 11 | [features] 12 | no-entrypoint = [] 13 | no-idl = [] 14 | cpi = ["no-entrypoint"] 15 | default = [] 16 | 17 | [dependencies] 18 | anchor-lang = "0.13.2" 19 | anchor-spl = "0.13.2" 20 | solana-program = "=1.7.8" 21 | -------------------------------------------------------------------------------- /migrations/deploy.js: -------------------------------------------------------------------------------- 1 | 2 | // Migrations are an early feature. Currently, they're nothing more than this 3 | // single deploy script that's invoked from the CLI, injecting a provider 4 | // configured from the workspace's Anchor.toml. 5 | 6 | const anchor = require("@project-serum/anchor"); 7 | 8 | module.exports = async function (provider) { 9 | // Configure client to use the provider. 10 | anchor.setProvider(provider); 11 | 12 | // Add your deploy script here. 13 | } 14 | -------------------------------------------------------------------------------- /scripts/list-market.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Script to list a permissioned market, logging the address to stdout. 4 | 5 | const utils = require("../tests/utils"); 6 | const utilsCmn = require("../tests/utils/common"); 7 | const anchor = require("@project-serum/anchor"); 8 | const provider = anchor.Provider.local(); 9 | const program = anchor.workspace.PermissionedMarkets; 10 | const Account = anchor.web3.Account; 11 | 12 | async function main() { 13 | const { marketProxyClient } = await utils.genesis({ 14 | provider, 15 | proxyProgramId: utilsCmn.PROGRAM_KP.publicKey, 16 | }); 17 | const out = { 18 | market: marketProxyClient.market.address.toString(), 19 | }; 20 | console.log(JSON.stringify(out)); 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: bionic 2 | language: rust 3 | rust: 4 | - stable 5 | env: 6 | global: 7 | - NODE_VERSION="v14.7.0" 8 | - SOLANA_VERSION="v1.7.8" 9 | git: 10 | submodules: true 11 | 12 | _defaults: &defaults 13 | before_install: 14 | - nvm install $NODE_VERSION 15 | - sudo apt-get install -y pkg-config build-essential libudev-dev 16 | - sh -c "$(curl -sSfL https://release.solana.com/${SOLANA_VERSION}/install)" 17 | - export PATH="/home/travis/.local/share/solana/install/active_release/bin:$PATH" 18 | - export NODE_PATH="/home/travis/.nvm/versions/node/${NODE_VERSION}/lib/node_modules/:${NODE_PATH}" 19 | - yes | solana-keygen new 20 | - yarn 21 | 22 | jobs: 23 | include: 24 | - <<: *defaults 25 | name: Builds and runs the tests 26 | script: 27 | - yarn build 28 | - yarn test 29 | -------------------------------------------------------------------------------- /tests/utils/common.js: -------------------------------------------------------------------------------- 1 | const { PublicKey, Account } = require("@project-serum/anchor").web3; 2 | 3 | const DEX_PID = new PublicKey("9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin"); 4 | 5 | // This msut be kept in sync with `scripts/localnet.sh`. 6 | const PROGRAM_KP = new Account([ 7 | 168, 8 | 86, 9 | 206, 10 | 125, 11 | 127, 12 | 105, 13 | 201, 14 | 250, 15 | 37, 16 | 102, 17 | 161, 18 | 124, 19 | 80, 20 | 181, 21 | 60, 22 | 2, 23 | 166, 24 | 123, 25 | 176, 26 | 161, 27 | 228, 28 | 188, 29 | 134, 30 | 186, 31 | 158, 32 | 68, 33 | 197, 34 | 240, 35 | 202, 36 | 193, 37 | 174, 38 | 234, 39 | 167, 40 | 123, 41 | 252, 42 | 186, 43 | 72, 44 | 51, 45 | 203, 46 | 70, 47 | 153, 48 | 234, 49 | 190, 50 | 2, 51 | 134, 52 | 184, 53 | 197, 54 | 156, 55 | 113, 56 | 8, 57 | 65, 58 | 1, 59 | 83, 60 | 220, 61 | 152, 62 | 62, 63 | 200, 64 | 174, 65 | 40, 66 | 180, 67 | 218, 68 | 61, 69 | 224, 70 | 6, 71 | ]); 72 | 73 | function sleep(ms) { 74 | return new Promise((resolve) => setTimeout(resolve, ms)); 75 | } 76 | 77 | module.exports = { 78 | sleep, 79 | DEX_PID, 80 | PROGRAM_KP, 81 | }; 82 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "permissioned-markets-quickstart", 3 | "version": "1.0.0", 4 | "description": "This repo demonstrates how to create \"permissioned markets\" on Serum via a proxy smart contract. A permissioned market is a regular Serum market with an additional open orders authority, which must sign every transaction to create an open orders account.", 5 | "main": "index.js", 6 | "directories": { 7 | "test": "tests" 8 | }, 9 | "scripts": { 10 | "test": "anchor test", 11 | "localnet": "./scripts/localnet.sh", 12 | "build": "yarn build:dex && anchor build", 13 | "build:dex": "cd deps/serum-dex/dex/ && cargo build-bpf && cd ../../../" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/project-serum/permissioned-markets-quickstart.git" 18 | }, 19 | "author": "", 20 | "license": "ISC", 21 | "bugs": { 22 | "url": "https://github.com/project-serum/permissioned-markets-quickstart/issues" 23 | }, 24 | "homepage": "https://github.com/project-serum/permissioned-markets-quickstart#readme", 25 | "devDependencies": { 26 | "@project-serum/anchor": "^0.13.2", 27 | "@project-serum/anchor-cli": "^0.13.2", 28 | "@project-serum/common": "^0.0.1-beta.3", 29 | "@project-serum/serum": "^0.13.55", 30 | "@solana/spl-token": "^0.1.6", 31 | "mocha": "^9.0.3" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tests/utils/market-proxy.js: -------------------------------------------------------------------------------- 1 | const anchor = require("@project-serum/anchor"); 2 | const { 3 | PublicKey, 4 | SYSVAR_RENT_PUBKEY, 5 | SYSVAR_CLOCK_PUBKEY, 6 | } = require("@solana/web3.js"); 7 | const { 8 | OpenOrders, 9 | OpenOrdersPda, 10 | Logger, 11 | ReferralFees, 12 | MarketProxyBuilder, 13 | } = require("@project-serum/serum"); 14 | 15 | // Returns a client for the market proxy. 16 | // 17 | // If changing the program, one will likely need to change the builder/middleware 18 | // here as well. 19 | async function load(connection, proxyProgramId, dexProgramId, market) { 20 | return new MarketProxyBuilder() 21 | .middleware( 22 | new OpenOrdersPda({ 23 | proxyProgramId, 24 | dexProgramId, 25 | }) 26 | ) 27 | .middleware(new ReferralFees()) 28 | .middleware(new Identity()) 29 | .middleware(new Logger()) 30 | .load({ 31 | connection, 32 | market, 33 | dexProgramId, 34 | proxyProgramId, 35 | options: { commitment: "recent" }, 36 | }); 37 | } 38 | 39 | // Dummy identity middleware used for testing. 40 | class Identity { 41 | initOpenOrders(ix) { 42 | this.proxy(ix); 43 | } 44 | newOrderV3(ix) { 45 | this.proxy(ix); 46 | } 47 | cancelOrderV2(ix) { 48 | this.proxy(ix); 49 | } 50 | cancelOrderByClientIdV2(ix) { 51 | this.proxy(ix); 52 | } 53 | settleFunds(ix) { 54 | this.proxy(ix); 55 | } 56 | closeOpenOrders(ix) { 57 | this.proxy(ix); 58 | } 59 | prune(ix) { 60 | this.proxyRevoked(ix); 61 | } 62 | proxy(ix) { 63 | ix.keys = [ 64 | { pubkey: SYSVAR_RENT_PUBKEY, isWritable: false, isSigner: false }, 65 | ...ix.keys, 66 | ]; 67 | } 68 | proxyRevoked(ix) { 69 | ix.keys = [ 70 | { pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false, isSigner: false }, 71 | ...ix.keys, 72 | ]; 73 | } 74 | static async pruneAuthority(market, dexProgramId, proxyProgramId) { 75 | const [addr] = await PublicKey.findProgramAddress( 76 | [ 77 | anchor.utils.bytes.utf8.encode("prune"), 78 | dexProgramId.toBuffer(), 79 | market.toBuffer(), 80 | ], 81 | proxyProgramId 82 | ); 83 | return addr; 84 | } 85 | } 86 | 87 | module.exports = { 88 | load, 89 | Identity, 90 | }; 91 | -------------------------------------------------------------------------------- /tests/utils/index.js: -------------------------------------------------------------------------------- 1 | const { BN } = require("@project-serum/anchor"); 2 | const { PublicKey } = require("@project-serum/anchor").web3; 3 | const marketProxy = require("./market-proxy"); 4 | const marketLister = require("./market-lister"); 5 | const faucet = require("./faucet"); 6 | const { DEX_PID } = require("./common"); 7 | const marketMaker = require("./market-maker"); 8 | 9 | // Initializes the genesis state for the tests and localnetwork. 10 | async function genesis({ provider, proxyProgramId }) { 11 | // 12 | // Create all mints and funded god accounts. 13 | // 14 | const mintGods = await faucet.createMintGods(provider, 2); 15 | const [mintGodA, mintGodB] = mintGods; 16 | 17 | // 18 | // Fund an additional account. 19 | // 20 | const fundedAccount = await faucet.createFundedAccount( 21 | provider, 22 | mintGods.map((mintGod) => { 23 | return { 24 | ...mintGod, 25 | amount: new BN("10000000000000").muln(10 ** faucet.DECIMALS), 26 | }; 27 | }), 28 | marketMaker.KEYPAIR 29 | ); 30 | 31 | // 32 | // Structure the market maker object. 33 | // 34 | const marketMakerAccounts = { 35 | ...fundedAccount, 36 | baseToken: fundedAccount.tokens[mintGodA.mint.toString()], 37 | quoteToken: fundedAccount.tokens[mintGodB.mint.toString()], 38 | }; 39 | 40 | // 41 | // List the market. 42 | // 43 | const [marketAPublicKey] = await marketLister.list({ 44 | connection: provider.connection, 45 | wallet: provider.wallet, 46 | baseMint: mintGodA.mint, 47 | quoteMint: mintGodB.mint, 48 | baseLotSize: 100000, 49 | quoteLotSize: 100, 50 | dexProgramId: DEX_PID, 51 | proxyProgramId, 52 | feeRateBps: 0, 53 | }); 54 | 55 | // 56 | // Load a proxy client for the market. 57 | // 58 | const marketProxyClient = await marketProxy.load( 59 | provider.connection, 60 | proxyProgramId, 61 | DEX_PID, 62 | marketAPublicKey 63 | ); 64 | 65 | // 66 | // Market maker initializes an open orders account. 67 | // 68 | await marketMaker.initOpenOrders( 69 | provider, 70 | marketProxyClient, 71 | marketMakerAccounts 72 | ); 73 | 74 | // 75 | // Market maker posts trades on the orderbook. 76 | // 77 | await marketMaker.postOrders( 78 | provider, 79 | marketProxyClient, 80 | marketMakerAccounts 81 | ); 82 | 83 | // 84 | // Done. 85 | // 86 | return { 87 | marketProxyClient, 88 | mintA: mintGodA.mint, 89 | usdc: mintGodB.mint, 90 | godA: mintGodA.god, 91 | godUsdc: mintGodB.god, 92 | }; 93 | } 94 | 95 | module.exports = { 96 | genesis, 97 | DEX_PID, 98 | }; 99 | -------------------------------------------------------------------------------- /tests/utils/faucet.js: -------------------------------------------------------------------------------- 1 | const anchor = require("@project-serum/anchor"); 2 | const BN = anchor.BN; 3 | const { Account, Transaction, SystemProgram } = anchor.web3; 4 | const serumCmn = require("@project-serum/common"); 5 | const { TOKEN_PROGRAM_ID, Token } = require("@solana/spl-token"); 6 | 7 | const DECIMALS = 6; 8 | 9 | // Creates mints and a token account funded with each mint. 10 | async function createMintGods(provider, mintCount) { 11 | // Setup mints with initial tokens owned by the provider. 12 | 13 | let mintGods = []; 14 | for (let k = 0; k < mintCount; k += 1) { 15 | const [mint, god] = await serumCmn.createMintAndVault( 16 | provider, 17 | new BN("1000000000000000000"), 18 | undefined, 19 | DECIMALS 20 | ); 21 | mintGods.push({ mint, god }); 22 | } 23 | 24 | return mintGods; 25 | } 26 | 27 | async function createFundedAccount(provider, mints, newAccount) { 28 | if (!newAccount) { 29 | newAccount = new Account(); 30 | } 31 | 32 | const marketMaker = { 33 | tokens: {}, 34 | account: newAccount, 35 | }; 36 | 37 | // Transfer lamports to market maker. 38 | await provider.send( 39 | (() => { 40 | const tx = new Transaction(); 41 | tx.add( 42 | SystemProgram.transfer({ 43 | fromPubkey: provider.wallet.publicKey, 44 | toPubkey: newAccount.publicKey, 45 | lamports: 100000000000, 46 | }) 47 | ); 48 | return tx; 49 | })() 50 | ); 51 | 52 | // Transfer SPL tokens to the market maker. 53 | for (let k = 0; k < mints.length; k += 1) { 54 | const { mint, god, amount } = mints[k]; 55 | let MINT_A = mint; 56 | let GOD_A = god; 57 | // Setup token accounts owned by the market maker. 58 | const mintAClient = new Token( 59 | provider.connection, 60 | MINT_A, 61 | TOKEN_PROGRAM_ID, 62 | provider.wallet.payer // node only 63 | ); 64 | const marketMakerTokenA = await mintAClient.createAccount( 65 | newAccount.publicKey 66 | ); 67 | 68 | await provider.send( 69 | (() => { 70 | const tx = new Transaction(); 71 | tx.add( 72 | Token.createTransferCheckedInstruction( 73 | TOKEN_PROGRAM_ID, 74 | GOD_A, 75 | MINT_A, 76 | marketMakerTokenA, 77 | provider.wallet.publicKey, 78 | [], 79 | amount, 80 | DECIMALS 81 | ) 82 | ); 83 | return tx; 84 | })() 85 | ); 86 | 87 | marketMaker.tokens[mint.toString()] = marketMakerTokenA; 88 | } 89 | 90 | return marketMaker; 91 | } 92 | 93 | module.exports = { 94 | createMintGods, 95 | createFundedAccount, 96 | DECIMALS, 97 | }; 98 | -------------------------------------------------------------------------------- /scripts/localnet.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ################################################################################ 4 | # 5 | # localnet.sh runs a localnet with a permissioned market up and running. 6 | # 7 | # Usage: 8 | # 9 | # ./localnet.sh 10 | # 11 | # Installation: 12 | # 13 | # Before using, one must make sure to have the serum crank software built or 14 | # installed locally on one's machine. To build, clone the serum dex and run 15 | # `cargo build` inside `serum-dex/dex/crank`. Then change the $CRANK variable 16 | # below. 17 | # 18 | ################################################################################ 19 | 20 | DEX_PID="9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" 21 | PAYER_FILEPATH="$HOME/.config/solana/id.json" 22 | 23 | # 24 | # If the crank cli isn't installed, use a local path. 25 | # Replace the path below if you'd like to use your own build. 26 | # 27 | CRANK=$(which crank) 28 | if [ $? -ne 0 ]; then 29 | CRANK="" 30 | fi 31 | 32 | LOG_DIR="./localnet-logs" 33 | VALIDATOR_OUT="${LOG_DIR}/validator-stdout.txt" 34 | CRANK_LOGS="${LOG_DIR}/crank-logs.txt" 35 | CRANK_STDOUT="${LOG_DIR}/crank-stdout.txt" 36 | TRADE_BOT_STDOUT="${LOG_DIR}/trade-bot-stdout.txt" 37 | 38 | echo "CRANK: $CRANK" 39 | set -euo pipefail 40 | 41 | main () { 42 | # 43 | # Cleanup. 44 | # 45 | echo "Cleaning old output files..." 46 | mkdir -p $LOG_DIR 47 | rm -rf test-ledger 48 | rm -f $TRADE_BOT_STDOUT 49 | rm -f $VALIDATOR_OUT 50 | rm -f $CRANK_LOGS && touch $CRANK_LOGS 51 | 52 | # 53 | # Bootup cluster. 54 | # 55 | echo "Starting local network..." 56 | solana-test-validator \ 57 | --bpf-program 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin ./deps/serum-dex/dex/target/deploy/serum_dex.so \ 58 | --bpf-program CGnjwsdrQfJpiXqeAe1p13pUsfZnS9rgEy1DWKimGHqo ./target/deploy/permissioned_markets.so > $VALIDATOR_OUT & 59 | sleep 2 60 | 61 | # 62 | # List market at a predetermined address. 63 | # 64 | local market="FcZntrVjDRPv8JnU2mHt8ejvvA1eiHqxM8d8JNEC8q9q" 65 | echo "Listing market $market..." 66 | ./scripts/list-market.js 67 | sleep 10 68 | echo "Market listed $market" 69 | 70 | echo "Run the trade bot" 71 | ./scripts/trade-bot.js $market > $TRADE_BOT_STDOUT & 72 | 73 | echo "Running crank..." 74 | $CRANK localnet consume-events \ 75 | -c $market \ 76 | -d $DEX_PID -e 5 \ 77 | --log-directory $CRANK_LOGS \ 78 | --market $market \ 79 | --num-workers 1 \ 80 | --payer $PAYER_FILEPATH \ 81 | --pc-wallet $market > $CRANK_STDOUT & 82 | 83 | # 84 | # Park. 85 | # 86 | echo "Localnet running..." 87 | echo "Ctl-c to exit." 88 | wait 89 | } 90 | 91 | cleanup() { 92 | pkill -P $$ || true 93 | wait || true 94 | } 95 | 96 | trap_add() { 97 | trap_add_cmd=$1; shift || fatal "${FUNCNAME} usage error" 98 | for trap_add_name in "$@"; do 99 | trap -- "$( 100 | extract_trap_cmd() { printf '%s\n' "${3:-}"; } 101 | eval "extract_trap_cmd $(trap -p "${trap_add_name}")" 102 | printf '%s\n' "${trap_add_cmd}" 103 | )" "${trap_add_name}" \ 104 | || fatal "unable to add to trap ${trap_add_name}" 105 | done 106 | } 107 | 108 | declare -f -t trap_add 109 | trap_add 'cleanup' EXIT 110 | main 111 | -------------------------------------------------------------------------------- /tests/utils/market-maker.js: -------------------------------------------------------------------------------- 1 | const { Account, Transaction } = require("@project-serum/anchor").web3; 2 | const { OpenOrdersPda } = require("@project-serum/serum"); 3 | 4 | // Dummy keypair. 5 | const KEYPAIR = new Account([ 6 | 54, 7 | 213, 8 | 91, 9 | 255, 10 | 163, 11 | 120, 12 | 88, 13 | 183, 14 | 223, 15 | 23, 16 | 220, 17 | 204, 18 | 82, 19 | 117, 20 | 212, 21 | 214, 22 | 118, 23 | 184, 24 | 2, 25 | 29, 26 | 89, 27 | 149, 28 | 22, 29 | 233, 30 | 108, 31 | 177, 32 | 60, 33 | 249, 34 | 218, 35 | 166, 36 | 30, 37 | 221, 38 | 59, 39 | 168, 40 | 233, 41 | 123, 42 | 204, 43 | 37, 44 | 123, 45 | 124, 46 | 86, 47 | 176, 48 | 214, 49 | 12, 50 | 63, 51 | 195, 52 | 231, 53 | 15, 54 | 1, 55 | 143, 56 | 7, 57 | 7, 58 | 232, 59 | 38, 60 | 69, 61 | 214, 62 | 45, 63 | 58, 64 | 115, 65 | 55, 66 | 129, 67 | 25, 68 | 228, 69 | 30, 70 | ]); 71 | 72 | async function initOpenOrders(provider, marketProxy, marketMakerAccounts) { 73 | const tx = new Transaction(); 74 | tx.add( 75 | marketProxy.instruction.initOpenOrders( 76 | marketMakerAccounts.account.publicKey, 77 | marketProxy.market.address, 78 | marketProxy.market.address, // Dummy. Replaced by middleware. 79 | marketProxy.market.address // Dummy. Replaced by middleware. 80 | ) 81 | ); 82 | let signers = [marketMakerAccounts.account]; 83 | await provider.send(tx, signers); 84 | } 85 | 86 | async function postOrders(provider, marketProxy, marketMakerAccounts) { 87 | const asks = [ 88 | [6.041, 7.8], 89 | [6.051, 72.3], 90 | [6.055, 5.4], 91 | [6.067, 15.7], 92 | [6.077, 390.0], 93 | [6.09, 24.0], 94 | [6.11, 36.3], 95 | [6.133, 300.0], 96 | [6.167, 687.8], 97 | ]; 98 | const bids = [ 99 | [6.004, 8.5], 100 | [5.995, 12.9], 101 | [5.987, 6.2], 102 | [5.978, 15.3], 103 | [5.965, 82.8], 104 | [5.961, 25.4], 105 | ]; 106 | const openOrdersAddressKey = await OpenOrdersPda.openOrdersAddress( 107 | marketProxy.market.address, 108 | marketMakerAccounts.account.publicKey, 109 | marketProxy.dexProgramId, 110 | marketProxy.proxyProgramId 111 | ); 112 | // Use an explicit signer because the provider wallet, which pays for 113 | // the tx, is different from the market maker wallet. 114 | let signers = [marketMakerAccounts.account]; 115 | for (let k = 0; k < asks.length; k += 1) { 116 | let ask = asks[k]; 117 | const tx = new Transaction(); 118 | tx.add( 119 | await marketProxy.instruction.newOrderV3({ 120 | owner: marketMakerAccounts.account.publicKey, 121 | payer: marketMakerAccounts.baseToken, 122 | side: "sell", 123 | price: ask[0], 124 | size: ask[1], 125 | orderType: "postOnly", 126 | clientId: undefined, 127 | openOrdersAddressKey, 128 | feeDiscountPubkey: null, 129 | selfTradeBehavior: "abortTransaction", 130 | }) 131 | ); 132 | await provider.send(tx, signers); 133 | } 134 | 135 | for (let k = 0; k < bids.length; k += 1) { 136 | let bid = bids[k]; 137 | const tx = new Transaction(); 138 | tx.add( 139 | await marketProxy.instruction.newOrderV3({ 140 | owner: marketMakerAccounts.account.publicKey, 141 | payer: marketMakerAccounts.quoteToken, 142 | side: "buy", 143 | price: bid[0], 144 | size: bid[1], 145 | orderType: "postOnly", 146 | clientId: undefined, 147 | openOrdersAddressKey, 148 | feeDiscountPubkey: null, 149 | selfTradeBehavior: "abortTransaction", 150 | }) 151 | ); 152 | await provider.send(tx, signers); 153 | } 154 | } 155 | 156 | module.exports = { 157 | postOrders, 158 | initOpenOrders, 159 | KEYPAIR, 160 | }; 161 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Permissioned Markets 2 | 3 | This repo demonstrates how to create "permissioned markets" on Serum via a proxy smart contract. 4 | A permissioned market is a regular Serum market with an additional 5 | open orders authority, which must sign every transaction to create an 6 | open orders account. 7 | 8 | In practice, what this means is that one can create a program that acts 9 | as this authority *and* that marks its own PDAs as the *owner* of all 10 | created open orders accounts, making the program the sole arbiter over 11 | who can trade on a given market. 12 | 13 | For example, this program forces all trades that execute on this market 14 | to set the referral to a hardcoded address--`referral::ID`--and requires 15 | the client to pass in an identity token, authorizing the user. 16 | 17 | See the [code](https://github.com/project-serum/permissioned-markets-quickstart/blob/master/programs/permissioned-markets/src/lib.rs). 18 | 19 | ## Developing 20 | 21 | This program requires building the Serum DEX from source, which is done using 22 | git submodules. 23 | 24 | ### Install Submodules 25 | 26 | Pull the source 27 | 28 | ```bash 29 | git submodule init 30 | git submodule update 31 | ``` 32 | 33 | ### Install Dependencies 34 | 35 | [Anchor](https://github.com/project-serum/anchor) is used for development, and it's 36 | recommended workflow is used here. To get started, see the [guide](https://project-serum.github.io/anchor/getting-started/introduction.html). 37 | 38 | To install Anchor and all local dependencies, run 39 | 40 | ```bash 41 | yarn 42 | ``` 43 | 44 | ### Build 45 | 46 | To build, run 47 | 48 | ```bash 49 | yarn build 50 | ``` 51 | 52 | ### Test 53 | 54 | A set of integration tests are provided. See these for an example of how to use a 55 | permissioned market from JavaScript. 56 | 57 | ```bash 58 | yarn test 59 | ``` 60 | 61 | ### Localnet 62 | 63 | To start a localnetwork with both the dex and proxy deployed and an orderbook 64 | listed with posted orders, first install the "crank" cli. 65 | 66 | ```bash 67 | cargo install --git https://github.com/project-serum/serum-dex crank --locked --tag v0.4.0 68 | ``` 69 | 70 | Then run, 71 | 72 | ```bash 73 | yarn localnet 74 | ``` 75 | 76 | ### Connect a GUI 77 | 78 | To connect a GUI to the localnet, either run one locally or go to 79 | dex.projectserum.com and select the *localnet* network and enter the 80 | market address: `FcZntrVjDRPv8JnU2mHt8ejvvA1eiHqxM8d8JNEC8q9q`. 81 | 82 | In short, go to this [link](https://dex.projectserum.com/#/market/FcZntrVjDRPv8JnU2mHt8ejvvA1eiHqxM8d8JNEC8q9q). 83 | 84 | Don't forget to click the `+` button to "Add a custom market" so that the GUI 85 | can recognize the market running locally. 86 | 87 | ## Extending the Proxy 88 | 89 | To implement a custom proxy, one can implement the [MarketMiddleware](https://github.com/project-serum/permissioned-markets-quickstart/blob/master/programs/permissioned-markets/src/lib.rs#L71) trait 90 | to intercept, modify, and perform any access control on DEX requests before 91 | they get forwarded to the orderbook. These middleware can be mixed and 92 | matched. Note, however, that the order of middleware matters since they can 93 | mutate the request. 94 | 95 | One useful pattern is to treat the request like layers of an onion, where 96 | each middleware unwraps the request by stripping accounts and instruction 97 | data before relaying it to the next middleware and ultimately to the 98 | orderbook. This allows one to easily extend the behavior of a proxy by 99 | adding a custom middleware that may process information that is unknown to 100 | any other middleware or to the DEX. 101 | 102 | After adding a middleware, the only additional requirement, of course, is 103 | to make sure the client sending transactions does the same, but in reverse. 104 | It should wrap the transaction in the opposite order. For convenience, an 105 | identical abstraction is provided in the JavaScript [client](https://github.com/project-serum/permissioned-markets-quickstart/blob/master/tests/utils/market-proxy.js#L15). 106 | 107 | ## Alternatives to Middleware 108 | 109 | Note that this middleware abstraction is not required to host a 110 | permissioned market. One could write a regular program that manages the PDAs 111 | and CPI invocations oneself. 112 | -------------------------------------------------------------------------------- /scripts/trade-bot.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Script to infinitely post orders that are immediately filled. 4 | 5 | const process = require("process"); 6 | const anchor = require("@project-serum/anchor"); 7 | const PublicKey = anchor.web3.PublicKey; 8 | const marketMaker = require("../tests/utils/market-maker"); 9 | 10 | const MARKET_MAKER = marketMaker.KEYPAIR; 11 | 12 | async function main() { 13 | const market = new PublicKey(process.argv[2]); 14 | const provider = anchor.Provider.local(); 15 | // TODO: enable the trade bot. 16 | // runTradeBot(market, provider); 17 | } 18 | 19 | async function runTradeBot(market, provider, iterations = undefined) { 20 | const marketProxyClient = marketProxy.load( 21 | provider.connection, 22 | proxyProgramId, 23 | DEX_PID, 24 | market 25 | ); 26 | const baseTokenUser1 = ( 27 | await marketProxyClient.market.getTokenAccountsByOwnerForMint( 28 | provider.connection, 29 | MARKET_MAKER.publicKey, 30 | marketProxyClient.market.baseMintAddress 31 | ) 32 | )[0].pubkey; 33 | const quoteTokenUser1 = ( 34 | await marketProxyClient.market.getTokenAccountsByOwnerForMint( 35 | provider.connection, 36 | MARKET_MAKER.publicKey, 37 | marketProxyClient.market.quoteMintAddress 38 | ) 39 | )[0].pubkey; 40 | 41 | const baseTokenUser2 = ( 42 | await marketProxyClient.market.getTokenAccountsByOwnerForMint( 43 | provider.connection, 44 | provider.wallet.publicKey, 45 | marketProxyClient.market.baseMintAddress 46 | ) 47 | )[0].pubkey; 48 | const quoteTokenUser2 = ( 49 | await marketProxyClient.market.getTokenAccountsByOwnerForMint( 50 | provider.connection, 51 | provider.wallet.publicKey, 52 | marketProxyClient.market.quoteMintAddress 53 | ) 54 | )[0].pubkey; 55 | 56 | const makerOpenOrdersUser1 = ( 57 | await OpenOrders.findForMarketAndOwner( 58 | provider.connection, 59 | market, 60 | MARKET_MAKER.publicKey, 61 | DEX_PID 62 | ) 63 | )[0]; 64 | makerOpenOrdersUser2 = ( 65 | await OpenOrders.findForMarketAndOwner( 66 | provider.connection, 67 | market, 68 | provider.wallet.publicKey, 69 | DEX_PID 70 | ) 71 | )[0]; 72 | 73 | const price = 6.041; 74 | const size = 700000.8; 75 | 76 | let maker = MARKET_MAKER; 77 | let taker = provider.wallet.payer; 78 | let baseToken = baseTokenUser1; 79 | let quoteToken = quoteTokenUser2; 80 | let makerOpenOrders = makerOpenOrdersUser1; 81 | 82 | let k = 1; 83 | 84 | while (true) { 85 | if (iterations && k > iterations) { 86 | break; 87 | } 88 | const clientId = new BN(k); 89 | if (k % 5 === 0) { 90 | if (maker.publicKey.equals(MARKET_MAKER.publicKey)) { 91 | maker = provider.wallet.payer; 92 | makerOpenOrders = makerOpenOrdersUser2; 93 | taker = MARKET_MAKER; 94 | baseToken = baseTokenUser2; 95 | quoteToken = quoteTokenUser1; 96 | } else { 97 | maker = MARKET_MAKER; 98 | makerOpenOrders = makerOpenOrdersUser1; 99 | taker = provider.wallet.payer; 100 | baseToken = baseTokenUser1; 101 | quoteToken = quoteTokenUser2; 102 | } 103 | } 104 | 105 | // Post ask. 106 | const txAsk = new Transaction(); 107 | txAsk.add( 108 | await marketProxyClient.instruction.newOrderV3({ 109 | owner: maker, 110 | payer: baseToken, 111 | side: "sell", 112 | price, 113 | size, 114 | orderType: "postOnly", 115 | clientId, 116 | openOrdersAddressKey: undefined, 117 | openOrdersAccount: undefined, 118 | feeDiscountPubkey: null, 119 | selfTradeBehavior: "abortTransaction", 120 | }) 121 | ); 122 | let txSig = await provider.send(txAsk, [maker]); 123 | console.log("Ask", txSig); 124 | 125 | // Take. 126 | const txBid = new Transaction(); 127 | tx.add( 128 | await marketProxyClient.instruction.newOrderV3({ 129 | owner: taker, 130 | payer: quoteToken, 131 | side: "buy", 132 | price, 133 | size, 134 | orderType: "ioc", 135 | clientId: undefined, 136 | openOrdersAddressKey: undefined, 137 | openOrdersAccount: undefined, 138 | feeDiscountPubkey: null, 139 | selfTradeBehavior: "abortTransaction", 140 | }) 141 | ); 142 | txSig = await provider.send(txBid, [taker]); 143 | console.log("Bid", txSig); 144 | 145 | await sleep(1000); 146 | 147 | // Cancel anything remaining. 148 | try { 149 | const tx = new Transaction(); 150 | tx.add( 151 | marketProxyClient.instruction.cancelOrderByClientId( 152 | provider.connection, 153 | maker.publicKey, 154 | makerOpenOrders.address, 155 | clientId 156 | ) 157 | ); 158 | txSig = await provider.send(tx, [maker]); 159 | console.log("Cancelled the rest", txSig); 160 | await sleep(1000); 161 | } catch (e) { 162 | console.log("Unable to cancel order", e); 163 | } 164 | k += 1; 165 | 166 | // If the open orders account wasn't previously initialized, it is now. 167 | if (makerOpenOrdersUser2 === undefined) { 168 | makerOpenOrdersUser2 = ( 169 | await OpenOrders.findForMarketAndOwner( 170 | provider.connection, 171 | market, 172 | provider.wallet.publicKey, 173 | DEX_PID 174 | ) 175 | )[0]; 176 | } 177 | } 178 | } 179 | 180 | main(); 181 | -------------------------------------------------------------------------------- /tests/utils/market-lister.js: -------------------------------------------------------------------------------- 1 | const anchor = require("@project-serum/anchor"); 2 | const { BN } = anchor; 3 | const { 4 | Account, 5 | PublicKey, 6 | Transaction, 7 | SystemProgram, 8 | } = require("@project-serum/anchor").web3; 9 | const { TOKEN_PROGRAM_ID } = require("@solana/spl-token"); 10 | const serum = require("@project-serum/serum"); 11 | const { 12 | DexInstructions, 13 | TokenInstructions, 14 | OpenOrdersPda, 15 | MARKET_STATE_LAYOUT_V3, 16 | } = serum; 17 | const { Identity } = require("./market-proxy"); 18 | const { DEX_PID } = require("./common"); 19 | 20 | // Creates a market on the dex. 21 | async function list({ 22 | connection, 23 | wallet, 24 | baseMint, 25 | quoteMint, 26 | baseLotSize, 27 | quoteLotSize, 28 | dexProgramId, 29 | proxyProgramId, 30 | feeRateBps, 31 | }) { 32 | const market = MARKET_KP; 33 | const requestQueue = new Account(); 34 | const eventQueue = new Account(); 35 | const bids = new Account(); 36 | const asks = new Account(); 37 | const baseVault = new Account(); 38 | const quoteVault = new Account(); 39 | const quoteDustThreshold = new BN(100); 40 | 41 | const [vaultOwner, vaultSignerNonce] = await getVaultOwnerAndNonce( 42 | market.publicKey, 43 | dexProgramId 44 | ); 45 | 46 | const tx1 = new Transaction(); 47 | tx1.add( 48 | SystemProgram.createAccount({ 49 | fromPubkey: wallet.publicKey, 50 | newAccountPubkey: baseVault.publicKey, 51 | lamports: await connection.getMinimumBalanceForRentExemption(165), 52 | space: 165, 53 | programId: TOKEN_PROGRAM_ID, 54 | }), 55 | SystemProgram.createAccount({ 56 | fromPubkey: wallet.publicKey, 57 | newAccountPubkey: quoteVault.publicKey, 58 | lamports: await connection.getMinimumBalanceForRentExemption(165), 59 | space: 165, 60 | programId: TOKEN_PROGRAM_ID, 61 | }), 62 | TokenInstructions.initializeAccount({ 63 | account: baseVault.publicKey, 64 | mint: baseMint, 65 | owner: vaultOwner, 66 | }), 67 | TokenInstructions.initializeAccount({ 68 | account: quoteVault.publicKey, 69 | mint: quoteMint, 70 | owner: vaultOwner, 71 | }) 72 | ); 73 | 74 | const tx2 = new Transaction(); 75 | tx2.add( 76 | SystemProgram.createAccount({ 77 | fromPubkey: wallet.publicKey, 78 | newAccountPubkey: market.publicKey, 79 | lamports: await connection.getMinimumBalanceForRentExemption( 80 | MARKET_STATE_LAYOUT_V3.span 81 | ), 82 | space: MARKET_STATE_LAYOUT_V3.span, 83 | programId: dexProgramId, 84 | }), 85 | SystemProgram.createAccount({ 86 | fromPubkey: wallet.publicKey, 87 | newAccountPubkey: requestQueue.publicKey, 88 | lamports: await connection.getMinimumBalanceForRentExemption(5120 + 12), 89 | space: 5120 + 12, 90 | programId: dexProgramId, 91 | }), 92 | SystemProgram.createAccount({ 93 | fromPubkey: wallet.publicKey, 94 | newAccountPubkey: eventQueue.publicKey, 95 | lamports: await connection.getMinimumBalanceForRentExemption(262144 + 12), 96 | space: 262144 + 12, 97 | programId: dexProgramId, 98 | }), 99 | SystemProgram.createAccount({ 100 | fromPubkey: wallet.publicKey, 101 | newAccountPubkey: bids.publicKey, 102 | lamports: await connection.getMinimumBalanceForRentExemption(65536 + 12), 103 | space: 65536 + 12, 104 | programId: dexProgramId, 105 | }), 106 | SystemProgram.createAccount({ 107 | fromPubkey: wallet.publicKey, 108 | newAccountPubkey: asks.publicKey, 109 | lamports: await connection.getMinimumBalanceForRentExemption(65536 + 12), 110 | space: 65536 + 12, 111 | programId: dexProgramId, 112 | }), 113 | DexInstructions.initializeMarket({ 114 | market: market.publicKey, 115 | requestQueue: requestQueue.publicKey, 116 | eventQueue: eventQueue.publicKey, 117 | bids: bids.publicKey, 118 | asks: asks.publicKey, 119 | baseVault: baseVault.publicKey, 120 | quoteVault: quoteVault.publicKey, 121 | baseMint, 122 | quoteMint, 123 | baseLotSize: new BN(baseLotSize), 124 | quoteLotSize: new BN(quoteLotSize), 125 | feeRateBps, 126 | vaultSignerNonce, 127 | quoteDustThreshold, 128 | programId: dexProgramId, 129 | authority: await OpenOrdersPda.marketAuthority( 130 | market.publicKey, 131 | DEX_PID, 132 | proxyProgramId 133 | ), 134 | pruneAuthority: await Identity.pruneAuthority( 135 | market.publicKey, 136 | DEX_PID, 137 | proxyProgramId 138 | ), 139 | }) 140 | ); 141 | 142 | const transactions = [ 143 | { transaction: tx1, signers: [baseVault, quoteVault] }, 144 | { 145 | transaction: tx2, 146 | signers: [market, requestQueue, eventQueue, bids, asks], 147 | }, 148 | ]; 149 | for (let tx of transactions) { 150 | await anchor.getProvider().send(tx.transaction, tx.signers); 151 | } 152 | const acc = await connection.getAccountInfo(market.publicKey); 153 | 154 | return [market.publicKey, vaultOwner]; 155 | } 156 | 157 | async function getVaultOwnerAndNonce(marketPublicKey, dexProgramId = DEX_PID) { 158 | const nonce = new BN(0); 159 | while (nonce.toNumber() < 255) { 160 | try { 161 | const vaultOwner = await PublicKey.createProgramAddress( 162 | [marketPublicKey.toBuffer(), nonce.toArrayLike(Buffer, "le", 8)], 163 | dexProgramId 164 | ); 165 | return [vaultOwner, nonce]; 166 | } catch (e) { 167 | nonce.iaddn(1); 168 | } 169 | } 170 | throw new Error("Unable to find nonce"); 171 | } 172 | 173 | // Dummy keypair for a consistent market address. Helpful when doing UI work. 174 | // Don't use in production. 175 | const MARKET_KP = new Account([ 176 | 13, 177 | 174, 178 | 53, 179 | 150, 180 | 78, 181 | 228, 182 | 12, 183 | 98, 184 | 170, 185 | 254, 186 | 212, 187 | 211, 188 | 125, 189 | 193, 190 | 2, 191 | 241, 192 | 97, 193 | 137, 194 | 49, 195 | 209, 196 | 189, 197 | 199, 198 | 27, 199 | 215, 200 | 220, 201 | 65, 202 | 57, 203 | 203, 204 | 215, 205 | 93, 206 | 105, 207 | 203, 208 | 217, 209 | 32, 210 | 5, 211 | 194, 212 | 157, 213 | 118, 214 | 162, 215 | 47, 216 | 102, 217 | 126, 218 | 235, 219 | 65, 220 | 99, 221 | 80, 222 | 56, 223 | 231, 224 | 217, 225 | 114, 226 | 25, 227 | 225, 228 | 239, 229 | 140, 230 | 169, 231 | 92, 232 | 150, 233 | 146, 234 | 211, 235 | 218, 236 | 183, 237 | 139, 238 | 9, 239 | 104, 240 | ]); 241 | 242 | module.exports = { 243 | list, 244 | }; 245 | -------------------------------------------------------------------------------- /programs/permissioned-markets/src/lib.rs: -------------------------------------------------------------------------------- 1 | // Note. This example depends on unreleased Serum DEX changes. 2 | 3 | use anchor_lang::prelude::*; 4 | use anchor_spl::dex::serum_dex::instruction::{CancelOrderInstructionV2, NewOrderInstructionV3}; 5 | use anchor_spl::dex::{ 6 | Context, Logger, MarketMiddleware, MarketProxy, OpenOrdersPda, ReferralFees, 7 | }; 8 | use solana_program::account_info::AccountInfo; 9 | use solana_program::entrypoint::ProgramResult; 10 | use solana_program::pubkey::Pubkey; 11 | use solana_program::sysvar::rent; 12 | 13 | /// # Permissioned Markets 14 | /// 15 | /// This demonstrates how to create "permissioned markets" on Serum via a proxy. 16 | /// A permissioned market is a regular Serum market with an additional 17 | /// open orders authority, which must sign every transaction to create an open 18 | /// orders account. 19 | /// 20 | /// In practice, what this means is that one can create a program that acts 21 | /// as this authority *and* that marks its own PDAs as the *owner* of all 22 | /// created open orders accounts, making the program the sole arbiter over 23 | /// who can trade on a given market. 24 | /// 25 | /// For example, this example forces all trades that execute on this market 26 | /// to set the referral to a hardcoded address--`referral::ID`--and requires 27 | /// the client to pass in an identity token, authorizing the user. 28 | /// 29 | /// # Extending the proxy via middleware 30 | /// 31 | /// To implement a custom proxy, one can implement the `MarketMiddleware` trait 32 | /// to intercept, modify, and perform any access control on DEX requests before 33 | /// they get forwarded to the orderbook. These middleware can be mixed and 34 | /// matched. Note, however, that the order of middleware matters since they can 35 | /// mutate the request. 36 | /// 37 | /// One useful pattern is to treat the request like layers of an onion, where 38 | /// each middleware unwraps the request by stripping accounts and instruction 39 | /// data before relaying it to the next middleware and ultimately to the 40 | /// orderbook. This allows one to easily extend the behavior of a proxy by 41 | /// adding a custom middleware that may process information that is unknown to 42 | /// any other middleware or to the DEX. 43 | /// 44 | /// After adding a middleware, the only additional requirement, of course, is 45 | /// to make sure the client sending transactions does the same, but in reverse. 46 | /// It should wrap the transaction in the opposite order. For convenience, an 47 | /// identical abstraction is provided in the JavaScript client. 48 | /// 49 | /// # Alternatives to middleware 50 | /// 51 | /// Note that this middleware abstraction is not required to host a 52 | /// permissioned market. One could write a regular program that manages the PDAs 53 | /// and CPI invocations onesself, if desired. 54 | #[program] 55 | pub mod permissioned_markets { 56 | use super::*; 57 | pub fn entry(program_id: &Pubkey, accounts: &[AccountInfo], data: &[u8]) -> ProgramResult { 58 | MarketProxy::new() 59 | .middleware(&mut Logger) 60 | .middleware(&mut Identity) 61 | .middleware(&mut ReferralFees::new(referral::ID)) 62 | .middleware(&mut OpenOrdersPda::new()) 63 | .run(program_id, accounts, data) 64 | } 65 | } 66 | 67 | /// Performs token based authorization, confirming the identity of the user. 68 | /// The identity token must be given as the fist account. 69 | struct Identity; 70 | 71 | impl Identity { 72 | fn prepare_pda<'info>(acc_info: &AccountInfo<'info>) -> AccountInfo<'info> { 73 | let mut acc_info = acc_info.clone(); 74 | acc_info.is_signer = true; 75 | acc_info 76 | } 77 | } 78 | 79 | impl MarketMiddleware for Identity { 80 | /// Accounts: 81 | /// 82 | /// 0. Authorization token. 83 | /// .. 84 | fn init_open_orders(&self, ctx: &mut Context) -> ProgramResult { 85 | verify_and_strip_auth(ctx) 86 | } 87 | 88 | /// Accounts: 89 | /// 90 | /// 0. Authorization token. 91 | /// .. 92 | fn new_order_v3(&self, ctx: &mut Context, _ix: &NewOrderInstructionV3) -> ProgramResult { 93 | verify_and_strip_auth(ctx) 94 | } 95 | 96 | /// Accounts: 97 | /// 98 | /// 0. Authorization token. 99 | /// .. 100 | fn cancel_order_v2(&self, ctx: &mut Context, _ix: &CancelOrderInstructionV2) -> ProgramResult { 101 | verify_and_strip_auth(ctx) 102 | } 103 | 104 | /// Accounts: 105 | /// 106 | /// 0. Authorization token. 107 | /// .. 108 | fn cancel_order_by_client_id_v2(&self, ctx: &mut Context, _client_id: u64) -> ProgramResult { 109 | verify_and_strip_auth(ctx) 110 | } 111 | 112 | /// Accounts: 113 | /// 114 | /// 0. Authorization token. 115 | /// .. 116 | fn settle_funds(&self, ctx: &mut Context) -> ProgramResult { 117 | verify_and_strip_auth(ctx) 118 | } 119 | 120 | /// Accounts: 121 | /// 122 | /// 0. Authorization token. 123 | /// .. 124 | fn close_open_orders(&self, ctx: &mut Context) -> ProgramResult { 125 | verify_and_strip_auth(ctx) 126 | } 127 | 128 | /// Accounts: 129 | /// 130 | /// 0. Authorization token (revoked). 131 | /// .. 132 | fn prune(&self, ctx: &mut Context, _limit: u16) -> ProgramResult { 133 | verify_revoked_and_strip_auth(ctx)?; 134 | 135 | // Sign with the prune authority. 136 | let market = &ctx.accounts[0]; 137 | ctx.seeds.push(prune_authority! { 138 | program = ctx.program_id, 139 | dex_program = ctx.dex_program_id, 140 | market = market.key 141 | }); 142 | 143 | ctx.accounts[3] = Self::prepare_pda(&ctx.accounts[3]); 144 | Ok(()) 145 | } 146 | 147 | /// Accounts: 148 | /// 149 | /// 0. Authorization token. 150 | /// .. 151 | fn fallback(&self, ctx: &mut Context) -> ProgramResult { 152 | verify_and_strip_auth(ctx) 153 | } 154 | } 155 | 156 | // Utils. 157 | 158 | fn verify_and_strip_auth(ctx: &mut Context) -> ProgramResult { 159 | // The rent sysvar is used as a dummy example of an identity token. 160 | let auth = &ctx.accounts[0]; 161 | require!(auth.key == &rent::ID, InvalidAuth); 162 | 163 | // Strip off the account before possing on the message. 164 | ctx.accounts = (&ctx.accounts[1..]).to_vec(); 165 | 166 | Ok(()) 167 | } 168 | 169 | fn verify_revoked_and_strip_auth(ctx: &mut Context) -> ProgramResult { 170 | // The rent sysvar is used as a dummy example of an identity token. 171 | let auth = &ctx.accounts[0]; 172 | require!(auth.key != &rent::ID, TokenNotRevoked); 173 | 174 | // Strip off the account before possing on the message. 175 | ctx.accounts = (&ctx.accounts[1..]).to_vec(); 176 | 177 | Ok(()) 178 | } 179 | 180 | // Macros. 181 | 182 | /// Returns the seeds used for the prune authority. 183 | #[macro_export] 184 | macro_rules! prune_authority { 185 | ( 186 | program = $program:expr, 187 | dex_program = $dex_program:expr, 188 | market = $market:expr, 189 | bump = $bump:expr 190 | ) => { 191 | vec![ 192 | b"prune".to_vec(), 193 | $dex_program.as_ref().to_vec(), 194 | $market.as_ref().to_vec(), 195 | vec![$bump], 196 | ] 197 | }; 198 | ( 199 | program = $program:expr, 200 | dex_program = $dex_program:expr, 201 | market = $market:expr 202 | ) => { 203 | vec![ 204 | b"prune".to_vec(), 205 | $dex_program.as_ref().to_vec(), 206 | $market.as_ref().to_vec(), 207 | vec![ 208 | Pubkey::find_program_address( 209 | &[b"prune".as_ref(), $dex_program.as_ref(), $market.as_ref()], 210 | $program, 211 | ) 212 | .1, 213 | ], 214 | ] 215 | }; 216 | } 217 | 218 | // Error. 219 | 220 | #[error] 221 | pub enum ErrorCode { 222 | #[msg("Invalid auth token provided")] 223 | InvalidAuth, 224 | #[msg("Auth token not revoked")] 225 | TokenNotRevoked, 226 | } 227 | 228 | // Constants. 229 | 230 | pub mod referral { 231 | // This is a dummy address for testing. Do not use in production. 232 | solana_program::declare_id!("3oSfkjQZKCneYvsCTZc9HViGAPqR8pYr4h9YeGB5ZxHf"); 233 | } 234 | -------------------------------------------------------------------------------- /tests/permissioned-markets.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const { Token, TOKEN_PROGRAM_ID } = require("@solana/spl-token"); 3 | const anchor = require("@project-serum/anchor"); 4 | const serum = require("@project-serum/serum"); 5 | const { BN } = anchor; 6 | const { 7 | Keypair, 8 | Transaction, 9 | TransactionInstruction, 10 | PublicKey, 11 | SystemProgram, 12 | SYSVAR_RENT_PUBKEY, 13 | } = anchor.web3; 14 | const { 15 | DexInstructions, 16 | OpenOrders, 17 | OpenOrdersPda, 18 | Logger, 19 | ReferralFees, 20 | MarketProxyBuilder, 21 | } = serum; 22 | const { genesis, sleep } = require("./utils"); 23 | 24 | const DEX_PID = new PublicKey("9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin"); 25 | const REFERRAL_AUTHORITY = new PublicKey( 26 | "3oSfkjQZKCneYvsCTZc9HViGAPqR8pYr4h9YeGB5ZxHf" 27 | ); 28 | 29 | describe("permissioned-markets", () => { 30 | // Anchor client setup. 31 | const provider = anchor.Provider.env(); 32 | anchor.setProvider(provider); 33 | const program = anchor.workspace.PermissionedMarkets; 34 | 35 | // Token client. 36 | let usdcClient; 37 | 38 | // Global DEX accounts and clients shared accross all tests. 39 | let marketProxy, tokenAccount, usdcAccount; 40 | let openOrders, openOrdersBump, openOrdersInitAuthority, openOrdersBumpinit; 41 | let usdcPosted; 42 | let referralTokenAddress; 43 | 44 | it("BOILERPLATE: Initializes an orderbook", async () => { 45 | const { marketProxyClient, godA, godUsdc, usdc } = await genesis({ 46 | provider, 47 | proxyProgramId: program.programId, 48 | }); 49 | marketProxy = marketProxyClient; 50 | usdcAccount = godUsdc; 51 | tokenAccount = godA; 52 | 53 | usdcClient = new Token( 54 | provider.connection, 55 | usdc, 56 | TOKEN_PROGRAM_ID, 57 | provider.wallet.payer 58 | ); 59 | 60 | referral = await usdcClient.createAccount(REFERRAL_AUTHORITY); 61 | }); 62 | 63 | it("BOILERPLATE: Calculates open orders addresses", async () => { 64 | const [_openOrders, bump] = await PublicKey.findProgramAddress( 65 | [ 66 | anchor.utils.bytes.utf8.encode("open-orders"), 67 | DEX_PID.toBuffer(), 68 | marketProxy.market.address.toBuffer(), 69 | program.provider.wallet.publicKey.toBuffer(), 70 | ], 71 | program.programId 72 | ); 73 | const [ 74 | _openOrdersInitAuthority, 75 | bumpInit, 76 | ] = await PublicKey.findProgramAddress( 77 | [ 78 | anchor.utils.bytes.utf8.encode("open-orders-init"), 79 | DEX_PID.toBuffer(), 80 | marketProxy.market.address.toBuffer(), 81 | ], 82 | program.programId 83 | ); 84 | 85 | // Save global variables re-used across tests. 86 | openOrders = _openOrders; 87 | openOrdersBump = bump; 88 | openOrdersInitAuthority = _openOrdersInitAuthority; 89 | openOrdersBumpInit = bumpInit; 90 | }); 91 | 92 | it("Creates an open orders account", async () => { 93 | const tx = new Transaction(); 94 | tx.add( 95 | await marketProxy.instruction.initOpenOrders( 96 | program.provider.wallet.publicKey, 97 | marketProxy.market.address, 98 | marketProxy.market.address, // Dummy. Replaced by middleware. 99 | marketProxy.market.address // Dummy. Replaced by middleware. 100 | ) 101 | ); 102 | await provider.send(tx); 103 | 104 | const account = await provider.connection.getAccountInfo(openOrders); 105 | assert.ok(account.owner.toString() === DEX_PID.toString()); 106 | }); 107 | 108 | it("Posts a bid on the orderbook", async () => { 109 | const size = 1; 110 | const price = 1; 111 | usdcPosted = new BN( 112 | marketProxy.market._decoded.quoteLotSize.toNumber() 113 | ).mul( 114 | marketProxy.market 115 | .baseSizeNumberToLots(size) 116 | .mul(marketProxy.market.priceNumberToLots(price)) 117 | ); 118 | 119 | const tx = new Transaction(); 120 | tx.add( 121 | marketProxy.instruction.newOrderV3({ 122 | owner: program.provider.wallet.publicKey, 123 | payer: usdcAccount, 124 | side: "buy", 125 | price, 126 | size, 127 | orderType: "postOnly", 128 | clientId: new BN(999), 129 | openOrdersAddressKey: openOrders, 130 | selfTradeBehavior: "abortTransaction", 131 | }) 132 | ); 133 | await provider.send(tx); 134 | }); 135 | 136 | it("Cancels a bid on the orderbook", async () => { 137 | // Given. 138 | const beforeOoAccount = await OpenOrders.load( 139 | provider.connection, 140 | openOrders, 141 | DEX_PID 142 | ); 143 | 144 | // When. 145 | const tx = new Transaction(); 146 | tx.add( 147 | await marketProxy.instruction.cancelOrderByClientId( 148 | program.provider.wallet.publicKey, 149 | openOrders, 150 | new BN(999) 151 | ) 152 | ); 153 | await provider.send(tx); 154 | 155 | // Then. 156 | const afterOoAccount = await OpenOrders.load( 157 | provider.connection, 158 | openOrders, 159 | DEX_PID 160 | ); 161 | assert.ok(beforeOoAccount.quoteTokenFree.eq(new BN(0))); 162 | assert.ok(beforeOoAccount.quoteTokenTotal.eq(usdcPosted)); 163 | assert.ok(afterOoAccount.quoteTokenFree.eq(usdcPosted)); 164 | assert.ok(afterOoAccount.quoteTokenTotal.eq(usdcPosted)); 165 | }); 166 | 167 | it("Settles funds on the orderbook", async () => { 168 | // Given. 169 | const beforeTokenAccount = await usdcClient.getAccountInfo(usdcAccount); 170 | 171 | // When. 172 | const tx = new Transaction(); 173 | tx.add( 174 | await marketProxy.instruction.settleFunds( 175 | openOrders, 176 | provider.wallet.publicKey, 177 | tokenAccount, 178 | usdcAccount, 179 | referral 180 | ) 181 | ); 182 | await provider.send(tx); 183 | 184 | // Then. 185 | const afterTokenAccount = await usdcClient.getAccountInfo(usdcAccount); 186 | assert.ok( 187 | afterTokenAccount.amount.sub(beforeTokenAccount.amount).toNumber() === 188 | usdcPosted.toNumber() 189 | ); 190 | }); 191 | 192 | // Need to crank the cancel so that we can close later. 193 | it("Cranks the cancel transaction", async () => { 194 | await crankEventQueue(provider, marketProxy); 195 | }); 196 | 197 | it("Closes an open orders account", async () => { 198 | // Given. 199 | const beforeAccount = await program.provider.connection.getAccountInfo( 200 | program.provider.wallet.publicKey 201 | ); 202 | 203 | // When. 204 | const tx = new Transaction(); 205 | tx.add( 206 | marketProxy.instruction.closeOpenOrders( 207 | openOrders, 208 | provider.wallet.publicKey, 209 | provider.wallet.publicKey 210 | ) 211 | ); 212 | await provider.send(tx); 213 | 214 | // Then. 215 | const afterAccount = await program.provider.connection.getAccountInfo( 216 | program.provider.wallet.publicKey 217 | ); 218 | const closedAccount = await program.provider.connection.getAccountInfo( 219 | openOrders 220 | ); 221 | assert.ok(23352768 === afterAccount.lamports - beforeAccount.lamports); 222 | assert.ok(closedAccount === null); 223 | }); 224 | 225 | it("Re-opens an open orders account", async () => { 226 | const tx = new Transaction(); 227 | tx.add( 228 | await marketProxy.instruction.initOpenOrders( 229 | program.provider.wallet.publicKey, 230 | marketProxy.market.address, 231 | marketProxy.market.address, // Dummy. Replaced by middleware. 232 | marketProxy.market.address // Dummy. Replaced by middleware. 233 | ) 234 | ); 235 | await provider.send(tx); 236 | 237 | const account = await provider.connection.getAccountInfo(openOrders); 238 | assert.ok(account.owner.toString() === DEX_PID.toString()); 239 | }); 240 | 241 | it("Posts several bids and asks on the orderbook", async () => { 242 | const size = 10; 243 | const price = 2; 244 | for (let k = 0; k < 10; k += 1) { 245 | const tx = new Transaction(); 246 | tx.add( 247 | marketProxy.instruction.newOrderV3({ 248 | owner: program.provider.wallet.publicKey, 249 | payer: usdcAccount, 250 | side: "buy", 251 | price, 252 | size, 253 | orderType: "postOnly", 254 | clientId: new BN(999), 255 | openOrdersAddressKey: openOrders, 256 | selfTradeBehavior: "abortTransaction", 257 | }) 258 | ); 259 | await provider.send(tx); 260 | } 261 | 262 | const sizeAsk = 10; 263 | const priceAsk = 10; 264 | 265 | for (let k = 0; k < 10; k += 1) { 266 | const txAsk = new Transaction(); 267 | txAsk.add( 268 | marketProxy.instruction.newOrderV3({ 269 | owner: program.provider.wallet.publicKey, 270 | payer: tokenAccount, 271 | side: "sell", 272 | price: priceAsk, 273 | size: sizeAsk, 274 | orderType: "postOnly", 275 | clientId: new BN(1000), 276 | openOrdersAddressKey: openOrders, 277 | selfTradeBehavior: "abortTransaction", 278 | }) 279 | ); 280 | await provider.send(txAsk); 281 | } 282 | }); 283 | 284 | it("Prunes the orderbook", async () => { 285 | const tx = new Transaction(); 286 | tx.add( 287 | marketProxy.instruction.prune(openOrders, provider.wallet.publicKey) 288 | ); 289 | await provider.send(tx); 290 | }); 291 | 292 | it("Settles the account", async () => { 293 | const tx = new Transaction(); 294 | tx.add( 295 | await marketProxy.instruction.settleFunds( 296 | openOrders, 297 | provider.wallet.publicKey, 298 | tokenAccount, 299 | usdcAccount, 300 | referral 301 | ) 302 | ); 303 | await provider.send(tx); 304 | }); 305 | 306 | it("Cranks the prune transaction", async () => { 307 | await crankEventQueue(provider, marketProxy); 308 | }); 309 | 310 | it("Closes an open orders account", async () => { 311 | // Given. 312 | const beforeAccount = await program.provider.connection.getAccountInfo( 313 | program.provider.wallet.publicKey 314 | ); 315 | 316 | // When. 317 | const tx = new Transaction(); 318 | tx.add( 319 | marketProxy.instruction.closeOpenOrders( 320 | openOrders, 321 | provider.wallet.publicKey, 322 | provider.wallet.publicKey 323 | ) 324 | ); 325 | await provider.send(tx); 326 | 327 | // Then. 328 | const afterAccount = await program.provider.connection.getAccountInfo( 329 | program.provider.wallet.publicKey 330 | ); 331 | const closedAccount = await program.provider.connection.getAccountInfo( 332 | openOrders 333 | ); 334 | assert.ok(23352768 === afterAccount.lamports - beforeAccount.lamports); 335 | assert.ok(closedAccount === null); 336 | }); 337 | }); 338 | 339 | async function crankEventQueue(provider, marketProxy) { 340 | // TODO: can do this in a single transaction if we covert the pubkey bytes 341 | // into a [u64; 4] array and sort. I'm lazy though. 342 | let eq = await marketProxy.market.loadEventQueue(provider.connection); 343 | while (eq.length > 0) { 344 | const tx = new Transaction(); 345 | tx.add( 346 | marketProxy.market.makeConsumeEventsInstruction([eq[0].openOrders], 1) 347 | ); 348 | await provider.send(tx); 349 | eq = await marketProxy.market.loadEventQueue(provider.connection); 350 | } 351 | } 352 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.4.7" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "0.7.18" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "alloc-traits" 22 | version = "0.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "6b2d54853319fd101b8dd81de382bcbf3e03410a64d8928bbee85a3e7dcde483" 25 | 26 | [[package]] 27 | name = "anchor-attribute-access-control" 28 | version = "0.13.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "35ba6adc8bed8a9b284219ba12489b459ad233679a489edf9642987e6b090473" 31 | dependencies = [ 32 | "anchor-syn", 33 | "anyhow", 34 | "proc-macro2", 35 | "quote", 36 | "regex", 37 | "syn", 38 | ] 39 | 40 | [[package]] 41 | name = "anchor-attribute-account" 42 | version = "0.13.2" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "ab91b688a60b289767724288d73bf5d4fc425438e13d4d4f604a73ab9686c675" 45 | dependencies = [ 46 | "anchor-syn", 47 | "anyhow", 48 | "proc-macro2", 49 | "quote", 50 | "syn", 51 | ] 52 | 53 | [[package]] 54 | name = "anchor-attribute-error" 55 | version = "0.13.2" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "3a7a9215bb3b101f7237c06d5fc873278b82f685bfee95e4ec7e8427ff83c390" 58 | dependencies = [ 59 | "anchor-syn", 60 | "proc-macro2", 61 | "quote", 62 | "syn", 63 | ] 64 | 65 | [[package]] 66 | name = "anchor-attribute-event" 67 | version = "0.13.2" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "3b26d266d84ec0d8097214cf37430b4681e29da0522fbd3fdb0afc6fc16b2313" 70 | dependencies = [ 71 | "anchor-syn", 72 | "anyhow", 73 | "proc-macro2", 74 | "quote", 75 | "syn", 76 | ] 77 | 78 | [[package]] 79 | name = "anchor-attribute-interface" 80 | version = "0.13.2" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "08e35d76a8f8bc8934acc877c8643ec14ddcb355d423de8f9b7e225fe9824b60" 83 | dependencies = [ 84 | "anchor-syn", 85 | "anyhow", 86 | "heck", 87 | "proc-macro2", 88 | "quote", 89 | "syn", 90 | ] 91 | 92 | [[package]] 93 | name = "anchor-attribute-program" 94 | version = "0.13.2" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "8f6e8a3822e58df25ef45125a6dbe5ceeefebea68954f22beeeff83e4bd040a4" 97 | dependencies = [ 98 | "anchor-syn", 99 | "anyhow", 100 | "proc-macro2", 101 | "quote", 102 | "syn", 103 | ] 104 | 105 | [[package]] 106 | name = "anchor-attribute-state" 107 | version = "0.13.2" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "86586d43cf7e0f10431e018c72f51cfc60d1ce3323df44249ff3a70a45168b20" 110 | dependencies = [ 111 | "anchor-syn", 112 | "anyhow", 113 | "proc-macro2", 114 | "quote", 115 | "syn", 116 | ] 117 | 118 | [[package]] 119 | name = "anchor-derive-accounts" 120 | version = "0.13.2" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "85aa313d4317811983cab3e7a66ede358c4eb3f1fe47acf51a6078cd239bdbe7" 123 | dependencies = [ 124 | "anchor-syn", 125 | "anyhow", 126 | "proc-macro2", 127 | "quote", 128 | "syn", 129 | ] 130 | 131 | [[package]] 132 | name = "anchor-lang" 133 | version = "0.13.2" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "e0b300d7222b786b7947bd1c14ab82a6c519fa1bbce4ed0f0ffe4db1e6c05669" 136 | dependencies = [ 137 | "anchor-attribute-access-control", 138 | "anchor-attribute-account", 139 | "anchor-attribute-error", 140 | "anchor-attribute-event", 141 | "anchor-attribute-interface", 142 | "anchor-attribute-program", 143 | "anchor-attribute-state", 144 | "anchor-derive-accounts", 145 | "base64 0.13.0", 146 | "borsh", 147 | "bytemuck", 148 | "solana-program", 149 | "thiserror", 150 | ] 151 | 152 | [[package]] 153 | name = "anchor-spl" 154 | version = "0.13.2" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "3faeabe726b366ad273f4c47a76a79302e69eab889e3f50cd1c736a01a34d7f7" 157 | dependencies = [ 158 | "anchor-lang", 159 | "lazy_static", 160 | "serum_dex", 161 | "solana-program", 162 | "spl-token", 163 | ] 164 | 165 | [[package]] 166 | name = "anchor-syn" 167 | version = "0.13.2" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "833a32a3945814ecd8b6fdcb8666580e69037fe2efc4eaa4a9c68b1940450505" 170 | dependencies = [ 171 | "anyhow", 172 | "bs58", 173 | "heck", 174 | "proc-macro2", 175 | "proc-macro2-diagnostics", 176 | "quote", 177 | "serde", 178 | "serde_json", 179 | "sha2", 180 | "syn", 181 | "thiserror", 182 | ] 183 | 184 | [[package]] 185 | name = "anyhow" 186 | version = "1.0.41" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" 189 | 190 | [[package]] 191 | name = "arrayref" 192 | version = "0.3.6" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 195 | 196 | [[package]] 197 | name = "arrayvec" 198 | version = "0.5.2" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 201 | 202 | [[package]] 203 | name = "atty" 204 | version = "0.2.14" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 207 | dependencies = [ 208 | "hermit-abi", 209 | "libc", 210 | "winapi", 211 | ] 212 | 213 | [[package]] 214 | name = "autocfg" 215 | version = "1.0.1" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 218 | 219 | [[package]] 220 | name = "base64" 221 | version = "0.12.3" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 224 | 225 | [[package]] 226 | name = "base64" 227 | version = "0.13.0" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 230 | 231 | [[package]] 232 | name = "bincode" 233 | version = "1.3.3" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 236 | dependencies = [ 237 | "serde", 238 | ] 239 | 240 | [[package]] 241 | name = "blake3" 242 | version = "0.3.8" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" 245 | dependencies = [ 246 | "arrayref", 247 | "arrayvec", 248 | "cc", 249 | "cfg-if 0.1.10", 250 | "constant_time_eq", 251 | "crypto-mac", 252 | "digest 0.9.0", 253 | ] 254 | 255 | [[package]] 256 | name = "block-buffer" 257 | version = "0.9.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 260 | dependencies = [ 261 | "block-padding", 262 | "generic-array 0.14.4", 263 | ] 264 | 265 | [[package]] 266 | name = "block-padding" 267 | version = "0.2.1" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" 270 | 271 | [[package]] 272 | name = "borsh" 273 | version = "0.9.0" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "4fcabb02816fdadf90866dc9a7824491ccb63d69f55375a266dc03509ac68d36" 276 | dependencies = [ 277 | "borsh-derive", 278 | "hashbrown", 279 | ] 280 | 281 | [[package]] 282 | name = "borsh-derive" 283 | version = "0.9.0" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "4bd16f0729b89f0a212b0e2e1d19cc6593df63f771161a11863967780e2d033d" 286 | dependencies = [ 287 | "borsh-derive-internal", 288 | "borsh-schema-derive-internal", 289 | "proc-macro-crate", 290 | "proc-macro2", 291 | "syn", 292 | ] 293 | 294 | [[package]] 295 | name = "borsh-derive-internal" 296 | version = "0.9.0" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "1e321a130a3ac4b88eb59a6d670bde11eec9721a397b77e0f2079060e2a1b785" 299 | dependencies = [ 300 | "proc-macro2", 301 | "quote", 302 | "syn", 303 | ] 304 | 305 | [[package]] 306 | name = "borsh-schema-derive-internal" 307 | version = "0.9.0" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "15151a485164b319cc7a5160fe4316dc469a27993f71b73d7617dc9032ff0fd7" 310 | dependencies = [ 311 | "proc-macro2", 312 | "quote", 313 | "syn", 314 | ] 315 | 316 | [[package]] 317 | name = "bs58" 318 | version = "0.3.1" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" 321 | 322 | [[package]] 323 | name = "bv" 324 | version = "0.11.1" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" 327 | dependencies = [ 328 | "feature-probe", 329 | "serde", 330 | ] 331 | 332 | [[package]] 333 | name = "bytemuck" 334 | version = "1.7.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "9966d2ab714d0f785dbac0a0396251a35280aeb42413281617d0209ab4898435" 337 | 338 | [[package]] 339 | name = "byteorder" 340 | version = "1.4.3" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 343 | 344 | [[package]] 345 | name = "cc" 346 | version = "1.0.68" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" 349 | 350 | [[package]] 351 | name = "cfg-if" 352 | version = "0.1.10" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 355 | 356 | [[package]] 357 | name = "cfg-if" 358 | version = "1.0.0" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 361 | 362 | [[package]] 363 | name = "constant_time_eq" 364 | version = "0.1.5" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 367 | 368 | [[package]] 369 | name = "cpufeatures" 370 | version = "0.1.5" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" 373 | dependencies = [ 374 | "libc", 375 | ] 376 | 377 | [[package]] 378 | name = "crunchy" 379 | version = "0.2.2" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 382 | 383 | [[package]] 384 | name = "crypto-mac" 385 | version = "0.8.0" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" 388 | dependencies = [ 389 | "generic-array 0.14.4", 390 | "subtle", 391 | ] 392 | 393 | [[package]] 394 | name = "curve25519-dalek" 395 | version = "2.1.2" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "434e1720189a637d44fe464f4df1e6eb900b4835255b14354497c78af37d9bb8" 398 | dependencies = [ 399 | "byteorder", 400 | "digest 0.8.1", 401 | "rand_core", 402 | "subtle", 403 | "zeroize", 404 | ] 405 | 406 | [[package]] 407 | name = "derivative" 408 | version = "2.2.0" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 411 | dependencies = [ 412 | "proc-macro2", 413 | "quote", 414 | "syn", 415 | ] 416 | 417 | [[package]] 418 | name = "digest" 419 | version = "0.8.1" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 422 | dependencies = [ 423 | "generic-array 0.12.4", 424 | ] 425 | 426 | [[package]] 427 | name = "digest" 428 | version = "0.9.0" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 431 | dependencies = [ 432 | "generic-array 0.14.4", 433 | ] 434 | 435 | [[package]] 436 | name = "either" 437 | version = "1.6.1" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 440 | 441 | [[package]] 442 | name = "enumflags2" 443 | version = "0.6.4" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" 446 | dependencies = [ 447 | "enumflags2_derive", 448 | ] 449 | 450 | [[package]] 451 | name = "enumflags2_derive" 452 | version = "0.6.4" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" 455 | dependencies = [ 456 | "proc-macro2", 457 | "quote", 458 | "syn", 459 | ] 460 | 461 | [[package]] 462 | name = "env_logger" 463 | version = "0.8.4" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" 466 | dependencies = [ 467 | "atty", 468 | "humantime", 469 | "log", 470 | "regex", 471 | "termcolor", 472 | ] 473 | 474 | [[package]] 475 | name = "feature-probe" 476 | version = "0.1.1" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" 479 | 480 | [[package]] 481 | name = "field-offset" 482 | version = "0.3.4" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" 485 | dependencies = [ 486 | "memoffset", 487 | "rustc_version 0.3.3", 488 | ] 489 | 490 | [[package]] 491 | name = "generic-array" 492 | version = "0.12.4" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 495 | dependencies = [ 496 | "typenum", 497 | ] 498 | 499 | [[package]] 500 | name = "generic-array" 501 | version = "0.14.4" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" 504 | dependencies = [ 505 | "serde", 506 | "typenum", 507 | "version_check", 508 | ] 509 | 510 | [[package]] 511 | name = "getrandom" 512 | version = "0.1.16" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 515 | dependencies = [ 516 | "cfg-if 1.0.0", 517 | "libc", 518 | "wasi", 519 | ] 520 | 521 | [[package]] 522 | name = "hashbrown" 523 | version = "0.9.1" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 526 | dependencies = [ 527 | "ahash", 528 | ] 529 | 530 | [[package]] 531 | name = "heck" 532 | version = "0.3.3" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 535 | dependencies = [ 536 | "unicode-segmentation", 537 | ] 538 | 539 | [[package]] 540 | name = "hermit-abi" 541 | version = "0.1.19" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 544 | dependencies = [ 545 | "libc", 546 | ] 547 | 548 | [[package]] 549 | name = "hex" 550 | version = "0.4.3" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 553 | 554 | [[package]] 555 | name = "hmac" 556 | version = "0.8.1" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" 559 | dependencies = [ 560 | "crypto-mac", 561 | "digest 0.9.0", 562 | ] 563 | 564 | [[package]] 565 | name = "hmac-drbg" 566 | version = "0.3.0" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" 569 | dependencies = [ 570 | "digest 0.9.0", 571 | "generic-array 0.14.4", 572 | "hmac", 573 | ] 574 | 575 | [[package]] 576 | name = "humantime" 577 | version = "2.1.0" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 580 | 581 | [[package]] 582 | name = "itertools" 583 | version = "0.9.0" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" 586 | dependencies = [ 587 | "either", 588 | ] 589 | 590 | [[package]] 591 | name = "itoa" 592 | version = "0.4.7" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 595 | 596 | [[package]] 597 | name = "keccak" 598 | version = "0.1.0" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" 601 | 602 | [[package]] 603 | name = "lazy_static" 604 | version = "1.4.0" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 607 | 608 | [[package]] 609 | name = "libc" 610 | version = "0.2.97" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" 613 | 614 | [[package]] 615 | name = "libsecp256k1" 616 | version = "0.5.0" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "bd1137239ab33b41aa9637a88a28249e5e70c40a42ccc92db7f12cc356c1fcd7" 619 | dependencies = [ 620 | "arrayref", 621 | "base64 0.12.3", 622 | "digest 0.9.0", 623 | "hmac-drbg", 624 | "libsecp256k1-core", 625 | "libsecp256k1-gen-ecmult", 626 | "libsecp256k1-gen-genmult", 627 | "rand", 628 | "serde", 629 | "sha2", 630 | "typenum", 631 | ] 632 | 633 | [[package]] 634 | name = "libsecp256k1-core" 635 | version = "0.2.2" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" 638 | dependencies = [ 639 | "crunchy", 640 | "digest 0.9.0", 641 | "subtle", 642 | ] 643 | 644 | [[package]] 645 | name = "libsecp256k1-gen-ecmult" 646 | version = "0.2.1" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" 649 | dependencies = [ 650 | "libsecp256k1-core", 651 | ] 652 | 653 | [[package]] 654 | name = "libsecp256k1-gen-genmult" 655 | version = "0.2.1" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" 658 | dependencies = [ 659 | "libsecp256k1-core", 660 | ] 661 | 662 | [[package]] 663 | name = "log" 664 | version = "0.4.14" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 667 | dependencies = [ 668 | "cfg-if 1.0.0", 669 | ] 670 | 671 | [[package]] 672 | name = "memchr" 673 | version = "2.4.0" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" 676 | 677 | [[package]] 678 | name = "memmap2" 679 | version = "0.1.0" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a" 682 | dependencies = [ 683 | "libc", 684 | ] 685 | 686 | [[package]] 687 | name = "memoffset" 688 | version = "0.6.4" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" 691 | dependencies = [ 692 | "autocfg", 693 | ] 694 | 695 | [[package]] 696 | name = "num-derive" 697 | version = "0.3.3" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 700 | dependencies = [ 701 | "proc-macro2", 702 | "quote", 703 | "syn", 704 | ] 705 | 706 | [[package]] 707 | name = "num-traits" 708 | version = "0.2.14" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 711 | dependencies = [ 712 | "autocfg", 713 | ] 714 | 715 | [[package]] 716 | name = "num_enum" 717 | version = "0.5.1" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" 720 | dependencies = [ 721 | "derivative", 722 | "num_enum_derive", 723 | ] 724 | 725 | [[package]] 726 | name = "num_enum_derive" 727 | version = "0.5.1" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" 730 | dependencies = [ 731 | "proc-macro-crate", 732 | "proc-macro2", 733 | "quote", 734 | "syn", 735 | ] 736 | 737 | [[package]] 738 | name = "opaque-debug" 739 | version = "0.3.0" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 742 | 743 | [[package]] 744 | name = "permissioned-markets" 745 | version = "0.1.0" 746 | dependencies = [ 747 | "anchor-lang", 748 | "anchor-spl", 749 | "solana-program", 750 | ] 751 | 752 | [[package]] 753 | name = "pest" 754 | version = "2.1.3" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" 757 | dependencies = [ 758 | "ucd-trie", 759 | ] 760 | 761 | [[package]] 762 | name = "ppv-lite86" 763 | version = "0.2.10" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 766 | 767 | [[package]] 768 | name = "proc-macro-crate" 769 | version = "0.1.5" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" 772 | dependencies = [ 773 | "toml", 774 | ] 775 | 776 | [[package]] 777 | name = "proc-macro2" 778 | version = "1.0.27" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" 781 | dependencies = [ 782 | "unicode-xid", 783 | ] 784 | 785 | [[package]] 786 | name = "proc-macro2-diagnostics" 787 | version = "0.9.1" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" 790 | dependencies = [ 791 | "proc-macro2", 792 | "quote", 793 | "syn", 794 | "version_check", 795 | "yansi", 796 | ] 797 | 798 | [[package]] 799 | name = "quote" 800 | version = "1.0.9" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 803 | dependencies = [ 804 | "proc-macro2", 805 | ] 806 | 807 | [[package]] 808 | name = "rand" 809 | version = "0.7.3" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 812 | dependencies = [ 813 | "getrandom", 814 | "libc", 815 | "rand_chacha", 816 | "rand_core", 817 | "rand_hc", 818 | ] 819 | 820 | [[package]] 821 | name = "rand_chacha" 822 | version = "0.2.2" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 825 | dependencies = [ 826 | "ppv-lite86", 827 | "rand_core", 828 | ] 829 | 830 | [[package]] 831 | name = "rand_core" 832 | version = "0.5.1" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 835 | dependencies = [ 836 | "getrandom", 837 | ] 838 | 839 | [[package]] 840 | name = "rand_hc" 841 | version = "0.2.0" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 844 | dependencies = [ 845 | "rand_core", 846 | ] 847 | 848 | [[package]] 849 | name = "regex" 850 | version = "1.5.4" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" 853 | dependencies = [ 854 | "aho-corasick", 855 | "memchr", 856 | "regex-syntax", 857 | ] 858 | 859 | [[package]] 860 | name = "regex-syntax" 861 | version = "0.6.25" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 864 | 865 | [[package]] 866 | name = "rustc_version" 867 | version = "0.2.3" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 870 | dependencies = [ 871 | "semver 0.9.0", 872 | ] 873 | 874 | [[package]] 875 | name = "rustc_version" 876 | version = "0.3.3" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" 879 | dependencies = [ 880 | "semver 0.11.0", 881 | ] 882 | 883 | [[package]] 884 | name = "rustversion" 885 | version = "1.0.5" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" 888 | 889 | [[package]] 890 | name = "ryu" 891 | version = "1.0.5" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 894 | 895 | [[package]] 896 | name = "safe-transmute" 897 | version = "0.11.2" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "98a01dab6acf992653be49205bdd549f32f17cb2803e8eacf1560bf97259aae8" 900 | 901 | [[package]] 902 | name = "semver" 903 | version = "0.9.0" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 906 | dependencies = [ 907 | "semver-parser 0.7.0", 908 | ] 909 | 910 | [[package]] 911 | name = "semver" 912 | version = "0.11.0" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 915 | dependencies = [ 916 | "semver-parser 0.10.2", 917 | ] 918 | 919 | [[package]] 920 | name = "semver-parser" 921 | version = "0.7.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 924 | 925 | [[package]] 926 | name = "semver-parser" 927 | version = "0.10.2" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" 930 | dependencies = [ 931 | "pest", 932 | ] 933 | 934 | [[package]] 935 | name = "serde" 936 | version = "1.0.126" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" 939 | dependencies = [ 940 | "serde_derive", 941 | ] 942 | 943 | [[package]] 944 | name = "serde_bytes" 945 | version = "0.11.5" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" 948 | dependencies = [ 949 | "serde", 950 | ] 951 | 952 | [[package]] 953 | name = "serde_derive" 954 | version = "1.0.126" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" 957 | dependencies = [ 958 | "proc-macro2", 959 | "quote", 960 | "syn", 961 | ] 962 | 963 | [[package]] 964 | name = "serde_json" 965 | version = "1.0.64" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" 968 | dependencies = [ 969 | "itoa", 970 | "ryu", 971 | "serde", 972 | ] 973 | 974 | [[package]] 975 | name = "serum_dex" 976 | version = "0.4.0" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "02705854bae4622e552346c8edd43ab90c7425da35d63d2c689f39238f8d8b25" 979 | dependencies = [ 980 | "arrayref", 981 | "bincode", 982 | "bytemuck", 983 | "byteorder", 984 | "enumflags2", 985 | "field-offset", 986 | "itertools", 987 | "num-traits", 988 | "num_enum", 989 | "safe-transmute", 990 | "serde", 991 | "solana-program", 992 | "spl-token", 993 | "static_assertions", 994 | "thiserror", 995 | "without-alloc", 996 | ] 997 | 998 | [[package]] 999 | name = "sha2" 1000 | version = "0.9.5" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" 1003 | dependencies = [ 1004 | "block-buffer", 1005 | "cfg-if 1.0.0", 1006 | "cpufeatures", 1007 | "digest 0.9.0", 1008 | "opaque-debug", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "sha3" 1013 | version = "0.9.1" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" 1016 | dependencies = [ 1017 | "block-buffer", 1018 | "digest 0.9.0", 1019 | "keccak", 1020 | "opaque-debug", 1021 | ] 1022 | 1023 | [[package]] 1024 | name = "solana-frozen-abi" 1025 | version = "1.7.8" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | checksum = "45c6760c1dd139c202ef6df28bff467c904aa35b1aa1a59be268c47aec8bc6c0" 1028 | dependencies = [ 1029 | "bs58", 1030 | "bv", 1031 | "generic-array 0.14.4", 1032 | "log", 1033 | "memmap2", 1034 | "rustc_version 0.2.3", 1035 | "serde", 1036 | "serde_derive", 1037 | "sha2", 1038 | "solana-frozen-abi-macro", 1039 | "solana-logger", 1040 | "thiserror", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "solana-frozen-abi-macro" 1045 | version = "1.7.8" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "a4dbe296c16dec41e8e6f4e6c2694c6224820d34c0ab11a2d3ff9683f44878ef" 1048 | dependencies = [ 1049 | "proc-macro2", 1050 | "quote", 1051 | "rustc_version 0.2.3", 1052 | "syn", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "solana-logger" 1057 | version = "1.7.8" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "80af1959b520c0fc99bc6583ba9d82bfa15b1ac007516795bceeb4a951af77c7" 1060 | dependencies = [ 1061 | "env_logger", 1062 | "lazy_static", 1063 | "log", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "solana-program" 1068 | version = "1.7.8" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "fe5e5dd99d642b5e89eeb20457310c3c23f20dbf44e67c64e473a02fbc50d646" 1071 | dependencies = [ 1072 | "bincode", 1073 | "blake3", 1074 | "borsh", 1075 | "borsh-derive", 1076 | "bs58", 1077 | "bv", 1078 | "curve25519-dalek", 1079 | "hex", 1080 | "itertools", 1081 | "lazy_static", 1082 | "libsecp256k1", 1083 | "log", 1084 | "num-derive", 1085 | "num-traits", 1086 | "rand", 1087 | "rustc_version 0.2.3", 1088 | "rustversion", 1089 | "serde", 1090 | "serde_bytes", 1091 | "serde_derive", 1092 | "sha2", 1093 | "sha3", 1094 | "solana-frozen-abi", 1095 | "solana-frozen-abi-macro", 1096 | "solana-logger", 1097 | "solana-sdk-macro", 1098 | "thiserror", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "solana-sdk-macro" 1103 | version = "1.7.8" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "fee909dcddb5b4d349b3e5e1ae92f6660cd2f783dea392ae2e73210776aadc9b" 1106 | dependencies = [ 1107 | "bs58", 1108 | "proc-macro2", 1109 | "quote", 1110 | "rustversion", 1111 | "syn", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "spl-token" 1116 | version = "3.1.1" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "fbfa8fd791aeb4d7ad5fedb7872478de9f4e8b4fcb02dfd9e7f2f9ae3f3ddd73" 1119 | dependencies = [ 1120 | "arrayref", 1121 | "num-derive", 1122 | "num-traits", 1123 | "num_enum", 1124 | "solana-program", 1125 | "thiserror", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "static_assertions" 1130 | version = "1.1.0" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1133 | 1134 | [[package]] 1135 | name = "subtle" 1136 | version = "2.4.0" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" 1139 | 1140 | [[package]] 1141 | name = "syn" 1142 | version = "1.0.73" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" 1145 | dependencies = [ 1146 | "proc-macro2", 1147 | "quote", 1148 | "unicode-xid", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "termcolor" 1153 | version = "1.1.2" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 1156 | dependencies = [ 1157 | "winapi-util", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "thiserror" 1162 | version = "1.0.26" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" 1165 | dependencies = [ 1166 | "thiserror-impl", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "thiserror-impl" 1171 | version = "1.0.26" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" 1174 | dependencies = [ 1175 | "proc-macro2", 1176 | "quote", 1177 | "syn", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "toml" 1182 | version = "0.5.8" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" 1185 | dependencies = [ 1186 | "serde", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "typenum" 1191 | version = "1.13.0" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" 1194 | 1195 | [[package]] 1196 | name = "ucd-trie" 1197 | version = "0.1.3" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" 1200 | 1201 | [[package]] 1202 | name = "unicode-segmentation" 1203 | version = "1.8.0" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" 1206 | 1207 | [[package]] 1208 | name = "unicode-xid" 1209 | version = "0.2.2" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 1212 | 1213 | [[package]] 1214 | name = "version_check" 1215 | version = "0.9.3" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" 1218 | 1219 | [[package]] 1220 | name = "wasi" 1221 | version = "0.9.0+wasi-snapshot-preview1" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1224 | 1225 | [[package]] 1226 | name = "winapi" 1227 | version = "0.3.9" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1230 | dependencies = [ 1231 | "winapi-i686-pc-windows-gnu", 1232 | "winapi-x86_64-pc-windows-gnu", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "winapi-i686-pc-windows-gnu" 1237 | version = "0.4.0" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1240 | 1241 | [[package]] 1242 | name = "winapi-util" 1243 | version = "0.1.5" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1246 | dependencies = [ 1247 | "winapi", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "winapi-x86_64-pc-windows-gnu" 1252 | version = "0.4.0" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1255 | 1256 | [[package]] 1257 | name = "without-alloc" 1258 | version = "0.2.1" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "5e34736feff52a0b3e5680927e947a4d8fac1f0b80dc8120b080dd8de24d75e2" 1261 | dependencies = [ 1262 | "alloc-traits", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "yansi" 1267 | version = "0.5.0" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" 1270 | 1271 | [[package]] 1272 | name = "zeroize" 1273 | version = "1.3.0" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" 1276 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "101@^1.0.0", "101@^1.2.0": 6 | version "1.6.3" 7 | resolved "https://registry.yarnpkg.com/101/-/101-1.6.3.tgz#9071196e60c47e4ce327075cf49c0ad79bd822fd" 8 | integrity sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw== 9 | dependencies: 10 | clone "^1.0.2" 11 | deep-eql "^0.1.3" 12 | keypather "^1.10.2" 13 | 14 | "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": 15 | version "7.14.8" 16 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" 17 | integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== 18 | dependencies: 19 | regenerator-runtime "^0.13.4" 20 | 21 | "@project-serum/anchor-cli@^0.13.2": 22 | version "0.13.2" 23 | resolved "https://registry.yarnpkg.com/@project-serum/anchor-cli/-/anchor-cli-0.13.2.tgz#0dc0e4512a999b3908c3002379de37aa6c54887f" 24 | integrity sha512-5wUkycPVyXTNZM7TleqF06owB1ALDecjBeMtHuBCDW5tGQQYVvU9SryjIgJmZjUChqgCQ38+kz+gi6IrJA+hjw== 25 | 26 | "@project-serum/anchor@^0.11.1": 27 | version "0.11.1" 28 | resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.11.1.tgz#155bff2c70652eafdcfd5559c81a83bb19cec9ff" 29 | integrity sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA== 30 | dependencies: 31 | "@project-serum/borsh" "^0.2.2" 32 | "@solana/web3.js" "^1.17.0" 33 | base64-js "^1.5.1" 34 | bn.js "^5.1.2" 35 | bs58 "^4.0.1" 36 | buffer-layout "^1.2.0" 37 | camelcase "^5.3.1" 38 | crypto-hash "^1.3.0" 39 | eventemitter3 "^4.0.7" 40 | find "^0.3.0" 41 | js-sha256 "^0.9.0" 42 | pako "^2.0.3" 43 | snake-case "^3.0.4" 44 | toml "^3.0.0" 45 | 46 | "@project-serum/anchor@^0.13.2": 47 | version "0.13.2" 48 | resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.13.2.tgz#c6c9a15720cbecd0f79bab56a0690d156fd06f8a" 49 | integrity sha512-xfjzHBy8ZvJuK1EYAba7+CT6TmJ+UWXmGGm915J0IFJTwGwYT4+bDa/qZF7EnZ6trYxg7owEOMLfvF7Jp+WC0w== 50 | dependencies: 51 | "@project-serum/borsh" "^0.2.2" 52 | "@solana/web3.js" "^1.17.0" 53 | base64-js "^1.5.1" 54 | bn.js "^5.1.2" 55 | bs58 "^4.0.1" 56 | buffer-layout "^1.2.0" 57 | camelcase "^5.3.1" 58 | crypto-hash "^1.3.0" 59 | eventemitter3 "^4.0.7" 60 | find "^0.3.0" 61 | js-sha256 "^0.9.0" 62 | pako "^2.0.3" 63 | snake-case "^3.0.4" 64 | toml "^3.0.0" 65 | 66 | "@project-serum/borsh@^0.2.2": 67 | version "0.2.2" 68 | resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.2.tgz#63e558f2d6eb6ab79086bf499dea94da3182498f" 69 | integrity sha512-Ms+aWmGVW6bWd3b0+MWwoaYig2QD0F90h0uhr7AzY3dpCb5e2S6RsRW02vFTfa085pY2VLB7nTZNbFECQ1liTg== 70 | dependencies: 71 | bn.js "^5.1.2" 72 | buffer-layout "^1.2.0" 73 | 74 | "@project-serum/common@^0.0.1-beta.3": 75 | version "0.0.1-beta.3" 76 | resolved "https://registry.yarnpkg.com/@project-serum/common/-/common-0.0.1-beta.3.tgz#53586eaff9d9fd7e8938b1e12080c935b8b6ad07" 77 | integrity sha512-gnQE/eUydTtto5okCgLWj1M97R9RRPJqnhKklikYI7jP/pnNhDmngSXC/dmfzED2GXSJEIKNIlxVw1k+E2Aw3w== 78 | dependencies: 79 | "@project-serum/serum" "^0.13.21" 80 | bn.js "^5.1.2" 81 | superstruct "0.8.3" 82 | 83 | "@project-serum/serum@^0.13.21", "@project-serum/serum@^0.13.55": 84 | version "0.13.55" 85 | resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.13.55.tgz#2ac44fe7b07651274eb57ac54ea9325789df5dd7" 86 | integrity sha512-SPQ4NsuNbBJO3mLGnTYbjt47WCXoNIcW2C9xv0gNXyG62dxgONsAEEgErKv1gT34hWCMPsXFSpatnX6ppriq7w== 87 | dependencies: 88 | "@project-serum/anchor" "^0.11.1" 89 | "@solana/spl-token" "^0.1.6" 90 | "@solana/web3.js" "^1.21.0" 91 | bn.js "^5.1.2" 92 | buffer-layout "^1.2.0" 93 | 94 | "@solana/buffer-layout@^3.0.0": 95 | version "3.0.0" 96 | resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" 97 | integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== 98 | dependencies: 99 | buffer "~6.0.3" 100 | 101 | "@solana/spl-token@^0.1.6": 102 | version "0.1.6" 103 | resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.6.tgz#fa136b0a3db84f07a99bc0e54cf4e91f2d6da2e8" 104 | integrity sha512-fYj+a3w1bqWN6Ibf85XF3h2JkuxevI3Spvqi+mjsNqVUEo2AgxxTZmujNLn/jIzQDNdWkBfF/wYzH5ikcGHmfw== 105 | dependencies: 106 | "@babel/runtime" "^7.10.5" 107 | "@solana/web3.js" "^1.12.0" 108 | bn.js "^5.1.0" 109 | buffer "6.0.3" 110 | buffer-layout "^1.2.0" 111 | dotenv "10.0.0" 112 | 113 | "@solana/web3.js@^1.12.0", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0": 114 | version "1.22.0" 115 | resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.22.0.tgz#ded439eb903aff4269a16a7fdfacc6866c6f0c13" 116 | integrity sha512-7BQUiR1AIj2L8KJ8LYsI31iPRLytgF8T4hz7xLlvvBfalpUK7qD2om7frlNpXl8ROUpvruNf83QaectJdZJW1w== 117 | dependencies: 118 | "@babel/runtime" "^7.12.5" 119 | "@solana/buffer-layout" "^3.0.0" 120 | bn.js "^5.0.0" 121 | borsh "^0.4.0" 122 | bs58 "^4.0.1" 123 | buffer "6.0.1" 124 | crypto-hash "^1.2.2" 125 | jayson "^3.4.4" 126 | js-sha3 "^0.8.0" 127 | node-fetch "^2.6.1" 128 | rpc-websockets "^7.4.2" 129 | secp256k1 "^4.0.2" 130 | superstruct "^0.14.2" 131 | tweetnacl "^1.0.0" 132 | 133 | "@types/bn.js@^4.11.5": 134 | version "4.11.6" 135 | resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" 136 | integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== 137 | dependencies: 138 | "@types/node" "*" 139 | 140 | "@types/connect@^3.4.33": 141 | version "3.4.35" 142 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 143 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 144 | dependencies: 145 | "@types/node" "*" 146 | 147 | "@types/express-serve-static-core@^4.17.9": 148 | version "4.17.24" 149 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" 150 | integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== 151 | dependencies: 152 | "@types/node" "*" 153 | "@types/qs" "*" 154 | "@types/range-parser" "*" 155 | 156 | "@types/lodash@^4.14.159": 157 | version "4.14.172" 158 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.172.tgz#aad774c28e7bfd7a67de25408e03ee5a8c3d028a" 159 | integrity sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw== 160 | 161 | "@types/node@*": 162 | version "16.4.12" 163 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.12.tgz#961e3091f263e6345d2d84afab4e047a60b4b11b" 164 | integrity sha512-zxrTNFl9Z8boMJXs6ieqZP0wAhvkdzmHSxTlJabM16cf5G9xBc1uPRH5Bbv2omEDDiM8MzTfqTJXBf0Ba4xFWA== 165 | 166 | "@types/node@^12.12.54": 167 | version "12.20.19" 168 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.19.tgz#538e61fc220f77ae4a4663c3d8c3cb391365c209" 169 | integrity sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw== 170 | 171 | "@types/qs@*": 172 | version "6.9.7" 173 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 174 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 175 | 176 | "@types/range-parser@*": 177 | version "1.2.4" 178 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 179 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 180 | 181 | "@types/ws@^7.4.4": 182 | version "7.4.7" 183 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" 184 | integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== 185 | dependencies: 186 | "@types/node" "*" 187 | 188 | "@ungap/promise-all-settled@1.1.2": 189 | version "1.1.2" 190 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 191 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 192 | 193 | JSONStream@^1.3.5: 194 | version "1.3.5" 195 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 196 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 197 | dependencies: 198 | jsonparse "^1.2.0" 199 | through ">=2.2.7 <3" 200 | 201 | ansi-colors@4.1.1: 202 | version "4.1.1" 203 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 204 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 205 | 206 | ansi-regex@^3.0.0: 207 | version "3.0.0" 208 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 209 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 210 | 211 | ansi-regex@^5.0.0: 212 | version "5.0.0" 213 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 214 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 215 | 216 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 217 | version "4.3.0" 218 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 219 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 220 | dependencies: 221 | color-convert "^2.0.1" 222 | 223 | anymatch@~3.1.2: 224 | version "3.1.2" 225 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 226 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 227 | dependencies: 228 | normalize-path "^3.0.0" 229 | picomatch "^2.0.4" 230 | 231 | argparse@^2.0.1: 232 | version "2.0.1" 233 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 234 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 235 | 236 | assert-args@^1.2.1: 237 | version "1.2.1" 238 | resolved "https://registry.yarnpkg.com/assert-args/-/assert-args-1.2.1.tgz#404103a1452a32fe77898811e54e590a8a9373bd" 239 | integrity sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70= 240 | dependencies: 241 | "101" "^1.2.0" 242 | compound-subject "0.0.1" 243 | debug "^2.2.0" 244 | get-prototype-of "0.0.0" 245 | is-capitalized "^1.0.0" 246 | is-class "0.0.4" 247 | 248 | balanced-match@^1.0.0: 249 | version "1.0.2" 250 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 251 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 252 | 253 | base-x@^3.0.2: 254 | version "3.0.8" 255 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" 256 | integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== 257 | dependencies: 258 | safe-buffer "^5.0.1" 259 | 260 | base64-js@^1.3.1, base64-js@^1.5.1: 261 | version "1.5.1" 262 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 263 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 264 | 265 | binary-extensions@^2.0.0: 266 | version "2.2.0" 267 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 268 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 269 | 270 | bn.js@^4.11.9: 271 | version "4.12.0" 272 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 273 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 274 | 275 | bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.2: 276 | version "5.2.0" 277 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" 278 | integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== 279 | 280 | borsh@^0.4.0: 281 | version "0.4.0" 282 | resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" 283 | integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== 284 | dependencies: 285 | "@types/bn.js" "^4.11.5" 286 | bn.js "^5.0.0" 287 | bs58 "^4.0.0" 288 | text-encoding-utf-8 "^1.0.2" 289 | 290 | brace-expansion@^1.1.7: 291 | version "1.1.11" 292 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 293 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 294 | dependencies: 295 | balanced-match "^1.0.0" 296 | concat-map "0.0.1" 297 | 298 | braces@~3.0.2: 299 | version "3.0.2" 300 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 301 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 302 | dependencies: 303 | fill-range "^7.0.1" 304 | 305 | brorand@^1.1.0: 306 | version "1.1.0" 307 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 308 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 309 | 310 | browser-stdout@1.3.1: 311 | version "1.3.1" 312 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 313 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 314 | 315 | bs58@^4.0.0, bs58@^4.0.1: 316 | version "4.0.1" 317 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" 318 | integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= 319 | dependencies: 320 | base-x "^3.0.2" 321 | 322 | buffer-layout@^1.2.0: 323 | version "1.2.2" 324 | resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" 325 | integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== 326 | 327 | buffer@6.0.1: 328 | version "6.0.1" 329 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" 330 | integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== 331 | dependencies: 332 | base64-js "^1.3.1" 333 | ieee754 "^1.2.1" 334 | 335 | buffer@6.0.3, buffer@~6.0.3: 336 | version "6.0.3" 337 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 338 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 339 | dependencies: 340 | base64-js "^1.3.1" 341 | ieee754 "^1.2.1" 342 | 343 | bufferutil@^4.0.1: 344 | version "4.0.3" 345 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" 346 | integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== 347 | dependencies: 348 | node-gyp-build "^4.2.0" 349 | 350 | camelcase@^5.3.1: 351 | version "5.3.1" 352 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 353 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 354 | 355 | camelcase@^6.0.0: 356 | version "6.2.0" 357 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" 358 | integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== 359 | 360 | chalk@^4.1.0: 361 | version "4.1.2" 362 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 363 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 364 | dependencies: 365 | ansi-styles "^4.1.0" 366 | supports-color "^7.1.0" 367 | 368 | chokidar@3.5.2: 369 | version "3.5.2" 370 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 371 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 372 | dependencies: 373 | anymatch "~3.1.2" 374 | braces "~3.0.2" 375 | glob-parent "~5.1.2" 376 | is-binary-path "~2.1.0" 377 | is-glob "~4.0.1" 378 | normalize-path "~3.0.0" 379 | readdirp "~3.6.0" 380 | optionalDependencies: 381 | fsevents "~2.3.2" 382 | 383 | circular-json@^0.5.9: 384 | version "0.5.9" 385 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" 386 | integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== 387 | 388 | cliui@^7.0.2: 389 | version "7.0.4" 390 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 391 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 392 | dependencies: 393 | string-width "^4.2.0" 394 | strip-ansi "^6.0.0" 395 | wrap-ansi "^7.0.0" 396 | 397 | clone@^1.0.2: 398 | version "1.0.4" 399 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 400 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 401 | 402 | color-convert@^2.0.1: 403 | version "2.0.1" 404 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 405 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 406 | dependencies: 407 | color-name "~1.1.4" 408 | 409 | color-name@~1.1.4: 410 | version "1.1.4" 411 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 412 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 413 | 414 | commander@^2.20.3: 415 | version "2.20.3" 416 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 417 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 418 | 419 | compound-subject@0.0.1: 420 | version "0.0.1" 421 | resolved "https://registry.yarnpkg.com/compound-subject/-/compound-subject-0.0.1.tgz#271554698a15ae608b1dfcafd30b7ba1ea892c4b" 422 | integrity sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs= 423 | 424 | concat-map@0.0.1: 425 | version "0.0.1" 426 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 427 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 428 | 429 | crypto-hash@^1.2.2, crypto-hash@^1.3.0: 430 | version "1.3.0" 431 | resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" 432 | integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== 433 | 434 | debug@4.3.1: 435 | version "4.3.1" 436 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 437 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 438 | dependencies: 439 | ms "2.1.2" 440 | 441 | debug@^2.2.0: 442 | version "2.6.9" 443 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 444 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 445 | dependencies: 446 | ms "2.0.0" 447 | 448 | decamelize@^4.0.0: 449 | version "4.0.0" 450 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 451 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 452 | 453 | deep-eql@^0.1.3: 454 | version "0.1.3" 455 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 456 | integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= 457 | dependencies: 458 | type-detect "0.1.1" 459 | 460 | delay@^5.0.0: 461 | version "5.0.0" 462 | resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" 463 | integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== 464 | 465 | diff@5.0.0: 466 | version "5.0.0" 467 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 468 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 469 | 470 | dot-case@^3.0.4: 471 | version "3.0.4" 472 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 473 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 474 | dependencies: 475 | no-case "^3.0.4" 476 | tslib "^2.0.3" 477 | 478 | dotenv@10.0.0: 479 | version "10.0.0" 480 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" 481 | integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== 482 | 483 | elliptic@^6.5.2: 484 | version "6.5.4" 485 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 486 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 487 | dependencies: 488 | bn.js "^4.11.9" 489 | brorand "^1.1.0" 490 | hash.js "^1.0.0" 491 | hmac-drbg "^1.0.1" 492 | inherits "^2.0.4" 493 | minimalistic-assert "^1.0.1" 494 | minimalistic-crypto-utils "^1.0.1" 495 | 496 | emoji-regex@^8.0.0: 497 | version "8.0.0" 498 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 499 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 500 | 501 | es6-promise@^4.0.3: 502 | version "4.2.8" 503 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 504 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 505 | 506 | es6-promisify@^5.0.0: 507 | version "5.0.0" 508 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 509 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 510 | dependencies: 511 | es6-promise "^4.0.3" 512 | 513 | escalade@^3.1.1: 514 | version "3.1.1" 515 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 516 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 517 | 518 | escape-string-regexp@4.0.0: 519 | version "4.0.0" 520 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 521 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 522 | 523 | eventemitter3@^4.0.7: 524 | version "4.0.7" 525 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 526 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 527 | 528 | eyes@^0.1.8: 529 | version "0.1.8" 530 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 531 | integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= 532 | 533 | fill-range@^7.0.1: 534 | version "7.0.1" 535 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 536 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 537 | dependencies: 538 | to-regex-range "^5.0.1" 539 | 540 | find-up@5.0.0: 541 | version "5.0.0" 542 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 543 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 544 | dependencies: 545 | locate-path "^6.0.0" 546 | path-exists "^4.0.0" 547 | 548 | find@^0.3.0: 549 | version "0.3.0" 550 | resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" 551 | integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== 552 | dependencies: 553 | traverse-chain "~0.1.0" 554 | 555 | flat@^5.0.2: 556 | version "5.0.2" 557 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 558 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 559 | 560 | fs.realpath@^1.0.0: 561 | version "1.0.0" 562 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 563 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 564 | 565 | fsevents@~2.3.2: 566 | version "2.3.2" 567 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 568 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 569 | 570 | get-caller-file@^2.0.5: 571 | version "2.0.5" 572 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 573 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 574 | 575 | get-prototype-of@0.0.0: 576 | version "0.0.0" 577 | resolved "https://registry.yarnpkg.com/get-prototype-of/-/get-prototype-of-0.0.0.tgz#98772bd10716d16deb4b322516c469efca28ac44" 578 | integrity sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ= 579 | 580 | glob-parent@~5.1.2: 581 | version "5.1.2" 582 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 583 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 584 | dependencies: 585 | is-glob "^4.0.1" 586 | 587 | glob@7.1.7: 588 | version "7.1.7" 589 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 590 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 591 | dependencies: 592 | fs.realpath "^1.0.0" 593 | inflight "^1.0.4" 594 | inherits "2" 595 | minimatch "^3.0.4" 596 | once "^1.3.0" 597 | path-is-absolute "^1.0.0" 598 | 599 | growl@1.10.5: 600 | version "1.10.5" 601 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 602 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 603 | 604 | has-flag@^4.0.0: 605 | version "4.0.0" 606 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 607 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 608 | 609 | hash.js@^1.0.0, hash.js@^1.0.3: 610 | version "1.1.7" 611 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 612 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 613 | dependencies: 614 | inherits "^2.0.3" 615 | minimalistic-assert "^1.0.1" 616 | 617 | he@1.2.0: 618 | version "1.2.0" 619 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 620 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 621 | 622 | hmac-drbg@^1.0.1: 623 | version "1.0.1" 624 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 625 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 626 | dependencies: 627 | hash.js "^1.0.3" 628 | minimalistic-assert "^1.0.0" 629 | minimalistic-crypto-utils "^1.0.1" 630 | 631 | ieee754@^1.2.1: 632 | version "1.2.1" 633 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 634 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 635 | 636 | inflight@^1.0.4: 637 | version "1.0.6" 638 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 639 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 640 | dependencies: 641 | once "^1.3.0" 642 | wrappy "1" 643 | 644 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 645 | version "2.0.4" 646 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 647 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 648 | 649 | is-binary-path@~2.1.0: 650 | version "2.1.0" 651 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 652 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 653 | dependencies: 654 | binary-extensions "^2.0.0" 655 | 656 | is-capitalized@^1.0.0: 657 | version "1.0.0" 658 | resolved "https://registry.yarnpkg.com/is-capitalized/-/is-capitalized-1.0.0.tgz#4c8464b4d91d3e4eeb44889dd2cd8f1b0ac4c136" 659 | integrity sha1-TIRktNkdPk7rRIid0s2PGwrEwTY= 660 | 661 | is-class@0.0.4: 662 | version "0.0.4" 663 | resolved "https://registry.yarnpkg.com/is-class/-/is-class-0.0.4.tgz#e057451705bb34e39e3e33598c93a9837296b736" 664 | integrity sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY= 665 | 666 | is-extglob@^2.1.1: 667 | version "2.1.1" 668 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 669 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 670 | 671 | is-fullwidth-code-point@^2.0.0: 672 | version "2.0.0" 673 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 674 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 675 | 676 | is-fullwidth-code-point@^3.0.0: 677 | version "3.0.0" 678 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 679 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 680 | 681 | is-glob@^4.0.1, is-glob@~4.0.1: 682 | version "4.0.1" 683 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 684 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 685 | dependencies: 686 | is-extglob "^2.1.1" 687 | 688 | is-number@^7.0.0: 689 | version "7.0.0" 690 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 691 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 692 | 693 | is-plain-obj@^2.1.0: 694 | version "2.1.0" 695 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 696 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 697 | 698 | is-unicode-supported@^0.1.0: 699 | version "0.1.0" 700 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 701 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 702 | 703 | isexe@^2.0.0: 704 | version "2.0.0" 705 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 706 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 707 | 708 | isomorphic-ws@^4.0.1: 709 | version "4.0.1" 710 | resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" 711 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 712 | 713 | jayson@^3.4.4: 714 | version "3.6.4" 715 | resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.4.tgz#9e9d1ba2a75d811f254bceff61a096772fa04832" 716 | integrity sha512-GH63DsRFFlodS8krFgAhxwYvQFmSwjsFxKnPrHQtp+BJj/tpeSj3hyBGGqmTkuq043U1Gn6u8VdsVRFZX1EEiQ== 717 | dependencies: 718 | "@types/connect" "^3.4.33" 719 | "@types/express-serve-static-core" "^4.17.9" 720 | "@types/lodash" "^4.14.159" 721 | "@types/node" "^12.12.54" 722 | "@types/ws" "^7.4.4" 723 | JSONStream "^1.3.5" 724 | commander "^2.20.3" 725 | delay "^5.0.0" 726 | es6-promisify "^5.0.0" 727 | eyes "^0.1.8" 728 | isomorphic-ws "^4.0.1" 729 | json-stringify-safe "^5.0.1" 730 | lodash "^4.17.20" 731 | uuid "^3.4.0" 732 | ws "^7.4.5" 733 | 734 | js-sha256@^0.9.0: 735 | version "0.9.0" 736 | resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" 737 | integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== 738 | 739 | js-sha3@^0.8.0: 740 | version "0.8.0" 741 | resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" 742 | integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== 743 | 744 | js-yaml@4.1.0: 745 | version "4.1.0" 746 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 747 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 748 | dependencies: 749 | argparse "^2.0.1" 750 | 751 | json-stringify-safe@^5.0.1: 752 | version "5.0.1" 753 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 754 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 755 | 756 | jsonparse@^1.2.0: 757 | version "1.3.1" 758 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 759 | integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= 760 | 761 | keypather@^1.10.2: 762 | version "1.10.2" 763 | resolved "https://registry.yarnpkg.com/keypather/-/keypather-1.10.2.tgz#e0449632d4b3e516f21cc014ce7c5644fddce614" 764 | integrity sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ= 765 | dependencies: 766 | "101" "^1.0.0" 767 | 768 | kind-of@^6.0.2: 769 | version "6.0.3" 770 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 771 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 772 | 773 | locate-path@^6.0.0: 774 | version "6.0.0" 775 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 776 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 777 | dependencies: 778 | p-locate "^5.0.0" 779 | 780 | lodash@^4.17.20: 781 | version "4.17.21" 782 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 783 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 784 | 785 | log-symbols@4.1.0: 786 | version "4.1.0" 787 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 788 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 789 | dependencies: 790 | chalk "^4.1.0" 791 | is-unicode-supported "^0.1.0" 792 | 793 | lower-case@^2.0.2: 794 | version "2.0.2" 795 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 796 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 797 | dependencies: 798 | tslib "^2.0.3" 799 | 800 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 801 | version "1.0.1" 802 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 803 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 804 | 805 | minimalistic-crypto-utils@^1.0.1: 806 | version "1.0.1" 807 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 808 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 809 | 810 | minimatch@3.0.4, minimatch@^3.0.4: 811 | version "3.0.4" 812 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 813 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 814 | dependencies: 815 | brace-expansion "^1.1.7" 816 | 817 | mocha@^9.0.3: 818 | version "9.0.3" 819 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.0.3.tgz#128cd6bbd3ee0adcdaef715f357f76ec1e6227c7" 820 | integrity sha512-hnYFrSefHxYS2XFGtN01x8un0EwNu2bzKvhpRFhgoybIvMaOkkL60IVPmkb5h6XDmUl4IMSB+rT5cIO4/4bJgg== 821 | dependencies: 822 | "@ungap/promise-all-settled" "1.1.2" 823 | ansi-colors "4.1.1" 824 | browser-stdout "1.3.1" 825 | chokidar "3.5.2" 826 | debug "4.3.1" 827 | diff "5.0.0" 828 | escape-string-regexp "4.0.0" 829 | find-up "5.0.0" 830 | glob "7.1.7" 831 | growl "1.10.5" 832 | he "1.2.0" 833 | js-yaml "4.1.0" 834 | log-symbols "4.1.0" 835 | minimatch "3.0.4" 836 | ms "2.1.3" 837 | nanoid "3.1.23" 838 | serialize-javascript "6.0.0" 839 | strip-json-comments "3.1.1" 840 | supports-color "8.1.1" 841 | which "2.0.2" 842 | wide-align "1.1.3" 843 | workerpool "6.1.5" 844 | yargs "16.2.0" 845 | yargs-parser "20.2.4" 846 | yargs-unparser "2.0.0" 847 | 848 | ms@2.0.0: 849 | version "2.0.0" 850 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 851 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 852 | 853 | ms@2.1.2: 854 | version "2.1.2" 855 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 856 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 857 | 858 | ms@2.1.3: 859 | version "2.1.3" 860 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 861 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 862 | 863 | nanoid@3.1.23: 864 | version "3.1.23" 865 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" 866 | integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== 867 | 868 | no-case@^3.0.4: 869 | version "3.0.4" 870 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 871 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 872 | dependencies: 873 | lower-case "^2.0.2" 874 | tslib "^2.0.3" 875 | 876 | node-addon-api@^2.0.0: 877 | version "2.0.2" 878 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" 879 | integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== 880 | 881 | node-fetch@^2.6.1: 882 | version "2.6.1" 883 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 884 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 885 | 886 | node-gyp-build@^4.2.0: 887 | version "4.2.3" 888 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" 889 | integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== 890 | 891 | normalize-path@^3.0.0, normalize-path@~3.0.0: 892 | version "3.0.0" 893 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 894 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 895 | 896 | once@^1.3.0: 897 | version "1.4.0" 898 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 899 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 900 | dependencies: 901 | wrappy "1" 902 | 903 | p-limit@^3.0.2: 904 | version "3.1.0" 905 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 906 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 907 | dependencies: 908 | yocto-queue "^0.1.0" 909 | 910 | p-locate@^5.0.0: 911 | version "5.0.0" 912 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 913 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 914 | dependencies: 915 | p-limit "^3.0.2" 916 | 917 | pako@^2.0.3: 918 | version "2.0.4" 919 | resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" 920 | integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== 921 | 922 | path-exists@^4.0.0: 923 | version "4.0.0" 924 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 925 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 926 | 927 | path-is-absolute@^1.0.0: 928 | version "1.0.1" 929 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 930 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 931 | 932 | picomatch@^2.0.4, picomatch@^2.2.1: 933 | version "2.3.0" 934 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 935 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 936 | 937 | randombytes@^2.1.0: 938 | version "2.1.0" 939 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 940 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 941 | dependencies: 942 | safe-buffer "^5.1.0" 943 | 944 | readdirp@~3.6.0: 945 | version "3.6.0" 946 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 947 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 948 | dependencies: 949 | picomatch "^2.2.1" 950 | 951 | regenerator-runtime@^0.13.4: 952 | version "0.13.9" 953 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 954 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 955 | 956 | require-directory@^2.1.1: 957 | version "2.1.1" 958 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 959 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 960 | 961 | rpc-websockets@^7.4.2: 962 | version "7.4.12" 963 | resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.12.tgz#6a187a772cbe9ee48ed04e001b6d9c29b8e69bae" 964 | integrity sha512-WxZRM4443SiYbJhsLwVJc6P/VAQJIkeDS89CQAuHqyMt/GX8GEplWZezcLw6MMGemzA6Kp32kz7CbQppMTLQxA== 965 | dependencies: 966 | "@babel/runtime" "^7.11.2" 967 | assert-args "^1.2.1" 968 | circular-json "^0.5.9" 969 | eventemitter3 "^4.0.7" 970 | uuid "^8.3.0" 971 | ws "^7.4.5" 972 | optionalDependencies: 973 | bufferutil "^4.0.1" 974 | utf-8-validate "^5.0.2" 975 | 976 | safe-buffer@^5.0.1, safe-buffer@^5.1.0: 977 | version "5.2.1" 978 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 979 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 980 | 981 | secp256k1@^4.0.2: 982 | version "4.0.2" 983 | resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" 984 | integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== 985 | dependencies: 986 | elliptic "^6.5.2" 987 | node-addon-api "^2.0.0" 988 | node-gyp-build "^4.2.0" 989 | 990 | serialize-javascript@6.0.0: 991 | version "6.0.0" 992 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 993 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 994 | dependencies: 995 | randombytes "^2.1.0" 996 | 997 | snake-case@^3.0.4: 998 | version "3.0.4" 999 | resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" 1000 | integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== 1001 | dependencies: 1002 | dot-case "^3.0.4" 1003 | tslib "^2.0.3" 1004 | 1005 | "string-width@^1.0.2 || 2": 1006 | version "2.1.1" 1007 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1008 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1009 | dependencies: 1010 | is-fullwidth-code-point "^2.0.0" 1011 | strip-ansi "^4.0.0" 1012 | 1013 | string-width@^4.1.0, string-width@^4.2.0: 1014 | version "4.2.2" 1015 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 1016 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1017 | dependencies: 1018 | emoji-regex "^8.0.0" 1019 | is-fullwidth-code-point "^3.0.0" 1020 | strip-ansi "^6.0.0" 1021 | 1022 | strip-ansi@^4.0.0: 1023 | version "4.0.0" 1024 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1025 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1026 | dependencies: 1027 | ansi-regex "^3.0.0" 1028 | 1029 | strip-ansi@^6.0.0: 1030 | version "6.0.0" 1031 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1032 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1033 | dependencies: 1034 | ansi-regex "^5.0.0" 1035 | 1036 | strip-json-comments@3.1.1: 1037 | version "3.1.1" 1038 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1039 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1040 | 1041 | superstruct@0.8.3: 1042 | version "0.8.3" 1043 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.8.3.tgz#fb4d8901aca3bf9f79afab1bbab7a7f335cc4ef2" 1044 | integrity sha512-LbtbFpktW1FcwxVIJlxdk7bCyBq/GzOx2FSFLRLTUhWIA1gHkYPIl3aXRG5mBdGZtnPNT6t+4eEcLDCMOuBHww== 1045 | dependencies: 1046 | kind-of "^6.0.2" 1047 | tiny-invariant "^1.0.6" 1048 | 1049 | superstruct@^0.14.2: 1050 | version "0.14.2" 1051 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" 1052 | integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== 1053 | 1054 | supports-color@8.1.1: 1055 | version "8.1.1" 1056 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1057 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1058 | dependencies: 1059 | has-flag "^4.0.0" 1060 | 1061 | supports-color@^7.1.0: 1062 | version "7.2.0" 1063 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1064 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1065 | dependencies: 1066 | has-flag "^4.0.0" 1067 | 1068 | text-encoding-utf-8@^1.0.2: 1069 | version "1.0.2" 1070 | resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" 1071 | integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== 1072 | 1073 | "through@>=2.2.7 <3": 1074 | version "2.3.8" 1075 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1076 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1077 | 1078 | tiny-invariant@^1.0.6: 1079 | version "1.1.0" 1080 | resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" 1081 | integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== 1082 | 1083 | to-regex-range@^5.0.1: 1084 | version "5.0.1" 1085 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1086 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1087 | dependencies: 1088 | is-number "^7.0.0" 1089 | 1090 | toml@^3.0.0: 1091 | version "3.0.0" 1092 | resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" 1093 | integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== 1094 | 1095 | traverse-chain@~0.1.0: 1096 | version "0.1.0" 1097 | resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" 1098 | integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= 1099 | 1100 | tslib@^2.0.3: 1101 | version "2.3.0" 1102 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" 1103 | integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== 1104 | 1105 | tweetnacl@^1.0.0: 1106 | version "1.0.3" 1107 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" 1108 | integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 1109 | 1110 | type-detect@0.1.1: 1111 | version "0.1.1" 1112 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 1113 | integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= 1114 | 1115 | utf-8-validate@^5.0.2: 1116 | version "5.0.5" 1117 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.5.tgz#dd32c2e82c72002dc9f02eb67ba6761f43456ca1" 1118 | integrity sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ== 1119 | dependencies: 1120 | node-gyp-build "^4.2.0" 1121 | 1122 | uuid@^3.4.0: 1123 | version "3.4.0" 1124 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1125 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1126 | 1127 | uuid@^8.3.0: 1128 | version "8.3.2" 1129 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1130 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1131 | 1132 | which@2.0.2: 1133 | version "2.0.2" 1134 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1135 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1136 | dependencies: 1137 | isexe "^2.0.0" 1138 | 1139 | wide-align@1.1.3: 1140 | version "1.1.3" 1141 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1142 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1143 | dependencies: 1144 | string-width "^1.0.2 || 2" 1145 | 1146 | workerpool@6.1.5: 1147 | version "6.1.5" 1148 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" 1149 | integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== 1150 | 1151 | wrap-ansi@^7.0.0: 1152 | version "7.0.0" 1153 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1154 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1155 | dependencies: 1156 | ansi-styles "^4.0.0" 1157 | string-width "^4.1.0" 1158 | strip-ansi "^6.0.0" 1159 | 1160 | wrappy@1: 1161 | version "1.0.2" 1162 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1163 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1164 | 1165 | ws@^7.4.5: 1166 | version "7.5.3" 1167 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" 1168 | integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== 1169 | 1170 | y18n@^5.0.5: 1171 | version "5.0.8" 1172 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1173 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1174 | 1175 | yargs-parser@20.2.4: 1176 | version "20.2.4" 1177 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1178 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1179 | 1180 | yargs-parser@^20.2.2: 1181 | version "20.2.9" 1182 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1183 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1184 | 1185 | yargs-unparser@2.0.0: 1186 | version "2.0.0" 1187 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1188 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1189 | dependencies: 1190 | camelcase "^6.0.0" 1191 | decamelize "^4.0.0" 1192 | flat "^5.0.2" 1193 | is-plain-obj "^2.1.0" 1194 | 1195 | yargs@16.2.0: 1196 | version "16.2.0" 1197 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1198 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1199 | dependencies: 1200 | cliui "^7.0.2" 1201 | escalade "^3.1.1" 1202 | get-caller-file "^2.0.5" 1203 | require-directory "^2.1.1" 1204 | string-width "^4.2.0" 1205 | y18n "^5.0.5" 1206 | yargs-parser "^20.2.2" 1207 | 1208 | yocto-queue@^0.1.0: 1209 | version "0.1.0" 1210 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1211 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1212 | --------------------------------------------------------------------------------