From 3190bae4283a2ae9a03baf8d479abc5c0090fb00 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Mon, 7 Mar 2022 15:11:37 +1300 Subject: [PATCH 01/30] Add basic example --- tests/anchor-cpi-return/.gitignore | 6 + tests/anchor-cpi-return/Anchor.toml | 16 + tests/anchor-cpi-return/Cargo.toml | 4 + tests/anchor-cpi-return/migrations/deploy.ts | 12 + tests/anchor-cpi-return/package.json | 13 + .../programs/anchor-cpi-caller/Cargo.toml | 20 + .../programs/anchor-cpi-caller/Xargo.toml | 2 + .../programs/anchor-cpi-caller/src/lib.rs | 18 + .../programs/anchor-cpi-return/Cargo.toml | 19 + .../programs/anchor-cpi-return/Xargo.toml | 2 + .../programs/anchor-cpi-return/src/lib.rs | 15 + .../tests/anchor-cpi-return.ts | 16 + tests/anchor-cpi-return/tsconfig.json | 10 + tests/anchor-cpi-return/yarn.lock | 1238 +++++++++++++++++ 14 files changed, 1391 insertions(+) create mode 100644 tests/anchor-cpi-return/.gitignore create mode 100644 tests/anchor-cpi-return/Anchor.toml create mode 100644 tests/anchor-cpi-return/Cargo.toml create mode 100644 tests/anchor-cpi-return/migrations/deploy.ts create mode 100644 tests/anchor-cpi-return/package.json create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-caller/Xargo.toml create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-return/Xargo.toml create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs create mode 100644 tests/anchor-cpi-return/tests/anchor-cpi-return.ts create mode 100644 tests/anchor-cpi-return/tsconfig.json create mode 100644 tests/anchor-cpi-return/yarn.lock diff --git a/tests/anchor-cpi-return/.gitignore b/tests/anchor-cpi-return/.gitignore new file mode 100644 index 0000000000..51448d4dab --- /dev/null +++ b/tests/anchor-cpi-return/.gitignore @@ -0,0 +1,6 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules diff --git a/tests/anchor-cpi-return/Anchor.toml b/tests/anchor-cpi-return/Anchor.toml new file mode 100644 index 0000000000..0898576250 --- /dev/null +++ b/tests/anchor-cpi-return/Anchor.toml @@ -0,0 +1,16 @@ +[features] +seeds = false + +[programs.localnet] +anchor_cpi_return = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS" +anchor_cpi_caller = "HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L" + +[registry] +url = "https://anchor.projectserum.com" + +[provider] +cluster = "localnet" +wallet = "/Users/tom/.config/solana/id.json" + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/tests/anchor-cpi-return/Cargo.toml b/tests/anchor-cpi-return/Cargo.toml new file mode 100644 index 0000000000..a60de986d3 --- /dev/null +++ b/tests/anchor-cpi-return/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "programs/*" +] diff --git a/tests/anchor-cpi-return/migrations/deploy.ts b/tests/anchor-cpi-return/migrations/deploy.ts new file mode 100644 index 0000000000..5e3df0dc30 --- /dev/null +++ b/tests/anchor-cpi-return/migrations/deploy.ts @@ -0,0 +1,12 @@ +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@project-serum/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +}; diff --git a/tests/anchor-cpi-return/package.json b/tests/anchor-cpi-return/package.json new file mode 100644 index 0000000000..5bf3be9114 --- /dev/null +++ b/tests/anchor-cpi-return/package.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "@project-serum/anchor": "^0.22.1" + }, + "devDependencies": { + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^8.0.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "typescript": "^4.3.5" + } +} diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml b/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml new file mode 100644 index 0000000000..bbea7ddac4 --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "anchor-cpi-caller" +version = "0.1.0" +description = "Created with Anchor" +edition = "2018" + +[lib] +crate-type = ["cdylib", "lib"] +name = "anchor_cpi_caller" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = { path = "../../../../lang", features = ["init-if-needed"] } +anchor-cpi-return = { path = "../anchor-cpi-return", features = ["cpi"] } diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Xargo.toml b/tests/anchor-cpi-return/programs/anchor-cpi-caller/Xargo.toml new file mode 100644 index 0000000000..475fb71ed1 --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs new file mode 100644 index 0000000000..3324691f87 --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs @@ -0,0 +1,18 @@ +use anchor_lang::prelude::*; +use anchor_cpi_return::* + +declare_id!("HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L"); + +#[program] +pub mod anchor_cpi_caller { + use super::*; + + pub fn initialize(ctx: Context) -> Result<()> { + let data = anchor_cpi_return::cpi::initialize(ctx); + msg!(data); + Ok(()) + } +} + +#[derive(Accounts)] +pub struct Initialize {} diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml b/tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml new file mode 100644 index 0000000000..795fa697f2 --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "anchor-cpi-return" +version = "0.1.0" +description = "Created with Anchor" +edition = "2018" + +[lib] +crate-type = ["cdylib", "lib"] +name = "anchor_cpi_return" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +anchor-lang = { path = "../../../../lang", features = ["init-if-needed"] } diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/Xargo.toml b/tests/anchor-cpi-return/programs/anchor-cpi-return/Xargo.toml new file mode 100644 index 0000000000..475fb71ed1 --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs new file mode 100644 index 0000000000..2a3ea0d032 --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs @@ -0,0 +1,15 @@ +use anchor_lang::prelude::*; + +declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); + +#[program] +pub mod anchor_cpi_return { + use super::*; + + pub fn initialize(ctx: Context) -> Result { + Ok(10) + } +} + +#[derive(Accounts)] +pub struct Initialize {} diff --git a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts new file mode 100644 index 0000000000..f8b647b345 --- /dev/null +++ b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts @@ -0,0 +1,16 @@ +import * as anchor from "@project-serum/anchor"; +import { Program } from "@project-serum/anchor"; +import { AnchorCpiReturn } from "../target/types/anchor_cpi_return"; + +describe("anchor-cpi-return", () => { + // Configure the client to use the local cluster. + anchor.setProvider(anchor.Provider.env()); + + const program = anchor.workspace.AnchorCpiReturn as Program; + + it("Is initialized!", async () => { + const tx = await program.rpc.initialize({}); + console.log(program); + console.log("Your transaction signature", tx); + }); +}); diff --git a/tests/anchor-cpi-return/tsconfig.json b/tests/anchor-cpi-return/tsconfig.json new file mode 100644 index 0000000000..cd5d2e3d06 --- /dev/null +++ b/tests/anchor-cpi-return/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/tests/anchor-cpi-return/yarn.lock b/tests/anchor-cpi-return/yarn.lock new file mode 100644 index 0000000000..b160717556 --- /dev/null +++ b/tests/anchor-cpi-return/yarn.lock @@ -0,0 +1,1238 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" + integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== + dependencies: + regenerator-runtime "^0.13.4" + +"@ethersproject/bytes@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/logger@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/sha2@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + hash.js "1.1.7" + +"@project-serum/anchor@^0.22.1": + version "0.22.1" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.22.1.tgz#698a9620f94691de0a12bbc650a5c8380e2f0e8a" + integrity sha512-5pHeyvQhzLahIQ8aZymmDMZJAJFklN0joZdI+YIqFkK2uU/mlKr6rBLQjxysf/j1mLLiNG00tdyLfUtTAdQz7w== + dependencies: + "@project-serum/borsh" "^0.2.5" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^5.3.1" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + +"@project-serum/borsh@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.5.tgz#6059287aa624ecebbfc0edd35e4c28ff987d8663" + integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@solana/buffer-layout@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" + integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@^1.17.0": + version "1.36.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.36.0.tgz#79d7d5217b49b80139f4de68953adc5b9a9a264f" + integrity sha512-RNT1451iRR7TyW7EJKMCrH/0OXawIe4zVm0DWQASwXlR/u1jmW6FrmH0lujIh7cGTlfOVbH+2ZU9AVUPLBFzwA== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + cross-fetch "^3.1.4" + jayson "^3.4.4" + js-sha3 "^0.8.0" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + +"@types/bn.js@^4.11.5": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/chai@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" + integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== + +"@types/connect@^3.4.33": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.9": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/lodash@^4.14.159": + version "4.14.179" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.179.tgz#490ec3288088c91295780237d2497a3aa9dfb5c5" + integrity sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w== + +"@types/mocha@^9.0.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" + integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== + +"@types/node@*": + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" + integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== + +"@types/node@^12.12.54": + version "12.20.46" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.46.tgz#7e49dee4c54fd19584e6a9e0da5f3dc2e9136bc7" + integrity sha512-cPjLXj8d6anFPzFvOPxS3fvly3Shm5nTfl6g8X5smexixbuGUf7hfr21J5tX9JW+UPStp/5P5R8qrKL5IyVJ+A== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +borsh@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" + integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== + dependencies: + "@types/bn.js" "^4.11.5" + bn.js "^5.0.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-layout@^1.2.0, buffer-layout@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.0" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +circular-json@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cross-fetch@^3.1.4, cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" + integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== + dependencies: + traverse-chain "~0.1.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^3.4.4: + version "3.6.6" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" + integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== + dependencies: + "@types/connect" "^3.4.33" + "@types/express-serve-static-core" "^4.17.9" + "@types/lodash" "^4.14.159" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + lodash "^4.17.20" + uuid "^8.3.2" + ws "^7.4.5" + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@^9.0.3: + version "9.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e" + integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.2.0" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +rpc-websockets@^7.4.2: + version "7.4.17" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.17.tgz#f38845dd96db0442bff9e15fba9df781beb44cc0" + integrity sha512-eolVi/qlXS13viIUH9aqrde902wzSLAai0IjmOZSRefp5I3CSG/vCnD0c0fDSYCWuEyUoRL1BHQA8K1baEUyow== + dependencies: + "@babel/runtime" "^7.11.2" + circular-json "^0.5.9" + eventemitter3 "^4.0.7" + uuid "^8.3.0" + ws "^7.4.5" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +traverse-chain@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" + integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= + +ts-mocha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" + integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.13.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz#f3e9b8f6876698581d94470c03c95b3a48c0e3d7" + integrity sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tweetnacl@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^4.3.5: + version "4.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" + integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== + +utf-8-validate@^5.0.2: + version "5.0.8" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" + integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== + dependencies: + node-gyp-build "^4.3.0" + +uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.4.5: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From c707d92ca7ea25c8d2a840793c9d2e4c348c1a89 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Mon, 7 Mar 2022 18:21:17 +1300 Subject: [PATCH 02/30] Parse return types --- lang/syn/src/lib.rs | 8 ++++- lang/syn/src/parser/program/instructions.rs | 39 ++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index ca652f81d5..b7b6c210f5 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -14,7 +14,7 @@ use syn::spanned::Spanned; use syn::token::Comma; use syn::{ Expr, Generics, Ident, ImplItemMethod, ItemEnum, ItemFn, ItemImpl, ItemMod, ItemStruct, LitInt, - LitStr, PatType, Token, TypePath, + LitStr, PatType, Token, Type, TypePath, }; pub mod codegen; @@ -85,6 +85,7 @@ pub struct Ix { pub raw_method: ItemFn, pub ident: Ident, pub args: Vec, + pub returns: IxReturn, // The ident for the struct deriving Accounts. pub anchor_ident: Ident, } @@ -95,6 +96,11 @@ pub struct IxArg { pub raw_arg: PatType, } +#[derive(Debug)] +pub struct IxReturn { + pub return_type: Type, +} + #[derive(Debug)] pub struct FallbackFn { raw_method: ItemFn, diff --git a/lang/syn/src/parser/program/instructions.rs b/lang/syn/src/parser/program/instructions.rs index a0cfd22e77..22efab0707 100644 --- a/lang/syn/src/parser/program/instructions.rs +++ b/lang/syn/src/parser/program/instructions.rs @@ -1,5 +1,5 @@ use crate::parser::program::ctx_accounts_ident; -use crate::{FallbackFn, Ix, IxArg}; +use crate::{FallbackFn, Ix, IxArg, IxReturn}; use syn::parse::{Error as ParseError, Result as ParseResult}; use syn::spanned::Spanned; @@ -23,12 +23,15 @@ pub fn parse(program_mod: &syn::ItemMod) -> ParseResult<(Vec, Option>>()?; @@ -91,3 +94,37 @@ pub fn parse_args(method: &syn::ItemFn) -> ParseResult<(IxArg, Vec)> { Ok((ctx, args)) } + +pub fn parse_return(method: &syn::ItemFn) -> ParseResult { + match method.sig.output { + syn::ReturnType::Type(_, ref ty) => { + let ty = match ty.as_ref() { + syn::Type::Path(ty) => ty, + _ => return Err(ParseError::new(ty.span(), "expected a return type")), + }; + let generic_args = match &ty.path.segments.last().unwrap().arguments { + syn::PathArguments::AngleBracketed(params) => params.args.iter().last().unwrap(), + _ => { + return Err(ParseError::new( + ty.span(), + "expected return type to be generic", + )) + } + }; + let return_type = match generic_args { + syn::GenericArgument::Type(ty) => ty.clone(), + _ => { + return Err(ParseError::new( + ty.span(), + "expected generic return type to be a type", + )) + } + }; + Ok(IxReturn { return_type }) + } + _ => Err(ParseError::new( + method.sig.output.span(), + "expected a return type", + )), + } +} From e37a325be1941267e5155f4778098f9ee55afee0 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Mon, 7 Mar 2022 18:21:40 +1300 Subject: [PATCH 03/30] Update programs --- .../programs/anchor-cpi-caller/src/lib.rs | 7 +++---- .../programs/anchor-cpi-return/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs index 3324691f87..ce22f82e15 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs @@ -1,5 +1,4 @@ use anchor_lang::prelude::*; -use anchor_cpi_return::* declare_id!("HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L"); @@ -7,12 +6,12 @@ declare_id!("HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L"); pub mod anchor_cpi_caller { use super::*; - pub fn initialize(ctx: Context) -> Result<()> { - let data = anchor_cpi_return::cpi::initialize(ctx); + pub fn initialize_caller(ctx: Context) -> Result<()> { + let data = anchor_cpi_return::cpi::initialize_return(ctx); msg!(data); Ok(()) } } #[derive(Accounts)] -pub struct Initialize {} +pub struct InitializeCaller {} diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs index 2a3ea0d032..f6ac532579 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs @@ -6,10 +6,10 @@ declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); pub mod anchor_cpi_return { use super::*; - pub fn initialize(ctx: Context) -> Result { + pub fn initialize_return(ctx: Context) -> Result { Ok(10) } } #[derive(Accounts)] -pub struct Initialize {} +pub struct InitializeReturn {} From c4079c429df314f3fd4cbdb868a53c4ac2469479 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 10 Mar 2022 17:22:41 +1300 Subject: [PATCH 04/30] Working implementation for u64 --- lang/syn/src/codegen/program/cpi.rs | 11 +- lang/syn/src/codegen/program/handlers.rs | 7 +- lang/syn/src/parser/program/instructions.rs | 1 - .../programs/anchor-cpi-caller/src/lib.rs | 20 +- .../programs/anchor-cpi-return/out.rs | 521 ++++++++++++++++++ .../programs/anchor-cpi-return/src/lib.rs | 36 +- .../tests/anchor-cpi-return.ts | 30 +- 7 files changed, 611 insertions(+), 15 deletions(-) create mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index 768292c651..648978090d 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -2,7 +2,7 @@ use crate::codegen::program::common::{generate_ix_variant, sighash, SIGHASH_GLOB use crate::Program; use crate::StateIx; use heck::SnakeCase; -use quote::quote; +use quote::{quote, ToTokens}; pub fn generate(program: &Program) -> proc_macro2::TokenStream { // Generate cpi methods for the state struct. @@ -70,11 +70,13 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, name); let sighash_tts: proc_macro2::TokenStream = format!("{:?}", sighash_arr).parse().unwrap(); + // TODO Cfg if cpi-return else () + let ret_type = &ix.returns.return_type.to_token_stream(); quote! { pub fn #method_name<'a, 'b, 'c, 'info>( ctx: anchor_lang::context::CpiContext<'a, 'b, 'c, 'info, #accounts_ident<'info>>, #(#args),* - ) -> anchor_lang::Result<()> { + ) -> anchor_lang::Result<#ret_type> { let ix = { let ix = instruction::#ix_variant; let mut ix_data = AnchorSerialize::try_to_vec(&ix) @@ -93,7 +95,10 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { &ix, &acc_infos, ctx.signer_seeds, - ).map_err(Into::into) + ); + let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); + let data = <#ret_type>::try_from_slice(&data)?; + Ok(data) } } }; diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 462e3727c1..408ecb17fc 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -722,7 +722,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { )?; // Invoke user defined handler. - #program_name::#ix_method_name( + let result = #program_name::#ix_method_name( anchor_lang::context::Context::new( program_id, &mut accounts, @@ -732,6 +732,11 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { #(#ix_arg_names),* )?; + // Set return data. + let mut buffer: Vec = Vec::new(); + result.serialize(&mut buffer)?; + anchor_lang::solana_program::program::set_return_data(&buffer.as_slice()); + // Exit routine. accounts.exit(program_id) } diff --git a/lang/syn/src/parser/program/instructions.rs b/lang/syn/src/parser/program/instructions.rs index 22efab0707..0f74ab856a 100644 --- a/lang/syn/src/parser/program/instructions.rs +++ b/lang/syn/src/parser/program/instructions.rs @@ -25,7 +25,6 @@ pub fn parse(program_mod: &syn::ItemMod) -> ParseResult<(Vec, Option) -> Result<()> { - let data = anchor_cpi_return::cpi::initialize_return(ctx); - msg!(data); + pub fn cpi_call_return_u64(ctx: Context) -> Result<()> { + let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); + let cpi_accounts = CpiReturn { + account: ctx.accounts.cpi_return.to_account_info(), + }; + let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); + let data = anchor_cpi_return::cpi::return_u64(cpi_ctx)?; + msg!(&data.to_string()); Ok(()) } } #[derive(Accounts)] -pub struct InitializeCaller {} +pub struct CpiReturnU64<'info> { + #[account(mut)] + pub cpi_return: Account<'info, CpiReturnAccount>, + pub cpi_return_program: Program<'info, AnchorCpiReturn>, +} diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs b/tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs new file mode 100644 index 0000000000..0f1ec1174e --- /dev/null +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs @@ -0,0 +1,521 @@ +#![feature(prelude_import)] +#![feature(trace_macros)] +#[prelude_import] +use std::prelude::rust_2018::*; +#[macro_use] +extern crate std; +use anchor_lang::prelude::*; +/// The static program ID +pub static ID: anchor_lang::solana_program::pubkey::Pubkey = + anchor_lang::solana_program::pubkey::Pubkey::new_from_array([ + 218u8, 7u8, 92u8, 178u8, 255u8, 94u8, 198u8, 129u8, 118u8, 19u8, 222u8, 83u8, 11u8, 105u8, + 42u8, 135u8, 53u8, 71u8, 119u8, 105u8, 218u8, 71u8, 67u8, 12u8, 189u8, 129u8, 84u8, 51u8, + 92u8, 74u8, 131u8, 39u8, + ]); +/// Confirms that a given pubkey is equivalent to the program ID +pub fn check_id(id: &anchor_lang::solana_program::pubkey::Pubkey) -> bool { + id == &ID +} +/// Returns the program ID +pub fn id() -> anchor_lang::solana_program::pubkey::Pubkey { + ID +} +use self::anchor_cpi_return::*; +/// # Safety +#[no_mangle] +pub unsafe extern "C" fn entrypoint(input: *mut u8) -> u64 { + let (program_id, accounts, instruction_data) = + unsafe { ::solana_program::entrypoint::deserialize(input) }; + match entry(&program_id, &accounts, &instruction_data) { + Ok(()) => ::solana_program::entrypoint::SUCCESS, + Err(error) => error.into(), + } +} +/// The Anchor codegen exposes a programming model where a user defines +/// a set of methods inside of a `#[program]` module in a way similar +/// to writing RPC request handlers. The macro then generates a bunch of +/// code wrapping these user defined methods into something that can be +/// executed on Solana. +/// +/// These methods fall into one of three categories, each of which +/// can be considered a different "namespace" of the program. +/// +/// 1) Global methods - regular methods inside of the `#[program]`. +/// 2) State methods - associated methods inside a `#[state]` struct. +/// 3) Interface methods - methods inside a strait struct's +/// implementation of an `#[interface]` trait. +/// +/// Care must be taken by the codegen to prevent collisions between +/// methods in these different namespaces. For this reason, Anchor uses +/// a variant of sighash to perform method dispatch, rather than +/// something like a simple enum variant discriminator. +/// +/// The execution flow of the generated code can be roughly outlined: +/// +/// * Start program via the entrypoint. +/// * Strip method identifier off the first 8 bytes of the instruction +/// data and invoke the identified method. The method identifier +/// is a variant of sighash. See docs.rs for `anchor_lang` for details. +/// * If the method identifier is an IDL identifier, execute the IDL +/// instructions, which are a special set of hardcoded instructions +/// baked into every Anchor program. Then exit. +/// * Otherwise, the method identifier is for a user defined +/// instruction, i.e., one of the methods in the user defined +/// `#[program]` module. Perform method dispatch, i.e., execute the +/// big match statement mapping method identifier to method handler +/// wrapper. +/// * Run the method handler wrapper. This wraps the code the user +/// actually wrote, deserializing the accounts, constructing the +/// context, invoking the user's code, and finally running the exit +/// routine, which typically persists account changes. +/// +/// The `entry` function here, defines the standard entry to a Solana +/// program, where execution begins. +pub fn entry( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> anchor_lang::solana_program::entrypoint::ProgramResult { + try_entry(program_id, accounts, data).map_err(|e| { + e.log(); + e.into() + }) +} +fn try_entry( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> anchor_lang::Result<()> { + if *program_id != ID { + return Err(anchor_lang::error::ErrorCode::DeclaredProgramIdMismatch.into()); + } + if data.len() < 8 { + return Err(anchor_lang::error::ErrorCode::InstructionMissing.into()); + } + dispatch(program_id, accounts, data) +} +/// Module representing the program. +pub mod program { + use super::*; + /// Type representing the program. + pub struct AnchorCpiReturn; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::core::clone::Clone for AnchorCpiReturn { + #[inline] + fn clone(&self) -> AnchorCpiReturn { + match *self { + AnchorCpiReturn => AnchorCpiReturn, + } + } + } + impl anchor_lang::Id for AnchorCpiReturn { + fn id() -> Pubkey { + ID + } + } +} +/// Performs method dispatch. +/// +/// Each method in an anchor program is uniquely defined by a namespace +/// and a rust identifier (i.e., the name given to the method). These +/// two pieces can be combined to creater a method identifier, +/// specifically, Anchor uses +/// +/// Sha256("::")[..8], +/// +/// where the namespace can be one of three types. 1) "global" for a +/// regular instruction, 2) "state" for a state struct instruction +/// handler and 3) a trait namespace (used in combination with the +/// `#[interface]` attribute), which is defined by the trait name, e.. +/// `MyTrait`. +/// +/// With this 8 byte identifier, Anchor performs method dispatch, +/// matching the given 8 byte identifier to the associated method +/// handler, which leads to user defined code being eventually invoked. +fn dispatch(program_id: &Pubkey, accounts: &[AccountInfo], data: &[u8]) -> anchor_lang::Result<()> { + let mut ix_data: &[u8] = data; + let sighash: [u8; 8] = { + let mut sighash: [u8; 8] = [0; 8]; + sighash.copy_from_slice(&ix_data[..8]); + ix_data = &ix_data[8..]; + sighash + }; + if true { + if sighash == anchor_lang::idl::IDL_IX_TAG.to_le_bytes() { + return __private::__idl::__idl_dispatch(program_id, accounts, &ix_data); + } + } + match sighash { + [238, 52, 63, 106, 176, 55, 69, 91] => { + __private::__global::initialize_return(program_id, accounts, ix_data) + } + _ => Err(anchor_lang::error::ErrorCode::InstructionFallbackNotFound.into()), + } +} +/// Create a private module to not clutter the program's namespace. +/// Defines an entrypoint for each individual instruction handler +/// wrapper. +mod __private { + use super::*; + /// __idl mod defines handlers for injected Anchor IDL instructions. + pub mod __idl { + use super::*; + #[inline(never)] + #[cfg(not(feature = "no-idl"))] + pub fn __idl_dispatch( + program_id: &Pubkey, + accounts: &[AccountInfo], + idl_ix_data: &[u8], + ) -> anchor_lang::Result<()> { + let mut accounts = accounts; + let mut data: &[u8] = idl_ix_data; + let ix = anchor_lang::idl::IdlInstruction::deserialize(&mut data) + .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)?; + match ix { + anchor_lang::idl::IdlInstruction::Create { data_len } => { + let mut bumps = std::collections::BTreeMap::new(); + let mut accounts = anchor_lang::idl::IdlCreateAccounts::try_accounts( + program_id, + &mut accounts, + &[], + &mut bumps, + )?; + __idl_create_account(program_id, &mut accounts, data_len)?; + accounts.exit(program_id)?; + } + anchor_lang::idl::IdlInstruction::CreateBuffer => { + let mut bumps = std::collections::BTreeMap::new(); + let mut accounts = anchor_lang::idl::IdlCreateBuffer::try_accounts( + program_id, + &mut accounts, + &[], + &mut bumps, + )?; + __idl_create_buffer(program_id, &mut accounts)?; + accounts.exit(program_id)?; + } + anchor_lang::idl::IdlInstruction::Write { data } => { + let mut bumps = std::collections::BTreeMap::new(); + let mut accounts = anchor_lang::idl::IdlAccounts::try_accounts( + program_id, + &mut accounts, + &[], + &mut bumps, + )?; + __idl_write(program_id, &mut accounts, data)?; + accounts.exit(program_id)?; + } + anchor_lang::idl::IdlInstruction::SetAuthority { new_authority } => { + let mut bumps = std::collections::BTreeMap::new(); + let mut accounts = anchor_lang::idl::IdlAccounts::try_accounts( + program_id, + &mut accounts, + &[], + &mut bumps, + )?; + __idl_set_authority(program_id, &mut accounts, new_authority)?; + accounts.exit(program_id)?; + } + anchor_lang::idl::IdlInstruction::SetBuffer => { + let mut bumps = std::collections::BTreeMap::new(); + let mut accounts = anchor_lang::idl::IdlSetBuffer::try_accounts( + program_id, + &mut accounts, + &[], + &mut bumps, + )?; + __idl_set_buffer(program_id, &mut accounts)?; + accounts.exit(program_id)?; + } + } + Ok(()) + } + #[inline(never)] + pub fn __idl_create_account( + program_id: &Pubkey, + accounts: &mut anchor_lang::idl::IdlCreateAccounts, + data_len: u64, + ) -> anchor_lang::Result<()> { + ::solana_program::log::sol_log("Instruction: IdlCreateAccount"); + if program_id != accounts.program.key { + return Err(anchor_lang::error::ErrorCode::IdlInstructionInvalidProgram.into()); + } + let from = accounts.from.key; + let (base, nonce) = Pubkey::find_program_address(&[], program_id); + let seed = anchor_lang::idl::IdlAccount::seed(); + let owner = accounts.program.key; + let to = Pubkey::create_with_seed(&base, seed, owner).unwrap(); + let space = 8 + 32 + 4 + data_len as usize; + let rent = Rent::get()?; + let lamports = rent.minimum_balance(space); + let seeds = &[&[nonce][..]]; + let ix = anchor_lang::solana_program::system_instruction::create_account_with_seed( + from, + &to, + &base, + seed, + lamports, + space as u64, + owner, + ); + anchor_lang::solana_program::program::invoke_signed( + &ix, + &[ + accounts.from.clone(), + accounts.to.clone(), + accounts.base.clone(), + accounts.system_program.clone(), + ], + &[seeds], + )?; + let mut idl_account = { + let mut account_data = accounts.to.try_borrow_data()?; + let mut account_data_slice: &[u8] = &account_data; + anchor_lang::idl::IdlAccount::try_deserialize_unchecked(&mut account_data_slice)? + }; + idl_account.authority = *accounts.from.key; + let mut data = accounts.to.try_borrow_mut_data()?; + let dst: &mut [u8] = &mut data; + let mut cursor = std::io::Cursor::new(dst); + idl_account.try_serialize(&mut cursor)?; + Ok(()) + } + #[inline(never)] + pub fn __idl_create_buffer( + program_id: &Pubkey, + accounts: &mut anchor_lang::idl::IdlCreateBuffer, + ) -> anchor_lang::Result<()> { + ::solana_program::log::sol_log("Instruction: IdlCreateBuffer"); + let mut buffer = &mut accounts.buffer; + buffer.authority = *accounts.authority.key; + Ok(()) + } + #[inline(never)] + pub fn __idl_write( + program_id: &Pubkey, + accounts: &mut anchor_lang::idl::IdlAccounts, + idl_data: Vec, + ) -> anchor_lang::Result<()> { + ::solana_program::log::sol_log("Instruction: IdlWrite"); + let mut idl = &mut accounts.idl; + idl.data.extend(idl_data); + Ok(()) + } + #[inline(never)] + pub fn __idl_set_authority( + program_id: &Pubkey, + accounts: &mut anchor_lang::idl::IdlAccounts, + new_authority: Pubkey, + ) -> anchor_lang::Result<()> { + ::solana_program::log::sol_log("Instruction: IdlSetAuthority"); + accounts.idl.authority = new_authority; + Ok(()) + } + #[inline(never)] + pub fn __idl_set_buffer( + program_id: &Pubkey, + accounts: &mut anchor_lang::idl::IdlSetBuffer, + ) -> anchor_lang::Result<()> { + ::solana_program::log::sol_log("Instruction: IdlSetBuffer"); + accounts.idl.data = accounts.buffer.data.clone(); + Ok(()) + } + } + /// __state mod defines wrapped handlers for state instructions. + pub mod __state { + use super::*; + } + /// __interface mod defines wrapped handlers for `#[interface]` trait + /// implementations. + pub mod __interface { + use super::*; + } + /// __global mod defines wrapped handlers for global instructions. + pub mod __global { + use super::*; + #[inline(never)] + pub fn initialize_return( + program_id: &Pubkey, + accounts: &[AccountInfo], + ix_data: &[u8], + ) -> anchor_lang::Result<()> { + ::solana_program::log::sol_log("Instruction: InitializeReturn"); + let ix = instruction::InitializeReturn::deserialize(&mut &ix_data[..]) + .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)?; + let instruction::InitializeReturn = ix; + let mut __bumps = std::collections::BTreeMap::new(); + let mut remaining_accounts: &[AccountInfo] = accounts; + let mut accounts = InitializeReturn::try_accounts( + program_id, + &mut remaining_accounts, + ix_data, + &mut __bumps, + )?; + let result = anchor_cpi_return::initialize_return(anchor_lang::context::Context::new( + program_id, + &mut accounts, + remaining_accounts, + __bumps, + ))?; + let mut buffer: Vec = Vec::new(); + result.serialize(&mut buffer)?; + anchor_lang::solana_program::program::set_return_data(&buffer.as_slice()); + accounts.exit(program_id) + } + } +} +pub mod anchor_cpi_return { + use super::*; + pub fn initialize_return(_ctx: Context) -> Result<()> { + Ok(()) + } +} +/// An Anchor generated module containing the program's set of +/// instructions, where each method handler in the `#[program]` mod is +/// associated with a struct defining the input arguments to the +/// method. These should be used directly, when one wants to serialize +/// Anchor instruction data, for example, when specifying +/// instructions on a client. +pub mod instruction { + use super::*; + /// Instruction struct definitions for `#[state]` methods. + pub mod state { + use super::*; + } + /// Instruction. + pub struct InitializeReturn; + impl borsh::ser::BorshSerialize for InitializeReturn { + fn serialize( + &self, + writer: &mut W, + ) -> ::core::result::Result<(), borsh::maybestd::io::Error> { + Ok(()) + } + } + impl borsh::de::BorshDeserialize for InitializeReturn { + fn deserialize( + buf: &mut &[u8], + ) -> ::core::result::Result { + Ok(Self {}) + } + } + impl anchor_lang::InstructionData for InitializeReturn { + fn data(&self) -> Vec { + let mut d = [238, 52, 63, 106, 176, 55, 69, 91].to_vec(); + d.append(&mut self.try_to_vec().expect("Should always serialize")); + d + } + } +} +/// An Anchor generated module, providing a set of structs +/// mirroring the structs deriving `Accounts`, where each field is +/// a `Pubkey`. This is useful for specifying accounts for a client. +pub mod accounts { + pub use crate::__client_accounts_initialize_return::*; +} +pub struct InitializeReturn {} +#[automatically_derived] +impl<'info> anchor_lang::Accounts<'info> for InitializeReturn { + #[inline(never)] + fn try_accounts( + program_id: &anchor_lang::solana_program::pubkey::Pubkey, + accounts: &mut &[anchor_lang::solana_program::account_info::AccountInfo<'info>], + ix_data: &[u8], + __bumps: &mut std::collections::BTreeMap, + ) -> anchor_lang::Result { + Ok(InitializeReturn {}) + } +} +#[automatically_derived] +impl<'info> anchor_lang::ToAccountInfos<'info> for InitializeReturn { + fn to_account_infos( + &self, + ) -> Vec> { + let mut account_infos = ::alloc::vec::Vec::new(); + account_infos + } +} +#[automatically_derived] +impl anchor_lang::ToAccountMetas for InitializeReturn { + fn to_account_metas( + &self, + is_signer: Option, + ) -> Vec { + let mut account_metas = ::alloc::vec::Vec::new(); + account_metas + } +} +#[automatically_derived] +impl<'info> anchor_lang::AccountsExit<'info> for InitializeReturn { + fn exit( + &self, + program_id: &anchor_lang::solana_program::pubkey::Pubkey, + ) -> anchor_lang::Result<()> { + Ok(()) + } +} +/// An internal, Anchor generated module. This is used (as an +/// implementation detail), to generate a struct for a given +/// `#[derive(Accounts)]` implementation, where each field is a Pubkey, +/// instead of an `AccountInfo`. This is useful for clients that want +/// to generate a list of accounts, without explicitly knowing the +/// order all the fields should be in. +/// +/// To access the struct in this module, one should use the sibling +/// `accounts` module (also generated), which re-exports this. +pub(crate) mod __client_accounts_initialize_return { + use super::*; + use anchor_lang::prelude::borsh; + /// Generated client accounts for [`InitializeReturn`]. + pub struct InitializeReturn {} + impl borsh::ser::BorshSerialize for InitializeReturn { + fn serialize( + &self, + writer: &mut W, + ) -> ::core::result::Result<(), borsh::maybestd::io::Error> { + Ok(()) + } + } + #[automatically_derived] + impl anchor_lang::ToAccountMetas for InitializeReturn { + fn to_account_metas( + &self, + is_signer: Option, + ) -> Vec { + let mut account_metas = ::alloc::vec::Vec::new(); + account_metas + } + } +} +/// An internal, Anchor generated module. This is used (as an +/// implementation detail), to generate a CPI struct for a given +/// `#[derive(Accounts)]` implementation, where each field is an +/// AccountInfo. +/// +/// To access the struct in this module, one should use the sibling +/// [`cpi::accounts`] module (also generated), which re-exports this. +pub(crate) mod __cpi_client_accounts_initialize_return { + use super::*; + /// Generated CPI struct of the accounts for [`InitializeReturn`]. + pub struct InitializeReturn {} + #[automatically_derived] + impl anchor_lang::ToAccountMetas for InitializeReturn { + fn to_account_metas( + &self, + is_signer: Option, + ) -> Vec { + let mut account_metas = ::alloc::vec::Vec::new(); + account_metas + } + } + #[automatically_derived] + impl<'info> anchor_lang::ToAccountInfos<'info> for InitializeReturn { + fn to_account_infos( + &self, + ) -> Vec> { + let mut account_infos = ::alloc::vec::Vec::new(); + account_infos + } + } +} diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs index f6ac532579..9d4b76624c 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs @@ -6,10 +6,42 @@ declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); pub mod anchor_cpi_return { use super::*; - pub fn initialize_return(ctx: Context) -> Result { + pub struct StructReturn { + pub data: u64, + } + + pub fn initialize(ctx: Context) -> Result<()> { + Ok(()) + } + + pub fn return_u64(_ctx: Context) -> Result { Ok(10) } + + /* + pub fn return_struct(ctx: Context) -> Result { + let s = StructReturn { data: 10 }; + Ok(s) + } + */ } #[derive(Accounts)] -pub struct InitializeReturn {} +pub struct Initialize<'info> { + #[account(init, payer = user, space = 8 + 8)] + pub account: Account<'info, CpiReturnAccount>, + #[account(mut)] + pub user: Signer<'info>, + pub system_program: Program<'info, System>, +} + +#[derive(Accounts)] +pub struct CpiReturn<'info> { + #[account(mut)] + pub account: Account<'info, CpiReturnAccount>, +} + +#[account] +pub struct CpiReturnAccount { + pub value: u64, +} diff --git a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts index f8b647b345..b884bdc4c3 100644 --- a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts +++ b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts @@ -1,16 +1,38 @@ import * as anchor from "@project-serum/anchor"; import { Program } from "@project-serum/anchor"; import { AnchorCpiReturn } from "../target/types/anchor_cpi_return"; +import { AnchorCpiCaller } from "../target/types/anchor_cpi_caller"; + +const { SystemProgram } = anchor.web3; describe("anchor-cpi-return", () => { // Configure the client to use the local cluster. - anchor.setProvider(anchor.Provider.env()); + const provider = anchor.Provider.env(); + anchor.setProvider(provider); - const program = anchor.workspace.AnchorCpiReturn as Program; + const callerProgram = anchor.workspace + .AnchorCpiCaller as Program; + const returnProgram = anchor.workspace + .AnchorCpiReturn as Program; it("Is initialized!", async () => { - const tx = await program.rpc.initialize({}); - console.log(program); + const cpiReturn = anchor.web3.Keypair.generate(); + await returnProgram.methods + .initialize() + .accounts({ + account: cpiReturn.publicKey, + user: provider.wallet.publicKey, + systemProgram: SystemProgram.programId, + }) + .signers([cpiReturn]) + .rpc(); + const tx = await callerProgram.methods + .cpiCallReturnU64() + .accounts({ + cpiReturn: cpiReturn.publicKey, + cpiReturnProgram: returnProgram.programId, + }) + .rpc(); console.log("Your transaction signature", tx); }); }); From ee380b2bc10f83623ada152463782afbff8807ab Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 10 Mar 2022 22:57:32 +1300 Subject: [PATCH 05/30] Add test for serialized data in logs --- .../programs/anchor-cpi-caller/src/lib.rs | 18 ++++- .../programs/anchor-cpi-return/src/lib.rs | 7 +- .../tests/anchor-cpi-return.ts | 69 ++++++++++++++++++- 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs index 74a348983c..815518d2e6 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs @@ -16,7 +16,16 @@ pub mod anchor_cpi_caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let data = anchor_cpi_return::cpi::return_u64(cpi_ctx)?; - msg!(&data.to_string()); + Ok(()) + } + + pub fn cpi_call_return_struct(ctx: Context) -> Result<()> { + let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); + let cpi_accounts = CpiReturn { + account: ctx.accounts.cpi_return.to_account_info(), + }; + let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); + let data = anchor_cpi_return::cpi::return_struct(cpi_ctx)?; Ok(()) } } @@ -27,3 +36,10 @@ pub struct CpiReturnU64<'info> { pub cpi_return: Account<'info, CpiReturnAccount>, pub cpi_return_program: Program<'info, AnchorCpiReturn>, } + +#[derive(Accounts)] +pub struct CpiReturnStruct<'info> { + #[account(mut)] + pub cpi_return: Account<'info, CpiReturnAccount>, + pub cpi_return_program: Program<'info, AnchorCpiReturn>, +} diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs index 9d4b76624c..8ceb61d9d7 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs +++ b/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs @@ -6,8 +6,9 @@ declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); pub mod anchor_cpi_return { use super::*; + #[derive(AnchorSerialize, AnchorDeserialize)] pub struct StructReturn { - pub data: u64, + pub value: u64, } pub fn initialize(ctx: Context) -> Result<()> { @@ -18,12 +19,10 @@ pub mod anchor_cpi_return { Ok(10) } - /* pub fn return_struct(ctx: Context) -> Result { - let s = StructReturn { data: 10 }; + let s = StructReturn { value: 11 }; Ok(s) } - */ } #[derive(Accounts)] diff --git a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts index b884bdc4c3..d6e4e5440b 100644 --- a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts +++ b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts @@ -1,4 +1,6 @@ +import assert from "assert"; import * as anchor from "@project-serum/anchor"; +import * as borsh from "borsh"; import { Program } from "@project-serum/anchor"; import { AnchorCpiReturn } from "../target/types/anchor_cpi_return"; import { AnchorCpiCaller } from "../target/types/anchor_cpi_caller"; @@ -15,7 +17,7 @@ describe("anchor-cpi-return", () => { const returnProgram = anchor.workspace .AnchorCpiReturn as Program; - it("Is initialized!", async () => { + it("can return u64 from a cpi call", async () => { const cpiReturn = anchor.web3.Keypair.generate(); await returnProgram.methods .initialize() @@ -33,6 +35,69 @@ describe("anchor-cpi-return", () => { cpiReturnProgram: returnProgram.programId, }) .rpc(); - console.log("Your transaction signature", tx); + + await provider.connection.confirmTransaction(tx, "confirmed"); + let t = await provider.connection.getTransaction(tx, { + commitment: "confirmed", + }); + + // "Program return: " + const prefix = "Program return: "; + let log = t.meta.logMessages.find((log) => log.startsWith(prefix)); + log = log.slice(prefix.length); + let [key, data] = log.split(" ", 2); + assert.equal(key, returnProgram.programId); + let buf = Buffer.from(data, "base64"); + const reader = new borsh.BinaryReader(buf); + assert.equal(reader.readU64().toNumber(), 10); + }); + + it("can return a struct from a cpi call", async () => { + const cpiReturn = anchor.web3.Keypair.generate(); + await returnProgram.methods + .initialize() + .accounts({ + account: cpiReturn.publicKey, + user: provider.wallet.publicKey, + systemProgram: SystemProgram.programId, + }) + .signers([cpiReturn]) + .rpc(); + const tx = await callerProgram.methods + .cpiCallReturnStruct() + .accounts({ + cpiReturn: cpiReturn.publicKey, + cpiReturnProgram: returnProgram.programId, + }) + .rpc(); + + await provider.connection.confirmTransaction(tx, "confirmed"); + let t = await provider.connection.getTransaction(tx, { + commitment: "confirmed", + }); + + // "Program return: " + const prefix = "Program return: "; + let log = t.meta.logMessages.find((log) => log.startsWith(prefix)); + log = log.slice(prefix.length); + let [key, data] = log.split(" ", 2); + assert.equal(key, returnProgram.programId); + let buf = Buffer.from(data, "base64"); + + class Assignable { + constructor(properties) { + Object.keys(properties).map((key) => { + this[key] = properties[key]; + }); + } + } + class Data extends Assignable {} + + const schema = new Map([ + [Data, { kind: "struct", fields: [["value", "u64"]] }], + ]); + const deserialized = borsh.deserialize(schema, Data, buf); + + assert(deserialized.value.toNumber() === 11); }); }); From 7b50f25247ee7f205c1b7f0008cf22b2fb3256df Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 08:45:48 +1300 Subject: [PATCH 06/30] Remove debug file --- .../programs/anchor-cpi-return/out.rs | 521 ------------------ 1 file changed, 521 deletions(-) delete mode 100644 tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs b/tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs deleted file mode 100644 index 0f1ec1174e..0000000000 --- a/tests/anchor-cpi-return/programs/anchor-cpi-return/out.rs +++ /dev/null @@ -1,521 +0,0 @@ -#![feature(prelude_import)] -#![feature(trace_macros)] -#[prelude_import] -use std::prelude::rust_2018::*; -#[macro_use] -extern crate std; -use anchor_lang::prelude::*; -/// The static program ID -pub static ID: anchor_lang::solana_program::pubkey::Pubkey = - anchor_lang::solana_program::pubkey::Pubkey::new_from_array([ - 218u8, 7u8, 92u8, 178u8, 255u8, 94u8, 198u8, 129u8, 118u8, 19u8, 222u8, 83u8, 11u8, 105u8, - 42u8, 135u8, 53u8, 71u8, 119u8, 105u8, 218u8, 71u8, 67u8, 12u8, 189u8, 129u8, 84u8, 51u8, - 92u8, 74u8, 131u8, 39u8, - ]); -/// Confirms that a given pubkey is equivalent to the program ID -pub fn check_id(id: &anchor_lang::solana_program::pubkey::Pubkey) -> bool { - id == &ID -} -/// Returns the program ID -pub fn id() -> anchor_lang::solana_program::pubkey::Pubkey { - ID -} -use self::anchor_cpi_return::*; -/// # Safety -#[no_mangle] -pub unsafe extern "C" fn entrypoint(input: *mut u8) -> u64 { - let (program_id, accounts, instruction_data) = - unsafe { ::solana_program::entrypoint::deserialize(input) }; - match entry(&program_id, &accounts, &instruction_data) { - Ok(()) => ::solana_program::entrypoint::SUCCESS, - Err(error) => error.into(), - } -} -/// The Anchor codegen exposes a programming model where a user defines -/// a set of methods inside of a `#[program]` module in a way similar -/// to writing RPC request handlers. The macro then generates a bunch of -/// code wrapping these user defined methods into something that can be -/// executed on Solana. -/// -/// These methods fall into one of three categories, each of which -/// can be considered a different "namespace" of the program. -/// -/// 1) Global methods - regular methods inside of the `#[program]`. -/// 2) State methods - associated methods inside a `#[state]` struct. -/// 3) Interface methods - methods inside a strait struct's -/// implementation of an `#[interface]` trait. -/// -/// Care must be taken by the codegen to prevent collisions between -/// methods in these different namespaces. For this reason, Anchor uses -/// a variant of sighash to perform method dispatch, rather than -/// something like a simple enum variant discriminator. -/// -/// The execution flow of the generated code can be roughly outlined: -/// -/// * Start program via the entrypoint. -/// * Strip method identifier off the first 8 bytes of the instruction -/// data and invoke the identified method. The method identifier -/// is a variant of sighash. See docs.rs for `anchor_lang` for details. -/// * If the method identifier is an IDL identifier, execute the IDL -/// instructions, which are a special set of hardcoded instructions -/// baked into every Anchor program. Then exit. -/// * Otherwise, the method identifier is for a user defined -/// instruction, i.e., one of the methods in the user defined -/// `#[program]` module. Perform method dispatch, i.e., execute the -/// big match statement mapping method identifier to method handler -/// wrapper. -/// * Run the method handler wrapper. This wraps the code the user -/// actually wrote, deserializing the accounts, constructing the -/// context, invoking the user's code, and finally running the exit -/// routine, which typically persists account changes. -/// -/// The `entry` function here, defines the standard entry to a Solana -/// program, where execution begins. -pub fn entry( - program_id: &Pubkey, - accounts: &[AccountInfo], - data: &[u8], -) -> anchor_lang::solana_program::entrypoint::ProgramResult { - try_entry(program_id, accounts, data).map_err(|e| { - e.log(); - e.into() - }) -} -fn try_entry( - program_id: &Pubkey, - accounts: &[AccountInfo], - data: &[u8], -) -> anchor_lang::Result<()> { - if *program_id != ID { - return Err(anchor_lang::error::ErrorCode::DeclaredProgramIdMismatch.into()); - } - if data.len() < 8 { - return Err(anchor_lang::error::ErrorCode::InstructionMissing.into()); - } - dispatch(program_id, accounts, data) -} -/// Module representing the program. -pub mod program { - use super::*; - /// Type representing the program. - pub struct AnchorCpiReturn; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::core::clone::Clone for AnchorCpiReturn { - #[inline] - fn clone(&self) -> AnchorCpiReturn { - match *self { - AnchorCpiReturn => AnchorCpiReturn, - } - } - } - impl anchor_lang::Id for AnchorCpiReturn { - fn id() -> Pubkey { - ID - } - } -} -/// Performs method dispatch. -/// -/// Each method in an anchor program is uniquely defined by a namespace -/// and a rust identifier (i.e., the name given to the method). These -/// two pieces can be combined to creater a method identifier, -/// specifically, Anchor uses -/// -/// Sha256("::")[..8], -/// -/// where the namespace can be one of three types. 1) "global" for a -/// regular instruction, 2) "state" for a state struct instruction -/// handler and 3) a trait namespace (used in combination with the -/// `#[interface]` attribute), which is defined by the trait name, e.. -/// `MyTrait`. -/// -/// With this 8 byte identifier, Anchor performs method dispatch, -/// matching the given 8 byte identifier to the associated method -/// handler, which leads to user defined code being eventually invoked. -fn dispatch(program_id: &Pubkey, accounts: &[AccountInfo], data: &[u8]) -> anchor_lang::Result<()> { - let mut ix_data: &[u8] = data; - let sighash: [u8; 8] = { - let mut sighash: [u8; 8] = [0; 8]; - sighash.copy_from_slice(&ix_data[..8]); - ix_data = &ix_data[8..]; - sighash - }; - if true { - if sighash == anchor_lang::idl::IDL_IX_TAG.to_le_bytes() { - return __private::__idl::__idl_dispatch(program_id, accounts, &ix_data); - } - } - match sighash { - [238, 52, 63, 106, 176, 55, 69, 91] => { - __private::__global::initialize_return(program_id, accounts, ix_data) - } - _ => Err(anchor_lang::error::ErrorCode::InstructionFallbackNotFound.into()), - } -} -/// Create a private module to not clutter the program's namespace. -/// Defines an entrypoint for each individual instruction handler -/// wrapper. -mod __private { - use super::*; - /// __idl mod defines handlers for injected Anchor IDL instructions. - pub mod __idl { - use super::*; - #[inline(never)] - #[cfg(not(feature = "no-idl"))] - pub fn __idl_dispatch( - program_id: &Pubkey, - accounts: &[AccountInfo], - idl_ix_data: &[u8], - ) -> anchor_lang::Result<()> { - let mut accounts = accounts; - let mut data: &[u8] = idl_ix_data; - let ix = anchor_lang::idl::IdlInstruction::deserialize(&mut data) - .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)?; - match ix { - anchor_lang::idl::IdlInstruction::Create { data_len } => { - let mut bumps = std::collections::BTreeMap::new(); - let mut accounts = anchor_lang::idl::IdlCreateAccounts::try_accounts( - program_id, - &mut accounts, - &[], - &mut bumps, - )?; - __idl_create_account(program_id, &mut accounts, data_len)?; - accounts.exit(program_id)?; - } - anchor_lang::idl::IdlInstruction::CreateBuffer => { - let mut bumps = std::collections::BTreeMap::new(); - let mut accounts = anchor_lang::idl::IdlCreateBuffer::try_accounts( - program_id, - &mut accounts, - &[], - &mut bumps, - )?; - __idl_create_buffer(program_id, &mut accounts)?; - accounts.exit(program_id)?; - } - anchor_lang::idl::IdlInstruction::Write { data } => { - let mut bumps = std::collections::BTreeMap::new(); - let mut accounts = anchor_lang::idl::IdlAccounts::try_accounts( - program_id, - &mut accounts, - &[], - &mut bumps, - )?; - __idl_write(program_id, &mut accounts, data)?; - accounts.exit(program_id)?; - } - anchor_lang::idl::IdlInstruction::SetAuthority { new_authority } => { - let mut bumps = std::collections::BTreeMap::new(); - let mut accounts = anchor_lang::idl::IdlAccounts::try_accounts( - program_id, - &mut accounts, - &[], - &mut bumps, - )?; - __idl_set_authority(program_id, &mut accounts, new_authority)?; - accounts.exit(program_id)?; - } - anchor_lang::idl::IdlInstruction::SetBuffer => { - let mut bumps = std::collections::BTreeMap::new(); - let mut accounts = anchor_lang::idl::IdlSetBuffer::try_accounts( - program_id, - &mut accounts, - &[], - &mut bumps, - )?; - __idl_set_buffer(program_id, &mut accounts)?; - accounts.exit(program_id)?; - } - } - Ok(()) - } - #[inline(never)] - pub fn __idl_create_account( - program_id: &Pubkey, - accounts: &mut anchor_lang::idl::IdlCreateAccounts, - data_len: u64, - ) -> anchor_lang::Result<()> { - ::solana_program::log::sol_log("Instruction: IdlCreateAccount"); - if program_id != accounts.program.key { - return Err(anchor_lang::error::ErrorCode::IdlInstructionInvalidProgram.into()); - } - let from = accounts.from.key; - let (base, nonce) = Pubkey::find_program_address(&[], program_id); - let seed = anchor_lang::idl::IdlAccount::seed(); - let owner = accounts.program.key; - let to = Pubkey::create_with_seed(&base, seed, owner).unwrap(); - let space = 8 + 32 + 4 + data_len as usize; - let rent = Rent::get()?; - let lamports = rent.minimum_balance(space); - let seeds = &[&[nonce][..]]; - let ix = anchor_lang::solana_program::system_instruction::create_account_with_seed( - from, - &to, - &base, - seed, - lamports, - space as u64, - owner, - ); - anchor_lang::solana_program::program::invoke_signed( - &ix, - &[ - accounts.from.clone(), - accounts.to.clone(), - accounts.base.clone(), - accounts.system_program.clone(), - ], - &[seeds], - )?; - let mut idl_account = { - let mut account_data = accounts.to.try_borrow_data()?; - let mut account_data_slice: &[u8] = &account_data; - anchor_lang::idl::IdlAccount::try_deserialize_unchecked(&mut account_data_slice)? - }; - idl_account.authority = *accounts.from.key; - let mut data = accounts.to.try_borrow_mut_data()?; - let dst: &mut [u8] = &mut data; - let mut cursor = std::io::Cursor::new(dst); - idl_account.try_serialize(&mut cursor)?; - Ok(()) - } - #[inline(never)] - pub fn __idl_create_buffer( - program_id: &Pubkey, - accounts: &mut anchor_lang::idl::IdlCreateBuffer, - ) -> anchor_lang::Result<()> { - ::solana_program::log::sol_log("Instruction: IdlCreateBuffer"); - let mut buffer = &mut accounts.buffer; - buffer.authority = *accounts.authority.key; - Ok(()) - } - #[inline(never)] - pub fn __idl_write( - program_id: &Pubkey, - accounts: &mut anchor_lang::idl::IdlAccounts, - idl_data: Vec, - ) -> anchor_lang::Result<()> { - ::solana_program::log::sol_log("Instruction: IdlWrite"); - let mut idl = &mut accounts.idl; - idl.data.extend(idl_data); - Ok(()) - } - #[inline(never)] - pub fn __idl_set_authority( - program_id: &Pubkey, - accounts: &mut anchor_lang::idl::IdlAccounts, - new_authority: Pubkey, - ) -> anchor_lang::Result<()> { - ::solana_program::log::sol_log("Instruction: IdlSetAuthority"); - accounts.idl.authority = new_authority; - Ok(()) - } - #[inline(never)] - pub fn __idl_set_buffer( - program_id: &Pubkey, - accounts: &mut anchor_lang::idl::IdlSetBuffer, - ) -> anchor_lang::Result<()> { - ::solana_program::log::sol_log("Instruction: IdlSetBuffer"); - accounts.idl.data = accounts.buffer.data.clone(); - Ok(()) - } - } - /// __state mod defines wrapped handlers for state instructions. - pub mod __state { - use super::*; - } - /// __interface mod defines wrapped handlers for `#[interface]` trait - /// implementations. - pub mod __interface { - use super::*; - } - /// __global mod defines wrapped handlers for global instructions. - pub mod __global { - use super::*; - #[inline(never)] - pub fn initialize_return( - program_id: &Pubkey, - accounts: &[AccountInfo], - ix_data: &[u8], - ) -> anchor_lang::Result<()> { - ::solana_program::log::sol_log("Instruction: InitializeReturn"); - let ix = instruction::InitializeReturn::deserialize(&mut &ix_data[..]) - .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotDeserialize)?; - let instruction::InitializeReturn = ix; - let mut __bumps = std::collections::BTreeMap::new(); - let mut remaining_accounts: &[AccountInfo] = accounts; - let mut accounts = InitializeReturn::try_accounts( - program_id, - &mut remaining_accounts, - ix_data, - &mut __bumps, - )?; - let result = anchor_cpi_return::initialize_return(anchor_lang::context::Context::new( - program_id, - &mut accounts, - remaining_accounts, - __bumps, - ))?; - let mut buffer: Vec = Vec::new(); - result.serialize(&mut buffer)?; - anchor_lang::solana_program::program::set_return_data(&buffer.as_slice()); - accounts.exit(program_id) - } - } -} -pub mod anchor_cpi_return { - use super::*; - pub fn initialize_return(_ctx: Context) -> Result<()> { - Ok(()) - } -} -/// An Anchor generated module containing the program's set of -/// instructions, where each method handler in the `#[program]` mod is -/// associated with a struct defining the input arguments to the -/// method. These should be used directly, when one wants to serialize -/// Anchor instruction data, for example, when specifying -/// instructions on a client. -pub mod instruction { - use super::*; - /// Instruction struct definitions for `#[state]` methods. - pub mod state { - use super::*; - } - /// Instruction. - pub struct InitializeReturn; - impl borsh::ser::BorshSerialize for InitializeReturn { - fn serialize( - &self, - writer: &mut W, - ) -> ::core::result::Result<(), borsh::maybestd::io::Error> { - Ok(()) - } - } - impl borsh::de::BorshDeserialize for InitializeReturn { - fn deserialize( - buf: &mut &[u8], - ) -> ::core::result::Result { - Ok(Self {}) - } - } - impl anchor_lang::InstructionData for InitializeReturn { - fn data(&self) -> Vec { - let mut d = [238, 52, 63, 106, 176, 55, 69, 91].to_vec(); - d.append(&mut self.try_to_vec().expect("Should always serialize")); - d - } - } -} -/// An Anchor generated module, providing a set of structs -/// mirroring the structs deriving `Accounts`, where each field is -/// a `Pubkey`. This is useful for specifying accounts for a client. -pub mod accounts { - pub use crate::__client_accounts_initialize_return::*; -} -pub struct InitializeReturn {} -#[automatically_derived] -impl<'info> anchor_lang::Accounts<'info> for InitializeReturn { - #[inline(never)] - fn try_accounts( - program_id: &anchor_lang::solana_program::pubkey::Pubkey, - accounts: &mut &[anchor_lang::solana_program::account_info::AccountInfo<'info>], - ix_data: &[u8], - __bumps: &mut std::collections::BTreeMap, - ) -> anchor_lang::Result { - Ok(InitializeReturn {}) - } -} -#[automatically_derived] -impl<'info> anchor_lang::ToAccountInfos<'info> for InitializeReturn { - fn to_account_infos( - &self, - ) -> Vec> { - let mut account_infos = ::alloc::vec::Vec::new(); - account_infos - } -} -#[automatically_derived] -impl anchor_lang::ToAccountMetas for InitializeReturn { - fn to_account_metas( - &self, - is_signer: Option, - ) -> Vec { - let mut account_metas = ::alloc::vec::Vec::new(); - account_metas - } -} -#[automatically_derived] -impl<'info> anchor_lang::AccountsExit<'info> for InitializeReturn { - fn exit( - &self, - program_id: &anchor_lang::solana_program::pubkey::Pubkey, - ) -> anchor_lang::Result<()> { - Ok(()) - } -} -/// An internal, Anchor generated module. This is used (as an -/// implementation detail), to generate a struct for a given -/// `#[derive(Accounts)]` implementation, where each field is a Pubkey, -/// instead of an `AccountInfo`. This is useful for clients that want -/// to generate a list of accounts, without explicitly knowing the -/// order all the fields should be in. -/// -/// To access the struct in this module, one should use the sibling -/// `accounts` module (also generated), which re-exports this. -pub(crate) mod __client_accounts_initialize_return { - use super::*; - use anchor_lang::prelude::borsh; - /// Generated client accounts for [`InitializeReturn`]. - pub struct InitializeReturn {} - impl borsh::ser::BorshSerialize for InitializeReturn { - fn serialize( - &self, - writer: &mut W, - ) -> ::core::result::Result<(), borsh::maybestd::io::Error> { - Ok(()) - } - } - #[automatically_derived] - impl anchor_lang::ToAccountMetas for InitializeReturn { - fn to_account_metas( - &self, - is_signer: Option, - ) -> Vec { - let mut account_metas = ::alloc::vec::Vec::new(); - account_metas - } - } -} -/// An internal, Anchor generated module. This is used (as an -/// implementation detail), to generate a CPI struct for a given -/// `#[derive(Accounts)]` implementation, where each field is an -/// AccountInfo. -/// -/// To access the struct in this module, one should use the sibling -/// [`cpi::accounts`] module (also generated), which re-exports this. -pub(crate) mod __cpi_client_accounts_initialize_return { - use super::*; - /// Generated CPI struct of the accounts for [`InitializeReturn`]. - pub struct InitializeReturn {} - #[automatically_derived] - impl anchor_lang::ToAccountMetas for InitializeReturn { - fn to_account_metas( - &self, - is_signer: Option, - ) -> Vec { - let mut account_metas = ::alloc::vec::Vec::new(); - account_metas - } - } - #[automatically_derived] - impl<'info> anchor_lang::ToAccountInfos<'info> for InitializeReturn { - fn to_account_infos( - &self, - ) -> Vec> { - let mut account_infos = ::alloc::vec::Vec::new(); - account_infos - } - } -} From 194308c33f7693a1f77d1a6c509195e0e1bafa44 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 08:46:14 +1300 Subject: [PATCH 07/30] Add tests to validate received data --- .../programs/anchor-cpi-caller/Cargo.toml | 1 + .../programs/anchor-cpi-caller/src/lib.rs | 10 ++++- .../tests/anchor-cpi-return.ts | 44 ++++++++++++------- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml b/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml index bbea7ddac4..f58009d0de 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml @@ -18,3 +18,4 @@ default = [] [dependencies] anchor-lang = { path = "../../../../lang", features = ["init-if-needed"] } anchor-cpi-return = { path = "../anchor-cpi-return", features = ["cpi"] } +base64 = "0.13.0" diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs index 815518d2e6..59505c1884 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs +++ b/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs @@ -15,7 +15,10 @@ pub mod anchor_cpi_caller { account: ctx.accounts.cpi_return.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); - let data = anchor_cpi_return::cpi::return_u64(cpi_ctx)?; + let result = anchor_cpi_return::cpi::return_u64(cpi_ctx)?; + let mut buffer: Vec = Vec::new(); + result.serialize(&mut buffer)?; + msg!(&base64::encode(buffer)); Ok(()) } @@ -25,7 +28,10 @@ pub mod anchor_cpi_caller { account: ctx.accounts.cpi_return.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); - let data = anchor_cpi_return::cpi::return_struct(cpi_ctx)?; + let result = anchor_cpi_return::cpi::return_struct(cpi_ctx)?; + let mut buffer: Vec = Vec::new(); + result.serialize(&mut buffer)?; + msg!(&base64::encode(buffer)); Ok(()) } } diff --git a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts index d6e4e5440b..89048ff4c2 100644 --- a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts +++ b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts @@ -17,6 +17,17 @@ describe("anchor-cpi-return", () => { const returnProgram = anchor.workspace .AnchorCpiReturn as Program; + const getReturnLog = (confirmedTransaction) => { + const prefix = "Program return: "; + let log = confirmedTransaction.meta.logMessages.find((log) => + log.startsWith(prefix) + ); + log = log.slice(prefix.length); + const [key, data] = log.split(" ", 2); + const buffer = Buffer.from(data, "base64"); + return [key, data, buffer]; + }; + it("can return u64 from a cpi call", async () => { const cpiReturn = anchor.web3.Keypair.generate(); await returnProgram.methods @@ -41,14 +52,17 @@ describe("anchor-cpi-return", () => { commitment: "confirmed", }); - // "Program return: " - const prefix = "Program return: "; - let log = t.meta.logMessages.find((log) => log.startsWith(prefix)); - log = log.slice(prefix.length); - let [key, data] = log.split(" ", 2); + const [key, data, buffer] = getReturnLog(t); assert.equal(key, returnProgram.programId); + + // Check for matching log on receive side + let receiveLog = t.meta.logMessages.find( + (log) => log == `Program log: ${data}` + ); + assert(receiveLog !== undefined); + let buf = Buffer.from(data, "base64"); - const reader = new borsh.BinaryReader(buf); + const reader = new borsh.BinaryReader(buffer); assert.equal(reader.readU64().toNumber(), 10); }); @@ -76,14 +90,16 @@ describe("anchor-cpi-return", () => { commitment: "confirmed", }); - // "Program return: " - const prefix = "Program return: "; - let log = t.meta.logMessages.find((log) => log.startsWith(prefix)); - log = log.slice(prefix.length); - let [key, data] = log.split(" ", 2); + const [key, data, buffer] = getReturnLog(t); assert.equal(key, returnProgram.programId); - let buf = Buffer.from(data, "base64"); + // Check for matching log on receive side + let receiveLog = t.meta.logMessages.find( + (log) => log == `Program log: ${data}` + ); + assert(receiveLog !== undefined); + + // Deserialize the struct and validate class Assignable { constructor(properties) { Object.keys(properties).map((key) => { @@ -92,12 +108,10 @@ describe("anchor-cpi-return", () => { } } class Data extends Assignable {} - const schema = new Map([ [Data, { kind: "struct", fields: [["value", "u64"]] }], ]); - const deserialized = borsh.deserialize(schema, Data, buf); - + const deserialized = borsh.deserialize(schema, Data, buffer); assert(deserialized.value.toNumber() === 11); }); }); From 177b9adf5dfaff0b08546bc6b32330f0f6824412 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 14:04:46 +1300 Subject: [PATCH 08/30] Cleanup --- lang/syn/src/codegen/program/cpi.rs | 18 +++++--- lang/syn/src/codegen/program/handlers.rs | 17 +++++--- .../tests/anchor-cpi-return.ts | 41 +++++++++++-------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index 648978090d..fdce16e45b 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -70,8 +70,15 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, name); let sighash_tts: proc_macro2::TokenStream = format!("{:?}", sighash_arr).parse().unwrap(); - // TODO Cfg if cpi-return else () let ret_type = &ix.returns.return_type.to_token_stream(); + let result_handler = match ret_type.to_string().as_str() { + "()" => quote! { Ok(()) }, + _ => quote! { + let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); + let data = <#ret_type>::try_from_slice(&data)?; + Ok(data) + } + }; quote! { pub fn #method_name<'a, 'b, 'c, 'info>( ctx: anchor_lang::context::CpiContext<'a, 'b, 'c, 'info, #accounts_ident<'info>>, @@ -95,10 +102,11 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { &ix, &acc_infos, ctx.signer_seeds, - ); - let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); - let data = <#ret_type>::try_from_slice(&data)?; - Ok(data) + ).map_or_else( + |e| Err(Into::into(e)), + // Maybe handle Solana return data. + |_| { #result_handler } + ) } } }; diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 408ecb17fc..662327eac6 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -1,7 +1,7 @@ use crate::codegen::program::common::*; use crate::{Program, State}; use heck::CamelCase; -use quote::quote; +use quote::{quote, ToTokens}; // Generate non-inlined wrappers for each instruction handler, since Solana's // BPF max stack size can't handle reasonable sized dispatch trees without doing @@ -694,6 +694,15 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let anchor = &ix.anchor_ident; let variant_arm = generate_ix_variant(ix.raw_method.sig.ident.to_string(), &ix.args); let ix_name_log = format!("Instruction: {}", ix_name); + let ret_type = &ix.returns.return_type.to_token_stream(); + let result_handler = match ret_type.to_string().as_str() { + "()" => quote! {}, + _ => quote! { + let mut buffer: Vec = Vec::new(); + result.serialize(&mut buffer)?; + anchor_lang::solana_program::program::set_return_data(&buffer.as_slice()); + }, + }; quote! { #[inline(never)] pub fn #ix_method_name( @@ -732,10 +741,8 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { #(#ix_arg_names),* )?; - // Set return data. - let mut buffer: Vec = Vec::new(); - result.serialize(&mut buffer)?; - anchor_lang::solana_program::program::set_return_data(&buffer.as_slice()); + // Maybe set Solana return data. + #result_handler // Exit routine. accounts.exit(program_id) diff --git a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts index 89048ff4c2..a1af2ddfd1 100644 --- a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts +++ b/tests/anchor-cpi-return/tests/anchor-cpi-return.ts @@ -28,8 +28,11 @@ describe("anchor-cpi-return", () => { return [key, data, buffer]; }; - it("can return u64 from a cpi call", async () => { - const cpiReturn = anchor.web3.Keypair.generate(); + const cpiReturn = anchor.web3.Keypair.generate(); + + const confirmOptions = { commitment: "confirmed" }; + + it("can initialize", async () => { await returnProgram.methods .initialize() .accounts({ @@ -39,15 +42,16 @@ describe("anchor-cpi-return", () => { }) .signers([cpiReturn]) .rpc(); + }); + + it("can return u64 from a cpi", async () => { const tx = await callerProgram.methods .cpiCallReturnU64() .accounts({ cpiReturn: cpiReturn.publicKey, cpiReturnProgram: returnProgram.programId, }) - .rpc(); - - await provider.connection.confirmTransaction(tx, "confirmed"); + .rpc(confirmOptions); let t = await provider.connection.getTransaction(tx, { commitment: "confirmed", }); @@ -61,31 +65,34 @@ describe("anchor-cpi-return", () => { ); assert(receiveLog !== undefined); - let buf = Buffer.from(data, "base64"); const reader = new borsh.BinaryReader(buffer); assert.equal(reader.readU64().toNumber(), 10); }); - it("can return a struct from a cpi call", async () => { - const cpiReturn = anchor.web3.Keypair.generate(); - await returnProgram.methods - .initialize() + it("can make a non-cpi call to a function that returns a u64", async () => { + const tx = await returnProgram.methods + .returnU64() .accounts({ account: cpiReturn.publicKey, - user: provider.wallet.publicKey, - systemProgram: SystemProgram.programId, }) - .signers([cpiReturn]) - .rpc(); + .rpc(confirmOptions); + let t = await provider.connection.getTransaction(tx, { + commitment: "confirmed", + }); + const [key, , buffer] = getReturnLog(t); + assert.equal(key, returnProgram.programId); + const reader = new borsh.BinaryReader(buffer); + assert.equal(reader.readU64().toNumber(), 10); + }); + + it("can return a struct from a cpi", async () => { const tx = await callerProgram.methods .cpiCallReturnStruct() .accounts({ cpiReturn: cpiReturn.publicKey, cpiReturnProgram: returnProgram.programId, }) - .rpc(); - - await provider.connection.confirmTransaction(tx, "confirmed"); + .rpc(confirmOptions); let t = await provider.connection.getTransaction(tx, { commitment: "confirmed", }); From 9c85dd65d379ba661ce1e0a14eb5333cb5aa3f91 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 14:10:07 +1300 Subject: [PATCH 09/30] Rename test and programs --- .../.gitignore | 0 .../Anchor.toml | 4 ++-- .../Cargo.toml | 0 .../migrations/deploy.ts | 0 .../package.json | 0 .../programs/callee}/Cargo.toml | 4 ++-- .../programs/callee}/Xargo.toml | 0 .../programs/callee}/src/lib.rs | 2 +- .../programs/caller}/Cargo.toml | 6 +++--- .../programs/caller}/Xargo.toml | 0 .../programs/caller}/src/lib.rs | 16 ++++++++-------- .../tests/cpi-return.ts} | 12 +++++------- .../tsconfig.json | 0 .../{anchor-cpi-return => cpi-returns}/yarn.lock | 0 14 files changed, 21 insertions(+), 23 deletions(-) rename tests/{anchor-cpi-return => cpi-returns}/.gitignore (100%) rename tests/{anchor-cpi-return => cpi-returns}/Anchor.toml (65%) rename tests/{anchor-cpi-return => cpi-returns}/Cargo.toml (100%) rename tests/{anchor-cpi-return => cpi-returns}/migrations/deploy.ts (100%) rename tests/{anchor-cpi-return => cpi-returns}/package.json (100%) rename tests/{anchor-cpi-return/programs/anchor-cpi-return => cpi-returns/programs/callee}/Cargo.toml (85%) rename tests/{anchor-cpi-return/programs/anchor-cpi-caller => cpi-returns/programs/callee}/Xargo.toml (100%) rename tests/{anchor-cpi-return/programs/anchor-cpi-return => cpi-returns/programs/callee}/src/lib.rs (97%) rename tests/{anchor-cpi-return/programs/anchor-cpi-caller => cpi-returns/programs/caller}/Cargo.toml (71%) rename tests/{anchor-cpi-return/programs/anchor-cpi-return => cpi-returns/programs/caller}/Xargo.toml (100%) rename tests/{anchor-cpi-return/programs/anchor-cpi-caller => cpi-returns/programs/caller}/src/lib.rs (75%) rename tests/{anchor-cpi-return/tests/anchor-cpi-return.ts => cpi-returns/tests/cpi-return.ts} (90%) rename tests/{anchor-cpi-return => cpi-returns}/tsconfig.json (100%) rename tests/{anchor-cpi-return => cpi-returns}/yarn.lock (100%) diff --git a/tests/anchor-cpi-return/.gitignore b/tests/cpi-returns/.gitignore similarity index 100% rename from tests/anchor-cpi-return/.gitignore rename to tests/cpi-returns/.gitignore diff --git a/tests/anchor-cpi-return/Anchor.toml b/tests/cpi-returns/Anchor.toml similarity index 65% rename from tests/anchor-cpi-return/Anchor.toml rename to tests/cpi-returns/Anchor.toml index 0898576250..90e3fdc134 100644 --- a/tests/anchor-cpi-return/Anchor.toml +++ b/tests/cpi-returns/Anchor.toml @@ -2,8 +2,8 @@ seeds = false [programs.localnet] -anchor_cpi_return = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS" -anchor_cpi_caller = "HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L" +callee = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS" +caller = "HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L" [registry] url = "https://anchor.projectserum.com" diff --git a/tests/anchor-cpi-return/Cargo.toml b/tests/cpi-returns/Cargo.toml similarity index 100% rename from tests/anchor-cpi-return/Cargo.toml rename to tests/cpi-returns/Cargo.toml diff --git a/tests/anchor-cpi-return/migrations/deploy.ts b/tests/cpi-returns/migrations/deploy.ts similarity index 100% rename from tests/anchor-cpi-return/migrations/deploy.ts rename to tests/cpi-returns/migrations/deploy.ts diff --git a/tests/anchor-cpi-return/package.json b/tests/cpi-returns/package.json similarity index 100% rename from tests/anchor-cpi-return/package.json rename to tests/cpi-returns/package.json diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml b/tests/cpi-returns/programs/callee/Cargo.toml similarity index 85% rename from tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml rename to tests/cpi-returns/programs/callee/Cargo.toml index 795fa697f2..c964a4aa4d 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-return/Cargo.toml +++ b/tests/cpi-returns/programs/callee/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "anchor-cpi-return" +name = "callee" version = "0.1.0" description = "Created with Anchor" edition = "2018" [lib] crate-type = ["cdylib", "lib"] -name = "anchor_cpi_return" +name = "callee" [features] no-entrypoint = [] diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Xargo.toml b/tests/cpi-returns/programs/callee/Xargo.toml similarity index 100% rename from tests/anchor-cpi-return/programs/anchor-cpi-caller/Xargo.toml rename to tests/cpi-returns/programs/callee/Xargo.toml diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs b/tests/cpi-returns/programs/callee/src/lib.rs similarity index 97% rename from tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs rename to tests/cpi-returns/programs/callee/src/lib.rs index 8ceb61d9d7..c6b1571434 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-return/src/lib.rs +++ b/tests/cpi-returns/programs/callee/src/lib.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); #[program] -pub mod anchor_cpi_return { +pub mod callee { use super::*; #[derive(AnchorSerialize, AnchorDeserialize)] diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml b/tests/cpi-returns/programs/caller/Cargo.toml similarity index 71% rename from tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml rename to tests/cpi-returns/programs/caller/Cargo.toml index f58009d0de..d322c0b53b 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-caller/Cargo.toml +++ b/tests/cpi-returns/programs/caller/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "anchor-cpi-caller" +name = "caller" version = "0.1.0" description = "Created with Anchor" edition = "2018" [lib] crate-type = ["cdylib", "lib"] -name = "anchor_cpi_caller" +name = "caller" [features] no-entrypoint = [] @@ -17,5 +17,5 @@ default = [] [dependencies] anchor-lang = { path = "../../../../lang", features = ["init-if-needed"] } -anchor-cpi-return = { path = "../anchor-cpi-return", features = ["cpi"] } +callee = { path = "../callee", features = ["cpi"] } base64 = "0.13.0" diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-return/Xargo.toml b/tests/cpi-returns/programs/caller/Xargo.toml similarity index 100% rename from tests/anchor-cpi-return/programs/anchor-cpi-return/Xargo.toml rename to tests/cpi-returns/programs/caller/Xargo.toml diff --git a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs b/tests/cpi-returns/programs/caller/src/lib.rs similarity index 75% rename from tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs rename to tests/cpi-returns/programs/caller/src/lib.rs index 59505c1884..98305da469 100644 --- a/tests/anchor-cpi-return/programs/anchor-cpi-caller/src/lib.rs +++ b/tests/cpi-returns/programs/caller/src/lib.rs @@ -1,12 +1,12 @@ -use anchor_cpi_return::cpi::accounts::CpiReturn; -use anchor_cpi_return::program::AnchorCpiReturn; -use anchor_cpi_return::{self, CpiReturnAccount}; use anchor_lang::prelude::*; +use callee::cpi::accounts::CpiReturn; +use callee::program::Callee; +use callee::{self, CpiReturnAccount}; declare_id!("HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L"); #[program] -pub mod anchor_cpi_caller { +pub mod caller { use super::*; pub fn cpi_call_return_u64(ctx: Context) -> Result<()> { @@ -15,7 +15,7 @@ pub mod anchor_cpi_caller { account: ctx.accounts.cpi_return.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); - let result = anchor_cpi_return::cpi::return_u64(cpi_ctx)?; + let result = callee::cpi::return_u64(cpi_ctx)?; let mut buffer: Vec = Vec::new(); result.serialize(&mut buffer)?; msg!(&base64::encode(buffer)); @@ -28,7 +28,7 @@ pub mod anchor_cpi_caller { account: ctx.accounts.cpi_return.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); - let result = anchor_cpi_return::cpi::return_struct(cpi_ctx)?; + let result = callee::cpi::return_struct(cpi_ctx)?; let mut buffer: Vec = Vec::new(); result.serialize(&mut buffer)?; msg!(&base64::encode(buffer)); @@ -40,12 +40,12 @@ pub mod anchor_cpi_caller { pub struct CpiReturnU64<'info> { #[account(mut)] pub cpi_return: Account<'info, CpiReturnAccount>, - pub cpi_return_program: Program<'info, AnchorCpiReturn>, + pub cpi_return_program: Program<'info, Callee>, } #[derive(Accounts)] pub struct CpiReturnStruct<'info> { #[account(mut)] pub cpi_return: Account<'info, CpiReturnAccount>, - pub cpi_return_program: Program<'info, AnchorCpiReturn>, + pub cpi_return_program: Program<'info, Callee>, } diff --git a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts b/tests/cpi-returns/tests/cpi-return.ts similarity index 90% rename from tests/anchor-cpi-return/tests/anchor-cpi-return.ts rename to tests/cpi-returns/tests/cpi-return.ts index a1af2ddfd1..b00e044305 100644 --- a/tests/anchor-cpi-return/tests/anchor-cpi-return.ts +++ b/tests/cpi-returns/tests/cpi-return.ts @@ -2,20 +2,18 @@ import assert from "assert"; import * as anchor from "@project-serum/anchor"; import * as borsh from "borsh"; import { Program } from "@project-serum/anchor"; -import { AnchorCpiReturn } from "../target/types/anchor_cpi_return"; -import { AnchorCpiCaller } from "../target/types/anchor_cpi_caller"; +import { Callee } from "../target/types/callee"; +import { Caller } from "../target/types/caller"; const { SystemProgram } = anchor.web3; -describe("anchor-cpi-return", () => { +describe("CPI return", () => { // Configure the client to use the local cluster. const provider = anchor.Provider.env(); anchor.setProvider(provider); - const callerProgram = anchor.workspace - .AnchorCpiCaller as Program; - const returnProgram = anchor.workspace - .AnchorCpiReturn as Program; + const callerProgram = anchor.workspace.Caller as Program; + const returnProgram = anchor.workspace.Callee as Program; const getReturnLog = (confirmedTransaction) => { const prefix = "Program return: "; diff --git a/tests/anchor-cpi-return/tsconfig.json b/tests/cpi-returns/tsconfig.json similarity index 100% rename from tests/anchor-cpi-return/tsconfig.json rename to tests/cpi-returns/tsconfig.json diff --git a/tests/anchor-cpi-return/yarn.lock b/tests/cpi-returns/yarn.lock similarity index 100% rename from tests/anchor-cpi-return/yarn.lock rename to tests/cpi-returns/yarn.lock From 552c49d5bc5e46526d458f97ea5a0f09b9fca323 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 14:49:42 +1300 Subject: [PATCH 10/30] Add to GitHub checks --- .github/workflows/tests.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1a1ca3ff81..a6a04b720a 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -319,6 +319,8 @@ jobs: path: tests/floats - cmd: cd tests/safety-checks && ./test.sh path: tests/safety-checks + - cmd: cd tests/cpi-returns && anchor test --skip-lint + path: tests/cpi-returns steps: - uses: actions/checkout@v2 - uses: ./.github/actions/setup/ From 03b5d26f6061c22ee78acb84aa45124dcddec447 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 15:31:59 +1300 Subject: [PATCH 11/30] Fix test --- tests/cpi-returns/Anchor.toml | 2 +- tests/cpi-returns/programs/callee/src/lib.rs | 4 ++-- tests/cpi-returns/tests/cpi-return.ts | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/cpi-returns/Anchor.toml b/tests/cpi-returns/Anchor.toml index 90e3fdc134..99bb4acbfc 100644 --- a/tests/cpi-returns/Anchor.toml +++ b/tests/cpi-returns/Anchor.toml @@ -10,7 +10,7 @@ url = "https://anchor.projectserum.com" [provider] cluster = "localnet" -wallet = "/Users/tom/.config/solana/id.json" +wallet = "~/.config/solana/id.json" [scripts] test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/tests/cpi-returns/programs/callee/src/lib.rs b/tests/cpi-returns/programs/callee/src/lib.rs index c6b1571434..f9b69d7772 100644 --- a/tests/cpi-returns/programs/callee/src/lib.rs +++ b/tests/cpi-returns/programs/callee/src/lib.rs @@ -11,7 +11,7 @@ pub mod callee { pub value: u64, } - pub fn initialize(ctx: Context) -> Result<()> { + pub fn initialize(_ctx: Context) -> Result<()> { Ok(()) } @@ -19,7 +19,7 @@ pub mod callee { Ok(10) } - pub fn return_struct(ctx: Context) -> Result { + pub fn return_struct(_ctx: Context) -> Result { let s = StructReturn { value: 11 }; Ok(s) } diff --git a/tests/cpi-returns/tests/cpi-return.ts b/tests/cpi-returns/tests/cpi-return.ts index b00e044305..65d2b4fb8b 100644 --- a/tests/cpi-returns/tests/cpi-return.ts +++ b/tests/cpi-returns/tests/cpi-return.ts @@ -8,7 +8,6 @@ import { Caller } from "../target/types/caller"; const { SystemProgram } = anchor.web3; describe("CPI return", () => { - // Configure the client to use the local cluster. const provider = anchor.Provider.env(); anchor.setProvider(provider); From 63a6a15177c8b9f0b660bccea291cd68cc3804a5 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 15:43:33 +1300 Subject: [PATCH 12/30] Add test to workspace --- tests/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/package.json b/tests/package.json index 568c0bb2b4..e4683c18e5 100644 --- a/tests/package.json +++ b/tests/package.json @@ -30,7 +30,8 @@ "tictactoe", "typescript", "zero-copy", - "declare-id" + "declare-id", + "cpi-returns" ], "dependencies": { "@project-serum/anchor": "^0.22.1", From 951838d319745a00aabd30b9c91f8587437344b8 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 16:05:52 +1300 Subject: [PATCH 13/30] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3fcebbe04..aab5077e30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ incremented for features. ### Features * lang: Add new `AccountSysvarMismatch` error code and test cases for sysvars ([#1535](https://github.com/project-serum/anchor/pull/1535)). +* lang: Add return values to CPI client. ([]()). ### Fixes From 6f3a86a94dcb217d05e5b4db748fd0f357a49e61 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Fri, 11 Mar 2022 16:19:29 +1300 Subject: [PATCH 14/30] Rename type variable for consistency --- lang/syn/src/codegen/program/cpi.rs | 2 +- lang/syn/src/codegen/program/handlers.rs | 2 +- lang/syn/src/lib.rs | 2 +- lang/syn/src/parser/program/instructions.rs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index fdce16e45b..6cbf078d96 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -70,7 +70,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, name); let sighash_tts: proc_macro2::TokenStream = format!("{:?}", sighash_arr).parse().unwrap(); - let ret_type = &ix.returns.return_type.to_token_stream(); + let ret_type = &ix.returns.ty.to_token_stream(); let result_handler = match ret_type.to_string().as_str() { "()" => quote! { Ok(()) }, _ => quote! { diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 662327eac6..8c16b1156f 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -694,7 +694,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let anchor = &ix.anchor_ident; let variant_arm = generate_ix_variant(ix.raw_method.sig.ident.to_string(), &ix.args); let ix_name_log = format!("Instruction: {}", ix_name); - let ret_type = &ix.returns.return_type.to_token_stream(); + let ret_type = &ix.returns.ty.to_token_stream(); let result_handler = match ret_type.to_string().as_str() { "()" => quote! {}, _ => quote! { diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 622fc0a8fa..63ad84d8f1 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -98,7 +98,7 @@ pub struct IxArg { #[derive(Debug)] pub struct IxReturn { - pub return_type: Type, + pub ty: Type, } #[derive(Debug)] diff --git a/lang/syn/src/parser/program/instructions.rs b/lang/syn/src/parser/program/instructions.rs index 0f74ab856a..d837fcf55f 100644 --- a/lang/syn/src/parser/program/instructions.rs +++ b/lang/syn/src/parser/program/instructions.rs @@ -110,7 +110,7 @@ pub fn parse_return(method: &syn::ItemFn) -> ParseResult { )) } }; - let return_type = match generic_args { + let ty = match generic_args { syn::GenericArgument::Type(ty) => ty.clone(), _ => { return Err(ParseError::new( @@ -119,7 +119,7 @@ pub fn parse_return(method: &syn::ItemFn) -> ParseResult { )) } }; - Ok(IxReturn { return_type }) + Ok(IxReturn { ty }) } _ => Err(ParseError::new( method.sig.output.span(), From 497245e4fef2676f6b440d7488f5e62abedac916 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 08:37:00 +1300 Subject: [PATCH 15/30] Remove yarn.lock --- tests/cpi-returns/yarn.lock | 1238 ----------------------------------- 1 file changed, 1238 deletions(-) delete mode 100644 tests/cpi-returns/yarn.lock diff --git a/tests/cpi-returns/yarn.lock b/tests/cpi-returns/yarn.lock deleted file mode 100644 index b160717556..0000000000 --- a/tests/cpi-returns/yarn.lock +++ /dev/null @@ -1,1238 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" - integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== - dependencies: - regenerator-runtime "^0.13.4" - -"@ethersproject/bytes@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/logger@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - -"@ethersproject/sha2@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" - integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - hash.js "1.1.7" - -"@project-serum/anchor@^0.22.1": - version "0.22.1" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.22.1.tgz#698a9620f94691de0a12bbc650a5c8380e2f0e8a" - integrity sha512-5pHeyvQhzLahIQ8aZymmDMZJAJFklN0joZdI+YIqFkK2uU/mlKr6rBLQjxysf/j1mLLiNG00tdyLfUtTAdQz7w== - dependencies: - "@project-serum/borsh" "^0.2.5" - "@solana/web3.js" "^1.17.0" - base64-js "^1.5.1" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^5.3.1" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - find "^0.3.0" - js-sha256 "^0.9.0" - pako "^2.0.3" - snake-case "^3.0.4" - toml "^3.0.0" - -"@project-serum/borsh@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.5.tgz#6059287aa624ecebbfc0edd35e4c28ff987d8663" - integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q== - dependencies: - bn.js "^5.1.2" - buffer-layout "^1.2.0" - -"@solana/buffer-layout@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" - integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== - dependencies: - buffer "~6.0.3" - -"@solana/web3.js@^1.17.0": - version "1.36.0" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.36.0.tgz#79d7d5217b49b80139f4de68953adc5b9a9a264f" - integrity sha512-RNT1451iRR7TyW7EJKMCrH/0OXawIe4zVm0DWQASwXlR/u1jmW6FrmH0lujIh7cGTlfOVbH+2ZU9AVUPLBFzwA== - dependencies: - "@babel/runtime" "^7.12.5" - "@ethersproject/sha2" "^5.5.0" - "@solana/buffer-layout" "^3.0.0" - bn.js "^5.0.0" - borsh "^0.4.0" - bs58 "^4.0.1" - buffer "6.0.1" - cross-fetch "^3.1.4" - jayson "^3.4.4" - js-sha3 "^0.8.0" - rpc-websockets "^7.4.2" - secp256k1 "^4.0.2" - superstruct "^0.14.2" - tweetnacl "^1.0.0" - -"@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/chai@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" - integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== - -"@types/connect@^3.4.33": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.9": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/lodash@^4.14.159": - version "4.14.179" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.179.tgz#490ec3288088c91295780237d2497a3aa9dfb5c5" - integrity sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w== - -"@types/mocha@^9.0.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" - integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== - -"@types/node@*": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== - -"@types/node@^12.12.54": - version "12.20.46" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.46.tgz#7e49dee4c54fd19584e6a9e0da5f3dc2e9136bc7" - integrity sha512-cPjLXj8d6anFPzFvOPxS3fvly3Shm5nTfl6g8X5smexixbuGUf7hfr21J5tX9JW+UPStp/5P5R8qrKL5IyVJ+A== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -borsh@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" - integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== - dependencies: - "@types/bn.js" "^4.11.5" - bn.js "^5.0.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= - dependencies: - base-x "^3.0.2" - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-layout@^1.2.0, buffer-layout@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" - integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== - -buffer@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" - integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== - dependencies: - node-gyp-build "^4.3.0" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chai@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -circular-json@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" - integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -cross-fetch@^3.1.4, cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -crypto-hash@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" - integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== - -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" - integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== - dependencies: - traverse-chain "~0.1.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -jayson@^3.4.4: - version "3.6.6" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" - integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== - dependencies: - "@types/connect" "^3.4.33" - "@types/express-serve-static-core" "^4.17.9" - "@types/lodash" "^4.14.159" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - lodash "^4.17.20" - uuid "^8.3.2" - ws "^7.4.5" - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== - dependencies: - get-func-name "^2.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha@^9.0.3: - version "9.2.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e" - integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.2.0" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" - integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -pako@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -rpc-websockets@^7.4.2: - version "7.4.17" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.17.tgz#f38845dd96db0442bff9e15fba9df781beb44cc0" - integrity sha512-eolVi/qlXS13viIUH9aqrde902wzSLAai0IjmOZSRefp5I3CSG/vCnD0c0fDSYCWuEyUoRL1BHQA8K1baEUyow== - dependencies: - "@babel/runtime" "^7.11.2" - circular-json "^0.5.9" - eventemitter3 "^4.0.7" - uuid "^8.3.0" - ws "^7.4.5" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -secp256k1@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -traverse-chain@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" - integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= - -ts-mocha@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" - integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== - dependencies: - ts-node "7.0.1" - optionalDependencies: - tsconfig-paths "^3.5.0" - -ts-node@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tsconfig-paths@^3.5.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.13.0.tgz#f3e9b8f6876698581d94470c03c95b3a48c0e3d7" - integrity sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tweetnacl@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typescript@^4.3.5: - version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" - integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== - -utf-8-validate@^5.0.2: - version "5.0.8" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" - integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== - dependencies: - node-gyp-build "^4.3.0" - -uuid@^8.3.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^7.4.5: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 5c9650b6d0586c3a7d7781bb1c4a77bb19027393 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 09:03:35 +1300 Subject: [PATCH 16/30] Rename result handlers for clarity --- lang/syn/src/codegen/program/cpi.rs | 4 ++-- lang/syn/src/codegen/program/handlers.rs | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index 6cbf078d96..bcfb08e05f 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -71,7 +71,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let sighash_tts: proc_macro2::TokenStream = format!("{:?}", sighash_arr).parse().unwrap(); let ret_type = &ix.returns.ty.to_token_stream(); - let result_handler = match ret_type.to_string().as_str() { + let maybe_get_return_data = match ret_type.to_string().as_str() { "()" => quote! { Ok(()) }, _ => quote! { let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); @@ -105,7 +105,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { ).map_or_else( |e| Err(Into::into(e)), // Maybe handle Solana return data. - |_| { #result_handler } + |_| { #maybe_get_return_data } ) } } diff --git a/lang/syn/src/codegen/program/handlers.rs b/lang/syn/src/codegen/program/handlers.rs index 8c16b1156f..543e14af76 100644 --- a/lang/syn/src/codegen/program/handlers.rs +++ b/lang/syn/src/codegen/program/handlers.rs @@ -695,12 +695,10 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let variant_arm = generate_ix_variant(ix.raw_method.sig.ident.to_string(), &ix.args); let ix_name_log = format!("Instruction: {}", ix_name); let ret_type = &ix.returns.ty.to_token_stream(); - let result_handler = match ret_type.to_string().as_str() { + let maybe_set_return_data = match ret_type.to_string().as_str() { "()" => quote! {}, _ => quote! { - let mut buffer: Vec = Vec::new(); - result.serialize(&mut buffer)?; - anchor_lang::solana_program::program::set_return_data(&buffer.as_slice()); + anchor_lang::solana_program::program::set_return_data(&result.try_to_vec().unwrap()); }, }; quote! { @@ -742,7 +740,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { )?; // Maybe set Solana return data. - #result_handler + #maybe_set_return_data // Exit routine. accounts.exit(program_id) From 88aafe655d24dc4bec56e397e307a2a8134041c7 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 09:04:50 +1300 Subject: [PATCH 17/30] Use sol_log_data in tests --- tests/cpi-returns/programs/caller/src/lib.rs | 30 ++++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/cpi-returns/programs/caller/src/lib.rs b/tests/cpi-returns/programs/caller/src/lib.rs index 98305da469..2bdccdeb27 100644 --- a/tests/cpi-returns/programs/caller/src/lib.rs +++ b/tests/cpi-returns/programs/caller/src/lib.rs @@ -9,42 +9,42 @@ declare_id!("HmbTLCmaGvZhKnn1Zfa1JVnp7vkMV4DYVxPLWBVoN65L"); pub mod caller { use super::*; - pub fn cpi_call_return_u64(ctx: Context) -> Result<()> { + pub fn cpi_call_return_u64(ctx: Context) -> Result<()> { let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); let cpi_accounts = CpiReturn { account: ctx.accounts.cpi_return.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_u64(cpi_ctx)?; - let mut buffer: Vec = Vec::new(); - result.serialize(&mut buffer)?; - msg!(&base64::encode(buffer)); + anchor_lang::solana_program::log::sol_log_data(&[&result.try_to_vec().unwrap()]); Ok(()) } - pub fn cpi_call_return_struct(ctx: Context) -> Result<()> { + pub fn cpi_call_return_struct(ctx: Context) -> Result<()> { let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); let cpi_accounts = CpiReturn { account: ctx.accounts.cpi_return.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_struct(cpi_ctx)?; - let mut buffer: Vec = Vec::new(); - result.serialize(&mut buffer)?; - msg!(&base64::encode(buffer)); + anchor_lang::solana_program::log::sol_log_data(&[&result.try_to_vec().unwrap()]); Ok(()) } -} -#[derive(Accounts)] -pub struct CpiReturnU64<'info> { - #[account(mut)] - pub cpi_return: Account<'info, CpiReturnAccount>, - pub cpi_return_program: Program<'info, Callee>, + pub fn cpi_call_return_vec(ctx: Context) -> Result<()> { + let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); + let cpi_accounts = CpiReturn { + account: ctx.accounts.cpi_return.to_account_info(), + }; + let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); + let result = callee::cpi::return_vec(cpi_ctx)?; + anchor_lang::solana_program::log::sol_log_data(&[&result.try_to_vec().unwrap()]); + Ok(()) + } } #[derive(Accounts)] -pub struct CpiReturnStruct<'info> { +pub struct CpiReturnContext<'info> { #[account(mut)] pub cpi_return: Account<'info, CpiReturnAccount>, pub cpi_return_program: Program<'info, Callee>, From 3eaf8fe60d69525871332a0cea91df918aff0bb4 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 09:42:54 +1300 Subject: [PATCH 18/30] Add return types to IDL --- lang/syn/src/idl/file.rs | 8 ++++++++ lang/syn/src/idl/mod.rs | 1 + ts/src/idl.ts | 1 + 3 files changed, 10 insertions(+) diff --git a/lang/syn/src/idl/file.rs b/lang/syn/src/idl/file.rs index 7814c9cb92..524a2c73c4 100644 --- a/lang/syn/src/idl/file.rs +++ b/lang/syn/src/idl/file.rs @@ -66,6 +66,7 @@ pub fn parse( name, accounts, args, + returns: None, } }) .collect::>() @@ -105,6 +106,7 @@ pub fn parse( name, accounts, args, + returns: None, } }; @@ -169,10 +171,16 @@ pub fn parse( // todo: don't unwrap let accounts_strct = accs.get(&ix.anchor_ident.to_string()).unwrap(); let accounts = idl_accounts(&ctx, accounts_strct, &accs, seeds_feature); + let ret_type_str = ix.returns.ty.to_token_stream().to_string(); + let returns = match ret_type_str.as_str() { + "()" => None, + _ => Some(ret_type_str.parse().unwrap()), + }; IdlInstruction { name: ix.ident.to_string().to_mixed_case(), accounts, args, + returns, } }) .collect::>(); diff --git a/lang/syn/src/idl/mod.rs b/lang/syn/src/idl/mod.rs index f3fb1ac685..a92d9baa1b 100644 --- a/lang/syn/src/idl/mod.rs +++ b/lang/syn/src/idl/mod.rs @@ -45,6 +45,7 @@ pub struct IdlInstruction { pub name: String, pub accounts: Vec, pub args: Vec, + pub returns: Option, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] diff --git a/ts/src/idl.ts b/ts/src/idl.ts index 7587c1a48b..abc4f4d1b2 100644 --- a/ts/src/idl.ts +++ b/ts/src/idl.ts @@ -38,6 +38,7 @@ export type IdlInstruction = { name: string; accounts: IdlAccountItem[]; args: IdlField[]; + returns: IdlTypeDefTy; }; export type IdlState = { From 3eec70be4a6024e9bab1c2c2bdf57c892c612671 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 09:48:36 +1300 Subject: [PATCH 19/30] Test return types in IDL --- tests/cpi-returns/tests/cpi-return.ts | 34 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/tests/cpi-returns/tests/cpi-return.ts b/tests/cpi-returns/tests/cpi-return.ts index 65d2b4fb8b..136f0e75b2 100644 --- a/tests/cpi-returns/tests/cpi-return.ts +++ b/tests/cpi-returns/tests/cpi-return.ts @@ -12,7 +12,7 @@ describe("CPI return", () => { anchor.setProvider(provider); const callerProgram = anchor.workspace.Caller as Program; - const returnProgram = anchor.workspace.Callee as Program; + const calleeProgram = anchor.workspace.Callee as Program; const getReturnLog = (confirmedTransaction) => { const prefix = "Program return: "; @@ -30,7 +30,7 @@ describe("CPI return", () => { const confirmOptions = { commitment: "confirmed" }; it("can initialize", async () => { - await returnProgram.methods + await calleeProgram.methods .initialize() .accounts({ account: cpiReturn.publicKey, @@ -46,7 +46,7 @@ describe("CPI return", () => { .cpiCallReturnU64() .accounts({ cpiReturn: cpiReturn.publicKey, - cpiReturnProgram: returnProgram.programId, + cpiReturnProgram: calleeProgram.programId, }) .rpc(confirmOptions); let t = await provider.connection.getTransaction(tx, { @@ -54,11 +54,11 @@ describe("CPI return", () => { }); const [key, data, buffer] = getReturnLog(t); - assert.equal(key, returnProgram.programId); + assert.equal(key, calleeProgram.programId); // Check for matching log on receive side let receiveLog = t.meta.logMessages.find( - (log) => log == `Program log: ${data}` + (log) => log == `Program data: ${data}` ); assert(receiveLog !== undefined); @@ -67,7 +67,7 @@ describe("CPI return", () => { }); it("can make a non-cpi call to a function that returns a u64", async () => { - const tx = await returnProgram.methods + const tx = await calleeProgram.methods .returnU64() .accounts({ account: cpiReturn.publicKey, @@ -77,7 +77,7 @@ describe("CPI return", () => { commitment: "confirmed", }); const [key, , buffer] = getReturnLog(t); - assert.equal(key, returnProgram.programId); + assert.equal(key, calleeProgram.programId); const reader = new borsh.BinaryReader(buffer); assert.equal(reader.readU64().toNumber(), 10); }); @@ -87,7 +87,7 @@ describe("CPI return", () => { .cpiCallReturnStruct() .accounts({ cpiReturn: cpiReturn.publicKey, - cpiReturnProgram: returnProgram.programId, + cpiReturnProgram: calleeProgram.programId, }) .rpc(confirmOptions); let t = await provider.connection.getTransaction(tx, { @@ -95,11 +95,11 @@ describe("CPI return", () => { }); const [key, data, buffer] = getReturnLog(t); - assert.equal(key, returnProgram.programId); + assert.equal(key, calleeProgram.programId); // Check for matching log on receive side let receiveLog = t.meta.logMessages.find( - (log) => log == `Program log: ${data}` + (log) => log == `Program data: ${data}` ); assert(receiveLog !== undefined); @@ -118,4 +118,18 @@ describe("CPI return", () => { const deserialized = borsh.deserialize(schema, Data, buffer); assert(deserialized.value.toNumber() === 11); }); + + it("sets a return value in idl", async () => { + const returnu64Instruction = calleeProgram._idl.instructions.find( + (f) => f.name == "returnU64" + ); + assert.equal(returnu64Instruction.returns, "u64"); + + const returnStructInstruction = calleeProgram._idl.instructions.find( + (f) => f.name == "returnStruct" + ); + assert.deepStrictEqual(returnStructInstruction.returns, { + defined: "StructReturn", + }); + }); }); From b0abf611576c23a5476ed6b939f11a8fcf6ee419 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 10:37:41 +1300 Subject: [PATCH 20/30] Make returns optional --- ts/src/idl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/src/idl.ts b/ts/src/idl.ts index abc4f4d1b2..9795f45605 100644 --- a/ts/src/idl.ts +++ b/ts/src/idl.ts @@ -38,7 +38,7 @@ export type IdlInstruction = { name: string; accounts: IdlAccountItem[]; args: IdlField[]; - returns: IdlTypeDefTy; + returns?: IdlTypeDefTy; }; export type IdlState = { From eaea06798cce9698eec69dc8e8aba7d0f966480d Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 11:53:17 +1300 Subject: [PATCH 21/30] Add vec example --- tests/cpi-returns/programs/callee/src/lib.rs | 4 +++ tests/cpi-returns/tests/cpi-return.ts | 26 ++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/tests/cpi-returns/programs/callee/src/lib.rs b/tests/cpi-returns/programs/callee/src/lib.rs index f9b69d7772..5cce63ec95 100644 --- a/tests/cpi-returns/programs/callee/src/lib.rs +++ b/tests/cpi-returns/programs/callee/src/lib.rs @@ -23,6 +23,10 @@ pub mod callee { let s = StructReturn { value: 11 }; Ok(s) } + + pub fn return_vec(_ctx: Context) -> Result> { + Ok(vec![12, 13, 14, 100]) + } } #[derive(Accounts)] diff --git a/tests/cpi-returns/tests/cpi-return.ts b/tests/cpi-returns/tests/cpi-return.ts index 136f0e75b2..c9848f7141 100644 --- a/tests/cpi-returns/tests/cpi-return.ts +++ b/tests/cpi-returns/tests/cpi-return.ts @@ -119,6 +119,32 @@ describe("CPI return", () => { assert(deserialized.value.toNumber() === 11); }); + it("can return a vec from a cpi", async () => { + const tx = await callerProgram.methods + .cpiCallReturnVec() + .accounts({ + cpiReturn: cpiReturn.publicKey, + cpiReturnProgram: calleeProgram.programId, + }) + .rpc(confirmOptions); + let t = await provider.connection.getTransaction(tx, { + commitment: "confirmed", + }); + + const [key, data, buffer] = getReturnLog(t); + assert.equal(key, calleeProgram.programId); + + // Check for matching log on receive side + let receiveLog = t.meta.logMessages.find( + (log) => log == `Program data: ${data}` + ); + assert(receiveLog !== undefined); + + const reader = new borsh.BinaryReader(buffer); + const array = reader.readArray(() => reader.readU8()); + assert.deepStrictEqual(array, [12, 13, 14, 100]); + }); + it("sets a return value in idl", async () => { const returnu64Instruction = calleeProgram._idl.instructions.find( (f) => f.name == "returnU64" From a3b0c77b61d41edca724cfe5579e41e73877d4a9 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Tue, 15 Mar 2022 15:14:41 +1300 Subject: [PATCH 22/30] Fix return type in client --- ts/src/idl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/src/idl.ts b/ts/src/idl.ts index 9795f45605..c653071335 100644 --- a/ts/src/idl.ts +++ b/ts/src/idl.ts @@ -38,7 +38,7 @@ export type IdlInstruction = { name: string; accounts: IdlAccountItem[]; args: IdlField[]; - returns?: IdlTypeDefTy; + returns?: IdlType; }; export type IdlState = { From 2cf9be76adb044fb6c1a0768fb50d09f3c2b4b2d Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Sat, 19 Mar 2022 09:48:05 +1300 Subject: [PATCH 23/30] Assume unit type return --- lang/syn/src/parser/program/instructions.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lang/syn/src/parser/program/instructions.rs b/lang/syn/src/parser/program/instructions.rs index d837fcf55f..4cf5aa80d4 100644 --- a/lang/syn/src/parser/program/instructions.rs +++ b/lang/syn/src/parser/program/instructions.rs @@ -101,14 +101,11 @@ pub fn parse_return(method: &syn::ItemFn) -> ParseResult { syn::Type::Path(ty) => ty, _ => return Err(ParseError::new(ty.span(), "expected a return type")), }; + // Assume unit return by default + let default_generic_arg = syn::GenericArgument::Type(syn::parse_str("()").unwrap()); let generic_args = match &ty.path.segments.last().unwrap().arguments { syn::PathArguments::AngleBracketed(params) => params.args.iter().last().unwrap(), - _ => { - return Err(ParseError::new( - ty.span(), - "expected return type to be generic", - )) - } + _ => &default_generic_arg, }; let ty = match generic_args { syn::GenericArgument::Type(ty) => ty.clone(), From fd40f5961ea6baafbc3edce1e1322e09c4bec941 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 09:06:51 +1300 Subject: [PATCH 24/30] Add lazy return --- lang/syn/src/codegen/program/cpi.rs | 31 ++++++++++++++------ tests/cpi-returns/programs/caller/src/lib.rs | 9 ++++-- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index bcfb08e05f..bf36f1f7d4 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -71,19 +71,19 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let sighash_tts: proc_macro2::TokenStream = format!("{:?}", sighash_arr).parse().unwrap(); let ret_type = &ix.returns.ty.to_token_stream(); - let maybe_get_return_data = match ret_type.to_string().as_str() { - "()" => quote! { Ok(()) }, - _ => quote! { - let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); - let data = <#ret_type>::try_from_slice(&data)?; - Ok(data) - } + let (method_ret, maybe_return) = match ret_type.to_string().as_str() { + "()" => (quote! {anchor_lang::Result<()> }, quote! { Ok(()) }), + _ => ( + quote! { anchor_lang::Result> }, + quote! { Ok(Return::<#ret_type> { phantom: PhantomData }) } + ) }; + quote! { pub fn #method_name<'a, 'b, 'c, 'info>( ctx: anchor_lang::context::CpiContext<'a, 'b, 'c, 'info, #accounts_ident<'info>>, #(#args),* - ) -> anchor_lang::Result<#ret_type> { + ) -> #method_ret { let ix = { let ix = instruction::#ix_variant; let mut ix_data = AnchorSerialize::try_to_vec(&ix) @@ -105,7 +105,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { ).map_or_else( |e| Err(Into::into(e)), // Maybe handle Solana return data. - |_| { #maybe_get_return_data } + |_| { #maybe_return } ) } } @@ -121,6 +121,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { #[cfg(feature = "cpi")] pub mod cpi { use super::*; + use std::marker::PhantomData; pub mod state { use super::*; @@ -128,6 +129,18 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { #(#state_cpi_methods)* } + pub struct Return { + phantom: PhantomData + } + + impl Return { + pub fn get(&self) -> Result { + let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); + let value = T::try_from_slice(&data).unwrap(); + Ok(value) + } + } + #(#global_cpi_methods)* #accounts diff --git a/tests/cpi-returns/programs/caller/src/lib.rs b/tests/cpi-returns/programs/caller/src/lib.rs index 2bdccdeb27..003b654df7 100644 --- a/tests/cpi-returns/programs/caller/src/lib.rs +++ b/tests/cpi-returns/programs/caller/src/lib.rs @@ -16,7 +16,8 @@ pub mod caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_u64(cpi_ctx)?; - anchor_lang::solana_program::log::sol_log_data(&[&result.try_to_vec().unwrap()]); + let solana_return = result.get().unwrap(); + anchor_lang::solana_program::log::sol_log_data(&[&solana_return.try_to_vec().unwrap()]); Ok(()) } @@ -27,7 +28,8 @@ pub mod caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_struct(cpi_ctx)?; - anchor_lang::solana_program::log::sol_log_data(&[&result.try_to_vec().unwrap()]); + let solana_return = result.get().unwrap(); + anchor_lang::solana_program::log::sol_log_data(&[&solana_return.try_to_vec().unwrap()]); Ok(()) } @@ -38,7 +40,8 @@ pub mod caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_vec(cpi_ctx)?; - anchor_lang::solana_program::log::sol_log_data(&[&result.try_to_vec().unwrap()]); + let solana_return = result.get().unwrap(); + anchor_lang::solana_program::log::sol_log_data(&[&solana_return.try_to_vec().unwrap()]); Ok(()) } } From b49bf6c904a2583c63e6b7c41828ac8b5edc6fc8 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 15:00:41 +1300 Subject: [PATCH 25/30] Update package.json --- tests/cpi-returns/package.json | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tests/cpi-returns/package.json b/tests/cpi-returns/package.json index 5bf3be9114..e0376e7317 100644 --- a/tests/cpi-returns/package.json +++ b/tests/cpi-returns/package.json @@ -1,13 +1,19 @@ { - "dependencies": { - "@project-serum/anchor": "^0.22.1" - }, - "devDependencies": { - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^8.0.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "typescript": "^4.3.5" - } + "name": "cpi-returns", + "version": "0.23.0", + "license": "(MIT OR Apache-2.0)", + "homepage": "https://github.com/project-serum/anchor#readme", + "bugs": { + "url": "https://github.com/project-serum/anchor/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/project-serum/anchor.git" + }, + "engines": { + "node": ">=11" + }, + "scripts": { + "test": "anchor run test-with-build" + } } From 50b8f00e63a3e3b1fa49bfd1bda347bef7ebaacc Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 15:04:55 +1300 Subject: [PATCH 26/30] Remove unnecessary result --- lang/syn/src/codegen/program/cpi.rs | 5 ++--- tests/cpi-returns/programs/caller/src/lib.rs | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index bf36f1f7d4..f41f2471d8 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -134,10 +134,9 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { } impl Return { - pub fn get(&self) -> Result { + pub fn get(&self) -> T { let (_key, data) = anchor_lang::solana_program::program::get_return_data().unwrap(); - let value = T::try_from_slice(&data).unwrap(); - Ok(value) + T::try_from_slice(&data).unwrap() } } diff --git a/tests/cpi-returns/programs/caller/src/lib.rs b/tests/cpi-returns/programs/caller/src/lib.rs index 003b654df7..2070e35906 100644 --- a/tests/cpi-returns/programs/caller/src/lib.rs +++ b/tests/cpi-returns/programs/caller/src/lib.rs @@ -16,7 +16,7 @@ pub mod caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_u64(cpi_ctx)?; - let solana_return = result.get().unwrap(); + let solana_return = result.get(); anchor_lang::solana_program::log::sol_log_data(&[&solana_return.try_to_vec().unwrap()]); Ok(()) } @@ -28,7 +28,7 @@ pub mod caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_struct(cpi_ctx)?; - let solana_return = result.get().unwrap(); + let solana_return = result.get(); anchor_lang::solana_program::log::sol_log_data(&[&solana_return.try_to_vec().unwrap()]); Ok(()) } @@ -40,7 +40,7 @@ pub mod caller { }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_vec(cpi_ctx)?; - let solana_return = result.get().unwrap(); + let solana_return = result.get(); anchor_lang::solana_program::log::sol_log_data(&[&solana_return.try_to_vec().unwrap()]); Ok(()) } From 9b14549284bca17a1044a96c07fbd0399ec6df7e Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 15:17:34 +1300 Subject: [PATCH 27/30] Full paths for Return and PhantomData --- lang/syn/src/codegen/program/cpi.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lang/syn/src/codegen/program/cpi.rs b/lang/syn/src/codegen/program/cpi.rs index f41f2471d8..aa2aec5631 100644 --- a/lang/syn/src/codegen/program/cpi.rs +++ b/lang/syn/src/codegen/program/cpi.rs @@ -74,8 +74,8 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { let (method_ret, maybe_return) = match ret_type.to_string().as_str() { "()" => (quote! {anchor_lang::Result<()> }, quote! { Ok(()) }), _ => ( - quote! { anchor_lang::Result> }, - quote! { Ok(Return::<#ret_type> { phantom: PhantomData }) } + quote! { anchor_lang::Result> }, + quote! { Ok(crate::cpi::Return::<#ret_type> { phantom: crate::cpi::PhantomData }) } ) }; @@ -130,7 +130,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream { } pub struct Return { - phantom: PhantomData + phantom: std::marker::PhantomData } impl Return { From 594cf4d7cb6625277dbd1c702f325fa604bce20e Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 15:27:55 +1300 Subject: [PATCH 28/30] Error on nonconformant return --- lang/syn/src/parser/program/instructions.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lang/syn/src/parser/program/instructions.rs b/lang/syn/src/parser/program/instructions.rs index 4cf5aa80d4..43ea1ca434 100644 --- a/lang/syn/src/parser/program/instructions.rs +++ b/lang/syn/src/parser/program/instructions.rs @@ -101,6 +101,12 @@ pub fn parse_return(method: &syn::ItemFn) -> ParseResult { syn::Type::Path(ty) => ty, _ => return Err(ParseError::new(ty.span(), "expected a return type")), }; + if &ty.path.segments.last().unwrap().ident.to_string() != "Result" { + return Err(ParseError::new( + ty.path.span(), + "expected instruction return type to be Result", + )); + } // Assume unit return by default let default_generic_arg = syn::GenericArgument::Type(syn::parse_str("()").unwrap()); let generic_args = match &ty.path.segments.last().unwrap().arguments { From f16c155a0e4abb01a766914694317aa3fe448905 Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 15:41:42 +1300 Subject: [PATCH 29/30] Revert "Error on nonconformant return" This reverts commit 594cf4d7cb6625277dbd1c702f325fa604bce20e. --- lang/syn/src/parser/program/instructions.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lang/syn/src/parser/program/instructions.rs b/lang/syn/src/parser/program/instructions.rs index 43ea1ca434..4cf5aa80d4 100644 --- a/lang/syn/src/parser/program/instructions.rs +++ b/lang/syn/src/parser/program/instructions.rs @@ -101,12 +101,6 @@ pub fn parse_return(method: &syn::ItemFn) -> ParseResult { syn::Type::Path(ty) => ty, _ => return Err(ParseError::new(ty.span(), "expected a return type")), }; - if &ty.path.segments.last().unwrap().ident.to_string() != "Result" { - return Err(ParseError::new( - ty.path.span(), - "expected instruction return type to be Result", - )); - } // Assume unit return by default let default_generic_arg = syn::GenericArgument::Type(syn::parse_str("()").unwrap()); let generic_args = match &ty.path.segments.last().unwrap().arguments { From 82f70e327ce62f87e2de01ea424efe2c39ff7dbf Mon Sep 17 00:00:00 2001 From: Tom Linton Date: Thu, 24 Mar 2022 15:59:31 +1300 Subject: [PATCH 30/30] Remove unused base64 dep --- tests/cpi-returns/programs/caller/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/cpi-returns/programs/caller/Cargo.toml b/tests/cpi-returns/programs/caller/Cargo.toml index d322c0b53b..2aaa551085 100644 --- a/tests/cpi-returns/programs/caller/Cargo.toml +++ b/tests/cpi-returns/programs/caller/Cargo.toml @@ -18,4 +18,3 @@ default = [] [dependencies] anchor-lang = { path = "../../../../lang", features = ["init-if-needed"] } callee = { path = "../callee", features = ["cpi"] } -base64 = "0.13.0"