├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── ClockworkProvider.ts ├── accounts │ ├── Thread.ts │ └── index.ts ├── constants │ └── index.ts ├── index.ts ├── models │ ├── ClockData.ts │ ├── CrateInfo.ts │ ├── ExecContext.ts │ ├── SerializableInstruction.ts │ ├── ThreadSettings.ts │ ├── Trigger.ts │ ├── TriggerContext.ts │ └── index.ts ├── programs │ └── thread │ │ ├── idl.json │ │ └── types.ts └── utils.ts ├── tests └── ThreadProgram.test.ts ├── tsconfig.json └── yarn.lock /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish Package to npmjs 2 | on: 3 | workflow_dispatch: 4 | # on: 5 | # push: 6 | # branches: 7 | # - main 8 | 9 | jobs: 10 | publish: 11 | name: Publish 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v3 16 | - name: Setup Node 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: '16.x' 20 | registry-url: https://registry.npmjs.org/ 21 | - name: Install Dependencies 22 | run: npm install 23 | - name: Build Library 24 | run: npm run build 25 | - name: Publish 26 | run: npm publish --access public 27 | env: 28 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | tests 3 | tsconfig.json 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Clockwork 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Clockwork SDK

2 |

Clockwork Typescript SDK

3 | 4 |
5 | 6 | ![License](https://img.shields.io/badge/License-MIT-yellow.svg) 7 | 8 |
9 | 10 | ## Getting Started 11 | 12 | For a quickstart guide and in depth tutorials, see the [Clockwork Docs](https://docs.clockwork.xyz/about/readme). 13 | To jump straight to examples, go [here](https://github.com/clockwork-xyz/sdk/tree/main/tests). For the latest Rust API documentation, see [Clockwork Rust SDK](https://docs.rs/clockwork-sdk/latest/clockwork_sdk/). 14 | 15 | ## Note 16 | 17 | - **Clockwork SDK is in active development, so all APIs are subject to change.** 18 | - **This code is unaudited. Use at your own risk.** 19 | 20 | ## Usage 21 | 22 | First, initialize a `ClockworkProvider` 23 | 24 | ```rust 25 | const wallet = new NodeWallet(new Keypair()); 26 | const connection = new Connection(clusterApiUrl("devnet")); 27 | const clockworkProvider = new ClockworkProvider(wallet, connection); 28 | 29 | #or 30 | const anchorProvider = new anchor.AnchorProvider( 31 | connection, 32 | wallet, 33 | anchor.AnchorProvider.defaultOptions() 34 | ); 35 | const provider = new ClockworkProvider.fromAnchorProvider(provider); 36 | ``` 37 | 38 | Get Thread Address 39 | 40 | ```rust 41 | const [pubkey, bump] = provider.getThreadPDA( 42 | wallet.publicKey, 43 | "ThreadProgramTest" 44 | ); 45 | ``` 46 | 47 | Initialize a Thread 48 | 49 | ```rust 50 | const ix = await provider.threadCreate( 51 | wallet.publicKey, // authority 52 | "ThreadProgramTest", // id 53 | [], // instructions to execute 54 | { now: {} }, // thread trigger 55 | 0.1 * LAMPORTS_PER_SOL // amount to send to the thread 56 | ); 57 | const tx = new Transaction().add(ix); 58 | const signature = await provider.anchorProvider.sendAndConfirm(tx); 59 | ``` 60 | 61 | Get Thread Data Deserialized 62 | 63 | ```rust 64 | const threadAccount = await provider.getThreadAccount(threadPubkey); 65 | ``` 66 | 67 | Pause/Resume/Reset/Delete/ Thread 68 | 69 | ```rust 70 | const ix = await provider.threadPause(wallet.publicKey, threadPubkey); 71 | const ix = await provider.threadResume(wallet.publicKey, threadPubkey); 72 | const ix = await provider.threadReset(wallet.publicKey, threadPubkey); 73 | const ix = await provider.threadDelete(wallet.publicKey, threadPubkey); 74 | ``` 75 | 76 | Update a Thread 77 | 78 | ```rust 79 | const ix = await provider.threadUpdate(wallet.publicKey, threadPubkey, { 80 | name: "TestUpdateThread", 81 | rateLimit: new BN(32), 82 | trigger: { now: {} }, 83 | }); 84 | const tx = new Transaction().add(ix); 85 | const signature = await provider.anchorProvider.sendAndConfirm(tx); 86 | ``` 87 | 88 | Withdraw from Thread 89 | 90 | ```rust 91 | const ix = await provider.threadWithdraw( 92 | wallet.publicKey, 93 | threadPubkey, 94 | 0.01 * LAMPORTS_PER_SOL 95 | ); 96 | const tx = new Transaction().add(ix); 97 | const signature = await provider.anchorProvider.sendAndConfirm(tx); 98 | ``` 99 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@clockwork-xyz/sdk", 3 | "author": "Clockwork", 4 | "version": "0.3.4", 5 | "description": "Clockwork Typescript SDK", 6 | "license": "MIT", 7 | "homepage": "https://github.com/clockwork-xyz/sdk", 8 | "bugs": { 9 | "url": "https://github.com/clockwork-xyz/sdk/issues" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/clockwork-xyz/sdk.git" 14 | }, 15 | "publishConfig": { 16 | "access": "public" 17 | }, 18 | "keywords": [ 19 | "Solana", 20 | "Clockwork", 21 | "SDK" 22 | ], 23 | "main": "lib/index.js", 24 | "types": "lib/index.d.ts", 25 | "declaration": true, 26 | "strict": true, 27 | "outDir": "./lib", 28 | "scripts": { 29 | "start": "ts-node src/index.ts", 30 | "build": "tsc", 31 | "test": "mocha --timeout 600000 --reporter spec --require ts-node/register tests/**/*.test.ts", 32 | "test:thread": "mocha --timeout 600000 --reporter spec --require ts-node/register tests/ThreadProgram.test.ts" 33 | }, 34 | "devDependencies": { 35 | "@types/chai": "^4.3.4", 36 | "@types/mocha": "^10.0.1", 37 | "@types/node": "^18.14.0", 38 | "chai": "^4.3.7", 39 | "mocha": "^10.2.0", 40 | "nodemon": "^2.0.20", 41 | "ts-node": "^10.9.1", 42 | "typescript": "^4.9.5" 43 | }, 44 | "dependencies": { 45 | "@coral-xyz/anchor": "^0.26.0", 46 | "@solana/web3.js": "^1.73.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/ClockworkProvider.ts: -------------------------------------------------------------------------------- 1 | import * as anchor from "@coral-xyz/anchor"; 2 | import { 3 | ConfirmOptions, 4 | Connection, 5 | PublicKey, 6 | Transaction, 7 | TransactionInstruction, 8 | } from "@solana/web3.js"; 9 | 10 | import { ThreadProgram } from "./programs/thread/types"; 11 | import ThreadProgramIdl from "./programs/thread/idl.json"; 12 | 13 | import { Thread } from "./accounts"; 14 | import { ThreadSettingsInput, TriggerInput } from "./models"; 15 | import { 16 | parseThreadSettingsInput, 17 | parseTransactionInstruction, 18 | parseTransactionInstructions, 19 | } from "./utils"; 20 | 21 | /** 22 | * Wallet interface for objects that can be used to sign provider transactions. 23 | */ 24 | export interface ClockworkProviderWallet { 25 | signTransaction(tx: Transaction): Promise; 26 | signAllTransactions(txs: Transaction[]): Promise; 27 | publicKey: PublicKey; 28 | } 29 | 30 | class ClockworkProvider { 31 | threadProgram: anchor.Program; 32 | anchorProvider: anchor.AnchorProvider; 33 | 34 | constructor( 35 | wallet: ClockworkProviderWallet, 36 | connection: Connection, 37 | opts: ConfirmOptions = anchor.AnchorProvider.defaultOptions() 38 | ) { 39 | this.anchorProvider = new anchor.AnchorProvider(connection, wallet, opts); 40 | this.threadProgram = new anchor.Program( 41 | ThreadProgramIdl as anchor.Idl as ThreadProgram, 42 | ThreadProgramIdl.metadata.address, 43 | this.anchorProvider 44 | ); 45 | } 46 | 47 | /** 48 | * Build a ClockworkProvider from an AnchorProvider 49 | * 50 | * @param authority thread authority 51 | */ 52 | static fromAnchorProvider(provider: anchor.AnchorProvider): ClockworkProvider { 53 | const clockworkProvider = new ClockworkProvider( 54 | provider.wallet, 55 | provider.connection, 56 | provider.opts 57 | ); 58 | return clockworkProvider; 59 | } 60 | 61 | /** 62 | * Get Thread PDA. Returns the public key and bump. 63 | * 64 | * @param authority thread authority 65 | * @param id thread id 66 | */ 67 | getThreadPDA(authority: PublicKey, id: string): [PublicKey, number] { 68 | return PublicKey.findProgramAddressSync( 69 | [Buffer.from("thread"), authority.toBuffer(), Buffer.from(id)], 70 | this.threadProgram.programId 71 | ); 72 | } 73 | 74 | /** 75 | * Get Thread Account Data Deserialized. 76 | * 77 | * @param threadPubkey thread public key 78 | */ 79 | async getThreadAccount(threadPubkey: PublicKey): Promise { 80 | const threadAccount = await this.threadProgram.account.thread.fetch( 81 | threadPubkey 82 | ); 83 | return threadAccount; 84 | } 85 | 86 | /** 87 | * Create a new thread. 88 | * 89 | * @param authority thread authority 90 | * @param id thread id 91 | * @param instructions thread instructions 92 | * @param trigger thread trigger 93 | * @param amount amount to transfer to the thread in lamports (default 0) 94 | */ 95 | async threadCreate( 96 | authority: PublicKey, 97 | id: string, 98 | instructions: TransactionInstruction[], 99 | trigger: TriggerInput, 100 | amount: number = 0 101 | ): Promise { 102 | const threadPubkey = this.getThreadPDA(authority, id.toString())[0]; 103 | return await this.threadProgram.methods 104 | .threadCreate( 105 | new anchor.BN(amount), 106 | Buffer.from(id), 107 | // TODO: parsing can be removed accounts => keys 108 | parseTransactionInstructions(instructions), 109 | trigger 110 | ) 111 | .accounts({ 112 | authority: authority, 113 | payer: authority, 114 | systemProgram: anchor.web3.SystemProgram.programId, 115 | thread: threadPubkey, 116 | }) 117 | .instruction(); 118 | } 119 | 120 | /** 121 | * Delete a thread. 122 | * 123 | * @param authority The authority (owner) of the thread. 124 | * @param threadPubkey thread to delete. 125 | * @param closeTo The address to return the data rent lamports to (default payer). 126 | */ 127 | async threadDelete( 128 | authority: PublicKey, 129 | threadPubkey: PublicKey, 130 | closeTo: PublicKey = this.threadProgram.provider.publicKey 131 | ): Promise { 132 | return await this.threadProgram.methods 133 | .threadDelete() 134 | .accounts({ 135 | authority: authority, 136 | thread: threadPubkey, 137 | closeTo, 138 | }) 139 | .instruction(); 140 | } 141 | 142 | /** 143 | * Pause a thread. 144 | * 145 | * @param authority The authority (owner) of the thread. 146 | * @param threadPubkey thread to pause. 147 | */ 148 | async threadPause( 149 | authority: PublicKey, 150 | threadPubkey: PublicKey 151 | ): Promise { 152 | return await this.threadProgram.methods 153 | .threadPause() 154 | .accounts({ 155 | authority: authority, 156 | thread: threadPubkey, 157 | }) 158 | .instruction(); 159 | } 160 | 161 | /** 162 | * Resume a thread. 163 | * 164 | * @param authority The authority (owner) of the thread. 165 | * @param threadPubkey thread to resume. 166 | */ 167 | async threadResume( 168 | authority: PublicKey, 169 | threadPubkey: PublicKey 170 | ): Promise { 171 | return await this.threadProgram.methods 172 | .threadResume() 173 | .accounts({ 174 | authority: authority, 175 | thread: threadPubkey, 176 | }) 177 | .instruction(); 178 | } 179 | 180 | /** 181 | * Reset a thread. 182 | * 183 | * @param authority The authority (owner) of the thread. 184 | * @param threadPubkey thread to reset. 185 | */ 186 | async threadReset(authority: PublicKey, threadPubkey: PublicKey): Promise { 187 | return await this.threadProgram.methods 188 | .threadReset() 189 | .accounts({ 190 | authority: authority, 191 | thread: threadPubkey, 192 | }) 193 | .instruction(); 194 | } 195 | 196 | /** 197 | * Withdraw from thread. 198 | * 199 | * @param authority The authority (owner) of the thread. 200 | * @param threadPubkey thread to withdraw from. 201 | * @param payTo The account to withdraw lamports to (default payer) 202 | */ 203 | async threadWithdraw( 204 | authority: PublicKey, 205 | threadPubkey: PublicKey, 206 | amount: number, 207 | payTo: PublicKey = this.threadProgram.provider.publicKey 208 | ): Promise { 209 | return await this.threadProgram.methods 210 | .threadWithdraw(new anchor.BN(amount)) 211 | .accounts({ 212 | authority: authority, 213 | thread: threadPubkey, 214 | payTo, 215 | }) 216 | .instruction(); 217 | } 218 | 219 | /** 220 | * Update a thread. 221 | * 222 | * @param authority The authority (owner) of the thread. 223 | * @param threadPubkey thread to update. 224 | * @param settings new thread settings. 225 | */ 226 | async threadUpdate( 227 | authority: PublicKey, 228 | threadPubkey: PublicKey, 229 | settings: ThreadSettingsInput 230 | ): Promise { 231 | return await this.threadProgram.methods 232 | .threadUpdate(parseThreadSettingsInput(settings)) 233 | .accounts({ 234 | authority: authority, 235 | thread: threadPubkey, 236 | }) 237 | .instruction(); 238 | } 239 | 240 | /** 241 | * Add instruction to a thread. 242 | * 243 | * @param authority The authority (owner) of the thread. 244 | * @param threadPubkey thread to add instruction to. 245 | * @param instructions instructions to add. 246 | */ 247 | async threadInstructionAdd( 248 | authority: PublicKey, 249 | threadPubkey: PublicKey, 250 | instruction: TransactionInstruction 251 | ): Promise { 252 | return await this.threadProgram.methods 253 | .threadInstructionAdd(parseTransactionInstruction(instruction)) 254 | .accounts({ 255 | authority: authority, 256 | thread: threadPubkey, 257 | }) 258 | .instruction(); 259 | } 260 | 261 | /** 262 | * Remove an instruction from a thread. 263 | * 264 | * @param authority The authority (owner) of the thread. 265 | * @param threadPubkey thread to remove instruction from. 266 | * @param index instruction index to be removed. 267 | */ 268 | async threadInstructionRemove( 269 | authority: PublicKey, 270 | threadPubkey: PublicKey, 271 | index: number 272 | ): Promise { 273 | return await this.threadProgram.methods 274 | .threadInstructionRemove(new anchor.BN(index)) 275 | .accounts({ 276 | authority: authority, 277 | thread: threadPubkey, 278 | }) 279 | .instruction(); 280 | } 281 | 282 | /** 283 | * Get Crate Info. 284 | * 285 | */ 286 | async getCrateInfo(): Promise { 287 | return await this.threadProgram.methods.getCrateInfo().accounts({}).instruction(); 288 | } 289 | } 290 | 291 | export default ClockworkProvider; 292 | -------------------------------------------------------------------------------- /src/accounts/Thread.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | import { PublicKey } from "@solana/web3.js"; 3 | import { 4 | ExecContext, 5 | ClockData, 6 | SerializableInstruction, 7 | Trigger, 8 | } from "../models"; 9 | 10 | type Thread = { 11 | authority: PublicKey; 12 | bump: number; 13 | createdAt: ClockData; 14 | execContext: null | ExecContext; 15 | fee: BN; 16 | id: Buffer; 17 | instructions: SerializableInstruction[]; 18 | name: string; 19 | nextInstruction: null | SerializableInstruction; 20 | paused: boolean; 21 | rateLimit: BN; 22 | trigger: Trigger; 23 | }; 24 | 25 | export default Thread; 26 | -------------------------------------------------------------------------------- /src/accounts/index.ts: -------------------------------------------------------------------------------- 1 | import Thread from "./Thread"; 2 | 3 | export { Thread }; 4 | -------------------------------------------------------------------------------- /src/constants/index.ts: -------------------------------------------------------------------------------- 1 | import { PublicKey } from "@solana/web3.js"; 2 | 3 | /** 4 | * The stand-in pubkey for delegating a payer address to a worker. 5 | * All workers are re-imbursed by the user for lamports spent during this delegation. 6 | * https://docs.rs/clockwork-utils/latest/clockwork_utils/static.PAYER_PUBKEY.html 7 | */ 8 | const PAYER_PUBKEY = new PublicKey( 9 | "C1ockworkPayer11111111111111111111111111111" 10 | ); 11 | 12 | export { PAYER_PUBKEY }; 13 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import ClockworkProvider from "./ClockworkProvider"; 2 | import { Thread } from "./accounts"; 3 | import { PAYER_PUBKEY } from "./constants"; 4 | import { 5 | ClockData, 6 | ExecContext, 7 | SerializableInstruction, 8 | SerializableAccount, 9 | Trigger, 10 | TriggerInput, 11 | Cron, 12 | Account, 13 | Now, 14 | Epoch, 15 | Slot, 16 | Timestamp, 17 | Pyth, 18 | Equality, 19 | EqualityInput, 20 | GreaterThanOrEqual, 21 | LessThanOrEqual, 22 | ThreadSettings, 23 | ThreadSettingsInput, 24 | CrateInfo, 25 | TriggerContext, 26 | } from "./models"; 27 | 28 | import { ThreadProgram } from "./programs/thread/types"; 29 | import ThreadProgramIdl from "./programs/thread/idl.json"; 30 | 31 | import { 32 | parseThreadSettingsInput, 33 | parseTransactionInstruction, 34 | parseTransactionInstructions, 35 | } from "./utils"; 36 | 37 | export { 38 | ClockworkProvider, 39 | Thread, 40 | PAYER_PUBKEY, 41 | ThreadProgram, 42 | ThreadProgramIdl, 43 | parseThreadSettingsInput, 44 | parseTransactionInstruction, 45 | parseTransactionInstructions, 46 | ClockData, 47 | ExecContext, 48 | SerializableInstruction, 49 | SerializableAccount, 50 | Trigger, 51 | TriggerInput, 52 | Cron, 53 | Account, 54 | Now, 55 | Epoch, 56 | Slot, 57 | Timestamp, 58 | Pyth, 59 | Equality, 60 | EqualityInput, 61 | GreaterThanOrEqual, 62 | LessThanOrEqual, 63 | ThreadSettings, 64 | ThreadSettingsInput, 65 | CrateInfo, 66 | TriggerContext, 67 | }; 68 | -------------------------------------------------------------------------------- /src/models/ClockData.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | 3 | type ClockData = { 4 | /// The current slot. 5 | slot: BN; 6 | /// The bank epoch. 7 | epoch: BN; 8 | /// The current unix timestamp. 9 | unixTimestamp: BN; 10 | }; 11 | 12 | export default ClockData; 13 | -------------------------------------------------------------------------------- /src/models/CrateInfo.ts: -------------------------------------------------------------------------------- 1 | type CrateInfo = { 2 | spec: string; 3 | blob: string; 4 | }; 5 | 6 | export default CrateInfo; 7 | -------------------------------------------------------------------------------- /src/models/ExecContext.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | import TriggerContext from "./TriggerContext"; 3 | 4 | type ExecContext = { 5 | /** 6 | * Index of the next instruction to be executed. 7 | */ 8 | execIndex: BN; 9 | /** 10 | * Number of execs since the last tx reimbursement. 11 | */ 12 | execsSinceReimbursement: BN; 13 | /** 14 | * Number of execs in this slot. 15 | */ 16 | execsSinceSlot: BN; 17 | 18 | /** 19 | * Slot of the last exec 20 | */ 21 | lastExecAt: BN; 22 | 23 | /** 24 | * Context for the triggering condition 25 | */ 26 | triggerContext: TriggerContext; 27 | }; 28 | 29 | export default ExecContext; 30 | -------------------------------------------------------------------------------- /src/models/SerializableInstruction.ts: -------------------------------------------------------------------------------- 1 | import { PublicKey } from "@solana/web3.js"; 2 | 3 | type SerializableAccount = { 4 | /// An account's public key 5 | pubkey: PublicKey; 6 | /// True if an Instruction requires a Transaction signature matching `pubkey`. 7 | isSigner: boolean; 8 | /// True if the `pubkey` can be loaded as a read-write account. 9 | isWritable: boolean; 10 | }; 11 | 12 | type SerializableInstruction = { 13 | /// Pubkey of the instruction processor that executes this instruction 14 | programId: PublicKey; 15 | /// Metadata for what accounts should be passed to the instruction processor 16 | accounts: SerializableAccount[]; 17 | /// Opaque data passed to the instruction processor 18 | data: Buffer; 19 | }; 20 | 21 | export { SerializableInstruction, SerializableAccount }; 22 | -------------------------------------------------------------------------------- /src/models/ThreadSettings.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | import { SerializableInstruction } from "./SerializableInstruction"; 3 | import { TriggerInput } from "./Trigger"; 4 | 5 | type ThreadSettings = { 6 | fee: BN | null; 7 | instructions: SerializableInstruction[] | null; 8 | name: string | null; 9 | rateLimit: BN | null; 10 | trigger: TriggerInput | null; 11 | }; 12 | 13 | type ThreadSettingsInput = { 14 | fee?: number; 15 | instructions?: SerializableInstruction[]; 16 | name?: string; 17 | rateLimit?: number; 18 | trigger?: TriggerInput; 19 | }; 20 | 21 | export { ThreadSettings, ThreadSettingsInput }; 22 | -------------------------------------------------------------------------------- /src/models/Trigger.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | import { PublicKey } from "@solana/web3.js"; 3 | 4 | type Account = { 5 | /// The address of the account to monitor. 6 | address: PublicKey; 7 | /// The byte offset of the account data to monitor. 8 | offset: BN; 9 | /// The size of the byte slice to monitor (must be less than 1kb) 10 | size: BN; 11 | }; 12 | 13 | /// Allows an thread to be kicked off according to a one-time or recurring schedule. 14 | type Cron = { 15 | /// The schedule in cron syntax. Value must be parsable by the `clockwork_cron` package. 16 | schedule: string; 17 | 18 | /// Boolean value indicating whether triggering moments may be skipped if they are missed (e.g. due to network downtime). 19 | /// If false, any "missed" triggering moments will simply be executed as soon as the network comes back online. 20 | skippable: boolean; 21 | }; 22 | 23 | /// Allows an thread to be kicked off as soon as it's created. 24 | type Now = {}; 25 | 26 | /// Allows a thread to be kicked off according to a slot. 27 | type Slot = { 28 | slot: BN; 29 | }; 30 | 31 | /// Allows a thread to be kicked off according to an epoch number. 32 | type Epoch = { 33 | epoch: BN; 34 | }; 35 | 36 | /// Allows a thread to be kicked off accounting to a unix timestamp. 37 | type Timestamp = { 38 | unixTs: BN 39 | }; 40 | 41 | /// Allows a thread to be kicked off accounting to a Pyth price feed movement. 42 | type Pyth = { 43 | /// The address of the price feed to monitor. 44 | priceFeed: PublicKey; 45 | /// The equality operator (gte or lte) used to compare prices. 46 | equality: EqualityInput; 47 | /// The limit price to compare the Pyth feed to. 48 | limit: BN; 49 | } 50 | 51 | type GreaterThanOrEqual = {}; 52 | type LessThanOrEqual = {}; 53 | type Equality = GreaterThanOrEqual | LessThanOrEqual; 54 | type EqualityInput = 55 | | { greaterThanOrEqual: GreaterThanOrEqual } 56 | | { lessThanOrEqual: LessThanOrEqual }; 57 | 58 | type Trigger = Account | Cron | Now | Slot | Epoch | Timestamp | Pyth; 59 | type TriggerInput = 60 | | { account: Account } 61 | | { cron: Cron } 62 | | { now: Now } 63 | | { slot: Slot } 64 | | { epoch: Epoch } 65 | | { timestamp: Timestamp } 66 | | { pyth: Pyth }; 67 | 68 | export { 69 | Trigger, 70 | TriggerInput, 71 | Account, 72 | Cron, 73 | Now, 74 | Slot, 75 | Epoch, 76 | Timestamp, 77 | Pyth, 78 | GreaterThanOrEqual, 79 | LessThanOrEqual, 80 | Equality, 81 | EqualityInput, 82 | }; 83 | -------------------------------------------------------------------------------- /src/models/TriggerContext.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | 3 | type AccountTriggerContext = { 4 | dataHash: BN; 5 | }; 6 | 7 | type CronTriggerContext = { 8 | startedAt: BN; 9 | }; 10 | 11 | type NowTriggerContext = {}; 12 | 13 | type SlotTriggerContext = { 14 | startedAt: BN; 15 | }; 16 | 17 | type EpochTriggerContext = { 18 | startedAt: BN; 19 | }; 20 | 21 | type TimestampTriggerContext = { 22 | startedAt: BN; 23 | }; 24 | 25 | type PythTriggerContext = { 26 | price: BN; 27 | }; 28 | 29 | type TriggerContext = 30 | | AccountTriggerContext 31 | | CronTriggerContext 32 | | NowTriggerContext 33 | | SlotTriggerContext 34 | | EpochTriggerContext 35 | | TimestampTriggerContext 36 | | PythTriggerContext; 37 | 38 | export default TriggerContext; 39 | -------------------------------------------------------------------------------- /src/models/index.ts: -------------------------------------------------------------------------------- 1 | import ExecContext from "./ExecContext"; 2 | import ClockData from "./ClockData"; 3 | import { 4 | SerializableInstruction, 5 | SerializableAccount, 6 | } from "./SerializableInstruction"; 7 | import { 8 | Trigger, 9 | TriggerInput, 10 | Cron, 11 | Account, 12 | Now, 13 | Epoch, 14 | Slot, 15 | Timestamp, 16 | Pyth, 17 | Equality, 18 | EqualityInput, 19 | GreaterThanOrEqual, 20 | LessThanOrEqual, 21 | } from "./Trigger"; 22 | import { ThreadSettings, ThreadSettingsInput } from "./ThreadSettings"; 23 | import CrateInfo from "./CrateInfo"; 24 | import TriggerContext from "./TriggerContext"; 25 | 26 | export { 27 | ClockData, 28 | ExecContext, 29 | SerializableInstruction, 30 | SerializableAccount, 31 | Trigger, 32 | TriggerInput, 33 | Cron, 34 | Account, 35 | Now, 36 | Epoch, 37 | Slot, 38 | Timestamp, 39 | Pyth, 40 | Equality, 41 | EqualityInput, 42 | GreaterThanOrEqual, 43 | LessThanOrEqual, 44 | ThreadSettings, 45 | ThreadSettingsInput, 46 | CrateInfo, 47 | TriggerContext, 48 | }; 49 | -------------------------------------------------------------------------------- /src/programs/thread/idl.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.16", 3 | "name": "thread_program", 4 | "docs": ["Program for creating transaction threads on Solana."], 5 | "instructions": [ 6 | { 7 | "name": "getCrateInfo", 8 | "docs": [ 9 | "Return the crate information via `sol_set_return_data/sol_get_return_data`" 10 | ], 11 | "accounts": [ 12 | { 13 | "name": "systemProgram", 14 | "isMut": false, 15 | "isSigner": false 16 | } 17 | ], 18 | "args": [], 19 | "returns": { 20 | "defined": "CrateInfo" 21 | } 22 | }, 23 | { 24 | "name": "threadExec", 25 | "docs": ["Executes the next instruction on thread."], 26 | "accounts": [ 27 | { 28 | "name": "fee", 29 | "isMut": true, 30 | "isSigner": false, 31 | "docs": ["The worker's fee account."] 32 | }, 33 | { 34 | "name": "pool", 35 | "isMut": false, 36 | "isSigner": false, 37 | "docs": ["The active worker pool."] 38 | }, 39 | { 40 | "name": "signatory", 41 | "isMut": true, 42 | "isSigner": true, 43 | "docs": ["The signatory."] 44 | }, 45 | { 46 | "name": "thread", 47 | "isMut": true, 48 | "isSigner": false, 49 | "docs": ["The thread to execute."] 50 | }, 51 | { 52 | "name": "worker", 53 | "isMut": false, 54 | "isSigner": false, 55 | "docs": ["The worker."] 56 | } 57 | ], 58 | "args": [] 59 | }, 60 | { 61 | "name": "threadCreate", 62 | "docs": ["Creates a new transaction thread."], 63 | "accounts": [ 64 | { 65 | "name": "authority", 66 | "isMut": false, 67 | "isSigner": true, 68 | "docs": ["The authority (owner) of the thread."] 69 | }, 70 | { 71 | "name": "payer", 72 | "isMut": true, 73 | "isSigner": true, 74 | "docs": ["The payer for account initializations."] 75 | }, 76 | { 77 | "name": "systemProgram", 78 | "isMut": false, 79 | "isSigner": false, 80 | "docs": ["The Solana system program."] 81 | }, 82 | { 83 | "name": "thread", 84 | "isMut": true, 85 | "isSigner": false, 86 | "docs": ["The thread to be created."] 87 | } 88 | ], 89 | "args": [ 90 | { 91 | "name": "amount", 92 | "type": "u64" 93 | }, 94 | { 95 | "name": "id", 96 | "type": "bytes" 97 | }, 98 | { 99 | "name": "instructions", 100 | "type": { 101 | "vec": { 102 | "defined": "SerializableInstruction" 103 | } 104 | } 105 | }, 106 | { 107 | "name": "trigger", 108 | "type": { 109 | "defined": "Trigger" 110 | } 111 | } 112 | ] 113 | }, 114 | { 115 | "name": "threadDelete", 116 | "docs": [ 117 | "Closes an existing thread account and returns the lamports to the owner." 118 | ], 119 | "accounts": [ 120 | { 121 | "name": "authority", 122 | "isMut": false, 123 | "isSigner": true, 124 | "docs": ["The authority (owner) of the thread."] 125 | }, 126 | { 127 | "name": "closeTo", 128 | "isMut": true, 129 | "isSigner": false, 130 | "docs": ["The address to return the data rent lamports to."] 131 | }, 132 | { 133 | "name": "thread", 134 | "isMut": true, 135 | "isSigner": false, 136 | "docs": ["The thread to be delete."] 137 | } 138 | ], 139 | "args": [] 140 | }, 141 | { 142 | "name": "threadInstructionAdd", 143 | "docs": ["Appends a new instruction to the thread's instruction set."], 144 | "accounts": [ 145 | { 146 | "name": "authority", 147 | "isMut": true, 148 | "isSigner": true, 149 | "docs": ["The authority (owner) of the thread."] 150 | }, 151 | { 152 | "name": "systemProgram", 153 | "isMut": false, 154 | "isSigner": false, 155 | "docs": ["The Solana system program"] 156 | }, 157 | { 158 | "name": "thread", 159 | "isMut": true, 160 | "isSigner": false, 161 | "docs": ["The thread to be paused."] 162 | } 163 | ], 164 | "args": [ 165 | { 166 | "name": "instruction", 167 | "type": { 168 | "defined": "SerializableInstruction" 169 | } 170 | } 171 | ] 172 | }, 173 | { 174 | "name": "threadInstructionRemove", 175 | "docs": [ 176 | "Removes an instruction to the thread's instruction set at the provied index." 177 | ], 178 | "accounts": [ 179 | { 180 | "name": "authority", 181 | "isMut": false, 182 | "isSigner": true, 183 | "docs": ["The authority (owner) of the thread."] 184 | }, 185 | { 186 | "name": "thread", 187 | "isMut": true, 188 | "isSigner": false, 189 | "docs": ["The thread to be edited."] 190 | } 191 | ], 192 | "args": [ 193 | { 194 | "name": "index", 195 | "type": "u64" 196 | } 197 | ] 198 | }, 199 | { 200 | "name": "threadKickoff", 201 | "docs": ["Kicks off a thread if its trigger condition is active."], 202 | "accounts": [ 203 | { 204 | "name": "signatory", 205 | "isMut": true, 206 | "isSigner": true, 207 | "docs": ["The signatory."] 208 | }, 209 | { 210 | "name": "thread", 211 | "isMut": true, 212 | "isSigner": false, 213 | "docs": ["The thread to kickoff."] 214 | }, 215 | { 216 | "name": "worker", 217 | "isMut": false, 218 | "isSigner": false, 219 | "docs": ["The worker."] 220 | } 221 | ], 222 | "args": [] 223 | }, 224 | { 225 | "name": "threadPause", 226 | "docs": ["Pauses an active thread."], 227 | "accounts": [ 228 | { 229 | "name": "authority", 230 | "isMut": false, 231 | "isSigner": true, 232 | "docs": ["The authority (owner) of the thread."] 233 | }, 234 | { 235 | "name": "thread", 236 | "isMut": true, 237 | "isSigner": false, 238 | "docs": ["The thread to be paused."] 239 | } 240 | ], 241 | "args": [] 242 | }, 243 | { 244 | "name": "threadResume", 245 | "docs": ["Resumes a paused thread."], 246 | "accounts": [ 247 | { 248 | "name": "authority", 249 | "isMut": false, 250 | "isSigner": true, 251 | "docs": ["The authority (owner) of the thread."] 252 | }, 253 | { 254 | "name": "thread", 255 | "isMut": true, 256 | "isSigner": false, 257 | "docs": ["The thread to be resumed."] 258 | } 259 | ], 260 | "args": [] 261 | }, 262 | { 263 | "name": "threadReset", 264 | "docs": ["Resets a thread's next instruction."], 265 | "accounts": [ 266 | { 267 | "name": "authority", 268 | "isMut": false, 269 | "isSigner": true, 270 | "docs": ["The authority (owner) of the thread."] 271 | }, 272 | { 273 | "name": "thread", 274 | "isMut": true, 275 | "isSigner": false, 276 | "docs": ["The thread to be paused."] 277 | } 278 | ], 279 | "args": [] 280 | }, 281 | { 282 | "name": "threadUpdate", 283 | "docs": ["Allows an owner to update the mutable properties of a thread."], 284 | "accounts": [ 285 | { 286 | "name": "authority", 287 | "isMut": true, 288 | "isSigner": true, 289 | "docs": ["The authority (owner) of the thread."] 290 | }, 291 | { 292 | "name": "systemProgram", 293 | "isMut": false, 294 | "isSigner": false, 295 | "docs": ["The Solana system program"] 296 | }, 297 | { 298 | "name": "thread", 299 | "isMut": true, 300 | "isSigner": false, 301 | "docs": ["The thread to be updated."] 302 | } 303 | ], 304 | "args": [ 305 | { 306 | "name": "settings", 307 | "type": { 308 | "defined": "ThreadSettings" 309 | } 310 | } 311 | ] 312 | }, 313 | { 314 | "name": "threadWithdraw", 315 | "docs": ["Allows an owner to withdraw from a thread's lamport balance."], 316 | "accounts": [ 317 | { 318 | "name": "authority", 319 | "isMut": false, 320 | "isSigner": true, 321 | "docs": ["The authority (owner) of the thread."] 322 | }, 323 | { 324 | "name": "payTo", 325 | "isMut": true, 326 | "isSigner": false, 327 | "docs": ["The account to withdraw lamports to."] 328 | }, 329 | { 330 | "name": "thread", 331 | "isMut": true, 332 | "isSigner": false, 333 | "docs": ["The thread to be."] 334 | } 335 | ], 336 | "args": [ 337 | { 338 | "name": "amount", 339 | "type": "u64" 340 | } 341 | ] 342 | } 343 | ], 344 | "accounts": [ 345 | { 346 | "name": "Thread", 347 | "docs": ["Tracks the current state of a transaction thread on Solana."], 348 | "type": { 349 | "kind": "struct", 350 | "fields": [ 351 | { 352 | "name": "authority", 353 | "docs": ["The owner of this thread."], 354 | "type": "publicKey" 355 | }, 356 | { 357 | "name": "bump", 358 | "docs": ["The bump, used for PDA validation."], 359 | "type": "u8" 360 | }, 361 | { 362 | "name": "createdAt", 363 | "docs": ["The cluster clock at the moment the thread was created."], 364 | "type": { 365 | "defined": "ClockData" 366 | } 367 | }, 368 | { 369 | "name": "execContext", 370 | "docs": ["The context of the thread's current execution state."], 371 | "type": { 372 | "option": { 373 | "defined": "ExecContext" 374 | } 375 | } 376 | }, 377 | { 378 | "name": "fee", 379 | "docs": [ 380 | "The number of lamports to payout to workers per execution." 381 | ], 382 | "type": "u64" 383 | }, 384 | { 385 | "name": "id", 386 | "docs": ["The id of the thread, given by the authority."], 387 | "type": "bytes" 388 | }, 389 | { 390 | "name": "instructions", 391 | "docs": ["The instructions to be executed."], 392 | "type": { 393 | "vec": { 394 | "defined": "SerializableInstruction" 395 | } 396 | } 397 | }, 398 | { 399 | "name": "name", 400 | "docs": ["The name of the thread."], 401 | "type": "string" 402 | }, 403 | { 404 | "name": "nextInstruction", 405 | "docs": ["The next instruction to be executed."], 406 | "type": { 407 | "option": { 408 | "defined": "SerializableInstruction" 409 | } 410 | } 411 | }, 412 | { 413 | "name": "paused", 414 | "docs": ["Whether or not the thread is currently paused."], 415 | "type": "bool" 416 | }, 417 | { 418 | "name": "rateLimit", 419 | "docs": ["The maximum number of execs allowed per slot."], 420 | "type": "u64" 421 | }, 422 | { 423 | "name": "trigger", 424 | "docs": ["The triggering event to kickoff a thread."], 425 | "type": { 426 | "defined": "Trigger" 427 | } 428 | } 429 | ] 430 | } 431 | } 432 | ], 433 | "types": [ 434 | { 435 | "name": "Trigger", 436 | "docs": ["Trigger"], 437 | "type": { 438 | "kind": "enum", 439 | "variants": [ 440 | { 441 | "name": "Account", 442 | "fields": [ 443 | { 444 | "name": "address", 445 | "docs": ["The address of the account to monitor"], 446 | "type": "publicKey" 447 | }, 448 | { 449 | "name": "offset", 450 | "docs": ["The byte offset of the account data to monitor"], 451 | "type": "u64" 452 | }, 453 | { 454 | "name": "size", 455 | "docs": [ 456 | "The size of the byte slice to monitor (must be less than 1kb)" 457 | ], 458 | "type": "u64" 459 | } 460 | ] 461 | }, 462 | { 463 | "name": "Cron", 464 | "fields": [ 465 | { 466 | "name": "schedule", 467 | "docs": [ 468 | "The schedule in cron syntax. Value must be parsable by the `clockwork_cron` package" 469 | ], 470 | "type": "string" 471 | }, 472 | { 473 | "name": "skippable", 474 | "docs": [ 475 | "Boolean value indicating whether triggering moments may be skipped if they are missed (e.g. due to network downtime) If false, any 'missed' triggering moments will simply be executed as soon as the network comes back online." 476 | ], 477 | "type": "bool" 478 | } 479 | ] 480 | }, 481 | { 482 | "name": "Now" 483 | }, 484 | { 485 | "name": "Slot", 486 | "fields": [ 487 | { 488 | "name": "slot", 489 | "docs": ["Slot"], 490 | "type": "u64" 491 | } 492 | ] 493 | }, 494 | { 495 | "name": "Epoch", 496 | "fields": [ 497 | { 498 | "name": "epoch", 499 | "docs": ["Epoch"], 500 | "type": "u64" 501 | } 502 | ] 503 | }, 504 | { 505 | "name": "Timestamp", 506 | "fields": [ 507 | { 508 | "name": "unixTs", 509 | "docs": ["Unix timestamp"], 510 | "type": "i64" 511 | } 512 | ] 513 | }, 514 | { 515 | "name": "Pyth", 516 | "fields": [ 517 | { 518 | "name": "priceFeed", 519 | "docs": ["The address of the price feed to monitor."], 520 | "type": "publicKey" 521 | }, 522 | { 523 | "name": "equality", 524 | "docs": ["The equality operator (gte or lte) used to compare prices."], 525 | "type": { 526 | "defined": "Equality" 527 | } 528 | }, 529 | { 530 | "name": "limit", 531 | "docs": ["The limit price to compare the Pyth feed to."], 532 | "type": "i64" 533 | } 534 | ] 535 | } 536 | ] 537 | } 538 | }, 539 | { 540 | "name": "SerializableInstruction", 541 | "docs": ["Serializable Instruction"], 542 | "type": { 543 | "kind": "struct", 544 | "fields": [ 545 | { 546 | "name": "programId", 547 | "docs": [ 548 | "Pubkey of the instruction processor that executes this instruction" 549 | ], 550 | "type": "publicKey" 551 | }, 552 | { 553 | "name": "accounts", 554 | "docs": [ 555 | "Metadata for what accounts should be passed to the instruction processor" 556 | ], 557 | "type": { 558 | "vec": { "defined": "SerializableAccount" } 559 | } 560 | }, 561 | { 562 | "name": "data", 563 | "docs": ["Opaque data passed to the instruction processor"], 564 | "type": "bytes" 565 | } 566 | ] 567 | } 568 | }, 569 | { 570 | "name": "SerializableAccount", 571 | "docs": ["Serializable Account"], 572 | "type": { 573 | "kind": "struct", 574 | "fields": [ 575 | { 576 | "name": "pubkey", 577 | "docs": ["An account's public key"], 578 | "type": "publicKey" 579 | }, 580 | { 581 | "name": "isSigner", 582 | "docs": [ 583 | "True if an Instruction requires a Transaction signature matching `pubkey`" 584 | ], 585 | "type": "bool" 586 | }, 587 | { 588 | "name": "isWritable", 589 | "docs": [ 590 | "True if the `pubkey` can be loaded as a read-write account" 591 | ], 592 | "type": "bool" 593 | } 594 | ] 595 | } 596 | }, 597 | { 598 | "name": "ClockData", 599 | "docs": ["Clock Data"], 600 | "type": { 601 | "kind": "struct", 602 | "fields": [ 603 | { 604 | "name": "slot", 605 | "docs": ["The Current Slot"], 606 | "type": "u64" 607 | }, 608 | { 609 | "name": "epoch", 610 | "docs": ["The Bank Epoch"], 611 | "type": "u64" 612 | }, 613 | { 614 | "name": "unixTimestamp", 615 | "docs": ["The Current Unix Timestamp"], 616 | "type": "i64" 617 | } 618 | ] 619 | } 620 | }, 621 | { 622 | "name": "ExecContext", 623 | "docs": ["The execution context of a particular transaction thread."], 624 | "type": { 625 | "kind": "struct", 626 | "fields": [ 627 | { 628 | "name": "execIndex", 629 | "docs": ["Index of the next instruction to be executed."], 630 | "type": "u64" 631 | }, 632 | { 633 | "name": "execsSinceReimbursement", 634 | "docs": ["Number of execs since the last tx reimbursement."], 635 | "type": "u64" 636 | }, 637 | { 638 | "name": "execsSinceSlot", 639 | "docs": ["Number of execs in this slot."], 640 | "type": "u64" 641 | }, 642 | { 643 | "name": "lastExecAt", 644 | "docs": ["Slot of the last exec"], 645 | "type": "u64" 646 | }, 647 | { 648 | "name": "triggerContext", 649 | "docs": ["Context for the triggering condition"], 650 | "type": { 651 | "defined": "TriggerContext" 652 | } 653 | } 654 | ] 655 | } 656 | }, 657 | { 658 | "name": "ThreadSettings", 659 | "docs": ["The properties of threads which are updatable."], 660 | "type": { 661 | "kind": "struct", 662 | "fields": [ 663 | { 664 | "name": "fee", 665 | "type": { 666 | "option": "u64" 667 | } 668 | }, 669 | { 670 | "name": "instructions", 671 | "type": { 672 | "option": { 673 | "vec": { 674 | "defined": "SerializableInstruction" 675 | } 676 | } 677 | } 678 | }, 679 | { 680 | "name": "name", 681 | "type": { 682 | "option": "string" 683 | } 684 | }, 685 | { 686 | "name": "rateLimit", 687 | "type": { 688 | "option": "u64" 689 | } 690 | }, 691 | { 692 | "name": "trigger", 693 | "type": { 694 | "option": { 695 | "defined": "Trigger" 696 | } 697 | } 698 | } 699 | ] 700 | } 701 | }, 702 | { 703 | "name": "TriggerContext", 704 | "docs": [ 705 | "The event which allowed a particular transaction thread to be triggered." 706 | ], 707 | "type": { 708 | "kind": "enum", 709 | "variants": [ 710 | { 711 | "name": "Account", 712 | "fields": [ 713 | { 714 | "name": "data_hash", 715 | "docs": ["The account's data hash."], 716 | "type": "u64" 717 | } 718 | ] 719 | }, 720 | { 721 | "name": "Cron", 722 | "fields": [ 723 | { 724 | "name": "started_at", 725 | "docs": ["The threshold moment the schedule was waiting for."], 726 | "type": "i64" 727 | } 728 | ] 729 | }, 730 | { 731 | "name": "Now" 732 | }, 733 | { 734 | "name": "Slot", 735 | "fields": [ 736 | { 737 | "name": "started_at", 738 | "docs": ["The threshold slot the schedule was waiting for."], 739 | "type": "u64" 740 | } 741 | ] 742 | }, 743 | { 744 | "name": "Epoch", 745 | "fields": [ 746 | { 747 | "name": "started_at", 748 | "docs": ["The threshold epoch the schedule was waiting for."], 749 | "type": "u64" 750 | } 751 | ] 752 | }, 753 | { 754 | "name": "Timestamp", 755 | "fields": [ 756 | { 757 | "name": "started_at", 758 | "docs": [ 759 | "The threshold moment the schedule was waiting for." 760 | ], 761 | "type": "i64" 762 | } 763 | ] 764 | }, 765 | { 766 | "name": "Pyth", 767 | "fields": [ 768 | { 769 | "name": "price", 770 | "docs": [ 771 | "The limit price that the trigger was waiting for." 772 | ], 773 | "type": "i64" 774 | } 775 | ] 776 | } 777 | ] 778 | } 779 | }, 780 | { 781 | "name": "Equality", 782 | "docs": ["Equality"], 783 | "type": { 784 | "kind": "enum", 785 | "variants": [ 786 | { 787 | "name": "GreaterThanOrEqual" 788 | }, 789 | { 790 | "name": "LessThanOrEqual" 791 | } 792 | ] 793 | } 794 | } 795 | ], 796 | "errors": [ 797 | { 798 | "code": 6000, 799 | "name": "InvalidThreadResponse", 800 | "msg": "The exec response could not be parsed" 801 | }, 802 | { 803 | "code": 6001, 804 | "name": "InvalidThreadState", 805 | "msg": "The thread is in an invalid state" 806 | }, 807 | { 808 | "code": 6002, 809 | "name": "InvalidTriggerVariant", 810 | "msg": "The trigger variant cannot be changed" 811 | }, 812 | { 813 | "code": 6003, 814 | "name": "TriggerNotActive", 815 | "msg": "The trigger condition has not been activated" 816 | }, 817 | { 818 | "code": 6004, 819 | "name": "ThreadBusy", 820 | "msg": "This operation cannot be processes because the thread is currently busy" 821 | }, 822 | { 823 | "code": 6005, 824 | "name": "ThreadPaused", 825 | "msg": "The thread is currently paused" 826 | }, 827 | { 828 | "code": 6006, 829 | "name": "RateLimitExeceeded", 830 | "msg": "The thread's rate limit has been reached" 831 | }, 832 | { 833 | "code": 6007, 834 | "name": "MaxRateLimitExceeded", 835 | "msg": "Thread rate limits cannot exceed the maximum allowed value" 836 | }, 837 | { 838 | "code": 6008, 839 | "name": "UnauthorizedWrite", 840 | "msg": "Inner instruction attempted to write to an unauthorized address" 841 | }, 842 | { 843 | "code": 6009, 844 | "name": "WithdrawalTooLarge", 845 | "msg": "Withdrawing this amount would leave the thread with less than the minimum required SOL for rent exemption" 846 | } 847 | ], 848 | "metadata": { 849 | "address": "CLoCKyJ6DXBJqqu2VWx9RLbgnwwR6BMHHuyasVmfMzBh" 850 | } 851 | } 852 | -------------------------------------------------------------------------------- /src/programs/thread/types.ts: -------------------------------------------------------------------------------- 1 | export type ThreadProgram = { 2 | version: "2.0.16"; 3 | name: "thread_program"; 4 | docs: ["Program for creating transaction threads on Solana."]; 5 | instructions: [ 6 | { 7 | name: "getCrateInfo"; 8 | docs: [ 9 | "Return the crate information via `sol_set_return_data/sol_get_return_data`" 10 | ]; 11 | accounts: [ 12 | { 13 | name: "systemProgram"; 14 | isMut: false; 15 | isSigner: false; 16 | } 17 | ]; 18 | args: []; 19 | returns: { 20 | defined: "CrateInfo"; 21 | }; 22 | }, 23 | { 24 | name: "threadExec"; 25 | docs: ["Executes the next instruction on thread."]; 26 | accounts: [ 27 | { 28 | name: "fee"; 29 | isMut: true; 30 | isSigner: false; 31 | docs: ["The worker's fee account."]; 32 | }, 33 | { 34 | name: "pool"; 35 | isMut: false; 36 | isSigner: false; 37 | docs: ["The active worker pool."]; 38 | }, 39 | { 40 | name: "signatory"; 41 | isMut: true; 42 | isSigner: true; 43 | docs: ["The signatory."]; 44 | }, 45 | { 46 | name: "thread"; 47 | isMut: true; 48 | isSigner: false; 49 | docs: ["The thread to execute."]; 50 | }, 51 | { 52 | name: "worker"; 53 | isMut: false; 54 | isSigner: false; 55 | docs: ["The worker."]; 56 | } 57 | ]; 58 | args: []; 59 | }, 60 | { 61 | name: "threadCreate"; 62 | docs: ["Creates a new transaction thread."]; 63 | accounts: [ 64 | { 65 | name: "authority"; 66 | isMut: false; 67 | isSigner: true; 68 | docs: ["The authority (owner) of the thread."]; 69 | }, 70 | { 71 | name: "payer"; 72 | isMut: true; 73 | isSigner: true; 74 | docs: ["The payer for account initializations."]; 75 | }, 76 | { 77 | name: "systemProgram"; 78 | isMut: false; 79 | isSigner: false; 80 | docs: ["The Solana system program."]; 81 | }, 82 | { 83 | name: "thread"; 84 | isMut: true; 85 | isSigner: false; 86 | docs: ["The thread to be created."]; 87 | } 88 | ]; 89 | args: [ 90 | { 91 | name: "amount"; 92 | type: "u64"; 93 | }, 94 | { 95 | name: "id"; 96 | type: "bytes"; 97 | }, 98 | { 99 | name: "instructions"; 100 | type: { 101 | vec: { 102 | defined: "SerializableInstruction"; 103 | }; 104 | }; 105 | }, 106 | { 107 | name: "trigger"; 108 | type: { 109 | defined: "Trigger"; 110 | }; 111 | } 112 | ]; 113 | }, 114 | { 115 | name: "threadDelete"; 116 | docs: [ 117 | "Closes an existing thread account and returns the lamports to the owner." 118 | ]; 119 | accounts: [ 120 | { 121 | name: "authority"; 122 | isMut: false; 123 | isSigner: true; 124 | docs: ["The authority (owner) of the thread."]; 125 | }, 126 | { 127 | name: "closeTo"; 128 | isMut: true; 129 | isSigner: false; 130 | docs: ["The address to return the data rent lamports to."]; 131 | }, 132 | { 133 | name: "thread"; 134 | isMut: true; 135 | isSigner: false; 136 | docs: ["The thread to be delete."]; 137 | } 138 | ]; 139 | args: []; 140 | }, 141 | { 142 | name: "threadInstructionAdd"; 143 | docs: ["Appends a new instruction to the thread's instruction set."]; 144 | accounts: [ 145 | { 146 | name: "authority"; 147 | isMut: true; 148 | isSigner: true; 149 | docs: ["The authority (owner) of the thread."]; 150 | }, 151 | { 152 | name: "systemProgram"; 153 | isMut: false; 154 | isSigner: false; 155 | docs: ["The Solana system program"]; 156 | }, 157 | { 158 | name: "thread"; 159 | isMut: true; 160 | isSigner: false; 161 | docs: ["The thread to be paused."]; 162 | } 163 | ]; 164 | args: [ 165 | { 166 | name: "instruction"; 167 | type: { 168 | defined: "SerializableInstruction"; 169 | }; 170 | } 171 | ]; 172 | }, 173 | { 174 | name: "threadInstructionRemove"; 175 | docs: [ 176 | "Removes an instruction to the thread's instruction set at the provied index." 177 | ]; 178 | accounts: [ 179 | { 180 | name: "authority"; 181 | isMut: false; 182 | isSigner: true; 183 | docs: ["The authority (owner) of the thread."]; 184 | }, 185 | { 186 | name: "thread"; 187 | isMut: true; 188 | isSigner: false; 189 | docs: ["The thread to be edited."]; 190 | } 191 | ]; 192 | args: [ 193 | { 194 | name: "index"; 195 | type: "u64"; 196 | } 197 | ]; 198 | }, 199 | { 200 | name: "threadKickoff"; 201 | docs: ["Kicks off a thread if its trigger condition is active."]; 202 | accounts: [ 203 | { 204 | name: "signatory"; 205 | isMut: true; 206 | isSigner: true; 207 | docs: ["The signatory."]; 208 | }, 209 | { 210 | name: "thread"; 211 | isMut: true; 212 | isSigner: false; 213 | docs: ["The thread to kickoff."]; 214 | }, 215 | { 216 | name: "worker"; 217 | isMut: false; 218 | isSigner: false; 219 | docs: ["The worker."]; 220 | } 221 | ]; 222 | args: []; 223 | }, 224 | { 225 | name: "threadPause"; 226 | docs: ["Pauses an active thread."]; 227 | accounts: [ 228 | { 229 | name: "authority"; 230 | isMut: false; 231 | isSigner: true; 232 | docs: ["The authority (owner) of the thread."]; 233 | }, 234 | { 235 | name: "thread"; 236 | isMut: true; 237 | isSigner: false; 238 | docs: ["The thread to be paused."]; 239 | } 240 | ]; 241 | args: []; 242 | }, 243 | { 244 | name: "threadResume"; 245 | docs: ["Resumes a paused thread."]; 246 | accounts: [ 247 | { 248 | name: "authority"; 249 | isMut: false; 250 | isSigner: true; 251 | docs: ["The authority (owner) of the thread."]; 252 | }, 253 | { 254 | name: "thread"; 255 | isMut: true; 256 | isSigner: false; 257 | docs: ["The thread to be resumed."]; 258 | } 259 | ]; 260 | args: []; 261 | }, 262 | { 263 | name: "threadReset"; 264 | docs: ["Resets a thread's next instruction."]; 265 | accounts: [ 266 | { 267 | name: "authority"; 268 | isMut: false; 269 | isSigner: true; 270 | docs: ["The authority (owner) of the thread."]; 271 | }, 272 | { 273 | name: "thread"; 274 | isMut: true; 275 | isSigner: false; 276 | docs: ["The thread to be paused."]; 277 | } 278 | ]; 279 | args: []; 280 | }, 281 | { 282 | name: "threadUpdate"; 283 | docs: ["Allows an owner to update the mutable properties of a thread."]; 284 | accounts: [ 285 | { 286 | name: "authority"; 287 | isMut: true; 288 | isSigner: true; 289 | docs: ["The authority (owner) of the thread."]; 290 | }, 291 | { 292 | name: "systemProgram"; 293 | isMut: false; 294 | isSigner: false; 295 | docs: ["The Solana system program"]; 296 | }, 297 | { 298 | name: "thread"; 299 | isMut: true; 300 | isSigner: false; 301 | docs: ["The thread to be updated."]; 302 | } 303 | ]; 304 | args: [ 305 | { 306 | name: "settings"; 307 | type: { 308 | defined: "ThreadSettings"; 309 | }; 310 | } 311 | ]; 312 | }, 313 | { 314 | name: "threadWithdraw"; 315 | docs: ["Allows an owner to withdraw from a thread's lamport balance."]; 316 | accounts: [ 317 | { 318 | name: "authority"; 319 | isMut: false; 320 | isSigner: true; 321 | docs: ["The authority (owner) of the thread."]; 322 | }, 323 | { 324 | name: "payTo"; 325 | isMut: true; 326 | isSigner: false; 327 | docs: ["The account to withdraw lamports to."]; 328 | }, 329 | { 330 | name: "thread"; 331 | isMut: true; 332 | isSigner: false; 333 | docs: ["The thread to be."]; 334 | } 335 | ]; 336 | args: [ 337 | { 338 | name: "amount"; 339 | type: "u64"; 340 | } 341 | ]; 342 | } 343 | ]; 344 | accounts: [ 345 | { 346 | name: "thread"; 347 | docs: ["Tracks the current state of a transaction thread on Solana."]; 348 | type: { 349 | kind: "struct"; 350 | fields: [ 351 | { 352 | name: "authority"; 353 | docs: ["The owner of this thread."]; 354 | type: "publicKey"; 355 | }, 356 | { 357 | name: "bump"; 358 | docs: ["The bump, used for PDA validation."]; 359 | type: "u8"; 360 | }, 361 | { 362 | name: "createdAt"; 363 | docs: ["The cluster clock at the moment the thread was created."]; 364 | type: { 365 | defined: "ClockData"; 366 | }; 367 | }, 368 | { 369 | name: "execContext"; 370 | docs: ["The context of the thread's current execution state."]; 371 | type: { 372 | option: { 373 | defined: "ExecContext"; 374 | }; 375 | }; 376 | }, 377 | { 378 | name: "fee"; 379 | docs: [ 380 | "The number of lamports to payout to workers per execution." 381 | ]; 382 | type: "u64"; 383 | }, 384 | { 385 | name: "id"; 386 | docs: ["The id of the thread, given by the authority."]; 387 | type: "bytes"; 388 | }, 389 | { 390 | name: "instructions"; 391 | docs: ["The instructions to be executed."]; 392 | type: { 393 | vec: { 394 | defined: "SerializableInstruction"; 395 | }; 396 | }; 397 | }, 398 | { 399 | name: "name"; 400 | docs: ["The name of the thread."]; 401 | type: "string"; 402 | }, 403 | { 404 | name: "nextInstruction"; 405 | docs: ["The next instruction to be executed."]; 406 | type: { 407 | option: { 408 | defined: "SerializableInstruction"; 409 | }; 410 | }; 411 | }, 412 | { 413 | name: "paused"; 414 | docs: ["Whether or not the thread is currently paused."]; 415 | type: "bool"; 416 | }, 417 | { 418 | name: "rateLimit"; 419 | docs: ["The maximum number of execs allowed per slot."]; 420 | type: "u64"; 421 | }, 422 | { 423 | name: "trigger"; 424 | docs: ["The triggering event to kickoff a thread."]; 425 | type: { 426 | defined: "Trigger"; 427 | }; 428 | } 429 | ]; 430 | }; 431 | } 432 | ]; 433 | types: [ 434 | { 435 | name: "Trigger"; 436 | docs: ["Trigger"]; 437 | type: { 438 | kind: "enum"; 439 | variants: [ 440 | { 441 | name: "Account"; 442 | fields: [ 443 | { 444 | name: "address"; 445 | docs: ["The address of the account to monitor"]; 446 | type: "publicKey"; 447 | }, 448 | { 449 | name: "offset"; 450 | docs: ["The byte offset of the account data to monitor"]; 451 | type: "u64"; 452 | }, 453 | { 454 | name: "size"; 455 | docs: [ 456 | "The size of the byte slice to monitor (must be less than 1kb)" 457 | ]; 458 | type: "u64"; 459 | } 460 | ]; 461 | }, 462 | { 463 | name: "Cron"; 464 | fields: [ 465 | { 466 | name: "schedule"; 467 | docs: [ 468 | "The schedule in cron syntax. Value must be parsable by the `clockwork_cron` package" 469 | ]; 470 | type: "string"; 471 | }, 472 | { 473 | name: "skippable"; 474 | docs: [ 475 | "Boolean value indicating whether triggering moments may be skipped if they are missed (e.g. due to network downtime) If false, any missed triggering moments will simply be executed as soon as the network comes back online." 476 | ]; 477 | type: "bool"; 478 | } 479 | ]; 480 | }, 481 | { 482 | name: "Now"; 483 | }, 484 | { 485 | name: "Slot"; 486 | fields: [ 487 | { 488 | name: "slot"; 489 | docs: ["Slot"]; 490 | type: "u64"; 491 | } 492 | ]; 493 | }, 494 | { 495 | name: "Epoch"; 496 | fields: [ 497 | { 498 | name: "epoch"; 499 | docs: ["Epoch"]; 500 | type: "u64"; 501 | } 502 | ]; 503 | }, 504 | { 505 | name: "Timestamp"; 506 | fields: [ 507 | { 508 | name: "unixTs"; 509 | docs: ["Unix timestamp"]; 510 | type: "i64"; 511 | } 512 | ]; 513 | }, 514 | { 515 | name: "Pyth"; 516 | fields: [ 517 | { 518 | name: "priceFeed"; 519 | docs: ["The address of the price feed to monitor."]; 520 | type: "publicKey"; 521 | }, 522 | { 523 | name: "equality"; 524 | docs: ["The equality operator (gte or lte) used to compare prices."]; 525 | type: { defined: "Equality" } 526 | }, 527 | { 528 | name: "limit"; 529 | docs: ["The limit price to compare the Pyth feed to."]; 530 | type: "i64"; 531 | }, 532 | ]; 533 | } 534 | ]; 535 | }; 536 | }, 537 | { 538 | name: "SerializableInstruction"; 539 | docs: ["Serializable Instruction"]; 540 | type: { 541 | kind: "struct"; 542 | fields: [ 543 | { 544 | name: "programId"; 545 | docs: [ 546 | "Pubkey of the instruction processor that executes this instruction" 547 | ]; 548 | type: "publicKey"; 549 | }, 550 | { 551 | name: "accounts"; 552 | docs: [ 553 | "Metadata for what accounts should be passed to the instruction processor" 554 | ]; 555 | type: { 556 | vec: { defined: "SerializableAccount" }; 557 | }; 558 | }, 559 | { 560 | name: "data"; 561 | docs: ["Opaque data passed to the instruction processor"]; 562 | type: "bytes"; 563 | } 564 | ]; 565 | }; 566 | }, 567 | { 568 | name: "SerializableAccount"; 569 | docs: ["Serializable Account"]; 570 | type: { 571 | kind: "struct"; 572 | fields: [ 573 | { 574 | name: "pubkey"; 575 | docs: ["An account's public key"]; 576 | type: "publicKey"; 577 | }, 578 | { 579 | name: "isSigner"; 580 | docs: [ 581 | "True if an Instruction requires a Transaction signature matching `pubkey`" 582 | ]; 583 | type: "bool"; 584 | }, 585 | { 586 | name: "isWritable"; 587 | docs: [ 588 | "True if the `pubkey` can be loaded as a read-write account" 589 | ]; 590 | type: "bool"; 591 | } 592 | ]; 593 | }; 594 | }, 595 | { 596 | name: "ClockData"; 597 | docs: ["Clock Data"]; 598 | type: { 599 | kind: "struct"; 600 | fields: [ 601 | { 602 | name: "slot"; 603 | docs: ["The Current Slot"]; 604 | type: "u64"; 605 | }, 606 | { 607 | name: "epoch"; 608 | docs: ["The Bank Epoch"]; 609 | type: "u64"; 610 | }, 611 | { 612 | name: "unixTimestamp"; 613 | docs: ["The Current Unix Timestamp"]; 614 | type: "i64"; 615 | } 616 | ]; 617 | }; 618 | }, 619 | { 620 | name: "ExecContext"; 621 | docs: ["The execution context of a particular transaction thread."]; 622 | type: { 623 | kind: "struct"; 624 | fields: [ 625 | { 626 | name: "execIndex"; 627 | docs: ["Index of the next instruction to be executed."]; 628 | type: "u64"; 629 | }, 630 | { 631 | name: "execsSinceReimbursement"; 632 | docs: ["Number of execs since the last tx reimbursement."]; 633 | type: "u64"; 634 | }, 635 | { 636 | name: "execsSinceSlot"; 637 | docs: ["Number of execs in this slot."]; 638 | type: "u64"; 639 | }, 640 | { 641 | name: "lastExecAt"; 642 | docs: ["Slot of the last exec"]; 643 | type: "u64"; 644 | }, 645 | { 646 | name: "triggerContext"; 647 | docs: ["Context for the triggering condition"]; 648 | type: { 649 | defined: "TriggerContext"; 650 | }; 651 | } 652 | ]; 653 | }; 654 | }, 655 | { 656 | name: "ThreadSettings"; 657 | docs: ["The properties of threads which are updatable."]; 658 | type: { 659 | kind: "struct"; 660 | fields: [ 661 | { 662 | name: "fee"; 663 | type: { 664 | option: "u64"; 665 | }; 666 | }, 667 | { 668 | name: "instructions"; 669 | type: { 670 | option: { 671 | vec: { 672 | defined: "SerializableInstruction"; 673 | }; 674 | }; 675 | }; 676 | }, 677 | { 678 | name: "name"; 679 | type: { 680 | option: "string"; 681 | }; 682 | }, 683 | { 684 | name: "rateLimit"; 685 | type: { 686 | option: "u64"; 687 | }; 688 | }, 689 | { 690 | name: "trigger"; 691 | type: { 692 | option: { 693 | defined: "Trigger"; 694 | }; 695 | }; 696 | } 697 | ]; 698 | }; 699 | }, 700 | { 701 | name: "TriggerContext"; 702 | docs: [ 703 | "The event which allowed a particular transaction thread to be triggered." 704 | ]; 705 | type: { 706 | kind: "enum"; 707 | variants: [ 708 | { 709 | name: "Account"; 710 | fields: [ 711 | { 712 | name: "data_hash"; 713 | docs: ["The account's data hash."]; 714 | type: "u64"; 715 | } 716 | ]; 717 | }, 718 | { 719 | name: "Cron"; 720 | fields: [ 721 | { 722 | name: "started_at"; 723 | docs: ["The threshold moment the schedule was waiting for."]; 724 | type: "i64"; 725 | } 726 | ]; 727 | }, 728 | { 729 | name: "Now"; 730 | }, 731 | { 732 | name: "Slot"; 733 | fields: [ 734 | { 735 | name: "started_at"; 736 | docs: ["The threshold slot the schedule was waiting for."]; 737 | type: "u64"; 738 | } 739 | ]; 740 | }, 741 | { 742 | name: "Epoch"; 743 | fields: [ 744 | { 745 | name: "started_at"; 746 | docs: ["The threshold epoch the schedule was waiting for."]; 747 | type: "u64"; 748 | } 749 | ]; 750 | }, 751 | { 752 | name: "Timestamp", 753 | fields: [ 754 | { 755 | name: "started_at", 756 | docs: [ 757 | "The threshold moment the schedule was waiting for." 758 | ], 759 | type: "i64" 760 | } 761 | ] 762 | }, 763 | { 764 | name: "Pyth", 765 | fields: [ 766 | { 767 | name: "price", 768 | docs: [ 769 | "The limit price the trigger was waiting for." 770 | ], 771 | type: "i64" 772 | } 773 | ] 774 | } 775 | ]; 776 | }; 777 | }, 778 | { 779 | name: "Equality"; 780 | docs: ["Equality"]; 781 | type: { 782 | kind: "enum"; 783 | variants: [ 784 | { 785 | name: "GreaterThanOrEqual"; 786 | }, 787 | { 788 | name: "LessThanOrEqual"; 789 | } 790 | ]; 791 | }; 792 | } 793 | ]; 794 | errors: [ 795 | { 796 | code: 6000; 797 | name: "InvalidThreadResponse"; 798 | msg: "The exec response could not be parsed"; 799 | }, 800 | { 801 | code: 6001; 802 | name: "InvalidThreadState"; 803 | msg: "The thread is in an invalid state"; 804 | }, 805 | { 806 | code: 6002; 807 | name: "InvalidTriggerVariant"; 808 | msg: "The trigger variant cannot be changed"; 809 | }, 810 | { 811 | code: 6003; 812 | name: "TriggerNotActive"; 813 | msg: "The trigger condition has not been activated"; 814 | }, 815 | { 816 | code: 6004; 817 | name: "ThreadBusy"; 818 | msg: "This operation cannot be processes because the thread is currently busy"; 819 | }, 820 | { 821 | code: 6005; 822 | name: "ThreadPaused"; 823 | msg: "The thread is currently paused"; 824 | }, 825 | { 826 | code: 6006; 827 | name: "RateLimitExeceeded"; 828 | msg: "The thread's rate limit has been reached"; 829 | }, 830 | { 831 | code: 6007; 832 | name: "MaxRateLimitExceeded"; 833 | msg: "Thread rate limits cannot exceed the maximum allowed value"; 834 | }, 835 | { 836 | code: 6008; 837 | name: "UnauthorizedWrite"; 838 | msg: "Inner instruction attempted to write to an unauthorized address"; 839 | }, 840 | { 841 | code: 6009; 842 | name: "WithdrawalTooLarge"; 843 | msg: "Withdrawing this amount would leave the thread with less than the minimum required SOL for rent exemption"; 844 | } 845 | ]; 846 | }; 847 | 848 | export const IDL: ThreadProgram = { 849 | version: "2.0.16", 850 | name: "thread_program", 851 | docs: ["Program for creating transaction threads on Solana."], 852 | instructions: [ 853 | { 854 | name: "getCrateInfo", 855 | docs: [ 856 | "Return the crate information via `sol_set_return_data/sol_get_return_data`", 857 | ], 858 | accounts: [ 859 | { 860 | name: "systemProgram", 861 | isMut: false, 862 | isSigner: false, 863 | }, 864 | ], 865 | args: [], 866 | returns: { 867 | defined: "CrateInfo", 868 | }, 869 | }, 870 | { 871 | name: "threadExec", 872 | docs: ["Executes the next instruction on thread."], 873 | accounts: [ 874 | { 875 | name: "fee", 876 | isMut: true, 877 | isSigner: false, 878 | docs: ["The worker's fee account."], 879 | }, 880 | { 881 | name: "pool", 882 | isMut: false, 883 | isSigner: false, 884 | docs: ["The active worker pool."], 885 | }, 886 | { 887 | name: "signatory", 888 | isMut: true, 889 | isSigner: true, 890 | docs: ["The signatory."], 891 | }, 892 | { 893 | name: "thread", 894 | isMut: true, 895 | isSigner: false, 896 | docs: ["The thread to execute."], 897 | }, 898 | { 899 | name: "worker", 900 | isMut: false, 901 | isSigner: false, 902 | docs: ["The worker."], 903 | }, 904 | ], 905 | args: [], 906 | }, 907 | { 908 | name: "threadCreate", 909 | docs: ["Creates a new transaction thread."], 910 | accounts: [ 911 | { 912 | name: "authority", 913 | isMut: false, 914 | isSigner: true, 915 | docs: ["The authority (owner) of the thread."], 916 | }, 917 | { 918 | name: "payer", 919 | isMut: true, 920 | isSigner: true, 921 | docs: ["The payer for account initializations."], 922 | }, 923 | { 924 | name: "systemProgram", 925 | isMut: false, 926 | isSigner: false, 927 | docs: ["The Solana system program."], 928 | }, 929 | { 930 | name: "thread", 931 | isMut: true, 932 | isSigner: false, 933 | docs: ["The thread to be created."], 934 | }, 935 | ], 936 | args: [ 937 | { 938 | name: "amount", 939 | type: "u64", 940 | }, 941 | { 942 | name: "id", 943 | type: "bytes", 944 | }, 945 | { 946 | name: "instructions", 947 | type: { 948 | vec: { 949 | defined: "SerializableInstruction", 950 | }, 951 | }, 952 | }, 953 | { 954 | name: "trigger", 955 | type: { 956 | defined: "Trigger", 957 | }, 958 | }, 959 | ], 960 | }, 961 | { 962 | name: "threadDelete", 963 | docs: [ 964 | "Closes an existing thread account and returns the lamports to the owner.", 965 | ], 966 | accounts: [ 967 | { 968 | name: "authority", 969 | isMut: false, 970 | isSigner: true, 971 | docs: ["The authority (owner) of the thread."], 972 | }, 973 | { 974 | name: "closeTo", 975 | isMut: true, 976 | isSigner: false, 977 | docs: ["The address to return the data rent lamports to."], 978 | }, 979 | { 980 | name: "thread", 981 | isMut: true, 982 | isSigner: false, 983 | docs: ["The thread to be delete."], 984 | }, 985 | ], 986 | args: [], 987 | }, 988 | { 989 | name: "threadInstructionAdd", 990 | docs: ["Appends a new instruction to the thread's instruction set."], 991 | accounts: [ 992 | { 993 | name: "authority", 994 | isMut: true, 995 | isSigner: true, 996 | docs: ["The authority (owner) of the thread."], 997 | }, 998 | { 999 | name: "systemProgram", 1000 | isMut: false, 1001 | isSigner: false, 1002 | docs: ["The Solana system program"], 1003 | }, 1004 | { 1005 | name: "thread", 1006 | isMut: true, 1007 | isSigner: false, 1008 | docs: ["The thread to be paused."], 1009 | }, 1010 | ], 1011 | args: [ 1012 | { 1013 | name: "instruction", 1014 | type: { 1015 | defined: "SerializableInstruction", 1016 | }, 1017 | }, 1018 | ], 1019 | }, 1020 | { 1021 | name: "threadInstructionRemove", 1022 | docs: [ 1023 | "Removes an instruction to the thread's instruction set at the provied index.", 1024 | ], 1025 | accounts: [ 1026 | { 1027 | name: "authority", 1028 | isMut: false, 1029 | isSigner: true, 1030 | docs: ["The authority (owner) of the thread."], 1031 | }, 1032 | { 1033 | name: "thread", 1034 | isMut: true, 1035 | isSigner: false, 1036 | docs: ["The thread to be edited."], 1037 | }, 1038 | ], 1039 | args: [ 1040 | { 1041 | name: "index", 1042 | type: "u64", 1043 | }, 1044 | ], 1045 | }, 1046 | { 1047 | name: "threadKickoff", 1048 | docs: ["Kicks off a thread if its trigger condition is active."], 1049 | accounts: [ 1050 | { 1051 | name: "signatory", 1052 | isMut: true, 1053 | isSigner: true, 1054 | docs: ["The signatory."], 1055 | }, 1056 | { 1057 | name: "thread", 1058 | isMut: true, 1059 | isSigner: false, 1060 | docs: ["The thread to kickoff."], 1061 | }, 1062 | { 1063 | name: "worker", 1064 | isMut: false, 1065 | isSigner: false, 1066 | docs: ["The worker."], 1067 | }, 1068 | ], 1069 | args: [], 1070 | }, 1071 | { 1072 | name: "threadPause", 1073 | docs: ["Pauses an active thread."], 1074 | accounts: [ 1075 | { 1076 | name: "authority", 1077 | isMut: false, 1078 | isSigner: true, 1079 | docs: ["The authority (owner) of the thread."], 1080 | }, 1081 | { 1082 | name: "thread", 1083 | isMut: true, 1084 | isSigner: false, 1085 | docs: ["The thread to be paused."], 1086 | }, 1087 | ], 1088 | args: [], 1089 | }, 1090 | { 1091 | name: "threadResume", 1092 | docs: ["Resumes a paused thread."], 1093 | accounts: [ 1094 | { 1095 | name: "authority", 1096 | isMut: false, 1097 | isSigner: true, 1098 | docs: ["The authority (owner) of the thread."], 1099 | }, 1100 | { 1101 | name: "thread", 1102 | isMut: true, 1103 | isSigner: false, 1104 | docs: ["The thread to be resumed."], 1105 | }, 1106 | ], 1107 | args: [], 1108 | }, 1109 | { 1110 | name: "threadReset", 1111 | docs: ["Resets a thread's next instruction."], 1112 | accounts: [ 1113 | { 1114 | name: "authority", 1115 | isMut: false, 1116 | isSigner: true, 1117 | docs: ["The authority (owner) of the thread."], 1118 | }, 1119 | { 1120 | name: "thread", 1121 | isMut: true, 1122 | isSigner: false, 1123 | docs: ["The thread to be paused."], 1124 | }, 1125 | ], 1126 | args: [], 1127 | }, 1128 | { 1129 | name: "threadUpdate", 1130 | docs: ["Allows an owner to update the mutable properties of a thread."], 1131 | accounts: [ 1132 | { 1133 | name: "authority", 1134 | isMut: true, 1135 | isSigner: true, 1136 | docs: ["The authority (owner) of the thread."], 1137 | }, 1138 | { 1139 | name: "systemProgram", 1140 | isMut: false, 1141 | isSigner: false, 1142 | docs: ["The Solana system program"], 1143 | }, 1144 | { 1145 | name: "thread", 1146 | isMut: true, 1147 | isSigner: false, 1148 | docs: ["The thread to be updated."], 1149 | }, 1150 | ], 1151 | args: [ 1152 | { 1153 | name: "settings", 1154 | type: { 1155 | defined: "ThreadSettings", 1156 | }, 1157 | }, 1158 | ], 1159 | }, 1160 | { 1161 | name: "threadWithdraw", 1162 | docs: ["Allows an owner to withdraw from a thread's lamport balance."], 1163 | accounts: [ 1164 | { 1165 | name: "authority", 1166 | isMut: false, 1167 | isSigner: true, 1168 | docs: ["The authority (owner) of the thread."], 1169 | }, 1170 | { 1171 | name: "payTo", 1172 | isMut: true, 1173 | isSigner: false, 1174 | docs: ["The account to withdraw lamports to."], 1175 | }, 1176 | { 1177 | name: "thread", 1178 | isMut: true, 1179 | isSigner: false, 1180 | docs: ["The thread to be."], 1181 | }, 1182 | ], 1183 | args: [ 1184 | { 1185 | name: "amount", 1186 | type: "u64", 1187 | }, 1188 | ], 1189 | }, 1190 | ], 1191 | accounts: [ 1192 | { 1193 | name: "thread", 1194 | docs: ["Tracks the current state of a transaction thread on Solana."], 1195 | type: { 1196 | kind: "struct", 1197 | fields: [ 1198 | { 1199 | name: "authority", 1200 | docs: ["The owner of this thread."], 1201 | type: "publicKey", 1202 | }, 1203 | { 1204 | name: "bump", 1205 | docs: ["The bump, used for PDA validation."], 1206 | type: "u8", 1207 | }, 1208 | { 1209 | name: "createdAt", 1210 | docs: ["The cluster clock at the moment the thread was created."], 1211 | type: { 1212 | defined: "ClockData", 1213 | }, 1214 | }, 1215 | { 1216 | name: "execContext", 1217 | docs: ["The context of the thread's current execution state."], 1218 | type: { 1219 | option: { 1220 | defined: "ExecContext", 1221 | }, 1222 | }, 1223 | }, 1224 | { 1225 | name: "fee", 1226 | docs: [ 1227 | "The number of lamports to payout to workers per execution.", 1228 | ], 1229 | type: "u64", 1230 | }, 1231 | { 1232 | name: "id", 1233 | docs: ["The id of the thread, given by the authority."], 1234 | type: "bytes", 1235 | }, 1236 | { 1237 | name: "instructions", 1238 | docs: ["The instructions to be executed."], 1239 | type: { 1240 | vec: { 1241 | defined: "SerializableInstruction", 1242 | }, 1243 | }, 1244 | }, 1245 | { 1246 | name: "name", 1247 | docs: ["The name of the thread."], 1248 | type: "string", 1249 | }, 1250 | { 1251 | name: "nextInstruction", 1252 | docs: ["The next instruction to be executed."], 1253 | type: { 1254 | option: { 1255 | defined: "SerializableInstruction", 1256 | }, 1257 | }, 1258 | }, 1259 | { 1260 | name: "paused", 1261 | docs: ["Whether or not the thread is currently paused."], 1262 | type: "bool", 1263 | }, 1264 | { 1265 | name: "rateLimit", 1266 | docs: ["The maximum number of execs allowed per slot."], 1267 | type: "u64", 1268 | }, 1269 | { 1270 | name: "trigger", 1271 | docs: ["The triggering event to kickoff a thread."], 1272 | type: { 1273 | defined: "Trigger", 1274 | }, 1275 | }, 1276 | ], 1277 | }, 1278 | }, 1279 | ], 1280 | types: [ 1281 | { 1282 | name: "Trigger", 1283 | docs: ["Trigger"], 1284 | type: { 1285 | kind: "enum", 1286 | variants: [ 1287 | { 1288 | name: "Account", 1289 | fields: [ 1290 | { 1291 | name: "address", 1292 | docs: ["The address of the account to monitor"], 1293 | type: "publicKey", 1294 | }, 1295 | { 1296 | name: "offset", 1297 | docs: ["The byte offset of the account data to monitor"], 1298 | type: "u64", 1299 | }, 1300 | { 1301 | name: "size", 1302 | docs: [ 1303 | "The size of the byte slice to monitor (must be less than 1kb)", 1304 | ], 1305 | type: "u64", 1306 | }, 1307 | ], 1308 | }, 1309 | { 1310 | name: "Cron", 1311 | fields: [ 1312 | { 1313 | name: "schedule", 1314 | docs: [ 1315 | "The schedule in cron syntax. Value must be parsable by the `clockwork_cron` package", 1316 | ], 1317 | type: "string", 1318 | }, 1319 | { 1320 | name: "skippable", 1321 | docs: [ 1322 | "Boolean value indicating whether triggering moments may be skipped if they are missed (e.g. due to network downtime) If false, any missed triggering moments will simply be executed as soon as the network comes back online.", 1323 | ], 1324 | type: "bool", 1325 | }, 1326 | ], 1327 | }, 1328 | { 1329 | name: "Now", 1330 | }, 1331 | { 1332 | name: "Slot", 1333 | fields: [ 1334 | { 1335 | name: "slot", 1336 | docs: ["Slot"], 1337 | type: "u64", 1338 | }, 1339 | ], 1340 | }, 1341 | { 1342 | name: "Epoch", 1343 | fields: [ 1344 | { 1345 | name: "epoch", 1346 | docs: ["Epoch"], 1347 | type: "u64", 1348 | }, 1349 | ], 1350 | }, 1351 | { 1352 | name: "Timestamp", 1353 | fields: [ 1354 | { 1355 | name: "unixTs", 1356 | docs: ["Unix timestamp"], 1357 | type: "i64", 1358 | }, 1359 | ], 1360 | }, 1361 | { 1362 | name: "Pyth", 1363 | fields: [ 1364 | { 1365 | name: "priceFeed", 1366 | docs: ["The address of the price feed to monitor."], 1367 | type: "publicKey", 1368 | }, 1369 | { 1370 | name: "equality", 1371 | docs: ["The equality operator (gte or lte) used to compare prices."], 1372 | type: { defined: "Equality" } 1373 | }, 1374 | { 1375 | name: "limit", 1376 | docs: ["The limit price to compare the Pyth feed to."], 1377 | type: "i64", 1378 | }, 1379 | ], 1380 | } 1381 | ], 1382 | }, 1383 | }, 1384 | { 1385 | name: "SerializableInstruction", 1386 | docs: ["Serializable Instruction"], 1387 | type: { 1388 | kind: "struct", 1389 | fields: [ 1390 | { 1391 | name: "programId", 1392 | docs: [ 1393 | "Pubkey of the instruction processor that executes this instruction", 1394 | ], 1395 | type: "publicKey", 1396 | }, 1397 | { 1398 | name: "accounts", 1399 | docs: [ 1400 | "Metadata for what accounts should be passed to the instruction processor", 1401 | ], 1402 | type: { 1403 | vec: { defined: "SerializableAccount" }, 1404 | }, 1405 | }, 1406 | { 1407 | name: "data", 1408 | docs: ["Opaque data passed to the instruction processor"], 1409 | type: "bytes", 1410 | }, 1411 | ], 1412 | }, 1413 | }, 1414 | { 1415 | name: "SerializableAccount", 1416 | docs: ["Serializable Account"], 1417 | type: { 1418 | kind: "struct", 1419 | fields: [ 1420 | { 1421 | name: "pubkey", 1422 | docs: ["An account's public key"], 1423 | type: "publicKey", 1424 | }, 1425 | { 1426 | name: "isSigner", 1427 | docs: [ 1428 | "True if an Instruction requires a Transaction signature matching `pubkey`", 1429 | ], 1430 | type: "bool", 1431 | }, 1432 | { 1433 | name: "isWritable", 1434 | docs: [ 1435 | "True if the `pubkey` can be loaded as a read-write account", 1436 | ], 1437 | type: "bool", 1438 | }, 1439 | ], 1440 | }, 1441 | }, 1442 | { 1443 | name: "ClockData", 1444 | docs: ["Clock Data"], 1445 | type: { 1446 | kind: "struct", 1447 | fields: [ 1448 | { 1449 | name: "slot", 1450 | docs: ["The Current Slot"], 1451 | type: "u64", 1452 | }, 1453 | { 1454 | name: "epoch", 1455 | docs: ["The Bank Epoch"], 1456 | type: "u64", 1457 | }, 1458 | { 1459 | name: "unixTimestamp", 1460 | docs: ["The Current Unix Timestamp"], 1461 | type: "i64", 1462 | }, 1463 | ], 1464 | }, 1465 | }, 1466 | { 1467 | name: "ExecContext", 1468 | docs: ["The execution context of a particular transaction thread."], 1469 | type: { 1470 | kind: "struct", 1471 | fields: [ 1472 | { 1473 | name: "execIndex", 1474 | docs: ["Index of the next instruction to be executed."], 1475 | type: "u64", 1476 | }, 1477 | { 1478 | name: "execsSinceReimbursement", 1479 | docs: ["Number of execs since the last tx reimbursement."], 1480 | type: "u64", 1481 | }, 1482 | { 1483 | name: "execsSinceSlot", 1484 | docs: ["Number of execs in this slot."], 1485 | type: "u64", 1486 | }, 1487 | { 1488 | name: "lastExecAt", 1489 | docs: ["Slot of the last exec"], 1490 | type: "u64", 1491 | }, 1492 | { 1493 | name: "triggerContext", 1494 | docs: ["Context for the triggering condition"], 1495 | type: { 1496 | defined: "TriggerContext", 1497 | }, 1498 | }, 1499 | ], 1500 | }, 1501 | }, 1502 | { 1503 | name: "ThreadSettings", 1504 | docs: ["The properties of threads which are updatable."], 1505 | type: { 1506 | kind: "struct", 1507 | fields: [ 1508 | { 1509 | name: "fee", 1510 | type: { 1511 | option: "u64", 1512 | }, 1513 | }, 1514 | { 1515 | name: "instructions", 1516 | type: { 1517 | option: { 1518 | vec: { 1519 | defined: "SerializableInstruction", 1520 | }, 1521 | }, 1522 | }, 1523 | }, 1524 | { 1525 | name: "name", 1526 | type: { 1527 | option: "string", 1528 | }, 1529 | }, 1530 | { 1531 | name: "rateLimit", 1532 | type: { 1533 | option: "u64", 1534 | }, 1535 | }, 1536 | { 1537 | name: "trigger", 1538 | type: { 1539 | option: { 1540 | defined: "Trigger", 1541 | }, 1542 | }, 1543 | }, 1544 | ], 1545 | }, 1546 | }, 1547 | { 1548 | name: "TriggerContext", 1549 | docs: [ 1550 | "The event which allowed a particular transaction thread to be triggered.", 1551 | ], 1552 | type: { 1553 | kind: "enum", 1554 | variants: [ 1555 | { 1556 | name: "Account", 1557 | fields: [ 1558 | { 1559 | name: "data_hash", 1560 | docs: ["The account's data hash."], 1561 | type: "u64", 1562 | }, 1563 | ], 1564 | }, 1565 | { 1566 | name: "Cron", 1567 | fields: [ 1568 | { 1569 | name: "started_at", 1570 | docs: ["The threshold moment the schedule was waiting for."], 1571 | type: "i64", 1572 | }, 1573 | ], 1574 | }, 1575 | { 1576 | name: "Now", 1577 | }, 1578 | { 1579 | name: "Slot", 1580 | fields: [ 1581 | { 1582 | name: "started_at", 1583 | docs: ["The threshold slot the schedule was waiting for."], 1584 | type: "u64", 1585 | }, 1586 | ], 1587 | }, 1588 | { 1589 | name: "Epoch", 1590 | fields: [ 1591 | { 1592 | name: "started_at", 1593 | docs: ["The threshold epoch the schedule was waiting for."], 1594 | type: "u64", 1595 | }, 1596 | ], 1597 | }, 1598 | { 1599 | name: "Timestamp", 1600 | fields: [ 1601 | { 1602 | name: "started_at", 1603 | docs: [ 1604 | "The threshold moment the schedule was waiting for." 1605 | ], 1606 | type: "i64" 1607 | } 1608 | ] 1609 | }, 1610 | { 1611 | name: "Pyth", 1612 | fields: [ 1613 | { 1614 | name: "price", 1615 | docs: [ 1616 | "The limit price the trigger was waiting for." 1617 | ], 1618 | type: "i64" 1619 | } 1620 | ] 1621 | } 1622 | ], 1623 | }, 1624 | }, 1625 | { 1626 | name: "Equality", 1627 | docs: ["Equality"], 1628 | type: { 1629 | kind: "enum", 1630 | variants: [ 1631 | { 1632 | name: "GreaterThanOrEqual" 1633 | }, 1634 | { 1635 | name: "LessThanOrEqual" 1636 | }, 1637 | ], 1638 | }, 1639 | }, 1640 | ], 1641 | errors: [ 1642 | { 1643 | code: 6000, 1644 | name: "InvalidThreadResponse", 1645 | msg: "The exec response could not be parsed", 1646 | }, 1647 | { 1648 | code: 6001, 1649 | name: "InvalidThreadState", 1650 | msg: "The thread is in an invalid state", 1651 | }, 1652 | { 1653 | code: 6002, 1654 | name: "InvalidTriggerVariant", 1655 | msg: "The trigger variant cannot be changed", 1656 | }, 1657 | { 1658 | code: 6003, 1659 | name: "TriggerNotActive", 1660 | msg: "The trigger condition has not been activated", 1661 | }, 1662 | { 1663 | code: 6004, 1664 | name: "ThreadBusy", 1665 | msg: "This operation cannot be processes because the thread is currently busy", 1666 | }, 1667 | { 1668 | code: 6005, 1669 | name: "ThreadPaused", 1670 | msg: "The thread is currently paused", 1671 | }, 1672 | { 1673 | code: 6006, 1674 | name: "RateLimitExeceeded", 1675 | msg: "The thread's rate limit has been reached", 1676 | }, 1677 | { 1678 | code: 6007, 1679 | name: "MaxRateLimitExceeded", 1680 | msg: "Thread rate limits cannot exceed the maximum allowed value", 1681 | }, 1682 | { 1683 | code: 6008, 1684 | name: "UnauthorizedWrite", 1685 | msg: "Inner instruction attempted to write to an unauthorized address", 1686 | }, 1687 | { 1688 | code: 6009, 1689 | name: "WithdrawalTooLarge", 1690 | msg: "Withdrawing this amount would leave the thread with less than the minimum required SOL for rent exemption", 1691 | }, 1692 | ], 1693 | }; 1694 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { BN } from "@coral-xyz/anchor"; 2 | import { TransactionInstruction } from "@solana/web3.js"; 3 | import { 4 | SerializableInstruction, 5 | ThreadSettings, 6 | ThreadSettingsInput, 7 | } from "./models"; 8 | 9 | function parseTransactionInstructions( 10 | instructions: TransactionInstruction[] 11 | ): SerializableInstruction[] { 12 | let _instructions: SerializableInstruction[] = []; 13 | instructions.forEach((instruction) => { 14 | _instructions.push(parseTransactionInstruction(instruction)); 15 | }); 16 | return _instructions; 17 | } 18 | 19 | function parseTransactionInstruction( 20 | instruction: TransactionInstruction 21 | ): SerializableInstruction { 22 | return { 23 | programId: instruction.programId, 24 | accounts: instruction.keys, 25 | data: instruction.data, 26 | }; 27 | } 28 | 29 | function parseThreadSettingsInput( 30 | settings: ThreadSettingsInput 31 | ): ThreadSettings { 32 | return { 33 | fee: settings.fee ? new BN(settings.fee) : null, 34 | rateLimit: settings.rateLimit ? new BN(settings.rateLimit) : null, 35 | instructions: settings.instructions ? settings.instructions : null, 36 | name: settings.name ? settings.name : null, 37 | trigger: settings.trigger ? settings.trigger : null, 38 | }; 39 | } 40 | 41 | export { 42 | parseTransactionInstructions, 43 | parseTransactionInstruction, 44 | parseThreadSettingsInput, 45 | }; 46 | -------------------------------------------------------------------------------- /tests/ThreadProgram.test.ts: -------------------------------------------------------------------------------- 1 | import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; 2 | import { 3 | clusterApiUrl, 4 | Connection, 5 | Keypair, 6 | LAMPORTS_PER_SOL, 7 | PublicKey, 8 | Transaction, 9 | TransactionInstruction, 10 | } from "@solana/web3.js"; 11 | import { ClockworkProvider } from "../src"; 12 | import { assert } from "chai"; 13 | import { AnchorProvider } from "@coral-xyz/anchor"; 14 | 15 | 16 | describe("Testing Thread Program", () => { 17 | const wallet = new NodeWallet(new Keypair()); 18 | const connection = new Connection(clusterApiUrl("devnet")); 19 | const anchorProvider = new AnchorProvider(connection, wallet, AnchorProvider.defaultOptions()); 20 | const provider = ClockworkProvider.fromAnchorProvider(anchorProvider); 21 | let threadPubkey: PublicKey; 22 | 23 | it("Airdrop", async () => { 24 | const tx = await connection.requestAirdrop( 25 | wallet.publicKey, 26 | 1 * LAMPORTS_PER_SOL 27 | ); 28 | await new Promise((r) => setTimeout(r, 5000)); 29 | console.log(tx); 30 | }); 31 | 32 | it("Initialize Thread", async () => { 33 | let ix = await provider.threadCreate( 34 | wallet.publicKey, 35 | "ThreadProgramTest", 36 | [], 37 | { now: {} }, 38 | 0.1 * LAMPORTS_PER_SOL 39 | ); 40 | await sendTransaction(ix, provider); 41 | }); 42 | 43 | it("Get Thread Address", async () => { 44 | let [pubkey, _] = provider.getThreadPDA( 45 | wallet.publicKey, 46 | "ThreadProgramTest" 47 | ); 48 | threadPubkey = pubkey; 49 | }); 50 | 51 | it("Get Thread Account", async () => { 52 | let i = 1; 53 | while (true) { 54 | try { 55 | let threadAccount = await provider.getThreadAccount(threadPubkey); 56 | assert.equal(threadAccount.id.toString(), "ThreadProgramTest"); 57 | break; 58 | } catch (e) { 59 | console.log( 60 | "retrying in " + i + " seconds... max retries [" + i + "/10]" 61 | ); 62 | if (i == 10) throw e; 63 | await new Promise((r) => setTimeout(r, i * 1000)); 64 | i += 1; 65 | } 66 | } 67 | }); 68 | 69 | it("Pause Thread", async () => { 70 | let ix = await provider.threadPause(wallet.publicKey, threadPubkey); 71 | await sendTransaction(ix, provider); 72 | }); 73 | 74 | it("Resume Thread", async () => { 75 | let ix = await provider.threadResume(wallet.publicKey, threadPubkey); 76 | await sendTransaction(ix, provider); 77 | }); 78 | 79 | it("Reset Thread", async () => { 80 | let ix = await provider.threadReset(wallet.publicKey, threadPubkey); 81 | await sendTransaction(ix, provider); 82 | }); 83 | 84 | it("Update Thread", async () => { 85 | let ix = await provider.threadUpdate(wallet.publicKey, threadPubkey, { 86 | name: "TestUpdateThread", 87 | rateLimit: 32, 88 | trigger: { now: {} }, 89 | }); 90 | await sendTransaction(ix, provider); 91 | }); 92 | 93 | //it("Thread Instruction Add", async () => { 94 | // let transfer_ix = SystemProgram.transfer({ 95 | // fromPubkey: wallet.publicKey, 96 | // toPubkey: wallet.publicKey, 97 | // lamports: 1000, 98 | // }); 99 | // let tx = await provider.threadInstructionAdd( 100 | // wallet.publicKey, 101 | // threadPubkey, 102 | // transfer_ix 103 | // ); 104 | // console.log(tx); 105 | //}); 106 | 107 | //it("Thread Instruction Remove", async () => { 108 | // let tx = await provider.threadInstructionRemove( 109 | // wallet.publicKey, 110 | // threadPubkey, 111 | // 0 112 | // ); 113 | // console.loggjggjtx); 114 | //}); 115 | 116 | it("Get Crate Info", async () => { 117 | let ix = await provider.getCrateInfo(); 118 | await sendTransaction(ix, provider); 119 | }); 120 | 121 | it("Withdraw Thread", async () => { 122 | let ix = await provider.threadWithdraw( 123 | wallet.publicKey, 124 | threadPubkey, 125 | 0.01 * LAMPORTS_PER_SOL 126 | ); 127 | await sendTransaction(ix, provider); 128 | }); 129 | 130 | it("Delete Thread", async () => { 131 | const ix = await provider.threadDelete(wallet.publicKey, threadPubkey); 132 | await sendTransaction(ix, provider); 133 | }); 134 | }); 135 | 136 | const sendTransaction = async (ix: TransactionInstruction, provider: ClockworkProvider) => { 137 | const tx = new Transaction().add(ix); 138 | const signature = await provider.anchorProvider.sendAndConfirm(tx); 139 | console.log(signature); 140 | } 141 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src"], 3 | "compilerOptions": { 4 | "moduleResolution": "node", 5 | "target": "es2015", 6 | "module": "commonjs", 7 | "lib": ["es2020"], 8 | "outDir": "lib/", 9 | "rootDir": "./src", 10 | "declaration": true, 11 | "resolveJsonModule": true, 12 | "allowSyntheticDefaultImports": true, 13 | "esModuleInterop": true 14 | }, 15 | "exclude": ["node_modules", "tests"] 16 | } 17 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": 6 | version "7.21.5" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" 8 | integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== 9 | dependencies: 10 | regenerator-runtime "^0.13.11" 11 | 12 | "@coral-xyz/anchor@^0.26.0": 13 | version "0.26.0" 14 | resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.26.0.tgz#c8e4f7177e93441afd030f22d777d54d0194d7d1" 15 | integrity sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg== 16 | dependencies: 17 | "@coral-xyz/borsh" "^0.26.0" 18 | "@solana/web3.js" "^1.68.0" 19 | base64-js "^1.5.1" 20 | bn.js "^5.1.2" 21 | bs58 "^4.0.1" 22 | buffer-layout "^1.2.2" 23 | camelcase "^6.3.0" 24 | cross-fetch "^3.1.5" 25 | crypto-hash "^1.3.0" 26 | eventemitter3 "^4.0.7" 27 | js-sha256 "^0.9.0" 28 | pako "^2.0.3" 29 | snake-case "^3.0.4" 30 | superstruct "^0.15.4" 31 | toml "^3.0.0" 32 | 33 | "@coral-xyz/borsh@^0.26.0": 34 | version "0.26.0" 35 | resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.26.0.tgz#d054f64536d824634969e74138f9f7c52bbbc0d5" 36 | integrity sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ== 37 | dependencies: 38 | bn.js "^5.1.2" 39 | buffer-layout "^1.2.0" 40 | 41 | "@cspotcode/source-map-support@^0.8.0": 42 | version "0.8.1" 43 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 44 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 45 | dependencies: 46 | "@jridgewell/trace-mapping" "0.3.9" 47 | 48 | "@jridgewell/resolve-uri@^3.0.3": 49 | version "3.1.1" 50 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 51 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 52 | 53 | "@jridgewell/sourcemap-codec@^1.4.10": 54 | version "1.4.15" 55 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 56 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 57 | 58 | "@jridgewell/trace-mapping@0.3.9": 59 | version "0.3.9" 60 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 61 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 62 | dependencies: 63 | "@jridgewell/resolve-uri" "^3.0.3" 64 | "@jridgewell/sourcemap-codec" "^1.4.10" 65 | 66 | "@noble/ed25519@^1.7.0": 67 | version "1.7.3" 68 | resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" 69 | integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== 70 | 71 | "@noble/hashes@^1.1.2": 72 | version "1.3.0" 73 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" 74 | integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== 75 | 76 | "@noble/secp256k1@^1.6.3": 77 | version "1.7.1" 78 | resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" 79 | integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== 80 | 81 | "@solana/buffer-layout@^4.0.0": 82 | version "4.0.1" 83 | resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" 84 | integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== 85 | dependencies: 86 | buffer "~6.0.3" 87 | 88 | "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.73.2": 89 | version "1.75.0" 90 | resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.75.0.tgz#824c6f78865007bca758ca18f268d6f7363b42e5" 91 | integrity sha512-rHQgdo1EWfb+nPUpHe4O7i8qJPELHKNR5PAZRK+a7XxiykqOfbaAlPt5boDWAGPnYbSv0ziWZv5mq9DlFaQCxg== 92 | dependencies: 93 | "@babel/runtime" "^7.12.5" 94 | "@noble/ed25519" "^1.7.0" 95 | "@noble/hashes" "^1.1.2" 96 | "@noble/secp256k1" "^1.6.3" 97 | "@solana/buffer-layout" "^4.0.0" 98 | agentkeepalive "^4.2.1" 99 | bigint-buffer "^1.1.5" 100 | bn.js "^5.0.0" 101 | borsh "^0.7.0" 102 | bs58 "^4.0.1" 103 | buffer "6.0.3" 104 | fast-stable-stringify "^1.0.0" 105 | jayson "^3.4.4" 106 | node-fetch "^2.6.7" 107 | rpc-websockets "^7.5.1" 108 | superstruct "^0.14.2" 109 | 110 | "@tsconfig/node10@^1.0.7": 111 | version "1.0.9" 112 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 113 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 114 | 115 | "@tsconfig/node12@^1.0.7": 116 | version "1.0.11" 117 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 118 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 119 | 120 | "@tsconfig/node14@^1.0.0": 121 | version "1.0.3" 122 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 123 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 124 | 125 | "@tsconfig/node16@^1.0.2": 126 | version "1.0.3" 127 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 128 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 129 | 130 | "@types/chai@^4.3.4": 131 | version "4.3.5" 132 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" 133 | integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== 134 | 135 | "@types/connect@^3.4.33": 136 | version "3.4.35" 137 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 138 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 139 | dependencies: 140 | "@types/node" "*" 141 | 142 | "@types/mocha@^10.0.1": 143 | version "10.0.1" 144 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" 145 | integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== 146 | 147 | "@types/node@*", "@types/node@^18.14.0": 148 | version "18.16.3" 149 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01" 150 | integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q== 151 | 152 | "@types/node@^12.12.54": 153 | version "12.20.55" 154 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" 155 | integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== 156 | 157 | "@types/ws@^7.4.4": 158 | version "7.4.7" 159 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" 160 | integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== 161 | dependencies: 162 | "@types/node" "*" 163 | 164 | JSONStream@^1.3.5: 165 | version "1.3.5" 166 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 167 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 168 | dependencies: 169 | jsonparse "^1.2.0" 170 | through ">=2.2.7 <3" 171 | 172 | abbrev@1: 173 | version "1.1.1" 174 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 175 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 176 | 177 | acorn-walk@^8.1.1: 178 | version "8.2.0" 179 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 180 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 181 | 182 | acorn@^8.4.1: 183 | version "8.8.2" 184 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 185 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 186 | 187 | agentkeepalive@^4.2.1: 188 | version "4.3.0" 189 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" 190 | integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== 191 | dependencies: 192 | debug "^4.1.0" 193 | depd "^2.0.0" 194 | humanize-ms "^1.2.1" 195 | 196 | ansi-colors@4.1.1: 197 | version "4.1.1" 198 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 199 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 200 | 201 | ansi-regex@^5.0.1: 202 | version "5.0.1" 203 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 204 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 205 | 206 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 207 | version "4.3.0" 208 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 209 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 210 | dependencies: 211 | color-convert "^2.0.1" 212 | 213 | anymatch@~3.1.2: 214 | version "3.1.3" 215 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 216 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 217 | dependencies: 218 | normalize-path "^3.0.0" 219 | picomatch "^2.0.4" 220 | 221 | arg@^4.1.0: 222 | version "4.1.3" 223 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 224 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 225 | 226 | argparse@^2.0.1: 227 | version "2.0.1" 228 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 229 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 230 | 231 | assertion-error@^1.1.0: 232 | version "1.1.0" 233 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 234 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 235 | 236 | balanced-match@^1.0.0: 237 | version "1.0.2" 238 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 239 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 240 | 241 | base-x@^3.0.2: 242 | version "3.0.9" 243 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" 244 | integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== 245 | dependencies: 246 | safe-buffer "^5.0.1" 247 | 248 | base64-js@^1.3.1, base64-js@^1.5.1: 249 | version "1.5.1" 250 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 251 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 252 | 253 | bigint-buffer@^1.1.5: 254 | version "1.1.5" 255 | resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" 256 | integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== 257 | dependencies: 258 | bindings "^1.3.0" 259 | 260 | binary-extensions@^2.0.0: 261 | version "2.2.0" 262 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 263 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 264 | 265 | bindings@^1.3.0: 266 | version "1.5.0" 267 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 268 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 269 | dependencies: 270 | file-uri-to-path "1.0.0" 271 | 272 | bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0: 273 | version "5.2.1" 274 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" 275 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== 276 | 277 | borsh@^0.7.0: 278 | version "0.7.0" 279 | resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" 280 | integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== 281 | dependencies: 282 | bn.js "^5.2.0" 283 | bs58 "^4.0.0" 284 | text-encoding-utf-8 "^1.0.2" 285 | 286 | brace-expansion@^1.1.7: 287 | version "1.1.11" 288 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 289 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 290 | dependencies: 291 | balanced-match "^1.0.0" 292 | concat-map "0.0.1" 293 | 294 | brace-expansion@^2.0.1: 295 | version "2.0.1" 296 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 297 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 298 | dependencies: 299 | balanced-match "^1.0.0" 300 | 301 | braces@~3.0.2: 302 | version "3.0.2" 303 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 304 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 305 | dependencies: 306 | fill-range "^7.0.1" 307 | 308 | browser-stdout@1.3.1: 309 | version "1.3.1" 310 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 311 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 312 | 313 | bs58@^4.0.0, bs58@^4.0.1: 314 | version "4.0.1" 315 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" 316 | integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== 317 | dependencies: 318 | base-x "^3.0.2" 319 | 320 | buffer-layout@^1.2.0, buffer-layout@^1.2.2: 321 | version "1.2.2" 322 | resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" 323 | integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== 324 | 325 | buffer@6.0.3, buffer@~6.0.3: 326 | version "6.0.3" 327 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 328 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 329 | dependencies: 330 | base64-js "^1.3.1" 331 | ieee754 "^1.2.1" 332 | 333 | bufferutil@^4.0.1: 334 | version "4.0.7" 335 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" 336 | integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== 337 | dependencies: 338 | node-gyp-build "^4.3.0" 339 | 340 | camelcase@^6.0.0, camelcase@^6.3.0: 341 | version "6.3.0" 342 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 343 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 344 | 345 | chai@^4.3.7: 346 | version "4.3.7" 347 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" 348 | integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== 349 | dependencies: 350 | assertion-error "^1.1.0" 351 | check-error "^1.0.2" 352 | deep-eql "^4.1.2" 353 | get-func-name "^2.0.0" 354 | loupe "^2.3.1" 355 | pathval "^1.1.1" 356 | type-detect "^4.0.5" 357 | 358 | chalk@^4.1.0: 359 | version "4.1.2" 360 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 361 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 362 | dependencies: 363 | ansi-styles "^4.1.0" 364 | supports-color "^7.1.0" 365 | 366 | check-error@^1.0.2: 367 | version "1.0.2" 368 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 369 | integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== 370 | 371 | chokidar@3.5.3, chokidar@^3.5.2: 372 | version "3.5.3" 373 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 374 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 375 | dependencies: 376 | anymatch "~3.1.2" 377 | braces "~3.0.2" 378 | glob-parent "~5.1.2" 379 | is-binary-path "~2.1.0" 380 | is-glob "~4.0.1" 381 | normalize-path "~3.0.0" 382 | readdirp "~3.6.0" 383 | optionalDependencies: 384 | fsevents "~2.3.2" 385 | 386 | cliui@^7.0.2: 387 | version "7.0.4" 388 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 389 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 390 | dependencies: 391 | string-width "^4.2.0" 392 | strip-ansi "^6.0.0" 393 | wrap-ansi "^7.0.0" 394 | 395 | color-convert@^2.0.1: 396 | version "2.0.1" 397 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 398 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 399 | dependencies: 400 | color-name "~1.1.4" 401 | 402 | color-name@~1.1.4: 403 | version "1.1.4" 404 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 405 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 406 | 407 | commander@^2.20.3: 408 | version "2.20.3" 409 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 410 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 411 | 412 | concat-map@0.0.1: 413 | version "0.0.1" 414 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 415 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 416 | 417 | create-require@^1.1.0: 418 | version "1.1.1" 419 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 420 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 421 | 422 | cross-fetch@^3.1.5: 423 | version "3.1.5" 424 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" 425 | integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== 426 | dependencies: 427 | node-fetch "2.6.7" 428 | 429 | 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.4, debug@^4.1.0: 435 | version "4.3.4" 436 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 437 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 438 | dependencies: 439 | ms "2.1.2" 440 | 441 | debug@^3.2.7: 442 | version "3.2.7" 443 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 444 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 445 | dependencies: 446 | ms "^2.1.1" 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@^4.1.2: 454 | version "4.1.3" 455 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" 456 | integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== 457 | dependencies: 458 | type-detect "^4.0.0" 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 | depd@^2.0.0: 466 | version "2.0.0" 467 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 468 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 469 | 470 | diff@5.0.0: 471 | version "5.0.0" 472 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 473 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 474 | 475 | diff@^4.0.1: 476 | version "4.0.2" 477 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 478 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 479 | 480 | dot-case@^3.0.4: 481 | version "3.0.4" 482 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 483 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 484 | dependencies: 485 | no-case "^3.0.4" 486 | tslib "^2.0.3" 487 | 488 | emoji-regex@^8.0.0: 489 | version "8.0.0" 490 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 491 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 492 | 493 | es6-promise@^4.0.3: 494 | version "4.2.8" 495 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 496 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 497 | 498 | es6-promisify@^5.0.0: 499 | version "5.0.0" 500 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 501 | integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== 502 | dependencies: 503 | es6-promise "^4.0.3" 504 | 505 | escalade@^3.1.1: 506 | version "3.1.1" 507 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 508 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 509 | 510 | escape-string-regexp@4.0.0: 511 | version "4.0.0" 512 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 513 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 514 | 515 | eventemitter3@^4.0.7: 516 | version "4.0.7" 517 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 518 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 519 | 520 | eyes@^0.1.8: 521 | version "0.1.8" 522 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 523 | integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== 524 | 525 | fast-stable-stringify@^1.0.0: 526 | version "1.0.0" 527 | resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" 528 | integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== 529 | 530 | file-uri-to-path@1.0.0: 531 | version "1.0.0" 532 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 533 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 534 | 535 | fill-range@^7.0.1: 536 | version "7.0.1" 537 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 538 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 539 | dependencies: 540 | to-regex-range "^5.0.1" 541 | 542 | find-up@5.0.0: 543 | version "5.0.0" 544 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 545 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 546 | dependencies: 547 | locate-path "^6.0.0" 548 | path-exists "^4.0.0" 549 | 550 | flat@^5.0.2: 551 | version "5.0.2" 552 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 553 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 554 | 555 | fs.realpath@^1.0.0: 556 | version "1.0.0" 557 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 558 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 559 | 560 | fsevents@~2.3.2: 561 | version "2.3.2" 562 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 563 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 564 | 565 | get-caller-file@^2.0.5: 566 | version "2.0.5" 567 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 568 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 569 | 570 | get-func-name@^2.0.0: 571 | version "2.0.0" 572 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 573 | integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== 574 | 575 | glob-parent@~5.1.2: 576 | version "5.1.2" 577 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 578 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 579 | dependencies: 580 | is-glob "^4.0.1" 581 | 582 | glob@7.2.0: 583 | version "7.2.0" 584 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 585 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 586 | dependencies: 587 | fs.realpath "^1.0.0" 588 | inflight "^1.0.4" 589 | inherits "2" 590 | minimatch "^3.0.4" 591 | once "^1.3.0" 592 | path-is-absolute "^1.0.0" 593 | 594 | has-flag@^3.0.0: 595 | version "3.0.0" 596 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 597 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 598 | 599 | has-flag@^4.0.0: 600 | version "4.0.0" 601 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 602 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 603 | 604 | he@1.2.0: 605 | version "1.2.0" 606 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 607 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 608 | 609 | humanize-ms@^1.2.1: 610 | version "1.2.1" 611 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 612 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 613 | dependencies: 614 | ms "^2.0.0" 615 | 616 | ieee754@^1.2.1: 617 | version "1.2.1" 618 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 619 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 620 | 621 | ignore-by-default@^1.0.1: 622 | version "1.0.1" 623 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 624 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 625 | 626 | inflight@^1.0.4: 627 | version "1.0.6" 628 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 629 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 630 | dependencies: 631 | once "^1.3.0" 632 | wrappy "1" 633 | 634 | inherits@2: 635 | version "2.0.4" 636 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 637 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 638 | 639 | is-binary-path@~2.1.0: 640 | version "2.1.0" 641 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 642 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 643 | dependencies: 644 | binary-extensions "^2.0.0" 645 | 646 | is-extglob@^2.1.1: 647 | version "2.1.1" 648 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 649 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 650 | 651 | is-fullwidth-code-point@^3.0.0: 652 | version "3.0.0" 653 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 654 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 655 | 656 | is-glob@^4.0.1, is-glob@~4.0.1: 657 | version "4.0.3" 658 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 659 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 660 | dependencies: 661 | is-extglob "^2.1.1" 662 | 663 | is-number@^7.0.0: 664 | version "7.0.0" 665 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 666 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 667 | 668 | is-plain-obj@^2.1.0: 669 | version "2.1.0" 670 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 671 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 672 | 673 | is-unicode-supported@^0.1.0: 674 | version "0.1.0" 675 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 676 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 677 | 678 | isomorphic-ws@^4.0.1: 679 | version "4.0.1" 680 | resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" 681 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 682 | 683 | jayson@^3.4.4: 684 | version "3.7.0" 685 | resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" 686 | integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== 687 | dependencies: 688 | "@types/connect" "^3.4.33" 689 | "@types/node" "^12.12.54" 690 | "@types/ws" "^7.4.4" 691 | JSONStream "^1.3.5" 692 | commander "^2.20.3" 693 | delay "^5.0.0" 694 | es6-promisify "^5.0.0" 695 | eyes "^0.1.8" 696 | isomorphic-ws "^4.0.1" 697 | json-stringify-safe "^5.0.1" 698 | lodash "^4.17.20" 699 | uuid "^8.3.2" 700 | ws "^7.4.5" 701 | 702 | js-sha256@^0.9.0: 703 | version "0.9.0" 704 | resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" 705 | integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== 706 | 707 | js-yaml@4.1.0: 708 | version "4.1.0" 709 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 710 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 711 | dependencies: 712 | argparse "^2.0.1" 713 | 714 | json-stringify-safe@^5.0.1: 715 | version "5.0.1" 716 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 717 | integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== 718 | 719 | jsonparse@^1.2.0: 720 | version "1.3.1" 721 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 722 | integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== 723 | 724 | locate-path@^6.0.0: 725 | version "6.0.0" 726 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 727 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 728 | dependencies: 729 | p-locate "^5.0.0" 730 | 731 | lodash@^4.17.20: 732 | version "4.17.21" 733 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 734 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 735 | 736 | log-symbols@4.1.0: 737 | version "4.1.0" 738 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 739 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 740 | dependencies: 741 | chalk "^4.1.0" 742 | is-unicode-supported "^0.1.0" 743 | 744 | loupe@^2.3.1: 745 | version "2.3.6" 746 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" 747 | integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== 748 | dependencies: 749 | get-func-name "^2.0.0" 750 | 751 | lower-case@^2.0.2: 752 | version "2.0.2" 753 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 754 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 755 | dependencies: 756 | tslib "^2.0.3" 757 | 758 | make-error@^1.1.1: 759 | version "1.3.6" 760 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 761 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 762 | 763 | minimatch@5.0.1: 764 | version "5.0.1" 765 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 766 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 767 | dependencies: 768 | brace-expansion "^2.0.1" 769 | 770 | minimatch@^3.0.4, minimatch@^3.1.2: 771 | version "3.1.2" 772 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 773 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 774 | dependencies: 775 | brace-expansion "^1.1.7" 776 | 777 | mocha@^10.2.0: 778 | version "10.2.0" 779 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" 780 | integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== 781 | dependencies: 782 | ansi-colors "4.1.1" 783 | browser-stdout "1.3.1" 784 | chokidar "3.5.3" 785 | debug "4.3.4" 786 | diff "5.0.0" 787 | escape-string-regexp "4.0.0" 788 | find-up "5.0.0" 789 | glob "7.2.0" 790 | he "1.2.0" 791 | js-yaml "4.1.0" 792 | log-symbols "4.1.0" 793 | minimatch "5.0.1" 794 | ms "2.1.3" 795 | nanoid "3.3.3" 796 | serialize-javascript "6.0.0" 797 | strip-json-comments "3.1.1" 798 | supports-color "8.1.1" 799 | workerpool "6.2.1" 800 | yargs "16.2.0" 801 | yargs-parser "20.2.4" 802 | yargs-unparser "2.0.0" 803 | 804 | ms@2.1.2: 805 | version "2.1.2" 806 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 807 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 808 | 809 | ms@2.1.3, ms@^2.0.0, ms@^2.1.1: 810 | version "2.1.3" 811 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 812 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 813 | 814 | nanoid@3.3.3: 815 | version "3.3.3" 816 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" 817 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 818 | 819 | no-case@^3.0.4: 820 | version "3.0.4" 821 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 822 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 823 | dependencies: 824 | lower-case "^2.0.2" 825 | tslib "^2.0.3" 826 | 827 | node-fetch@2.6.7: 828 | version "2.6.7" 829 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 830 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 831 | dependencies: 832 | whatwg-url "^5.0.0" 833 | 834 | node-fetch@^2.6.7: 835 | version "2.6.9" 836 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" 837 | integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== 838 | dependencies: 839 | whatwg-url "^5.0.0" 840 | 841 | node-gyp-build@^4.3.0: 842 | version "4.6.0" 843 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" 844 | integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== 845 | 846 | nodemon@^2.0.20: 847 | version "2.0.22" 848 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" 849 | integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== 850 | dependencies: 851 | chokidar "^3.5.2" 852 | debug "^3.2.7" 853 | ignore-by-default "^1.0.1" 854 | minimatch "^3.1.2" 855 | pstree.remy "^1.1.8" 856 | semver "^5.7.1" 857 | simple-update-notifier "^1.0.7" 858 | supports-color "^5.5.0" 859 | touch "^3.1.0" 860 | undefsafe "^2.0.5" 861 | 862 | nopt@~1.0.10: 863 | version "1.0.10" 864 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 865 | integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== 866 | dependencies: 867 | abbrev "1" 868 | 869 | normalize-path@^3.0.0, normalize-path@~3.0.0: 870 | version "3.0.0" 871 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 872 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 873 | 874 | once@^1.3.0: 875 | version "1.4.0" 876 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 877 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 878 | dependencies: 879 | wrappy "1" 880 | 881 | p-limit@^3.0.2: 882 | version "3.1.0" 883 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 884 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 885 | dependencies: 886 | yocto-queue "^0.1.0" 887 | 888 | p-locate@^5.0.0: 889 | version "5.0.0" 890 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 891 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 892 | dependencies: 893 | p-limit "^3.0.2" 894 | 895 | pako@^2.0.3: 896 | version "2.1.0" 897 | resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" 898 | integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== 899 | 900 | path-exists@^4.0.0: 901 | version "4.0.0" 902 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 903 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 904 | 905 | path-is-absolute@^1.0.0: 906 | version "1.0.1" 907 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 908 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 909 | 910 | pathval@^1.1.1: 911 | version "1.1.1" 912 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 913 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 914 | 915 | picomatch@^2.0.4, picomatch@^2.2.1: 916 | version "2.3.1" 917 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 918 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 919 | 920 | pstree.remy@^1.1.8: 921 | version "1.1.8" 922 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 923 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 924 | 925 | randombytes@^2.1.0: 926 | version "2.1.0" 927 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 928 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 929 | dependencies: 930 | safe-buffer "^5.1.0" 931 | 932 | readdirp@~3.6.0: 933 | version "3.6.0" 934 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 935 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 936 | dependencies: 937 | picomatch "^2.2.1" 938 | 939 | regenerator-runtime@^0.13.11: 940 | version "0.13.11" 941 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" 942 | integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 943 | 944 | require-directory@^2.1.1: 945 | version "2.1.1" 946 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 947 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 948 | 949 | rpc-websockets@^7.5.1: 950 | version "7.5.1" 951 | resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" 952 | integrity sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w== 953 | dependencies: 954 | "@babel/runtime" "^7.17.2" 955 | eventemitter3 "^4.0.7" 956 | uuid "^8.3.2" 957 | ws "^8.5.0" 958 | optionalDependencies: 959 | bufferutil "^4.0.1" 960 | utf-8-validate "^5.0.2" 961 | 962 | safe-buffer@^5.0.1, safe-buffer@^5.1.0: 963 | version "5.2.1" 964 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 965 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 966 | 967 | semver@^5.7.1: 968 | version "5.7.1" 969 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 970 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 971 | 972 | semver@~7.0.0: 973 | version "7.0.0" 974 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 975 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 976 | 977 | serialize-javascript@6.0.0: 978 | version "6.0.0" 979 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 980 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 981 | dependencies: 982 | randombytes "^2.1.0" 983 | 984 | simple-update-notifier@^1.0.7: 985 | version "1.1.0" 986 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" 987 | integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== 988 | dependencies: 989 | semver "~7.0.0" 990 | 991 | snake-case@^3.0.4: 992 | version "3.0.4" 993 | resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" 994 | integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== 995 | dependencies: 996 | dot-case "^3.0.4" 997 | tslib "^2.0.3" 998 | 999 | string-width@^4.1.0, string-width@^4.2.0: 1000 | version "4.2.3" 1001 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1002 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1003 | dependencies: 1004 | emoji-regex "^8.0.0" 1005 | is-fullwidth-code-point "^3.0.0" 1006 | strip-ansi "^6.0.1" 1007 | 1008 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1009 | version "6.0.1" 1010 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1011 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1012 | dependencies: 1013 | ansi-regex "^5.0.1" 1014 | 1015 | strip-json-comments@3.1.1: 1016 | version "3.1.1" 1017 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1018 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1019 | 1020 | superstruct@^0.14.2: 1021 | version "0.14.2" 1022 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" 1023 | integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== 1024 | 1025 | superstruct@^0.15.4: 1026 | version "0.15.5" 1027 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" 1028 | integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== 1029 | 1030 | supports-color@8.1.1: 1031 | version "8.1.1" 1032 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1033 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1034 | dependencies: 1035 | has-flag "^4.0.0" 1036 | 1037 | supports-color@^5.5.0: 1038 | version "5.5.0" 1039 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1040 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1041 | dependencies: 1042 | has-flag "^3.0.0" 1043 | 1044 | supports-color@^7.1.0: 1045 | version "7.2.0" 1046 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1047 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1048 | dependencies: 1049 | has-flag "^4.0.0" 1050 | 1051 | text-encoding-utf-8@^1.0.2: 1052 | version "1.0.2" 1053 | resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" 1054 | integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== 1055 | 1056 | "through@>=2.2.7 <3": 1057 | version "2.3.8" 1058 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1059 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== 1060 | 1061 | to-regex-range@^5.0.1: 1062 | version "5.0.1" 1063 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1064 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1065 | dependencies: 1066 | is-number "^7.0.0" 1067 | 1068 | toml@^3.0.0: 1069 | version "3.0.0" 1070 | resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" 1071 | integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== 1072 | 1073 | touch@^3.1.0: 1074 | version "3.1.0" 1075 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1076 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1077 | dependencies: 1078 | nopt "~1.0.10" 1079 | 1080 | tr46@~0.0.3: 1081 | version "0.0.3" 1082 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1083 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1084 | 1085 | ts-node@^10.9.1: 1086 | version "10.9.1" 1087 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 1088 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 1089 | dependencies: 1090 | "@cspotcode/source-map-support" "^0.8.0" 1091 | "@tsconfig/node10" "^1.0.7" 1092 | "@tsconfig/node12" "^1.0.7" 1093 | "@tsconfig/node14" "^1.0.0" 1094 | "@tsconfig/node16" "^1.0.2" 1095 | acorn "^8.4.1" 1096 | acorn-walk "^8.1.1" 1097 | arg "^4.1.0" 1098 | create-require "^1.1.0" 1099 | diff "^4.0.1" 1100 | make-error "^1.1.1" 1101 | v8-compile-cache-lib "^3.0.1" 1102 | yn "3.1.1" 1103 | 1104 | tslib@^2.0.3: 1105 | version "2.5.0" 1106 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" 1107 | integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== 1108 | 1109 | type-detect@^4.0.0, type-detect@^4.0.5: 1110 | version "4.0.8" 1111 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1112 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1113 | 1114 | typescript@^4.9.5: 1115 | version "4.9.5" 1116 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 1117 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 1118 | 1119 | undefsafe@^2.0.5: 1120 | version "2.0.5" 1121 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 1122 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 1123 | 1124 | utf-8-validate@^5.0.2: 1125 | version "5.0.10" 1126 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" 1127 | integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== 1128 | dependencies: 1129 | node-gyp-build "^4.3.0" 1130 | 1131 | uuid@^8.3.2: 1132 | version "8.3.2" 1133 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1134 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1135 | 1136 | v8-compile-cache-lib@^3.0.1: 1137 | version "3.0.1" 1138 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1139 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1140 | 1141 | webidl-conversions@^3.0.0: 1142 | version "3.0.1" 1143 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1144 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1145 | 1146 | whatwg-url@^5.0.0: 1147 | version "5.0.0" 1148 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1149 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1150 | dependencies: 1151 | tr46 "~0.0.3" 1152 | webidl-conversions "^3.0.0" 1153 | 1154 | workerpool@6.2.1: 1155 | version "6.2.1" 1156 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1157 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1158 | 1159 | wrap-ansi@^7.0.0: 1160 | version "7.0.0" 1161 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1162 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1163 | dependencies: 1164 | ansi-styles "^4.0.0" 1165 | string-width "^4.1.0" 1166 | strip-ansi "^6.0.0" 1167 | 1168 | wrappy@1: 1169 | version "1.0.2" 1170 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1171 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1172 | 1173 | ws@^7.4.5: 1174 | version "7.5.9" 1175 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" 1176 | integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 1177 | 1178 | ws@^8.5.0: 1179 | version "8.13.0" 1180 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" 1181 | integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== 1182 | 1183 | y18n@^5.0.5: 1184 | version "5.0.8" 1185 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1186 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1187 | 1188 | yargs-parser@20.2.4: 1189 | version "20.2.4" 1190 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1191 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1192 | 1193 | yargs-parser@^20.2.2: 1194 | version "20.2.9" 1195 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1196 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1197 | 1198 | yargs-unparser@2.0.0: 1199 | version "2.0.0" 1200 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1201 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1202 | dependencies: 1203 | camelcase "^6.0.0" 1204 | decamelize "^4.0.0" 1205 | flat "^5.0.2" 1206 | is-plain-obj "^2.1.0" 1207 | 1208 | yargs@16.2.0: 1209 | version "16.2.0" 1210 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1211 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1212 | dependencies: 1213 | cliui "^7.0.2" 1214 | escalade "^3.1.1" 1215 | get-caller-file "^2.0.5" 1216 | require-directory "^2.1.1" 1217 | string-width "^4.2.0" 1218 | y18n "^5.0.5" 1219 | yargs-parser "^20.2.2" 1220 | 1221 | yn@3.1.1: 1222 | version "3.1.1" 1223 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1224 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1225 | 1226 | yocto-queue@^0.1.0: 1227 | version "0.1.0" 1228 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1229 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1230 | --------------------------------------------------------------------------------