From 74eca7bb1b9ab281da0fcc34bcb133fe8ffeb369 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 18:41:59 -0400 Subject: [PATCH 01/37] Initial anchor version --- .gitignore | 3 +- Anchor.toml | 14 + Cargo.lock | 1560 +++++++++++++++++ Cargo.toml | 4 + Makefile | 6 +- program/Cargo.toml | 18 +- program/src/errors.rs | 11 + program/src/instructions/client.rs | 25 - program/src/instructions/init_mint.rs | 78 - program/src/instructions/init_mint_manager.rs | 85 - .../mint_manager/init_mint_manager.rs | 90 + program/src/instructions/mint_manager/mod.rs | 5 + .../mint_manager/update_mint_manager.rs | 24 + program/src/instructions/mod.rs | 14 +- .../instructions/standard/init_standard.rs | 39 + program/src/instructions/standard/mod.rs | 5 + .../instructions/standard/update_standard.rs | 28 + program/src/instructions/token.rs | 174 -- program/src/instructions/token/approve.rs | 1 + program/src/instructions/token/burn.rs | 1 + program/src/instructions/token/close.rs | 1 + .../src/instructions/token/init_account.rs | 1 + program/src/instructions/token/init_mint.rs | 1 + .../token/post_transfer.rs} | 0 .../src/instructions/token/pre_transfer.rs | 0 program/src/instructions/token/revoke.rs | 1 + program/src/instructions/token/transfer.rs | 1 + program/src/lib.rs | 70 +- program/src/pda.rs | 7 - program/src/state.rs | 31 + program/src/state/mint_manager.rs | 60 - program/src/state/mod.rs | 3 - sdk/generate-idls.sh | 15 + sdk/idl/cardinal_creator_standard.json | 4 +- sdk/package.json | 2 + sdk/src/generated/accounts/MintManager.ts | 58 +- sdk/src/generated/accounts/MintManagerV2.ts | 58 +- sdk/src/generated/index.ts | 10 +- sdk/src/generated/instructions/InitMint.ts | 36 +- .../generated/instructions/InitMintManager.ts | 38 +- 40 files changed, 1975 insertions(+), 607 deletions(-) create mode 100644 Anchor.toml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 program/src/errors.rs delete mode 100644 program/src/instructions/client.rs delete mode 100644 program/src/instructions/init_mint.rs delete mode 100644 program/src/instructions/init_mint_manager.rs create mode 100644 program/src/instructions/mint_manager/init_mint_manager.rs create mode 100644 program/src/instructions/mint_manager/mod.rs create mode 100644 program/src/instructions/mint_manager/update_mint_manager.rs create mode 100644 program/src/instructions/standard/init_standard.rs create mode 100644 program/src/instructions/standard/mod.rs create mode 100644 program/src/instructions/standard/update_standard.rs delete mode 100644 program/src/instructions/token.rs create mode 100644 program/src/instructions/token/approve.rs create mode 100644 program/src/instructions/token/burn.rs create mode 100644 program/src/instructions/token/close.rs create mode 100644 program/src/instructions/token/init_account.rs create mode 100644 program/src/instructions/token/init_mint.rs rename program/src/{state/ruleset.rs => instructions/token/post_transfer.rs} (100%) create mode 100644 program/src/instructions/token/pre_transfer.rs create mode 100644 program/src/instructions/token/revoke.rs create mode 100644 program/src/instructions/token/transfer.rs delete mode 100644 program/src/pda.rs create mode 100644 program/src/state.rs delete mode 100644 program/src/state/mint_manager.rs delete mode 100644 program/src/state/mod.rs create mode 100755 sdk/generate-idls.sh diff --git a/.gitignore b/.gitignore index e9e8ff79..7b5346a3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ sdk/node_modules validator.PID test-ledger yarn-error.log -sdk/.env \ No newline at end of file +sdk/.env +target \ No newline at end of file diff --git a/Anchor.toml b/Anchor.toml new file mode 100644 index 00000000..72fa17b5 --- /dev/null +++ b/Anchor.toml @@ -0,0 +1,14 @@ +[features] +seeds = false + +[registry] +url = "https://anchor.projectserum.com" + +[provider] +cluster = "localnet" +wallet = "./tests/test-key.json" + +[workspace] +members = [ + "program", +] \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..e418a6d8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1560 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.8", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + +[[package]] +name = "anchor-attribute-access-control" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f6ee9518f50ff4d434471ccf569186022bdd5ef65a21d14da3ea5231af944f" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c92bcf5388b52676d990f85bbfd838a8f5672393135063a50dc79b2b837c79" +dependencies = [ + "anchor-syn", + "anyhow", + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0844974ac35e8ced62056b0d63777ebcdc5807438b8b189c881e2b647450b70a" +dependencies = [ + "anchor-syn", + "proc-macro2", + "syn", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f7467345e67a6f1d4b862b9763a4160ad89d18c247b8c902807768f7b6e23df" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8774e4c1ac71f71a5aea7e4932fb69c30e3b8155c4fa59fd69401195434528a9" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "anchor-attribute-interface" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90eeb6e1c80f9f94fcef93a52813f6472186200e275e83cb3fac92b801de92f7" +dependencies = [ + "anchor-syn", + "anyhow", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac515a7a5a4fea7fc768b1cec40ddb948e148ea657637c75f94f283212326cb9" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "anchor-attribute-state" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dc667b62ff71450f19dcfcc37b0c408fd4ddd89e8650368c2b0984b110603f" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7354d583a06701d24800a8ec4c2b0491f62581a331af349205e23421e0b56643" +dependencies = [ + "anchor-syn", + "anyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "anchor-lang" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff5f57ec5e12fa6874b27f3d5c1f6f44302d3ad86c1266197ff7611bf6f5d251" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-interface", + "anchor-attribute-program", + "anchor-attribute-state", + "anchor-derive-accounts", + "arrayref", + "base64 0.13.0", + "bincode", + "borsh", + "bytemuck", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-spl" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65904c3106851f6d1bb87d504044764819d69c51d2b4346d59d399d8afa7d18" +dependencies = [ + "anchor-lang", + "solana-program", + "spl-associated-token-account", + "spl-token", +] + +[[package]] +name = "anchor-syn" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55aa1e680d9471342122ed5b6bc13bf5da473b0f7e4677d41a6954e5cc8ad155" +dependencies = [ + "anyhow", + "bs58 0.3.1", + "heck", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "serde", + "serde_json", + "sha2 0.9.9", + "syn", + "thiserror", +] + +[[package]] +name = "anyhow" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "blake3" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.5", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive", + "hashbrown", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bs58" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bumpalo" +version = "3.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cardinal-creator-standard" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "mpl-token-metadata", + "solana-program", + "spl-associated-token-account", + "spl-token", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.135" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mpl-token-metadata" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e719d7e0b5a9d97c7fd4d6f52ebfc32f1e3942e068173e47355f8c275656488a" +dependencies = [ + "arrayref", + "borsh", + "mpl-token-vault", + "num-derive", + "num-traits", + "shank", + "solana-program", + "spl-associated-token-account", + "spl-token", + "thiserror", +] + +[[package]] +name = "mpl-token-vault" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade4ef15bc06a6033076c4ff28cba9b42521df5ec61211d6f419415ace2746a" +dependencies = [ + "borsh", + "num-derive", + "num-traits", + "solana-program", + "spl-token", + "thiserror", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate 1.2.1", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "once_cell" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "version_check", + "yansi", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" + +[[package]] +name = "serde" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.5", +] + +[[package]] +name = "sha3" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +dependencies = [ + "digest 0.10.5", + "keccak", +] + +[[package]] +name = "shank" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90b0d7b8998cc311310854451e7f5903cf3a151ca93ef6aa2b8b6c369a037b21" +dependencies = [ + "shank_macro", +] + +[[package]] +name = "shank_macro" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a37d6cf5df84eb622cb6fc74071d5d773c6a23b9ec55691db7b6a8c2286926" +dependencies = [ + "proc-macro2", + "quote", + "shank_macro_impl", + "syn", +] + +[[package]] +name = "shank_macro_impl" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1314ff5d5a3dffd9b93de1463e2b6afc2350f17596d7d9b3fe0924c9edd250df" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "serde", + "syn", +] + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "solana-frozen-abi" +version = "1.10.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d343b3838e95561548a2a651787d17aebf0a3f490f193746ee58f174f65bd7c3" +dependencies = [ + "bs58 0.4.0", + "bv", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.6", + "solana-frozen-abi-macro", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.10.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37211ec8dff16b08fcb422807fa7f046bbc6417bc43e00a2f2effd8fafec6bc" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "solana-program" +version = "1.10.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9622af117fe254208f1fe99a533ea523624d64745d6cffecd986da6753662ef" +dependencies = [ + "base64 0.13.0", + "bincode", + "bitflags", + "blake3", + "borsh", + "borsh-derive", + "bs58 0.4.0", + "bv", + "bytemuck", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "num-derive", + "num-traits", + "parking_lot", + "rand", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.6", + "sha3", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "1.10.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d036e3a52e5570114ec9ab56a1d0a6659e1ebd1c948605318b4e35eafca4515" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "spl-associated-token-account" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b013067447a1396303ddfc294f36e3d260a32f8a16c501c295bcdc7de39b490" +dependencies = [ + "borsh", + "solana-program", + "spl-token", +] + +[[package]] +name = "spl-token" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d05653bed5932064a287340dbc8a3cb298ee717e5c7ec3353d7cdb9f8fb7e1" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "thiserror", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + +[[package]] +name = "unicode-segmentation" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "web-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..dd57c84e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "program", +] \ No newline at end of file diff --git a/Makefile b/Makefile index 4f6daa9f..2daca0fc 100644 --- a/Makefile +++ b/Makefile @@ -5,14 +5,14 @@ TEST_KEY := $(shell solana-keygen pubkey ./sdk/tests/test-keypairs/test-key.json all: build start test stop build: - cd program && cargo build-bpf - cd sdk && yarn && yarn solita + cd program && anchor build + cd sdk && yarn idl:generate start: pkill solana-test-validator || true solana-test-validator --url https://api.mainnet-beta.solana.com \ --clone metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s --clone PwDiXFxQsGra4sFFTT8r1QWRMd4vfumiWC1jfWNfdYT \ - --bpf-program mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS ./program/target/deploy/cardinal_creator_standard.so \ + --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./program/target/deploy/cardinal_creator_standard.so \ --reset --quiet & echo $$! > validator.PID sleep 8 solana airdrop 1000 $(TEST_KEY) --url http://localhost:8899 diff --git a/program/Cargo.toml b/program/Cargo.toml index 2e7d69d5..c7e73077 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -13,17 +13,9 @@ crate-type = ["cdylib", "lib"] name = "cardinal_creator_standard" [dependencies] -solana-program = "1.14.4" -shank = "^0.0.5" -spl-token = { version = "3.5.0", features = ["no-entrypoint"] } -spl-associated-token-account = { version = "1.1.1", features = [ "no-entrypoint", ] } +solana-program = "1.10.41" +anchor-lang = { version = "0.25.0", features = ["init-if-needed"] } +anchor-spl = "0.25.0" +spl-token = { version = "~3.3.1", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "~1.0.5", features = ["no-entrypoint"] } mpl-token-metadata = { version = "1.3.3", features = [ "no-entrypoint", ] } -thiserror = "^1.0.24" -borsh = "0.9.3" -arrayref = "0.3.6" - -[dev-dependencies] -solana-program-test = "1.14.4" -solana-sdk = "1.14.4" -tokio = { version = "1.8.4", features = ["full"] } -anyhow = "1.0.52" diff --git a/program/src/errors.rs b/program/src/errors.rs new file mode 100644 index 00000000..6cd80877 --- /dev/null +++ b/program/src/errors.rs @@ -0,0 +1,11 @@ +use anchor_lang::prelude::*; + +#[error_code] +pub enum ErrorCode { + #[msg("Invalid mint")] + InvalidMint, + #[msg("Invalid collector address")] + InvalidCollector, + #[msg("Invalid authority address")] + InvalidAuthority, +} diff --git a/program/src/instructions/client.rs b/program/src/instructions/client.rs deleted file mode 100644 index 0bf04376..00000000 --- a/program/src/instructions/client.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::CreatorStandardInstruction; -use borsh::BorshSerialize; -use solana_program::instruction::AccountMeta; -use solana_program::instruction::Instruction; -use solana_program::program_error::ProgramError; -use solana_program::pubkey::Pubkey; -use solana_program::system_program; - -pub fn init_ix( - mint: &Pubkey, - authority: &Pubkey, - standard: &Pubkey, -) -> Result<Instruction, ProgramError> { - Ok(Instruction { - program_id: crate::id(), - accounts: vec![ - AccountMeta::new(*mint, false), - AccountMeta::new(*authority, true), - AccountMeta::new(*standard, true), - AccountMeta::new_readonly(spl_token::id(), false), - AccountMeta::new_readonly(system_program::id(), false), - ], - data: CreatorStandardInstruction::InitMintManager.try_to_vec()?, - }) -} diff --git a/program/src/instructions/init_mint.rs b/program/src/instructions/init_mint.rs deleted file mode 100644 index 8098fce9..00000000 --- a/program/src/instructions/init_mint.rs +++ /dev/null @@ -1,78 +0,0 @@ -use crate::state::mint_manager_seeds; -use crate::utils::assert_with_msg; -use solana_program::account_info::next_account_info; -use solana_program::account_info::AccountInfo; -use solana_program::entrypoint::ProgramResult; -use solana_program::program::invoke; -use solana_program::program_error::ProgramError; -use solana_program::program_pack::Pack; -use solana_program::rent::Rent; -use solana_program::system_instruction; -use solana_program::system_program; -use solana_program::sysvar::Sysvar; - -use super::initialize_mint; - -pub struct InitMintCtx<'a, 'info> { - pub mint: &'a AccountInfo<'info>, - pub mint_manager: &'a AccountInfo<'info>, - pub authority: &'a AccountInfo<'info>, - pub payer: &'a AccountInfo<'info>, - pub token_program: &'a AccountInfo<'info>, - pub system_program: &'a AccountInfo<'info>, -} - -impl<'a, 'info> InitMintCtx<'a, 'info> { - pub fn load(accounts: &'a [AccountInfo<'info>]) -> Result<Self, ProgramError> { - let account_iter = &mut accounts.iter(); - let ctx = Self { - mint: next_account_info(account_iter)?, - mint_manager: next_account_info(account_iter)?, - authority: next_account_info(account_iter)?, - payer: next_account_info(account_iter)?, - token_program: next_account_info(account_iter)?, - system_program: next_account_info(account_iter)?, - }; - assert_with_msg( - ctx.mint.owner == ctx.token_program.key, - ProgramError::IllegalOwner, - "Invalid token program", - )?; - assert_with_msg( - ctx.authority.is_writable, - ProgramError::InvalidInstructionData, - "Authority must sign for initialization", - )?; - assert_with_msg( - ctx.token_program.key == &spl_token::id(), - ProgramError::InvalidInstructionData, - "Invalid key supplied for Token Program", - )?; - assert_with_msg( - ctx.system_program.key == &system_program::id(), - ProgramError::InvalidInstructionData, - "Invalid key supplied for System Program", - )?; - Ok(ctx) - } -} - -pub fn handler(ctx: InitMintCtx) -> ProgramResult { - let space = spl_token::state::Mint::LEN; - invoke( - &system_instruction::create_account( - ctx.payer.key, - ctx.mint.key, - Rent::get()?.minimum_balance(space), - space as u64, - ctx.token_program.key, - ), - &[ - ctx.payer.clone(), - ctx.mint.clone(), - ctx.system_program.clone(), - ], - )?; - let (mint_manager, _) = mint_manager_seeds(ctx.mint.key); - initialize_mint(&mint_manager, &mint_manager, ctx.mint, ctx.token_program, 0) -} diff --git a/program/src/instructions/init_mint_manager.rs b/program/src/instructions/init_mint_manager.rs deleted file mode 100644 index 52d428b4..00000000 --- a/program/src/instructions/init_mint_manager.rs +++ /dev/null @@ -1,85 +0,0 @@ -use crate::state::assert_mint_manager_seeds; -use crate::state::mint_manager; -use crate::state::MINT_MANAGER_SIZE; -use crate::utils::assert_address; -use crate::utils::assert_empty; -use crate::utils::assert_mut; -use crate::utils::assert_owner; -use crate::utils::assert_signer; -use borsh::BorshSerialize; -use mint_manager::MintManager; -use mpl_token_metadata::utils::create_or_allocate_account_raw; -use solana_program::account_info::next_account_info; -use solana_program::account_info::AccountInfo; -use solana_program::entrypoint::ProgramResult; -use solana_program::program_error::ProgramError; -use solana_program::system_program; - -pub struct InitMintManagerCtx<'a, 'info> { - pub mint: &'a AccountInfo<'info>, - pub mint_manager: &'a AccountInfo<'info>, - pub authority: &'a AccountInfo<'info>, - pub ruleset: &'a AccountInfo<'info>, - pub payer: &'a AccountInfo<'info>, - pub token_program: &'a AccountInfo<'info>, - pub system_program: &'a AccountInfo<'info>, -} - -impl<'a, 'info> InitMintManagerCtx<'a, 'info> { - pub fn load(accounts: &'a [AccountInfo<'info>]) -> Result<Self, ProgramError> { - let account_iter = &mut accounts.iter(); - let ctx = Self { - mint: next_account_info(account_iter)?, - mint_manager: next_account_info(account_iter)?, - authority: next_account_info(account_iter)?, - ruleset: next_account_info(account_iter)?, - payer: next_account_info(account_iter)?, - token_program: next_account_info(account_iter)?, - system_program: next_account_info(account_iter)?, - }; - - // mint - assert_owner(ctx.mint, ctx.token_program.key, "mint")?; - assert_mut(ctx.mint, "mint")?; - - // mint manager - assert_mut(ctx.mint_manager, "mint_manager")?; - assert_empty(ctx.mint_manager, "mint_manager")?; - - // authority - assert_signer(ctx.authority, "authority")?; - - // payer - assert_signer(ctx.payer, "payer")?; - assert_mut(ctx.payer, "payer")?; - - // token_program - assert_address(ctx.token_program, &spl_token::id(), "token_program")?; - - // system_program - assert_address(ctx.system_program, &system_program::id(), "system_program")?; - Ok(ctx) - } -} - -pub fn handler(ctx: InitMintManagerCtx) -> ProgramResult { - let seeds = assert_mint_manager_seeds(ctx.mint.key, ctx.mint_manager.key)?; - let space = MINT_MANAGER_SIZE; - create_or_allocate_account_raw( - crate::id(), - ctx.mint_manager, - ctx.system_program, - ctx.payer, - space, - &seeds.iter().map(|s| s.as_slice()).collect::<Vec<&[u8]>>(), - )?; - let mint_manager = MintManager { - account_type: 1, - version: 1, - mint: *ctx.mint.key, - authority: *ctx.authority.key, - ruleset: *ctx.ruleset.key, - }; - BorshSerialize::serialize(&mint_manager, &mut *ctx.mint_manager.data.borrow_mut())?; - Ok(()) -} diff --git a/program/src/instructions/mint_manager/init_mint_manager.rs b/program/src/instructions/mint_manager/init_mint_manager.rs new file mode 100644 index 00000000..3a866579 --- /dev/null +++ b/program/src/instructions/mint_manager/init_mint_manager.rs @@ -0,0 +1,90 @@ +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_spl::token::Mint; +use anchor_spl::token::SetAuthority; +use anchor_spl::token::Token; +use anchor_spl::token::{self}; +use solana_program::program::invoke; +use solana_program::system_instruction::transfer; +use spl_token::instruction::AuthorityType; + +#[derive(Accounts)] +pub struct InitMintManagerCtx<'info> { + #[account(mut)] + mint: Account<'info, Mint>, + #[account( + init, + payer = payer, + space = MINT_MANAGER_SIZE, + seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], + bump, + )] + mint_manager: Account<'info, MintManager>, + standard: Account<'info, Standard>, + + /// CHECK: Account is not read from + #[account(mut)] + collector: UncheckedAccount<'info>, + authority: Signer<'info>, + #[account(mut)] + payer: Signer<'info>, + token_program: Program<'info, Token>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<InitMintManagerCtx>) -> Result<()> { + let mint_manager = &mut ctx.accounts.mint_manager; + mint_manager.bump = *ctx.bumps.get("mint_manager").unwrap(); + mint_manager.version = 0; + mint_manager.authority = ctx.accounts.authority.key(); + mint_manager.mint = ctx.accounts.mint.key(); + mint_manager.standard = ctx.accounts.standard.key(); + + if ctx.accounts.mint.supply != 1 || ctx.accounts.mint.decimals != 0 { + return Err(error!(ErrorCode::InvalidMint)); + } + // set mint authoriy + let cpi_accounts = SetAuthority { + account_or_mint: ctx.accounts.mint.to_account_info(), + current_authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::set_authority( + cpi_context, + AuthorityType::MintTokens, + Some(ctx.accounts.mint_manager.key()), + )?; + + // set freeze authoriy + let cpi_accounts = SetAuthority { + account_or_mint: ctx.accounts.mint.to_account_info(), + current_authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::set_authority( + cpi_context, + AuthorityType::FreezeAccount, + Some(ctx.accounts.mint_manager.key()), + )?; + + // creation + if ctx.accounts.collector.key().to_string() != CREATION_COLLECTOR { + return Err(error!(ErrorCode::InvalidCollector)); + } + invoke( + &transfer( + &ctx.accounts.payer.key(), + &ctx.accounts.collector.key(), + CREATION_LAMPORTS, + ), + &[ + ctx.accounts.payer.to_account_info(), + ctx.accounts.collector.to_account_info(), + ctx.accounts.system_program.to_account_info(), + ], + )?; + Ok(()) +} diff --git a/program/src/instructions/mint_manager/mod.rs b/program/src/instructions/mint_manager/mod.rs new file mode 100644 index 00000000..e2ac98fd --- /dev/null +++ b/program/src/instructions/mint_manager/mod.rs @@ -0,0 +1,5 @@ +pub mod init_mint_manager; +pub use init_mint_manager::*; + +pub mod update_mint_manager; +pub use update_mint_manager::*; diff --git a/program/src/instructions/mint_manager/update_mint_manager.rs b/program/src/instructions/mint_manager/update_mint_manager.rs new file mode 100644 index 00000000..b3f022f2 --- /dev/null +++ b/program/src/instructions/mint_manager/update_mint_manager.rs @@ -0,0 +1,24 @@ +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct UpdateMintManagerIx { + pub authority: Pubkey, +} + +#[derive(Accounts)] +pub struct UpdateMintManagerCtx<'info> { + mint_manager: Account<'info, MintManager>, + standard: Account<'info, Standard>, + #[account(constraint = authority.key() == mint_manager.authority @ ErrorCode::InvalidAuthority)] + authority: Signer<'info>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<UpdateMintManagerCtx>, ix: UpdateMintManagerIx) -> Result<()> { + let mint_manager = &mut ctx.accounts.mint_manager; + mint_manager.authority = ix.authority; + mint_manager.standard = ctx.accounts.standard.key(); + Ok(()) +} diff --git a/program/src/instructions/mod.rs b/program/src/instructions/mod.rs index 2bb74a29..df76ad76 100644 --- a/program/src/instructions/mod.rs +++ b/program/src/instructions/mod.rs @@ -1,9 +1,7 @@ -pub mod client; -pub mod init_mint; -pub mod init_mint_manager; -pub mod token; +pub mod mint_manager; +pub use mint_manager::init_mint_manager::*; +pub use mint_manager::update_mint_manager::*; -pub use client::*; -pub use init_mint::*; -pub use init_mint_manager::*; -pub use token::*; +pub mod standard; +pub use standard::init_standard::*; +pub use standard::update_standard::*; diff --git a/program/src/instructions/standard/init_standard.rs b/program/src/instructions/standard/init_standard.rs new file mode 100644 index 00000000..b0df14c3 --- /dev/null +++ b/program/src/instructions/standard/init_standard.rs @@ -0,0 +1,39 @@ +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitStandardIx { + pub check_seller_fee_basis_points: bool, + pub name: String, + pub disallowed_programs: Vec<Pubkey>, + pub allowed_programs: Vec<Pubkey>, +} + +#[derive(Accounts)] +#[instruction(ix: InitStandardIx)] +pub struct InitStandardCtx<'info> { + #[account( + init, + payer = payer, + space = STANDARD_SIZE, + seeds = [STANDARD_SEED.as_bytes(), ix.name.as_bytes()], + bump, + )] + standard: Account<'info, Standard>, + authority: Signer<'info>, + #[account(mut)] + payer: Signer<'info>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<InitStandardCtx>, ix: InitStandardIx) -> Result<()> { + let standard = &mut ctx.accounts.standard; + standard.bump = *ctx.bumps.get("standard").unwrap(); + standard.version = 0; + standard.authority = ctx.accounts.authority.key(); + standard.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; + standard.name = ix.name; + standard.allowed_programs = ix.allowed_programs; + standard.disallowed_programs = ix.disallowed_programs; + Ok(()) +} diff --git a/program/src/instructions/standard/mod.rs b/program/src/instructions/standard/mod.rs new file mode 100644 index 00000000..f5b159ba --- /dev/null +++ b/program/src/instructions/standard/mod.rs @@ -0,0 +1,5 @@ +pub mod init_standard; +pub use init_standard::*; + +pub mod update_standard; +pub use update_standard::*; diff --git a/program/src/instructions/standard/update_standard.rs b/program/src/instructions/standard/update_standard.rs new file mode 100644 index 00000000..0d4a8de8 --- /dev/null +++ b/program/src/instructions/standard/update_standard.rs @@ -0,0 +1,28 @@ +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct UpdateStandardIx { + pub check_seller_fee_basis_points: bool, + pub disallowed_programs: Vec<Pubkey>, + pub allowed_programs: Vec<Pubkey>, +} + +#[derive(Accounts)] +#[instruction(ix: UpdateStandardIx)] +pub struct UpdateStandardCtx<'info> { + #[account(mut)] + standard: Account<'info, Standard>, + #[account(constraint = authority.key() == standard.authority @ ErrorCode::InvalidAuthority)] + authority: Signer<'info>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<UpdateStandardCtx>, ix: UpdateStandardIx) -> Result<()> { + let standard = &mut ctx.accounts.standard; + standard.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; + standard.allowed_programs = ix.allowed_programs; + standard.disallowed_programs = ix.disallowed_programs; + Ok(()) +} diff --git a/program/src/instructions/token.rs b/program/src/instructions/token.rs deleted file mode 100644 index b79d4e64..00000000 --- a/program/src/instructions/token.rs +++ /dev/null @@ -1,174 +0,0 @@ -use solana_program::account_info::AccountInfo; -use solana_program::entrypoint::ProgramResult; -use solana_program::program::invoke; -use solana_program::program::invoke_signed; -use solana_program::pubkey::Pubkey; - -pub fn initialize_mint<'a, 'b>( - freeze_authority: &Pubkey, - mint_authority: &Pubkey, - mint: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, - decimals: u8, -) -> ProgramResult { - invoke( - &spl_token::instruction::initialize_mint2( - token_program.key, - mint.key, - mint_authority, - Some(freeze_authority), - decimals, - )?, - &[token_program.clone(), mint.clone()], - ) -} - -pub fn thaw<'a, 'b>( - freeze_authority: &'a AccountInfo<'b>, - mint: &'a AccountInfo<'b>, - target: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, - seeds: &[Vec<u8>], -) -> ProgramResult { - invoke_signed( - &spl_token::instruction::thaw_account( - token_program.key, - target.key, - mint.key, - freeze_authority.key, - &[], - )?, - &[ - token_program.clone(), - mint.clone(), - freeze_authority.clone(), - target.clone(), - ], - &[&seeds.iter().map(|s| s.as_slice()).collect::<Vec<&[u8]>>()], - ) -} - -pub fn freeze<'a, 'b>( - freeze_authority: &'a AccountInfo<'b>, - mint: &'a AccountInfo<'b>, - target: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, - seeds: &[Vec<u8>], -) -> ProgramResult { - invoke_signed( - &spl_token::instruction::freeze_account( - token_program.key, - target.key, - mint.key, - freeze_authority.key, - &[], - )?, - &[ - token_program.clone(), - mint.clone(), - freeze_authority.clone(), - target.clone(), - ], - &[&seeds.iter().map(|s| s.as_slice()).collect::<Vec<&[u8]>>()], - ) -} - -pub fn transfer<'a, 'b>( - src: &'a AccountInfo<'b>, - dst: &'a AccountInfo<'b>, - owner: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, - amount: u64, -) -> ProgramResult { - invoke( - &spl_token::instruction::transfer( - token_program.key, - src.key, - dst.key, - owner.key, - &[], - amount, - )?, - &[ - token_program.clone(), - src.clone(), - dst.clone(), - owner.clone(), - ], - ) -} - -pub fn mint_to<'a, 'b>( - mint: &'a AccountInfo<'b>, - account: &'a AccountInfo<'b>, - owner: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, - amount: u64, - seeds: &[Vec<u8>], -) -> ProgramResult { - invoke_signed( - &spl_token::instruction::mint_to( - token_program.key, - mint.key, - account.key, - owner.key, - &[], - amount, - )?, - &[ - token_program.clone(), - mint.clone(), - account.clone(), - owner.clone(), - ], - &[&seeds.iter().map(|s| s.as_slice()).collect::<Vec<&[u8]>>()], - ) -} - -pub fn burn<'a, 'b>( - mint: &'a AccountInfo<'b>, - account: &'a AccountInfo<'b>, - owner: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, - amount: u64, -) -> ProgramResult { - invoke( - &spl_token::instruction::burn( - token_program.key, - account.key, - mint.key, - owner.key, - &[], - amount, - )?, - &[ - token_program.clone(), - mint.clone(), - account.clone(), - owner.clone(), - ], - ) -} - -pub fn close<'a, 'b>( - account: &'a AccountInfo<'b>, - destination: &'a AccountInfo<'b>, - owner: &'a AccountInfo<'b>, - token_program: &'a AccountInfo<'b>, -) -> ProgramResult { - invoke( - &spl_token::instruction::close_account( - token_program.key, - account.key, - destination.key, - owner.key, - &[], - )?, - &[ - token_program.clone(), - destination.clone(), - account.clone(), - owner.clone(), - ], - ) -} diff --git a/program/src/instructions/token/approve.rs b/program/src/instructions/token/approve.rs new file mode 100644 index 00000000..7644c823 --- /dev/null +++ b/program/src/instructions/token/approve.rs @@ -0,0 +1 @@ +// avi diff --git a/program/src/instructions/token/burn.rs b/program/src/instructions/token/burn.rs new file mode 100644 index 00000000..024d9ffc --- /dev/null +++ b/program/src/instructions/token/burn.rs @@ -0,0 +1 @@ +// giannis diff --git a/program/src/instructions/token/close.rs b/program/src/instructions/token/close.rs new file mode 100644 index 00000000..024d9ffc --- /dev/null +++ b/program/src/instructions/token/close.rs @@ -0,0 +1 @@ +// giannis diff --git a/program/src/instructions/token/init_account.rs b/program/src/instructions/token/init_account.rs new file mode 100644 index 00000000..083c3f66 --- /dev/null +++ b/program/src/instructions/token/init_account.rs @@ -0,0 +1 @@ +// bogle \ No newline at end of file diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs new file mode 100644 index 00000000..4a780b68 --- /dev/null +++ b/program/src/instructions/token/init_mint.rs @@ -0,0 +1 @@ +// giannis \ No newline at end of file diff --git a/program/src/state/ruleset.rs b/program/src/instructions/token/post_transfer.rs similarity index 100% rename from program/src/state/ruleset.rs rename to program/src/instructions/token/post_transfer.rs diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs new file mode 100644 index 00000000..e69de29b diff --git a/program/src/instructions/token/revoke.rs b/program/src/instructions/token/revoke.rs new file mode 100644 index 00000000..7644c823 --- /dev/null +++ b/program/src/instructions/token/revoke.rs @@ -0,0 +1 @@ +// avi diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs new file mode 100644 index 00000000..083c3f66 --- /dev/null +++ b/program/src/instructions/token/transfer.rs @@ -0,0 +1 @@ +// bogle \ No newline at end of file diff --git a/program/src/lib.rs b/program/src/lib.rs index 3c3393a7..4fa0915e 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -1,61 +1,35 @@ -use borsh::BorshDeserialize; -use borsh::BorshSerialize; -use shank::ShankInstruction; -use solana_program::account_info::AccountInfo; -use solana_program::entrypoint::ProgramResult; -use solana_program::msg; -use solana_program::pubkey::Pubkey; - +pub mod errors; pub mod instructions; -pub mod pda; pub mod state; pub mod utils; +use anchor_lang::prelude::*; use instructions::*; -solana_program::declare_id!("mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS"); +solana_program::declare_id!("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez"); -#[cfg(not(feature = "no-entrypoint"))] -solana_program::entrypoint!(process_instruction); +#[program] +pub mod cardinal_creator_standard { + use super::*; -#[derive(Debug, Clone, ShankInstruction, BorshSerialize, BorshDeserialize)] -#[rustfmt::skip] -pub enum CreatorStandardInstruction { + // mint_manager + pub fn init_mint_manager(ctx: Context<InitMintManagerCtx>) -> Result<()> { + mint_manager::init_mint_manager::handler(ctx) + } - #[account(0, writable, name = "mint")] - #[account(1, writable, name = "mint_manager")] - #[account(2, writable, signer, name = "authority")] - #[account(3, writable, signer, name = "payer")] - #[account(4, name = "token_program", desc = "Token program")] - #[account(5, name = "system_program", desc = "System program")] - InitMint, + pub fn update_mint_manager( + ctx: Context<UpdateMintManagerCtx>, + ix: UpdateMintManagerIx, + ) -> Result<()> { + mint_manager::update_mint_manager::handler(ctx, ix) + } - #[account(0, writable, name = "mint")] - #[account(1, writable, name = "mint_manager")] - #[account(2, signer, name = "authority")] - #[account(3, name = "ruleset")] - #[account(4, writable, signer, name = "payer")] - #[account(5, name = "token_program", desc = "Token program")] - #[account(6, name = "system_program", desc = "System program")] - InitMintManager, -} + // standard + pub fn init_standard(ctx: Context<InitStandardCtx>, ix: InitStandardIx) -> Result<()> { + standard::init_standard::handler(ctx, ix) + } -pub fn process_instruction( - _program_id: &Pubkey, - accounts: &[AccountInfo], - instruction_data: &[u8], -) -> ProgramResult { - let instruction = CreatorStandardInstruction::try_from_slice(instruction_data)?; - match instruction { - CreatorStandardInstruction::InitMint => { - msg!("CreatorStandardInstruction::InitMint"); - let init_mint_ctx = InitMintCtx::load(accounts)?; - init_mint::handler(init_mint_ctx) - } - CreatorStandardInstruction::InitMintManager => { - msg!("CreatorStandardInstruction::InitMintManager"); - let ctx = InitMintManagerCtx::load(accounts)?; - init_mint_manager::handler(ctx) - } + pub fn update_standard(ctx: Context<UpdateStandardCtx>, ix: UpdateStandardIx) -> Result<()> { + standard::update_standard::handler(ctx, ix) } } diff --git a/program/src/pda.rs b/program/src/pda.rs deleted file mode 100644 index df9a1fb2..00000000 --- a/program/src/pda.rs +++ /dev/null @@ -1,7 +0,0 @@ -use solana_program::pubkey::Pubkey; - -use crate::state::MINT_MANAGER_SEED; - -pub fn find_mint_manager_address(mint: &Pubkey) -> (Pubkey, u8) { - Pubkey::find_program_address(&[MINT_MANAGER_SEED.as_bytes(), mint.as_ref()], &crate::id()) -} diff --git a/program/src/state.rs b/program/src/state.rs new file mode 100644 index 00000000..13d21694 --- /dev/null +++ b/program/src/state.rs @@ -0,0 +1,31 @@ +use anchor_lang::prelude::*; +use solana_program::pubkey::Pubkey; + +pub const CREATION_LAMPORTS: u64 = 5_000_000; +pub const CREATION_COLLECTOR: &str = "crkdpVWjHWdggGgBuSyAqSmZUmAjYLzD435tcLDRLXr"; + +pub const MINT_MANAGER_SEED: &str = "mint-manager"; +pub const MINT_MANAGER_SIZE: usize = 8 + std::mem::size_of::<MintManager>() + 8; + +#[account] +pub struct MintManager { + pub bump: u8, + pub version: u8, + pub mint: Pubkey, + pub authority: Pubkey, + pub standard: Pubkey, +} + +pub const STANDARD_SEED: &str = "standard"; +pub const STANDARD_SIZE: usize = 8 + 1 + 1 + 1 + 24 + (32 * 10) + (32 * 10); + +#[account] +pub struct Standard { + pub bump: u8, + pub version: u8, + pub authority: Pubkey, + pub check_seller_fee_basis_points: bool, + pub name: String, + pub disallowed_programs: Vec<Pubkey>, + pub allowed_programs: Vec<Pubkey>, +} diff --git a/program/src/state/mint_manager.rs b/program/src/state/mint_manager.rs deleted file mode 100644 index 0ce2658c..00000000 --- a/program/src/state/mint_manager.rs +++ /dev/null @@ -1,60 +0,0 @@ -use borsh::BorshDeserialize; -use borsh::BorshSerialize; -use shank::ShankAccount; -use solana_program::program_error::ProgramError; -use solana_program::pubkey::Pubkey; - -use crate::utils::assert_with_msg; - -pub const MINT_MANAGER_SEED: &str = "mint-manager"; -pub const MINT_MANAGER_SIZE: usize = std::mem::size_of::<MintManager>() + 8; - -#[inline] -pub fn mint_manager_seeds(mint_id: &Pubkey) -> (Pubkey, Vec<Vec<u8>>) { - let mut seeds = vec![ - MINT_MANAGER_SEED.as_bytes().to_vec(), - mint_id.as_ref().to_vec(), - ]; - let (key, bump) = Pubkey::find_program_address( - &seeds.iter().map(|s| s.as_slice()).collect::<Vec<&[u8]>>(), - &crate::id(), - ); - seeds.push(vec![bump]); - (key, seeds) -} - -#[inline] -pub fn assert_mint_manager_seeds( - mint_id: &Pubkey, - expected_key: &Pubkey, -) -> Result<Vec<Vec<u8>>, ProgramError> { - let (key, seeds) = mint_manager_seeds(mint_id); - assert_with_msg( - expected_key == &key, - ProgramError::InvalidInstructionData, - "Invalid mint manager seeds", - )?; - Ok(seeds) -} - -#[repr(C)] -#[cfg_attr(feature = "serde-feature", derive(Serialize, Deserialize))] -#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug, Clone, ShankAccount)] -pub struct MintManager { - pub account_type: u8, - pub version: u8, - pub mint: Pubkey, - pub authority: Pubkey, - pub ruleset: Pubkey, -} - -#[repr(C)] -#[cfg_attr(feature = "serde-feature", derive(Serialize, Deserialize))] -#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug, Clone, ShankAccount)] -pub struct MintManagerV2 { - pub account_type: u8, - pub version: u8, - pub mint: Pubkey, - pub authority: Pubkey, - pub ruleset: Pubkey, -} diff --git a/program/src/state/mod.rs b/program/src/state/mod.rs deleted file mode 100644 index 8edcd8aa..00000000 --- a/program/src/state/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod mint_manager; - -pub use mint_manager::*; diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh new file mode 100755 index 00000000..0fa720af --- /dev/null +++ b/sdk/generate-idls.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# This script generates the IDL JSONs without buildling the full packages. + +rm -rf src/idl/ +mkdir -p src/idl/ + +for PROGRAM in $(find programs/ -maxdepth 3 -name lib.rs); do + PROGRAM_NAME=$(dirname $PROGRAM | xargs dirname | xargs basename | tr '-' '_') + echo "Parsing IDL for $PROGRAM_NAME" + anchor idl parse --file $PROGRAM --out-ts src/idl/$PROGRAM_NAME.ts || { + echo "Could not parse IDL" + exit 1 + } +done diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index c1677738..17af65de 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -152,8 +152,8 @@ ], "metadata": { "origin": "shank", - "address": "mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS", + "address": "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez", "binaryVersion": "0.0.5", "libVersion": "^0.0.5" } -} \ No newline at end of file +} diff --git a/sdk/package.json b/sdk/package.json index e8d74ce6..a3c2aad1 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -6,6 +6,8 @@ "license": "MIT", "scripts": { "test": "jest --setupFiles dotenv/config", + "idl:generate": "./generate-idls.sh", + "docs:generate": "typedoc --excludePrivate --includeVersion --out site/ src/index.ts", "lint": "eslint . --ext .ts" }, "dependencies": { diff --git a/sdk/src/generated/accounts/MintManager.ts b/sdk/src/generated/accounts/MintManager.ts index 19cc78d5..a39f4ca0 100644 --- a/sdk/src/generated/accounts/MintManager.ts +++ b/sdk/src/generated/accounts/MintManager.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as web3 from '@solana/web3.js' -import * as beet from '@metaplex-foundation/beet' -import * as beetSolana from '@metaplex-foundation/beet-solana' +import * as web3 from "@solana/web3.js"; +import * as beet from "@metaplex-foundation/beet"; +import * as beetSolana from "@metaplex-foundation/beet-solana"; /** * Arguments used to create {@link MintManager} @@ -15,12 +15,12 @@ import * as beetSolana from '@metaplex-foundation/beet-solana' * @category generated */ export type MintManagerArgs = { - accountType: number - version: number - mint: web3.PublicKey - authority: web3.PublicKey - ruleset: web3.PublicKey -} + accountType: number; + version: number; + mint: web3.PublicKey; + authority: web3.PublicKey; + ruleset: web3.PublicKey; +}; /** * Holds the data for the {@link MintManager} Account and provides de/serialization * functionality for that data @@ -47,7 +47,7 @@ export class MintManager implements MintManagerArgs { args.mint, args.authority, args.ruleset - ) + ); } /** @@ -58,7 +58,7 @@ export class MintManager implements MintManagerArgs { accountInfo: web3.AccountInfo<Buffer>, offset = 0 ): [MintManager, number] { - return MintManager.deserialize(accountInfo.data, offset) + return MintManager.deserialize(accountInfo.data, offset); } /** @@ -71,11 +71,11 @@ export class MintManager implements MintManagerArgs { connection: web3.Connection, address: web3.PublicKey ): Promise<MintManager> { - const accountInfo = await connection.getAccountInfo(address) + const accountInfo = await connection.getAccountInfo(address); if (accountInfo == null) { - throw new Error(`Unable to find MintManager account at ${address}`) + throw new Error(`Unable to find MintManager account at ${address}`); } - return MintManager.fromAccountInfo(accountInfo, 0)[0] + return MintManager.fromAccountInfo(accountInfo, 0)[0]; } /** @@ -86,10 +86,10 @@ export class MintManager implements MintManagerArgs { */ static gpaBuilder( programId: web3.PublicKey = new web3.PublicKey( - 'mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS' + "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez" ) ) { - return beetSolana.GpaBuilder.fromStruct(programId, mintManagerBeet) + return beetSolana.GpaBuilder.fromStruct(programId, mintManagerBeet); } /** @@ -97,7 +97,7 @@ export class MintManager implements MintManagerArgs { * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. */ static deserialize(buf: Buffer, offset = 0): [MintManager, number] { - return mintManagerBeet.deserialize(buf, offset) + return mintManagerBeet.deserialize(buf, offset); } /** @@ -105,7 +105,7 @@ export class MintManager implements MintManagerArgs { * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. */ serialize(): [Buffer, number] { - return mintManagerBeet.serialize(this) + return mintManagerBeet.serialize(this); } /** @@ -113,7 +113,7 @@ export class MintManager implements MintManagerArgs { * {@link MintManager} */ static get byteSize() { - return mintManagerBeet.byteSize + return mintManagerBeet.byteSize; } /** @@ -129,7 +129,7 @@ export class MintManager implements MintManagerArgs { return connection.getMinimumBalanceForRentExemption( MintManager.byteSize, commitment - ) + ); } /** @@ -137,7 +137,7 @@ export class MintManager implements MintManagerArgs { * hold {@link MintManager} data. */ static hasCorrectByteSize(buf: Buffer, offset = 0) { - return buf.byteLength - offset === MintManager.byteSize + return buf.byteLength - offset === MintManager.byteSize; } /** @@ -151,7 +151,7 @@ export class MintManager implements MintManagerArgs { mint: this.mint.toBase58(), authority: this.authority.toBase58(), ruleset: this.ruleset.toBase58(), - } + }; } } @@ -164,12 +164,12 @@ export const mintManagerBeet = new beet.BeetStruct< MintManagerArgs >( [ - ['accountType', beet.u8], - ['version', beet.u8], - ['mint', beetSolana.publicKey], - ['authority', beetSolana.publicKey], - ['ruleset', beetSolana.publicKey], + ["accountType", beet.u8], + ["version", beet.u8], + ["mint", beetSolana.publicKey], + ["authority", beetSolana.publicKey], + ["ruleset", beetSolana.publicKey], ], MintManager.fromArgs, - 'MintManager' -) + "MintManager" +); diff --git a/sdk/src/generated/accounts/MintManagerV2.ts b/sdk/src/generated/accounts/MintManagerV2.ts index 97ef4a0e..823ac38d 100644 --- a/sdk/src/generated/accounts/MintManagerV2.ts +++ b/sdk/src/generated/accounts/MintManagerV2.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as web3 from '@solana/web3.js' -import * as beet from '@metaplex-foundation/beet' -import * as beetSolana from '@metaplex-foundation/beet-solana' +import * as web3 from "@solana/web3.js"; +import * as beet from "@metaplex-foundation/beet"; +import * as beetSolana from "@metaplex-foundation/beet-solana"; /** * Arguments used to create {@link MintManagerV2} @@ -15,12 +15,12 @@ import * as beetSolana from '@metaplex-foundation/beet-solana' * @category generated */ export type MintManagerV2Args = { - accountType: number - version: number - mint: web3.PublicKey - authority: web3.PublicKey - ruleset: web3.PublicKey -} + accountType: number; + version: number; + mint: web3.PublicKey; + authority: web3.PublicKey; + ruleset: web3.PublicKey; +}; /** * Holds the data for the {@link MintManagerV2} Account and provides de/serialization * functionality for that data @@ -47,7 +47,7 @@ export class MintManagerV2 implements MintManagerV2Args { args.mint, args.authority, args.ruleset - ) + ); } /** @@ -58,7 +58,7 @@ export class MintManagerV2 implements MintManagerV2Args { accountInfo: web3.AccountInfo<Buffer>, offset = 0 ): [MintManagerV2, number] { - return MintManagerV2.deserialize(accountInfo.data, offset) + return MintManagerV2.deserialize(accountInfo.data, offset); } /** @@ -71,11 +71,11 @@ export class MintManagerV2 implements MintManagerV2Args { connection: web3.Connection, address: web3.PublicKey ): Promise<MintManagerV2> { - const accountInfo = await connection.getAccountInfo(address) + const accountInfo = await connection.getAccountInfo(address); if (accountInfo == null) { - throw new Error(`Unable to find MintManagerV2 account at ${address}`) + throw new Error(`Unable to find MintManagerV2 account at ${address}`); } - return MintManagerV2.fromAccountInfo(accountInfo, 0)[0] + return MintManagerV2.fromAccountInfo(accountInfo, 0)[0]; } /** @@ -86,10 +86,10 @@ export class MintManagerV2 implements MintManagerV2Args { */ static gpaBuilder( programId: web3.PublicKey = new web3.PublicKey( - 'mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS' + "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez" ) ) { - return beetSolana.GpaBuilder.fromStruct(programId, mintManagerV2Beet) + return beetSolana.GpaBuilder.fromStruct(programId, mintManagerV2Beet); } /** @@ -97,7 +97,7 @@ export class MintManagerV2 implements MintManagerV2Args { * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. */ static deserialize(buf: Buffer, offset = 0): [MintManagerV2, number] { - return mintManagerV2Beet.deserialize(buf, offset) + return mintManagerV2Beet.deserialize(buf, offset); } /** @@ -105,7 +105,7 @@ export class MintManagerV2 implements MintManagerV2Args { * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. */ serialize(): [Buffer, number] { - return mintManagerV2Beet.serialize(this) + return mintManagerV2Beet.serialize(this); } /** @@ -113,7 +113,7 @@ export class MintManagerV2 implements MintManagerV2Args { * {@link MintManagerV2} */ static get byteSize() { - return mintManagerV2Beet.byteSize + return mintManagerV2Beet.byteSize; } /** @@ -129,7 +129,7 @@ export class MintManagerV2 implements MintManagerV2Args { return connection.getMinimumBalanceForRentExemption( MintManagerV2.byteSize, commitment - ) + ); } /** @@ -137,7 +137,7 @@ export class MintManagerV2 implements MintManagerV2Args { * hold {@link MintManagerV2} data. */ static hasCorrectByteSize(buf: Buffer, offset = 0) { - return buf.byteLength - offset === MintManagerV2.byteSize + return buf.byteLength - offset === MintManagerV2.byteSize; } /** @@ -151,7 +151,7 @@ export class MintManagerV2 implements MintManagerV2Args { mint: this.mint.toBase58(), authority: this.authority.toBase58(), ruleset: this.ruleset.toBase58(), - } + }; } } @@ -164,12 +164,12 @@ export const mintManagerV2Beet = new beet.BeetStruct< MintManagerV2Args >( [ - ['accountType', beet.u8], - ['version', beet.u8], - ['mint', beetSolana.publicKey], - ['authority', beetSolana.publicKey], - ['ruleset', beetSolana.publicKey], + ["accountType", beet.u8], + ["version", beet.u8], + ["mint", beetSolana.publicKey], + ["authority", beetSolana.publicKey], + ["ruleset", beetSolana.publicKey], ], MintManagerV2.fromArgs, - 'MintManagerV2' -) + "MintManagerV2" +); diff --git a/sdk/src/generated/index.ts b/sdk/src/generated/index.ts index 083bf7c9..8ad81bc0 100644 --- a/sdk/src/generated/index.ts +++ b/sdk/src/generated/index.ts @@ -1,6 +1,6 @@ -import { PublicKey } from '@solana/web3.js' -export * from './accounts' -export * from './instructions' +import { PublicKey } from "@solana/web3.js"; +export * from "./accounts"; +export * from "./instructions"; /** * Program address @@ -8,7 +8,7 @@ export * from './instructions' * @category constants * @category generated */ -export const PROGRAM_ADDRESS = 'mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS' +export const PROGRAM_ADDRESS = "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez"; /** * Program public key @@ -16,4 +16,4 @@ export const PROGRAM_ADDRESS = 'mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS' * @category constants * @category generated */ -export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS) +export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS); diff --git a/sdk/src/generated/instructions/InitMint.ts b/sdk/src/generated/instructions/InitMint.ts index 302bee8a..ec75d1ad 100644 --- a/sdk/src/generated/instructions/InitMint.ts +++ b/sdk/src/generated/instructions/InitMint.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as splToken from '@solana/spl-token' -import * as beet from '@metaplex-foundation/beet' -import * as web3 from '@solana/web3.js' +import * as splToken from "@solana/spl-token"; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; /** * @category Instructions @@ -15,8 +15,8 @@ import * as web3 from '@solana/web3.js' * @category generated */ export const InitMintStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number -}>([['instructionDiscriminator', beet.u8]], 'InitMintInstructionArgs') + instructionDiscriminator: number; +}>([["instructionDiscriminator", beet.u8]], "InitMintInstructionArgs"); /** * Accounts required by the _InitMint_ instruction * @@ -29,15 +29,15 @@ export const InitMintStruct = new beet.BeetArgsStruct<{ * @category generated */ export type InitMintInstructionAccounts = { - mint: web3.PublicKey - mintManager: web3.PublicKey - authority: web3.PublicKey - payer: web3.PublicKey - tokenProgram?: web3.PublicKey - systemProgram?: web3.PublicKey -} + mint: web3.PublicKey; + mintManager: web3.PublicKey; + authority: web3.PublicKey; + payer: web3.PublicKey; + tokenProgram?: web3.PublicKey; + systemProgram?: web3.PublicKey; +}; -export const initMintInstructionDiscriminator = 0 +export const initMintInstructionDiscriminator = 0; /** * Creates a _InitMint_ instruction. @@ -49,11 +49,11 @@ export const initMintInstructionDiscriminator = 0 */ export function createInitMintInstruction( accounts: InitMintInstructionAccounts, - programId = new web3.PublicKey('mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS') + programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") ) { const [data] = InitMintStruct.serialize({ instructionDiscriminator: initMintInstructionDiscriminator, - }) + }); const keys: web3.AccountMeta[] = [ { pubkey: accounts.mint, @@ -85,12 +85,12 @@ export function createInitMintInstruction( isWritable: false, isSigner: false, }, - ] + ]; const ix = new web3.TransactionInstruction({ programId, keys, data, - }) - return ix + }); + return ix; } diff --git a/sdk/src/generated/instructions/InitMintManager.ts b/sdk/src/generated/instructions/InitMintManager.ts index 9a2fad81..556a416e 100644 --- a/sdk/src/generated/instructions/InitMintManager.ts +++ b/sdk/src/generated/instructions/InitMintManager.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as splToken from '@solana/spl-token' -import * as beet from '@metaplex-foundation/beet' -import * as web3 from '@solana/web3.js' +import * as splToken from "@solana/spl-token"; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; /** * @category Instructions @@ -15,8 +15,8 @@ import * as web3 from '@solana/web3.js' * @category generated */ export const InitMintManagerStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number -}>([['instructionDiscriminator', beet.u8]], 'InitMintManagerInstructionArgs') + instructionDiscriminator: number; +}>([["instructionDiscriminator", beet.u8]], "InitMintManagerInstructionArgs"); /** * Accounts required by the _InitMintManager_ instruction * @@ -30,16 +30,16 @@ export const InitMintManagerStruct = new beet.BeetArgsStruct<{ * @category generated */ export type InitMintManagerInstructionAccounts = { - mint: web3.PublicKey - mintManager: web3.PublicKey - authority: web3.PublicKey - ruleset: web3.PublicKey - payer: web3.PublicKey - tokenProgram?: web3.PublicKey - systemProgram?: web3.PublicKey -} + mint: web3.PublicKey; + mintManager: web3.PublicKey; + authority: web3.PublicKey; + ruleset: web3.PublicKey; + payer: web3.PublicKey; + tokenProgram?: web3.PublicKey; + systemProgram?: web3.PublicKey; +}; -export const initMintManagerInstructionDiscriminator = 1 +export const initMintManagerInstructionDiscriminator = 1; /** * Creates a _InitMintManager_ instruction. @@ -51,11 +51,11 @@ export const initMintManagerInstructionDiscriminator = 1 */ export function createInitMintManagerInstruction( accounts: InitMintManagerInstructionAccounts, - programId = new web3.PublicKey('mTok58Lg4YfcmwqyrDHpf7ogp599WRhzb6PxjaBqAxS') + programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") ) { const [data] = InitMintManagerStruct.serialize({ instructionDiscriminator: initMintManagerInstructionDiscriminator, - }) + }); const keys: web3.AccountMeta[] = [ { pubkey: accounts.mint, @@ -92,12 +92,12 @@ export function createInitMintManagerInstruction( isWritable: false, isSigner: false, }, - ] + ]; const ix = new web3.TransactionInstruction({ programId, keys, data, - }) - return ix + }); + return ix; } From 6887c66d16a871144e2704a8d6cdb4ac13efcbe5 Mon Sep 17 00:00:00 2001 From: Giannis Chatziveroglou <gchatz@mit.edu> Date: Thu, 20 Oct 2022 15:48:18 -0700 Subject: [PATCH 02/37] add mod.rs --- program/src/instructions/mint_manager/mod.rs | 4 ++-- program/src/instructions/mod.rs | 11 +++++++++++ program/src/instructions/token/init_mint.rs | 2 +- program/src/instructions/token/mod.rs | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 program/src/instructions/token/mod.rs diff --git a/program/src/instructions/mint_manager/mod.rs b/program/src/instructions/mint_manager/mod.rs index e2ac98fd..0a931f48 100644 --- a/program/src/instructions/mint_manager/mod.rs +++ b/program/src/instructions/mint_manager/mod.rs @@ -1,5 +1,5 @@ pub mod init_mint_manager; -pub use init_mint_manager::*; - pub mod update_mint_manager; + +pub use init_mint_manager::*; pub use update_mint_manager::*; diff --git a/program/src/instructions/mod.rs b/program/src/instructions/mod.rs index df76ad76..786f3d6e 100644 --- a/program/src/instructions/mod.rs +++ b/program/src/instructions/mod.rs @@ -5,3 +5,14 @@ pub use mint_manager::update_mint_manager::*; pub mod standard; pub use standard::init_standard::*; pub use standard::update_standard::*; + +pub mod token; +pub use token::approve; +pub use token::burn; +pub use token::close; +pub use token::init_account; +pub use token::init_mint; +pub use token::post_transfer; +pub use token::pre_transfer; +pub use token::revoke; +pub use token::transfer; diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index 4a780b68..024d9ffc 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -1 +1 @@ -// giannis \ No newline at end of file +// giannis diff --git a/program/src/instructions/token/mod.rs b/program/src/instructions/token/mod.rs new file mode 100644 index 00000000..18ccb741 --- /dev/null +++ b/program/src/instructions/token/mod.rs @@ -0,0 +1,19 @@ +pub mod approve; +pub mod burn; +pub mod close; +pub mod init_account; +pub mod init_mint; +pub mod post_transfer; +pub mod pre_transfer; +pub mod revoke; +pub mod transfer; + +pub use approve::*; +pub use burn::*; +pub use close::*; +pub use init_account::*; +pub use init_mint::*; +pub use post_transfer::*; +pub use pre_transfer::*; +pub use revoke::*; +pub use transfer::*; From 330caf3080eb730b8312b24aae165516185cd372 Mon Sep 17 00:00:00 2001 From: Giannis Chatziveroglou <gchatz@mit.edu> Date: Thu, 20 Oct 2022 19:08:00 -0700 Subject: [PATCH 03/37] instructions --- program/src/errors.rs | 10 ++ .../mint_manager/init_mint_manager.rs | 4 +- program/src/instructions/token/approve.rs | 73 +++++++++- program/src/instructions/token/burn.rs | 68 ++++++++- program/src/instructions/token/close.rs | 32 +++++ program/src/instructions/token/init_mint.rs | 135 +++++++++++++++++- program/src/instructions/token/revoke.rs | 69 ++++++++- rustfmt.toml | 1 + 8 files changed, 386 insertions(+), 6 deletions(-) create mode 100644 rustfmt.toml diff --git a/program/src/errors.rs b/program/src/errors.rs index 6cd80877..ff1ba82c 100644 --- a/program/src/errors.rs +++ b/program/src/errors.rs @@ -8,4 +8,14 @@ pub enum ErrorCode { InvalidCollector, #[msg("Invalid authority address")] InvalidAuthority, + #[msg("Invalid mint")] + InvaldiMint, + #[msg("Invalid holder token account")] + InvlaidHolderTokenAccount, + #[msg("Invalid target token account")] + InvalidTargetTokenAccount, + #[msg("Invalid token account to close")] + InvalidCloseTokenAccount, + #[msg("Invalid holder token account")] + InvalidHolderTokenAccount, } diff --git a/program/src/instructions/mint_manager/init_mint_manager.rs b/program/src/instructions/mint_manager/init_mint_manager.rs index 3a866579..80cadac3 100644 --- a/program/src/instructions/mint_manager/init_mint_manager.rs +++ b/program/src/instructions/mint_manager/init_mint_manager.rs @@ -11,8 +11,6 @@ use spl_token::instruction::AuthorityType; #[derive(Accounts)] pub struct InitMintManagerCtx<'info> { - #[account(mut)] - mint: Account<'info, Mint>, #[account( init, payer = payer, @@ -21,6 +19,8 @@ pub struct InitMintManagerCtx<'info> { bump, )] mint_manager: Account<'info, MintManager>, + #[account(mut)] + mint: Account<'info, Mint>, standard: Account<'info, Standard>, /// CHECK: Account is not read from diff --git a/program/src/instructions/token/approve.rs b/program/src/instructions/token/approve.rs index 7644c823..bda26089 100644 --- a/program/src/instructions/token/approve.rs +++ b/program/src/instructions/token/approve.rs @@ -1 +1,72 @@ -// avi +use anchor_spl::token::{self, Approve, FreezeAccount, Mint, ThawAccount, Token, TokenAccount}; +use mpl_token_metadata::utils::assert_derivation; + +use { + crate::{errors::ErrorCode, state::*}, + anchor_lang::prelude::*, +}; + +#[derive(Accounts)] +pub struct ApproveCtx<'info> { + #[account(mut, seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], bump)] + mint_manager: Box<Account<'info, MintManager>>, + #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMint)] + mint: Box<Account<'info, Mint>>, + + #[account(mut, constraint = + holder_token_account.owner == holder.key() + && holder_token_account.mint == mint_manager.mint + && holder_token_account.amount > 1 + && holder_token_account.delegate.is_none() + @ ErrorCode::InvalidHolderTokenAccount + )] + holder_token_account: Box<Account<'info, TokenAccount>>, + #[account(mut)] + holder: Signer<'info>, + /// CHECK: Account is not read from + #[account(mut)] + delegate: UncheckedAccount<'info>, + + token_program: Program<'info, Token>, +} + +pub fn handler(ctx: Context<ApproveCtx>) -> Result<()> { + let mint = ctx.accounts.mint.key(); + let path = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref()]; + let bump_seed = assert_derivation( + ctx.program_id, + &ctx.accounts.mint_manager.to_account_info(), + path, + )?; + let mint_manager_seeds = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref(), &[bump_seed]]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + + let cpi_accounts = ThawAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::thaw_account(cpi_context)?; + + let cpi_accounts = Approve { + to: ctx.accounts.holder_token_account.to_account_info(), + delegate: ctx.accounts.delegate.to_account_info(), + authority: ctx.accounts.holder.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::approve(cpi_context, 1)?; + + let cpi_accounts = FreezeAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::freeze_account(cpi_context)?; + + Ok(()) +} diff --git a/program/src/instructions/token/burn.rs b/program/src/instructions/token/burn.rs index 024d9ffc..a3935872 100644 --- a/program/src/instructions/token/burn.rs +++ b/program/src/instructions/token/burn.rs @@ -1 +1,67 @@ -// giannis +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_spl::token::{self, Burn, CloseAccount, Mint, ThawAccount, Token, TokenAccount}; + +#[derive(Accounts)] +pub struct BurnCtx<'info> { + #[account(mut, close = holder, constraint = mint_manager.mint == mint.key() @ ErrorCode::InvalidMint)] + mint_manager: Account<'info, MintManager>, + #[account(mut)] + mint: Account<'info, Mint>, + + #[account(mut, constraint = + holder_token_account.owner == holder.key() + && holder_token_account.mint == mint.key() + && holder_token_account.amount == 1 @ ErrorCode::InvlaidHolderTokenAccount)] + holder_token_account: Account<'info, TokenAccount>, + holder: Signer<'info>, + + token_program: Program<'info, Token>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<BurnCtx>) -> Result<()> { + let mint_manager_key = ctx.accounts.mint.key(); + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint_manager_key.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + + if ctx.accounts.mint.supply > 1 + || ctx.accounts.mint.supply != ctx.accounts.holder_token_account.amount + { + return Err(error!(ErrorCode::InvalidMint)); + } + + let cpi_accounts = ThawAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::thaw_account(cpi_context)?; + + let cpi_accounts = Burn { + mint: ctx.accounts.mint.to_account_info(), + from: ctx.accounts.holder_token_account.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::burn(cpi_context, 1)?; + + let cpi_accounts = CloseAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + destination: ctx.accounts.holder.to_account_info(), + authority: ctx.accounts.holder.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::close_account(cpi_context)?; + + Ok(()) +} diff --git a/program/src/instructions/token/close.rs b/program/src/instructions/token/close.rs index 024d9ffc..c7730495 100644 --- a/program/src/instructions/token/close.rs +++ b/program/src/instructions/token/close.rs @@ -1 +1,33 @@ // giannis +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_spl::token::{self, CloseAccount, Token, TokenAccount}; + +#[derive(Accounts)] +pub struct CloseCtx<'info> { + mint_manager: Account<'info, MintManager>, + /// CHECK: Account is not read from + #[account(mut)] + mint: UncheckedAccount<'info>, + + #[account(mut, constraint = token_account.owner == owner.key() @ ErrorCode::InvalidCloseTokenAccount)] + token_account: Account<'info, TokenAccount>, + owner: Signer<'info>, + + token_program: Program<'info, Token>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<CloseCtx>) -> Result<()> { + let cpi_accounts = CloseAccount { + account: ctx.accounts.token_account.to_account_info(), + destination: ctx.accounts.owner.to_account_info(), + authority: ctx.accounts.owner.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::close_account(cpi_context)?; + + Ok(()) +} diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index 024d9ffc..1aa4d448 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -1 +1,134 @@ -// giannis +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_lang::solana_program::program::invoke; +use anchor_spl::associated_token::{self, AssociatedToken}; +use anchor_spl::token::TokenAccount; +use anchor_spl::token::{self}; +use anchor_spl::token::{MintTo, Token}; +use solana_program::program_pack::Pack; +use solana_program::system_instruction::create_account; +use spl_associated_token_account::get_associated_token_address; + +#[derive(Accounts)] +pub struct InitMintCtx<'info> { + #[account( + init, + payer = payer, + space = MINT_MANAGER_SIZE, + seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], + bump, + )] + mint_manager: Account<'info, MintManager>, + /// CHECK: Account is not read from + #[account(mut)] + mint: UncheckedAccount<'info>, + standard: Account<'info, Standard>, + + /// CHECK: Account created or checked in handler + #[account(mut)] + target_token_account: Account<'info, TokenAccount>, + target: Signer<'info>, + + /// CHECK: Account is not read from + #[account(mut)] + collector: UncheckedAccount<'info>, + authority: Signer<'info>, + #[account(mut)] + payer: Signer<'info>, + + rent: Sysvar<'info, Rent>, + token_program: Program<'info, Token>, + associated_token_program: Program<'info, AssociatedToken>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { + let mint_manager = &mut ctx.accounts.mint_manager; + mint_manager.bump = *ctx.bumps.get("mint_manager").unwrap(); + mint_manager.version = 0; + mint_manager.authority = ctx.accounts.authority.key(); + mint_manager.mint = ctx.accounts.mint.key(); + mint_manager.standard = ctx.accounts.standard.key(); + + // Create Mint + invoke( + &create_account( + ctx.accounts.payer.key, + ctx.accounts.mint.key, + ctx.accounts + .rent + .minimum_balance(spl_token::state::Mint::LEN), + spl_token::state::Mint::LEN as u64, + &spl_token::id(), + ), + &[ + ctx.accounts.payer.to_account_info(), + ctx.accounts.mint.to_account_info(), + ], + )?; + + // Initialize mint + let cpi_accounts = token::InitializeMint { + mint: ctx.accounts.mint.to_account_info(), + rent: ctx.accounts.rent.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::initialize_mint( + cpi_context, + 0, + &ctx.accounts.mint_manager.key(), + Some(&ctx.accounts.mint_manager.key()), + )?; + + // Check/Create ATA + let associated_token_account = + get_associated_token_address(&ctx.accounts.target.key(), &ctx.accounts.mint.key()); + if associated_token_account != ctx.accounts.target_token_account.key() { + return Err(error!(ErrorCode::InvalidTargetTokenAccount)); + } + if ctx + .accounts + .target_token_account + .to_account_info() + .data_is_empty() + { + let cpi_accounts = associated_token::Create { + payer: ctx.accounts.payer.to_account_info(), + associated_token: ctx.accounts.target_token_account.to_account_info(), + authority: ctx.accounts.target.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + system_program: ctx.accounts.system_program.to_account_info(), + token_program: ctx.accounts.token_program.to_account_info(), + rent: ctx.accounts.rent.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + associated_token::create(cpi_context)?; + } else if ctx.accounts.target_token_account.mint != ctx.accounts.mint_manager.mint + || ctx.accounts.target_token_account.owner != ctx.accounts.target.key() + || ctx.accounts.target_token_account.amount != 0 + { + return Err(error!(ErrorCode::InvalidTargetTokenAccount)); + } + + // mint to + let mint_manager_key = ctx.accounts.mint.key(); + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint_manager_key.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + let cpi_accounts = MintTo { + mint: ctx.accounts.mint.to_account_info(), + to: ctx.accounts.target_token_account.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::mint_to(cpi_context, 1)?; + + Ok(()) +} diff --git a/program/src/instructions/token/revoke.rs b/program/src/instructions/token/revoke.rs index 7644c823..802e7f45 100644 --- a/program/src/instructions/token/revoke.rs +++ b/program/src/instructions/token/revoke.rs @@ -1 +1,68 @@ -// avi +use anchor_spl::token::{self, FreezeAccount, Mint, Revoke, ThawAccount, Token, TokenAccount}; +use mpl_token_metadata::utils::assert_derivation; + +use { + crate::{errors::ErrorCode, state::*}, + anchor_lang::prelude::*, +}; + +#[derive(Accounts)] +pub struct RevokeCtx<'info> { + #[account(mut, seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], bump)] + mint_manager: Account<'info, MintManager>, + #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMint)] + mint: Box<Account<'info, Mint>>, + + #[account(mut, constraint = + holder_token_account.owner == holder.key() + && holder_token_account.mint == mint_manager.mint + && holder_token_account.amount > 1 + && holder_token_account.delegate.is_some() + @ ErrorCode::InvalidHolderTokenAccount + )] + holder_token_account: Box<Account<'info, TokenAccount>>, + #[account(mut)] + holder: Signer<'info>, + + token_program: Program<'info, Token>, +} + +pub fn handler(ctx: Context<RevokeCtx>) -> Result<()> { + let mint = ctx.accounts.mint.key(); + let path = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref()]; + let bump_seed = assert_derivation( + ctx.program_id, + &ctx.accounts.mint_manager.to_account_info(), + path, + )?; + let mint_manager_seeds = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref(), &[bump_seed]]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + + let cpi_accounts = ThawAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::thaw_account(cpi_context)?; + + let cpi_accounts = Revoke { + source: ctx.accounts.holder_token_account.to_account_info(), + authority: ctx.accounts.holder.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::revoke(cpi_context)?; + + let cpi_accounts = FreezeAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::freeze_account(cpi_context)?; + + Ok(()) +} diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..ffc467de --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +max_width = 200 From b7bbe32715904c15ac4e407f3ab00fda4649cefb Mon Sep 17 00:00:00 2001 From: Giannis Chatziveroglou <gchatz@mit.edu> Date: Thu, 20 Oct 2022 19:11:23 -0700 Subject: [PATCH 04/37] create idl --- sdk/generate-idls.sh | 6 +- sdk/idl/cardinal_creator_standard.json | 159 ------ sdk/idl/cardinal_creator_standard.ts | 649 +++++++++++++++++++++++++ 3 files changed, 652 insertions(+), 162 deletions(-) delete mode 100644 sdk/idl/cardinal_creator_standard.json create mode 100644 sdk/idl/cardinal_creator_standard.ts diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh index 0fa720af..ade33c8a 100755 --- a/sdk/generate-idls.sh +++ b/sdk/generate-idls.sh @@ -5,10 +5,10 @@ rm -rf src/idl/ mkdir -p src/idl/ -for PROGRAM in $(find programs/ -maxdepth 3 -name lib.rs); do - PROGRAM_NAME=$(dirname $PROGRAM | xargs dirname | xargs basename | tr '-' '_') +for PROGRAM in $(find ../program/ -maxdepth 3 -name lib.rs); do + PROGRAM_NAME="cardinal_creator_standard" echo "Parsing IDL for $PROGRAM_NAME" - anchor idl parse --file $PROGRAM --out-ts src/idl/$PROGRAM_NAME.ts || { + anchor idl parse --file $PROGRAM --out-ts idl/$PROGRAM_NAME.ts || { echo "Could not parse IDL" exit 1 } diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json deleted file mode 100644 index 17af65de..00000000 --- a/sdk/idl/cardinal_creator_standard.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "version": "0.1.0", - "name": "cardinal_creator_standard", - "instructions": [ - { - "name": "InitMint", - "accounts": [ - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": true, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false, - "desc": "Token program" - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false, - "desc": "System program" - } - ], - "args": [], - "discriminant": { - "type": "u8", - "value": 0 - } - }, - { - "name": "InitMintManager", - "accounts": [ - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false, - "desc": "Token program" - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false, - "desc": "System program" - } - ], - "args": [], - "discriminant": { - "type": "u8", - "value": 1 - } - } - ], - "accounts": [ - { - "name": "MintManager", - "type": { - "kind": "struct", - "fields": [ - { - "name": "accountType", - "type": "u8" - }, - { - "name": "version", - "type": "u8" - }, - { - "name": "mint", - "type": "publicKey" - }, - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "ruleset", - "type": "publicKey" - } - ] - } - }, - { - "name": "MintManagerV2", - "type": { - "kind": "struct", - "fields": [ - { - "name": "accountType", - "type": "u8" - }, - { - "name": "version", - "type": "u8" - }, - { - "name": "mint", - "type": "publicKey" - }, - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "ruleset", - "type": "publicKey" - } - ] - } - } - ], - "metadata": { - "origin": "shank", - "address": "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez", - "binaryVersion": "0.0.5", - "libVersion": "^0.0.5" - } -} diff --git a/sdk/idl/cardinal_creator_standard.ts b/sdk/idl/cardinal_creator_standard.ts new file mode 100644 index 00000000..c16ebfab --- /dev/null +++ b/sdk/idl/cardinal_creator_standard.ts @@ -0,0 +1,649 @@ +export type CardinalCreatorStandard = { + version: "0.1.0"; + name: "cardinal_creator_standard"; + instructions: [ + { + name: "initMintManager"; + accounts: [ + { + name: "mintManager"; + isMut: true; + isSigner: false; + }, + { + name: "mint"; + isMut: true; + isSigner: false; + }, + { + name: "standard"; + isMut: false; + isSigner: false; + }, + { + name: "collector"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + }, + { + name: "payer"; + isMut: true; + isSigner: true; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + } + ]; + args: []; + }, + { + name: "updateMintManager"; + accounts: [ + { + name: "mintManager"; + isMut: false; + isSigner: false; + }, + { + name: "standard"; + isMut: false; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "ix"; + type: { + defined: "UpdateMintManagerIx"; + }; + } + ]; + }, + { + name: "initStandard"; + accounts: [ + { + name: "standard"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + }, + { + name: "payer"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "ix"; + type: { + defined: "InitStandardIx"; + }; + } + ]; + }, + { + name: "updateStandard"; + accounts: [ + { + name: "standard"; + isMut: true; + isSigner: false; + }, + { + name: "authority"; + isMut: false; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + } + ]; + args: [ + { + name: "ix"; + type: { + defined: "UpdateStandardIx"; + }; + } + ]; + } + ]; + accounts: [ + { + name: "mintManager"; + type: { + kind: "struct"; + fields: [ + { + name: "bump"; + type: "u8"; + }, + { + name: "version"; + type: "u8"; + }, + { + name: "mint"; + type: "publicKey"; + }, + { + name: "authority"; + type: "publicKey"; + }, + { + name: "standard"; + type: "publicKey"; + } + ]; + }; + }, + { + name: "standard"; + type: { + kind: "struct"; + fields: [ + { + name: "bump"; + type: "u8"; + }, + { + name: "version"; + type: "u8"; + }, + { + name: "authority"; + type: "publicKey"; + }, + { + name: "checkSellerFeeBasisPoints"; + type: "bool"; + }, + { + name: "name"; + type: "string"; + }, + { + name: "disallowedPrograms"; + type: { + vec: "publicKey"; + }; + }, + { + name: "allowedPrograms"; + type: { + vec: "publicKey"; + }; + } + ]; + }; + } + ]; + types: [ + { + name: "UpdateMintManagerIx"; + type: { + kind: "struct"; + fields: [ + { + name: "authority"; + type: "publicKey"; + } + ]; + }; + }, + { + name: "InitStandardIx"; + type: { + kind: "struct"; + fields: [ + { + name: "checkSellerFeeBasisPoints"; + type: "bool"; + }, + { + name: "name"; + type: "string"; + }, + { + name: "disallowedPrograms"; + type: { + vec: "publicKey"; + }; + }, + { + name: "allowedPrograms"; + type: { + vec: "publicKey"; + }; + } + ]; + }; + }, + { + name: "UpdateStandardIx"; + type: { + kind: "struct"; + fields: [ + { + name: "checkSellerFeeBasisPoints"; + type: "bool"; + }, + { + name: "disallowedPrograms"; + type: { + vec: "publicKey"; + }; + }, + { + name: "allowedPrograms"; + type: { + vec: "publicKey"; + }; + } + ]; + }; + } + ]; + errors: [ + { + code: 6000; + name: "InvalidMint"; + msg: "Invalid mint"; + }, + { + code: 6001; + name: "InvalidCollector"; + msg: "Invalid collector address"; + }, + { + code: 6002; + name: "InvalidAuthority"; + msg: "Invalid authority address"; + }, + { + code: 6003; + name: "InvaldiMint"; + msg: "Invalid mint"; + }, + { + code: 6004; + name: "InvlaidHolderTokenAccount"; + msg: "Invalid holder token account"; + }, + { + code: 6005; + name: "InvalidTargetTokenAccount"; + msg: "Invalid target token account"; + }, + { + code: 6006; + name: "InvalidCloseTokenAccount"; + msg: "Invalid token account to close"; + }, + { + code: 6007; + name: "InvalidHolderTokenAccount"; + msg: "Invalid holder token account"; + } + ]; +}; + +export const IDL: CardinalCreatorStandard = { + version: "0.1.0", + name: "cardinal_creator_standard", + instructions: [ + { + name: "initMintManager", + accounts: [ + { + name: "mintManager", + isMut: true, + isSigner: false, + }, + { + name: "mint", + isMut: true, + isSigner: false, + }, + { + name: "standard", + isMut: false, + isSigner: false, + }, + { + name: "collector", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + { + name: "payer", + isMut: true, + isSigner: true, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "updateMintManager", + accounts: [ + { + name: "mintManager", + isMut: false, + isSigner: false, + }, + { + name: "standard", + isMut: false, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "ix", + type: { + defined: "UpdateMintManagerIx", + }, + }, + ], + }, + { + name: "initStandard", + accounts: [ + { + name: "standard", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + { + name: "payer", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "ix", + type: { + defined: "InitStandardIx", + }, + }, + ], + }, + { + name: "updateStandard", + accounts: [ + { + name: "standard", + isMut: true, + isSigner: false, + }, + { + name: "authority", + isMut: false, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "ix", + type: { + defined: "UpdateStandardIx", + }, + }, + ], + }, + ], + accounts: [ + { + name: "mintManager", + type: { + kind: "struct", + fields: [ + { + name: "bump", + type: "u8", + }, + { + name: "version", + type: "u8", + }, + { + name: "mint", + type: "publicKey", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "standard", + type: "publicKey", + }, + ], + }, + }, + { + name: "standard", + type: { + kind: "struct", + fields: [ + { + name: "bump", + type: "u8", + }, + { + name: "version", + type: "u8", + }, + { + name: "authority", + type: "publicKey", + }, + { + name: "checkSellerFeeBasisPoints", + type: "bool", + }, + { + name: "name", + type: "string", + }, + { + name: "disallowedPrograms", + type: { + vec: "publicKey", + }, + }, + { + name: "allowedPrograms", + type: { + vec: "publicKey", + }, + }, + ], + }, + }, + ], + types: [ + { + name: "UpdateMintManagerIx", + type: { + kind: "struct", + fields: [ + { + name: "authority", + type: "publicKey", + }, + ], + }, + }, + { + name: "InitStandardIx", + type: { + kind: "struct", + fields: [ + { + name: "checkSellerFeeBasisPoints", + type: "bool", + }, + { + name: "name", + type: "string", + }, + { + name: "disallowedPrograms", + type: { + vec: "publicKey", + }, + }, + { + name: "allowedPrograms", + type: { + vec: "publicKey", + }, + }, + ], + }, + }, + { + name: "UpdateStandardIx", + type: { + kind: "struct", + fields: [ + { + name: "checkSellerFeeBasisPoints", + type: "bool", + }, + { + name: "disallowedPrograms", + type: { + vec: "publicKey", + }, + }, + { + name: "allowedPrograms", + type: { + vec: "publicKey", + }, + }, + ], + }, + }, + ], + errors: [ + { + code: 6000, + name: "InvalidMint", + msg: "Invalid mint", + }, + { + code: 6001, + name: "InvalidCollector", + msg: "Invalid collector address", + }, + { + code: 6002, + name: "InvalidAuthority", + msg: "Invalid authority address", + }, + { + code: 6003, + name: "InvaldiMint", + msg: "Invalid mint", + }, + { + code: 6004, + name: "InvlaidHolderTokenAccount", + msg: "Invalid holder token account", + }, + { + code: 6005, + name: "InvalidTargetTokenAccount", + msg: "Invalid target token account", + }, + { + code: 6006, + name: "InvalidCloseTokenAccount", + msg: "Invalid token account to close", + }, + { + code: 6007, + name: "InvalidHolderTokenAccount", + msg: "Invalid holder token account", + }, + ], +}; From e1bff07897c911dac22d164e40b9e0c473b2af26 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 22:21:21 -0400 Subject: [PATCH 05/37] Simply seed checks --- program/src/instructions/token/approve.rs | 15 ++++++--------- program/src/instructions/token/revoke.rs | 14 ++++++-------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/program/src/instructions/token/approve.rs b/program/src/instructions/token/approve.rs index bda26089..759516c6 100644 --- a/program/src/instructions/token/approve.rs +++ b/program/src/instructions/token/approve.rs @@ -1,5 +1,4 @@ use anchor_spl::token::{self, Approve, FreezeAccount, Mint, ThawAccount, Token, TokenAccount}; -use mpl_token_metadata::utils::assert_derivation; use { crate::{errors::ErrorCode, state::*}, @@ -8,7 +7,7 @@ use { #[derive(Accounts)] pub struct ApproveCtx<'info> { - #[account(mut, seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], bump)] + #[account(mut)] mint_manager: Box<Account<'info, MintManager>>, #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMint)] mint: Box<Account<'info, Mint>>, @@ -32,13 +31,11 @@ pub struct ApproveCtx<'info> { pub fn handler(ctx: Context<ApproveCtx>) -> Result<()> { let mint = ctx.accounts.mint.key(); - let path = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref()]; - let bump_seed = assert_derivation( - ctx.program_id, - &ctx.accounts.mint_manager.to_account_info(), - path, - )?; - let mint_manager_seeds = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref(), &[bump_seed]]; + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; let mint_manager_signer = &[&mint_manager_seeds[..]]; let cpi_accounts = ThawAccount { diff --git a/program/src/instructions/token/revoke.rs b/program/src/instructions/token/revoke.rs index 802e7f45..8ca72ae8 100644 --- a/program/src/instructions/token/revoke.rs +++ b/program/src/instructions/token/revoke.rs @@ -8,7 +8,7 @@ use { #[derive(Accounts)] pub struct RevokeCtx<'info> { - #[account(mut, seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], bump)] + #[account(mut)] mint_manager: Account<'info, MintManager>, #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMint)] mint: Box<Account<'info, Mint>>, @@ -29,13 +29,11 @@ pub struct RevokeCtx<'info> { pub fn handler(ctx: Context<RevokeCtx>) -> Result<()> { let mint = ctx.accounts.mint.key(); - let path = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref()]; - let bump_seed = assert_derivation( - ctx.program_id, - &ctx.accounts.mint_manager.to_account_info(), - path, - )?; - let mint_manager_seeds = &[MINT_MANAGER_SEED.as_bytes(), mint.as_ref(), &[bump_seed]]; + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; let mint_manager_signer = &[&mint_manager_seeds[..]]; let cpi_accounts = ThawAccount { From d021a3f1a455c07c49692e2ea37fb75688f30d93 Mon Sep 17 00:00:00 2001 From: Giannis Chatziveroglou <gchatz@mit.edu> Date: Thu, 20 Oct 2022 19:34:34 -0700 Subject: [PATCH 06/37] update close ix + some client --- program/src/instructions/token/close.rs | 22 ++- sdk/creator_standard/accounts.ts | 0 sdk/creator_standard/constants.ts | 0 sdk/creator_standard/index.ts | 0 sdk/creator_standard/instruction.ts | 0 sdk/creator_standard/pda.ts | 0 sdk/creator_standard/transaction.ts | 0 sdk/src/generated/accounts/MintManager.ts | 175 ------------------ sdk/src/generated/accounts/MintManagerV2.ts | 175 ------------------ sdk/src/generated/accounts/index.ts | 7 - sdk/src/generated/index.ts | 19 -- sdk/src/generated/instructions/InitMint.ts | 96 ---------- .../generated/instructions/InitMintManager.ts | 103 ----------- sdk/src/generated/instructions/index.ts | 2 - sdk/src/generated/types/MintManager.ts | 32 ---- sdk/src/generated/types/MintManagerV2.ts | 32 ---- sdk/src/generated/types/index.ts | 2 - sdk/src/pda.ts | 14 -- 18 files changed, 21 insertions(+), 658 deletions(-) create mode 100644 sdk/creator_standard/accounts.ts create mode 100644 sdk/creator_standard/constants.ts create mode 100644 sdk/creator_standard/index.ts create mode 100644 sdk/creator_standard/instruction.ts create mode 100644 sdk/creator_standard/pda.ts create mode 100644 sdk/creator_standard/transaction.ts delete mode 100644 sdk/src/generated/accounts/MintManager.ts delete mode 100644 sdk/src/generated/accounts/MintManagerV2.ts delete mode 100644 sdk/src/generated/accounts/index.ts delete mode 100644 sdk/src/generated/index.ts delete mode 100644 sdk/src/generated/instructions/InitMint.ts delete mode 100644 sdk/src/generated/instructions/InitMintManager.ts delete mode 100644 sdk/src/generated/instructions/index.ts delete mode 100644 sdk/src/generated/types/MintManager.ts delete mode 100644 sdk/src/generated/types/MintManagerV2.ts delete mode 100644 sdk/src/generated/types/index.ts delete mode 100644 sdk/src/pda.ts diff --git a/program/src/instructions/token/close.rs b/program/src/instructions/token/close.rs index c7730495..ed334828 100644 --- a/program/src/instructions/token/close.rs +++ b/program/src/instructions/token/close.rs @@ -2,7 +2,7 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; -use anchor_spl::token::{self, CloseAccount, Token, TokenAccount}; +use anchor_spl::token::{self, CloseAccount, ThawAccount, Token, TokenAccount}; #[derive(Accounts)] pub struct CloseCtx<'info> { @@ -20,6 +20,26 @@ pub struct CloseCtx<'info> { } pub fn handler(ctx: Context<CloseCtx>) -> Result<()> { + if ctx.accounts.token_account.is_frozen() { + let mint_manager_key = ctx.accounts.mint.key(); + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint_manager_key.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + + let cpi_accounts = ThawAccount { + account: ctx.accounts.token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = + CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::thaw_account(cpi_context)?; + } + let cpi_accounts = CloseAccount { account: ctx.accounts.token_account.to_account_info(), destination: ctx.accounts.owner.to_account_info(), diff --git a/sdk/creator_standard/accounts.ts b/sdk/creator_standard/accounts.ts new file mode 100644 index 00000000..e69de29b diff --git a/sdk/creator_standard/constants.ts b/sdk/creator_standard/constants.ts new file mode 100644 index 00000000..e69de29b diff --git a/sdk/creator_standard/index.ts b/sdk/creator_standard/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/sdk/creator_standard/instruction.ts b/sdk/creator_standard/instruction.ts new file mode 100644 index 00000000..e69de29b diff --git a/sdk/creator_standard/pda.ts b/sdk/creator_standard/pda.ts new file mode 100644 index 00000000..e69de29b diff --git a/sdk/creator_standard/transaction.ts b/sdk/creator_standard/transaction.ts new file mode 100644 index 00000000..e69de29b diff --git a/sdk/src/generated/accounts/MintManager.ts b/sdk/src/generated/accounts/MintManager.ts deleted file mode 100644 index a39f4ca0..00000000 --- a/sdk/src/generated/accounts/MintManager.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as web3 from "@solana/web3.js"; -import * as beet from "@metaplex-foundation/beet"; -import * as beetSolana from "@metaplex-foundation/beet-solana"; - -/** - * Arguments used to create {@link MintManager} - * @category Accounts - * @category generated - */ -export type MintManagerArgs = { - accountType: number; - version: number; - mint: web3.PublicKey; - authority: web3.PublicKey; - ruleset: web3.PublicKey; -}; -/** - * Holds the data for the {@link MintManager} Account and provides de/serialization - * functionality for that data - * - * @category Accounts - * @category generated - */ -export class MintManager implements MintManagerArgs { - private constructor( - readonly accountType: number, - readonly version: number, - readonly mint: web3.PublicKey, - readonly authority: web3.PublicKey, - readonly ruleset: web3.PublicKey - ) {} - - /** - * Creates a {@link MintManager} instance from the provided args. - */ - static fromArgs(args: MintManagerArgs) { - return new MintManager( - args.accountType, - args.version, - args.mint, - args.authority, - args.ruleset - ); - } - - /** - * Deserializes the {@link MintManager} from the data of the provided {@link web3.AccountInfo}. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static fromAccountInfo( - accountInfo: web3.AccountInfo<Buffer>, - offset = 0 - ): [MintManager, number] { - return MintManager.deserialize(accountInfo.data, offset); - } - - /** - * Retrieves the account info from the provided address and deserializes - * the {@link MintManager} from its data. - * - * @throws Error if no account info is found at the address or if deserialization fails - */ - static async fromAccountAddress( - connection: web3.Connection, - address: web3.PublicKey - ): Promise<MintManager> { - const accountInfo = await connection.getAccountInfo(address); - if (accountInfo == null) { - throw new Error(`Unable to find MintManager account at ${address}`); - } - return MintManager.fromAccountInfo(accountInfo, 0)[0]; - } - - /** - * Provides a {@link web3.Connection.getProgramAccounts} config builder, - * to fetch accounts matching filters that can be specified via that builder. - * - * @param programId - the program that owns the accounts we are filtering - */ - static gpaBuilder( - programId: web3.PublicKey = new web3.PublicKey( - "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez" - ) - ) { - return beetSolana.GpaBuilder.fromStruct(programId, mintManagerBeet); - } - - /** - * Deserializes the {@link MintManager} from the provided data Buffer. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static deserialize(buf: Buffer, offset = 0): [MintManager, number] { - return mintManagerBeet.deserialize(buf, offset); - } - - /** - * Serializes the {@link MintManager} into a Buffer. - * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. - */ - serialize(): [Buffer, number] { - return mintManagerBeet.serialize(this); - } - - /** - * Returns the byteSize of a {@link Buffer} holding the serialized data of - * {@link MintManager} - */ - static get byteSize() { - return mintManagerBeet.byteSize; - } - - /** - * Fetches the minimum balance needed to exempt an account holding - * {@link MintManager} data from rent - * - * @param connection used to retrieve the rent exemption information - */ - static async getMinimumBalanceForRentExemption( - connection: web3.Connection, - commitment?: web3.Commitment - ): Promise<number> { - return connection.getMinimumBalanceForRentExemption( - MintManager.byteSize, - commitment - ); - } - - /** - * Determines if the provided {@link Buffer} has the correct byte size to - * hold {@link MintManager} data. - */ - static hasCorrectByteSize(buf: Buffer, offset = 0) { - return buf.byteLength - offset === MintManager.byteSize; - } - - /** - * Returns a readable version of {@link MintManager} properties - * and can be used to convert to JSON and/or logging - */ - pretty() { - return { - accountType: this.accountType, - version: this.version, - mint: this.mint.toBase58(), - authority: this.authority.toBase58(), - ruleset: this.ruleset.toBase58(), - }; - } -} - -/** - * @category Accounts - * @category generated - */ -export const mintManagerBeet = new beet.BeetStruct< - MintManager, - MintManagerArgs ->( - [ - ["accountType", beet.u8], - ["version", beet.u8], - ["mint", beetSolana.publicKey], - ["authority", beetSolana.publicKey], - ["ruleset", beetSolana.publicKey], - ], - MintManager.fromArgs, - "MintManager" -); diff --git a/sdk/src/generated/accounts/MintManagerV2.ts b/sdk/src/generated/accounts/MintManagerV2.ts deleted file mode 100644 index 823ac38d..00000000 --- a/sdk/src/generated/accounts/MintManagerV2.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as web3 from "@solana/web3.js"; -import * as beet from "@metaplex-foundation/beet"; -import * as beetSolana from "@metaplex-foundation/beet-solana"; - -/** - * Arguments used to create {@link MintManagerV2} - * @category Accounts - * @category generated - */ -export type MintManagerV2Args = { - accountType: number; - version: number; - mint: web3.PublicKey; - authority: web3.PublicKey; - ruleset: web3.PublicKey; -}; -/** - * Holds the data for the {@link MintManagerV2} Account and provides de/serialization - * functionality for that data - * - * @category Accounts - * @category generated - */ -export class MintManagerV2 implements MintManagerV2Args { - private constructor( - readonly accountType: number, - readonly version: number, - readonly mint: web3.PublicKey, - readonly authority: web3.PublicKey, - readonly ruleset: web3.PublicKey - ) {} - - /** - * Creates a {@link MintManagerV2} instance from the provided args. - */ - static fromArgs(args: MintManagerV2Args) { - return new MintManagerV2( - args.accountType, - args.version, - args.mint, - args.authority, - args.ruleset - ); - } - - /** - * Deserializes the {@link MintManagerV2} from the data of the provided {@link web3.AccountInfo}. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static fromAccountInfo( - accountInfo: web3.AccountInfo<Buffer>, - offset = 0 - ): [MintManagerV2, number] { - return MintManagerV2.deserialize(accountInfo.data, offset); - } - - /** - * Retrieves the account info from the provided address and deserializes - * the {@link MintManagerV2} from its data. - * - * @throws Error if no account info is found at the address or if deserialization fails - */ - static async fromAccountAddress( - connection: web3.Connection, - address: web3.PublicKey - ): Promise<MintManagerV2> { - const accountInfo = await connection.getAccountInfo(address); - if (accountInfo == null) { - throw new Error(`Unable to find MintManagerV2 account at ${address}`); - } - return MintManagerV2.fromAccountInfo(accountInfo, 0)[0]; - } - - /** - * Provides a {@link web3.Connection.getProgramAccounts} config builder, - * to fetch accounts matching filters that can be specified via that builder. - * - * @param programId - the program that owns the accounts we are filtering - */ - static gpaBuilder( - programId: web3.PublicKey = new web3.PublicKey( - "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez" - ) - ) { - return beetSolana.GpaBuilder.fromStruct(programId, mintManagerV2Beet); - } - - /** - * Deserializes the {@link MintManagerV2} from the provided data Buffer. - * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. - */ - static deserialize(buf: Buffer, offset = 0): [MintManagerV2, number] { - return mintManagerV2Beet.deserialize(buf, offset); - } - - /** - * Serializes the {@link MintManagerV2} into a Buffer. - * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. - */ - serialize(): [Buffer, number] { - return mintManagerV2Beet.serialize(this); - } - - /** - * Returns the byteSize of a {@link Buffer} holding the serialized data of - * {@link MintManagerV2} - */ - static get byteSize() { - return mintManagerV2Beet.byteSize; - } - - /** - * Fetches the minimum balance needed to exempt an account holding - * {@link MintManagerV2} data from rent - * - * @param connection used to retrieve the rent exemption information - */ - static async getMinimumBalanceForRentExemption( - connection: web3.Connection, - commitment?: web3.Commitment - ): Promise<number> { - return connection.getMinimumBalanceForRentExemption( - MintManagerV2.byteSize, - commitment - ); - } - - /** - * Determines if the provided {@link Buffer} has the correct byte size to - * hold {@link MintManagerV2} data. - */ - static hasCorrectByteSize(buf: Buffer, offset = 0) { - return buf.byteLength - offset === MintManagerV2.byteSize; - } - - /** - * Returns a readable version of {@link MintManagerV2} properties - * and can be used to convert to JSON and/or logging - */ - pretty() { - return { - accountType: this.accountType, - version: this.version, - mint: this.mint.toBase58(), - authority: this.authority.toBase58(), - ruleset: this.ruleset.toBase58(), - }; - } -} - -/** - * @category Accounts - * @category generated - */ -export const mintManagerV2Beet = new beet.BeetStruct< - MintManagerV2, - MintManagerV2Args ->( - [ - ["accountType", beet.u8], - ["version", beet.u8], - ["mint", beetSolana.publicKey], - ["authority", beetSolana.publicKey], - ["ruleset", beetSolana.publicKey], - ], - MintManagerV2.fromArgs, - "MintManagerV2" -); diff --git a/sdk/src/generated/accounts/index.ts b/sdk/src/generated/accounts/index.ts deleted file mode 100644 index ff51763d..00000000 --- a/sdk/src/generated/accounts/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './MintManager' -export * from './MintManagerV2' - -import { MintManager } from './MintManager' -import { MintManagerV2 } from './MintManagerV2' - -export const accountProviders = { MintManager, MintManagerV2 } diff --git a/sdk/src/generated/index.ts b/sdk/src/generated/index.ts deleted file mode 100644 index 8ad81bc0..00000000 --- a/sdk/src/generated/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PublicKey } from "@solana/web3.js"; -export * from "./accounts"; -export * from "./instructions"; - -/** - * Program address - * - * @category constants - * @category generated - */ -export const PROGRAM_ADDRESS = "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez"; - -/** - * Program public key - * - * @category constants - * @category generated - */ -export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS); diff --git a/sdk/src/generated/instructions/InitMint.ts b/sdk/src/generated/instructions/InitMint.ts deleted file mode 100644 index ec75d1ad..00000000 --- a/sdk/src/generated/instructions/InitMint.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as splToken from "@solana/spl-token"; -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; - -/** - * @category Instructions - * @category InitMint - * @category generated - */ -export const InitMintStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number; -}>([["instructionDiscriminator", beet.u8]], "InitMintInstructionArgs"); -/** - * Accounts required by the _InitMint_ instruction - * - * @property [_writable_] mint - * @property [_writable_] mintManager - * @property [_writable_, **signer**] authority - * @property [_writable_, **signer**] payer - * @category Instructions - * @category InitMint - * @category generated - */ -export type InitMintInstructionAccounts = { - mint: web3.PublicKey; - mintManager: web3.PublicKey; - authority: web3.PublicKey; - payer: web3.PublicKey; - tokenProgram?: web3.PublicKey; - systemProgram?: web3.PublicKey; -}; - -export const initMintInstructionDiscriminator = 0; - -/** - * Creates a _InitMint_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @category Instructions - * @category InitMint - * @category generated - */ -export function createInitMintInstruction( - accounts: InitMintInstructionAccounts, - programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") -) { - const [data] = InitMintStruct.serialize({ - instructionDiscriminator: initMintInstructionDiscriminator, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.mint, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.mintManager, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.authority, - isWritable: true, - isSigner: true, - }, - { - pubkey: accounts.payer, - isWritable: true, - isSigner: true, - }, - { - pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, - isWritable: false, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/sdk/src/generated/instructions/InitMintManager.ts b/sdk/src/generated/instructions/InitMintManager.ts deleted file mode 100644 index 556a416e..00000000 --- a/sdk/src/generated/instructions/InitMintManager.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as splToken from "@solana/spl-token"; -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; - -/** - * @category Instructions - * @category InitMintManager - * @category generated - */ -export const InitMintManagerStruct = new beet.BeetArgsStruct<{ - instructionDiscriminator: number; -}>([["instructionDiscriminator", beet.u8]], "InitMintManagerInstructionArgs"); -/** - * Accounts required by the _InitMintManager_ instruction - * - * @property [_writable_] mint - * @property [_writable_] mintManager - * @property [**signer**] authority - * @property [] ruleset - * @property [_writable_, **signer**] payer - * @category Instructions - * @category InitMintManager - * @category generated - */ -export type InitMintManagerInstructionAccounts = { - mint: web3.PublicKey; - mintManager: web3.PublicKey; - authority: web3.PublicKey; - ruleset: web3.PublicKey; - payer: web3.PublicKey; - tokenProgram?: web3.PublicKey; - systemProgram?: web3.PublicKey; -}; - -export const initMintManagerInstructionDiscriminator = 1; - -/** - * Creates a _InitMintManager_ instruction. - * - * @param accounts that will be accessed while the instruction is processed - * @category Instructions - * @category InitMintManager - * @category generated - */ -export function createInitMintManagerInstruction( - accounts: InitMintManagerInstructionAccounts, - programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") -) { - const [data] = InitMintManagerStruct.serialize({ - instructionDiscriminator: initMintManagerInstructionDiscriminator, - }); - const keys: web3.AccountMeta[] = [ - { - pubkey: accounts.mint, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.mintManager, - isWritable: true, - isSigner: false, - }, - { - pubkey: accounts.authority, - isWritable: false, - isSigner: true, - }, - { - pubkey: accounts.ruleset, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.payer, - isWritable: true, - isSigner: true, - }, - { - pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, - isWritable: false, - isSigner: false, - }, - ]; - - const ix = new web3.TransactionInstruction({ - programId, - keys, - data, - }); - return ix; -} diff --git a/sdk/src/generated/instructions/index.ts b/sdk/src/generated/instructions/index.ts deleted file mode 100644 index 311d729d..00000000 --- a/sdk/src/generated/instructions/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './InitMint' -export * from './InitMintManager' diff --git a/sdk/src/generated/types/MintManager.ts b/sdk/src/generated/types/MintManager.ts deleted file mode 100644 index ca74ab6b..00000000 --- a/sdk/src/generated/types/MintManager.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as web3 from "@solana/web3.js"; -import * as beet from "@metaplex-foundation/beet"; -import * as beetSolana from "@metaplex-foundation/beet-solana"; -export type MintManager = { - accountType: number; - version: number; - mint: web3.PublicKey; - authority: web3.PublicKey; - ruleset: web3.PublicKey; -}; - -/** - * @category userTypes - * @category generated - */ -export const mintManagerBeet = new beet.BeetArgsStruct<MintManager>( - [ - ["accountType", beet.u8], - ["version", beet.u8], - ["mint", beetSolana.publicKey], - ["authority", beetSolana.publicKey], - ["ruleset", beetSolana.publicKey], - ], - "MintManager" -); diff --git a/sdk/src/generated/types/MintManagerV2.ts b/sdk/src/generated/types/MintManagerV2.ts deleted file mode 100644 index 708926d1..00000000 --- a/sdk/src/generated/types/MintManagerV2.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This code was GENERATED using the solita package. - * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. - * - * See: https://github.com/metaplex-foundation/solita - */ - -import * as web3 from '@solana/web3.js' -import * as beet from '@metaplex-foundation/beet' -import * as beetSolana from '@metaplex-foundation/beet-solana' -export type MintManagerV2 = { - accountType: number - version: number - mint: web3.PublicKey - authority: web3.PublicKey - ruleset: web3.PublicKey -} - -/** - * @category userTypes - * @category generated - */ -export const mintManagerV2Beet = new beet.BeetArgsStruct<MintManagerV2>( - [ - ['accountType', beet.u8], - ['version', beet.u8], - ['mint', beetSolana.publicKey], - ['authority', beetSolana.publicKey], - ['ruleset', beetSolana.publicKey], - ], - 'MintManagerV2' -) diff --git a/sdk/src/generated/types/index.ts b/sdk/src/generated/types/index.ts deleted file mode 100644 index 4110c16a..00000000 --- a/sdk/src/generated/types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './MintManager' -export * from './MintManagerV2' diff --git a/sdk/src/pda.ts b/sdk/src/pda.ts deleted file mode 100644 index 8f4bfb61..00000000 --- a/sdk/src/pda.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { utils } from "@project-serum/anchor"; -import { PublicKey } from "@solana/web3.js"; -import { PROGRAM_ID } from "./generated"; - -/** - * Finds the mint manager id. - * @returns - */ -export const findMintManagerId = (mintId: PublicKey): PublicKey => { - return PublicKey.findProgramAddressSync( - [utils.bytes.utf8.encode("mint-manager"), mintId.toBuffer()], - PROGRAM_ID - )[0]; -}; From e83f49c37d6804070b7ddee03f6ec3af59c49fba Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 22:47:17 -0400 Subject: [PATCH 07/37] Cleanup --- program/src/instructions/token/revoke.rs | 1 - sdk/generate-idls.sh | 2 +- sdk/src/constants.ts | 12 +++++ .../idl/cardinal_creator_standard.ts | 0 sdk/src/index.ts | 1 + sdk/tests/init.test.ts | 40 +++------------- sdk/tests/init2.test.ts | 46 ------------------- 7 files changed, 20 insertions(+), 82 deletions(-) create mode 100644 sdk/src/constants.ts rename sdk/{ => src}/idl/cardinal_creator_standard.ts (100%) create mode 100644 sdk/src/index.ts delete mode 100644 sdk/tests/init2.test.ts diff --git a/program/src/instructions/token/revoke.rs b/program/src/instructions/token/revoke.rs index 8ca72ae8..786de840 100644 --- a/program/src/instructions/token/revoke.rs +++ b/program/src/instructions/token/revoke.rs @@ -1,5 +1,4 @@ use anchor_spl::token::{self, FreezeAccount, Mint, Revoke, ThawAccount, Token, TokenAccount}; -use mpl_token_metadata::utils::assert_derivation; use { crate::{errors::ErrorCode, state::*}, diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh index ade33c8a..3ba86735 100755 --- a/sdk/generate-idls.sh +++ b/sdk/generate-idls.sh @@ -8,7 +8,7 @@ mkdir -p src/idl/ for PROGRAM in $(find ../program/ -maxdepth 3 -name lib.rs); do PROGRAM_NAME="cardinal_creator_standard" echo "Parsing IDL for $PROGRAM_NAME" - anchor idl parse --file $PROGRAM --out-ts idl/$PROGRAM_NAME.ts || { + anchor idl parse --file $PROGRAM --out-ts src/idl/$PROGRAM_NAME.ts || { echo "Could not parse IDL" exit 1 } diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts new file mode 100644 index 00000000..446eb6a6 --- /dev/null +++ b/sdk/src/constants.ts @@ -0,0 +1,12 @@ +import { Program } from "@project-serum/anchor"; +import { PublicKey } from "@solana/web3.js"; +import { CardinalCreatorStandard, IDL } from "./idl/cardinal_creator_standard"; + +export const CREATOR_STANDARD_ID = new PublicKey( + "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez" +); + +export const CreatorStandard = new Program<CardinalCreatorStandard>( + IDL, + CREATOR_STANDARD_ID +); diff --git a/sdk/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts similarity index 100% rename from sdk/idl/cardinal_creator_standard.ts rename to sdk/src/idl/cardinal_creator_standard.ts diff --git a/sdk/src/index.ts b/sdk/src/index.ts new file mode 100644 index 00000000..b04bfcf7 --- /dev/null +++ b/sdk/src/index.ts @@ -0,0 +1 @@ +export * from "./constants"; diff --git a/sdk/tests/init.test.ts b/sdk/tests/init.test.ts index ecb74714..8c4d8547 100644 --- a/sdk/tests/init.test.ts +++ b/sdk/tests/init.test.ts @@ -1,18 +1,9 @@ import { test, beforeAll, expect } from "@jest/globals"; import { getProvider } from "../utils"; import type { PublicKey } from "@solana/web3.js"; -import { - Keypair, - Transaction, - sendAndConfirmTransaction, -} from "@solana/web3.js"; -import { - createInitMintManagerInstruction, - MintManager, - MintManagerV2, -} from "../src/generated"; +import { Keypair } from "@solana/web3.js"; import { createMint } from "@solana/spl-token"; -import { findMintManagerId } from "../src/pda"; +import { CreatorStandard } from "../src"; let mint: PublicKey; @@ -30,29 +21,10 @@ beforeAll(async () => { }); test("Init", async () => { - const provider = await getProvider(); - const tx = new Transaction(); - tx.add( - createInitMintManagerInstruction({ + await CreatorStandard.methods + .initMintManager() + .accounts({ mint: mint, - mintManager: findMintManagerId(mint), - authority: provider.wallet.publicKey, - payer: provider.wallet.publicKey, - ruleset: Keypair.generate().publicKey, }) - ); - await sendAndConfirmTransaction(provider.connection, tx, [provider.keypair]); - - const mintManager = await MintManager.fromAccountAddress( - provider.connection, - findMintManagerId(mint) - ); - expect(mintManager.mint.toString()).toBe(mint.toString()); - - const mintManager2 = await MintManagerV2.fromAccountAddress( - provider.connection, - findMintManagerId(mint) - ); - console.log("-----", mintManager2); - expect(mintManager2.mint.toString()).toBe(mint.toString()); + .rpc(); }); diff --git a/sdk/tests/init2.test.ts b/sdk/tests/init2.test.ts deleted file mode 100644 index 08a27ae8..00000000 --- a/sdk/tests/init2.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { test, beforeAll, expect } from "@jest/globals"; -import { executeTransaction, getProvider } from "../utils"; -import type { PublicKey } from "@solana/web3.js"; -import { Keypair, Transaction } from "@solana/web3.js"; -import { - createInitMintManagerInstruction, - MintManager, -} from "../src/generated"; -import { createMint } from "@solana/spl-token"; -import { findMintManagerId } from "../src/pda"; - -let mint: PublicKey; - -beforeAll(async () => { - const provider = await getProvider(); - const mintKeypair = Keypair.generate(); - mint = await createMint( - provider.connection, - provider.keypair, - provider.wallet.publicKey, - provider.wallet.publicKey, - 0, - mintKeypair - ); -}); - -test("Init", async () => { - const provider = await getProvider(); - const tx = new Transaction(); - tx.add( - createInitMintManagerInstruction({ - mint: mint, - mintManager: findMintManagerId(mint), - authority: provider.wallet.publicKey, - payer: provider.wallet.payer.publicKey, - ruleset: Keypair.generate().publicKey, - }) - ); - await executeTransaction(provider.connection, tx, provider.wallet); - - const mintManager = await MintManager.fromAccountAddress( - provider.connection, - findMintManagerId(mint) - ); - expect(mintManager.mint.toString()).toBe(mint.toString()); -}); From e365c2d61dcadc0cd57927718574aca96e2d9993 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 22:47:29 -0400 Subject: [PATCH 08/37] Cargo fmt --- program/src/instructions/token/approve.rs | 15 ++++++++++----- program/src/instructions/token/burn.rs | 8 +++++++- program/src/instructions/token/close.rs | 6 +++++- program/src/instructions/token/init_account.rs | 2 +- program/src/instructions/token/init_mint.rs | 6 ++++-- program/src/instructions/token/post_transfer.rs | 1 + program/src/instructions/token/pre_transfer.rs | 1 + program/src/instructions/token/revoke.rs | 15 ++++++++++----- program/src/instructions/token/transfer.rs | 2 +- 9 files changed, 40 insertions(+), 16 deletions(-) diff --git a/program/src/instructions/token/approve.rs b/program/src/instructions/token/approve.rs index 759516c6..c223808e 100644 --- a/program/src/instructions/token/approve.rs +++ b/program/src/instructions/token/approve.rs @@ -1,9 +1,14 @@ -use anchor_spl::token::{self, Approve, FreezeAccount, Mint, ThawAccount, Token, TokenAccount}; +use anchor_spl::token::Approve; +use anchor_spl::token::FreezeAccount; +use anchor_spl::token::Mint; +use anchor_spl::token::ThawAccount; +use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; +use anchor_spl::token::{self}; -use { - crate::{errors::ErrorCode, state::*}, - anchor_lang::prelude::*, -}; +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; #[derive(Accounts)] pub struct ApproveCtx<'info> { diff --git a/program/src/instructions/token/burn.rs b/program/src/instructions/token/burn.rs index a3935872..f546bf84 100644 --- a/program/src/instructions/token/burn.rs +++ b/program/src/instructions/token/burn.rs @@ -1,7 +1,13 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; -use anchor_spl::token::{self, Burn, CloseAccount, Mint, ThawAccount, Token, TokenAccount}; +use anchor_spl::token::Burn; +use anchor_spl::token::CloseAccount; +use anchor_spl::token::Mint; +use anchor_spl::token::ThawAccount; +use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; +use anchor_spl::token::{self}; #[derive(Accounts)] pub struct BurnCtx<'info> { diff --git a/program/src/instructions/token/close.rs b/program/src/instructions/token/close.rs index ed334828..1bf8d5c1 100644 --- a/program/src/instructions/token/close.rs +++ b/program/src/instructions/token/close.rs @@ -2,7 +2,11 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; -use anchor_spl::token::{self, CloseAccount, ThawAccount, Token, TokenAccount}; +use anchor_spl::token::CloseAccount; +use anchor_spl::token::ThawAccount; +use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; +use anchor_spl::token::{self}; #[derive(Accounts)] pub struct CloseCtx<'info> { diff --git a/program/src/instructions/token/init_account.rs b/program/src/instructions/token/init_account.rs index 083c3f66..2b90ae41 100644 --- a/program/src/instructions/token/init_account.rs +++ b/program/src/instructions/token/init_account.rs @@ -1 +1 @@ -// bogle \ No newline at end of file +// bogle diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index 1aa4d448..ef63506e 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -2,10 +2,12 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; use anchor_lang::solana_program::program::invoke; -use anchor_spl::associated_token::{self, AssociatedToken}; +use anchor_spl::associated_token::AssociatedToken; +use anchor_spl::associated_token::{self}; +use anchor_spl::token::MintTo; +use anchor_spl::token::Token; use anchor_spl::token::TokenAccount; use anchor_spl::token::{self}; -use anchor_spl::token::{MintTo, Token}; use solana_program::program_pack::Pack; use solana_program::system_instruction::create_account; use spl_associated_token_account::get_associated_token_address; diff --git a/program/src/instructions/token/post_transfer.rs b/program/src/instructions/token/post_transfer.rs index e69de29b..8b137891 100644 --- a/program/src/instructions/token/post_transfer.rs +++ b/program/src/instructions/token/post_transfer.rs @@ -0,0 +1 @@ + diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs index e69de29b..8b137891 100644 --- a/program/src/instructions/token/pre_transfer.rs +++ b/program/src/instructions/token/pre_transfer.rs @@ -0,0 +1 @@ + diff --git a/program/src/instructions/token/revoke.rs b/program/src/instructions/token/revoke.rs index 786de840..83dba0c9 100644 --- a/program/src/instructions/token/revoke.rs +++ b/program/src/instructions/token/revoke.rs @@ -1,9 +1,14 @@ -use anchor_spl::token::{self, FreezeAccount, Mint, Revoke, ThawAccount, Token, TokenAccount}; +use anchor_spl::token::FreezeAccount; +use anchor_spl::token::Mint; +use anchor_spl::token::Revoke; +use anchor_spl::token::ThawAccount; +use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; +use anchor_spl::token::{self}; -use { - crate::{errors::ErrorCode, state::*}, - anchor_lang::prelude::*, -}; +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; #[derive(Accounts)] pub struct RevokeCtx<'info> { diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs index 083c3f66..2b90ae41 100644 --- a/program/src/instructions/token/transfer.rs +++ b/program/src/instructions/token/transfer.rs @@ -1 +1 @@ -// bogle \ No newline at end of file +// bogle From b594f7b76a62393e8f6d18b0020c961ce1dc4e08 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 23:06:24 -0400 Subject: [PATCH 09/37] Add init account --- .../src/instructions/token/init_account.rs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/program/src/instructions/token/init_account.rs b/program/src/instructions/token/init_account.rs index 2b90ae41..c801577b 100644 --- a/program/src/instructions/token/init_account.rs +++ b/program/src/instructions/token/init_account.rs @@ -1 +1,38 @@ -// bogle +use anchor_lang::prelude::*; +use anchor_spl::associated_token::AssociatedToken; +use anchor_spl::associated_token::{self}; +use anchor_spl::token::Token; + +#[derive(Accounts)] +pub struct InitAccount<'info> { + /// CHECK: Account created or checked in handler + mint: UncheckedAccount<'info>, + /// CHECK: Account created or checked in handler + #[account(mut)] + token_account: UncheckedAccount<'info>, + /// CHECK: Account created or checked in handler + token_account_owner: UncheckedAccount<'info>, + + #[account(mut)] + payer: Signer<'info>, + rent: Sysvar<'info, Rent>, + token_program: Program<'info, Token>, + associated_token_program: Program<'info, AssociatedToken>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<InitAccount>) -> Result<()> { + let cpi_accounts = associated_token::Create { + payer: ctx.accounts.payer.to_account_info(), + associated_token: ctx.accounts.token_account.to_account_info(), + authority: ctx.accounts.token_account_owner.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + system_program: ctx.accounts.system_program.to_account_info(), + token_program: ctx.accounts.token_program.to_account_info(), + rent: ctx.accounts.rent.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + associated_token::create(cpi_context)?; + Ok(()) +} From 4e0511410ef28e9f248020b2d3c81e3f1dcd1b1b Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 23:08:40 -0400 Subject: [PATCH 10/37] Cleanup --- program/src/lib.rs | 1 - program/src/utils.rs | 61 -------------------------------------------- 2 files changed, 62 deletions(-) delete mode 100644 program/src/utils.rs diff --git a/program/src/lib.rs b/program/src/lib.rs index 4fa0915e..58e97de8 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -1,7 +1,6 @@ pub mod errors; pub mod instructions; pub mod state; -pub mod utils; use anchor_lang::prelude::*; use instructions::*; diff --git a/program/src/utils.rs b/program/src/utils.rs deleted file mode 100644 index 035a379c..00000000 --- a/program/src/utils.rs +++ /dev/null @@ -1,61 +0,0 @@ -use solana_program::account_info::AccountInfo; -use solana_program::entrypoint::ProgramResult; -use solana_program::msg; -use solana_program::program_error::ProgramError; -use solana_program::pubkey::Pubkey; - -#[inline(always)] -pub fn assert_with_msg(v: bool, err: impl Into<ProgramError>, msg: &str) -> ProgramResult { - if v { - Ok(()) - } else { - let caller = std::panic::Location::caller(); - msg!("{}. \n{}", msg, caller); - Err(err.into()) - } -} - -#[inline(always)] -pub fn assert_mut(account: &AccountInfo, name: &str) -> ProgramResult { - assert_with_msg( - account.is_writable, - ProgramError::InvalidInstructionData, - format!("{} must be mutable", name).as_str(), - ) -} - -#[inline(always)] -pub fn assert_signer(account: &AccountInfo, name: &str) -> ProgramResult { - assert_with_msg( - account.is_signer, - ProgramError::InvalidInstructionData, - format!("{} must be signer", name).as_str(), - ) -} - -#[inline(always)] -pub fn assert_owner(account: &AccountInfo, owner: &Pubkey, name: &str) -> ProgramResult { - assert_with_msg( - account.owner == owner, - ProgramError::IllegalOwner, - format!("{} must be owned by {}", name, owner).as_str(), - ) -} - -#[inline(always)] -pub fn assert_empty(account: &AccountInfo, name: &str) -> ProgramResult { - assert_with_msg( - account.data_is_empty(), - ProgramError::InvalidInstructionData, - format!("{} must be empty", name).as_str(), - ) -} - -#[inline(always)] -pub fn assert_address(account: &AccountInfo, address: &Pubkey, name: &str) -> ProgramResult { - assert_with_msg( - account.key == address, - ProgramError::InvalidInstructionData, - format!("{} must equal {}", name, address).as_str(), - ) -} From e08a07012f4c6e2d0a7d70c120b12cf4afc88f64 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 20 Oct 2022 23:39:18 -0400 Subject: [PATCH 11/37] Client generation and tests --- .../mint_manager/init_mint_manager.rs | 5 +- program/src/state.rs | 1 - sdk/.eslintrc.json | 6 +- sdk/.solitarc.js | 3 +- sdk/creator_standard/accounts.ts | 0 sdk/creator_standard/constants.ts | 0 sdk/creator_standard/index.ts | 0 sdk/creator_standard/instruction.ts | 0 sdk/creator_standard/pda.ts | 0 sdk/creator_standard/transaction.ts | 0 sdk/idl/cardinal_creator_standard.json | 330 +++++++ sdk/package.json | 2 + sdk/src/constants.ts | 12 - sdk/src/generated/accounts/MintManager.ts | 183 ++++ sdk/src/generated/accounts/Standard.ts | 195 ++++ sdk/src/generated/accounts/index.ts | 7 + sdk/src/generated/errors/index.ts | 219 +++++ sdk/src/generated/index.ts | 21 + sdk/src/generated/instructions/index.ts | 4 + .../generated/instructions/initMintManager.ts | 115 +++ .../generated/instructions/initStandard.ts | 105 +++ .../instructions/updateMintManager.ts | 108 +++ .../generated/instructions/updateStandard.ts | 101 +++ sdk/src/generated/types/InitStandardIx.ts | 31 + .../generated/types/UpdateMintManagerIx.ts | 23 + sdk/src/generated/types/UpdateStandardIx.ts | 29 + sdk/src/generated/types/index.ts | 3 + sdk/src/idl/cardinal_creator_standard.ts | 834 +++++++++--------- sdk/src/index.ts | 3 +- sdk/src/pda.ts | 18 + sdk/tests/init.test.ts | 78 +- sdk/tsconfig.json | 3 +- sdk/yarn.lock | 341 ++++++- 33 files changed, 2325 insertions(+), 455 deletions(-) delete mode 100644 sdk/creator_standard/accounts.ts delete mode 100644 sdk/creator_standard/constants.ts delete mode 100644 sdk/creator_standard/index.ts delete mode 100644 sdk/creator_standard/instruction.ts delete mode 100644 sdk/creator_standard/pda.ts delete mode 100644 sdk/creator_standard/transaction.ts create mode 100644 sdk/idl/cardinal_creator_standard.json delete mode 100644 sdk/src/constants.ts create mode 100644 sdk/src/generated/accounts/MintManager.ts create mode 100644 sdk/src/generated/accounts/Standard.ts create mode 100644 sdk/src/generated/accounts/index.ts create mode 100644 sdk/src/generated/errors/index.ts create mode 100644 sdk/src/generated/index.ts create mode 100644 sdk/src/generated/instructions/index.ts create mode 100644 sdk/src/generated/instructions/initMintManager.ts create mode 100644 sdk/src/generated/instructions/initStandard.ts create mode 100644 sdk/src/generated/instructions/updateMintManager.ts create mode 100644 sdk/src/generated/instructions/updateStandard.ts create mode 100644 sdk/src/generated/types/InitStandardIx.ts create mode 100644 sdk/src/generated/types/UpdateMintManagerIx.ts create mode 100644 sdk/src/generated/types/UpdateStandardIx.ts create mode 100644 sdk/src/generated/types/index.ts create mode 100644 sdk/src/pda.ts diff --git a/program/src/instructions/mint_manager/init_mint_manager.rs b/program/src/instructions/mint_manager/init_mint_manager.rs index 80cadac3..1359dcf9 100644 --- a/program/src/instructions/mint_manager/init_mint_manager.rs +++ b/program/src/instructions/mint_manager/init_mint_manager.rs @@ -24,7 +24,7 @@ pub struct InitMintManagerCtx<'info> { standard: Account<'info, Standard>, /// CHECK: Account is not read from - #[account(mut)] + #[account(mut, constraint = collector.key() == standard.authority @ ErrorCode::InvalidCollector)] collector: UncheckedAccount<'info>, authority: Signer<'info>, #[account(mut)] @@ -71,9 +71,6 @@ pub fn handler(ctx: Context<InitMintManagerCtx>) -> Result<()> { )?; // creation - if ctx.accounts.collector.key().to_string() != CREATION_COLLECTOR { - return Err(error!(ErrorCode::InvalidCollector)); - } invoke( &transfer( &ctx.accounts.payer.key(), diff --git a/program/src/state.rs b/program/src/state.rs index 13d21694..9dbc19df 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -2,7 +2,6 @@ use anchor_lang::prelude::*; use solana_program::pubkey::Pubkey; pub const CREATION_LAMPORTS: u64 = 5_000_000; -pub const CREATION_COLLECTOR: &str = "crkdpVWjHWdggGgBuSyAqSmZUmAjYLzD435tcLDRLXr"; pub const MINT_MANAGER_SEED: &str = "mint-manager"; pub const MINT_MANAGER_SIZE: usize = 8 + std::mem::size_of::<MintManager>() + 8; diff --git a/sdk/.eslintrc.json b/sdk/.eslintrc.json index 039035d9..a868a0d3 100644 --- a/sdk/.eslintrc.json +++ b/sdk/.eslintrc.json @@ -1,9 +1,11 @@ { "plugins": ["jest", "@typescript-eslint"], - "extends": ["plugin:github/recommended"], "parser": "@typescript-eslint/parser", "parserOptions": { - "ecmaVersion": 9, + "ecmaFeatures": { + "ecmaVersion": 2020, + "sourceType": "module" + }, "sourceType": "module", "project": "./tsconfig.json" }, diff --git a/sdk/.solitarc.js b/sdk/.solitarc.js index a61fdcba..2962eb0b 100644 --- a/sdk/.solitarc.js +++ b/sdk/.solitarc.js @@ -5,8 +5,9 @@ const sdkDir = path.join(__dirname, "src", "generated"); const binaryInstallDir = path.join(__dirname, "..", "..", "target", "solita"); module.exports = { - idlGenerator: "shank", + idlGenerator: "anchor", programName: "cardinal_creator_standard", + programId: "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez", idlDir, sdkDir, binaryInstallDir, diff --git a/sdk/creator_standard/accounts.ts b/sdk/creator_standard/accounts.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/sdk/creator_standard/constants.ts b/sdk/creator_standard/constants.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/sdk/creator_standard/index.ts b/sdk/creator_standard/index.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/sdk/creator_standard/instruction.ts b/sdk/creator_standard/instruction.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/sdk/creator_standard/pda.ts b/sdk/creator_standard/pda.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/sdk/creator_standard/transaction.ts b/sdk/creator_standard/transaction.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json new file mode 100644 index 00000000..868645c2 --- /dev/null +++ b/sdk/idl/cardinal_creator_standard.json @@ -0,0 +1,330 @@ +{ + "version": "0.1.0", + "name": "cardinal_creator_standard", + "instructions": [ + { + "name": "initMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "updateMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateMintManagerIx" + } + } + ] + }, + { + "name": "initStandard", + "accounts": [ + { + "name": "standard", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "InitStandardIx" + } + } + ] + }, + { + "name": "updateStandard", + "accounts": [ + { + "name": "standard", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateStandardIx" + } + } + ] + } + ], + "accounts": [ + { + "name": "MintManager", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "version", + "type": "u8" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "standard", + "type": "publicKey" + } + ] + } + }, + { + "name": "Standard", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "version", + "type": "u8" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "standardName", + "type": "string" + }, + { + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + } + ], + "types": [ + { + "name": "UpdateMintManagerIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "publicKey" + } + ] + } + }, + { + "name": "InitStandardIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "standardName", + "type": "string" + }, + { + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "UpdateStandardIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + } + ], + "errors": [ + { + "code": 6000, + "name": "InvalidMint", + "msg": "Invalid mint" + }, + { + "code": 6001, + "name": "InvalidCollector", + "msg": "Invalid collector address" + }, + { + "code": 6002, + "name": "InvalidAuthority", + "msg": "Invalid authority address" + }, + { + "code": 6003, + "name": "InvaldiMint", + "msg": "Invalid mint" + }, + { + "code": 6004, + "name": "InvlaidHolderTokenAccount", + "msg": "Invalid holder token account" + }, + { + "code": 6005, + "name": "InvalidTargetTokenAccount", + "msg": "Invalid target token account" + }, + { + "code": 6006, + "name": "InvalidCloseTokenAccount", + "msg": "Invalid token account to close" + }, + { + "code": 6007, + "name": "InvalidHolderTokenAccount", + "msg": "Invalid holder token account" + } + ], + "metadata": { + "address": "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez", + "origin": "anchor", + "binaryVersion": "0.25.0", + "libVersion": "0.25.0" + } +} \ No newline at end of file diff --git a/sdk/package.json b/sdk/package.json index a3c2aad1..173c55fe 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -23,6 +23,8 @@ "eslint": "^8.25.0", "eslint-import-resolver-node": "^0.3.6", "eslint-plugin-import": "^2.26.0", + "eslint-plugin-github": "^4.3.2", + "eslint-plugin-jest": "^25.3.2", "jest": "^29.2.1", "lint-staged": "^13.0.3", "ts-jest": "^29.0.3", diff --git a/sdk/src/constants.ts b/sdk/src/constants.ts deleted file mode 100644 index 446eb6a6..00000000 --- a/sdk/src/constants.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Program } from "@project-serum/anchor"; -import { PublicKey } from "@solana/web3.js"; -import { CardinalCreatorStandard, IDL } from "./idl/cardinal_creator_standard"; - -export const CREATOR_STANDARD_ID = new PublicKey( - "creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez" -); - -export const CreatorStandard = new Program<CardinalCreatorStandard>( - IDL, - CREATOR_STANDARD_ID -); diff --git a/sdk/src/generated/accounts/MintManager.ts b/sdk/src/generated/accounts/MintManager.ts new file mode 100644 index 00000000..813df15d --- /dev/null +++ b/sdk/src/generated/accounts/MintManager.ts @@ -0,0 +1,183 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as web3 from '@solana/web3.js' +import * as beet from '@metaplex-foundation/beet' +import * as beetSolana from '@metaplex-foundation/beet-solana' + +/** + * Arguments used to create {@link MintManager} + * @category Accounts + * @category generated + */ +export type MintManagerArgs = { + bump: number + version: number + mint: web3.PublicKey + authority: web3.PublicKey + standard: web3.PublicKey +} + +export const mintManagerDiscriminator = [202, 47, 44, 178, 55, 215, 117, 40] +/** + * Holds the data for the {@link MintManager} Account and provides de/serialization + * functionality for that data + * + * @category Accounts + * @category generated + */ +export class MintManager implements MintManagerArgs { + private constructor( + readonly bump: number, + readonly version: number, + readonly mint: web3.PublicKey, + readonly authority: web3.PublicKey, + readonly standard: web3.PublicKey + ) {} + + /** + * Creates a {@link MintManager} instance from the provided args. + */ + static fromArgs(args: MintManagerArgs) { + return new MintManager( + args.bump, + args.version, + args.mint, + args.authority, + args.standard + ) + } + + /** + * Deserializes the {@link MintManager} from the data of the provided {@link web3.AccountInfo}. + * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. + */ + static fromAccountInfo( + accountInfo: web3.AccountInfo<Buffer>, + offset = 0 + ): [MintManager, number] { + return MintManager.deserialize(accountInfo.data, offset) + } + + /** + * Retrieves the account info from the provided address and deserializes + * the {@link MintManager} from its data. + * + * @throws Error if no account info is found at the address or if deserialization fails + */ + static async fromAccountAddress( + connection: web3.Connection, + address: web3.PublicKey + ): Promise<MintManager> { + const accountInfo = await connection.getAccountInfo(address) + if (accountInfo == null) { + throw new Error(`Unable to find MintManager account at ${address}`) + } + return MintManager.fromAccountInfo(accountInfo, 0)[0] + } + + /** + * Provides a {@link web3.Connection.getProgramAccounts} config builder, + * to fetch accounts matching filters that can be specified via that builder. + * + * @param programId - the program that owns the accounts we are filtering + */ + static gpaBuilder( + programId: web3.PublicKey = new web3.PublicKey( + 'creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez' + ) + ) { + return beetSolana.GpaBuilder.fromStruct(programId, mintManagerBeet) + } + + /** + * Deserializes the {@link MintManager} from the provided data Buffer. + * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. + */ + static deserialize(buf: Buffer, offset = 0): [MintManager, number] { + return mintManagerBeet.deserialize(buf, offset) + } + + /** + * Serializes the {@link MintManager} into a Buffer. + * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. + */ + serialize(): [Buffer, number] { + return mintManagerBeet.serialize({ + accountDiscriminator: mintManagerDiscriminator, + ...this, + }) + } + + /** + * Returns the byteSize of a {@link Buffer} holding the serialized data of + * {@link MintManager} + */ + static get byteSize() { + return mintManagerBeet.byteSize + } + + /** + * Fetches the minimum balance needed to exempt an account holding + * {@link MintManager} data from rent + * + * @param connection used to retrieve the rent exemption information + */ + static async getMinimumBalanceForRentExemption( + connection: web3.Connection, + commitment?: web3.Commitment + ): Promise<number> { + return connection.getMinimumBalanceForRentExemption( + MintManager.byteSize, + commitment + ) + } + + /** + * Determines if the provided {@link Buffer} has the correct byte size to + * hold {@link MintManager} data. + */ + static hasCorrectByteSize(buf: Buffer, offset = 0) { + return buf.byteLength - offset === MintManager.byteSize + } + + /** + * Returns a readable version of {@link MintManager} properties + * and can be used to convert to JSON and/or logging + */ + pretty() { + return { + bump: this.bump, + version: this.version, + mint: this.mint.toBase58(), + authority: this.authority.toBase58(), + standard: this.standard.toBase58(), + } + } +} + +/** + * @category Accounts + * @category generated + */ +export const mintManagerBeet = new beet.BeetStruct< + MintManager, + MintManagerArgs & { + accountDiscriminator: number[] /* size: 8 */ + } +>( + [ + ['accountDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['bump', beet.u8], + ['version', beet.u8], + ['mint', beetSolana.publicKey], + ['authority', beetSolana.publicKey], + ['standard', beetSolana.publicKey], + ], + MintManager.fromArgs, + 'MintManager' +) diff --git a/sdk/src/generated/accounts/Standard.ts b/sdk/src/generated/accounts/Standard.ts new file mode 100644 index 00000000..1c31688b --- /dev/null +++ b/sdk/src/generated/accounts/Standard.ts @@ -0,0 +1,195 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as web3 from '@solana/web3.js' +import * as beet from '@metaplex-foundation/beet' +import * as beetSolana from '@metaplex-foundation/beet-solana' + +/** + * Arguments used to create {@link Standard} + * @category Accounts + * @category generated + */ +export type StandardArgs = { + bump: number + version: number + authority: web3.PublicKey + checkSellerFeeBasisPoints: boolean + standardName: string + disallowedPrograms: web3.PublicKey[] + allowedPrograms: web3.PublicKey[] +} + +export const standardDiscriminator = [183, 73, 235, 183, 240, 4, 194, 116] +/** + * Holds the data for the {@link Standard} Account and provides de/serialization + * functionality for that data + * + * @category Accounts + * @category generated + */ +export class Standard implements StandardArgs { + private constructor( + readonly bump: number, + readonly version: number, + readonly authority: web3.PublicKey, + readonly checkSellerFeeBasisPoints: boolean, + readonly standardName: string, + readonly disallowedPrograms: web3.PublicKey[], + readonly allowedPrograms: web3.PublicKey[] + ) {} + + /** + * Creates a {@link Standard} instance from the provided args. + */ + static fromArgs(args: StandardArgs) { + return new Standard( + args.bump, + args.version, + args.authority, + args.checkSellerFeeBasisPoints, + args.standardName, + args.disallowedPrograms, + args.allowedPrograms + ) + } + + /** + * Deserializes the {@link Standard} from the data of the provided {@link web3.AccountInfo}. + * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. + */ + static fromAccountInfo( + accountInfo: web3.AccountInfo<Buffer>, + offset = 0 + ): [Standard, number] { + return Standard.deserialize(accountInfo.data, offset) + } + + /** + * Retrieves the account info from the provided address and deserializes + * the {@link Standard} from its data. + * + * @throws Error if no account info is found at the address or if deserialization fails + */ + static async fromAccountAddress( + connection: web3.Connection, + address: web3.PublicKey + ): Promise<Standard> { + const accountInfo = await connection.getAccountInfo(address) + if (accountInfo == null) { + throw new Error(`Unable to find Standard account at ${address}`) + } + return Standard.fromAccountInfo(accountInfo, 0)[0] + } + + /** + * Provides a {@link web3.Connection.getProgramAccounts} config builder, + * to fetch accounts matching filters that can be specified via that builder. + * + * @param programId - the program that owns the accounts we are filtering + */ + static gpaBuilder( + programId: web3.PublicKey = new web3.PublicKey( + 'creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez' + ) + ) { + return beetSolana.GpaBuilder.fromStruct(programId, standardBeet) + } + + /** + * Deserializes the {@link Standard} from the provided data Buffer. + * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. + */ + static deserialize(buf: Buffer, offset = 0): [Standard, number] { + return standardBeet.deserialize(buf, offset) + } + + /** + * Serializes the {@link Standard} into a Buffer. + * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. + */ + serialize(): [Buffer, number] { + return standardBeet.serialize({ + accountDiscriminator: standardDiscriminator, + ...this, + }) + } + + /** + * Returns the byteSize of a {@link Buffer} holding the serialized data of + * {@link Standard} for the provided args. + * + * @param args need to be provided since the byte size for this account + * depends on them + */ + static byteSize(args: StandardArgs) { + const instance = Standard.fromArgs(args) + return standardBeet.toFixedFromValue({ + accountDiscriminator: standardDiscriminator, + ...instance, + }).byteSize + } + + /** + * Fetches the minimum balance needed to exempt an account holding + * {@link Standard} data from rent + * + * @param args need to be provided since the byte size for this account + * depends on them + * @param connection used to retrieve the rent exemption information + */ + static async getMinimumBalanceForRentExemption( + args: StandardArgs, + connection: web3.Connection, + commitment?: web3.Commitment + ): Promise<number> { + return connection.getMinimumBalanceForRentExemption( + Standard.byteSize(args), + commitment + ) + } + + /** + * Returns a readable version of {@link Standard} properties + * and can be used to convert to JSON and/or logging + */ + pretty() { + return { + bump: this.bump, + version: this.version, + authority: this.authority.toBase58(), + checkSellerFeeBasisPoints: this.checkSellerFeeBasisPoints, + standardName: this.standardName, + disallowedPrograms: this.disallowedPrograms, + allowedPrograms: this.allowedPrograms, + } + } +} + +/** + * @category Accounts + * @category generated + */ +export const standardBeet = new beet.FixableBeetStruct< + Standard, + StandardArgs & { + accountDiscriminator: number[] /* size: 8 */ + } +>( + [ + ['accountDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['bump', beet.u8], + ['version', beet.u8], + ['authority', beetSolana.publicKey], + ['checkSellerFeeBasisPoints', beet.bool], + ['standardName', beet.utf8String], + ['disallowedPrograms', beet.array(beetSolana.publicKey)], + ['allowedPrograms', beet.array(beetSolana.publicKey)], + ], + Standard.fromArgs, + 'Standard' +) diff --git a/sdk/src/generated/accounts/index.ts b/sdk/src/generated/accounts/index.ts new file mode 100644 index 00000000..3ce7bbed --- /dev/null +++ b/sdk/src/generated/accounts/index.ts @@ -0,0 +1,7 @@ +export * from './MintManager' +export * from './Standard' + +import { MintManager } from './MintManager' +import { Standard } from './Standard' + +export const accountProviders = { MintManager, Standard } diff --git a/sdk/src/generated/errors/index.ts b/sdk/src/generated/errors/index.ts new file mode 100644 index 00000000..42287747 --- /dev/null +++ b/sdk/src/generated/errors/index.ts @@ -0,0 +1,219 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +type ErrorWithCode = Error & { code: number } +type MaybeErrorWithCode = ErrorWithCode | null | undefined + +const createErrorFromCodeLookup: Map<number, () => ErrorWithCode> = new Map() +const createErrorFromNameLookup: Map<string, () => ErrorWithCode> = new Map() + +/** + * InvalidMint: 'Invalid mint' + * + * @category Errors + * @category generated + */ +export class InvalidMintError extends Error { + readonly code: number = 0x1770 + readonly name: string = 'InvalidMint' + constructor() { + super('Invalid mint') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidMintError) + } + } +} + +createErrorFromCodeLookup.set(0x1770, () => new InvalidMintError()) +createErrorFromNameLookup.set('InvalidMint', () => new InvalidMintError()) + +/** + * InvalidCollector: 'Invalid collector address' + * + * @category Errors + * @category generated + */ +export class InvalidCollectorError extends Error { + readonly code: number = 0x1771 + readonly name: string = 'InvalidCollector' + constructor() { + super('Invalid collector address') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidCollectorError) + } + } +} + +createErrorFromCodeLookup.set(0x1771, () => new InvalidCollectorError()) +createErrorFromNameLookup.set( + 'InvalidCollector', + () => new InvalidCollectorError() +) + +/** + * InvalidAuthority: 'Invalid authority address' + * + * @category Errors + * @category generated + */ +export class InvalidAuthorityError extends Error { + readonly code: number = 0x1772 + readonly name: string = 'InvalidAuthority' + constructor() { + super('Invalid authority address') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidAuthorityError) + } + } +} + +createErrorFromCodeLookup.set(0x1772, () => new InvalidAuthorityError()) +createErrorFromNameLookup.set( + 'InvalidAuthority', + () => new InvalidAuthorityError() +) + +/** + * InvaldiMint: 'Invalid mint' + * + * @category Errors + * @category generated + */ +export class InvaldiMintError extends Error { + readonly code: number = 0x1773 + readonly name: string = 'InvaldiMint' + constructor() { + super('Invalid mint') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvaldiMintError) + } + } +} + +createErrorFromCodeLookup.set(0x1773, () => new InvaldiMintError()) +createErrorFromNameLookup.set('InvaldiMint', () => new InvaldiMintError()) + +/** + * InvlaidHolderTokenAccount: 'Invalid holder token account' + * + * @category Errors + * @category generated + */ +export class InvlaidHolderTokenAccountError extends Error { + readonly code: number = 0x1774 + readonly name: string = 'InvlaidHolderTokenAccount' + constructor() { + super('Invalid holder token account') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvlaidHolderTokenAccountError) + } + } +} + +createErrorFromCodeLookup.set( + 0x1774, + () => new InvlaidHolderTokenAccountError() +) +createErrorFromNameLookup.set( + 'InvlaidHolderTokenAccount', + () => new InvlaidHolderTokenAccountError() +) + +/** + * InvalidTargetTokenAccount: 'Invalid target token account' + * + * @category Errors + * @category generated + */ +export class InvalidTargetTokenAccountError extends Error { + readonly code: number = 0x1775 + readonly name: string = 'InvalidTargetTokenAccount' + constructor() { + super('Invalid target token account') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidTargetTokenAccountError) + } + } +} + +createErrorFromCodeLookup.set( + 0x1775, + () => new InvalidTargetTokenAccountError() +) +createErrorFromNameLookup.set( + 'InvalidTargetTokenAccount', + () => new InvalidTargetTokenAccountError() +) + +/** + * InvalidCloseTokenAccount: 'Invalid token account to close' + * + * @category Errors + * @category generated + */ +export class InvalidCloseTokenAccountError extends Error { + readonly code: number = 0x1776 + readonly name: string = 'InvalidCloseTokenAccount' + constructor() { + super('Invalid token account to close') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidCloseTokenAccountError) + } + } +} + +createErrorFromCodeLookup.set(0x1776, () => new InvalidCloseTokenAccountError()) +createErrorFromNameLookup.set( + 'InvalidCloseTokenAccount', + () => new InvalidCloseTokenAccountError() +) + +/** + * InvalidHolderTokenAccount: 'Invalid holder token account' + * + * @category Errors + * @category generated + */ +export class InvalidHolderTokenAccountError extends Error { + readonly code: number = 0x1777 + readonly name: string = 'InvalidHolderTokenAccount' + constructor() { + super('Invalid holder token account') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidHolderTokenAccountError) + } + } +} + +createErrorFromCodeLookup.set( + 0x1777, + () => new InvalidHolderTokenAccountError() +) +createErrorFromNameLookup.set( + 'InvalidHolderTokenAccount', + () => new InvalidHolderTokenAccountError() +) + +/** + * Attempts to resolve a custom program error from the provided error code. + * @category Errors + * @category generated + */ +export function errorFromCode(code: number): MaybeErrorWithCode { + const createError = createErrorFromCodeLookup.get(code) + return createError != null ? createError() : null +} + +/** + * Attempts to resolve a custom program error from the provided error name, i.e. 'Unauthorized'. + * @category Errors + * @category generated + */ +export function errorFromName(name: string): MaybeErrorWithCode { + const createError = createErrorFromNameLookup.get(name) + return createError != null ? createError() : null +} diff --git a/sdk/src/generated/index.ts b/sdk/src/generated/index.ts new file mode 100644 index 00000000..7f0c724c --- /dev/null +++ b/sdk/src/generated/index.ts @@ -0,0 +1,21 @@ +import { PublicKey } from '@solana/web3.js' +export * from './accounts' +export * from './errors' +export * from './instructions' +export * from './types' + +/** + * Program address + * + * @category constants + * @category generated + */ +export const PROGRAM_ADDRESS = 'creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez' + +/** + * Program public key + * + * @category constants + * @category generated + */ +export const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS) diff --git a/sdk/src/generated/instructions/index.ts b/sdk/src/generated/instructions/index.ts new file mode 100644 index 00000000..66c2d098 --- /dev/null +++ b/sdk/src/generated/instructions/index.ts @@ -0,0 +1,4 @@ +export * from './initMintManager' +export * from './initStandard' +export * from './updateMintManager' +export * from './updateStandard' diff --git a/sdk/src/generated/instructions/initMintManager.ts b/sdk/src/generated/instructions/initMintManager.ts new file mode 100644 index 00000000..25e82642 --- /dev/null +++ b/sdk/src/generated/instructions/initMintManager.ts @@ -0,0 +1,115 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category InitMintManager + * @category generated + */ +export const initMintManagerStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'InitMintManagerInstructionArgs' +) +/** + * Accounts required by the _initMintManager_ instruction + * + * @property [_writable_] mintManager + * @property [_writable_] mint + * @property [] standard + * @property [_writable_] collector + * @property [**signer**] authority + * @property [_writable_, **signer**] payer + * @category Instructions + * @category InitMintManager + * @category generated + */ +export type InitMintManagerInstructionAccounts = { + mintManager: web3.PublicKey + mint: web3.PublicKey + standard: web3.PublicKey + collector: web3.PublicKey + authority: web3.PublicKey + payer: web3.PublicKey + tokenProgram?: web3.PublicKey + systemProgram?: web3.PublicKey +} + +export const initMintManagerInstructionDiscriminator = [ + 120, 150, 192, 192, 140, 39, 211, 191, +] + +/** + * Creates a _InitMintManager_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category InitMintManager + * @category generated + */ +export function createInitMintManagerInstruction( + accounts: InitMintManagerInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = initMintManagerStruct.serialize({ + instructionDiscriminator: initMintManagerInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.standard, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.collector, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.payer, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/initStandard.ts b/sdk/src/generated/instructions/initStandard.ts new file mode 100644 index 00000000..5e420770 --- /dev/null +++ b/sdk/src/generated/instructions/initStandard.ts @@ -0,0 +1,105 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; +import { InitStandardIx, initStandardIxBeet } from "../types/InitStandardIx"; + +/** + * @category Instructions + * @category InitStandard + * @category generated + */ +export type InitStandardInstructionArgs = { + ix: InitStandardIx; +}; +/** + * @category Instructions + * @category InitStandard + * @category generated + */ +export const initStandardStruct = new beet.FixableBeetArgsStruct< + InitStandardInstructionArgs & { + instructionDiscriminator: number[] /* size: 8 */; + } +>( + [ + ["instructionDiscriminator", beet.uniformFixedSizeArray(beet.u8, 8)], + ["ix", initStandardIxBeet], + ], + "InitStandardInstructionArgs" +); +/** + * Accounts required by the _initStandard_ instruction + * + * @property [_writable_] standard + * @property [**signer**] authority + * @property [_writable_, **signer**] payer + * @category Instructions + * @category InitStandard + * @category generated + */ +export type InitStandardInstructionAccounts = { + standard: web3.PublicKey; + authority: web3.PublicKey; + payer: web3.PublicKey; + systemProgram?: web3.PublicKey; +}; + +export const initStandardInstructionDiscriminator = [ + 85, 84, 110, 234, 166, 27, 75, 173, +]; + +/** + * Creates a _InitStandard_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @param args to provide as instruction data to the program + * + * @category Instructions + * @category InitStandard + * @category generated + */ +export function createInitStandardInstruction( + accounts: InitStandardInstructionAccounts, + args: InitStandardInstructionArgs, + programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") +) { + const [data] = initStandardStruct.serialize({ + instructionDiscriminator: initStandardInstructionDiscriminator, + ...args, + }); + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.standard, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.payer, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ]; + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }); + return ix; +} diff --git a/sdk/src/generated/instructions/updateMintManager.ts b/sdk/src/generated/instructions/updateMintManager.ts new file mode 100644 index 00000000..b3deb7ee --- /dev/null +++ b/sdk/src/generated/instructions/updateMintManager.ts @@ -0,0 +1,108 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; +import { + UpdateMintManagerIx, + updateMintManagerIxBeet, +} from "../types/UpdateMintManagerIx"; + +/** + * @category Instructions + * @category UpdateMintManager + * @category generated + */ +export type UpdateMintManagerInstructionArgs = { + ix: UpdateMintManagerIx; +}; +/** + * @category Instructions + * @category UpdateMintManager + * @category generated + */ +export const updateMintManagerStruct = new beet.BeetArgsStruct< + UpdateMintManagerInstructionArgs & { + instructionDiscriminator: number[] /* size: 8 */; + } +>( + [ + ["instructionDiscriminator", beet.uniformFixedSizeArray(beet.u8, 8)], + ["ix", updateMintManagerIxBeet], + ], + "UpdateMintManagerInstructionArgs" +); +/** + * Accounts required by the _updateMintManager_ instruction + * + * @property [] mintManager + * @property [] standard + * @property [**signer**] authority + * @category Instructions + * @category UpdateMintManager + * @category generated + */ +export type UpdateMintManagerInstructionAccounts = { + mintManager: web3.PublicKey; + standard: web3.PublicKey; + authority: web3.PublicKey; + systemProgram?: web3.PublicKey; +}; + +export const updateMintManagerInstructionDiscriminator = [ + 70, 171, 8, 198, 47, 206, 211, 164, +]; + +/** + * Creates a _UpdateMintManager_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @param args to provide as instruction data to the program + * + * @category Instructions + * @category UpdateMintManager + * @category generated + */ +export function createUpdateMintManagerInstruction( + accounts: UpdateMintManagerInstructionAccounts, + args: UpdateMintManagerInstructionArgs, + programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") +) { + const [data] = updateMintManagerStruct.serialize({ + instructionDiscriminator: updateMintManagerInstructionDiscriminator, + ...args, + }); + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.standard, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ]; + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }); + return ix; +} diff --git a/sdk/src/generated/instructions/updateStandard.ts b/sdk/src/generated/instructions/updateStandard.ts new file mode 100644 index 00000000..adf29345 --- /dev/null +++ b/sdk/src/generated/instructions/updateStandard.ts @@ -0,0 +1,101 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' +import { + UpdateStandardIx, + updateStandardIxBeet, +} from '../types/UpdateStandardIx' + +/** + * @category Instructions + * @category UpdateStandard + * @category generated + */ +export type UpdateStandardInstructionArgs = { + ix: UpdateStandardIx +} +/** + * @category Instructions + * @category UpdateStandard + * @category generated + */ +export const updateStandardStruct = new beet.FixableBeetArgsStruct< + UpdateStandardInstructionArgs & { + instructionDiscriminator: number[] /* size: 8 */ + } +>( + [ + ['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['ix', updateStandardIxBeet], + ], + 'UpdateStandardInstructionArgs' +) +/** + * Accounts required by the _updateStandard_ instruction + * + * @property [_writable_] standard + * @property [**signer**] authority + * @category Instructions + * @category UpdateStandard + * @category generated + */ +export type UpdateStandardInstructionAccounts = { + standard: web3.PublicKey + authority: web3.PublicKey + systemProgram?: web3.PublicKey +} + +export const updateStandardInstructionDiscriminator = [ + 235, 132, 19, 152, 47, 247, 75, 20, +] + +/** + * Creates a _UpdateStandard_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @param args to provide as instruction data to the program + * + * @category Instructions + * @category UpdateStandard + * @category generated + */ +export function createUpdateStandardInstruction( + accounts: UpdateStandardInstructionAccounts, + args: UpdateStandardInstructionArgs, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = updateStandardStruct.serialize({ + instructionDiscriminator: updateStandardInstructionDiscriminator, + ...args, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.standard, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/types/InitStandardIx.ts b/sdk/src/generated/types/InitStandardIx.ts new file mode 100644 index 00000000..0e9e0690 --- /dev/null +++ b/sdk/src/generated/types/InitStandardIx.ts @@ -0,0 +1,31 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as web3 from '@solana/web3.js' +import * as beet from '@metaplex-foundation/beet' +import * as beetSolana from '@metaplex-foundation/beet-solana' +export type InitStandardIx = { + checkSellerFeeBasisPoints: boolean + standardName: string + disallowedPrograms: web3.PublicKey[] + allowedPrograms: web3.PublicKey[] +} + +/** + * @category userTypes + * @category generated + */ +export const initStandardIxBeet = + new beet.FixableBeetArgsStruct<InitStandardIx>( + [ + ['checkSellerFeeBasisPoints', beet.bool], + ['standardName', beet.utf8String], + ['disallowedPrograms', beet.array(beetSolana.publicKey)], + ['allowedPrograms', beet.array(beetSolana.publicKey)], + ], + 'InitStandardIx' + ) diff --git a/sdk/src/generated/types/UpdateMintManagerIx.ts b/sdk/src/generated/types/UpdateMintManagerIx.ts new file mode 100644 index 00000000..4f36aca7 --- /dev/null +++ b/sdk/src/generated/types/UpdateMintManagerIx.ts @@ -0,0 +1,23 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as web3 from '@solana/web3.js' +import * as beetSolana from '@metaplex-foundation/beet-solana' +import * as beet from '@metaplex-foundation/beet' +export type UpdateMintManagerIx = { + authority: web3.PublicKey +} + +/** + * @category userTypes + * @category generated + */ +export const updateMintManagerIxBeet = + new beet.BeetArgsStruct<UpdateMintManagerIx>( + [['authority', beetSolana.publicKey]], + 'UpdateMintManagerIx' + ) diff --git a/sdk/src/generated/types/UpdateStandardIx.ts b/sdk/src/generated/types/UpdateStandardIx.ts new file mode 100644 index 00000000..66c48596 --- /dev/null +++ b/sdk/src/generated/types/UpdateStandardIx.ts @@ -0,0 +1,29 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as web3 from '@solana/web3.js' +import * as beet from '@metaplex-foundation/beet' +import * as beetSolana from '@metaplex-foundation/beet-solana' +export type UpdateStandardIx = { + checkSellerFeeBasisPoints: boolean + disallowedPrograms: web3.PublicKey[] + allowedPrograms: web3.PublicKey[] +} + +/** + * @category userTypes + * @category generated + */ +export const updateStandardIxBeet = + new beet.FixableBeetArgsStruct<UpdateStandardIx>( + [ + ['checkSellerFeeBasisPoints', beet.bool], + ['disallowedPrograms', beet.array(beetSolana.publicKey)], + ['allowedPrograms', beet.array(beetSolana.publicKey)], + ], + 'UpdateStandardIx' + ) diff --git a/sdk/src/generated/types/index.ts b/sdk/src/generated/types/index.ts new file mode 100644 index 00000000..f9395103 --- /dev/null +++ b/sdk/src/generated/types/index.ts @@ -0,0 +1,3 @@ +export * from './InitStandardIx' +export * from './UpdateMintManagerIx' +export * from './UpdateStandardIx' diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts index c16ebfab..ea74e713 100644 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ b/sdk/src/idl/cardinal_creator_standard.ts @@ -1,649 +1,649 @@ export type CardinalCreatorStandard = { - version: "0.1.0"; - name: "cardinal_creator_standard"; - instructions: [ + "version": "0.1.0", + "name": "cardinal_creator_standard", + "instructions": [ { - name: "initMintManager"; - accounts: [ + "name": "initMintManager", + "accounts": [ { - name: "mintManager"; - isMut: true; - isSigner: false; + "name": "mintManager", + "isMut": true, + "isSigner": false }, { - name: "mint"; - isMut: true; - isSigner: false; + "name": "mint", + "isMut": true, + "isSigner": false }, { - name: "standard"; - isMut: false; - isSigner: false; + "name": "standard", + "isMut": false, + "isSigner": false }, { - name: "collector"; - isMut: true; - isSigner: false; + "name": "collector", + "isMut": true, + "isSigner": false }, { - name: "authority"; - isMut: false; - isSigner: true; + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "payer"; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: "tokenProgram"; - isMut: false; - isSigner: false; + "name": "tokenProgram", + "isMut": false, + "isSigner": false }, { - name: "systemProgram"; - isMut: false; - isSigner: false; + "name": "systemProgram", + "isMut": false, + "isSigner": false } - ]; - args: []; + ], + "args": [] }, { - name: "updateMintManager"; - accounts: [ + "name": "updateMintManager", + "accounts": [ { - name: "mintManager"; - isMut: false; - isSigner: false; + "name": "mintManager", + "isMut": false, + "isSigner": false }, { - name: "standard"; - isMut: false; - isSigner: false; + "name": "standard", + "isMut": false, + "isSigner": false }, { - name: "authority"; - isMut: false; - isSigner: true; + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "systemProgram"; - isMut: false; - isSigner: false; + "name": "systemProgram", + "isMut": false, + "isSigner": false } - ]; - args: [ + ], + "args": [ { - name: "ix"; - type: { - defined: "UpdateMintManagerIx"; - }; + "name": "ix", + "type": { + "defined": "UpdateMintManagerIx" + } } - ]; + ] }, { - name: "initStandard"; - accounts: [ + "name": "initStandard", + "accounts": [ { - name: "standard"; - isMut: true; - isSigner: false; + "name": "standard", + "isMut": true, + "isSigner": false }, { - name: "authority"; - isMut: false; - isSigner: true; + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "payer"; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: "systemProgram"; - isMut: false; - isSigner: false; + "name": "systemProgram", + "isMut": false, + "isSigner": false } - ]; - args: [ + ], + "args": [ { - name: "ix"; - type: { - defined: "InitStandardIx"; - }; + "name": "ix", + "type": { + "defined": "InitStandardIx" + } } - ]; + ] }, { - name: "updateStandard"; - accounts: [ + "name": "updateStandard", + "accounts": [ { - name: "standard"; - isMut: true; - isSigner: false; + "name": "standard", + "isMut": true, + "isSigner": false }, { - name: "authority"; - isMut: false; - isSigner: true; + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "systemProgram"; - isMut: false; - isSigner: false; + "name": "systemProgram", + "isMut": false, + "isSigner": false } - ]; - args: [ + ], + "args": [ { - name: "ix"; - type: { - defined: "UpdateStandardIx"; - }; + "name": "ix", + "type": { + "defined": "UpdateStandardIx" + } } - ]; + ] } - ]; - accounts: [ + ], + "accounts": [ { - name: "mintManager"; - type: { - kind: "struct"; - fields: [ + "name": "mintManager", + "type": { + "kind": "struct", + "fields": [ { - name: "bump"; - type: "u8"; + "name": "bump", + "type": "u8" }, { - name: "version"; - type: "u8"; + "name": "version", + "type": "u8" }, { - name: "mint"; - type: "publicKey"; + "name": "mint", + "type": "publicKey" }, { - name: "authority"; - type: "publicKey"; + "name": "authority", + "type": "publicKey" }, { - name: "standard"; - type: "publicKey"; + "name": "standard", + "type": "publicKey" } - ]; - }; + ] + } }, { - name: "standard"; - type: { - kind: "struct"; - fields: [ + "name": "standard", + "type": { + "kind": "struct", + "fields": [ { - name: "bump"; - type: "u8"; + "name": "bump", + "type": "u8" }, { - name: "version"; - type: "u8"; + "name": "version", + "type": "u8" }, { - name: "authority"; - type: "publicKey"; + "name": "authority", + "type": "publicKey" }, { - name: "checkSellerFeeBasisPoints"; - type: "bool"; + "name": "checkSellerFeeBasisPoints", + "type": "bool" }, { - name: "name"; - type: "string"; + "name": "name", + "type": "string" }, { - name: "disallowedPrograms"; - type: { - vec: "publicKey"; - }; + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } }, { - name: "allowedPrograms"; - type: { - vec: "publicKey"; - }; + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } } - ]; - }; + ] + } } - ]; - types: [ + ], + "types": [ { - name: "UpdateMintManagerIx"; - type: { - kind: "struct"; - fields: [ + "name": "UpdateMintManagerIx", + "type": { + "kind": "struct", + "fields": [ { - name: "authority"; - type: "publicKey"; + "name": "authority", + "type": "publicKey" } - ]; - }; + ] + } }, { - name: "InitStandardIx"; - type: { - kind: "struct"; - fields: [ + "name": "InitStandardIx", + "type": { + "kind": "struct", + "fields": [ { - name: "checkSellerFeeBasisPoints"; - type: "bool"; + "name": "checkSellerFeeBasisPoints", + "type": "bool" }, { - name: "name"; - type: "string"; + "name": "name", + "type": "string" }, { - name: "disallowedPrograms"; - type: { - vec: "publicKey"; - }; + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } }, { - name: "allowedPrograms"; - type: { - vec: "publicKey"; - }; + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } } - ]; - }; + ] + } }, { - name: "UpdateStandardIx"; - type: { - kind: "struct"; - fields: [ + "name": "UpdateStandardIx", + "type": { + "kind": "struct", + "fields": [ { - name: "checkSellerFeeBasisPoints"; - type: "bool"; + "name": "checkSellerFeeBasisPoints", + "type": "bool" }, { - name: "disallowedPrograms"; - type: { - vec: "publicKey"; - }; + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } }, { - name: "allowedPrograms"; - type: { - vec: "publicKey"; - }; + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } } - ]; - }; + ] + } } - ]; - errors: [ + ], + "errors": [ { - code: 6000; - name: "InvalidMint"; - msg: "Invalid mint"; + "code": 6000, + "name": "InvalidMint", + "msg": "Invalid mint" }, { - code: 6001; - name: "InvalidCollector"; - msg: "Invalid collector address"; + "code": 6001, + "name": "InvalidCollector", + "msg": "Invalid collector address" }, { - code: 6002; - name: "InvalidAuthority"; - msg: "Invalid authority address"; + "code": 6002, + "name": "InvalidAuthority", + "msg": "Invalid authority address" }, { - code: 6003; - name: "InvaldiMint"; - msg: "Invalid mint"; + "code": 6003, + "name": "InvaldiMint", + "msg": "Invalid mint" }, { - code: 6004; - name: "InvlaidHolderTokenAccount"; - msg: "Invalid holder token account"; + "code": 6004, + "name": "InvlaidHolderTokenAccount", + "msg": "Invalid holder token account" }, { - code: 6005; - name: "InvalidTargetTokenAccount"; - msg: "Invalid target token account"; + "code": 6005, + "name": "InvalidTargetTokenAccount", + "msg": "Invalid target token account" }, { - code: 6006; - name: "InvalidCloseTokenAccount"; - msg: "Invalid token account to close"; + "code": 6006, + "name": "InvalidCloseTokenAccount", + "msg": "Invalid token account to close" }, { - code: 6007; - name: "InvalidHolderTokenAccount"; - msg: "Invalid holder token account"; + "code": 6007, + "name": "InvalidHolderTokenAccount", + "msg": "Invalid holder token account" } - ]; + ] }; export const IDL: CardinalCreatorStandard = { - version: "0.1.0", - name: "cardinal_creator_standard", - instructions: [ + "version": "0.1.0", + "name": "cardinal_creator_standard", + "instructions": [ { - name: "initMintManager", - accounts: [ + "name": "initMintManager", + "accounts": [ { - name: "mintManager", - isMut: true, - isSigner: false, + "name": "mintManager", + "isMut": true, + "isSigner": false }, { - name: "mint", - isMut: true, - isSigner: false, + "name": "mint", + "isMut": true, + "isSigner": false }, { - name: "standard", - isMut: false, - isSigner: false, + "name": "standard", + "isMut": false, + "isSigner": false }, { - name: "collector", - isMut: true, - isSigner: false, + "name": "collector", + "isMut": true, + "isSigner": false }, { - name: "authority", - isMut: false, - isSigner: true, + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "payer", - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: "tokenProgram", - isMut: false, - isSigner: false, + "name": "tokenProgram", + "isMut": false, + "isSigner": false }, { - name: "systemProgram", - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: "updateMintManager", - accounts: [ + "name": "updateMintManager", + "accounts": [ { - name: "mintManager", - isMut: false, - isSigner: false, + "name": "mintManager", + "isMut": false, + "isSigner": false }, { - name: "standard", - isMut: false, - isSigner: false, + "name": "standard", + "isMut": false, + "isSigner": false }, { - name: "authority", - isMut: false, - isSigner: true, + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "systemProgram", - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: "ix", - type: { - defined: "UpdateMintManagerIx", - }, - }, - ], + "name": "ix", + "type": { + "defined": "UpdateMintManagerIx" + } + } + ] }, { - name: "initStandard", - accounts: [ + "name": "initStandard", + "accounts": [ { - name: "standard", - isMut: true, - isSigner: false, + "name": "standard", + "isMut": true, + "isSigner": false }, { - name: "authority", - isMut: false, - isSigner: true, + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "payer", - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: "systemProgram", - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: "ix", - type: { - defined: "InitStandardIx", - }, - }, - ], + "name": "ix", + "type": { + "defined": "InitStandardIx" + } + } + ] }, { - name: "updateStandard", - accounts: [ + "name": "updateStandard", + "accounts": [ { - name: "standard", - isMut: true, - isSigner: false, + "name": "standard", + "isMut": true, + "isSigner": false }, { - name: "authority", - isMut: false, - isSigner: true, + "name": "authority", + "isMut": false, + "isSigner": true }, { - name: "systemProgram", - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: "ix", - type: { - defined: "UpdateStandardIx", - }, - }, - ], - }, + "name": "ix", + "type": { + "defined": "UpdateStandardIx" + } + } + ] + } ], - accounts: [ + "accounts": [ { - name: "mintManager", - type: { - kind: "struct", - fields: [ + "name": "mintManager", + "type": { + "kind": "struct", + "fields": [ { - name: "bump", - type: "u8", + "name": "bump", + "type": "u8" }, { - name: "version", - type: "u8", + "name": "version", + "type": "u8" }, { - name: "mint", - type: "publicKey", + "name": "mint", + "type": "publicKey" }, { - name: "authority", - type: "publicKey", + "name": "authority", + "type": "publicKey" }, { - name: "standard", - type: "publicKey", - }, - ], - }, + "name": "standard", + "type": "publicKey" + } + ] + } }, { - name: "standard", - type: { - kind: "struct", - fields: [ + "name": "standard", + "type": { + "kind": "struct", + "fields": [ { - name: "bump", - type: "u8", + "name": "bump", + "type": "u8" }, { - name: "version", - type: "u8", + "name": "version", + "type": "u8" }, { - name: "authority", - type: "publicKey", + "name": "authority", + "type": "publicKey" }, { - name: "checkSellerFeeBasisPoints", - type: "bool", + "name": "checkSellerFeeBasisPoints", + "type": "bool" }, { - name: "name", - type: "string", + "name": "name", + "type": "string" }, { - name: "disallowedPrograms", - type: { - vec: "publicKey", - }, + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } }, { - name: "allowedPrograms", - type: { - vec: "publicKey", - }, - }, - ], - }, - }, + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + } ], - types: [ + "types": [ { - name: "UpdateMintManagerIx", - type: { - kind: "struct", - fields: [ + "name": "UpdateMintManagerIx", + "type": { + "kind": "struct", + "fields": [ { - name: "authority", - type: "publicKey", - }, - ], - }, + "name": "authority", + "type": "publicKey" + } + ] + } }, { - name: "InitStandardIx", - type: { - kind: "struct", - fields: [ + "name": "InitStandardIx", + "type": { + "kind": "struct", + "fields": [ { - name: "checkSellerFeeBasisPoints", - type: "bool", + "name": "checkSellerFeeBasisPoints", + "type": "bool" }, { - name: "name", - type: "string", + "name": "name", + "type": "string" }, { - name: "disallowedPrograms", - type: { - vec: "publicKey", - }, + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } }, { - name: "allowedPrograms", - type: { - vec: "publicKey", - }, - }, - ], - }, + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } }, { - name: "UpdateStandardIx", - type: { - kind: "struct", - fields: [ + "name": "UpdateStandardIx", + "type": { + "kind": "struct", + "fields": [ { - name: "checkSellerFeeBasisPoints", - type: "bool", + "name": "checkSellerFeeBasisPoints", + "type": "bool" }, { - name: "disallowedPrograms", - type: { - vec: "publicKey", - }, + "name": "disallowedPrograms", + "type": { + "vec": "publicKey" + } }, { - name: "allowedPrograms", - type: { - vec: "publicKey", - }, - }, - ], - }, - }, + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + } ], - errors: [ + "errors": [ { - code: 6000, - name: "InvalidMint", - msg: "Invalid mint", + "code": 6000, + "name": "InvalidMint", + "msg": "Invalid mint" }, { - code: 6001, - name: "InvalidCollector", - msg: "Invalid collector address", + "code": 6001, + "name": "InvalidCollector", + "msg": "Invalid collector address" }, { - code: 6002, - name: "InvalidAuthority", - msg: "Invalid authority address", + "code": 6002, + "name": "InvalidAuthority", + "msg": "Invalid authority address" }, { - code: 6003, - name: "InvaldiMint", - msg: "Invalid mint", + "code": 6003, + "name": "InvaldiMint", + "msg": "Invalid mint" }, { - code: 6004, - name: "InvlaidHolderTokenAccount", - msg: "Invalid holder token account", + "code": 6004, + "name": "InvlaidHolderTokenAccount", + "msg": "Invalid holder token account" }, { - code: 6005, - name: "InvalidTargetTokenAccount", - msg: "Invalid target token account", + "code": 6005, + "name": "InvalidTargetTokenAccount", + "msg": "Invalid target token account" }, { - code: 6006, - name: "InvalidCloseTokenAccount", - msg: "Invalid token account to close", + "code": 6006, + "name": "InvalidCloseTokenAccount", + "msg": "Invalid token account to close" }, { - code: 6007, - name: "InvalidHolderTokenAccount", - msg: "Invalid holder token account", - }, - ], + "code": 6007, + "name": "InvalidHolderTokenAccount", + "msg": "Invalid holder token account" + } + ] }; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index b04bfcf7..a1478ae9 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -1 +1,2 @@ -export * from "./constants"; +export * from "./pda"; +export * from "./generated"; diff --git a/sdk/src/pda.ts b/sdk/src/pda.ts new file mode 100644 index 00000000..24eb2751 --- /dev/null +++ b/sdk/src/pda.ts @@ -0,0 +1,18 @@ +import { utils } from "@project-serum/anchor"; +import { PublicKey } from "@solana/web3.js"; +import { findProgramAddressSync } from "@project-serum/anchor/dist/cjs/utils/pubkey"; +import { PROGRAM_ID } from "./generated"; + +export const findMintManagerId = (mintId: PublicKey) => { + return findProgramAddressSync( + [utils.bytes.utf8.encode("mint-manager"), mintId.toBuffer()], + PROGRAM_ID + )[0]; +}; + +export const findStandardId = (name: string) => { + return findProgramAddressSync( + [utils.bytes.utf8.encode("standard"), utils.bytes.utf8.encode(name)], + PROGRAM_ID + )[0]; +}; diff --git a/sdk/tests/init.test.ts b/sdk/tests/init.test.ts index 8c4d8547..93ded365 100644 --- a/sdk/tests/init.test.ts +++ b/sdk/tests/init.test.ts @@ -1,12 +1,20 @@ import { test, beforeAll, expect } from "@jest/globals"; -import { getProvider } from "../utils"; +import { executeTransaction, getProvider } from "../utils"; import type { PublicKey } from "@solana/web3.js"; -import { Keypair } from "@solana/web3.js"; +import { Keypair, Transaction } from "@solana/web3.js"; import { createMint } from "@solana/spl-token"; -import { CreatorStandard } from "../src"; - +import { + findMintManagerId, + createInitMintManagerInstruction, + MintManager, + createInitStandardInstruction, + findStandardId, + Standard, +} from "../src"; let mint: PublicKey; +const STANDARD_NAME = "global"; + beforeAll(async () => { const provider = await getProvider(); const mintKeypair = Keypair.generate(); @@ -20,11 +28,65 @@ beforeAll(async () => { ); }); +test("Create standard", async () => { + const provider = await getProvider(); + const standardId = findStandardId(STANDARD_NAME); + const tx = new Transaction(); + tx.add( + createInitStandardInstruction( + { + standard: standardId, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + standardName: STANDARD_NAME, + checkSellerFeeBasisPoints: true, + disallowedPrograms: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const standard = await Standard.fromAccountAddress( + provider.connection, + standardId + ); + expect(standard.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(standard.checkSellerFeeBasisPoints).toBe(true); + expect(standard.disallowedPrograms).toBe([]); + expect(standard.allowedPrograms).toBe([]); +}); + test("Init", async () => { - await CreatorStandard.methods - .initMintManager() - .accounts({ + const provider = await getProvider(); + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + tx.add( + createInitMintManagerInstruction({ mint: mint, + mintManager: mintManagerId, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: provider.wallet.publicKey, + standard: Keypair.generate().publicKey, }) - .rpc(); + ); + await executeTransaction(provider.connection, tx, provider.wallet); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(mintManager.standard.toString()).toBe( + findStandardId(STANDARD_NAME).toString() + ); }); diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 53402aac..0b3672af 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -24,7 +24,6 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noImplicitOverride": true, "noUncheckedIndexedAccess": true, "noFallthroughCasesInSwitch": true, "forceConsistentCasingInFileNames": true, @@ -37,5 +36,5 @@ "declarationMap": true, "inlineSources": true }, - "include": ["src/"] + "include": ["src/", "tests/"] } diff --git a/sdk/yarn.lock b/sdk/yarn.lock index 948c5a61..252264f8 100644 --- a/sdk/yarn.lock +++ b/sdk/yarn.lock @@ -258,7 +258,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": +"@babel/runtime-corejs3@^7.10.2": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz#778471a71d915cf3b955a9201bebabfe924f872a" + integrity sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== @@ -319,6 +327,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@github/browserslist-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@github/browserslist-config/-/browserslist-config-1.0.0.tgz#952fe6da3e6b8ed6a368f3a1a08a9d2ef84e8d04" + integrity sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw== + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -850,6 +863,11 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -870,6 +888,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== +"@types/semver@^7.3.12": + version "7.3.12" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c" + integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -894,6 +917,95 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^5.1.0": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz#3203a6ff396b1194083faaa6e5110c401201d7d5" + integrity sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg== + dependencies: + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/type-utils" "5.40.1" + "@typescript-eslint/utils" "5.40.1" + debug "^4.3.4" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.40.1.tgz#2fa6b4f768d42fe7174c34cd02fa79717e4e2bfe" + integrity sha512-lynjgnQuoCgxtYgYWjoQqijk0kYQNiztnVhoqha3N0kMYFVPURidzCq2vn9XvUUu2XxP130ZRKVDKyeGa2bhbw== + dependencies: + "@typescript-eslint/utils" "5.40.1" + +"@typescript-eslint/parser@^5.1.0": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.40.1.tgz#e7f8295dd8154d0d37d661ddd8e2f0ecfdee28dd" + integrity sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg== + dependencies: + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz#a7a5197dfd234622a2421ea590ee0ccc02e18dfe" + integrity sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg== + dependencies: + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" + +"@typescript-eslint/type-utils@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz#091e4ce3bebbdb68f4980bae9dee2e4e1725f601" + integrity sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q== + dependencies: + "@typescript-eslint/typescript-estree" "5.40.1" + "@typescript-eslint/utils" "5.40.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.40.1.tgz#de37f4f64de731ee454bb2085d71030aa832f749" + integrity sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw== + +"@typescript-eslint/typescript-estree@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz#9a7d25492f02c69882ce5e0cd1857b0c55645d72" + integrity sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA== + dependencies: + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/visitor-keys" "5.40.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.40.1.tgz#3204fb73a559d3b7bab7dc9d3c44487c2734a9ca" + integrity sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.40.1" + "@typescript-eslint/types" "5.40.1" + "@typescript-eslint/typescript-estree" "5.40.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.40.1": + version "5.40.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz#f3d2bf5af192f4432b84cec6fdcb387193518754" + integrity sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw== + dependencies: + "@typescript-eslint/types" "5.40.1" + eslint-visitor-keys "^3.3.0" + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -996,7 +1108,15 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-includes@^3.1.4: +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +array-includes@^3.1.4, array-includes@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== @@ -1022,11 +1142,26 @@ array.prototype.flat@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +axe-core@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" + integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== + +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + babel-jest@^29.2.1: version "29.2.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.2.1.tgz#213c47e28072de11bdb98c9d29b89f2ab99664f1" @@ -1157,7 +1292,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3: +browserslist@^4.21.0, browserslist@^4.21.3: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -1384,6 +1519,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +core-js-pure@^3.25.1: + version "3.25.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" + integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + cross-fetch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" @@ -1405,6 +1545,11 @@ crypto-hash@^1.3.0: resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1608,6 +1753,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@>=8.0.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" @@ -1623,7 +1773,59 @@ eslint-module-utils@^2.7.3: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.26.0: +eslint-plugin-escompat@^3.3.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-escompat/-/eslint-plugin-escompat-3.3.4.tgz#86d99b1f681b760fbee0a775de318b854d230110" + integrity sha512-d/k6JwRzGRY6uZ426l6Ut6Eb2S/pi/079Ykj2GdWSzwm6WJHkdm28tECUWfLtpFA5ObApjPw6wR9bgY+uWAhag== + dependencies: + browserslist "^4.21.0" + +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-filenames@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz#7094f00d7aefdd6999e3ac19f72cea058e590cf7" + integrity sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w== + dependencies: + lodash.camelcase "4.3.0" + lodash.kebabcase "4.1.1" + lodash.snakecase "4.1.1" + lodash.upperfirst "4.3.1" + +eslint-plugin-github@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-github/-/eslint-plugin-github-4.4.0.tgz#3d1bf4bce00bbda81b6e98e49102da4b146dce15" + integrity sha512-jmVjy86WqVblKuvWnAQAEUMPZnAWbOUuV2hmAjQ54BvmukUW5PBml84NnyKe1QMt6k5a6JoIrbkLkyISTUDSxA== + dependencies: + "@github/browserslist-config" "^1.0.0" + "@typescript-eslint/eslint-plugin" "^5.1.0" + "@typescript-eslint/parser" "^5.1.0" + eslint-config-prettier ">=8.0.0" + eslint-plugin-escompat "^3.3.3" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-filenames "^1.3.2" + eslint-plugin-i18n-text "^1.0.1" + eslint-plugin-import "^2.25.2" + eslint-plugin-jsx-a11y "^6.6.0" + eslint-plugin-no-only-tests "^3.0.0" + eslint-plugin-prettier "^4.0.0" + eslint-rule-documentation ">=1.0.0" + jsx-ast-utils "^3.3.2" + prettier "^2.2.1" + svg-element-attributes "^1.3.1" + +eslint-plugin-i18n-text@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz#69ce14f9af7d135cbe8114b1b144a57bb83291dc" + integrity sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA== + +eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.26.0: version "2.26.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== @@ -1642,6 +1844,57 @@ eslint-plugin-import@^2.26.0: resolve "^1.22.0" tsconfig-paths "^3.14.1" +eslint-plugin-jest@^25.3.2: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.6.0: + version "6.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" + integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== + dependencies: + "@babel/runtime" "^7.18.9" + aria-query "^4.2.2" + array-includes "^3.1.5" + ast-types-flow "^0.0.7" + axe-core "^4.4.3" + axobject-query "^2.2.0" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.2" + language-tags "^1.0.5" + minimatch "^3.1.2" + semver "^6.3.0" + +eslint-plugin-no-only-tests@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.0.0.tgz#026cbc8cb069c8da6b7e19d03654be7ad49893f6" + integrity sha512-I0PeXMs1vu21ap45hey4HQCJRqpcoIvGcNTPJe+UhUm8TwjQ6//mCrDqF8q0WS6LgmRDwQ4ovQej0AQsAHb5yg== + +eslint-plugin-prettier@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-rule-documentation@>=1.0.0: + version "1.0.23" + resolved "https://registry.yarnpkg.com/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz#4e0886145597a78d24524ec7e0cf18c6fedc23a8" + integrity sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" @@ -1739,6 +1992,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -1810,6 +2068,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -2086,7 +2349,7 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: +ignore@^5.0.5, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -2772,11 +3035,31 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsx-ast-utils@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -2847,6 +3130,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.kebabcase@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -2857,6 +3150,16 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.snakecase@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.upperfirst@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + lodash@^4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -3024,7 +3327,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: +object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -3200,7 +3503,14 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.5.1: +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.2.1, prettier@^2.5.1: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== @@ -3596,6 +3906,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-element-attributes@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz#0c55afac6284291ab563d0913c062cf78a8c0ddb" + integrity sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA== + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -3671,11 +3986,23 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.0.3, tslib@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" From cbcba4e8ba6fcef91ab1e0828f316c39e6b50cbd Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 01:02:36 -0400 Subject: [PATCH 12/37] Add transfer and regen client --- Cargo.lock | 1 + Makefile | 2 +- program/Cargo.toml | 1 + program/src/errors.rs | 14 +- program/src/instructions/mod.rs | 18 +- program/src/instructions/token/approve.rs | 3 +- .../src/instructions/token/init_account.rs | 4 +- .../src/instructions/token/post_transfer.rs | 17 + .../src/instructions/token/pre_transfer.rs | 17 + program/src/instructions/token/transfer.rs | 130 ++- program/src/lib.rs | 37 + sdk/idl/cardinal_creator_standard.json | 382 +++++++- sdk/src/generated/accounts/Standard.ts | 10 +- sdk/src/generated/errors/index.ts | 138 ++- sdk/src/generated/instructions/approve.ts | 102 +++ sdk/src/generated/instructions/burn.ts | 99 +++ sdk/src/generated/instructions/close.ts | 101 +++ sdk/src/generated/instructions/index.ts | 9 + sdk/src/generated/instructions/initAccount.ts | 114 +++ sdk/src/generated/instructions/initMint.ts | 142 +++ .../generated/instructions/initStandard.ts | 42 +- .../generated/instructions/postTransfer.ts | 81 ++ sdk/src/generated/instructions/preTransfer.ts | 81 ++ sdk/src/generated/instructions/revoke.ts | 95 ++ sdk/src/generated/instructions/transfer.ts | 128 +++ .../instructions/updateMintManager.ts | 42 +- sdk/src/generated/types/InitStandardIx.ts | 4 +- sdk/src/idl/cardinal_creator_standard.ts | 814 +++++++++++++++++- sdk/tests/init.test.ts | 6 +- 29 files changed, 2521 insertions(+), 113 deletions(-) create mode 100644 sdk/src/generated/instructions/approve.ts create mode 100644 sdk/src/generated/instructions/burn.ts create mode 100644 sdk/src/generated/instructions/close.ts create mode 100644 sdk/src/generated/instructions/initAccount.ts create mode 100644 sdk/src/generated/instructions/initMint.ts create mode 100644 sdk/src/generated/instructions/postTransfer.ts create mode 100644 sdk/src/generated/instructions/preTransfer.ts create mode 100644 sdk/src/generated/instructions/revoke.ts create mode 100644 sdk/src/generated/instructions/transfer.ts diff --git a/Cargo.lock b/Cargo.lock index e418a6d8..cbf79d9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -392,6 +392,7 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", + "arrayref", "mpl-token-metadata", "solana-program", "spl-associated-token-account", diff --git a/Makefile b/Makefile index 2daca0fc..5e9ba9e7 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ all: build start test stop build: cd program && anchor build - cd sdk && yarn idl:generate + cd sdk && yarn idl:generate && yarn solita start: pkill solana-test-validator || true diff --git a/program/Cargo.toml b/program/Cargo.toml index c7e73077..a06ae25d 100644 --- a/program/Cargo.toml +++ b/program/Cargo.toml @@ -19,3 +19,4 @@ anchor-spl = "0.25.0" spl-token = { version = "~3.3.1", features = ["no-entrypoint"] } spl-associated-token-account = { version = "~1.0.5", features = ["no-entrypoint"] } mpl-token-metadata = { version = "1.3.3", features = [ "no-entrypoint", ] } +arrayref = "0.3.6" \ No newline at end of file diff --git a/program/src/errors.rs b/program/src/errors.rs index ff1ba82c..3cfe6b80 100644 --- a/program/src/errors.rs +++ b/program/src/errors.rs @@ -8,8 +8,8 @@ pub enum ErrorCode { InvalidCollector, #[msg("Invalid authority address")] InvalidAuthority, - #[msg("Invalid mint")] - InvaldiMint, + #[msg("Invalid mint manager")] + InvalidMintManager, #[msg("Invalid holder token account")] InvlaidHolderTokenAccount, #[msg("Invalid target token account")] @@ -18,4 +18,14 @@ pub enum ErrorCode { InvalidCloseTokenAccount, #[msg("Invalid holder token account")] InvalidHolderTokenAccount, + #[msg("Invalid standard")] + InvalidStandard, + #[msg("Invalid pre transfer instruction")] + InvalidPreTransferInstruction, + #[msg("Invalid post transfer instruction")] + InvalidPostTransferInstruction, + #[msg("Disallowed program included in transfer")] + ProgramDisallowed, + #[msg("Program not allowed in allowed programs to transfer")] + ProgramNotAllowed, } diff --git a/program/src/instructions/mod.rs b/program/src/instructions/mod.rs index 786f3d6e..555c113e 100644 --- a/program/src/instructions/mod.rs +++ b/program/src/instructions/mod.rs @@ -7,12 +7,12 @@ pub use standard::init_standard::*; pub use standard::update_standard::*; pub mod token; -pub use token::approve; -pub use token::burn; -pub use token::close; -pub use token::init_account; -pub use token::init_mint; -pub use token::post_transfer; -pub use token::pre_transfer; -pub use token::revoke; -pub use token::transfer; +pub use token::approve::*; +pub use token::burn::*; +pub use token::close::*; +pub use token::init_account::*; +pub use token::init_mint::*; +pub use token::post_transfer::*; +pub use token::pre_transfer::*; +pub use token::revoke::*; +pub use token::transfer::*; diff --git a/program/src/instructions/token/approve.rs b/program/src/instructions/token/approve.rs index c223808e..8eb50008 100644 --- a/program/src/instructions/token/approve.rs +++ b/program/src/instructions/token/approve.rs @@ -12,9 +12,8 @@ use anchor_lang::prelude::*; #[derive(Accounts)] pub struct ApproveCtx<'info> { - #[account(mut)] + #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMintManager)] mint_manager: Box<Account<'info, MintManager>>, - #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMint)] mint: Box<Account<'info, Mint>>, #[account(mut, constraint = diff --git a/program/src/instructions/token/init_account.rs b/program/src/instructions/token/init_account.rs index c801577b..d9c2863d 100644 --- a/program/src/instructions/token/init_account.rs +++ b/program/src/instructions/token/init_account.rs @@ -4,7 +4,7 @@ use anchor_spl::associated_token::{self}; use anchor_spl::token::Token; #[derive(Accounts)] -pub struct InitAccount<'info> { +pub struct InitAccountCtx<'info> { /// CHECK: Account created or checked in handler mint: UncheckedAccount<'info>, /// CHECK: Account created or checked in handler @@ -21,7 +21,7 @@ pub struct InitAccount<'info> { system_program: Program<'info, System>, } -pub fn handler(ctx: Context<InitAccount>) -> Result<()> { +pub fn handler(ctx: Context<InitAccountCtx>) -> Result<()> { let cpi_accounts = associated_token::Create { payer: ctx.accounts.payer.to_account_info(), associated_token: ctx.accounts.token_account.to_account_info(), diff --git a/program/src/instructions/token/post_transfer.rs b/program/src/instructions/token/post_transfer.rs index 8b137891..aff66faa 100644 --- a/program/src/instructions/token/post_transfer.rs +++ b/program/src/instructions/token/post_transfer.rs @@ -1 +1,18 @@ +use crate::state::*; +use anchor_lang::prelude::*; +use solana_program::sysvar::{self}; +pub const POST_TRANSFER_DISCRIMINATOR: [u8; 8] = [195, 252, 43, 202, 149, 119, 175, 84]; + +#[derive(Accounts)] +pub struct PostTransferCtx<'info> { + mint_manager: Account<'info, MintManager>, + standard: Account<'info, Standard>, + /// CHECK: This is not dangerous because the ID is checked with instructions sysvar + #[account(address = sysvar::instructions::id())] + instructions: UncheckedAccount<'info>, +} + +pub fn handler(_ctx: Context<PostTransferCtx>) -> Result<()> { + Ok(()) +} diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs index 8b137891..e61134b3 100644 --- a/program/src/instructions/token/pre_transfer.rs +++ b/program/src/instructions/token/pre_transfer.rs @@ -1 +1,18 @@ +use crate::state::*; +use anchor_lang::prelude::*; +use solana_program::sysvar::{self}; +pub const PRE_TRANSFER_DISCRIMINATOR: [u8; 8] = [158, 85, 53, 202, 155, 118, 19, 228]; + +#[derive(Accounts)] +pub struct PreTransferCtx<'info> { + mint_manager: Account<'info, MintManager>, + standard: Account<'info, Standard>, + /// CHECK: This is not dangerous because the ID is checked with instructions sysvar + #[account(address = sysvar::instructions::id())] + instructions: UncheckedAccount<'info>, +} + +pub fn handler(_ctx: Context<PreTransferCtx>) -> Result<()> { + Ok(()) +} diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs index 2b90ae41..626511d8 100644 --- a/program/src/instructions/token/transfer.rs +++ b/program/src/instructions/token/transfer.rs @@ -1 +1,129 @@ -// bogle +use std::collections::HashSet; + +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_spl::token::FreezeAccount; +use anchor_spl::token::Mint; +use anchor_spl::token::ThawAccount; +use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; +use anchor_spl::token::Transfer; +use anchor_spl::token::{self}; +use arrayref::array_ref; +use solana_program::serialize_utils::read_u16; +use solana_program::sysvar::instructions::load_instruction_at_checked; +use solana_program::sysvar::{self}; + +use super::POST_TRANSFER_DISCRIMINATOR; +use super::PRE_TRANSFER_DISCRIMINATOR; + +#[derive(Accounts)] +pub struct TransferCtx<'info> { + #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMintManager)] + mint_manager: Box<Account<'info, MintManager>>, + #[account(constraint = standard.key() == mint_manager.standard @ ErrorCode::InvalidStandard)] + standard: Account<'info, Standard>, + mint: Box<Account<'info, Mint>>, + + #[account(mut)] + from: Account<'info, TokenAccount>, + #[account(mut)] + to: Account<'info, TokenAccount>, + + authority: Signer<'info>, + rent: Sysvar<'info, Rent>, + token_program: Program<'info, Token>, + system_program: Program<'info, System>, + /// CHECK: This is not dangerous because the ID is checked with instructions sysvar + #[account(address = sysvar::instructions::id())] + instructions: UncheckedAccount<'info>, +} + +pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { + let instructions_account_info = ctx.accounts.instructions.to_account_info(); + let instruction_sysvar = instructions_account_info.try_borrow_data()?; + let mut current: usize = 0; + let num_instructions = + read_u16(&mut current, &instruction_sysvar).expect("Invalid instruction"); + + // check pre/post + if ctx.accounts.standard.check_seller_fee_basis_points { + // check pre_transfer + let first_ix = load_instruction_at_checked(0, &instructions_account_info) + .expect("Failed to get first instruction"); + let data: &[u8] = &first_ix.data; + let disc_bytes = array_ref![data, 0, 8]; + if first_ix.program_id != *ctx.program_id || disc_bytes != &PRE_TRANSFER_DISCRIMINATOR { + return Err(error!(ErrorCode::InvalidPreTransferInstruction)); + } + + // check post_transfer + let last_ix = + load_instruction_at_checked(num_instructions.into(), &instructions_account_info) + .expect("Failed to get last instruction"); + let data: &[u8] = &last_ix.data; + let disc_bytes = array_ref![data, 0, 8]; + if last_ix.program_id != *ctx.program_id || disc_bytes != &POST_TRANSFER_DISCRIMINATOR { + return Err(error!(ErrorCode::InvalidPostTransferInstruction)); + } + } + + // check allowed / disallowed + let mut allowed_programs = HashSet::new(); + for program_id in &ctx.accounts.standard.allowed_programs { + allowed_programs.insert(program_id); + } + + let mut disallowed_programs = HashSet::new(); + for program_id in &ctx.accounts.standard.disallowed_programs { + disallowed_programs.insert(program_id); + } + + for i in 0..num_instructions { + let ix = load_instruction_at_checked(i.into(), &instructions_account_info) + .expect("Failed to get instruction"); + if allowed_programs.len() > 0 && !allowed_programs.contains(&ix.program_id) { + return Err(error!(ErrorCode::ProgramNotAllowed)); + } + if disallowed_programs.len() > 0 && disallowed_programs.contains(&ix.program_id) { + return Err(error!(ErrorCode::ProgramDisallowed)); + } + } + + let mint = ctx.accounts.mint.key(); + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + + let cpi_accounts = ThawAccount { + account: ctx.accounts.from.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::thaw_account(cpi_context)?; + + let cpi_accounts = Transfer { + from: ctx.accounts.from.to_account_info(), + to: ctx.accounts.to.to_account_info(), + authority: ctx.accounts.authority.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::transfer(cpi_context, 1)?; + + let cpi_accounts = FreezeAccount { + account: ctx.accounts.to.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::freeze_account(cpi_context)?; + Ok(()) +} diff --git a/program/src/lib.rs b/program/src/lib.rs index 58e97de8..fdf6f11f 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -31,4 +31,41 @@ pub mod cardinal_creator_standard { pub fn update_standard(ctx: Context<UpdateStandardCtx>, ix: UpdateStandardIx) -> Result<()> { standard::update_standard::handler(ctx, ix) } + + // token + pub fn init_mint(ctx: Context<InitMintCtx>) -> Result<()> { + token::init_mint::handler(ctx) + } + + pub fn init_account(ctx: Context<InitAccountCtx>) -> Result<()> { + token::init_account::handler(ctx) + } + + pub fn approve(ctx: Context<ApproveCtx>) -> Result<()> { + token::approve::handler(ctx) + } + + pub fn revoke(ctx: Context<RevokeCtx>) -> Result<()> { + token::revoke::handler(ctx) + } + + pub fn burn(ctx: Context<BurnCtx>) -> Result<()> { + token::burn::handler(ctx) + } + + pub fn close(ctx: Context<CloseCtx>) -> Result<()> { + token::close::handler(ctx) + } + + pub fn transfer(ctx: Context<TransferCtx>) -> Result<()> { + token::transfer::handler(ctx) + } + + pub fn pre_transfer(ctx: Context<PreTransferCtx>) -> Result<()> { + token::pre_transfer::handler(ctx) + } + + pub fn post_transfer(ctx: Context<PostTransferCtx>) -> Result<()> { + token::post_transfer::handler(ctx) + } } diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index 868645c2..1553449d 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -141,6 +141,355 @@ } } ] + }, + { + "name": "initMint", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "targetTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "target", + "isMut": false, + "isSigner": true + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initAccount", + "accounts": [ + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccountOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "approve", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "delegate", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "revoke", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "burn", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "close", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "transfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "from", + "isMut": true, + "isSigner": false + }, + { + "name": "to", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "preTransfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "postTransfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] } ], "accounts": [ @@ -194,7 +543,7 @@ "type": "bool" }, { - "name": "standardName", + "name": "name", "type": "string" }, { @@ -236,7 +585,7 @@ "type": "bool" }, { - "name": "standardName", + "name": "name", "type": "string" }, { @@ -297,8 +646,8 @@ }, { "code": 6003, - "name": "InvaldiMint", - "msg": "Invalid mint" + "name": "InvalidMintManager", + "msg": "Invalid mint manager" }, { "code": 6004, @@ -319,6 +668,31 @@ "code": 6007, "name": "InvalidHolderTokenAccount", "msg": "Invalid holder token account" + }, + { + "code": 6008, + "name": "InvalidStandard", + "msg": "Invalid standard" + }, + { + "code": 6009, + "name": "InvalidPreTransferInstruction", + "msg": "Invalid pre transfer instruction" + }, + { + "code": 6010, + "name": "InvalidPostTransferInstruction", + "msg": "Invalid post transfer instruction" + }, + { + "code": 6011, + "name": "ProgramDisallowed", + "msg": "Disallowed program included in transfer" + }, + { + "code": 6012, + "name": "ProgramNotAllowed", + "msg": "Program not allowed in allowed programs to transfer" } ], "metadata": { diff --git a/sdk/src/generated/accounts/Standard.ts b/sdk/src/generated/accounts/Standard.ts index 1c31688b..90f8ba53 100644 --- a/sdk/src/generated/accounts/Standard.ts +++ b/sdk/src/generated/accounts/Standard.ts @@ -19,7 +19,7 @@ export type StandardArgs = { version: number authority: web3.PublicKey checkSellerFeeBasisPoints: boolean - standardName: string + name: string disallowedPrograms: web3.PublicKey[] allowedPrograms: web3.PublicKey[] } @@ -38,7 +38,7 @@ export class Standard implements StandardArgs { readonly version: number, readonly authority: web3.PublicKey, readonly checkSellerFeeBasisPoints: boolean, - readonly standardName: string, + readonly name: string, readonly disallowedPrograms: web3.PublicKey[], readonly allowedPrograms: web3.PublicKey[] ) {} @@ -52,7 +52,7 @@ export class Standard implements StandardArgs { args.version, args.authority, args.checkSellerFeeBasisPoints, - args.standardName, + args.name, args.disallowedPrograms, args.allowedPrograms ) @@ -163,7 +163,7 @@ export class Standard implements StandardArgs { version: this.version, authority: this.authority.toBase58(), checkSellerFeeBasisPoints: this.checkSellerFeeBasisPoints, - standardName: this.standardName, + name: this.name, disallowedPrograms: this.disallowedPrograms, allowedPrograms: this.allowedPrograms, } @@ -186,7 +186,7 @@ export const standardBeet = new beet.FixableBeetStruct< ['version', beet.u8], ['authority', beetSolana.publicKey], ['checkSellerFeeBasisPoints', beet.bool], - ['standardName', beet.utf8String], + ['name', beet.utf8String], ['disallowedPrograms', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], ], diff --git a/sdk/src/generated/errors/index.ts b/sdk/src/generated/errors/index.ts index 42287747..4614bc23 100644 --- a/sdk/src/generated/errors/index.ts +++ b/sdk/src/generated/errors/index.ts @@ -78,24 +78,27 @@ createErrorFromNameLookup.set( ) /** - * InvaldiMint: 'Invalid mint' + * InvalidMintManager: 'Invalid mint manager' * * @category Errors * @category generated */ -export class InvaldiMintError extends Error { +export class InvalidMintManagerError extends Error { readonly code: number = 0x1773 - readonly name: string = 'InvaldiMint' + readonly name: string = 'InvalidMintManager' constructor() { - super('Invalid mint') + super('Invalid mint manager') if (typeof Error.captureStackTrace === 'function') { - Error.captureStackTrace(this, InvaldiMintError) + Error.captureStackTrace(this, InvalidMintManagerError) } } } -createErrorFromCodeLookup.set(0x1773, () => new InvaldiMintError()) -createErrorFromNameLookup.set('InvaldiMint', () => new InvaldiMintError()) +createErrorFromCodeLookup.set(0x1773, () => new InvalidMintManagerError()) +createErrorFromNameLookup.set( + 'InvalidMintManager', + () => new InvalidMintManagerError() +) /** * InvlaidHolderTokenAccount: 'Invalid holder token account' @@ -198,6 +201,127 @@ createErrorFromNameLookup.set( () => new InvalidHolderTokenAccountError() ) +/** + * InvalidStandard: 'Invalid standard' + * + * @category Errors + * @category generated + */ +export class InvalidStandardError extends Error { + readonly code: number = 0x1778 + readonly name: string = 'InvalidStandard' + constructor() { + super('Invalid standard') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidStandardError) + } + } +} + +createErrorFromCodeLookup.set(0x1778, () => new InvalidStandardError()) +createErrorFromNameLookup.set( + 'InvalidStandard', + () => new InvalidStandardError() +) + +/** + * InvalidPreTransferInstruction: 'Invalid pre transfer instruction' + * + * @category Errors + * @category generated + */ +export class InvalidPreTransferInstructionError extends Error { + readonly code: number = 0x1779 + readonly name: string = 'InvalidPreTransferInstruction' + constructor() { + super('Invalid pre transfer instruction') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidPreTransferInstructionError) + } + } +} + +createErrorFromCodeLookup.set( + 0x1779, + () => new InvalidPreTransferInstructionError() +) +createErrorFromNameLookup.set( + 'InvalidPreTransferInstruction', + () => new InvalidPreTransferInstructionError() +) + +/** + * InvalidPostTransferInstruction: 'Invalid post transfer instruction' + * + * @category Errors + * @category generated + */ +export class InvalidPostTransferInstructionError extends Error { + readonly code: number = 0x177a + readonly name: string = 'InvalidPostTransferInstruction' + constructor() { + super('Invalid post transfer instruction') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, InvalidPostTransferInstructionError) + } + } +} + +createErrorFromCodeLookup.set( + 0x177a, + () => new InvalidPostTransferInstructionError() +) +createErrorFromNameLookup.set( + 'InvalidPostTransferInstruction', + () => new InvalidPostTransferInstructionError() +) + +/** + * ProgramDisallowed: 'Disallowed program included in transfer' + * + * @category Errors + * @category generated + */ +export class ProgramDisallowedError extends Error { + readonly code: number = 0x177b + readonly name: string = 'ProgramDisallowed' + constructor() { + super('Disallowed program included in transfer') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, ProgramDisallowedError) + } + } +} + +createErrorFromCodeLookup.set(0x177b, () => new ProgramDisallowedError()) +createErrorFromNameLookup.set( + 'ProgramDisallowed', + () => new ProgramDisallowedError() +) + +/** + * ProgramNotAllowed: 'Program not allowed in allowed programs to transfer' + * + * @category Errors + * @category generated + */ +export class ProgramNotAllowedError extends Error { + readonly code: number = 0x177c + readonly name: string = 'ProgramNotAllowed' + constructor() { + super('Program not allowed in allowed programs to transfer') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, ProgramNotAllowedError) + } + } +} + +createErrorFromCodeLookup.set(0x177c, () => new ProgramNotAllowedError()) +createErrorFromNameLookup.set( + 'ProgramNotAllowed', + () => new ProgramNotAllowedError() +) + /** * Attempts to resolve a custom program error from the provided error code. * @category Errors diff --git a/sdk/src/generated/instructions/approve.ts b/sdk/src/generated/instructions/approve.ts new file mode 100644 index 00000000..b5a7e189 --- /dev/null +++ b/sdk/src/generated/instructions/approve.ts @@ -0,0 +1,102 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category Approve + * @category generated + */ +export const approveStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'ApproveInstructionArgs' +) +/** + * Accounts required by the _approve_ instruction + * + * @property [] mintManager + * @property [] mint + * @property [_writable_] holderTokenAccount + * @property [_writable_, **signer**] holder + * @property [_writable_] delegate + * @category Instructions + * @category Approve + * @category generated + */ +export type ApproveInstructionAccounts = { + mintManager: web3.PublicKey + mint: web3.PublicKey + holderTokenAccount: web3.PublicKey + holder: web3.PublicKey + delegate: web3.PublicKey + tokenProgram?: web3.PublicKey +} + +export const approveInstructionDiscriminator = [ + 69, 74, 217, 36, 115, 117, 97, 76, +] + +/** + * Creates a _Approve_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category Approve + * @category generated + */ +export function createApproveInstruction( + accounts: ApproveInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = approveStruct.serialize({ + instructionDiscriminator: approveInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.holderTokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.holder, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.delegate, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/burn.ts b/sdk/src/generated/instructions/burn.ts new file mode 100644 index 00000000..13dab4d3 --- /dev/null +++ b/sdk/src/generated/instructions/burn.ts @@ -0,0 +1,99 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category Burn + * @category generated + */ +export const burnStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'BurnInstructionArgs' +) +/** + * Accounts required by the _burn_ instruction + * + * @property [_writable_] mintManager + * @property [_writable_] mint + * @property [_writable_] holderTokenAccount + * @property [**signer**] holder + * @category Instructions + * @category Burn + * @category generated + */ +export type BurnInstructionAccounts = { + mintManager: web3.PublicKey + mint: web3.PublicKey + holderTokenAccount: web3.PublicKey + holder: web3.PublicKey + tokenProgram?: web3.PublicKey + systemProgram?: web3.PublicKey +} + +export const burnInstructionDiscriminator = [116, 110, 29, 56, 107, 219, 42, 93] + +/** + * Creates a _Burn_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category Burn + * @category generated + */ +export function createBurnInstruction( + accounts: BurnInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = burnStruct.serialize({ + instructionDiscriminator: burnInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.holderTokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.holder, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/close.ts b/sdk/src/generated/instructions/close.ts new file mode 100644 index 00000000..be38910a --- /dev/null +++ b/sdk/src/generated/instructions/close.ts @@ -0,0 +1,101 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category Close + * @category generated + */ +export const closeStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'CloseInstructionArgs' +) +/** + * Accounts required by the _close_ instruction + * + * @property [] mintManager + * @property [_writable_] mint + * @property [_writable_] tokenAccount + * @property [**signer**] owner + * @category Instructions + * @category Close + * @category generated + */ +export type CloseInstructionAccounts = { + mintManager: web3.PublicKey + mint: web3.PublicKey + tokenAccount: web3.PublicKey + owner: web3.PublicKey + tokenProgram?: web3.PublicKey + systemProgram?: web3.PublicKey +} + +export const closeInstructionDiscriminator = [ + 98, 165, 201, 177, 108, 65, 206, 96, +] + +/** + * Creates a _Close_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category Close + * @category generated + */ +export function createCloseInstruction( + accounts: CloseInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = closeStruct.serialize({ + instructionDiscriminator: closeInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.tokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.owner, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/index.ts b/sdk/src/generated/instructions/index.ts index 66c2d098..942cbeba 100644 --- a/sdk/src/generated/instructions/index.ts +++ b/sdk/src/generated/instructions/index.ts @@ -1,4 +1,13 @@ +export * from './approve' +export * from './burn' +export * from './close' +export * from './initAccount' +export * from './initMint' export * from './initMintManager' export * from './initStandard' +export * from './postTransfer' +export * from './preTransfer' +export * from './revoke' +export * from './transfer' export * from './updateMintManager' export * from './updateStandard' diff --git a/sdk/src/generated/instructions/initAccount.ts b/sdk/src/generated/instructions/initAccount.ts new file mode 100644 index 00000000..6f85cf0a --- /dev/null +++ b/sdk/src/generated/instructions/initAccount.ts @@ -0,0 +1,114 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category InitAccount + * @category generated + */ +export const initAccountStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'InitAccountInstructionArgs' +) +/** + * Accounts required by the _initAccount_ instruction + * + * @property [] mint + * @property [_writable_] tokenAccount + * @property [] tokenAccountOwner + * @property [_writable_, **signer**] payer + * @property [] associatedTokenProgram + * @category Instructions + * @category InitAccount + * @category generated + */ +export type InitAccountInstructionAccounts = { + mint: web3.PublicKey + tokenAccount: web3.PublicKey + tokenAccountOwner: web3.PublicKey + payer: web3.PublicKey + rent?: web3.PublicKey + tokenProgram?: web3.PublicKey + associatedTokenProgram: web3.PublicKey + systemProgram?: web3.PublicKey +} + +export const initAccountInstructionDiscriminator = [ + 169, 188, 158, 199, 9, 151, 101, 125, +] + +/** + * Creates a _InitAccount_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category InitAccount + * @category generated + */ +export function createInitAccountInstruction( + accounts: InitAccountInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = initAccountStruct.serialize({ + instructionDiscriminator: initAccountInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mint, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.tokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.tokenAccountOwner, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.payer, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.rent ?? web3.SYSVAR_RENT_PUBKEY, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.associatedTokenProgram, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/initMint.ts b/sdk/src/generated/instructions/initMint.ts new file mode 100644 index 00000000..bdc120a9 --- /dev/null +++ b/sdk/src/generated/instructions/initMint.ts @@ -0,0 +1,142 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category InitMint + * @category generated + */ +export const initMintStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'InitMintInstructionArgs' +) +/** + * Accounts required by the _initMint_ instruction + * + * @property [_writable_] mintManager + * @property [_writable_] mint + * @property [] standard + * @property [_writable_] targetTokenAccount + * @property [**signer**] target + * @property [_writable_] collector + * @property [**signer**] authority + * @property [_writable_, **signer**] payer + * @property [] associatedTokenProgram + * @category Instructions + * @category InitMint + * @category generated + */ +export type InitMintInstructionAccounts = { + mintManager: web3.PublicKey + mint: web3.PublicKey + standard: web3.PublicKey + targetTokenAccount: web3.PublicKey + target: web3.PublicKey + collector: web3.PublicKey + authority: web3.PublicKey + payer: web3.PublicKey + rent?: web3.PublicKey + tokenProgram?: web3.PublicKey + associatedTokenProgram: web3.PublicKey + systemProgram?: web3.PublicKey +} + +export const initMintInstructionDiscriminator = [ + 126, 176, 233, 16, 66, 117, 209, 125, +] + +/** + * Creates a _InitMint_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category InitMint + * @category generated + */ +export function createInitMintInstruction( + accounts: InitMintInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = initMintStruct.serialize({ + instructionDiscriminator: initMintInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.standard, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.targetTokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.target, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.collector, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.payer, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.rent ?? web3.SYSVAR_RENT_PUBKEY, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.associatedTokenProgram, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/initStandard.ts b/sdk/src/generated/instructions/initStandard.ts index 5e420770..76ed5007 100644 --- a/sdk/src/generated/instructions/initStandard.ts +++ b/sdk/src/generated/instructions/initStandard.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; -import { InitStandardIx, initStandardIxBeet } from "../types/InitStandardIx"; +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' +import { InitStandardIx, initStandardIxBeet } from '../types/InitStandardIx' /** * @category Instructions @@ -15,8 +15,8 @@ import { InitStandardIx, initStandardIxBeet } from "../types/InitStandardIx"; * @category generated */ export type InitStandardInstructionArgs = { - ix: InitStandardIx; -}; + ix: InitStandardIx +} /** * @category Instructions * @category InitStandard @@ -24,15 +24,15 @@ export type InitStandardInstructionArgs = { */ export const initStandardStruct = new beet.FixableBeetArgsStruct< InitStandardInstructionArgs & { - instructionDiscriminator: number[] /* size: 8 */; + instructionDiscriminator: number[] /* size: 8 */ } >( [ - ["instructionDiscriminator", beet.uniformFixedSizeArray(beet.u8, 8)], - ["ix", initStandardIxBeet], + ['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['ix', initStandardIxBeet], ], - "InitStandardInstructionArgs" -); + 'InitStandardInstructionArgs' +) /** * Accounts required by the _initStandard_ instruction * @@ -44,15 +44,15 @@ export const initStandardStruct = new beet.FixableBeetArgsStruct< * @category generated */ export type InitStandardInstructionAccounts = { - standard: web3.PublicKey; - authority: web3.PublicKey; - payer: web3.PublicKey; - systemProgram?: web3.PublicKey; -}; + standard: web3.PublicKey + authority: web3.PublicKey + payer: web3.PublicKey + systemProgram?: web3.PublicKey +} export const initStandardInstructionDiscriminator = [ 85, 84, 110, 234, 166, 27, 75, 173, -]; +] /** * Creates a _InitStandard_ instruction. @@ -67,12 +67,12 @@ export const initStandardInstructionDiscriminator = [ export function createInitStandardInstruction( accounts: InitStandardInstructionAccounts, args: InitStandardInstructionArgs, - programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') ) { const [data] = initStandardStruct.serialize({ instructionDiscriminator: initStandardInstructionDiscriminator, ...args, - }); + }) const keys: web3.AccountMeta[] = [ { pubkey: accounts.standard, @@ -94,12 +94,12 @@ export function createInitStandardInstruction( isWritable: false, isSigner: false, }, - ]; + ] const ix = new web3.TransactionInstruction({ programId, keys, data, - }); - return ix; + }) + return ix } diff --git a/sdk/src/generated/instructions/postTransfer.ts b/sdk/src/generated/instructions/postTransfer.ts new file mode 100644 index 00000000..0fe692da --- /dev/null +++ b/sdk/src/generated/instructions/postTransfer.ts @@ -0,0 +1,81 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category PostTransfer + * @category generated + */ +export const postTransferStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'PostTransferInstructionArgs' +) +/** + * Accounts required by the _postTransfer_ instruction + * + * @property [] mintManager + * @property [] standard + * @property [] instructions + * @category Instructions + * @category PostTransfer + * @category generated + */ +export type PostTransferInstructionAccounts = { + mintManager: web3.PublicKey + standard: web3.PublicKey + instructions: web3.PublicKey +} + +export const postTransferInstructionDiscriminator = [ + 195, 252, 43, 202, 149, 119, 175, 84, +] + +/** + * Creates a _PostTransfer_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category PostTransfer + * @category generated + */ +export function createPostTransferInstruction( + accounts: PostTransferInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = postTransferStruct.serialize({ + instructionDiscriminator: postTransferInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.standard, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.instructions, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/preTransfer.ts b/sdk/src/generated/instructions/preTransfer.ts new file mode 100644 index 00000000..932f87a3 --- /dev/null +++ b/sdk/src/generated/instructions/preTransfer.ts @@ -0,0 +1,81 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category PreTransfer + * @category generated + */ +export const preTransferStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'PreTransferInstructionArgs' +) +/** + * Accounts required by the _preTransfer_ instruction + * + * @property [] mintManager + * @property [] standard + * @property [] instructions + * @category Instructions + * @category PreTransfer + * @category generated + */ +export type PreTransferInstructionAccounts = { + mintManager: web3.PublicKey + standard: web3.PublicKey + instructions: web3.PublicKey +} + +export const preTransferInstructionDiscriminator = [ + 158, 85, 53, 202, 155, 118, 19, 228, +] + +/** + * Creates a _PreTransfer_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category PreTransfer + * @category generated + */ +export function createPreTransferInstruction( + accounts: PreTransferInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = preTransferStruct.serialize({ + instructionDiscriminator: preTransferInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.standard, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.instructions, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/revoke.ts b/sdk/src/generated/instructions/revoke.ts new file mode 100644 index 00000000..9a98cae1 --- /dev/null +++ b/sdk/src/generated/instructions/revoke.ts @@ -0,0 +1,95 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category Revoke + * @category generated + */ +export const revokeStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'RevokeInstructionArgs' +) +/** + * Accounts required by the _revoke_ instruction + * + * @property [_writable_] mintManager + * @property [] mint + * @property [_writable_] holderTokenAccount + * @property [_writable_, **signer**] holder + * @category Instructions + * @category Revoke + * @category generated + */ +export type RevokeInstructionAccounts = { + mintManager: web3.PublicKey + mint: web3.PublicKey + holderTokenAccount: web3.PublicKey + holder: web3.PublicKey + tokenProgram?: web3.PublicKey +} + +export const revokeInstructionDiscriminator = [ + 170, 23, 31, 34, 133, 173, 93, 242, +] + +/** + * Creates a _Revoke_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category Revoke + * @category generated + */ +export function createRevokeInstruction( + accounts: RevokeInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = revokeStruct.serialize({ + instructionDiscriminator: revokeInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.holderTokenAccount, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.holder, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/transfer.ts b/sdk/src/generated/instructions/transfer.ts new file mode 100644 index 00000000..14c0c3b9 --- /dev/null +++ b/sdk/src/generated/instructions/transfer.ts @@ -0,0 +1,128 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as splToken from '@solana/spl-token' +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' + +/** + * @category Instructions + * @category Transfer + * @category generated + */ +export const transferStruct = new beet.BeetArgsStruct<{ + instructionDiscriminator: number[] /* size: 8 */ +}>( + [['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)]], + 'TransferInstructionArgs' +) +/** + * Accounts required by the _transfer_ instruction + * + * @property [] mintManager + * @property [] standard + * @property [] mint + * @property [_writable_] from + * @property [_writable_] to + * @property [**signer**] authority + * @property [] instructions + * @category Instructions + * @category Transfer + * @category generated + */ +export type TransferInstructionAccounts = { + mintManager: web3.PublicKey + standard: web3.PublicKey + mint: web3.PublicKey + from: web3.PublicKey + to: web3.PublicKey + authority: web3.PublicKey + rent?: web3.PublicKey + tokenProgram?: web3.PublicKey + systemProgram?: web3.PublicKey + instructions: web3.PublicKey +} + +export const transferInstructionDiscriminator = [ + 163, 52, 200, 231, 140, 3, 69, 186, +] + +/** + * Creates a _Transfer_ instruction. + * + * @param accounts that will be accessed while the instruction is processed + * @category Instructions + * @category Transfer + * @category generated + */ +export function createTransferInstruction( + accounts: TransferInstructionAccounts, + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') +) { + const [data] = transferStruct.serialize({ + instructionDiscriminator: transferInstructionDiscriminator, + }) + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.mintManager, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.standard, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.mint, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.from, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.to, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.rent ?? web3.SYSVAR_RENT_PUBKEY, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.instructions, + isWritable: false, + isSigner: false, + }, + ] + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }) + return ix +} diff --git a/sdk/src/generated/instructions/updateMintManager.ts b/sdk/src/generated/instructions/updateMintManager.ts index b3deb7ee..b8e3f31d 100644 --- a/sdk/src/generated/instructions/updateMintManager.ts +++ b/sdk/src/generated/instructions/updateMintManager.ts @@ -5,12 +5,12 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from "@metaplex-foundation/beet"; -import * as web3 from "@solana/web3.js"; +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' import { UpdateMintManagerIx, updateMintManagerIxBeet, -} from "../types/UpdateMintManagerIx"; +} from '../types/UpdateMintManagerIx' /** * @category Instructions @@ -18,8 +18,8 @@ import { * @category generated */ export type UpdateMintManagerInstructionArgs = { - ix: UpdateMintManagerIx; -}; + ix: UpdateMintManagerIx +} /** * @category Instructions * @category UpdateMintManager @@ -27,15 +27,15 @@ export type UpdateMintManagerInstructionArgs = { */ export const updateMintManagerStruct = new beet.BeetArgsStruct< UpdateMintManagerInstructionArgs & { - instructionDiscriminator: number[] /* size: 8 */; + instructionDiscriminator: number[] /* size: 8 */ } >( [ - ["instructionDiscriminator", beet.uniformFixedSizeArray(beet.u8, 8)], - ["ix", updateMintManagerIxBeet], + ['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['ix', updateMintManagerIxBeet], ], - "UpdateMintManagerInstructionArgs" -); + 'UpdateMintManagerInstructionArgs' +) /** * Accounts required by the _updateMintManager_ instruction * @@ -47,15 +47,15 @@ export const updateMintManagerStruct = new beet.BeetArgsStruct< * @category generated */ export type UpdateMintManagerInstructionAccounts = { - mintManager: web3.PublicKey; - standard: web3.PublicKey; - authority: web3.PublicKey; - systemProgram?: web3.PublicKey; -}; + mintManager: web3.PublicKey + standard: web3.PublicKey + authority: web3.PublicKey + systemProgram?: web3.PublicKey +} export const updateMintManagerInstructionDiscriminator = [ 70, 171, 8, 198, 47, 206, 211, 164, -]; +] /** * Creates a _UpdateMintManager_ instruction. @@ -70,12 +70,12 @@ export const updateMintManagerInstructionDiscriminator = [ export function createUpdateMintManagerInstruction( accounts: UpdateMintManagerInstructionAccounts, args: UpdateMintManagerInstructionArgs, - programId = new web3.PublicKey("creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez") + programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') ) { const [data] = updateMintManagerStruct.serialize({ instructionDiscriminator: updateMintManagerInstructionDiscriminator, ...args, - }); + }) const keys: web3.AccountMeta[] = [ { pubkey: accounts.mintManager, @@ -97,12 +97,12 @@ export function createUpdateMintManagerInstruction( isWritable: false, isSigner: false, }, - ]; + ] const ix = new web3.TransactionInstruction({ programId, keys, data, - }); - return ix; + }) + return ix } diff --git a/sdk/src/generated/types/InitStandardIx.ts b/sdk/src/generated/types/InitStandardIx.ts index 0e9e0690..9c12a2ff 100644 --- a/sdk/src/generated/types/InitStandardIx.ts +++ b/sdk/src/generated/types/InitStandardIx.ts @@ -10,7 +10,7 @@ import * as beet from '@metaplex-foundation/beet' import * as beetSolana from '@metaplex-foundation/beet-solana' export type InitStandardIx = { checkSellerFeeBasisPoints: boolean - standardName: string + name: string disallowedPrograms: web3.PublicKey[] allowedPrograms: web3.PublicKey[] } @@ -23,7 +23,7 @@ export const initStandardIxBeet = new beet.FixableBeetArgsStruct<InitStandardIx>( [ ['checkSellerFeeBasisPoints', beet.bool], - ['standardName', beet.utf8String], + ['name', beet.utf8String], ['disallowedPrograms', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], ], diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts index ea74e713..a1e35e39 100644 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ b/sdk/src/idl/cardinal_creator_standard.ts @@ -141,6 +141,355 @@ export type CardinalCreatorStandard = { } } ] + }, + { + "name": "initMint", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "targetTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "target", + "isMut": false, + "isSigner": true + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initAccount", + "accounts": [ + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccountOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "approve", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "delegate", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "revoke", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "burn", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "close", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "transfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "from", + "isMut": true, + "isSigner": false + }, + { + "name": "to", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "preTransfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "postTransfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] } ], "accounts": [ @@ -297,8 +646,8 @@ export type CardinalCreatorStandard = { }, { "code": 6003, - "name": "InvaldiMint", - "msg": "Invalid mint" + "name": "InvalidMintManager", + "msg": "Invalid mint manager" }, { "code": 6004, @@ -319,6 +668,31 @@ export type CardinalCreatorStandard = { "code": 6007, "name": "InvalidHolderTokenAccount", "msg": "Invalid holder token account" + }, + { + "code": 6008, + "name": "InvalidStandard", + "msg": "Invalid standard" + }, + { + "code": 6009, + "name": "InvalidPreTransferInstruction", + "msg": "Invalid pre transfer instruction" + }, + { + "code": 6010, + "name": "InvalidPostTransferInstruction", + "msg": "Invalid post transfer instruction" + }, + { + "code": 6011, + "name": "ProgramDisallowed", + "msg": "Disallowed program included in transfer" + }, + { + "code": 6012, + "name": "ProgramNotAllowed", + "msg": "Program not allowed in allowed programs to transfer" } ] }; @@ -328,7 +702,147 @@ export const IDL: CardinalCreatorStandard = { "name": "cardinal_creator_standard", "instructions": [ { - "name": "initMintManager", + "name": "initMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "updateMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateMintManagerIx" + } + } + ] + }, + { + "name": "initStandard", + "accounts": [ + { + "name": "standard", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "InitStandardIx" + } + } + ] + }, + { + "name": "updateStandard", + "accounts": [ + { + "name": "standard", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateStandardIx" + } + } + ] + }, + { + "name": "initMint", "accounts": [ { "name": "mintManager", @@ -345,6 +859,16 @@ export const IDL: CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "targetTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "target", + "isMut": false, + "isSigner": true + }, { "name": "collector", "isMut": true, @@ -360,11 +884,21 @@ export const IDL: CardinalCreatorStandard = { "isMut": true, "isSigner": true }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, { "name": "tokenProgram", "isMut": false, "isSigner": false }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, { "name": "systemProgram", "isMut": false, @@ -374,76 +908,215 @@ export const IDL: CardinalCreatorStandard = { "args": [] }, { - "name": "updateMintManager", + "name": "initAccount", "accounts": [ { - "name": "mintManager", + "name": "mint", "isMut": false, "isSigner": false }, { - "name": "standard", - "isMut": false, + "name": "tokenAccount", + "isMut": true, "isSigner": false }, { - "name": "authority", + "name": "tokenAccountOwner", "isMut": false, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, "isSigner": true }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, { "name": "systemProgram", "isMut": false, "isSigner": false } ], - "args": [ + "args": [] + }, + { + "name": "approve", + "accounts": [ { - "name": "ix", - "type": { - "defined": "UpdateMintManagerIx" - } + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "delegate", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false } - ] + ], + "args": [] }, { - "name": "initStandard", + "name": "revoke", "accounts": [ { - "name": "standard", + "name": "mintManager", "isMut": true, "isSigner": false }, { - "name": "authority", + "name": "mint", "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, "isSigner": true }, { - "name": "payer", + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "burn", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "holderTokenAccount", "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": false, "isSigner": true }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, { "name": "systemProgram", "isMut": false, "isSigner": false } ], - "args": [ + "args": [] + }, + { + "name": "close", + "accounts": [ { - "name": "ix", - "type": { - "defined": "InitStandardIx" - } + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false } - ] + ], + "args": [] }, { - "name": "updateStandard", + "name": "transfer", "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, { "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "from", + "isMut": true, + "isSigner": false + }, + { + "name": "to", "isMut": true, "isSigner": false }, @@ -452,20 +1125,70 @@ export const IDL: CardinalCreatorStandard = { "isMut": false, "isSigner": true }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, { "name": "systemProgram", "isMut": false, "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false } ], - "args": [ + "args": [] + }, + { + "name": "preTransfer", + "accounts": [ { - "name": "ix", - "type": { - "defined": "UpdateStandardIx" - } + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false } - ] + ], + "args": [] + }, + { + "name": "postTransfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "standard", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] } ], "accounts": [ @@ -622,8 +1345,8 @@ export const IDL: CardinalCreatorStandard = { }, { "code": 6003, - "name": "InvaldiMint", - "msg": "Invalid mint" + "name": "InvalidMintManager", + "msg": "Invalid mint manager" }, { "code": 6004, @@ -644,6 +1367,31 @@ export const IDL: CardinalCreatorStandard = { "code": 6007, "name": "InvalidHolderTokenAccount", "msg": "Invalid holder token account" + }, + { + "code": 6008, + "name": "InvalidStandard", + "msg": "Invalid standard" + }, + { + "code": 6009, + "name": "InvalidPreTransferInstruction", + "msg": "Invalid pre transfer instruction" + }, + { + "code": 6010, + "name": "InvalidPostTransferInstruction", + "msg": "Invalid post transfer instruction" + }, + { + "code": 6011, + "name": "ProgramDisallowed", + "msg": "Disallowed program included in transfer" + }, + { + "code": 6012, + "name": "ProgramNotAllowed", + "msg": "Program not allowed in allowed programs to transfer" } ] }; diff --git a/sdk/tests/init.test.ts b/sdk/tests/init.test.ts index 93ded365..29daaea3 100644 --- a/sdk/tests/init.test.ts +++ b/sdk/tests/init.test.ts @@ -14,6 +14,7 @@ import { let mint: PublicKey; const STANDARD_NAME = "global"; +const STANDARD_ID = findStandardId(STANDARD_NAME); beforeAll(async () => { const provider = await getProvider(); @@ -30,12 +31,11 @@ beforeAll(async () => { test("Create standard", async () => { const provider = await getProvider(); - const standardId = findStandardId(STANDARD_NAME); const tx = new Transaction(); tx.add( createInitStandardInstruction( { - standard: standardId, + standard: STANDARD_ID, authority: provider.wallet.publicKey, payer: provider.wallet.publicKey, }, @@ -52,7 +52,7 @@ test("Create standard", async () => { await executeTransaction(provider.connection, tx, provider.wallet); const standard = await Standard.fromAccountAddress( provider.connection, - standardId + STANDARD_ID ); expect(standard.authority.toString()).toBe( provider.wallet.publicKey.toString() From 63723bdc8755bf003a7575fdb62d47225f86780d Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 02:45:11 -0400 Subject: [PATCH 13/37] Rename disallowed addresses --- program/src/instructions/standard/init_standard.rs | 4 ++-- .../src/instructions/standard/update_standard.rs | 4 ++-- program/src/instructions/token/transfer.rs | 14 +++++++++----- program/src/state.rs | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/program/src/instructions/standard/init_standard.rs b/program/src/instructions/standard/init_standard.rs index b0df14c3..c54f596b 100644 --- a/program/src/instructions/standard/init_standard.rs +++ b/program/src/instructions/standard/init_standard.rs @@ -5,7 +5,7 @@ use anchor_lang::prelude::*; pub struct InitStandardIx { pub check_seller_fee_basis_points: bool, pub name: String, - pub disallowed_programs: Vec<Pubkey>, + pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, } @@ -34,6 +34,6 @@ pub fn handler(ctx: Context<InitStandardCtx>, ix: InitStandardIx) -> Result<()> standard.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; standard.name = ix.name; standard.allowed_programs = ix.allowed_programs; - standard.disallowed_programs = ix.disallowed_programs; + standard.disallowed_addresses = ix.disallowed_addresses; Ok(()) } diff --git a/program/src/instructions/standard/update_standard.rs b/program/src/instructions/standard/update_standard.rs index 0d4a8de8..71046aec 100644 --- a/program/src/instructions/standard/update_standard.rs +++ b/program/src/instructions/standard/update_standard.rs @@ -5,7 +5,7 @@ use anchor_lang::prelude::*; #[derive(AnchorSerialize, AnchorDeserialize)] pub struct UpdateStandardIx { pub check_seller_fee_basis_points: bool, - pub disallowed_programs: Vec<Pubkey>, + pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, } @@ -23,6 +23,6 @@ pub fn handler(ctx: Context<UpdateStandardCtx>, ix: UpdateStandardIx) -> Result< let standard = &mut ctx.accounts.standard; standard.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; standard.allowed_programs = ix.allowed_programs; - standard.disallowed_programs = ix.disallowed_programs; + standard.disallowed_addresses = ix.disallowed_addresses; Ok(()) } diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs index 626511d8..2cb9e313 100644 --- a/program/src/instructions/token/transfer.rs +++ b/program/src/instructions/token/transfer.rs @@ -75,19 +75,23 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { allowed_programs.insert(program_id); } - let mut disallowed_programs = HashSet::new(); - for program_id in &ctx.accounts.standard.disallowed_programs { - disallowed_programs.insert(program_id); + let mut disallowed_addresses = HashSet::new(); + for program_id in &ctx.accounts.standard.disallowed_addresses { + disallowed_addresses.insert(program_id); } for i in 0..num_instructions { let ix = load_instruction_at_checked(i.into(), &instructions_account_info) .expect("Failed to get instruction"); + if allowed_programs.len() > 0 && !allowed_programs.contains(&ix.program_id) { return Err(error!(ErrorCode::ProgramNotAllowed)); } - if disallowed_programs.len() > 0 && disallowed_programs.contains(&ix.program_id) { - return Err(error!(ErrorCode::ProgramDisallowed)); + + for account in ix.accounts { + if disallowed_addresses.len() > 0 && disallowed_addresses.contains(&account.pubkey) { + return Err(error!(ErrorCode::ProgramDisallowed)); + } } } diff --git a/program/src/state.rs b/program/src/state.rs index 9dbc19df..c92936e3 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -25,6 +25,6 @@ pub struct Standard { pub authority: Pubkey, pub check_seller_fee_basis_points: bool, pub name: String, - pub disallowed_programs: Vec<Pubkey>, + pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, } From 0a4a860d2ef83126acb3d8639b1919f94367bc03 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 02:51:42 -0400 Subject: [PATCH 14/37] Rename standard -> ruleset --- program/src/errors.rs | 4 +- .../mint_manager/init_mint_manager.rs | 6 +- .../mint_manager/update_mint_manager.rs | 4 +- program/src/instructions/mod.rs | 6 +- .../src/instructions/ruleset/init_ruleset.rs | 39 ++++++++ program/src/instructions/ruleset/mod.rs | 5 + .../instructions/ruleset/update_ruleset.rs | 28 ++++++ .../instructions/standard/init_standard.rs | 39 -------- program/src/instructions/standard/mod.rs | 5 - .../instructions/standard/update_standard.rs | 28 ------ program/src/instructions/token/init_mint.rs | 4 +- .../src/instructions/token/post_transfer.rs | 2 +- .../src/instructions/token/pre_transfer.rs | 2 +- program/src/instructions/token/transfer.rs | 10 +- program/src/lib.rs | 10 +- program/src/state.rs | 9 +- sdk/idl/cardinal_creator_standard.json | 46 +++++----- sdk/src/generated/accounts/MintManager.ts | 10 +- .../accounts/{Standard.ts => Ruleset.ts} | 87 +++++++++--------- sdk/src/generated/accounts/index.ts | 6 +- sdk/src/generated/errors/index.ts | 17 ++-- sdk/src/generated/instructions/index.ts | 4 +- sdk/src/generated/instructions/initMint.ts | 6 +- .../generated/instructions/initMintManager.ts | 6 +- .../{initStandard.ts => initRuleset.ts} | 48 +++++----- .../generated/instructions/postTransfer.ts | 6 +- sdk/src/generated/instructions/preTransfer.ts | 6 +- sdk/src/generated/instructions/transfer.ts | 6 +- .../instructions/updateMintManager.ts | 6 +- .../{updateStandard.ts => updateRuleset.ts} | 51 +++++----- .../{InitStandardIx.ts => InitRulesetIx.ts} | 23 +++-- ...UpdateStandardIx.ts => UpdateRulesetIx.ts} | 12 +-- sdk/src/generated/types/index.ts | 4 +- sdk/src/idl/cardinal_creator_standard.ts | 92 ++++++++++--------- 34 files changed, 324 insertions(+), 313 deletions(-) create mode 100644 program/src/instructions/ruleset/init_ruleset.rs create mode 100644 program/src/instructions/ruleset/mod.rs create mode 100644 program/src/instructions/ruleset/update_ruleset.rs delete mode 100644 program/src/instructions/standard/init_standard.rs delete mode 100644 program/src/instructions/standard/mod.rs delete mode 100644 program/src/instructions/standard/update_standard.rs rename sdk/src/generated/accounts/{Standard.ts => Ruleset.ts} (65%) rename sdk/src/generated/instructions/{initStandard.ts => initRuleset.ts} (62%) rename sdk/src/generated/instructions/{updateStandard.ts => updateRuleset.ts} (58%) rename sdk/src/generated/types/{InitStandardIx.ts => InitRulesetIx.ts} (56%) rename sdk/src/generated/types/{UpdateStandardIx.ts => UpdateRulesetIx.ts} (72%) diff --git a/program/src/errors.rs b/program/src/errors.rs index 3cfe6b80..188bf7ab 100644 --- a/program/src/errors.rs +++ b/program/src/errors.rs @@ -18,8 +18,8 @@ pub enum ErrorCode { InvalidCloseTokenAccount, #[msg("Invalid holder token account")] InvalidHolderTokenAccount, - #[msg("Invalid standard")] - InvalidStandard, + #[msg("Invalid ruleset")] + InvalidRuleset, #[msg("Invalid pre transfer instruction")] InvalidPreTransferInstruction, #[msg("Invalid post transfer instruction")] diff --git a/program/src/instructions/mint_manager/init_mint_manager.rs b/program/src/instructions/mint_manager/init_mint_manager.rs index 1359dcf9..511a2766 100644 --- a/program/src/instructions/mint_manager/init_mint_manager.rs +++ b/program/src/instructions/mint_manager/init_mint_manager.rs @@ -21,10 +21,10 @@ pub struct InitMintManagerCtx<'info> { mint_manager: Account<'info, MintManager>, #[account(mut)] mint: Account<'info, Mint>, - standard: Account<'info, Standard>, + ruleset: Account<'info, Ruleset>, /// CHECK: Account is not read from - #[account(mut, constraint = collector.key() == standard.authority @ ErrorCode::InvalidCollector)] + #[account(mut, constraint = collector.key() == ruleset.collector @ ErrorCode::InvalidCollector)] collector: UncheckedAccount<'info>, authority: Signer<'info>, #[account(mut)] @@ -39,7 +39,7 @@ pub fn handler(ctx: Context<InitMintManagerCtx>) -> Result<()> { mint_manager.version = 0; mint_manager.authority = ctx.accounts.authority.key(); mint_manager.mint = ctx.accounts.mint.key(); - mint_manager.standard = ctx.accounts.standard.key(); + mint_manager.ruleset = ctx.accounts.ruleset.key(); if ctx.accounts.mint.supply != 1 || ctx.accounts.mint.decimals != 0 { return Err(error!(ErrorCode::InvalidMint)); diff --git a/program/src/instructions/mint_manager/update_mint_manager.rs b/program/src/instructions/mint_manager/update_mint_manager.rs index b3f022f2..07e219c0 100644 --- a/program/src/instructions/mint_manager/update_mint_manager.rs +++ b/program/src/instructions/mint_manager/update_mint_manager.rs @@ -10,7 +10,7 @@ pub struct UpdateMintManagerIx { #[derive(Accounts)] pub struct UpdateMintManagerCtx<'info> { mint_manager: Account<'info, MintManager>, - standard: Account<'info, Standard>, + ruleset: Account<'info, Ruleset>, #[account(constraint = authority.key() == mint_manager.authority @ ErrorCode::InvalidAuthority)] authority: Signer<'info>, system_program: Program<'info, System>, @@ -19,6 +19,6 @@ pub struct UpdateMintManagerCtx<'info> { pub fn handler(ctx: Context<UpdateMintManagerCtx>, ix: UpdateMintManagerIx) -> Result<()> { let mint_manager = &mut ctx.accounts.mint_manager; mint_manager.authority = ix.authority; - mint_manager.standard = ctx.accounts.standard.key(); + mint_manager.ruleset = ctx.accounts.ruleset.key(); Ok(()) } diff --git a/program/src/instructions/mod.rs b/program/src/instructions/mod.rs index 555c113e..1e52c64d 100644 --- a/program/src/instructions/mod.rs +++ b/program/src/instructions/mod.rs @@ -2,9 +2,9 @@ pub mod mint_manager; pub use mint_manager::init_mint_manager::*; pub use mint_manager::update_mint_manager::*; -pub mod standard; -pub use standard::init_standard::*; -pub use standard::update_standard::*; +pub mod ruleset; +pub use ruleset::init_ruleset::*; +pub use ruleset::update_ruleset::*; pub mod token; pub use token::approve::*; diff --git a/program/src/instructions/ruleset/init_ruleset.rs b/program/src/instructions/ruleset/init_ruleset.rs new file mode 100644 index 00000000..bc00a9a2 --- /dev/null +++ b/program/src/instructions/ruleset/init_ruleset.rs @@ -0,0 +1,39 @@ +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct InitRulesetIx { + pub check_seller_fee_basis_points: bool, + pub name: String, + pub disallowed_addresses: Vec<Pubkey>, + pub allowed_programs: Vec<Pubkey>, +} + +#[derive(Accounts)] +#[instruction(ix: InitRulesetIx)] +pub struct InitRulesetCtx<'info> { + #[account( + init, + payer = payer, + space = RULESET_SIZE, + seeds = [RULESET_SEED.as_bytes(), ix.name.as_bytes()], + bump, + )] + ruleset: Account<'info, Ruleset>, + authority: Signer<'info>, + #[account(mut)] + payer: Signer<'info>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<InitRulesetCtx>, ix: InitRulesetIx) -> Result<()> { + let ruleset = &mut ctx.accounts.ruleset; + ruleset.bump = *ctx.bumps.get("ruleset").unwrap(); + ruleset.version = 0; + ruleset.authority = ctx.accounts.authority.key(); + ruleset.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; + ruleset.name = ix.name; + ruleset.allowed_programs = ix.allowed_programs; + ruleset.disallowed_addresses = ix.disallowed_addresses; + Ok(()) +} diff --git a/program/src/instructions/ruleset/mod.rs b/program/src/instructions/ruleset/mod.rs new file mode 100644 index 00000000..8bc8518a --- /dev/null +++ b/program/src/instructions/ruleset/mod.rs @@ -0,0 +1,5 @@ +pub mod init_ruleset; +pub use init_ruleset::*; + +pub mod update_ruleset; +pub use update_ruleset::*; diff --git a/program/src/instructions/ruleset/update_ruleset.rs b/program/src/instructions/ruleset/update_ruleset.rs new file mode 100644 index 00000000..b4949ab9 --- /dev/null +++ b/program/src/instructions/ruleset/update_ruleset.rs @@ -0,0 +1,28 @@ +use crate::errors::ErrorCode; +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(AnchorSerialize, AnchorDeserialize)] +pub struct UpdateRulesetIx { + pub check_seller_fee_basis_points: bool, + pub disallowed_addresses: Vec<Pubkey>, + pub allowed_programs: Vec<Pubkey>, +} + +#[derive(Accounts)] +#[instruction(ix: UpdateRulesetIx)] +pub struct UpdateRulesetCtx<'info> { + #[account(mut)] + ruleset: Account<'info, Ruleset>, + #[account(constraint = authority.key() == ruleset.authority @ ErrorCode::InvalidAuthority)] + authority: Signer<'info>, + system_program: Program<'info, System>, +} + +pub fn handler(ctx: Context<UpdateRulesetCtx>, ix: UpdateRulesetIx) -> Result<()> { + let ruleset = &mut ctx.accounts.ruleset; + ruleset.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; + ruleset.allowed_programs = ix.allowed_programs; + ruleset.disallowed_addresses = ix.disallowed_addresses; + Ok(()) +} diff --git a/program/src/instructions/standard/init_standard.rs b/program/src/instructions/standard/init_standard.rs deleted file mode 100644 index c54f596b..00000000 --- a/program/src/instructions/standard/init_standard.rs +++ /dev/null @@ -1,39 +0,0 @@ -use crate::state::*; -use anchor_lang::prelude::*; - -#[derive(AnchorSerialize, AnchorDeserialize)] -pub struct InitStandardIx { - pub check_seller_fee_basis_points: bool, - pub name: String, - pub disallowed_addresses: Vec<Pubkey>, - pub allowed_programs: Vec<Pubkey>, -} - -#[derive(Accounts)] -#[instruction(ix: InitStandardIx)] -pub struct InitStandardCtx<'info> { - #[account( - init, - payer = payer, - space = STANDARD_SIZE, - seeds = [STANDARD_SEED.as_bytes(), ix.name.as_bytes()], - bump, - )] - standard: Account<'info, Standard>, - authority: Signer<'info>, - #[account(mut)] - payer: Signer<'info>, - system_program: Program<'info, System>, -} - -pub fn handler(ctx: Context<InitStandardCtx>, ix: InitStandardIx) -> Result<()> { - let standard = &mut ctx.accounts.standard; - standard.bump = *ctx.bumps.get("standard").unwrap(); - standard.version = 0; - standard.authority = ctx.accounts.authority.key(); - standard.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; - standard.name = ix.name; - standard.allowed_programs = ix.allowed_programs; - standard.disallowed_addresses = ix.disallowed_addresses; - Ok(()) -} diff --git a/program/src/instructions/standard/mod.rs b/program/src/instructions/standard/mod.rs deleted file mode 100644 index f5b159ba..00000000 --- a/program/src/instructions/standard/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod init_standard; -pub use init_standard::*; - -pub mod update_standard; -pub use update_standard::*; diff --git a/program/src/instructions/standard/update_standard.rs b/program/src/instructions/standard/update_standard.rs deleted file mode 100644 index 71046aec..00000000 --- a/program/src/instructions/standard/update_standard.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::errors::ErrorCode; -use crate::state::*; -use anchor_lang::prelude::*; - -#[derive(AnchorSerialize, AnchorDeserialize)] -pub struct UpdateStandardIx { - pub check_seller_fee_basis_points: bool, - pub disallowed_addresses: Vec<Pubkey>, - pub allowed_programs: Vec<Pubkey>, -} - -#[derive(Accounts)] -#[instruction(ix: UpdateStandardIx)] -pub struct UpdateStandardCtx<'info> { - #[account(mut)] - standard: Account<'info, Standard>, - #[account(constraint = authority.key() == standard.authority @ ErrorCode::InvalidAuthority)] - authority: Signer<'info>, - system_program: Program<'info, System>, -} - -pub fn handler(ctx: Context<UpdateStandardCtx>, ix: UpdateStandardIx) -> Result<()> { - let standard = &mut ctx.accounts.standard; - standard.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; - standard.allowed_programs = ix.allowed_programs; - standard.disallowed_addresses = ix.disallowed_addresses; - Ok(()) -} diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index ef63506e..0c69d4e0 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -25,7 +25,7 @@ pub struct InitMintCtx<'info> { /// CHECK: Account is not read from #[account(mut)] mint: UncheckedAccount<'info>, - standard: Account<'info, Standard>, + ruleset: Account<'info, Ruleset>, /// CHECK: Account created or checked in handler #[account(mut)] @@ -51,7 +51,7 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { mint_manager.version = 0; mint_manager.authority = ctx.accounts.authority.key(); mint_manager.mint = ctx.accounts.mint.key(); - mint_manager.standard = ctx.accounts.standard.key(); + mint_manager.ruleset = ctx.accounts.ruleset.key(); // Create Mint invoke( diff --git a/program/src/instructions/token/post_transfer.rs b/program/src/instructions/token/post_transfer.rs index aff66faa..67937255 100644 --- a/program/src/instructions/token/post_transfer.rs +++ b/program/src/instructions/token/post_transfer.rs @@ -7,7 +7,7 @@ pub const POST_TRANSFER_DISCRIMINATOR: [u8; 8] = [195, 252, 43, 202, 149, 119, 1 #[derive(Accounts)] pub struct PostTransferCtx<'info> { mint_manager: Account<'info, MintManager>, - standard: Account<'info, Standard>, + ruleset: Account<'info, Ruleset>, /// CHECK: This is not dangerous because the ID is checked with instructions sysvar #[account(address = sysvar::instructions::id())] instructions: UncheckedAccount<'info>, diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs index e61134b3..1a0c2318 100644 --- a/program/src/instructions/token/pre_transfer.rs +++ b/program/src/instructions/token/pre_transfer.rs @@ -7,7 +7,7 @@ pub const PRE_TRANSFER_DISCRIMINATOR: [u8; 8] = [158, 85, 53, 202, 155, 118, 19, #[derive(Accounts)] pub struct PreTransferCtx<'info> { mint_manager: Account<'info, MintManager>, - standard: Account<'info, Standard>, + ruleset: Account<'info, Ruleset>, /// CHECK: This is not dangerous because the ID is checked with instructions sysvar #[account(address = sysvar::instructions::id())] instructions: UncheckedAccount<'info>, diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs index 2cb9e313..496ac519 100644 --- a/program/src/instructions/token/transfer.rs +++ b/program/src/instructions/token/transfer.rs @@ -22,8 +22,8 @@ use super::PRE_TRANSFER_DISCRIMINATOR; pub struct TransferCtx<'info> { #[account(constraint = mint.key() == mint_manager.mint @ ErrorCode::InvalidMintManager)] mint_manager: Box<Account<'info, MintManager>>, - #[account(constraint = standard.key() == mint_manager.standard @ ErrorCode::InvalidStandard)] - standard: Account<'info, Standard>, + #[account(constraint = ruleset.key() == mint_manager.ruleset @ ErrorCode::InvalidRuleset)] + ruleset: Account<'info, Ruleset>, mint: Box<Account<'info, Mint>>, #[account(mut)] @@ -48,7 +48,7 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { read_u16(&mut current, &instruction_sysvar).expect("Invalid instruction"); // check pre/post - if ctx.accounts.standard.check_seller_fee_basis_points { + if ctx.accounts.ruleset.check_seller_fee_basis_points { // check pre_transfer let first_ix = load_instruction_at_checked(0, &instructions_account_info) .expect("Failed to get first instruction"); @@ -71,12 +71,12 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { // check allowed / disallowed let mut allowed_programs = HashSet::new(); - for program_id in &ctx.accounts.standard.allowed_programs { + for program_id in &ctx.accounts.ruleset.allowed_programs { allowed_programs.insert(program_id); } let mut disallowed_addresses = HashSet::new(); - for program_id in &ctx.accounts.standard.disallowed_addresses { + for program_id in &ctx.accounts.ruleset.disallowed_addresses { disallowed_addresses.insert(program_id); } diff --git a/program/src/lib.rs b/program/src/lib.rs index fdf6f11f..f14eefb9 100644 --- a/program/src/lib.rs +++ b/program/src/lib.rs @@ -23,13 +23,13 @@ pub mod cardinal_creator_standard { mint_manager::update_mint_manager::handler(ctx, ix) } - // standard - pub fn init_standard(ctx: Context<InitStandardCtx>, ix: InitStandardIx) -> Result<()> { - standard::init_standard::handler(ctx, ix) + // ruleset + pub fn init_ruleset(ctx: Context<InitRulesetCtx>, ix: InitRulesetIx) -> Result<()> { + ruleset::init_ruleset::handler(ctx, ix) } - pub fn update_standard(ctx: Context<UpdateStandardCtx>, ix: UpdateStandardIx) -> Result<()> { - standard::update_standard::handler(ctx, ix) + pub fn update_ruleset(ctx: Context<UpdateRulesetCtx>, ix: UpdateRulesetIx) -> Result<()> { + ruleset::update_ruleset::handler(ctx, ix) } // token diff --git a/program/src/state.rs b/program/src/state.rs index c92936e3..b127d8d3 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -12,17 +12,18 @@ pub struct MintManager { pub version: u8, pub mint: Pubkey, pub authority: Pubkey, - pub standard: Pubkey, + pub ruleset: Pubkey, } -pub const STANDARD_SEED: &str = "standard"; -pub const STANDARD_SIZE: usize = 8 + 1 + 1 + 1 + 24 + (32 * 10) + (32 * 10); +pub const RULESET_SEED: &str = "ruleset"; +pub const RULESET_SIZE: usize = 8 + 1 + 1 + 1 + 24 + (32 * 10) + (32 * 10); #[account] -pub struct Standard { +pub struct Ruleset { pub bump: u8, pub version: u8, pub authority: Pubkey, + pub collector: Pubkey, pub check_seller_fee_basis_points: bool, pub name: String, pub disallowed_addresses: Vec<Pubkey>, diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index 1553449d..4d5c43fb 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -16,7 +16,7 @@ "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -57,7 +57,7 @@ "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -82,10 +82,10 @@ ] }, { - "name": "initStandard", + "name": "initRuleset", "accounts": [ { - "name": "standard", + "name": "ruleset", "isMut": true, "isSigner": false }, @@ -109,16 +109,16 @@ { "name": "ix", "type": { - "defined": "InitStandardIx" + "defined": "InitRulesetIx" } } ] }, { - "name": "updateStandard", + "name": "updateRuleset", "accounts": [ { - "name": "standard", + "name": "ruleset", "isMut": true, "isSigner": false }, @@ -137,7 +137,7 @@ { "name": "ix", "type": { - "defined": "UpdateStandardIx" + "defined": "UpdateRulesetIx" } } ] @@ -156,7 +156,7 @@ "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -402,7 +402,7 @@ "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -458,7 +458,7 @@ "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -479,7 +479,7 @@ "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -515,14 +515,14 @@ "type": "publicKey" }, { - "name": "standard", + "name": "ruleset", "type": "publicKey" } ] } }, { - "name": "Standard", + "name": "Ruleset", "type": { "kind": "struct", "fields": [ @@ -538,6 +538,10 @@ "name": "authority", "type": "publicKey" }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "checkSellerFeeBasisPoints", "type": "bool" @@ -547,7 +551,7 @@ "type": "string" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -576,7 +580,7 @@ } }, { - "name": "InitStandardIx", + "name": "InitRulesetIx", "type": { "kind": "struct", "fields": [ @@ -589,7 +593,7 @@ "type": "string" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -604,7 +608,7 @@ } }, { - "name": "UpdateStandardIx", + "name": "UpdateRulesetIx", "type": { "kind": "struct", "fields": [ @@ -613,7 +617,7 @@ "type": "bool" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -671,8 +675,8 @@ }, { "code": 6008, - "name": "InvalidStandard", - "msg": "Invalid standard" + "name": "InvalidRuleset", + "msg": "Invalid ruleset" }, { "code": 6009, diff --git a/sdk/src/generated/accounts/MintManager.ts b/sdk/src/generated/accounts/MintManager.ts index 813df15d..3b133317 100644 --- a/sdk/src/generated/accounts/MintManager.ts +++ b/sdk/src/generated/accounts/MintManager.ts @@ -19,7 +19,7 @@ export type MintManagerArgs = { version: number mint: web3.PublicKey authority: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey } export const mintManagerDiscriminator = [202, 47, 44, 178, 55, 215, 117, 40] @@ -36,7 +36,7 @@ export class MintManager implements MintManagerArgs { readonly version: number, readonly mint: web3.PublicKey, readonly authority: web3.PublicKey, - readonly standard: web3.PublicKey + readonly ruleset: web3.PublicKey ) {} /** @@ -48,7 +48,7 @@ export class MintManager implements MintManagerArgs { args.version, args.mint, args.authority, - args.standard + args.ruleset ) } @@ -155,7 +155,7 @@ export class MintManager implements MintManagerArgs { version: this.version, mint: this.mint.toBase58(), authority: this.authority.toBase58(), - standard: this.standard.toBase58(), + ruleset: this.ruleset.toBase58(), } } } @@ -176,7 +176,7 @@ export const mintManagerBeet = new beet.BeetStruct< ['version', beet.u8], ['mint', beetSolana.publicKey], ['authority', beetSolana.publicKey], - ['standard', beetSolana.publicKey], + ['ruleset', beetSolana.publicKey], ], MintManager.fromArgs, 'MintManager' diff --git a/sdk/src/generated/accounts/Standard.ts b/sdk/src/generated/accounts/Ruleset.ts similarity index 65% rename from sdk/src/generated/accounts/Standard.ts rename to sdk/src/generated/accounts/Ruleset.ts index 90f8ba53..bb1f2246 100644 --- a/sdk/src/generated/accounts/Standard.ts +++ b/sdk/src/generated/accounts/Ruleset.ts @@ -10,80 +10,83 @@ import * as beet from '@metaplex-foundation/beet' import * as beetSolana from '@metaplex-foundation/beet-solana' /** - * Arguments used to create {@link Standard} + * Arguments used to create {@link Ruleset} * @category Accounts * @category generated */ -export type StandardArgs = { +export type RulesetArgs = { bump: number version: number authority: web3.PublicKey + collector: web3.PublicKey checkSellerFeeBasisPoints: boolean name: string - disallowedPrograms: web3.PublicKey[] + disallowedAddresses: web3.PublicKey[] allowedPrograms: web3.PublicKey[] } -export const standardDiscriminator = [183, 73, 235, 183, 240, 4, 194, 116] +export const rulesetDiscriminator = [123, 92, 136, 166, 160, 236, 248, 180] /** - * Holds the data for the {@link Standard} Account and provides de/serialization + * Holds the data for the {@link Ruleset} Account and provides de/serialization * functionality for that data * * @category Accounts * @category generated */ -export class Standard implements StandardArgs { +export class Ruleset implements RulesetArgs { private constructor( readonly bump: number, readonly version: number, readonly authority: web3.PublicKey, + readonly collector: web3.PublicKey, readonly checkSellerFeeBasisPoints: boolean, readonly name: string, - readonly disallowedPrograms: web3.PublicKey[], + readonly disallowedAddresses: web3.PublicKey[], readonly allowedPrograms: web3.PublicKey[] ) {} /** - * Creates a {@link Standard} instance from the provided args. + * Creates a {@link Ruleset} instance from the provided args. */ - static fromArgs(args: StandardArgs) { - return new Standard( + static fromArgs(args: RulesetArgs) { + return new Ruleset( args.bump, args.version, args.authority, + args.collector, args.checkSellerFeeBasisPoints, args.name, - args.disallowedPrograms, + args.disallowedAddresses, args.allowedPrograms ) } /** - * Deserializes the {@link Standard} from the data of the provided {@link web3.AccountInfo}. + * Deserializes the {@link Ruleset} from the data of the provided {@link web3.AccountInfo}. * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. */ static fromAccountInfo( accountInfo: web3.AccountInfo<Buffer>, offset = 0 - ): [Standard, number] { - return Standard.deserialize(accountInfo.data, offset) + ): [Ruleset, number] { + return Ruleset.deserialize(accountInfo.data, offset) } /** * Retrieves the account info from the provided address and deserializes - * the {@link Standard} from its data. + * the {@link Ruleset} from its data. * * @throws Error if no account info is found at the address or if deserialization fails */ static async fromAccountAddress( connection: web3.Connection, address: web3.PublicKey - ): Promise<Standard> { + ): Promise<Ruleset> { const accountInfo = await connection.getAccountInfo(address) if (accountInfo == null) { - throw new Error(`Unable to find Standard account at ${address}`) + throw new Error(`Unable to find Ruleset account at ${address}`) } - return Standard.fromAccountInfo(accountInfo, 0)[0] + return Ruleset.fromAccountInfo(accountInfo, 0)[0] } /** @@ -97,64 +100,64 @@ export class Standard implements StandardArgs { 'creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez' ) ) { - return beetSolana.GpaBuilder.fromStruct(programId, standardBeet) + return beetSolana.GpaBuilder.fromStruct(programId, rulesetBeet) } /** - * Deserializes the {@link Standard} from the provided data Buffer. + * Deserializes the {@link Ruleset} from the provided data Buffer. * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. */ - static deserialize(buf: Buffer, offset = 0): [Standard, number] { - return standardBeet.deserialize(buf, offset) + static deserialize(buf: Buffer, offset = 0): [Ruleset, number] { + return rulesetBeet.deserialize(buf, offset) } /** - * Serializes the {@link Standard} into a Buffer. + * Serializes the {@link Ruleset} into a Buffer. * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. */ serialize(): [Buffer, number] { - return standardBeet.serialize({ - accountDiscriminator: standardDiscriminator, + return rulesetBeet.serialize({ + accountDiscriminator: rulesetDiscriminator, ...this, }) } /** * Returns the byteSize of a {@link Buffer} holding the serialized data of - * {@link Standard} for the provided args. + * {@link Ruleset} for the provided args. * * @param args need to be provided since the byte size for this account * depends on them */ - static byteSize(args: StandardArgs) { - const instance = Standard.fromArgs(args) - return standardBeet.toFixedFromValue({ - accountDiscriminator: standardDiscriminator, + static byteSize(args: RulesetArgs) { + const instance = Ruleset.fromArgs(args) + return rulesetBeet.toFixedFromValue({ + accountDiscriminator: rulesetDiscriminator, ...instance, }).byteSize } /** * Fetches the minimum balance needed to exempt an account holding - * {@link Standard} data from rent + * {@link Ruleset} data from rent * * @param args need to be provided since the byte size for this account * depends on them * @param connection used to retrieve the rent exemption information */ static async getMinimumBalanceForRentExemption( - args: StandardArgs, + args: RulesetArgs, connection: web3.Connection, commitment?: web3.Commitment ): Promise<number> { return connection.getMinimumBalanceForRentExemption( - Standard.byteSize(args), + Ruleset.byteSize(args), commitment ) } /** - * Returns a readable version of {@link Standard} properties + * Returns a readable version of {@link Ruleset} properties * and can be used to convert to JSON and/or logging */ pretty() { @@ -162,9 +165,10 @@ export class Standard implements StandardArgs { bump: this.bump, version: this.version, authority: this.authority.toBase58(), + collector: this.collector.toBase58(), checkSellerFeeBasisPoints: this.checkSellerFeeBasisPoints, name: this.name, - disallowedPrograms: this.disallowedPrograms, + disallowedAddresses: this.disallowedAddresses, allowedPrograms: this.allowedPrograms, } } @@ -174,9 +178,9 @@ export class Standard implements StandardArgs { * @category Accounts * @category generated */ -export const standardBeet = new beet.FixableBeetStruct< - Standard, - StandardArgs & { +export const rulesetBeet = new beet.FixableBeetStruct< + Ruleset, + RulesetArgs & { accountDiscriminator: number[] /* size: 8 */ } >( @@ -185,11 +189,12 @@ export const standardBeet = new beet.FixableBeetStruct< ['bump', beet.u8], ['version', beet.u8], ['authority', beetSolana.publicKey], + ['collector', beetSolana.publicKey], ['checkSellerFeeBasisPoints', beet.bool], ['name', beet.utf8String], - ['disallowedPrograms', beet.array(beetSolana.publicKey)], + ['disallowedAddresses', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], ], - Standard.fromArgs, - 'Standard' + Ruleset.fromArgs, + 'Ruleset' ) diff --git a/sdk/src/generated/accounts/index.ts b/sdk/src/generated/accounts/index.ts index 3ce7bbed..8fe79dfa 100644 --- a/sdk/src/generated/accounts/index.ts +++ b/sdk/src/generated/accounts/index.ts @@ -1,7 +1,7 @@ export * from './MintManager' -export * from './Standard' +export * from './Ruleset' import { MintManager } from './MintManager' -import { Standard } from './Standard' +import { Ruleset } from './Ruleset' -export const accountProviders = { MintManager, Standard } +export const accountProviders = { MintManager, Ruleset } diff --git a/sdk/src/generated/errors/index.ts b/sdk/src/generated/errors/index.ts index 4614bc23..a979a768 100644 --- a/sdk/src/generated/errors/index.ts +++ b/sdk/src/generated/errors/index.ts @@ -202,27 +202,24 @@ createErrorFromNameLookup.set( ) /** - * InvalidStandard: 'Invalid standard' + * InvalidRuleset: 'Invalid ruleset' * * @category Errors * @category generated */ -export class InvalidStandardError extends Error { +export class InvalidRulesetError extends Error { readonly code: number = 0x1778 - readonly name: string = 'InvalidStandard' + readonly name: string = 'InvalidRuleset' constructor() { - super('Invalid standard') + super('Invalid ruleset') if (typeof Error.captureStackTrace === 'function') { - Error.captureStackTrace(this, InvalidStandardError) + Error.captureStackTrace(this, InvalidRulesetError) } } } -createErrorFromCodeLookup.set(0x1778, () => new InvalidStandardError()) -createErrorFromNameLookup.set( - 'InvalidStandard', - () => new InvalidStandardError() -) +createErrorFromCodeLookup.set(0x1778, () => new InvalidRulesetError()) +createErrorFromNameLookup.set('InvalidRuleset', () => new InvalidRulesetError()) /** * InvalidPreTransferInstruction: 'Invalid pre transfer instruction' diff --git a/sdk/src/generated/instructions/index.ts b/sdk/src/generated/instructions/index.ts index 942cbeba..f7c4fd3e 100644 --- a/sdk/src/generated/instructions/index.ts +++ b/sdk/src/generated/instructions/index.ts @@ -4,10 +4,10 @@ export * from './close' export * from './initAccount' export * from './initMint' export * from './initMintManager' -export * from './initStandard' +export * from './initRuleset' export * from './postTransfer' export * from './preTransfer' export * from './revoke' export * from './transfer' export * from './updateMintManager' -export * from './updateStandard' +export * from './updateRuleset' diff --git a/sdk/src/generated/instructions/initMint.ts b/sdk/src/generated/instructions/initMint.ts index bdc120a9..88e3bab4 100644 --- a/sdk/src/generated/instructions/initMint.ts +++ b/sdk/src/generated/instructions/initMint.ts @@ -25,7 +25,7 @@ export const initMintStruct = new beet.BeetArgsStruct<{ * * @property [_writable_] mintManager * @property [_writable_] mint - * @property [] standard + * @property [] ruleset * @property [_writable_] targetTokenAccount * @property [**signer**] target * @property [_writable_] collector @@ -39,7 +39,7 @@ export const initMintStruct = new beet.BeetArgsStruct<{ export type InitMintInstructionAccounts = { mintManager: web3.PublicKey mint: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey targetTokenAccount: web3.PublicKey target: web3.PublicKey collector: web3.PublicKey @@ -82,7 +82,7 @@ export function createInitMintInstruction( isSigner: false, }, { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: false, isSigner: false, }, diff --git a/sdk/src/generated/instructions/initMintManager.ts b/sdk/src/generated/instructions/initMintManager.ts index 25e82642..c634c693 100644 --- a/sdk/src/generated/instructions/initMintManager.ts +++ b/sdk/src/generated/instructions/initMintManager.ts @@ -25,7 +25,7 @@ export const initMintManagerStruct = new beet.BeetArgsStruct<{ * * @property [_writable_] mintManager * @property [_writable_] mint - * @property [] standard + * @property [] ruleset * @property [_writable_] collector * @property [**signer**] authority * @property [_writable_, **signer**] payer @@ -36,7 +36,7 @@ export const initMintManagerStruct = new beet.BeetArgsStruct<{ export type InitMintManagerInstructionAccounts = { mintManager: web3.PublicKey mint: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey collector: web3.PublicKey authority: web3.PublicKey payer: web3.PublicKey @@ -75,7 +75,7 @@ export function createInitMintManagerInstruction( isSigner: false, }, { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: false, isSigner: false, }, diff --git a/sdk/src/generated/instructions/initStandard.ts b/sdk/src/generated/instructions/initRuleset.ts similarity index 62% rename from sdk/src/generated/instructions/initStandard.ts rename to sdk/src/generated/instructions/initRuleset.ts index 76ed5007..48ae9517 100644 --- a/sdk/src/generated/instructions/initStandard.ts +++ b/sdk/src/generated/instructions/initRuleset.ts @@ -7,75 +7,75 @@ import * as beet from '@metaplex-foundation/beet' import * as web3 from '@solana/web3.js' -import { InitStandardIx, initStandardIxBeet } from '../types/InitStandardIx' +import { InitRulesetIx, initRulesetIxBeet } from '../types/InitRulesetIx' /** * @category Instructions - * @category InitStandard + * @category InitRuleset * @category generated */ -export type InitStandardInstructionArgs = { - ix: InitStandardIx +export type InitRulesetInstructionArgs = { + ix: InitRulesetIx } /** * @category Instructions - * @category InitStandard + * @category InitRuleset * @category generated */ -export const initStandardStruct = new beet.FixableBeetArgsStruct< - InitStandardInstructionArgs & { +export const initRulesetStruct = new beet.FixableBeetArgsStruct< + InitRulesetInstructionArgs & { instructionDiscriminator: number[] /* size: 8 */ } >( [ ['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], - ['ix', initStandardIxBeet], + ['ix', initRulesetIxBeet], ], - 'InitStandardInstructionArgs' + 'InitRulesetInstructionArgs' ) /** - * Accounts required by the _initStandard_ instruction + * Accounts required by the _initRuleset_ instruction * - * @property [_writable_] standard + * @property [_writable_] ruleset * @property [**signer**] authority * @property [_writable_, **signer**] payer * @category Instructions - * @category InitStandard + * @category InitRuleset * @category generated */ -export type InitStandardInstructionAccounts = { - standard: web3.PublicKey +export type InitRulesetInstructionAccounts = { + ruleset: web3.PublicKey authority: web3.PublicKey payer: web3.PublicKey systemProgram?: web3.PublicKey } -export const initStandardInstructionDiscriminator = [ - 85, 84, 110, 234, 166, 27, 75, 173, +export const initRulesetInstructionDiscriminator = [ + 172, 10, 116, 39, 103, 94, 225, 194, ] /** - * Creates a _InitStandard_ instruction. + * Creates a _InitRuleset_ instruction. * * @param accounts that will be accessed while the instruction is processed * @param args to provide as instruction data to the program * * @category Instructions - * @category InitStandard + * @category InitRuleset * @category generated */ -export function createInitStandardInstruction( - accounts: InitStandardInstructionAccounts, - args: InitStandardInstructionArgs, +export function createInitRulesetInstruction( + accounts: InitRulesetInstructionAccounts, + args: InitRulesetInstructionArgs, programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') ) { - const [data] = initStandardStruct.serialize({ - instructionDiscriminator: initStandardInstructionDiscriminator, + const [data] = initRulesetStruct.serialize({ + instructionDiscriminator: initRulesetInstructionDiscriminator, ...args, }) const keys: web3.AccountMeta[] = [ { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: true, isSigner: false, }, diff --git a/sdk/src/generated/instructions/postTransfer.ts b/sdk/src/generated/instructions/postTransfer.ts index 0fe692da..100cec45 100644 --- a/sdk/src/generated/instructions/postTransfer.ts +++ b/sdk/src/generated/instructions/postTransfer.ts @@ -23,7 +23,7 @@ export const postTransferStruct = new beet.BeetArgsStruct<{ * Accounts required by the _postTransfer_ instruction * * @property [] mintManager - * @property [] standard + * @property [] ruleset * @property [] instructions * @category Instructions * @category PostTransfer @@ -31,7 +31,7 @@ export const postTransferStruct = new beet.BeetArgsStruct<{ */ export type PostTransferInstructionAccounts = { mintManager: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey instructions: web3.PublicKey } @@ -61,7 +61,7 @@ export function createPostTransferInstruction( isSigner: false, }, { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: false, isSigner: false, }, diff --git a/sdk/src/generated/instructions/preTransfer.ts b/sdk/src/generated/instructions/preTransfer.ts index 932f87a3..cf34f75d 100644 --- a/sdk/src/generated/instructions/preTransfer.ts +++ b/sdk/src/generated/instructions/preTransfer.ts @@ -23,7 +23,7 @@ export const preTransferStruct = new beet.BeetArgsStruct<{ * Accounts required by the _preTransfer_ instruction * * @property [] mintManager - * @property [] standard + * @property [] ruleset * @property [] instructions * @category Instructions * @category PreTransfer @@ -31,7 +31,7 @@ export const preTransferStruct = new beet.BeetArgsStruct<{ */ export type PreTransferInstructionAccounts = { mintManager: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey instructions: web3.PublicKey } @@ -61,7 +61,7 @@ export function createPreTransferInstruction( isSigner: false, }, { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: false, isSigner: false, }, diff --git a/sdk/src/generated/instructions/transfer.ts b/sdk/src/generated/instructions/transfer.ts index 14c0c3b9..d44c8981 100644 --- a/sdk/src/generated/instructions/transfer.ts +++ b/sdk/src/generated/instructions/transfer.ts @@ -24,7 +24,7 @@ export const transferStruct = new beet.BeetArgsStruct<{ * Accounts required by the _transfer_ instruction * * @property [] mintManager - * @property [] standard + * @property [] ruleset * @property [] mint * @property [_writable_] from * @property [_writable_] to @@ -36,7 +36,7 @@ export const transferStruct = new beet.BeetArgsStruct<{ */ export type TransferInstructionAccounts = { mintManager: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey mint: web3.PublicKey from: web3.PublicKey to: web3.PublicKey @@ -73,7 +73,7 @@ export function createTransferInstruction( isSigner: false, }, { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: false, isSigner: false, }, diff --git a/sdk/src/generated/instructions/updateMintManager.ts b/sdk/src/generated/instructions/updateMintManager.ts index b8e3f31d..37a13043 100644 --- a/sdk/src/generated/instructions/updateMintManager.ts +++ b/sdk/src/generated/instructions/updateMintManager.ts @@ -40,7 +40,7 @@ export const updateMintManagerStruct = new beet.BeetArgsStruct< * Accounts required by the _updateMintManager_ instruction * * @property [] mintManager - * @property [] standard + * @property [] ruleset * @property [**signer**] authority * @category Instructions * @category UpdateMintManager @@ -48,7 +48,7 @@ export const updateMintManagerStruct = new beet.BeetArgsStruct< */ export type UpdateMintManagerInstructionAccounts = { mintManager: web3.PublicKey - standard: web3.PublicKey + ruleset: web3.PublicKey authority: web3.PublicKey systemProgram?: web3.PublicKey } @@ -83,7 +83,7 @@ export function createUpdateMintManagerInstruction( isSigner: false, }, { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: false, isSigner: false, }, diff --git a/sdk/src/generated/instructions/updateStandard.ts b/sdk/src/generated/instructions/updateRuleset.ts similarity index 58% rename from sdk/src/generated/instructions/updateStandard.ts rename to sdk/src/generated/instructions/updateRuleset.ts index adf29345..77382e6c 100644 --- a/sdk/src/generated/instructions/updateStandard.ts +++ b/sdk/src/generated/instructions/updateRuleset.ts @@ -7,76 +7,73 @@ import * as beet from '@metaplex-foundation/beet' import * as web3 from '@solana/web3.js' -import { - UpdateStandardIx, - updateStandardIxBeet, -} from '../types/UpdateStandardIx' +import { UpdateRulesetIx, updateRulesetIxBeet } from '../types/UpdateRulesetIx' /** * @category Instructions - * @category UpdateStandard + * @category UpdateRuleset * @category generated */ -export type UpdateStandardInstructionArgs = { - ix: UpdateStandardIx +export type UpdateRulesetInstructionArgs = { + ix: UpdateRulesetIx } /** * @category Instructions - * @category UpdateStandard + * @category UpdateRuleset * @category generated */ -export const updateStandardStruct = new beet.FixableBeetArgsStruct< - UpdateStandardInstructionArgs & { +export const updateRulesetStruct = new beet.FixableBeetArgsStruct< + UpdateRulesetInstructionArgs & { instructionDiscriminator: number[] /* size: 8 */ } >( [ ['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], - ['ix', updateStandardIxBeet], + ['ix', updateRulesetIxBeet], ], - 'UpdateStandardInstructionArgs' + 'UpdateRulesetInstructionArgs' ) /** - * Accounts required by the _updateStandard_ instruction + * Accounts required by the _updateRuleset_ instruction * - * @property [_writable_] standard + * @property [_writable_] ruleset * @property [**signer**] authority * @category Instructions - * @category UpdateStandard + * @category UpdateRuleset * @category generated */ -export type UpdateStandardInstructionAccounts = { - standard: web3.PublicKey +export type UpdateRulesetInstructionAccounts = { + ruleset: web3.PublicKey authority: web3.PublicKey systemProgram?: web3.PublicKey } -export const updateStandardInstructionDiscriminator = [ - 235, 132, 19, 152, 47, 247, 75, 20, +export const updateRulesetInstructionDiscriminator = [ + 163, 247, 48, 173, 18, 174, 20, 154, ] /** - * Creates a _UpdateStandard_ instruction. + * Creates a _UpdateRuleset_ instruction. * * @param accounts that will be accessed while the instruction is processed * @param args to provide as instruction data to the program * * @category Instructions - * @category UpdateStandard + * @category UpdateRuleset * @category generated */ -export function createUpdateStandardInstruction( - accounts: UpdateStandardInstructionAccounts, - args: UpdateStandardInstructionArgs, +export function createUpdateRulesetInstruction( + accounts: UpdateRulesetInstructionAccounts, + args: UpdateRulesetInstructionArgs, programId = new web3.PublicKey('creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez') ) { - const [data] = updateStandardStruct.serialize({ - instructionDiscriminator: updateStandardInstructionDiscriminator, + const [data] = updateRulesetStruct.serialize({ + instructionDiscriminator: updateRulesetInstructionDiscriminator, ...args, }) const keys: web3.AccountMeta[] = [ { - pubkey: accounts.standard, + pubkey: accounts.ruleset, isWritable: true, isSigner: false, }, diff --git a/sdk/src/generated/types/InitStandardIx.ts b/sdk/src/generated/types/InitRulesetIx.ts similarity index 56% rename from sdk/src/generated/types/InitStandardIx.ts rename to sdk/src/generated/types/InitRulesetIx.ts index 9c12a2ff..64d9ef11 100644 --- a/sdk/src/generated/types/InitStandardIx.ts +++ b/sdk/src/generated/types/InitRulesetIx.ts @@ -8,10 +8,10 @@ import * as web3 from '@solana/web3.js' import * as beet from '@metaplex-foundation/beet' import * as beetSolana from '@metaplex-foundation/beet-solana' -export type InitStandardIx = { +export type InitRulesetIx = { checkSellerFeeBasisPoints: boolean name: string - disallowedPrograms: web3.PublicKey[] + disallowedAddresses: web3.PublicKey[] allowedPrograms: web3.PublicKey[] } @@ -19,13 +19,12 @@ export type InitStandardIx = { * @category userTypes * @category generated */ -export const initStandardIxBeet = - new beet.FixableBeetArgsStruct<InitStandardIx>( - [ - ['checkSellerFeeBasisPoints', beet.bool], - ['name', beet.utf8String], - ['disallowedPrograms', beet.array(beetSolana.publicKey)], - ['allowedPrograms', beet.array(beetSolana.publicKey)], - ], - 'InitStandardIx' - ) +export const initRulesetIxBeet = new beet.FixableBeetArgsStruct<InitRulesetIx>( + [ + ['checkSellerFeeBasisPoints', beet.bool], + ['name', beet.utf8String], + ['disallowedAddresses', beet.array(beetSolana.publicKey)], + ['allowedPrograms', beet.array(beetSolana.publicKey)], + ], + 'InitRulesetIx' +) diff --git a/sdk/src/generated/types/UpdateStandardIx.ts b/sdk/src/generated/types/UpdateRulesetIx.ts similarity index 72% rename from sdk/src/generated/types/UpdateStandardIx.ts rename to sdk/src/generated/types/UpdateRulesetIx.ts index 66c48596..3f430e58 100644 --- a/sdk/src/generated/types/UpdateStandardIx.ts +++ b/sdk/src/generated/types/UpdateRulesetIx.ts @@ -8,9 +8,9 @@ import * as web3 from '@solana/web3.js' import * as beet from '@metaplex-foundation/beet' import * as beetSolana from '@metaplex-foundation/beet-solana' -export type UpdateStandardIx = { +export type UpdateRulesetIx = { checkSellerFeeBasisPoints: boolean - disallowedPrograms: web3.PublicKey[] + disallowedAddresses: web3.PublicKey[] allowedPrograms: web3.PublicKey[] } @@ -18,12 +18,12 @@ export type UpdateStandardIx = { * @category userTypes * @category generated */ -export const updateStandardIxBeet = - new beet.FixableBeetArgsStruct<UpdateStandardIx>( +export const updateRulesetIxBeet = + new beet.FixableBeetArgsStruct<UpdateRulesetIx>( [ ['checkSellerFeeBasisPoints', beet.bool], - ['disallowedPrograms', beet.array(beetSolana.publicKey)], + ['disallowedAddresses', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], ], - 'UpdateStandardIx' + 'UpdateRulesetIx' ) diff --git a/sdk/src/generated/types/index.ts b/sdk/src/generated/types/index.ts index f9395103..be1fcf1d 100644 --- a/sdk/src/generated/types/index.ts +++ b/sdk/src/generated/types/index.ts @@ -1,3 +1,3 @@ -export * from './InitStandardIx' +export * from './InitRulesetIx' export * from './UpdateMintManagerIx' -export * from './UpdateStandardIx' +export * from './UpdateRulesetIx' diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts index a1e35e39..77b50f4a 100644 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ b/sdk/src/idl/cardinal_creator_standard.ts @@ -16,7 +16,7 @@ export type CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -57,7 +57,7 @@ export type CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -82,10 +82,10 @@ export type CardinalCreatorStandard = { ] }, { - "name": "initStandard", + "name": "initRuleset", "accounts": [ { - "name": "standard", + "name": "ruleset", "isMut": true, "isSigner": false }, @@ -109,16 +109,16 @@ export type CardinalCreatorStandard = { { "name": "ix", "type": { - "defined": "InitStandardIx" + "defined": "InitRulesetIx" } } ] }, { - "name": "updateStandard", + "name": "updateRuleset", "accounts": [ { - "name": "standard", + "name": "ruleset", "isMut": true, "isSigner": false }, @@ -137,7 +137,7 @@ export type CardinalCreatorStandard = { { "name": "ix", "type": { - "defined": "UpdateStandardIx" + "defined": "UpdateRulesetIx" } } ] @@ -156,7 +156,7 @@ export type CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -402,7 +402,7 @@ export type CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -458,7 +458,7 @@ export type CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -479,7 +479,7 @@ export type CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -515,14 +515,14 @@ export type CardinalCreatorStandard = { "type": "publicKey" }, { - "name": "standard", + "name": "ruleset", "type": "publicKey" } ] } }, { - "name": "standard", + "name": "ruleset", "type": { "kind": "struct", "fields": [ @@ -538,6 +538,10 @@ export type CardinalCreatorStandard = { "name": "authority", "type": "publicKey" }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "checkSellerFeeBasisPoints", "type": "bool" @@ -547,7 +551,7 @@ export type CardinalCreatorStandard = { "type": "string" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -576,7 +580,7 @@ export type CardinalCreatorStandard = { } }, { - "name": "InitStandardIx", + "name": "InitRulesetIx", "type": { "kind": "struct", "fields": [ @@ -589,7 +593,7 @@ export type CardinalCreatorStandard = { "type": "string" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -604,7 +608,7 @@ export type CardinalCreatorStandard = { } }, { - "name": "UpdateStandardIx", + "name": "UpdateRulesetIx", "type": { "kind": "struct", "fields": [ @@ -613,7 +617,7 @@ export type CardinalCreatorStandard = { "type": "bool" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -671,8 +675,8 @@ export type CardinalCreatorStandard = { }, { "code": 6008, - "name": "InvalidStandard", - "msg": "Invalid standard" + "name": "InvalidRuleset", + "msg": "Invalid ruleset" }, { "code": 6009, @@ -715,7 +719,7 @@ export const IDL: CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -756,7 +760,7 @@ export const IDL: CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -781,10 +785,10 @@ export const IDL: CardinalCreatorStandard = { ] }, { - "name": "initStandard", + "name": "initRuleset", "accounts": [ { - "name": "standard", + "name": "ruleset", "isMut": true, "isSigner": false }, @@ -808,16 +812,16 @@ export const IDL: CardinalCreatorStandard = { { "name": "ix", "type": { - "defined": "InitStandardIx" + "defined": "InitRulesetIx" } } ] }, { - "name": "updateStandard", + "name": "updateRuleset", "accounts": [ { - "name": "standard", + "name": "ruleset", "isMut": true, "isSigner": false }, @@ -836,7 +840,7 @@ export const IDL: CardinalCreatorStandard = { { "name": "ix", "type": { - "defined": "UpdateStandardIx" + "defined": "UpdateRulesetIx" } } ] @@ -855,7 +859,7 @@ export const IDL: CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -1101,7 +1105,7 @@ export const IDL: CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -1157,7 +1161,7 @@ export const IDL: CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -1178,7 +1182,7 @@ export const IDL: CardinalCreatorStandard = { "isSigner": false }, { - "name": "standard", + "name": "ruleset", "isMut": false, "isSigner": false }, @@ -1214,14 +1218,14 @@ export const IDL: CardinalCreatorStandard = { "type": "publicKey" }, { - "name": "standard", + "name": "ruleset", "type": "publicKey" } ] } }, { - "name": "standard", + "name": "ruleset", "type": { "kind": "struct", "fields": [ @@ -1237,6 +1241,10 @@ export const IDL: CardinalCreatorStandard = { "name": "authority", "type": "publicKey" }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "checkSellerFeeBasisPoints", "type": "bool" @@ -1246,7 +1254,7 @@ export const IDL: CardinalCreatorStandard = { "type": "string" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -1275,7 +1283,7 @@ export const IDL: CardinalCreatorStandard = { } }, { - "name": "InitStandardIx", + "name": "InitRulesetIx", "type": { "kind": "struct", "fields": [ @@ -1288,7 +1296,7 @@ export const IDL: CardinalCreatorStandard = { "type": "string" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -1303,7 +1311,7 @@ export const IDL: CardinalCreatorStandard = { } }, { - "name": "UpdateStandardIx", + "name": "UpdateRulesetIx", "type": { "kind": "struct", "fields": [ @@ -1312,7 +1320,7 @@ export const IDL: CardinalCreatorStandard = { "type": "bool" }, { - "name": "disallowedPrograms", + "name": "disallowedAddresses", "type": { "vec": "publicKey" } @@ -1370,8 +1378,8 @@ export const IDL: CardinalCreatorStandard = { }, { "code": 6008, - "name": "InvalidStandard", - "msg": "Invalid standard" + "name": "InvalidRuleset", + "msg": "Invalid ruleset" }, { "code": 6009, From c8e6a764243d31bb3c8790a5c6d2a5a06868ced8 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 02:54:09 -0400 Subject: [PATCH 15/37] Add ruleset payouts --- .../mint_manager/update_mint_manager.rs | 21 +++++++++++++++++++ program/src/instructions/token/init_mint.rs | 15 ++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/program/src/instructions/mint_manager/update_mint_manager.rs b/program/src/instructions/mint_manager/update_mint_manager.rs index 07e219c0..73d25c2b 100644 --- a/program/src/instructions/mint_manager/update_mint_manager.rs +++ b/program/src/instructions/mint_manager/update_mint_manager.rs @@ -1,6 +1,8 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; +use solana_program::program::invoke; +use solana_program::system_instruction::transfer; #[derive(AnchorSerialize, AnchorDeserialize)] pub struct UpdateMintManagerIx { @@ -11,8 +13,13 @@ pub struct UpdateMintManagerIx { pub struct UpdateMintManagerCtx<'info> { mint_manager: Account<'info, MintManager>, ruleset: Account<'info, Ruleset>, + /// CHECK: Account is not read from + #[account(mut, constraint = collector.key() == ruleset.collector @ ErrorCode::InvalidCollector)] + collector: UncheckedAccount<'info>, #[account(constraint = authority.key() == mint_manager.authority @ ErrorCode::InvalidAuthority)] authority: Signer<'info>, + #[account(mut)] + payer: Signer<'info>, system_program: Program<'info, System>, } @@ -20,5 +27,19 @@ pub fn handler(ctx: Context<UpdateMintManagerCtx>, ix: UpdateMintManagerIx) -> R let mint_manager = &mut ctx.accounts.mint_manager; mint_manager.authority = ix.authority; mint_manager.ruleset = ctx.accounts.ruleset.key(); + + // update + invoke( + &transfer( + &ctx.accounts.payer.key(), + &ctx.accounts.collector.key(), + CREATION_LAMPORTS, + ), + &[ + ctx.accounts.payer.to_account_info(), + ctx.accounts.collector.to_account_info(), + ctx.accounts.system_program.to_account_info(), + ], + )?; Ok(()) } diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index 0c69d4e0..8dd5ca3f 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -10,6 +10,7 @@ use anchor_spl::token::TokenAccount; use anchor_spl::token::{self}; use solana_program::program_pack::Pack; use solana_program::system_instruction::create_account; +use solana_program::system_instruction::transfer; use spl_associated_token_account::get_associated_token_address; #[derive(Accounts)] @@ -33,7 +34,7 @@ pub struct InitMintCtx<'info> { target: Signer<'info>, /// CHECK: Account is not read from - #[account(mut)] + #[account(mut, constraint = collector.key() == ruleset.collector @ ErrorCode::InvalidCollector)] collector: UncheckedAccount<'info>, authority: Signer<'info>, #[account(mut)] @@ -132,5 +133,17 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); token::mint_to(cpi_context, 1)?; + invoke( + &transfer( + &ctx.accounts.payer.key(), + &ctx.accounts.collector.key(), + CREATION_LAMPORTS, + ), + &[ + ctx.accounts.payer.to_account_info(), + ctx.accounts.collector.to_account_info(), + ctx.accounts.system_program.to_account_info(), + ], + )?; Ok(()) } From 5ffd9e11278f0e5b1923247c5f047436893d5579 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 03:47:34 -0400 Subject: [PATCH 16/37] Pre instruction --- program/src/errors.rs | 2 + program/src/instructions/token/init_mint.rs | 4 +- .../src/instructions/token/pre_transfer.rs | 77 ++++++++- program/src/instructions/token/transfer.rs | 3 +- program/src/state.rs | 14 ++ sdk/idl/cardinal_creator_standard.json | 61 +++++++ sdk/src/generated/accounts/AccountBalances.ts | 162 ++++++++++++++++++ sdk/src/generated/accounts/index.ts | 4 +- sdk/src/generated/errors/index.ts | 20 +++ sdk/src/generated/instructions/preTransfer.ts | 14 ++ .../instructions/updateMintManager.ts | 14 ++ sdk/src/generated/types/AccountBalance.ts | 28 +++ sdk/src/generated/types/index.ts | 1 + sdk/src/idl/cardinal_creator_standard.ts | 122 +++++++++++++ 14 files changed, 519 insertions(+), 7 deletions(-) create mode 100644 sdk/src/generated/accounts/AccountBalances.ts create mode 100644 sdk/src/generated/types/AccountBalance.ts diff --git a/program/src/errors.rs b/program/src/errors.rs index 188bf7ab..ba05a740 100644 --- a/program/src/errors.rs +++ b/program/src/errors.rs @@ -28,4 +28,6 @@ pub enum ErrorCode { ProgramDisallowed, #[msg("Program not allowed in allowed programs to transfer")] ProgramNotAllowed, + #[msg("Unknown account found in instruction")] + UnknownAccount, } diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index 8dd5ca3f..5a35a2d5 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -59,9 +59,7 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { &create_account( ctx.accounts.payer.key, ctx.accounts.mint.key, - ctx.accounts - .rent - .minimum_balance(spl_token::state::Mint::LEN), + Rent::get()?.minimum_balance(spl_token::state::Mint::LEN), spl_token::state::Mint::LEN as u64, &spl_token::id(), ), diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs index 1a0c2318..22157649 100644 --- a/program/src/instructions/token/pre_transfer.rs +++ b/program/src/instructions/token/pre_transfer.rs @@ -1,6 +1,14 @@ +use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; +use anchor_spl::token::TokenAccount; +use mpl_token_metadata::utils::assert_derivation; +use solana_program::program::invoke; +use solana_program::serialize_utils::read_u16; +use solana_program::system_instruction::create_account; +use solana_program::sysvar::instructions::load_instruction_at_checked; use solana_program::sysvar::{self}; +use std::collections::HashSet; pub const PRE_TRANSFER_DISCRIMINATOR: [u8; 8] = [158, 85, 53, 202, 155, 118, 19, 228]; @@ -8,11 +16,78 @@ pub const PRE_TRANSFER_DISCRIMINATOR: [u8; 8] = [158, 85, 53, 202, 155, 118, 19, pub struct PreTransferCtx<'info> { mint_manager: Account<'info, MintManager>, ruleset: Account<'info, Ruleset>, + #[account(mut)] + payer: Signer<'info>, + /// CHECK: This is not dangerous because we check it inside the handler + #[account(mut)] + account_balances: UncheckedAccount<'info>, /// CHECK: This is not dangerous because the ID is checked with instructions sysvar #[account(address = sysvar::instructions::id())] instructions: UncheckedAccount<'info>, + // remaining_accounts } -pub fn handler(_ctx: Context<PreTransferCtx>) -> Result<()> { +pub fn handler(ctx: Context<PreTransferCtx>) -> Result<()> { + let mint = ctx.accounts.mint_manager.mint; + let path = &[ACCOUNT_BALANCES_SEED.as_bytes(), mint.as_ref()]; + assert_derivation(ctx.program_id, &ctx.accounts.account_balances, path)?; + + let instructions_account_info = ctx.accounts.instructions.to_account_info(); + let instruction_sysvar = instructions_account_info.try_borrow_data()?; + let mut current: usize = 0; + let num_instructions = + read_u16(&mut current, &instruction_sysvar).expect("Invalid instruction"); + + let mut all_addresses = HashSet::new(); + for i in 0..num_instructions { + let ix = load_instruction_at_checked(i.into(), &instructions_account_info) + .expect("Failed to get instruction"); + for account in ix.accounts { + all_addresses.insert(account.pubkey); + } + } + + let mut account_balances = Vec::new(); + let remaining_accounts = &mut ctx.remaining_accounts.iter(); + while let Some(account) = remaining_accounts.next() { + if !all_addresses.contains(account.key) { + return Err(error!(ErrorCode::UnknownAccount)); + } + account_balances.push(AccountBalance { + address: account.key(), + balance: **account.lamports.borrow(), + mint: Pubkey::default(), + }); + + if *account.owner == spl_token::id() { + if let Ok(token_account) = Account::<TokenAccount>::try_from(&account) { + account_balances.push(AccountBalance { + address: account.key(), + balance: token_account.amount, + mint: token_account.mint, + }); + } + } + } + + let space = 8 + std::mem::size_of_val(&account_balances) + 8; + invoke( + &create_account( + ctx.accounts.payer.key, + ctx.accounts.account_balances.key, + Rent::get()?.minimum_balance(space), + space.try_into().expect("Error allocating space"), + &spl_token::id(), + ), + &[ + ctx.accounts.payer.to_account_info(), + ctx.accounts.account_balances.to_account_info(), + ], + )?; + + // skip discriminator check + let account_balances_account = + &mut Account::<AccountBalances>::try_from_unchecked(&ctx.accounts.account_balances)?; + account_balances_account.balances = account_balances; Ok(()) } diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs index 496ac519..61c1e6f6 100644 --- a/program/src/instructions/token/transfer.rs +++ b/program/src/instructions/token/transfer.rs @@ -1,5 +1,3 @@ -use std::collections::HashSet; - use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; @@ -14,6 +12,7 @@ use arrayref::array_ref; use solana_program::serialize_utils::read_u16; use solana_program::sysvar::instructions::load_instruction_at_checked; use solana_program::sysvar::{self}; +use std::collections::HashSet; use super::POST_TRANSFER_DISCRIMINATOR; use super::PRE_TRANSFER_DISCRIMINATOR; diff --git a/program/src/state.rs b/program/src/state.rs index b127d8d3..aca5c57e 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -29,3 +29,17 @@ pub struct Ruleset { pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, } + +pub const ACCOUNT_BALANCES_SEED: &str = "account-balances"; + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default, Debug)] +pub struct AccountBalance { + pub address: Pubkey, + pub mint: Pubkey, + pub balance: u64, +} + +#[account] +pub struct AccountBalances { + pub balances: Vec<AccountBalance>, +} diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index 4d5c43fb..475eb6f0 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -61,11 +61,21 @@ "isMut": false, "isSigner": false }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, { "name": "authority", "isMut": false, "isSigner": true }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, { "name": "systemProgram", "isMut": false, @@ -462,6 +472,16 @@ "isMut": false, "isSigner": false }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, { "name": "instructions", "isMut": false, @@ -564,6 +584,22 @@ } ] } + }, + { + "name": "AccountBalances", + "type": { + "kind": "struct", + "fields": [ + { + "name": "balances", + "type": { + "vec": { + "defined": "AccountBalance" + } + } + } + ] + } } ], "types": [ @@ -630,6 +666,26 @@ } ] } + }, + { + "name": "AccountBalance", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "balance", + "type": "u64" + } + ] + } } ], "errors": [ @@ -697,6 +753,11 @@ "code": 6012, "name": "ProgramNotAllowed", "msg": "Program not allowed in allowed programs to transfer" + }, + { + "code": 6013, + "name": "UnknownAccount", + "msg": "Unknown account found in instruction" } ], "metadata": { diff --git a/sdk/src/generated/accounts/AccountBalances.ts b/sdk/src/generated/accounts/AccountBalances.ts new file mode 100644 index 00000000..6a07b2e4 --- /dev/null +++ b/sdk/src/generated/accounts/AccountBalances.ts @@ -0,0 +1,162 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from '@metaplex-foundation/beet' +import * as web3 from '@solana/web3.js' +import * as beetSolana from '@metaplex-foundation/beet-solana' +import { AccountBalance, accountBalanceBeet } from '../types/AccountBalance' + +/** + * Arguments used to create {@link AccountBalances} + * @category Accounts + * @category generated + */ +export type AccountBalancesArgs = { + balances: AccountBalance[] +} + +export const accountBalancesDiscriminator = [84, 88, 42, 245, 122, 70, 248, 203] +/** + * Holds the data for the {@link AccountBalances} Account and provides de/serialization + * functionality for that data + * + * @category Accounts + * @category generated + */ +export class AccountBalances implements AccountBalancesArgs { + private constructor(readonly balances: AccountBalance[]) {} + + /** + * Creates a {@link AccountBalances} instance from the provided args. + */ + static fromArgs(args: AccountBalancesArgs) { + return new AccountBalances(args.balances) + } + + /** + * Deserializes the {@link AccountBalances} from the data of the provided {@link web3.AccountInfo}. + * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. + */ + static fromAccountInfo( + accountInfo: web3.AccountInfo<Buffer>, + offset = 0 + ): [AccountBalances, number] { + return AccountBalances.deserialize(accountInfo.data, offset) + } + + /** + * Retrieves the account info from the provided address and deserializes + * the {@link AccountBalances} from its data. + * + * @throws Error if no account info is found at the address or if deserialization fails + */ + static async fromAccountAddress( + connection: web3.Connection, + address: web3.PublicKey + ): Promise<AccountBalances> { + const accountInfo = await connection.getAccountInfo(address) + if (accountInfo == null) { + throw new Error(`Unable to find AccountBalances account at ${address}`) + } + return AccountBalances.fromAccountInfo(accountInfo, 0)[0] + } + + /** + * Provides a {@link web3.Connection.getProgramAccounts} config builder, + * to fetch accounts matching filters that can be specified via that builder. + * + * @param programId - the program that owns the accounts we are filtering + */ + static gpaBuilder( + programId: web3.PublicKey = new web3.PublicKey( + 'creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez' + ) + ) { + return beetSolana.GpaBuilder.fromStruct(programId, accountBalancesBeet) + } + + /** + * Deserializes the {@link AccountBalances} from the provided data Buffer. + * @returns a tuple of the account data and the offset up to which the buffer was read to obtain it. + */ + static deserialize(buf: Buffer, offset = 0): [AccountBalances, number] { + return accountBalancesBeet.deserialize(buf, offset) + } + + /** + * Serializes the {@link AccountBalances} into a Buffer. + * @returns a tuple of the created Buffer and the offset up to which the buffer was written to store it. + */ + serialize(): [Buffer, number] { + return accountBalancesBeet.serialize({ + accountDiscriminator: accountBalancesDiscriminator, + ...this, + }) + } + + /** + * Returns the byteSize of a {@link Buffer} holding the serialized data of + * {@link AccountBalances} for the provided args. + * + * @param args need to be provided since the byte size for this account + * depends on them + */ + static byteSize(args: AccountBalancesArgs) { + const instance = AccountBalances.fromArgs(args) + return accountBalancesBeet.toFixedFromValue({ + accountDiscriminator: accountBalancesDiscriminator, + ...instance, + }).byteSize + } + + /** + * Fetches the minimum balance needed to exempt an account holding + * {@link AccountBalances} data from rent + * + * @param args need to be provided since the byte size for this account + * depends on them + * @param connection used to retrieve the rent exemption information + */ + static async getMinimumBalanceForRentExemption( + args: AccountBalancesArgs, + connection: web3.Connection, + commitment?: web3.Commitment + ): Promise<number> { + return connection.getMinimumBalanceForRentExemption( + AccountBalances.byteSize(args), + commitment + ) + } + + /** + * Returns a readable version of {@link AccountBalances} properties + * and can be used to convert to JSON and/or logging + */ + pretty() { + return { + balances: this.balances, + } + } +} + +/** + * @category Accounts + * @category generated + */ +export const accountBalancesBeet = new beet.FixableBeetStruct< + AccountBalances, + AccountBalancesArgs & { + accountDiscriminator: number[] /* size: 8 */ + } +>( + [ + ['accountDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['balances', beet.array(accountBalanceBeet)], + ], + AccountBalances.fromArgs, + 'AccountBalances' +) diff --git a/sdk/src/generated/accounts/index.ts b/sdk/src/generated/accounts/index.ts index 8fe79dfa..5398b2e6 100644 --- a/sdk/src/generated/accounts/index.ts +++ b/sdk/src/generated/accounts/index.ts @@ -1,7 +1,9 @@ +export * from './AccountBalances' export * from './MintManager' export * from './Ruleset' import { MintManager } from './MintManager' import { Ruleset } from './Ruleset' +import { AccountBalances } from './AccountBalances' -export const accountProviders = { MintManager, Ruleset } +export const accountProviders = { MintManager, Ruleset, AccountBalances } diff --git a/sdk/src/generated/errors/index.ts b/sdk/src/generated/errors/index.ts index a979a768..8a1e4054 100644 --- a/sdk/src/generated/errors/index.ts +++ b/sdk/src/generated/errors/index.ts @@ -319,6 +319,26 @@ createErrorFromNameLookup.set( () => new ProgramNotAllowedError() ) +/** + * UnknownAccount: 'Unknown account found in instruction' + * + * @category Errors + * @category generated + */ +export class UnknownAccountError extends Error { + readonly code: number = 0x177d + readonly name: string = 'UnknownAccount' + constructor() { + super('Unknown account found in instruction') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, UnknownAccountError) + } + } +} + +createErrorFromCodeLookup.set(0x177d, () => new UnknownAccountError()) +createErrorFromNameLookup.set('UnknownAccount', () => new UnknownAccountError()) + /** * Attempts to resolve a custom program error from the provided error code. * @category Errors diff --git a/sdk/src/generated/instructions/preTransfer.ts b/sdk/src/generated/instructions/preTransfer.ts index cf34f75d..c1bf2fd0 100644 --- a/sdk/src/generated/instructions/preTransfer.ts +++ b/sdk/src/generated/instructions/preTransfer.ts @@ -24,6 +24,8 @@ export const preTransferStruct = new beet.BeetArgsStruct<{ * * @property [] mintManager * @property [] ruleset + * @property [_writable_, **signer**] payer + * @property [_writable_] accountBalances * @property [] instructions * @category Instructions * @category PreTransfer @@ -32,6 +34,8 @@ export const preTransferStruct = new beet.BeetArgsStruct<{ export type PreTransferInstructionAccounts = { mintManager: web3.PublicKey ruleset: web3.PublicKey + payer: web3.PublicKey + accountBalances: web3.PublicKey instructions: web3.PublicKey } @@ -65,6 +69,16 @@ export function createPreTransferInstruction( isWritable: false, isSigner: false, }, + { + pubkey: accounts.payer, + isWritable: true, + isSigner: true, + }, + { + pubkey: accounts.accountBalances, + isWritable: true, + isSigner: false, + }, { pubkey: accounts.instructions, isWritable: false, diff --git a/sdk/src/generated/instructions/updateMintManager.ts b/sdk/src/generated/instructions/updateMintManager.ts index 37a13043..f6e152e3 100644 --- a/sdk/src/generated/instructions/updateMintManager.ts +++ b/sdk/src/generated/instructions/updateMintManager.ts @@ -41,7 +41,9 @@ export const updateMintManagerStruct = new beet.BeetArgsStruct< * * @property [] mintManager * @property [] ruleset + * @property [_writable_] collector * @property [**signer**] authority + * @property [_writable_, **signer**] payer * @category Instructions * @category UpdateMintManager * @category generated @@ -49,7 +51,9 @@ export const updateMintManagerStruct = new beet.BeetArgsStruct< export type UpdateMintManagerInstructionAccounts = { mintManager: web3.PublicKey ruleset: web3.PublicKey + collector: web3.PublicKey authority: web3.PublicKey + payer: web3.PublicKey systemProgram?: web3.PublicKey } @@ -87,11 +91,21 @@ export function createUpdateMintManagerInstruction( isWritable: false, isSigner: false, }, + { + pubkey: accounts.collector, + isWritable: true, + isSigner: false, + }, { pubkey: accounts.authority, isWritable: false, isSigner: true, }, + { + pubkey: accounts.payer, + isWritable: true, + isSigner: true, + }, { pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, isWritable: false, diff --git a/sdk/src/generated/types/AccountBalance.ts b/sdk/src/generated/types/AccountBalance.ts new file mode 100644 index 00000000..886f8553 --- /dev/null +++ b/sdk/src/generated/types/AccountBalance.ts @@ -0,0 +1,28 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as web3 from '@solana/web3.js' +import * as beet from '@metaplex-foundation/beet' +import * as beetSolana from '@metaplex-foundation/beet-solana' +export type AccountBalance = { + address: web3.PublicKey + mint: web3.PublicKey + balance: beet.bignum +} + +/** + * @category userTypes + * @category generated + */ +export const accountBalanceBeet = new beet.BeetArgsStruct<AccountBalance>( + [ + ['address', beetSolana.publicKey], + ['mint', beetSolana.publicKey], + ['balance', beet.u64], + ], + 'AccountBalance' +) diff --git a/sdk/src/generated/types/index.ts b/sdk/src/generated/types/index.ts index be1fcf1d..681b149c 100644 --- a/sdk/src/generated/types/index.ts +++ b/sdk/src/generated/types/index.ts @@ -1,3 +1,4 @@ +export * from './AccountBalance' export * from './InitRulesetIx' export * from './UpdateMintManagerIx' export * from './UpdateRulesetIx' diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts index 77b50f4a..6bd8a94e 100644 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ b/sdk/src/idl/cardinal_creator_standard.ts @@ -61,11 +61,21 @@ export type CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, { "name": "authority", "isMut": false, "isSigner": true }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, { "name": "systemProgram", "isMut": false, @@ -462,6 +472,16 @@ export type CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, { "name": "instructions", "isMut": false, @@ -564,6 +584,22 @@ export type CardinalCreatorStandard = { } ] } + }, + { + "name": "accountBalances", + "type": { + "kind": "struct", + "fields": [ + { + "name": "balances", + "type": { + "vec": { + "defined": "AccountBalance" + } + } + } + ] + } } ], "types": [ @@ -630,6 +666,26 @@ export type CardinalCreatorStandard = { } ] } + }, + { + "name": "AccountBalance", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "balance", + "type": "u64" + } + ] + } } ], "errors": [ @@ -697,6 +753,11 @@ export type CardinalCreatorStandard = { "code": 6012, "name": "ProgramNotAllowed", "msg": "Program not allowed in allowed programs to transfer" + }, + { + "code": 6013, + "name": "UnknownAccount", + "msg": "Unknown account found in instruction" } ] }; @@ -764,11 +825,21 @@ export const IDL: CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, { "name": "authority", "isMut": false, "isSigner": true }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, { "name": "systemProgram", "isMut": false, @@ -1165,6 +1236,16 @@ export const IDL: CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, { "name": "instructions", "isMut": false, @@ -1267,6 +1348,22 @@ export const IDL: CardinalCreatorStandard = { } ] } + }, + { + "name": "accountBalances", + "type": { + "kind": "struct", + "fields": [ + { + "name": "balances", + "type": { + "vec": { + "defined": "AccountBalance" + } + } + } + ] + } } ], "types": [ @@ -1333,6 +1430,26 @@ export const IDL: CardinalCreatorStandard = { } ] } + }, + { + "name": "AccountBalance", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "balance", + "type": "u64" + } + ] + } } ], "errors": [ @@ -1400,6 +1517,11 @@ export const IDL: CardinalCreatorStandard = { "code": 6012, "name": "ProgramNotAllowed", "msg": "Program not allowed in allowed programs to transfer" + }, + { + "code": 6013, + "name": "UnknownAccount", + "msg": "Unknown account found in instruction" } ] }; From 53c5947710769c76c50d600afc6cf4d6c48a0c53 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 04:39:32 -0400 Subject: [PATCH 17/37] Post ix --- program/src/errors.rs | 2 + .../src/instructions/token/post_transfer.rs | 103 +++++++++++++++++- .../src/instructions/token/pre_transfer.rs | 34 +++--- program/src/instructions/token/transfer.rs | 13 +++ program/src/state.rs | 1 + sdk/idl/cardinal_creator_standard.json | 31 +++--- sdk/src/generated/errors/index.ts | 23 ++++ .../generated/instructions/postTransfer.ts | 16 +-- sdk/src/generated/instructions/preTransfer.ts | 22 +--- sdk/src/generated/types/AccountBalance.ts | 2 + sdk/src/idl/cardinal_creator_standard.ts | 62 +++++------ 11 files changed, 216 insertions(+), 93 deletions(-) diff --git a/program/src/errors.rs b/program/src/errors.rs index ba05a740..d5e9ad02 100644 --- a/program/src/errors.rs +++ b/program/src/errors.rs @@ -30,4 +30,6 @@ pub enum ErrorCode { ProgramNotAllowed, #[msg("Unknown account found in instruction")] UnknownAccount, + #[msg("Account not found in instruction")] + AccountNotFound, } diff --git a/program/src/instructions/token/post_transfer.rs b/program/src/instructions/token/post_transfer.rs index 67937255..f04e8121 100644 --- a/program/src/instructions/token/post_transfer.rs +++ b/program/src/instructions/token/post_transfer.rs @@ -1,18 +1,115 @@ +use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; +use anchor_spl::token::TokenAccount; +use solana_program::serialize_utils::read_u16; +use solana_program::sysvar::instructions::load_instruction_at_checked; use solana_program::sysvar::{self}; +use std::collections::HashMap; +use std::collections::HashSet; pub const POST_TRANSFER_DISCRIMINATOR: [u8; 8] = [195, 252, 43, 202, 149, 119, 175, 84]; #[derive(Accounts)] pub struct PostTransferCtx<'info> { - mint_manager: Account<'info, MintManager>, - ruleset: Account<'info, Ruleset>, + /// CHECK: Checked by the transfer instruction + #[account(mut, close = collector)] + account_balances: Box<Account<'info, AccountBalances>>, + /// CHECK: This is not dangerous because it is recipient of payment + #[account(mut)] + collector: UncheckedAccount<'info>, /// CHECK: This is not dangerous because the ID is checked with instructions sysvar #[account(address = sysvar::instructions::id())] instructions: UncheckedAccount<'info>, + // remaining_accounts } -pub fn handler(_ctx: Context<PostTransferCtx>) -> Result<()> { +pub fn handler(ctx: Context<PostTransferCtx>) -> Result<()> { + let instructions_account_info = ctx.accounts.instructions.to_account_info(); + let instruction_sysvar = instructions_account_info.try_borrow_data()?; + let mut current: usize = 0; + let num_instructions = + read_u16(&mut current, &instruction_sysvar).expect("Invalid instruction"); + + let mut all_addresses = HashSet::new(); + for i in 0..num_instructions { + let ix = load_instruction_at_checked(i.into(), &instructions_account_info) + .expect("Failed to get instruction"); + for account in ix.accounts { + all_addresses.insert(account.pubkey); + } + } + + let mut end_balances = HashMap::new(); + let remaining_accounts = &mut ctx.remaining_accounts.iter(); + while let Some(account) = remaining_accounts.next() { + if !all_addresses.remove(account.key) { + return Err(error!(ErrorCode::UnknownAccount)); + } + end_balances.insert( + [account.key(), Pubkey::default()], + AccountBalance { + address: account.key(), + size: if let Ok(data) = account.data.try_borrow() { + data.len().try_into().expect("Conversion error") + } else { + 0 + }, + balance: **account.lamports.borrow(), + mint: Pubkey::default(), + }, + ); + + if *account.owner == spl_token::id() { + if let Ok(token_account) = Account::<TokenAccount>::try_from(&account) { + end_balances.insert( + [account.key(), token_account.mint], + AccountBalance { + address: account.key(), + size: 0, + balance: token_account.amount, + mint: token_account.mint, + }, + ); + } + } + } + if all_addresses.len() > 0 { + return Err(error!(ErrorCode::AccountNotFound)); + } + + let mut balance_change_by_mint: HashMap<Pubkey, u64> = HashMap::new(); + for account_balance in &ctx.accounts.account_balances.balances { + let end_balance = end_balances + .get(&[account_balance.address, account_balance.mint]) + .expect("Expected to find balance"); + + if end_balance.mint == Pubkey::default() { + // saturating sub rent_exempt_minimum from start and end + let rent_exempt_minimum = Rent::get()? + .minimum_balance(account_balance.size.try_into().expect("Conversion error")); + let diff = end_balance + .balance + .saturating_sub(rent_exempt_minimum) + .saturating_sub(account_balance.balance.saturating_sub(rent_exempt_minimum)); + let v = if let Some(current_value) = balance_change_by_mint.get(&end_balance.mint) { + *current_value + } else { + 0 + }; + balance_change_by_mint + .insert(end_balance.mint, v.checked_add(diff).expect("Add error")); + } else { + let diff = end_balance.balance.saturating_sub(account_balance.balance); + let v = if let Some(current_value) = balance_change_by_mint.get(&end_balance.mint) { + *current_value + } else { + 0 + }; + balance_change_by_mint + .insert(end_balance.mint, v.checked_add(diff).expect("Add error")); + } + } + Ok(()) } diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs index 22157649..a3296c42 100644 --- a/program/src/instructions/token/pre_transfer.rs +++ b/program/src/instructions/token/pre_transfer.rs @@ -2,7 +2,6 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; use anchor_spl::token::TokenAccount; -use mpl_token_metadata::utils::assert_derivation; use solana_program::program::invoke; use solana_program::serialize_utils::read_u16; use solana_program::system_instruction::create_account; @@ -14,13 +13,11 @@ pub const PRE_TRANSFER_DISCRIMINATOR: [u8; 8] = [158, 85, 53, 202, 155, 118, 19, #[derive(Accounts)] pub struct PreTransferCtx<'info> { - mint_manager: Account<'info, MintManager>, - ruleset: Account<'info, Ruleset>, - #[account(mut)] - payer: Signer<'info>, - /// CHECK: This is not dangerous because we check it inside the handler + /// CHECK: Checked by the transfer instruction #[account(mut)] account_balances: UncheckedAccount<'info>, + #[account(mut)] + payer: Signer<'info>, /// CHECK: This is not dangerous because the ID is checked with instructions sysvar #[account(address = sysvar::instructions::id())] instructions: UncheckedAccount<'info>, @@ -28,10 +25,6 @@ pub struct PreTransferCtx<'info> { } pub fn handler(ctx: Context<PreTransferCtx>) -> Result<()> { - let mint = ctx.accounts.mint_manager.mint; - let path = &[ACCOUNT_BALANCES_SEED.as_bytes(), mint.as_ref()]; - assert_derivation(ctx.program_id, &ctx.accounts.account_balances, path)?; - let instructions_account_info = ctx.accounts.instructions.to_account_info(); let instruction_sysvar = instructions_account_info.try_borrow_data()?; let mut current: usize = 0; @@ -47,30 +40,39 @@ pub fn handler(ctx: Context<PreTransferCtx>) -> Result<()> { } } - let mut account_balances = Vec::new(); + let mut start_balances = Vec::new(); let remaining_accounts = &mut ctx.remaining_accounts.iter(); while let Some(account) = remaining_accounts.next() { - if !all_addresses.contains(account.key) { + if !all_addresses.remove(account.key) { return Err(error!(ErrorCode::UnknownAccount)); } - account_balances.push(AccountBalance { + start_balances.push(AccountBalance { address: account.key(), + size: if let Ok(data) = account.data.try_borrow() { + data.len().try_into().expect("Conversion error") + } else { + 0 + }, balance: **account.lamports.borrow(), mint: Pubkey::default(), }); if *account.owner == spl_token::id() { if let Ok(token_account) = Account::<TokenAccount>::try_from(&account) { - account_balances.push(AccountBalance { + start_balances.push(AccountBalance { address: account.key(), + size: 0, balance: token_account.amount, mint: token_account.mint, }); } } } + if all_addresses.len() > 0 { + return Err(error!(ErrorCode::AccountNotFound)); + } - let space = 8 + std::mem::size_of_val(&account_balances) + 8; + let space = 8 + std::mem::size_of_val(&start_balances) + 8; invoke( &create_account( ctx.accounts.payer.key, @@ -88,6 +90,6 @@ pub fn handler(ctx: Context<PreTransferCtx>) -> Result<()> { // skip discriminator check let account_balances_account = &mut Account::<AccountBalances>::try_from_unchecked(&ctx.accounts.account_balances)?; - account_balances_account.balances = account_balances; + account_balances_account.balances = start_balances; Ok(()) } diff --git a/program/src/instructions/token/transfer.rs b/program/src/instructions/token/transfer.rs index 61c1e6f6..761f3aec 100644 --- a/program/src/instructions/token/transfer.rs +++ b/program/src/instructions/token/transfer.rs @@ -53,6 +53,14 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { .expect("Failed to get first instruction"); let data: &[u8] = &first_ix.data; let disc_bytes = array_ref![data, 0, 8]; + // check first account is account balances for this mint + let mint = ctx.accounts.mint_manager.mint; + let path = &[ACCOUNT_BALANCES_SEED.as_bytes(), mint.as_ref()]; + let (account_balances_address, _bump) = Pubkey::find_program_address(path, ctx.program_id); + if account_balances_address != first_ix.accounts[0].pubkey { + return Err(error!(ErrorCode::InvalidPreTransferInstruction)); + } + // check instruction if first_ix.program_id != *ctx.program_id || disc_bytes != &PRE_TRANSFER_DISCRIMINATOR { return Err(error!(ErrorCode::InvalidPreTransferInstruction)); } @@ -61,6 +69,11 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { let last_ix = load_instruction_at_checked(num_instructions.into(), &instructions_account_info) .expect("Failed to get last instruction"); + // check first account is account balances for this mint + if account_balances_address != last_ix.accounts[0].pubkey { + return Err(error!(ErrorCode::InvalidPreTransferInstruction)); + } + // check instruction let data: &[u8] = &last_ix.data; let disc_bytes = array_ref![data, 0, 8]; if last_ix.program_id != *ctx.program_id || disc_bytes != &POST_TRANSFER_DISCRIMINATOR { diff --git a/program/src/state.rs b/program/src/state.rs index aca5c57e..c0853f3f 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -36,6 +36,7 @@ pub const ACCOUNT_BALANCES_SEED: &str = "account-balances"; pub struct AccountBalance { pub address: Pubkey, pub mint: Pubkey, + pub size: u64, pub balance: u64, } diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index 475eb6f0..bc788198 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -463,13 +463,8 @@ "name": "preTransfer", "accounts": [ { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, + "name": "accountBalances", + "isMut": true, "isSigner": false }, { @@ -477,11 +472,6 @@ "isMut": true, "isSigner": true }, - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, { "name": "instructions", "isMut": false, @@ -494,13 +484,13 @@ "name": "postTransfer", "accounts": [ { - "name": "mintManager", - "isMut": false, + "name": "accountBalances", + "isMut": true, "isSigner": false }, { - "name": "ruleset", - "isMut": false, + "name": "collector", + "isMut": true, "isSigner": false }, { @@ -680,6 +670,10 @@ "name": "mint", "type": "publicKey" }, + { + "name": "size", + "type": "u64" + }, { "name": "balance", "type": "u64" @@ -758,6 +752,11 @@ "code": 6013, "name": "UnknownAccount", "msg": "Unknown account found in instruction" + }, + { + "code": 6014, + "name": "AccountNotFound", + "msg": "Account not found in instruction" } ], "metadata": { diff --git a/sdk/src/generated/errors/index.ts b/sdk/src/generated/errors/index.ts index 8a1e4054..a79f02ab 100644 --- a/sdk/src/generated/errors/index.ts +++ b/sdk/src/generated/errors/index.ts @@ -339,6 +339,29 @@ export class UnknownAccountError extends Error { createErrorFromCodeLookup.set(0x177d, () => new UnknownAccountError()) createErrorFromNameLookup.set('UnknownAccount', () => new UnknownAccountError()) +/** + * AccountNotFound: 'Account not found in instruction' + * + * @category Errors + * @category generated + */ +export class AccountNotFoundError extends Error { + readonly code: number = 0x177e + readonly name: string = 'AccountNotFound' + constructor() { + super('Account not found in instruction') + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, AccountNotFoundError) + } + } +} + +createErrorFromCodeLookup.set(0x177e, () => new AccountNotFoundError()) +createErrorFromNameLookup.set( + 'AccountNotFound', + () => new AccountNotFoundError() +) + /** * Attempts to resolve a custom program error from the provided error code. * @category Errors diff --git a/sdk/src/generated/instructions/postTransfer.ts b/sdk/src/generated/instructions/postTransfer.ts index 100cec45..48577320 100644 --- a/sdk/src/generated/instructions/postTransfer.ts +++ b/sdk/src/generated/instructions/postTransfer.ts @@ -22,16 +22,16 @@ export const postTransferStruct = new beet.BeetArgsStruct<{ /** * Accounts required by the _postTransfer_ instruction * - * @property [] mintManager - * @property [] ruleset + * @property [_writable_] accountBalances + * @property [_writable_] collector * @property [] instructions * @category Instructions * @category PostTransfer * @category generated */ export type PostTransferInstructionAccounts = { - mintManager: web3.PublicKey - ruleset: web3.PublicKey + accountBalances: web3.PublicKey + collector: web3.PublicKey instructions: web3.PublicKey } @@ -56,13 +56,13 @@ export function createPostTransferInstruction( }) const keys: web3.AccountMeta[] = [ { - pubkey: accounts.mintManager, - isWritable: false, + pubkey: accounts.accountBalances, + isWritable: true, isSigner: false, }, { - pubkey: accounts.ruleset, - isWritable: false, + pubkey: accounts.collector, + isWritable: true, isSigner: false, }, { diff --git a/sdk/src/generated/instructions/preTransfer.ts b/sdk/src/generated/instructions/preTransfer.ts index c1bf2fd0..bf838ce1 100644 --- a/sdk/src/generated/instructions/preTransfer.ts +++ b/sdk/src/generated/instructions/preTransfer.ts @@ -22,20 +22,16 @@ export const preTransferStruct = new beet.BeetArgsStruct<{ /** * Accounts required by the _preTransfer_ instruction * - * @property [] mintManager - * @property [] ruleset - * @property [_writable_, **signer**] payer * @property [_writable_] accountBalances + * @property [_writable_, **signer**] payer * @property [] instructions * @category Instructions * @category PreTransfer * @category generated */ export type PreTransferInstructionAccounts = { - mintManager: web3.PublicKey - ruleset: web3.PublicKey - payer: web3.PublicKey accountBalances: web3.PublicKey + payer: web3.PublicKey instructions: web3.PublicKey } @@ -60,13 +56,8 @@ export function createPreTransferInstruction( }) const keys: web3.AccountMeta[] = [ { - pubkey: accounts.mintManager, - isWritable: false, - isSigner: false, - }, - { - pubkey: accounts.ruleset, - isWritable: false, + pubkey: accounts.accountBalances, + isWritable: true, isSigner: false, }, { @@ -74,11 +65,6 @@ export function createPreTransferInstruction( isWritable: true, isSigner: true, }, - { - pubkey: accounts.accountBalances, - isWritable: true, - isSigner: false, - }, { pubkey: accounts.instructions, isWritable: false, diff --git a/sdk/src/generated/types/AccountBalance.ts b/sdk/src/generated/types/AccountBalance.ts index 886f8553..d5050f30 100644 --- a/sdk/src/generated/types/AccountBalance.ts +++ b/sdk/src/generated/types/AccountBalance.ts @@ -11,6 +11,7 @@ import * as beetSolana from '@metaplex-foundation/beet-solana' export type AccountBalance = { address: web3.PublicKey mint: web3.PublicKey + size: beet.bignum balance: beet.bignum } @@ -22,6 +23,7 @@ export const accountBalanceBeet = new beet.BeetArgsStruct<AccountBalance>( [ ['address', beetSolana.publicKey], ['mint', beetSolana.publicKey], + ['size', beet.u64], ['balance', beet.u64], ], 'AccountBalance' diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts index 6bd8a94e..d3c97378 100644 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ b/sdk/src/idl/cardinal_creator_standard.ts @@ -463,13 +463,8 @@ export type CardinalCreatorStandard = { "name": "preTransfer", "accounts": [ { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, + "name": "accountBalances", + "isMut": true, "isSigner": false }, { @@ -477,11 +472,6 @@ export type CardinalCreatorStandard = { "isMut": true, "isSigner": true }, - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, { "name": "instructions", "isMut": false, @@ -494,13 +484,13 @@ export type CardinalCreatorStandard = { "name": "postTransfer", "accounts": [ { - "name": "mintManager", - "isMut": false, + "name": "accountBalances", + "isMut": true, "isSigner": false }, { - "name": "ruleset", - "isMut": false, + "name": "collector", + "isMut": true, "isSigner": false }, { @@ -680,6 +670,10 @@ export type CardinalCreatorStandard = { "name": "mint", "type": "publicKey" }, + { + "name": "size", + "type": "u64" + }, { "name": "balance", "type": "u64" @@ -758,6 +752,11 @@ export type CardinalCreatorStandard = { "code": 6013, "name": "UnknownAccount", "msg": "Unknown account found in instruction" + }, + { + "code": 6014, + "name": "AccountNotFound", + "msg": "Account not found in instruction" } ] }; @@ -1227,13 +1226,8 @@ export const IDL: CardinalCreatorStandard = { "name": "preTransfer", "accounts": [ { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, + "name": "accountBalances", + "isMut": true, "isSigner": false }, { @@ -1241,11 +1235,6 @@ export const IDL: CardinalCreatorStandard = { "isMut": true, "isSigner": true }, - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, { "name": "instructions", "isMut": false, @@ -1258,13 +1247,13 @@ export const IDL: CardinalCreatorStandard = { "name": "postTransfer", "accounts": [ { - "name": "mintManager", - "isMut": false, + "name": "accountBalances", + "isMut": true, "isSigner": false }, { - "name": "ruleset", - "isMut": false, + "name": "collector", + "isMut": true, "isSigner": false }, { @@ -1444,6 +1433,10 @@ export const IDL: CardinalCreatorStandard = { "name": "mint", "type": "publicKey" }, + { + "name": "size", + "type": "u64" + }, { "name": "balance", "type": "u64" @@ -1522,6 +1515,11 @@ export const IDL: CardinalCreatorStandard = { "code": 6013, "name": "UnknownAccount", "msg": "Unknown account found in instruction" + }, + { + "code": 6014, + "name": "AccountNotFound", + "msg": "Account not found in instruction" } ] }; From 612f520863d62948815bdde94321b87d981b4f3f Mon Sep 17 00:00:00 2001 From: Giannis Chatziveroglou <gchatz@mit.edu> Date: Fri, 21 Oct 2022 10:42:31 -0700 Subject: [PATCH 18/37] program owner for account_balances --- program/src/instructions/token/pre_transfer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program/src/instructions/token/pre_transfer.rs b/program/src/instructions/token/pre_transfer.rs index a3296c42..d3bd28b1 100644 --- a/program/src/instructions/token/pre_transfer.rs +++ b/program/src/instructions/token/pre_transfer.rs @@ -79,7 +79,7 @@ pub fn handler(ctx: Context<PreTransferCtx>) -> Result<()> { ctx.accounts.account_balances.key, Rent::get()?.minimum_balance(space), space.try_into().expect("Error allocating space"), - &spl_token::id(), + ctx.program_id, ), &[ ctx.accounts.payer.to_account_info(), From 3cc0727ca1fcf15330f9737199312a784631d419 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 16:32:34 -0400 Subject: [PATCH 19/37] Test fixes --- Makefile | 2 +- .../mint_manager/init_mint_manager.rs | 4 +- .../src/instructions/ruleset/init_ruleset.rs | 2 + .../instructions/ruleset/update_ruleset.rs | 4 + sdk/idl/cardinal_creator_standard.json | 12 ++ sdk/package.json | 3 +- sdk/src/errors/formatLogs.ts | 73 ++++++++ sdk/src/errors/parseTransactionLogs.ts | 170 ++++++++++++++++++ sdk/src/errors/programErrors.ts | 152 ++++++++++++++++ sdk/src/generated/types/InitRulesetIx.ts | 2 + sdk/src/generated/types/UpdateRulesetIx.ts | 6 +- sdk/src/idl/cardinal_creator_standard.ts | 24 +++ sdk/src/pda.ts | 4 +- sdk/{ => src}/utils.ts | 31 +++- sdk/tests/init.test.ts | 77 +++++--- sdk/tsconfig.json | 2 +- sdk/yarn.lock | 5 + 17 files changed, 537 insertions(+), 36 deletions(-) create mode 100644 sdk/src/errors/formatLogs.ts create mode 100644 sdk/src/errors/parseTransactionLogs.ts create mode 100644 sdk/src/errors/programErrors.ts rename sdk/{ => src}/utils.ts (73%) diff --git a/Makefile b/Makefile index 5e9ba9e7..2e0082c0 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ start: pkill solana-test-validator || true solana-test-validator --url https://api.mainnet-beta.solana.com \ --clone metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s --clone PwDiXFxQsGra4sFFTT8r1QWRMd4vfumiWC1jfWNfdYT \ - --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./program/target/deploy/cardinal_creator_standard.so \ + --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./target/deploy/cardinal_creator_standard.so \ --reset --quiet & echo $$! > validator.PID sleep 8 solana airdrop 1000 $(TEST_KEY) --url http://localhost:8899 diff --git a/program/src/instructions/mint_manager/init_mint_manager.rs b/program/src/instructions/mint_manager/init_mint_manager.rs index 511a2766..9c10b884 100644 --- a/program/src/instructions/mint_manager/init_mint_manager.rs +++ b/program/src/instructions/mint_manager/init_mint_manager.rs @@ -47,7 +47,7 @@ pub fn handler(ctx: Context<InitMintManagerCtx>) -> Result<()> { // set mint authoriy let cpi_accounts = SetAuthority { account_or_mint: ctx.accounts.mint.to_account_info(), - current_authority: ctx.accounts.mint_manager.to_account_info(), + current_authority: ctx.accounts.authority.to_account_info(), }; let cpi_program = ctx.accounts.token_program.to_account_info(); let cpi_context = CpiContext::new(cpi_program, cpi_accounts); @@ -60,7 +60,7 @@ pub fn handler(ctx: Context<InitMintManagerCtx>) -> Result<()> { // set freeze authoriy let cpi_accounts = SetAuthority { account_or_mint: ctx.accounts.mint.to_account_info(), - current_authority: ctx.accounts.mint_manager.to_account_info(), + current_authority: ctx.accounts.authority.to_account_info(), }; let cpi_program = ctx.accounts.token_program.to_account_info(); let cpi_context = CpiContext::new(cpi_program, cpi_accounts); diff --git a/program/src/instructions/ruleset/init_ruleset.rs b/program/src/instructions/ruleset/init_ruleset.rs index bc00a9a2..7f1d58bd 100644 --- a/program/src/instructions/ruleset/init_ruleset.rs +++ b/program/src/instructions/ruleset/init_ruleset.rs @@ -5,6 +5,7 @@ use anchor_lang::prelude::*; pub struct InitRulesetIx { pub check_seller_fee_basis_points: bool, pub name: String, + pub collector: Pubkey, pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, } @@ -31,6 +32,7 @@ pub fn handler(ctx: Context<InitRulesetCtx>, ix: InitRulesetIx) -> Result<()> { ruleset.bump = *ctx.bumps.get("ruleset").unwrap(); ruleset.version = 0; ruleset.authority = ctx.accounts.authority.key(); + ruleset.collector = ix.collector; ruleset.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; ruleset.name = ix.name; ruleset.allowed_programs = ix.allowed_programs; diff --git a/program/src/instructions/ruleset/update_ruleset.rs b/program/src/instructions/ruleset/update_ruleset.rs index b4949ab9..83109ed7 100644 --- a/program/src/instructions/ruleset/update_ruleset.rs +++ b/program/src/instructions/ruleset/update_ruleset.rs @@ -4,6 +4,8 @@ use anchor_lang::prelude::*; #[derive(AnchorSerialize, AnchorDeserialize)] pub struct UpdateRulesetIx { + pub authority: Pubkey, + pub collector: Pubkey, pub check_seller_fee_basis_points: bool, pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, @@ -21,6 +23,8 @@ pub struct UpdateRulesetCtx<'info> { pub fn handler(ctx: Context<UpdateRulesetCtx>, ix: UpdateRulesetIx) -> Result<()> { let ruleset = &mut ctx.accounts.ruleset; + ruleset.authority = ix.authority; + ruleset.collector = ix.collector; ruleset.check_seller_fee_basis_points = ix.check_seller_fee_basis_points; ruleset.allowed_programs = ix.allowed_programs; ruleset.disallowed_addresses = ix.disallowed_addresses; diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index bc788198..11587c4e 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -618,6 +618,10 @@ "name": "name", "type": "string" }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "disallowedAddresses", "type": { @@ -638,6 +642,14 @@ "type": { "kind": "struct", "fields": [ + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "checkSellerFeeBasisPoints", "type": "bool" diff --git a/sdk/package.json b/sdk/package.json index 173c55fe..dec23373 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -19,11 +19,12 @@ "devDependencies": { "@rushstack/eslint-patch": "^1.2.0", "@types/jest": "^29.2.0", + "colors": "^1.4.0", "dotenv": "^16.0.3", "eslint": "^8.25.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-plugin-import": "^2.26.0", "eslint-plugin-github": "^4.3.2", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-jest": "^25.3.2", "jest": "^29.2.1", "lint-staged": "^13.0.3", diff --git a/sdk/src/errors/formatLogs.ts b/sdk/src/errors/formatLogs.ts new file mode 100644 index 00000000..3cf2ef91 --- /dev/null +++ b/sdk/src/errors/formatLogs.ts @@ -0,0 +1,73 @@ +import type { SendTransactionError } from "@solana/web3.js"; +import { default as colors } from "colors/safe.js"; +import { + InstructionLogs, + LogMessage, + parseProgramLogs, +} from "./parseTransactionLogs"; + +/** + * Formats a log entry to be printed out. + * @param entry + * @param prefix + * @returns + */ +export const formatLogEntry = (entry: LogMessage): string => { + switch (entry.style) { + case "success": + return `Program returned success`; + case "muted": + return `Program returned error: ${entry.text}`; + case "info": + return `Runtime error: ${entry.text}`; + case "warning": + return entry.text; + } +}; + +/** + * Formats instruction logs to be printed to the console. + * @param logs + */ +export const formatInstructionLogsForConsole = ( + logs: readonly InstructionLogs[] +): string => + logs + .map((log, i) => { + return [ + [ + colors.bold(colors.blue("=> ")), + colors.bold(colors.white(`Instruction #${i}: `)), + log.invokedProgram + ? colors.yellow(`Program ${log.invokedProgram}`) + : "System", + ].join(""), + ...log.logs.map((entry) => { + const entryStr = formatLogEntry(entry); + switch (entry.style) { + case "info": + return colors.white(entryStr); + case "warning": + return colors.cyan(entryStr); + case "muted": + return colors.white(entryStr); + case "success": + return colors.green(entryStr); + } + }), + ].join("\n"); + }) + .join("\n"); + +export const printSendTransactionError = (err: SendTransactionError) => { + try { + const parsed = parseProgramLogs(err.logs ?? [], err); + console.log(formatInstructionLogsForConsole(parsed)); + } catch (e) { + console.warn( + colors.yellow("Could not print logs due to error. Printing raw logs"), + e + ); + console.log(err.logs?.join("\n")); + } +}; diff --git a/sdk/src/errors/parseTransactionLogs.ts b/sdk/src/errors/parseTransactionLogs.ts new file mode 100644 index 00000000..ecbf80a1 --- /dev/null +++ b/sdk/src/errors/parseTransactionLogs.ts @@ -0,0 +1,170 @@ +/** + * Adapted from explorer.solana.com code written by @jstarry. + */ + +import { TransactionError } from "@solana/web3.js"; +import { + getTransactionInstructionError, + getProgramName, +} from "./programErrors"; + +export type LogMessage = { + text: string; + prefix: string; + style: "muted" | "info" | "success" | "warning"; +}; + +export type InstructionLogs = { + invokedProgram: string | null; + logs: LogMessage[]; + computeUnits: number; + truncated: boolean; + failed: boolean; +}; + +export function parseProgramLogs( + logs: string[], + error: TransactionError | null +): InstructionLogs[] { + let depth = 0; + let prettyLogs: InstructionLogs[] = []; + function prefixBuilder( + // Indent level starts at 1. + indentLevel: number + ) { + let prefix; + if (indentLevel <= 0) { + console.warn( + `Tried to build a prefix for a program log at indent level \`${indentLevel}\`. ` + + "Logs should only ever be built at indent level 1 or higher." + ); + prefix = ""; + } else { + prefix = new Array(indentLevel - 1).fill("\u00A0\u00A0").join(""); + } + return prefix + "> "; + } + + let prettyError; + if (error) { + prettyError = getTransactionInstructionError(error); + } + + logs.forEach((log) => { + if (log.startsWith("Program log:")) { + // Use passive tense + log = log.replace(/Program log: (.*)/g, (_match, p1) => { + return `Program logged: "${p1}"`; + }); + + prettyLogs[prettyLogs.length - 1]?.logs.push({ + prefix: prefixBuilder(depth), + text: log, + style: "muted", + }); + } else if (log.startsWith("Log truncated")) { + prettyLogs[prettyLogs.length - 1]!.truncated = true; + } else { + const regex = /Program (\w*) invoke \[(\d)\]/g; + const matches = [...log.matchAll(regex)]; + + if (matches.length > 0) { + const programAddress = matches[0]![1]; + const programName = getProgramName(programAddress); + + if (depth === 0) { + prettyLogs.push({ + invokedProgram: programAddress ?? null, + logs: [], + computeUnits: 0, + failed: false, + truncated: false, + }); + } else { + prettyLogs[prettyLogs.length - 1]?.logs.push({ + prefix: prefixBuilder(depth), + style: "info", + text: `Program invoked: ${programName}`, + }); + } + + depth++; + } else if (log.includes("success")) { + prettyLogs[prettyLogs.length - 1]?.logs.push({ + prefix: prefixBuilder(depth), + style: "success", + text: `Program returned success`, + }); + depth--; + } else if (log.includes("failed")) { + const instructionLog = prettyLogs[prettyLogs.length - 1]!; + instructionLog.failed = true; + instructionLog.logs.push({ + prefix: prefixBuilder(depth), + style: "warning", + text: `Program returned error: "${log.slice(log.indexOf(": ") + 2)}"`, + }); + depth--; + } else { + if (depth === 0) { + prettyLogs.push({ + invokedProgram: null, + logs: [], + computeUnits: 0, + failed: false, + truncated: false, + }); + depth++; + } + + // Remove redundant program address from logs + log = log.replace( + /Program \w* consumed (\d*) (.*)/g, + (_match, p1, p2) => { + // Only aggregate compute units consumed from top-level tx instructions + // because they include inner ix compute units as well. + if (depth === 1) { + prettyLogs[prettyLogs.length - 1]!.computeUnits += + Number.parseInt(p1); + } + + return `Program consumed: ${p1} ${p2}`; + } + ); + + // native program logs don't start with "Program log:" + prettyLogs[prettyLogs.length - 1]?.logs.push({ + prefix: prefixBuilder(depth), + text: log, + style: "muted", + }); + } + } + }); + + // If the instruction's simulation returned an error without any logs then add an empty log entry for Runtime error + // For example BpfUpgradableLoader fails without returning any logs for Upgrade instruction with buffer that doesn't exist + if (prettyError && prettyLogs.length === 0) { + prettyLogs.push({ + invokedProgram: null, + logs: [], + computeUnits: 0, + failed: true, + truncated: false, + }); + } + + if (prettyError && prettyError.index === prettyLogs.length - 1) { + const failedIx = prettyLogs[prettyError.index]; + if (failedIx && !failedIx?.failed) { + failedIx.failed = true; + failedIx.logs.push({ + prefix: prefixBuilder(1), + text: `Runtime error: ${prettyError.message}`, + style: "warning", + }); + } + } + + return prettyLogs; +} diff --git a/sdk/src/errors/programErrors.ts b/sdk/src/errors/programErrors.ts new file mode 100644 index 00000000..e6a9ba1a --- /dev/null +++ b/sdk/src/errors/programErrors.ts @@ -0,0 +1,152 @@ +/** + * Adapted from explorer.solana.com code written by @jstarry. + */ + +import { TransactionError } from "@solana/web3.js"; + +const instructionErrorMessage: Map<string, string> = new Map([ + ["GenericError", "generic instruction error"], + ["InvalidArgument", "invalid program argument"], + ["InvalidInstructionData", "invalid instruction data"], + ["InvalidAccountData", "invalid account data for instruction"], + ["AccountDataTooSmall", "account data too small for instruction"], + ["InsufficientFunds", "insufficient funds for instruction"], + ["IncorrectProgramId", "incorrect program id for instruction"], + ["MissingRequiredSignature", "missing required signature for instruction"], + [ + "AccountAlreadyInitialized", + "instruction requires an uninitialized account", + ], + ["UninitializedAccount", "instruction requires an initialized account"], + [ + "UnbalancedInstruction", + "sum of account balances before and after instruction do not match", + ], + ["ModifiedProgramId", "instruction modified the program id of an account"], + [ + "ExternalAccountLamportSpend", + "instruction spent from the balance of an account it does not own", + ], + [ + "ExternalAccountDataModified", + "instruction modified data of an account it does not own", + ], + [ + "ReadonlyLamportChange", + "instruction changed the balance of a read-only account", + ], + ["ReadonlyDataModified", "instruction modified data of a read-only account"], + ["DuplicateAccountIndex", "instruction contains duplicate accounts"], + ["ExecutableModified", "instruction changed executable bit of an account"], + ["RentEpochModified", "instruction modified rent epoch of an account"], + ["NotEnoughAccountKeys", "insufficient account keys for instruction"], + ["AccountDataSizeChanged", "non-system instruction changed account size"], + ["AccountNotExecutable", "instruction expected an executable account"], + [ + "AccountBorrowFailed", + "instruction tries to borrow reference for an account which is already borrowed", + ], + [ + "AccountBorrowOutstanding", + "instruction left account with an outstanding borrowed reference", + ], + [ + "DuplicateAccountOutOfSync", + "instruction modifications of multiply-passed account differ", + ], + ["Custom", "custom program error: {0}"], + ["InvalidError", "program returned invalid error code"], + ["ExecutableDataModified", "instruction changed executable accounts data"], + [ + "ExecutableLamportChange", + "instruction changed the balance of a executable account", + ], + ["ExecutableAccountNotRentExempt", "executable accounts must be rent exempt"], + ["UnsupportedProgramId", "Unsupported program id"], + ["CallDepth", "Cross-program invocation call depth too deep"], + ["MissingAccount", "An account required by the instruction is missing"], + [ + "ReentrancyNotAllowed", + "Cross-program invocation reentrancy not allowed for this instruction", + ], + [ + "MaxSeedLengthExceeded", + "Length of the seed is too long for address generation", + ], + ["InvalidSeeds", "Provided seeds do not result in a valid address"], + ["InvalidRealloc", "Failed to reallocate account data"], + ["ComputationalBudgetExceeded", "Computational budget exceeded"], + [ + "PrivilegeEscalation", + "Cross-program invocation with unauthorized signer or writable account", + ], + [ + "ProgramEnvironmentSetupFailure", + "Failed to create program execution environment", + ], + ["ProgramFailedToComplete", "Program failed to complete"], + ["ProgramFailedToCompile", "Program failed to compile"], + ["Immutable", "Account is immutable"], + ["IncorrectAuthority", "Incorrect authority provided"], + ["BorshIoError", "Failed to serialize or deserialize account data: {0}"], + [ + "AccountNotRentExempt", + "An account does not have enough lamports to be rent-exempt", + ], + ["InvalidAccountOwner", "Invalid account owner"], + ["ArithmeticOverflow", "Program arithmetic overflowed"], + ["UnsupportedSysvar", "Unsupported sysvar"], + ["IllegalOwner", "Provided owner is not allowed"], +]); + +export type ProgramError = { + index: number; + message: string; +}; + +export function getTransactionInstructionError( + error?: TransactionError | { InstructionError: number[] } | null +): ProgramError | undefined { + if (!error) { + return; + } + + if (typeof error === "object" && "InstructionError" in error) { + const innerError = error["InstructionError"]; + const index = innerError[0] as number; + const instructionError = innerError[1]; + + return { + index, + message: getInstructionError(instructionError), + }; + } +} + +function getInstructionError(error: any): string { + let out; + let value; + + if (typeof error === "string") { + const message = instructionErrorMessage.get(error); + if (message) { + return message; + } + } else if ("Custom" in error) { + out = instructionErrorMessage.get("Custom"); + value = error["Custom"]; + } else if ("BorshIoError" in error) { + out = instructionErrorMessage.get("BorshIoError"); + value = error["BorshIoError"]; + } + + if (out && value) { + return out.replace("{0}", value); + } + + return "Unknown instruction error"; +} + +export function getProgramName(address: string | undefined): string { + return address ?? "????"; +} diff --git a/sdk/src/generated/types/InitRulesetIx.ts b/sdk/src/generated/types/InitRulesetIx.ts index 64d9ef11..c427dc70 100644 --- a/sdk/src/generated/types/InitRulesetIx.ts +++ b/sdk/src/generated/types/InitRulesetIx.ts @@ -11,6 +11,7 @@ import * as beetSolana from '@metaplex-foundation/beet-solana' export type InitRulesetIx = { checkSellerFeeBasisPoints: boolean name: string + collector: web3.PublicKey disallowedAddresses: web3.PublicKey[] allowedPrograms: web3.PublicKey[] } @@ -23,6 +24,7 @@ export const initRulesetIxBeet = new beet.FixableBeetArgsStruct<InitRulesetIx>( [ ['checkSellerFeeBasisPoints', beet.bool], ['name', beet.utf8String], + ['collector', beetSolana.publicKey], ['disallowedAddresses', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], ], diff --git a/sdk/src/generated/types/UpdateRulesetIx.ts b/sdk/src/generated/types/UpdateRulesetIx.ts index 3f430e58..af640807 100644 --- a/sdk/src/generated/types/UpdateRulesetIx.ts +++ b/sdk/src/generated/types/UpdateRulesetIx.ts @@ -6,9 +6,11 @@ */ import * as web3 from '@solana/web3.js' -import * as beet from '@metaplex-foundation/beet' import * as beetSolana from '@metaplex-foundation/beet-solana' +import * as beet from '@metaplex-foundation/beet' export type UpdateRulesetIx = { + authority: web3.PublicKey + collector: web3.PublicKey checkSellerFeeBasisPoints: boolean disallowedAddresses: web3.PublicKey[] allowedPrograms: web3.PublicKey[] @@ -21,6 +23,8 @@ export type UpdateRulesetIx = { export const updateRulesetIxBeet = new beet.FixableBeetArgsStruct<UpdateRulesetIx>( [ + ['authority', beetSolana.publicKey], + ['collector', beetSolana.publicKey], ['checkSellerFeeBasisPoints', beet.bool], ['disallowedAddresses', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts index d3c97378..dbef73e2 100644 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ b/sdk/src/idl/cardinal_creator_standard.ts @@ -618,6 +618,10 @@ export type CardinalCreatorStandard = { "name": "name", "type": "string" }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "disallowedAddresses", "type": { @@ -638,6 +642,14 @@ export type CardinalCreatorStandard = { "type": { "kind": "struct", "fields": [ + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "checkSellerFeeBasisPoints", "type": "bool" @@ -1381,6 +1393,10 @@ export const IDL: CardinalCreatorStandard = { "name": "name", "type": "string" }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "disallowedAddresses", "type": { @@ -1401,6 +1417,14 @@ export const IDL: CardinalCreatorStandard = { "type": { "kind": "struct", "fields": [ + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, { "name": "checkSellerFeeBasisPoints", "type": "bool" diff --git a/sdk/src/pda.ts b/sdk/src/pda.ts index 24eb2751..031c61a3 100644 --- a/sdk/src/pda.ts +++ b/sdk/src/pda.ts @@ -10,9 +10,9 @@ export const findMintManagerId = (mintId: PublicKey) => { )[0]; }; -export const findStandardId = (name: string) => { +export const findRulesetId = (name: string) => { return findProgramAddressSync( - [utils.bytes.utf8.encode("standard"), utils.bytes.utf8.encode(name)], + [utils.bytes.utf8.encode("ruleset"), utils.bytes.utf8.encode(name)], PROGRAM_ID )[0]; }; diff --git a/sdk/utils.ts b/sdk/src/utils.ts similarity index 73% rename from sdk/utils.ts rename to sdk/src/utils.ts index ac05915d..6e93f5a4 100644 --- a/sdk/utils.ts +++ b/sdk/src/utils.ts @@ -2,10 +2,13 @@ import { Connection, Transaction, sendAndConfirmRawTransaction, + SendTransactionError, } from "@solana/web3.js"; import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; -import { PROGRAM_ADDRESS } from "./src/generated"; +import { PROGRAM_ADDRESS } from "./generated"; import { utils, Wallet } from "@project-serum/anchor"; +import { parseProgramLogs } from "./errors/parseTransactionLogs"; +import { formatInstructionLogsForConsole } from "./errors/formatLogs"; export async function newAccountWithLamports( connection: Connection, @@ -36,10 +39,16 @@ export async function executeTransaction( tx.recentBlockhash = await (await connection.getLatestBlockhash()).blockhash; tx.feePayer = wallet.publicKey; await wallet.signTransaction(tx); - return sendAndConfirmRawTransaction(connection, tx.serialize()); + try { + const txid = await sendAndConfirmRawTransaction(connection, tx.serialize()); + return txid; + } catch (e) { + handleError(e); + throw e; + } } -type CardinalProvider = { +export type CardinalProvider = { connection: Connection; wallet: Wallet; keypair: Keypair; @@ -96,3 +105,19 @@ export const keypairFrom = (s: string, n?: string): Keypair => { } } }; + +export const handleError = (e: any) => { + const message = (e as SendTransactionError).message ?? ""; + const logs = + (e as SendTransactionError).logs ?? [ + (e as SendTransactionError).message ?? "", + ] ?? [(e as Error).toString()] ?? + []; + if (logs) { + const parsed = parseProgramLogs(logs, message); + const fmt = formatInstructionLogsForConsole(parsed); + console.log(fmt); + } else { + console.log(e); + } +}; diff --git a/sdk/tests/init.test.ts b/sdk/tests/init.test.ts index 29daaea3..ec6a7e70 100644 --- a/sdk/tests/init.test.ts +++ b/sdk/tests/init.test.ts @@ -1,23 +1,32 @@ import { test, beforeAll, expect } from "@jest/globals"; -import { executeTransaction, getProvider } from "../utils"; +import { + CardinalProvider, + executeTransaction, + getProvider, +} from "../src/utils"; import type { PublicKey } from "@solana/web3.js"; import { Keypair, Transaction } from "@solana/web3.js"; -import { createMint } from "@solana/spl-token"; +import { + createMint, + getOrCreateAssociatedTokenAccount, + mintTo, +} from "@solana/spl-token"; import { findMintManagerId, createInitMintManagerInstruction, MintManager, - createInitStandardInstruction, - findStandardId, - Standard, + createInitRulesetInstruction, + findRulesetId, + Ruleset, } from "../src"; let mint: PublicKey; -const STANDARD_NAME = "global"; -const STANDARD_ID = findStandardId(STANDARD_NAME); +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; beforeAll(async () => { - const provider = await getProvider(); + provider = await getProvider(); const mintKeypair = Keypair.generate(); mint = await createMint( provider.connection, @@ -27,53 +36,71 @@ beforeAll(async () => { 0, mintKeypair ); + const ata = await getOrCreateAssociatedTokenAccount( + provider.connection, + provider.keypair, + mint, + provider.wallet.publicKey + ); + await mintTo( + provider.connection, + provider.keypair, + mint, + ata.address, + provider.wallet.publicKey, + 1 + ); }); -test("Create standard", async () => { - const provider = await getProvider(); +test("Create ruleset", async () => { const tx = new Transaction(); tx.add( - createInitStandardInstruction( + createInitRulesetInstruction( { - standard: STANDARD_ID, + ruleset: RULESET_ID, authority: provider.wallet.publicKey, payer: provider.wallet.publicKey, }, { ix: { - standardName: STANDARD_NAME, + name: RULESET_NAME, + collector: provider.wallet.publicKey, checkSellerFeeBasisPoints: true, - disallowedPrograms: [], + disallowedAddresses: [], allowedPrograms: [], }, } ) ); await executeTransaction(provider.connection, tx, provider.wallet); - const standard = await Standard.fromAccountAddress( + const ruleset = await Ruleset.fromAccountAddress( provider.connection, - STANDARD_ID + RULESET_ID ); - expect(standard.authority.toString()).toBe( + expect(ruleset.authority.toString()).toBe( provider.wallet.publicKey.toString() ); - expect(standard.checkSellerFeeBasisPoints).toBe(true); - expect(standard.disallowedPrograms).toBe([]); - expect(standard.allowedPrograms).toBe([]); + expect(ruleset.checkSellerFeeBasisPoints).toBe(true); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); }); test("Init", async () => { - const provider = await getProvider(); const mintManagerId = findMintManagerId(mint); const tx = new Transaction(); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + tx.add( createInitMintManagerInstruction({ mint: mint, mintManager: mintManagerId, authority: provider.wallet.publicKey, payer: provider.wallet.publicKey, - collector: provider.wallet.publicKey, - standard: Keypair.generate().publicKey, + collector: ruleset.collector, + ruleset: RULESET_ID, }) ); await executeTransaction(provider.connection, tx, provider.wallet); @@ -86,7 +113,7 @@ test("Init", async () => { expect(mintManager.authority.toString()).toBe( provider.wallet.publicKey.toString() ); - expect(mintManager.standard.toString()).toBe( - findStandardId(STANDARD_NAME).toString() + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME).toString() ); }); diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 0b3672af..178243b6 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -36,5 +36,5 @@ "declarationMap": true, "inlineSources": true }, - "include": ["src/", "tests/"] + "include": ["src/", "tests/", "src/utils.ts"] } diff --git a/sdk/yarn.lock b/sdk/yarn.lock index 252264f8..b4cce8e6 100644 --- a/sdk/yarn.lock +++ b/sdk/yarn.lock @@ -1499,6 +1499,11 @@ colorette@^2.0.16, colorette@^2.0.17: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" From 8beab5e2dc6c288d8f2469f316dcd15cc6253de4 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Fri, 21 Oct 2022 17:06:10 -0400 Subject: [PATCH 20/37] Init mint test --- program/src/instructions/token/init_mint.rs | 8 +- sdk/package.json | 3 +- sdk/src/utils.ts | 5 +- sdk/tests/initRulesetInitMint.test.ts | 101 ++++++++++++++++++ ...test.ts => initRulesetMintManager.test.ts} | 34 ++---- sdk/tests/utils.ts | 31 ++++++ sdk/tsconfig.json | 3 +- sdk/yarn.lock | 21 ++++ 8 files changed, 169 insertions(+), 37 deletions(-) create mode 100644 sdk/tests/initRulesetInitMint.test.ts rename sdk/tests/{init.test.ts => initRulesetMintManager.test.ts} (81%) create mode 100644 sdk/tests/utils.ts diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index 5a35a2d5..ece0eae5 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -6,7 +6,6 @@ use anchor_spl::associated_token::AssociatedToken; use anchor_spl::associated_token::{self}; use anchor_spl::token::MintTo; use anchor_spl::token::Token; -use anchor_spl::token::TokenAccount; use anchor_spl::token::{self}; use solana_program::program_pack::Pack; use solana_program::system_instruction::create_account; @@ -30,7 +29,7 @@ pub struct InitMintCtx<'info> { /// CHECK: Account created or checked in handler #[account(mut)] - target_token_account: Account<'info, TokenAccount>, + target_token_account: UncheckedAccount<'info>, target: Signer<'info>, /// CHECK: Account is not read from @@ -107,11 +106,6 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { let cpi_program = ctx.accounts.token_program.to_account_info(); let cpi_context = CpiContext::new(cpi_program, cpi_accounts); associated_token::create(cpi_context)?; - } else if ctx.accounts.target_token_account.mint != ctx.accounts.mint_manager.mint - || ctx.accounts.target_token_account.owner != ctx.accounts.target.key() - || ctx.accounts.target_token_account.amount != 0 - { - return Err(error!(ErrorCode::InvalidTargetTokenAccount)); } // mint to diff --git a/sdk/package.json b/sdk/package.json index dec23373..26571766 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -14,7 +14,8 @@ "@metaplex-foundation/rustbin": "^0.3.1", "@metaplex-foundation/solita": "^0.12.2", "@project-serum/anchor": "^0.25.0", - "@solana/spl-token": "^0.3.5" + "@solana/spl-token": "^0.3.5", + "@solana/web3.js": "^1.66.2" }, "devDependencies": { "@rushstack/eslint-patch": "^1.2.0", diff --git a/sdk/src/utils.ts b/sdk/src/utils.ts index 6e93f5a4..1b07a459 100644 --- a/sdk/src/utils.ts +++ b/sdk/src/utils.ts @@ -3,6 +3,7 @@ import { Transaction, sendAndConfirmRawTransaction, SendTransactionError, + Signer, } from "@solana/web3.js"; import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; import { PROGRAM_ADDRESS } from "./generated"; @@ -34,11 +35,13 @@ export async function getConnection(): Promise<Connection> { export async function executeTransaction( connection: Connection, tx: Transaction, - wallet: Wallet + wallet: Wallet, + signers?: Signer[] ): Promise<String> { tx.recentBlockhash = await (await connection.getLatestBlockhash()).blockhash; tx.feePayer = wallet.publicKey; await wallet.signTransaction(tx); + signers && tx.partialSign(...signers); try { const txid = await sendAndConfirmRawTransaction(connection, tx.serialize()); return txid; diff --git a/sdk/tests/initRulesetInitMint.test.ts b/sdk/tests/initRulesetInitMint.test.ts new file mode 100644 index 00000000..cc44323c --- /dev/null +++ b/sdk/tests/initRulesetInitMint.test.ts @@ -0,0 +1,101 @@ +import { test, expect } from "@jest/globals"; +import { + CardinalProvider, + executeTransaction, + getProvider, +} from "../src/utils"; +import { Keypair, Transaction } from "@solana/web3.js"; + +import { + findMintManagerId, + MintManager, + createInitRulesetInstruction, + findRulesetId, + Ruleset, + createInitMintInstruction, +} from "../src"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + getAssociatedTokenAddressSync, +} from "@solana/spl-token"; + +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; + +test("Create ruleset", async () => { + provider = await getProvider(); + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: true, + disallowedAddresses: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(true); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Init", async () => { + const mintKeypair = Keypair.generate(); + const mint = mintKeypair.publicKey; + const mintManagerId = findMintManagerId(mint); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + + const tx = new Transaction(); + tx.add( + createInitMintInstruction({ + mintManager: mintManagerId, + mint: mint, + ruleset: RULESET_ID, + targetTokenAccount: getAssociatedTokenAddressSync( + mintKeypair.publicKey, + provider.wallet.publicKey + ), + target: provider.wallet.publicKey, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: ruleset.collector, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet, [ + mintKeypair, + ]); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME).toString() + ); +}); diff --git a/sdk/tests/init.test.ts b/sdk/tests/initRulesetMintManager.test.ts similarity index 81% rename from sdk/tests/init.test.ts rename to sdk/tests/initRulesetMintManager.test.ts index ec6a7e70..50412b08 100644 --- a/sdk/tests/init.test.ts +++ b/sdk/tests/initRulesetMintManager.test.ts @@ -4,13 +4,9 @@ import { executeTransaction, getProvider, } from "../src/utils"; -import type { PublicKey } from "@solana/web3.js"; +import { PublicKey } from "@solana/web3.js"; import { Keypair, Transaction } from "@solana/web3.js"; -import { - createMint, - getOrCreateAssociatedTokenAccount, - mintTo, -} from "@solana/spl-token"; + import { findMintManagerId, createInitMintManagerInstruction, @@ -19,6 +15,7 @@ import { findRulesetId, Ruleset, } from "../src"; +import { createMintTx } from "./utils"; let mint: PublicKey; const RULESET_NAME = `global-${Math.random()}`; @@ -28,27 +25,12 @@ let provider: CardinalProvider; beforeAll(async () => { provider = await getProvider(); const mintKeypair = Keypair.generate(); - mint = await createMint( - provider.connection, - provider.keypair, - provider.wallet.publicKey, - provider.wallet.publicKey, - 0, - mintKeypair - ); - const ata = await getOrCreateAssociatedTokenAccount( - provider.connection, - provider.keypair, - mint, - provider.wallet.publicKey - ); - await mintTo( + mint = mintKeypair.publicKey; + executeTransaction( provider.connection, - provider.keypair, - mint, - ata.address, - provider.wallet.publicKey, - 1 + await createMintTx(provider.connection, mint, provider.wallet.publicKey), + provider.wallet, + [mintKeypair] ); }); diff --git a/sdk/tests/utils.ts b/sdk/tests/utils.ts new file mode 100644 index 00000000..82d79068 --- /dev/null +++ b/sdk/tests/utils.ts @@ -0,0 +1,31 @@ +import { Connection, PublicKey, SystemProgram } from "@solana/web3.js"; +import { Transaction } from "@solana/web3.js"; +import { + createAssociatedTokenAccountInstruction, + createInitializeMint2Instruction, + createMintToInstruction, + getAssociatedTokenAddressSync, + getMinimumBalanceForRentExemptMint, + MINT_SIZE, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; + +export const createMintTx = async ( + connection: Connection, + mint: PublicKey, + authority: PublicKey +) => { + const ata = getAssociatedTokenAddressSync(mint, authority); + return new Transaction().add( + SystemProgram.createAccount({ + fromPubkey: authority, + newAccountPubkey: mint, + space: MINT_SIZE, + lamports: await getMinimumBalanceForRentExemptMint(connection), + programId: TOKEN_PROGRAM_ID, + }), + createInitializeMint2Instruction(mint, 0, authority, authority), + createAssociatedTokenAccountInstruction(authority, ata, authority, mint), + createMintToInstruction(mint, ata, authority, 1) + ); +}; diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index 178243b6..f0559db0 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { "outDir": "./lib", - "rootDir": "./src", // target "target": "ES2019", @@ -36,5 +35,5 @@ "declarationMap": true, "inlineSources": true }, - "include": ["src/", "tests/", "src/utils.ts"] + "include": ["src/", "tests/"] } diff --git a/sdk/yarn.lock b/sdk/yarn.lock index b4cce8e6..e6e78278 100644 --- a/sdk/yarn.lock +++ b/sdk/yarn.lock @@ -789,6 +789,27 @@ rpc-websockets "^7.5.0" superstruct "^0.14.2" +"@solana/web3.js@^1.66.2": + version "1.66.2" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.66.2.tgz#80b43c5868b846124fe3ebac7d3943930c3fa60c" + integrity sha512-RyaHMR2jGmaesnYP045VLeBGfR/gAW3cvZHzMFGg7bkO+WOYOYp1nEllf0/la4U4qsYGKCsO9eEevR5fhHiVHg== + dependencies: + "@babel/runtime" "^7.12.5" + "@noble/ed25519" "^1.7.0" + "@noble/hashes" "^1.1.2" + "@noble/secp256k1" "^1.6.3" + "@solana/buffer-layout" "^4.0.0" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.1" + fast-stable-stringify "^1.0.0" + jayson "^3.4.4" + node-fetch "2" + rpc-websockets "^7.5.0" + superstruct "^0.14.2" + "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" From 76071113d51e0d8deea47c32a7feff10487b2243 Mon Sep 17 00:00:00 2001 From: Giannis Chatziveroglou <gchatz@mit.edu> Date: Fri, 21 Oct 2022 16:46:41 -0700 Subject: [PATCH 21/37] update generate-idls.sh --- sdk/generate-idls.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh index 3ba86735..d5e737a7 100755 --- a/sdk/generate-idls.sh +++ b/sdk/generate-idls.sh @@ -2,13 +2,13 @@ # This script generates the IDL JSONs without buildling the full packages. -rm -rf src/idl/ -mkdir -p src/idl/ +rm -rf sdk/idl/ +mkdir -p sdk/idl/ for PROGRAM in $(find ../program/ -maxdepth 3 -name lib.rs); do PROGRAM_NAME="cardinal_creator_standard" echo "Parsing IDL for $PROGRAM_NAME" - anchor idl parse --file $PROGRAM --out-ts src/idl/$PROGRAM_NAME.ts || { + anchor idl parse --file $PROGRAM --out-ts sdk/idl/$PROGRAM_NAME.ts || { echo "Could not parse IDL" exit 1 } From 6675ac383819e16a3d8d1bcaea795a7746356465 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Sun, 23 Oct 2022 23:23:23 -0400 Subject: [PATCH 22/37] Init test --- program/src/instructions/token/init_mint.rs | 2 +- sdk/generate-idls.sh | 2 +- sdk/idl/cardinal_creator_standard.json | 2 +- sdk/src/generated/instructions/initMint.ts | 4 +- sdk/src/utils.ts | 4 +- sdk/tests/initRulesetInitMint.test.ts | 1 + sdk/tests/initRulesetUpdateRuleset.test.ts | 98 +++++++++++++++++++++ 7 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 sdk/tests/initRulesetUpdateRuleset.test.ts diff --git a/program/src/instructions/token/init_mint.rs b/program/src/instructions/token/init_mint.rs index ece0eae5..1f1e4812 100644 --- a/program/src/instructions/token/init_mint.rs +++ b/program/src/instructions/token/init_mint.rs @@ -24,7 +24,7 @@ pub struct InitMintCtx<'info> { mint_manager: Account<'info, MintManager>, /// CHECK: Account is not read from #[account(mut)] - mint: UncheckedAccount<'info>, + mint: Signer<'info>, ruleset: Account<'info, Ruleset>, /// CHECK: Account created or checked in handler diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh index d5e737a7..544bbd63 100755 --- a/sdk/generate-idls.sh +++ b/sdk/generate-idls.sh @@ -8,7 +8,7 @@ mkdir -p sdk/idl/ for PROGRAM in $(find ../program/ -maxdepth 3 -name lib.rs); do PROGRAM_NAME="cardinal_creator_standard" echo "Parsing IDL for $PROGRAM_NAME" - anchor idl parse --file $PROGRAM --out-ts sdk/idl/$PROGRAM_NAME.ts || { + anchor idl parse --file $PROGRAM --out-ts sdk/src/idl/$PROGRAM_NAME.ts || { echo "Could not parse IDL" exit 1 } diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index 11587c4e..c4724060 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -163,7 +163,7 @@ { "name": "mint", "isMut": true, - "isSigner": false + "isSigner": true }, { "name": "ruleset", diff --git a/sdk/src/generated/instructions/initMint.ts b/sdk/src/generated/instructions/initMint.ts index 88e3bab4..a874603f 100644 --- a/sdk/src/generated/instructions/initMint.ts +++ b/sdk/src/generated/instructions/initMint.ts @@ -24,7 +24,7 @@ export const initMintStruct = new beet.BeetArgsStruct<{ * Accounts required by the _initMint_ instruction * * @property [_writable_] mintManager - * @property [_writable_] mint + * @property [_writable_, **signer**] mint * @property [] ruleset * @property [_writable_] targetTokenAccount * @property [**signer**] target @@ -79,7 +79,7 @@ export function createInitMintInstruction( { pubkey: accounts.mint, isWritable: true, - isSigner: false, + isSigner: true, }, { pubkey: accounts.ruleset, diff --git a/sdk/src/utils.ts b/sdk/src/utils.ts index 1b07a459..5548d3a1 100644 --- a/sdk/src/utils.ts +++ b/sdk/src/utils.ts @@ -41,7 +41,9 @@ export async function executeTransaction( tx.recentBlockhash = await (await connection.getLatestBlockhash()).blockhash; tx.feePayer = wallet.publicKey; await wallet.signTransaction(tx); - signers && tx.partialSign(...signers); + if (signers) { + tx.partialSign(...signers); + } try { const txid = await sendAndConfirmRawTransaction(connection, tx.serialize()); return txid; diff --git a/sdk/tests/initRulesetInitMint.test.ts b/sdk/tests/initRulesetInitMint.test.ts index cc44323c..b061efb3 100644 --- a/sdk/tests/initRulesetInitMint.test.ts +++ b/sdk/tests/initRulesetInitMint.test.ts @@ -83,6 +83,7 @@ test("Init", async () => { associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, }) ); + console.log("----------"); await executeTransaction(provider.connection, tx, provider.wallet, [ mintKeypair, ]); diff --git a/sdk/tests/initRulesetUpdateRuleset.test.ts b/sdk/tests/initRulesetUpdateRuleset.test.ts new file mode 100644 index 00000000..debf262a --- /dev/null +++ b/sdk/tests/initRulesetUpdateRuleset.test.ts @@ -0,0 +1,98 @@ +import { test, beforeAll, expect } from "@jest/globals"; +import { + CardinalProvider, + executeTransaction, + getProvider, +} from "../src/utils"; +import { PublicKey } from "@solana/web3.js"; +import { Keypair, Transaction } from "@solana/web3.js"; + +import { + createInitRulesetInstruction, + findRulesetId, + Ruleset, + createUpdateRulesetInstruction, +} from "../src"; +import { createMintTx } from "./utils"; +let mint: PublicKey; + +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; + +beforeAll(async () => { + provider = await getProvider(); + const mintKeypair = Keypair.generate(); + mint = mintKeypair.publicKey; + executeTransaction( + provider.connection, + await createMintTx(provider.connection, mint, provider.wallet.publicKey), + provider.wallet, + [mintKeypair] + ); +}); + +test("Create ruleset", async () => { + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: true, + disallowedAddresses: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(true); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Update ruleset", async () => { + const tx = new Transaction(); + tx.add( + createUpdateRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + }, + { + ix: { + authority: provider.wallet.publicKey, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: true, + disallowedAddresses: [provider.wallet.publicKey], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(true); + expect(ruleset.disallowedAddresses.length).toBe(1); + expect(ruleset.allowedPrograms.length).toBe(0); +}); From 450b4da851fc2ba1ca7e0781ac8377b406cbac92 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Mon, 24 Oct 2022 00:24:28 -0400 Subject: [PATCH 23/37] Tests --- .../mint_manager/update_mint_manager.rs | 1 + .../instructions/ruleset/update_ruleset.rs | 1 - sdk/generate-idls.sh | 4 +- sdk/idl/cardinal_creator_standard.json | 2 +- sdk/sdk/src/idl/cardinal_creator_standard.ts | 1549 +++++++++++++++++ .../instructions/updateMintManager.ts | 4 +- sdk/src/utils.ts | 128 -- sdk/tests/mint.ts | 31 + ...lesetInitMint.test.ts => mintInit.test.ts} | 7 +- ...anager.test.ts => mintManagerInit.test.ts} | 8 +- sdk/tests/mintManagerInitUpdate.test.ts | 168 ++ ...eset.test.ts => rulesetInitUpdate.test.ts} | 24 +- sdk/tests/utils.ts | 149 +- sdk/tsconfig.cjs.json | 8 + sdk/tsconfig.esm.json | 10 + sdk/tsconfig.json | 6 +- 16 files changed, 1904 insertions(+), 196 deletions(-) create mode 100644 sdk/sdk/src/idl/cardinal_creator_standard.ts delete mode 100644 sdk/src/utils.ts create mode 100644 sdk/tests/mint.ts rename sdk/tests/{initRulesetInitMint.test.ts => mintInit.test.ts} (95%) rename sdk/tests/{initRulesetMintManager.test.ts => mintManagerInit.test.ts} (95%) create mode 100644 sdk/tests/mintManagerInitUpdate.test.ts rename sdk/tests/{initRulesetUpdateRuleset.test.ts => rulesetInitUpdate.test.ts} (78%) create mode 100644 sdk/tsconfig.cjs.json create mode 100644 sdk/tsconfig.esm.json diff --git a/program/src/instructions/mint_manager/update_mint_manager.rs b/program/src/instructions/mint_manager/update_mint_manager.rs index 73d25c2b..d94e48ca 100644 --- a/program/src/instructions/mint_manager/update_mint_manager.rs +++ b/program/src/instructions/mint_manager/update_mint_manager.rs @@ -11,6 +11,7 @@ pub struct UpdateMintManagerIx { #[derive(Accounts)] pub struct UpdateMintManagerCtx<'info> { + #[account(mut)] mint_manager: Account<'info, MintManager>, ruleset: Account<'info, Ruleset>, /// CHECK: Account is not read from diff --git a/program/src/instructions/ruleset/update_ruleset.rs b/program/src/instructions/ruleset/update_ruleset.rs index 83109ed7..e8f2cda7 100644 --- a/program/src/instructions/ruleset/update_ruleset.rs +++ b/program/src/instructions/ruleset/update_ruleset.rs @@ -12,7 +12,6 @@ pub struct UpdateRulesetIx { } #[derive(Accounts)] -#[instruction(ix: UpdateRulesetIx)] pub struct UpdateRulesetCtx<'info> { #[account(mut)] ruleset: Account<'info, Ruleset>, diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh index 544bbd63..0bc03dc6 100755 --- a/sdk/generate-idls.sh +++ b/sdk/generate-idls.sh @@ -2,8 +2,8 @@ # This script generates the IDL JSONs without buildling the full packages. -rm -rf sdk/idl/ -mkdir -p sdk/idl/ +rm -rf sdk/src/idl +mkdir -p sdk/src/idl for PROGRAM in $(find ../program/ -maxdepth 3 -name lib.rs); do PROGRAM_NAME="cardinal_creator_standard" diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/idl/cardinal_creator_standard.json index c4724060..84047c52 100644 --- a/sdk/idl/cardinal_creator_standard.json +++ b/sdk/idl/cardinal_creator_standard.json @@ -53,7 +53,7 @@ "accounts": [ { "name": "mintManager", - "isMut": false, + "isMut": true, "isSigner": false }, { diff --git a/sdk/sdk/src/idl/cardinal_creator_standard.ts b/sdk/sdk/src/idl/cardinal_creator_standard.ts new file mode 100644 index 00000000..97b114e0 --- /dev/null +++ b/sdk/sdk/src/idl/cardinal_creator_standard.ts @@ -0,0 +1,1549 @@ +export type CardinalCreatorStandard = { + "version": "0.1.0", + "name": "cardinal_creator_standard", + "instructions": [ + { + "name": "initMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "updateMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateMintManagerIx" + } + } + ] + }, + { + "name": "initRuleset", + "accounts": [ + { + "name": "ruleset", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "InitRulesetIx" + } + } + ] + }, + { + "name": "updateRuleset", + "accounts": [ + { + "name": "ruleset", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateRulesetIx" + } + } + ] + }, + { + "name": "initMint", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": true + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "targetTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "target", + "isMut": false, + "isSigner": true + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initAccount", + "accounts": [ + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccountOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "approve", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "delegate", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "revoke", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "burn", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "close", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "transfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "from", + "isMut": true, + "isSigner": false + }, + { + "name": "to", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "preTransfer", + "accounts": [ + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "postTransfer", + "accounts": [ + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + } + ], + "accounts": [ + { + "name": "mintManager", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "version", + "type": "u8" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "ruleset", + "type": "publicKey" + } + ] + } + }, + { + "name": "ruleset", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "version", + "type": "u8" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "disallowedAddresses", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "accountBalances", + "type": { + "kind": "struct", + "fields": [ + { + "name": "balances", + "type": { + "vec": { + "defined": "AccountBalance" + } + } + } + ] + } + } + ], + "types": [ + { + "name": "UpdateMintManagerIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "publicKey" + } + ] + } + }, + { + "name": "InitRulesetIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "collector", + "type": "publicKey" + }, + { + "name": "disallowedAddresses", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "UpdateRulesetIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "disallowedAddresses", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "AccountBalance", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "size", + "type": "u64" + }, + { + "name": "balance", + "type": "u64" + } + ] + } + } + ], + "errors": [ + { + "code": 6000, + "name": "InvalidMint", + "msg": "Invalid mint" + }, + { + "code": 6001, + "name": "InvalidCollector", + "msg": "Invalid collector address" + }, + { + "code": 6002, + "name": "InvalidAuthority", + "msg": "Invalid authority address" + }, + { + "code": 6003, + "name": "InvalidMintManager", + "msg": "Invalid mint manager" + }, + { + "code": 6004, + "name": "InvlaidHolderTokenAccount", + "msg": "Invalid holder token account" + }, + { + "code": 6005, + "name": "InvalidTargetTokenAccount", + "msg": "Invalid target token account" + }, + { + "code": 6006, + "name": "InvalidCloseTokenAccount", + "msg": "Invalid token account to close" + }, + { + "code": 6007, + "name": "InvalidHolderTokenAccount", + "msg": "Invalid holder token account" + }, + { + "code": 6008, + "name": "InvalidRuleset", + "msg": "Invalid ruleset" + }, + { + "code": 6009, + "name": "InvalidPreTransferInstruction", + "msg": "Invalid pre transfer instruction" + }, + { + "code": 6010, + "name": "InvalidPostTransferInstruction", + "msg": "Invalid post transfer instruction" + }, + { + "code": 6011, + "name": "ProgramDisallowed", + "msg": "Disallowed program included in transfer" + }, + { + "code": 6012, + "name": "ProgramNotAllowed", + "msg": "Program not allowed in allowed programs to transfer" + }, + { + "code": 6013, + "name": "UnknownAccount", + "msg": "Unknown account found in instruction" + }, + { + "code": 6014, + "name": "AccountNotFound", + "msg": "Account not found in instruction" + } + ] +}; + +export const IDL: CardinalCreatorStandard = { + "version": "0.1.0", + "name": "cardinal_creator_standard", + "instructions": [ + { + "name": "initMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "updateMintManager", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateMintManagerIx" + } + } + ] + }, + { + "name": "initRuleset", + "accounts": [ + { + "name": "ruleset", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "InitRulesetIx" + } + } + ] + }, + { + "name": "updateRuleset", + "accounts": [ + { + "name": "ruleset", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "ix", + "type": { + "defined": "UpdateRulesetIx" + } + } + ] + }, + { + "name": "initMint", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": true + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "targetTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "target", + "isMut": false, + "isSigner": true + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "initAccount", + "accounts": [ + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccountOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "associatedTokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "approve", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "delegate", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "revoke", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": true, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "burn", + "accounts": [ + { + "name": "mintManager", + "isMut": true, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "holder", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "close", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "transfer", + "accounts": [ + { + "name": "mintManager", + "isMut": false, + "isSigner": false + }, + { + "name": "ruleset", + "isMut": false, + "isSigner": false + }, + { + "name": "mint", + "isMut": false, + "isSigner": false + }, + { + "name": "from", + "isMut": true, + "isSigner": false + }, + { + "name": "to", + "isMut": true, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "preTransfer", + "accounts": [ + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, + { + "name": "payer", + "isMut": true, + "isSigner": true + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "postTransfer", + "accounts": [ + { + "name": "accountBalances", + "isMut": true, + "isSigner": false + }, + { + "name": "collector", + "isMut": true, + "isSigner": false + }, + { + "name": "instructions", + "isMut": false, + "isSigner": false + } + ], + "args": [] + } + ], + "accounts": [ + { + "name": "mintManager", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "version", + "type": "u8" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "ruleset", + "type": "publicKey" + } + ] + } + }, + { + "name": "ruleset", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bump", + "type": "u8" + }, + { + "name": "version", + "type": "u8" + }, + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "disallowedAddresses", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "accountBalances", + "type": { + "kind": "struct", + "fields": [ + { + "name": "balances", + "type": { + "vec": { + "defined": "AccountBalance" + } + } + } + ] + } + } + ], + "types": [ + { + "name": "UpdateMintManagerIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "publicKey" + } + ] + } + }, + { + "name": "InitRulesetIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "collector", + "type": "publicKey" + }, + { + "name": "disallowedAddresses", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "UpdateRulesetIx", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "publicKey" + }, + { + "name": "collector", + "type": "publicKey" + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" + }, + { + "name": "disallowedAddresses", + "type": { + "vec": "publicKey" + } + }, + { + "name": "allowedPrograms", + "type": { + "vec": "publicKey" + } + } + ] + } + }, + { + "name": "AccountBalance", + "type": { + "kind": "struct", + "fields": [ + { + "name": "address", + "type": "publicKey" + }, + { + "name": "mint", + "type": "publicKey" + }, + { + "name": "size", + "type": "u64" + }, + { + "name": "balance", + "type": "u64" + } + ] + } + } + ], + "errors": [ + { + "code": 6000, + "name": "InvalidMint", + "msg": "Invalid mint" + }, + { + "code": 6001, + "name": "InvalidCollector", + "msg": "Invalid collector address" + }, + { + "code": 6002, + "name": "InvalidAuthority", + "msg": "Invalid authority address" + }, + { + "code": 6003, + "name": "InvalidMintManager", + "msg": "Invalid mint manager" + }, + { + "code": 6004, + "name": "InvlaidHolderTokenAccount", + "msg": "Invalid holder token account" + }, + { + "code": 6005, + "name": "InvalidTargetTokenAccount", + "msg": "Invalid target token account" + }, + { + "code": 6006, + "name": "InvalidCloseTokenAccount", + "msg": "Invalid token account to close" + }, + { + "code": 6007, + "name": "InvalidHolderTokenAccount", + "msg": "Invalid holder token account" + }, + { + "code": 6008, + "name": "InvalidRuleset", + "msg": "Invalid ruleset" + }, + { + "code": 6009, + "name": "InvalidPreTransferInstruction", + "msg": "Invalid pre transfer instruction" + }, + { + "code": 6010, + "name": "InvalidPostTransferInstruction", + "msg": "Invalid post transfer instruction" + }, + { + "code": 6011, + "name": "ProgramDisallowed", + "msg": "Disallowed program included in transfer" + }, + { + "code": 6012, + "name": "ProgramNotAllowed", + "msg": "Program not allowed in allowed programs to transfer" + }, + { + "code": 6013, + "name": "UnknownAccount", + "msg": "Unknown account found in instruction" + }, + { + "code": 6014, + "name": "AccountNotFound", + "msg": "Account not found in instruction" + } + ] +}; diff --git a/sdk/src/generated/instructions/updateMintManager.ts b/sdk/src/generated/instructions/updateMintManager.ts index f6e152e3..42e8e259 100644 --- a/sdk/src/generated/instructions/updateMintManager.ts +++ b/sdk/src/generated/instructions/updateMintManager.ts @@ -39,7 +39,7 @@ export const updateMintManagerStruct = new beet.BeetArgsStruct< /** * Accounts required by the _updateMintManager_ instruction * - * @property [] mintManager + * @property [_writable_] mintManager * @property [] ruleset * @property [_writable_] collector * @property [**signer**] authority @@ -83,7 +83,7 @@ export function createUpdateMintManagerInstruction( const keys: web3.AccountMeta[] = [ { pubkey: accounts.mintManager, - isWritable: false, + isWritable: true, isSigner: false, }, { diff --git a/sdk/src/utils.ts b/sdk/src/utils.ts deleted file mode 100644 index 5548d3a1..00000000 --- a/sdk/src/utils.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { - Connection, - Transaction, - sendAndConfirmRawTransaction, - SendTransactionError, - Signer, -} from "@solana/web3.js"; -import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; -import { PROGRAM_ADDRESS } from "./generated"; -import { utils, Wallet } from "@project-serum/anchor"; -import { parseProgramLogs } from "./errors/parseTransactionLogs"; -import { formatInstructionLogsForConsole } from "./errors/formatLogs"; - -export async function newAccountWithLamports( - connection: Connection, - lamports = LAMPORTS_PER_SOL, - keypair = Keypair.generate() -): Promise<Keypair> { - const account = keypair; - const signature = await connection.requestAirdrop( - account.publicKey, - lamports - ); - await connection.confirmTransaction(signature); - return account; -} - -export async function getConnection(): Promise<Connection> { - const url = "http://localhost:8899"; - const connection = new Connection(url, "confirmed"); - await connection.getVersion(); - return connection; -} - -export async function executeTransaction( - connection: Connection, - tx: Transaction, - wallet: Wallet, - signers?: Signer[] -): Promise<String> { - tx.recentBlockhash = await (await connection.getLatestBlockhash()).blockhash; - tx.feePayer = wallet.publicKey; - await wallet.signTransaction(tx); - if (signers) { - tx.partialSign(...signers); - } - try { - const txid = await sendAndConfirmRawTransaction(connection, tx.serialize()); - return txid; - } catch (e) { - handleError(e); - throw e; - } -} - -export type CardinalProvider = { - connection: Connection; - wallet: Wallet; - keypair: Keypair; -}; - -export async function getProvider(): Promise<CardinalProvider> { - const connection = await getConnection(); - const keypair = await newAccountWithLamports( - connection, - LAMPORTS_PER_SOL, - keypairFrom(process.env.TEST_KEY ?? "./tests/test-keypairs/test-key.json") - ); - const wallet = new Wallet(keypair); - return { - connection, - wallet, - keypair, - }; -} - -export const TEST_PROGRAM_ID = process.env.TEST_PROGRAM_ID - ? new PublicKey(process.env.TEST_PROGRAM_ID) - : PROGRAM_ADDRESS; - -export const keypairFrom = (s: string, n?: string): Keypair => { - try { - if (s.includes("[")) { - return Keypair.fromSecretKey( - Buffer.from( - s - .replace("[", "") - .replace("]", "") - .split(",") - .map((c) => parseInt(c)) - ) - ); - } else { - return Keypair.fromSecretKey(utils.bytes.bs58.decode(s)); - } - } catch (e) { - try { - return Keypair.fromSecretKey( - Buffer.from( - JSON.parse( - require("fs").readFileSync(s, { - encoding: "utf-8", - }) - ) - ) - ); - } catch (e) { - process.stdout.write(`${n ?? "keypair"} is not valid keypair`); - process.exit(1); - } - } -}; - -export const handleError = (e: any) => { - const message = (e as SendTransactionError).message ?? ""; - const logs = - (e as SendTransactionError).logs ?? [ - (e as SendTransactionError).message ?? "", - ] ?? [(e as Error).toString()] ?? - []; - if (logs) { - const parsed = parseProgramLogs(logs, message); - const fmt = formatInstructionLogsForConsole(parsed); - console.log(fmt); - } else { - console.log(e); - } -}; diff --git a/sdk/tests/mint.ts b/sdk/tests/mint.ts new file mode 100644 index 00000000..82d79068 --- /dev/null +++ b/sdk/tests/mint.ts @@ -0,0 +1,31 @@ +import { Connection, PublicKey, SystemProgram } from "@solana/web3.js"; +import { Transaction } from "@solana/web3.js"; +import { + createAssociatedTokenAccountInstruction, + createInitializeMint2Instruction, + createMintToInstruction, + getAssociatedTokenAddressSync, + getMinimumBalanceForRentExemptMint, + MINT_SIZE, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; + +export const createMintTx = async ( + connection: Connection, + mint: PublicKey, + authority: PublicKey +) => { + const ata = getAssociatedTokenAddressSync(mint, authority); + return new Transaction().add( + SystemProgram.createAccount({ + fromPubkey: authority, + newAccountPubkey: mint, + space: MINT_SIZE, + lamports: await getMinimumBalanceForRentExemptMint(connection), + programId: TOKEN_PROGRAM_ID, + }), + createInitializeMint2Instruction(mint, 0, authority, authority), + createAssociatedTokenAccountInstruction(authority, ata, authority, mint), + createMintToInstruction(mint, ata, authority, 1) + ); +}; diff --git a/sdk/tests/initRulesetInitMint.test.ts b/sdk/tests/mintInit.test.ts similarity index 95% rename from sdk/tests/initRulesetInitMint.test.ts rename to sdk/tests/mintInit.test.ts index b061efb3..a693550c 100644 --- a/sdk/tests/initRulesetInitMint.test.ts +++ b/sdk/tests/mintInit.test.ts @@ -1,9 +1,5 @@ import { test, expect } from "@jest/globals"; -import { - CardinalProvider, - executeTransaction, - getProvider, -} from "../src/utils"; +import { CardinalProvider, executeTransaction, getProvider } from "./utils"; import { Keypair, Transaction } from "@solana/web3.js"; import { @@ -83,7 +79,6 @@ test("Init", async () => { associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, }) ); - console.log("----------"); await executeTransaction(provider.connection, tx, provider.wallet, [ mintKeypair, ]); diff --git a/sdk/tests/initRulesetMintManager.test.ts b/sdk/tests/mintManagerInit.test.ts similarity index 95% rename from sdk/tests/initRulesetMintManager.test.ts rename to sdk/tests/mintManagerInit.test.ts index 50412b08..3bbcdf8c 100644 --- a/sdk/tests/initRulesetMintManager.test.ts +++ b/sdk/tests/mintManagerInit.test.ts @@ -1,9 +1,5 @@ import { test, beforeAll, expect } from "@jest/globals"; -import { - CardinalProvider, - executeTransaction, - getProvider, -} from "../src/utils"; +import { CardinalProvider, executeTransaction, getProvider } from "./utils"; import { PublicKey } from "@solana/web3.js"; import { Keypair, Transaction } from "@solana/web3.js"; @@ -15,7 +11,7 @@ import { findRulesetId, Ruleset, } from "../src"; -import { createMintTx } from "./utils"; +import { createMintTx } from "./mint"; let mint: PublicKey; const RULESET_NAME = `global-${Math.random()}`; diff --git a/sdk/tests/mintManagerInitUpdate.test.ts b/sdk/tests/mintManagerInitUpdate.test.ts new file mode 100644 index 00000000..239f3fb8 --- /dev/null +++ b/sdk/tests/mintManagerInitUpdate.test.ts @@ -0,0 +1,168 @@ +import { test, beforeAll, expect } from "@jest/globals"; +import { CardinalProvider, executeTransaction, getProvider } from "./utils"; +import { PublicKey } from "@solana/web3.js"; +import { Keypair, Transaction } from "@solana/web3.js"; + +import { + findMintManagerId, + createInitMintManagerInstruction, + MintManager, + createInitRulesetInstruction, + findRulesetId, + Ruleset, + createUpdateMintManagerInstruction, +} from "../src"; +import { createMintTx } from "./mint"; +let mint: PublicKey; + +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_NAME2 = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; + +beforeAll(async () => { + provider = await getProvider(); + const mintKeypair = Keypair.generate(); + mint = mintKeypair.publicKey; + executeTransaction( + provider.connection, + await createMintTx(provider.connection, mint, provider.wallet.publicKey), + provider.wallet, + [mintKeypair] + ); +}); + +test("Create ruleset", async () => { + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: true, + disallowedAddresses: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(true); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Create 2nd ruleset", async () => { + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: findRulesetId(RULESET_NAME2), + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME2, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: false, + disallowedAddresses: [provider.wallet.publicKey], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + findRulesetId(RULESET_NAME2) + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(false); + expect(ruleset.disallowedAddresses.length).toBe(1); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Init mint manager", async () => { + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + + tx.add( + createInitMintManagerInstruction({ + mint: mint, + mintManager: mintManagerId, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: ruleset.collector, + ruleset: RULESET_ID, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME).toString() + ); +}); + +test("Update mint manager", async () => { + const newAuthority = Keypair.generate(); + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + + tx.add( + createUpdateMintManagerInstruction( + { + mintManager: mintManagerId, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: ruleset.collector, + ruleset: findRulesetId(RULESET_NAME2), + }, + { ix: { authority: newAuthority.publicKey } } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + newAuthority.publicKey.toString() + ); + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME2).toString() + ); +}); diff --git a/sdk/tests/initRulesetUpdateRuleset.test.ts b/sdk/tests/rulesetInitUpdate.test.ts similarity index 78% rename from sdk/tests/initRulesetUpdateRuleset.test.ts rename to sdk/tests/rulesetInitUpdate.test.ts index debf262a..db988f9d 100644 --- a/sdk/tests/initRulesetUpdateRuleset.test.ts +++ b/sdk/tests/rulesetInitUpdate.test.ts @@ -1,10 +1,5 @@ import { test, beforeAll, expect } from "@jest/globals"; -import { - CardinalProvider, - executeTransaction, - getProvider, -} from "../src/utils"; -import { PublicKey } from "@solana/web3.js"; +import { CardinalProvider, executeTransaction, getProvider } from "./utils"; import { Keypair, Transaction } from "@solana/web3.js"; import { @@ -13,8 +8,6 @@ import { Ruleset, createUpdateRulesetInstruction, } from "../src"; -import { createMintTx } from "./utils"; -let mint: PublicKey; const RULESET_NAME = `global-${Math.random()}`; const RULESET_ID = findRulesetId(RULESET_NAME); @@ -22,14 +15,6 @@ let provider: CardinalProvider; beforeAll(async () => { provider = await getProvider(); - const mintKeypair = Keypair.generate(); - mint = mintKeypair.publicKey; - executeTransaction( - provider.connection, - await createMintTx(provider.connection, mint, provider.wallet.publicKey), - provider.wallet, - [mintKeypair] - ); }); test("Create ruleset", async () => { @@ -67,6 +52,7 @@ test("Create ruleset", async () => { test("Update ruleset", async () => { const tx = new Transaction(); + const newAuthority = Keypair.generate(); tx.add( createUpdateRulesetInstruction( { @@ -75,7 +61,7 @@ test("Update ruleset", async () => { }, { ix: { - authority: provider.wallet.publicKey, + authority: newAuthority.publicKey, collector: provider.wallet.publicKey, checkSellerFeeBasisPoints: true, disallowedAddresses: [provider.wallet.publicKey], @@ -89,9 +75,7 @@ test("Update ruleset", async () => { provider.connection, RULESET_ID ); - expect(ruleset.authority.toString()).toBe( - provider.wallet.publicKey.toString() - ); + expect(ruleset.authority.toString()).toBe(newAuthority.publicKey.toString()); expect(ruleset.checkSellerFeeBasisPoints).toBe(true); expect(ruleset.disallowedAddresses.length).toBe(1); expect(ruleset.allowedPrograms.length).toBe(0); diff --git a/sdk/tests/utils.ts b/sdk/tests/utils.ts index 82d79068..ccce61a9 100644 --- a/sdk/tests/utils.ts +++ b/sdk/tests/utils.ts @@ -1,31 +1,126 @@ -import { Connection, PublicKey, SystemProgram } from "@solana/web3.js"; -import { Transaction } from "@solana/web3.js"; import { - createAssociatedTokenAccountInstruction, - createInitializeMint2Instruction, - createMintToInstruction, - getAssociatedTokenAddressSync, - getMinimumBalanceForRentExemptMint, - MINT_SIZE, - TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; - -export const createMintTx = async ( + Connection, + Transaction, + sendAndConfirmRawTransaction, + SendTransactionError, + Signer, +} from "@solana/web3.js"; +import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; +import { PROGRAM_ADDRESS } from "../src/generated"; +import { utils, Wallet } from "@project-serum/anchor"; +import { parseProgramLogs } from "../src/errors/parseTransactionLogs"; +import { formatInstructionLogsForConsole } from "../src/errors/formatLogs"; + +export async function newAccountWithLamports( + connection: Connection, + lamports = LAMPORTS_PER_SOL, + keypair = Keypair.generate() +): Promise<Keypair> { + const account = keypair; + const signature = await connection.requestAirdrop( + account.publicKey, + lamports + ); + await connection.confirmTransaction(signature); + return account; +} + +export function getConnection(): Connection { + const url = "http://localhost:8899"; + return new Connection(url, "confirmed"); +} + +export async function executeTransaction( connection: Connection, - mint: PublicKey, - authority: PublicKey -) => { - const ata = getAssociatedTokenAddressSync(mint, authority); - return new Transaction().add( - SystemProgram.createAccount({ - fromPubkey: authority, - newAccountPubkey: mint, - space: MINT_SIZE, - lamports: await getMinimumBalanceForRentExemptMint(connection), - programId: TOKEN_PROGRAM_ID, - }), - createInitializeMint2Instruction(mint, 0, authority, authority), - createAssociatedTokenAccountInstruction(authority, ata, authority, mint), - createMintToInstruction(mint, ata, authority, 1) + tx: Transaction, + wallet: Wallet, + signers?: Signer[] +): Promise<String> { + tx.recentBlockhash = await (await connection.getLatestBlockhash()).blockhash; + tx.feePayer = wallet.publicKey; + await wallet.signTransaction(tx); + if (signers) { + tx.partialSign(...signers); + } + try { + const txid = await sendAndConfirmRawTransaction(connection, tx.serialize()); + return txid; + } catch (e) { + handleError(e); + throw e; + } +} + +export type CardinalProvider = { + connection: Connection; + wallet: Wallet; + keypair: Keypair; +}; + +export async function getProvider(): Promise<CardinalProvider> { + const connection = getConnection(); + const keypair = await newAccountWithLamports( + connection, + LAMPORTS_PER_SOL, + keypairFrom(process.env.TEST_KEY ?? "./tests/test-keypairs/test-key.json") ); + const wallet = new Wallet(keypair); + return { + connection, + wallet, + keypair, + }; +} + +export const TEST_PROGRAM_ID = process.env.TEST_PROGRAM_ID + ? new PublicKey(process.env.TEST_PROGRAM_ID) + : PROGRAM_ADDRESS; + +export const keypairFrom = (s: string, n?: string): Keypair => { + try { + if (s.includes("[")) { + return Keypair.fromSecretKey( + Buffer.from( + s + .replace("[", "") + .replace("]", "") + .split(",") + .map((c) => parseInt(c)) + ) + ); + } else { + return Keypair.fromSecretKey(utils.bytes.bs58.decode(s)); + } + } catch (e) { + try { + return Keypair.fromSecretKey( + Buffer.from( + JSON.parse( + require("fs").readFileSync(s, { + encoding: "utf-8", + }) + ) + ) + ); + } catch (e) { + process.stdout.write(`${n ?? "keypair"} is not valid keypair`); + process.exit(1); + } + } +}; + +export const handleError = (e: any) => { + const message = (e as SendTransactionError).message ?? ""; + const logs = + (e as SendTransactionError).logs ?? [ + (e as SendTransactionError).message ?? "", + ] ?? [(e as Error).toString()] ?? + []; + if (logs) { + const parsed = parseProgramLogs(logs, message); + const fmt = formatInstructionLogsForConsole(parsed); + console.log(fmt); + } else { + console.log(e); + } }; diff --git a/sdk/tsconfig.cjs.json b/sdk/tsconfig.cjs.json new file mode 100644 index 00000000..dfc56c96 --- /dev/null +++ b/sdk/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.esm.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs/" + }, + "include": ["sdk/"] +} diff --git a/sdk/tsconfig.esm.json b/sdk/tsconfig.esm.json new file mode 100644 index 00000000..9debc5d0 --- /dev/null +++ b/sdk/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "ESNext", + "types": [], + "noEmit": false, + "outDir": "dist/esm/" + }, + "include": ["sdk/"] +} diff --git a/sdk/tsconfig.json b/sdk/tsconfig.json index f0559db0..122ffacf 100644 --- a/sdk/tsconfig.json +++ b/sdk/tsconfig.json @@ -9,7 +9,7 @@ "lib": ["ES2019"], // build - "types": [], + // "types": [], "esModuleInterop": true, "preserveConstEnums": true, "skipLibCheck": true, @@ -21,7 +21,7 @@ // linting "strict": true, - "noUnusedLocals": true, + "noUnusedLocals": false, "noUnusedParameters": true, "noUncheckedIndexedAccess": true, "noFallthroughCasesInSwitch": true, @@ -35,5 +35,5 @@ "declarationMap": true, "inlineSources": true }, - "include": ["src/", "tests/"] + "include": ["sdk/", "tests/"] } From f400490d341f1a748833df42637a84bbd186f132 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Mon, 24 Oct 2022 13:07:06 -0400 Subject: [PATCH 24/37] Refactor directories and tests --- sdk/.eslintrc.json => .eslintrc.json | 0 .github/actions/install-anchor/action.yml | 31 + .../install-linux-build-deps/action.yml | 30 + .github/actions/install-rust/action.yml | 37 + .github/actions/install-solana/action.yml | 45 + .github/actions/install-soteria/action.yml | 28 + .github/dependabot.yml | 14 + .github/workflows/deps.yml | 43 + .github/workflows/publish-docs.yml | 40 + .github/workflows/publish-js.yml | 61 + .github/workflows/release.yml | 118 + .github/workflows/test.yml | 144 + .gitignore | 56 +- sdk/.solitarc.js => .solitarc.js | 6 +- Anchor.toml | 8 - Cargo.toml | 13 +- Makefile | 8 +- generate-idls.sh | 15 + sdk/jest.config.js => jest.config.js | 0 sdk/package.json => package.json | 0 .../cardinal-creator-standard}/Cargo.lock | 0 .../cardinal-creator-standard}/Cargo.toml | 0 .../cardinal-creator-standard}/rustfmt.toml | 0 .../cardinal-creator-standard}/src/errors.rs | 0 .../mint_manager/init_mint_manager.rs | 0 .../src/instructions/mint_manager/mod.rs | 0 .../mint_manager/update_mint_manager.rs | 0 .../src/instructions/mod.rs | 0 .../src/instructions/ruleset/init_ruleset.rs | 0 .../src/instructions/ruleset/mod.rs | 0 .../instructions/ruleset/update_ruleset.rs | 0 .../src/instructions/token/approve.rs | 0 .../src/instructions/token/burn.rs | 0 .../src/instructions/token/close.rs | 0 .../src/instructions/token/init_account.rs | 0 .../src/instructions/token/init_mint.rs | 0 .../src/instructions/token/mod.rs | 0 .../src/instructions/token/post_transfer.rs | 0 .../src/instructions/token/pre_transfer.rs | 0 .../src/instructions/token/revoke.rs | 0 .../src/instructions/token/transfer.rs | 0 .../cardinal-creator-standard}/src/lib.rs | 0 .../cardinal-creator-standard}/src/state.rs | 0 sdk/{idl => }/cardinal_creator_standard.json | 0 sdk/{src => }/errors/formatLogs.ts | 0 sdk/{src => }/errors/parseTransactionLogs.ts | 0 sdk/{src => }/errors/programErrors.ts | 0 sdk/generate-idls.sh | 15 - .../generated/accounts/AccountBalances.ts | 0 .../generated/accounts/MintManager.ts | 0 sdk/{src => }/generated/accounts/Ruleset.ts | 0 sdk/{src => }/generated/accounts/index.ts | 0 sdk/{src => }/generated/errors/index.ts | 0 sdk/{src => }/generated/index.ts | 0 .../generated/instructions/approve.ts | 0 sdk/{src => }/generated/instructions/burn.ts | 0 sdk/{src => }/generated/instructions/close.ts | 0 sdk/{src => }/generated/instructions/index.ts | 0 .../generated/instructions/initAccount.ts | 0 .../generated/instructions/initMint.ts | 0 .../generated/instructions/initMintManager.ts | 0 .../generated/instructions/initRuleset.ts | 0 .../generated/instructions/postTransfer.ts | 0 .../generated/instructions/preTransfer.ts | 0 .../generated/instructions/revoke.ts | 0 .../generated/instructions/transfer.ts | 0 .../instructions/updateMintManager.ts | 0 .../generated/instructions/updateRuleset.ts | 0 .../generated/types/AccountBalance.ts | 0 .../generated/types/InitRulesetIx.ts | 0 .../generated/types/UpdateMintManagerIx.ts | 0 .../generated/types/UpdateRulesetIx.ts | 0 sdk/{src => }/generated/types/index.ts | 0 .../src => }/idl/cardinal_creator_standard.ts | 0 sdk/{src => }/index.ts | 0 sdk/{src => }/pda.ts | 0 sdk/src/idl/cardinal_creator_standard.ts | 1549 ---------- sdk/yarn-error.log | 2643 ----------------- {sdk/tests => tests}/mint.ts | 0 {sdk/tests => tests}/mintInit.test.ts | 2 +- {sdk/tests => tests}/mintManagerInit.test.ts | 2 +- .../mintManagerInitUpdate.test.ts | 2 +- .../tests => tests}/rulesetInitUpdate.test.ts | 2 +- .../cardinal_creator_standard-keypair.json | 0 ...wJZT3pxFQHfY65jp6QbvcTvda6oPSbaeKbYEs.json | 0 .../test-keypairs/test-key.json | 0 {sdk/tests => tests}/utils.ts | 6 +- sdk/tsconfig.cjs.json => tsconfig.cjs.json | 0 sdk/tsconfig.esm.json => tsconfig.esm.json | 0 sdk/tsconfig.json => tsconfig.json | 0 sdk/yarn.lock => yarn.lock | 0 91 files changed, 681 insertions(+), 4237 deletions(-) rename sdk/.eslintrc.json => .eslintrc.json (100%) create mode 100644 .github/actions/install-anchor/action.yml create mode 100644 .github/actions/install-linux-build-deps/action.yml create mode 100644 .github/actions/install-rust/action.yml create mode 100644 .github/actions/install-solana/action.yml create mode 100644 .github/actions/install-soteria/action.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/deps.yml create mode 100644 .github/workflows/publish-docs.yml create mode 100644 .github/workflows/publish-js.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml rename sdk/.solitarc.js => .solitarc.js (63%) create mode 100755 generate-idls.sh rename sdk/jest.config.js => jest.config.js (100%) rename sdk/package.json => package.json (100%) rename {program => programs/cardinal-creator-standard}/Cargo.lock (100%) rename {program => programs/cardinal-creator-standard}/Cargo.toml (100%) rename {program => programs/cardinal-creator-standard}/rustfmt.toml (100%) rename {program => programs/cardinal-creator-standard}/src/errors.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/mint_manager/init_mint_manager.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/mint_manager/mod.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/mint_manager/update_mint_manager.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/mod.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/ruleset/init_ruleset.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/ruleset/mod.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/ruleset/update_ruleset.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/approve.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/burn.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/close.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/init_account.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/init_mint.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/mod.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/post_transfer.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/pre_transfer.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/revoke.rs (100%) rename {program => programs/cardinal-creator-standard}/src/instructions/token/transfer.rs (100%) rename {program => programs/cardinal-creator-standard}/src/lib.rs (100%) rename {program => programs/cardinal-creator-standard}/src/state.rs (100%) rename sdk/{idl => }/cardinal_creator_standard.json (100%) rename sdk/{src => }/errors/formatLogs.ts (100%) rename sdk/{src => }/errors/parseTransactionLogs.ts (100%) rename sdk/{src => }/errors/programErrors.ts (100%) delete mode 100755 sdk/generate-idls.sh rename sdk/{src => }/generated/accounts/AccountBalances.ts (100%) rename sdk/{src => }/generated/accounts/MintManager.ts (100%) rename sdk/{src => }/generated/accounts/Ruleset.ts (100%) rename sdk/{src => }/generated/accounts/index.ts (100%) rename sdk/{src => }/generated/errors/index.ts (100%) rename sdk/{src => }/generated/index.ts (100%) rename sdk/{src => }/generated/instructions/approve.ts (100%) rename sdk/{src => }/generated/instructions/burn.ts (100%) rename sdk/{src => }/generated/instructions/close.ts (100%) rename sdk/{src => }/generated/instructions/index.ts (100%) rename sdk/{src => }/generated/instructions/initAccount.ts (100%) rename sdk/{src => }/generated/instructions/initMint.ts (100%) rename sdk/{src => }/generated/instructions/initMintManager.ts (100%) rename sdk/{src => }/generated/instructions/initRuleset.ts (100%) rename sdk/{src => }/generated/instructions/postTransfer.ts (100%) rename sdk/{src => }/generated/instructions/preTransfer.ts (100%) rename sdk/{src => }/generated/instructions/revoke.ts (100%) rename sdk/{src => }/generated/instructions/transfer.ts (100%) rename sdk/{src => }/generated/instructions/updateMintManager.ts (100%) rename sdk/{src => }/generated/instructions/updateRuleset.ts (100%) rename sdk/{src => }/generated/types/AccountBalance.ts (100%) rename sdk/{src => }/generated/types/InitRulesetIx.ts (100%) rename sdk/{src => }/generated/types/UpdateMintManagerIx.ts (100%) rename sdk/{src => }/generated/types/UpdateRulesetIx.ts (100%) rename sdk/{src => }/generated/types/index.ts (100%) rename sdk/{sdk/src => }/idl/cardinal_creator_standard.ts (100%) rename sdk/{src => }/index.ts (100%) rename sdk/{src => }/pda.ts (100%) delete mode 100644 sdk/src/idl/cardinal_creator_standard.ts delete mode 100644 sdk/yarn-error.log rename {sdk/tests => tests}/mint.ts (100%) rename {sdk/tests => tests}/mintInit.test.ts (99%) rename {sdk/tests => tests}/mintManagerInit.test.ts (99%) rename {sdk/tests => tests}/mintManagerInitUpdate.test.ts (99%) rename {sdk/tests => tests}/rulesetInitUpdate.test.ts (99%) rename {sdk/tests => tests}/test-keypairs/cardinal_creator_standard-keypair.json (100%) rename {sdk/tests => tests}/test-keypairs/t1LVbNwJZT3pxFQHfY65jp6QbvcTvda6oPSbaeKbYEs.json (100%) rename {sdk/tests => tests}/test-keypairs/test-key.json (100%) rename {sdk/tests => tests}/utils.ts (94%) rename sdk/tsconfig.cjs.json => tsconfig.cjs.json (100%) rename sdk/tsconfig.esm.json => tsconfig.esm.json (100%) rename sdk/tsconfig.json => tsconfig.json (100%) rename sdk/yarn.lock => yarn.lock (100%) diff --git a/sdk/.eslintrc.json b/.eslintrc.json similarity index 100% rename from sdk/.eslintrc.json rename to .eslintrc.json diff --git a/.github/actions/install-anchor/action.yml b/.github/actions/install-anchor/action.yml new file mode 100644 index 00000000..8a2735e7 --- /dev/null +++ b/.github/actions/install-anchor/action.yml @@ -0,0 +1,31 @@ +name: Setup Anchor cli + +inputs: + anchor_git: + description: Link to Anchor cli GH repository + required: true + anchor_version: + description: Version of Anchor cli + required: true + +runs: + using: "composite" + steps: + - uses: actions/cache@v2 + name: Cache Cargo registry + index + id: cache-anchor + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: cargo-${{ runner.os }}-anchor-${{ hashFiles('**/Cargo.lock') }} + - name: Install anchor + if: steps.cache-anchor.outputs.cache-hit != 'true' + run: cargo install --git ${{inputs.anchor_git}} --tag v${{inputs.anchor_version}} anchor-cli --locked --force + shell: bash + - uses: actions/upload-artifact@v2 + with: + name: anchor-binary + path: ~/.cargo/bin/anchor diff --git a/.github/actions/install-linux-build-deps/action.yml b/.github/actions/install-linux-build-deps/action.yml new file mode 100644 index 00000000..18723ee8 --- /dev/null +++ b/.github/actions/install-linux-build-deps/action.yml @@ -0,0 +1,30 @@ +name: Install Linux Build Deps +runs: + using: "composite" + steps: + - name: apt-get add llvm-snapshot key and update + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main" + sudo apt-get update + shell: bash + + - name: apt-get install clang + run: | + sudo apt-get install -y clang-7 --allow-unauthenticated + clang-7 --version + shell: bash + + - name: apt-get install ssl libs + run: | + sudo apt-get install -y openssl --allow-unauthenticated + sudo apt-get install -y libssl-dev --allow-unauthenticated + sudo apt-get install -y libssl1.1 --allow-unauthenticated + shell: bash + + - name: apt-get install dev tools + run: | + sudo apt-get install -y libudev-dev + sudo apt-get install -y binutils-dev + sudo apt-get install -y libunwind-dev + shell: bash diff --git a/.github/actions/install-rust/action.yml b/.github/actions/install-rust/action.yml new file mode 100644 index 00000000..ddde4cdd --- /dev/null +++ b/.github/actions/install-rust/action.yml @@ -0,0 +1,37 @@ +name: Install Rust + +inputs: + toolchain: + description: The Rust version to use, default env.RUST_TOOLCHAIN + required: true + +runs: + using: "composite" + steps: + - name: Install Rust Stable + id: rust_toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ inputs.toolchain }} + override: true + profile: minimal + components: rustfmt, clippy + + - name: Add Cargo bin to Path + run: | + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + shell: bash + + - name: Verify Rust install + run: | + echo "Verifying rust '${{ inputs.toolchain }}' ..." + rustc --version + cargo --version + cargo clippy --version + rustfmt --version + shell: bash + + - name: Share rustc hash + run: | + echo 'RUSTC_HASH=${{ steps.rust_toolchain.outputs.rustc_hash }}' >> $GITHUB_ENV + shell: bash diff --git a/.github/actions/install-solana/action.yml b/.github/actions/install-solana/action.yml new file mode 100644 index 00000000..babc6cf2 --- /dev/null +++ b/.github/actions/install-solana/action.yml @@ -0,0 +1,45 @@ +name: Install Solana + +inputs: + solana_version: + description: Version of Solana to install + required: true + +runs: + using: "composite" + steps: + - name: Cache Solana Install + id: cache-solana-install + uses: actions/cache@v2 + with: + path: "$HOME/.local/share/solana/install/releases/${{ inputs.solana_version }}" + key: ${{ runner.os }}-Solana-v${{ inputs.solana_version }} + + - name: Install Solana + # if: steps.cache-solana-install.outputs.cache-hit != 'true' + run: | + sh -c "$(curl -sSfL https://release.solana.com/v${{ inputs.solana_version }}/install)" + shell: bash + + - name: Set Active Solana Version + run: | + rm -f "$HOME/.local/share/solana/install/active_release" + ln -s "$HOME/.local/share/solana/install/releases/${{ inputs.solana_version }}/solana-release" "$HOME/.local/share/solana/install/active_release" + shell: bash + + - name: Add Solana bin to Path + run: | + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + export PATH="/home/runner/.local/share/solana/install/active_release/bin:$PATH" + shell: bash + + - name: Verify Solana install + run: | + solana --version + shell: bash + + - name: Install toolchain + run: | + echo Installing bpf toolchain... + (cd /home/runner/.local/share/solana/install/active_release/bin/sdk/bpf/scripts; ./install.sh) + shell: bash diff --git a/.github/actions/install-soteria/action.yml b/.github/actions/install-soteria/action.yml new file mode 100644 index 00000000..ab50133d --- /dev/null +++ b/.github/actions/install-soteria/action.yml @@ -0,0 +1,28 @@ +name: Install soteria + +inputs: + soteria-version: + description: Version of Solana to install + required: true + +runs: + using: "composite" + steps: + - name: Cache Soteria Install + id: cache-soteria-install + uses: actions/cache@v2 + with: + path: "PATH=$PWD/soteria-linux-develop/bin/soteria" + key: ${{ runner.os }}-soteria-v${{ inputs.soteria-version }} + - name: Install soteria + if: steps.cache-soteria.outputs.cache-hit != 'true' + run: | + echo Installing Soteria... + sh -c "$(curl -k https://supercompiler.xyz/install)" + export PATH=$PWD/soteria-linux-develop/bin/:$PATH + echo "$PWD/soteria-linux-develop/bin" >> $GITHUB_PATH + shell: bash + # - uses: actions/upload-artifact@v2 + # with: + # name: soteria-binary + # path: $PWD/soteria-linux-develop/bin/soteria diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..6fb613e4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "daily" diff --git a/.github/workflows/deps.yml b/.github/workflows/deps.yml new file mode 100644 index 00000000..13729ddc --- /dev/null +++ b/.github/workflows/deps.yml @@ -0,0 +1,43 @@ +name: Deps + +on: + workflow_dispatch: {} + +env: + CARGO_TERM_COLOR: always + SOLANA_VERSION: 1.10.30 + RUST_TOOLCHAIN: nightly + NPM_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + ANCHOR_GIT: https://github.com/project-serum/anchor + ANCHOR_VERSION: 0.24.2 + +jobs: + test: + runs-on: ubuntu-latest + name: Build deps and cache + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/install-linux-build-deps + - name: Install Rust nightly + uses: actions-rs/toolchain@v1 + with: + override: true + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - uses: ./.github/actions/install-solana + with: + solana_version: ${{ env.SOLANA_VERSION }} + - uses: ./.github/actions/install-anchor + with: + anchor_git: ${{ env.ANCHOR_GIT }} + anchor_version: ${{ env.ANCHOR_VERSION }} + + - uses: actions/cache@v2 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + ./rust/target + key: ${{ env.cache_id }}-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ env.RUSTC_HASH }} diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 00000000..07e3a46c --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,40 @@ +name: Publish docs + +on: + workflow_dispatch: {} + push: + branches: [main] + +env: + CARGO_TERM_COLOR: always + RUST_TOOLCHAIN: nightly + NPM_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + +jobs: + site: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn config get cacheFolder)" + - name: Yarn Cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-modules- + + - name: Install Yarn dependencies + run: yarn install + - run: yarn docs:generate + - run: cp -R images/ site/ + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4.2.5 + with: + branch: gh-pages + folder: site diff --git a/.github/workflows/publish-js.yml b/.github/workflows/publish-js.yml new file mode 100644 index 00000000..8ff3e5b0 --- /dev/null +++ b/.github/workflows/publish-js.yml @@ -0,0 +1,61 @@ +name: Publish JS + +on: + workflow_dispatch: {} + push: + tags: + - "js-v*.*.*" + +env: + CARGO_TERM_COLOR: always + RUST_TOOLCHAIN: nightly + NPM_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + +jobs: + release-sdk: + runs-on: ubuntu-latest + name: Release SDK on NPM + steps: + - uses: actions/checkout@v3 + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn config get cacheFolder)" + - name: Yarn Cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-modules- + - uses: actions/setup-node@v3 + env: + FORCE_COLOR: 0 + with: + node-version: ${{ env.NODE_VERSION }} + cache: "yarn" + cache-dependency-path: ./yarn.lock + + - name: Install Yarn dependencies + run: yarn install + - run: yarn build + - run: | + echo 'npmAuthToken: "${NPM_AUTH_TOKEN}"' >> .yarnrc.yml + - name: Publish + run: yarn publish + site: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Yarn dependencies + run: yarn install + - run: yarn docs:generate + - run: cp -R images/ site/ + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4.2.5 + with: + branch: gh-pages + folder: site diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..7bd51295 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,118 @@ +name: Release + +on: + workflow_dispatch: {} + push: + tags: + - "v*.*.*" + +env: + CARGO_TERM_COLOR: always + RUST_TOOLCHAIN: nightly + NPM_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + SOLANA_VERSION: 1.10.30 + ANCHOR_GIT: https://github.com/project-serum/anchor + ANCHOR_VERSION: 0.24.2 + +jobs: + release-sdk: + runs-on: ubuntu-latest + name: Release SDK on NPM + steps: + - uses: actions/checkout@v3 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn config get cacheFolder)" + - name: Yarn Cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-modules- + - uses: actions/setup-node@v3 + env: + FORCE_COLOR: 0 + with: + node-version: ${{ env.NODE_VERSION }} + cache: "yarn" + cache-dependency-path: ./yarn.lock + + - name: Install Yarn dependencies + run: yarn install + - run: yarn build + - run: | + echo 'npmAuthToken: "${NPM_AUTH_TOKEN}"' >> .yarnrc.yml + - name: Publish + run: yarn publish + + release-crate: + runs-on: ubuntu-latest + name: Release crate on crates.io + steps: + - uses: actions/checkout@v3 + - name: Install Rust nightly + uses: actions-rs/toolchain@v1 + with: + override: true + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - run: cargo install cargo-workspaces + - uses: Swatinem/rust-cache@v1 + - name: Publish crates + run: cargo workspaces publish --from-git --yes --skip-published --token ${{ secrets.CARGO_PUBLISH_TOKEN }} + + release-binaries: + runs-on: ubuntu-latest + name: Release verifiable binaries + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/install-linux-build-deps + - uses: actions-rs/toolchain@v1 + with: + override: true + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - uses: ./.github/actions/install-solana + with: + solana_version: ${{ env.SOLANA_VERSION }} + - uses: ./.github/actions/install-anchor + with: + anchor_git: ${{ env.ANCHOR_GIT }} + anchor_version: ${{ env.ANCHOR_VERSION }} + - name: Build programs + run: anchor build --verifiable + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: | + target/deploy/* + target/idl/* + target/verifiable/* + + site: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn config get cacheFolder)" + - name: Yarn Cache + uses: actions/cache@v3 + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-modules- + + - name: Install Yarn dependencies + run: yarn install + - run: yarn docs:generate + - run: cp -R images/ site/ + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4.3.0 + with: + branch: gh-pages + folder: site diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..507de200 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,144 @@ +name: Test + +on: + workflow_dispatch: {} + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + checks: write + contents: read + issues: read + pull-requests: write + +env: + CARGO_TERM_COLOR: always + SOLANA_VERSION: 1.10.30 + RUST_TOOLCHAIN: nightly + SOTERIA_VERSION: 0.0.0 + ANCHOR_GIT: https://github.com/project-serum/anchor + ANCHOR_VERSION: 0.24.2 + +jobs: + rust-clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + override: true + components: rustfmt, clippy + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + toolchain: ${{ env.RUST_TOOLCHAIN }} + args: --all-features + + rust-fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + override: true + components: rustfmt, clippy + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - name: Run fmt + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all --manifest-path ./Cargo.toml -- --check + + soteria-scan: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + override: true + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - uses: ./.github/actions/install-solana + with: + solana_version: ${{ env.SOLANA_VERSION }} + - uses: ./.github/actions/install-soteria + with: + soteria_version: ${{ env.SOTERIA_VERSION }} + - name: Soteria scan programs + working-directory: ./programs + run: >- + for PROGRAM in ./*; do + if [ -d "$PROGRAM" ]; then + cd "$PROGRAM" + echo "Soteria scan for $PROGRAM" + soteria -analyzeAll . + cd .. + fi + done + shell: bash + + integration-tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/install-linux-build-deps + - uses: actions-rs/toolchain@v1 + with: + override: true + profile: minimal + toolchain: ${{ env.RUST_TOOLCHAIN }} + - uses: ./.github/actions/install-solana + with: + solana_version: ${{ env.SOLANA_VERSION }} + - uses: ./.github/actions/install-anchor + with: + anchor_git: ${{ env.ANCHOR_GIT }} + anchor_version: ${{ env.ANCHOR_VERSION }} + + - uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + ./rust/target + key: ${{ env.cache_id }}-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ env.RUSTC_HASH }} + + - name: Install Yarn dependencies + run: yarn install + + - name: Setup + run: mkdir -p target/deploy + - name: build + run: anchor buld + + - name: Run local validator + run: solana-test-validator --url https://api.devnet.solana.com --clone metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s --clone PwDiXFxQsGra4sFFTT8r1QWRMd4vfumiWC1jfWNfdYT --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./target/deploy/cardinal_creator_standard.so --reset & echo $$! > validator.PID + - run: sleep 6 + - run: solana airdrop 1000 $(solana-keygen pubkey tests/test-key.json) --url http://localhost:8899 + - run: yarn test + + # - uses: dorny/test-reporter@v1 + # if: always() + # with: + # artifact: test-results + # name: Local Tests + # path: tests/*.json + # reporter: mocha-json + - name: upload-integration-tests + if: always() + uses: actions/upload-artifact@v3 + with: + name: Unit Test Results + path: tests/out.xml + - name: publish-integration-tests + uses: EnricoMi/publish-unit-test-result-action/composite@v1 + if: always() + with: + files: tests/out.xml diff --git a/.gitignore b/.gitignore index 7b5346a3..cd34091d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,53 @@ -program/target -sdk/node_modules +# Ignore Mac OS noise +.DS_Store + +# VSCode history +.history + +# Ignore makefile output validator.PID -test-ledger +tests/out.xml + +# Ignore the build directory for Rust/Anchor +target +# Anchor verified builds directory +docker-target + +# Ignore backup files creates by cargo fmt. +**/*.rs.bk + +# Ignore logs +.anchor yarn-error.log -sdk/.env -target \ No newline at end of file +lerna-debug.log + +# Ignore node modules +node_modules +.eslintcache + +# Ignore submodule dependencies +deps + +# VM +.vagrant/ +test-ledger/ + +# Generated IDL types +artifacts/ +dist/ +src/idls/ +keypairs + +site/ + +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +.env +.env.local + diff --git a/sdk/.solitarc.js b/.solitarc.js similarity index 63% rename from sdk/.solitarc.js rename to .solitarc.js index 2962eb0b..fa86ee0d 100644 --- a/sdk/.solitarc.js +++ b/.solitarc.js @@ -1,7 +1,7 @@ const path = require("path"); -const programDir = path.join(__dirname, "..", "program"); -const idlDir = path.join(__dirname, "idl"); -const sdkDir = path.join(__dirname, "src", "generated"); +const programDir = path.join(__dirname, "programs/cardinal-creator-standard"); +const idlDir = path.join(__dirname, "sdk"); +const sdkDir = path.join(__dirname, "sdk", "generated"); const binaryInstallDir = path.join(__dirname, "..", "..", "target", "solita"); module.exports = { diff --git a/Anchor.toml b/Anchor.toml index 72fa17b5..4cccc0bd 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -1,14 +1,6 @@ -[features] -seeds = false - [registry] url = "https://anchor.projectserum.com" [provider] cluster = "localnet" wallet = "./tests/test-key.json" - -[workspace] -members = [ - "program", -] \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index dd57c84e..ad6f6649 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,11 @@ [workspace] -members = [ - "program", -] \ No newline at end of file +members = ["programs/*"] + +[profile.release] +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 \ No newline at end of file diff --git a/Makefile b/Makefile index 2e0082c0..3c5fd8c9 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ .PHONY: build -TEST_KEY := $(shell solana-keygen pubkey ./sdk/tests/test-keypairs/test-key.json) +TEST_KEY := $(shell solana-keygen pubkey ./tests/test-keypairs/test-key.json) all: build start test stop build: - cd program && anchor build - cd sdk && yarn idl:generate && yarn solita + anchor build + yarn idl:generate && yarn solita start: pkill solana-test-validator || true @@ -18,7 +18,7 @@ start: solana airdrop 1000 $(TEST_KEY) --url http://localhost:8899 test: - cd sdk && yarn test + yarn test stop: pkill solana-test-validator \ No newline at end of file diff --git a/generate-idls.sh b/generate-idls.sh new file mode 100755 index 00000000..da46793c --- /dev/null +++ b/generate-idls.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# This script generates the IDL JSONs without buildling the full packages. + +rm -rf sdk/idl/ +mkdir -p sdk/idl/ + +for PROGRAM in $(find programs/ -maxdepth 3 -name lib.rs); do + PROGRAM_NAME=$(dirname $PROGRAM | xargs dirname | xargs basename | tr '-' '_') + echo "Parsing IDL for $PROGRAM_NAME" + anchor idl parse --file $PROGRAM --out-ts sdk/idl/$PROGRAM_NAME.ts || { + echo "Could not parse IDL" + exit 1 + } +done diff --git a/sdk/jest.config.js b/jest.config.js similarity index 100% rename from sdk/jest.config.js rename to jest.config.js diff --git a/sdk/package.json b/package.json similarity index 100% rename from sdk/package.json rename to package.json diff --git a/program/Cargo.lock b/programs/cardinal-creator-standard/Cargo.lock similarity index 100% rename from program/Cargo.lock rename to programs/cardinal-creator-standard/Cargo.lock diff --git a/program/Cargo.toml b/programs/cardinal-creator-standard/Cargo.toml similarity index 100% rename from program/Cargo.toml rename to programs/cardinal-creator-standard/Cargo.toml diff --git a/program/rustfmt.toml b/programs/cardinal-creator-standard/rustfmt.toml similarity index 100% rename from program/rustfmt.toml rename to programs/cardinal-creator-standard/rustfmt.toml diff --git a/program/src/errors.rs b/programs/cardinal-creator-standard/src/errors.rs similarity index 100% rename from program/src/errors.rs rename to programs/cardinal-creator-standard/src/errors.rs diff --git a/program/src/instructions/mint_manager/init_mint_manager.rs b/programs/cardinal-creator-standard/src/instructions/mint_manager/init_mint_manager.rs similarity index 100% rename from program/src/instructions/mint_manager/init_mint_manager.rs rename to programs/cardinal-creator-standard/src/instructions/mint_manager/init_mint_manager.rs diff --git a/program/src/instructions/mint_manager/mod.rs b/programs/cardinal-creator-standard/src/instructions/mint_manager/mod.rs similarity index 100% rename from program/src/instructions/mint_manager/mod.rs rename to programs/cardinal-creator-standard/src/instructions/mint_manager/mod.rs diff --git a/program/src/instructions/mint_manager/update_mint_manager.rs b/programs/cardinal-creator-standard/src/instructions/mint_manager/update_mint_manager.rs similarity index 100% rename from program/src/instructions/mint_manager/update_mint_manager.rs rename to programs/cardinal-creator-standard/src/instructions/mint_manager/update_mint_manager.rs diff --git a/program/src/instructions/mod.rs b/programs/cardinal-creator-standard/src/instructions/mod.rs similarity index 100% rename from program/src/instructions/mod.rs rename to programs/cardinal-creator-standard/src/instructions/mod.rs diff --git a/program/src/instructions/ruleset/init_ruleset.rs b/programs/cardinal-creator-standard/src/instructions/ruleset/init_ruleset.rs similarity index 100% rename from program/src/instructions/ruleset/init_ruleset.rs rename to programs/cardinal-creator-standard/src/instructions/ruleset/init_ruleset.rs diff --git a/program/src/instructions/ruleset/mod.rs b/programs/cardinal-creator-standard/src/instructions/ruleset/mod.rs similarity index 100% rename from program/src/instructions/ruleset/mod.rs rename to programs/cardinal-creator-standard/src/instructions/ruleset/mod.rs diff --git a/program/src/instructions/ruleset/update_ruleset.rs b/programs/cardinal-creator-standard/src/instructions/ruleset/update_ruleset.rs similarity index 100% rename from program/src/instructions/ruleset/update_ruleset.rs rename to programs/cardinal-creator-standard/src/instructions/ruleset/update_ruleset.rs diff --git a/program/src/instructions/token/approve.rs b/programs/cardinal-creator-standard/src/instructions/token/approve.rs similarity index 100% rename from program/src/instructions/token/approve.rs rename to programs/cardinal-creator-standard/src/instructions/token/approve.rs diff --git a/program/src/instructions/token/burn.rs b/programs/cardinal-creator-standard/src/instructions/token/burn.rs similarity index 100% rename from program/src/instructions/token/burn.rs rename to programs/cardinal-creator-standard/src/instructions/token/burn.rs diff --git a/program/src/instructions/token/close.rs b/programs/cardinal-creator-standard/src/instructions/token/close.rs similarity index 100% rename from program/src/instructions/token/close.rs rename to programs/cardinal-creator-standard/src/instructions/token/close.rs diff --git a/program/src/instructions/token/init_account.rs b/programs/cardinal-creator-standard/src/instructions/token/init_account.rs similarity index 100% rename from program/src/instructions/token/init_account.rs rename to programs/cardinal-creator-standard/src/instructions/token/init_account.rs diff --git a/program/src/instructions/token/init_mint.rs b/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs similarity index 100% rename from program/src/instructions/token/init_mint.rs rename to programs/cardinal-creator-standard/src/instructions/token/init_mint.rs diff --git a/program/src/instructions/token/mod.rs b/programs/cardinal-creator-standard/src/instructions/token/mod.rs similarity index 100% rename from program/src/instructions/token/mod.rs rename to programs/cardinal-creator-standard/src/instructions/token/mod.rs diff --git a/program/src/instructions/token/post_transfer.rs b/programs/cardinal-creator-standard/src/instructions/token/post_transfer.rs similarity index 100% rename from program/src/instructions/token/post_transfer.rs rename to programs/cardinal-creator-standard/src/instructions/token/post_transfer.rs diff --git a/program/src/instructions/token/pre_transfer.rs b/programs/cardinal-creator-standard/src/instructions/token/pre_transfer.rs similarity index 100% rename from program/src/instructions/token/pre_transfer.rs rename to programs/cardinal-creator-standard/src/instructions/token/pre_transfer.rs diff --git a/program/src/instructions/token/revoke.rs b/programs/cardinal-creator-standard/src/instructions/token/revoke.rs similarity index 100% rename from program/src/instructions/token/revoke.rs rename to programs/cardinal-creator-standard/src/instructions/token/revoke.rs diff --git a/program/src/instructions/token/transfer.rs b/programs/cardinal-creator-standard/src/instructions/token/transfer.rs similarity index 100% rename from program/src/instructions/token/transfer.rs rename to programs/cardinal-creator-standard/src/instructions/token/transfer.rs diff --git a/program/src/lib.rs b/programs/cardinal-creator-standard/src/lib.rs similarity index 100% rename from program/src/lib.rs rename to programs/cardinal-creator-standard/src/lib.rs diff --git a/program/src/state.rs b/programs/cardinal-creator-standard/src/state.rs similarity index 100% rename from program/src/state.rs rename to programs/cardinal-creator-standard/src/state.rs diff --git a/sdk/idl/cardinal_creator_standard.json b/sdk/cardinal_creator_standard.json similarity index 100% rename from sdk/idl/cardinal_creator_standard.json rename to sdk/cardinal_creator_standard.json diff --git a/sdk/src/errors/formatLogs.ts b/sdk/errors/formatLogs.ts similarity index 100% rename from sdk/src/errors/formatLogs.ts rename to sdk/errors/formatLogs.ts diff --git a/sdk/src/errors/parseTransactionLogs.ts b/sdk/errors/parseTransactionLogs.ts similarity index 100% rename from sdk/src/errors/parseTransactionLogs.ts rename to sdk/errors/parseTransactionLogs.ts diff --git a/sdk/src/errors/programErrors.ts b/sdk/errors/programErrors.ts similarity index 100% rename from sdk/src/errors/programErrors.ts rename to sdk/errors/programErrors.ts diff --git a/sdk/generate-idls.sh b/sdk/generate-idls.sh deleted file mode 100755 index 0bc03dc6..00000000 --- a/sdk/generate-idls.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# This script generates the IDL JSONs without buildling the full packages. - -rm -rf sdk/src/idl -mkdir -p sdk/src/idl - -for PROGRAM in $(find ../program/ -maxdepth 3 -name lib.rs); do - PROGRAM_NAME="cardinal_creator_standard" - echo "Parsing IDL for $PROGRAM_NAME" - anchor idl parse --file $PROGRAM --out-ts sdk/src/idl/$PROGRAM_NAME.ts || { - echo "Could not parse IDL" - exit 1 - } -done diff --git a/sdk/src/generated/accounts/AccountBalances.ts b/sdk/generated/accounts/AccountBalances.ts similarity index 100% rename from sdk/src/generated/accounts/AccountBalances.ts rename to sdk/generated/accounts/AccountBalances.ts diff --git a/sdk/src/generated/accounts/MintManager.ts b/sdk/generated/accounts/MintManager.ts similarity index 100% rename from sdk/src/generated/accounts/MintManager.ts rename to sdk/generated/accounts/MintManager.ts diff --git a/sdk/src/generated/accounts/Ruleset.ts b/sdk/generated/accounts/Ruleset.ts similarity index 100% rename from sdk/src/generated/accounts/Ruleset.ts rename to sdk/generated/accounts/Ruleset.ts diff --git a/sdk/src/generated/accounts/index.ts b/sdk/generated/accounts/index.ts similarity index 100% rename from sdk/src/generated/accounts/index.ts rename to sdk/generated/accounts/index.ts diff --git a/sdk/src/generated/errors/index.ts b/sdk/generated/errors/index.ts similarity index 100% rename from sdk/src/generated/errors/index.ts rename to sdk/generated/errors/index.ts diff --git a/sdk/src/generated/index.ts b/sdk/generated/index.ts similarity index 100% rename from sdk/src/generated/index.ts rename to sdk/generated/index.ts diff --git a/sdk/src/generated/instructions/approve.ts b/sdk/generated/instructions/approve.ts similarity index 100% rename from sdk/src/generated/instructions/approve.ts rename to sdk/generated/instructions/approve.ts diff --git a/sdk/src/generated/instructions/burn.ts b/sdk/generated/instructions/burn.ts similarity index 100% rename from sdk/src/generated/instructions/burn.ts rename to sdk/generated/instructions/burn.ts diff --git a/sdk/src/generated/instructions/close.ts b/sdk/generated/instructions/close.ts similarity index 100% rename from sdk/src/generated/instructions/close.ts rename to sdk/generated/instructions/close.ts diff --git a/sdk/src/generated/instructions/index.ts b/sdk/generated/instructions/index.ts similarity index 100% rename from sdk/src/generated/instructions/index.ts rename to sdk/generated/instructions/index.ts diff --git a/sdk/src/generated/instructions/initAccount.ts b/sdk/generated/instructions/initAccount.ts similarity index 100% rename from sdk/src/generated/instructions/initAccount.ts rename to sdk/generated/instructions/initAccount.ts diff --git a/sdk/src/generated/instructions/initMint.ts b/sdk/generated/instructions/initMint.ts similarity index 100% rename from sdk/src/generated/instructions/initMint.ts rename to sdk/generated/instructions/initMint.ts diff --git a/sdk/src/generated/instructions/initMintManager.ts b/sdk/generated/instructions/initMintManager.ts similarity index 100% rename from sdk/src/generated/instructions/initMintManager.ts rename to sdk/generated/instructions/initMintManager.ts diff --git a/sdk/src/generated/instructions/initRuleset.ts b/sdk/generated/instructions/initRuleset.ts similarity index 100% rename from sdk/src/generated/instructions/initRuleset.ts rename to sdk/generated/instructions/initRuleset.ts diff --git a/sdk/src/generated/instructions/postTransfer.ts b/sdk/generated/instructions/postTransfer.ts similarity index 100% rename from sdk/src/generated/instructions/postTransfer.ts rename to sdk/generated/instructions/postTransfer.ts diff --git a/sdk/src/generated/instructions/preTransfer.ts b/sdk/generated/instructions/preTransfer.ts similarity index 100% rename from sdk/src/generated/instructions/preTransfer.ts rename to sdk/generated/instructions/preTransfer.ts diff --git a/sdk/src/generated/instructions/revoke.ts b/sdk/generated/instructions/revoke.ts similarity index 100% rename from sdk/src/generated/instructions/revoke.ts rename to sdk/generated/instructions/revoke.ts diff --git a/sdk/src/generated/instructions/transfer.ts b/sdk/generated/instructions/transfer.ts similarity index 100% rename from sdk/src/generated/instructions/transfer.ts rename to sdk/generated/instructions/transfer.ts diff --git a/sdk/src/generated/instructions/updateMintManager.ts b/sdk/generated/instructions/updateMintManager.ts similarity index 100% rename from sdk/src/generated/instructions/updateMintManager.ts rename to sdk/generated/instructions/updateMintManager.ts diff --git a/sdk/src/generated/instructions/updateRuleset.ts b/sdk/generated/instructions/updateRuleset.ts similarity index 100% rename from sdk/src/generated/instructions/updateRuleset.ts rename to sdk/generated/instructions/updateRuleset.ts diff --git a/sdk/src/generated/types/AccountBalance.ts b/sdk/generated/types/AccountBalance.ts similarity index 100% rename from sdk/src/generated/types/AccountBalance.ts rename to sdk/generated/types/AccountBalance.ts diff --git a/sdk/src/generated/types/InitRulesetIx.ts b/sdk/generated/types/InitRulesetIx.ts similarity index 100% rename from sdk/src/generated/types/InitRulesetIx.ts rename to sdk/generated/types/InitRulesetIx.ts diff --git a/sdk/src/generated/types/UpdateMintManagerIx.ts b/sdk/generated/types/UpdateMintManagerIx.ts similarity index 100% rename from sdk/src/generated/types/UpdateMintManagerIx.ts rename to sdk/generated/types/UpdateMintManagerIx.ts diff --git a/sdk/src/generated/types/UpdateRulesetIx.ts b/sdk/generated/types/UpdateRulesetIx.ts similarity index 100% rename from sdk/src/generated/types/UpdateRulesetIx.ts rename to sdk/generated/types/UpdateRulesetIx.ts diff --git a/sdk/src/generated/types/index.ts b/sdk/generated/types/index.ts similarity index 100% rename from sdk/src/generated/types/index.ts rename to sdk/generated/types/index.ts diff --git a/sdk/sdk/src/idl/cardinal_creator_standard.ts b/sdk/idl/cardinal_creator_standard.ts similarity index 100% rename from sdk/sdk/src/idl/cardinal_creator_standard.ts rename to sdk/idl/cardinal_creator_standard.ts diff --git a/sdk/src/index.ts b/sdk/index.ts similarity index 100% rename from sdk/src/index.ts rename to sdk/index.ts diff --git a/sdk/src/pda.ts b/sdk/pda.ts similarity index 100% rename from sdk/src/pda.ts rename to sdk/pda.ts diff --git a/sdk/src/idl/cardinal_creator_standard.ts b/sdk/src/idl/cardinal_creator_standard.ts deleted file mode 100644 index dbef73e2..00000000 --- a/sdk/src/idl/cardinal_creator_standard.ts +++ /dev/null @@ -1,1549 +0,0 @@ -export type CardinalCreatorStandard = { - "version": "0.1.0", - "name": "cardinal_creator_standard", - "instructions": [ - { - "name": "initMintManager", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "updateMintManager", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "ix", - "type": { - "defined": "UpdateMintManagerIx" - } - } - ] - }, - { - "name": "initRuleset", - "accounts": [ - { - "name": "ruleset", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "ix", - "type": { - "defined": "InitRulesetIx" - } - } - ] - }, - { - "name": "updateRuleset", - "accounts": [ - { - "name": "ruleset", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "ix", - "type": { - "defined": "UpdateRulesetIx" - } - } - ] - }, - { - "name": "initMint", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "targetTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "target", - "isMut": false, - "isSigner": true - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "associatedTokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "initAccount", - "accounts": [ - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenAccountOwner", - "isMut": false, - "isSigner": false - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "associatedTokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "approve", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "holderTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "holder", - "isMut": true, - "isSigner": true - }, - { - "name": "delegate", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "revoke", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "holderTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "holder", - "isMut": true, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "burn", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "holderTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "holder", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "close", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "owner", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "transfer", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "from", - "isMut": true, - "isSigner": false - }, - { - "name": "to", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "instructions", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "preTransfer", - "accounts": [ - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "instructions", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "postTransfer", - "accounts": [ - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "instructions", - "isMut": false, - "isSigner": false - } - ], - "args": [] - } - ], - "accounts": [ - { - "name": "mintManager", - "type": { - "kind": "struct", - "fields": [ - { - "name": "bump", - "type": "u8" - }, - { - "name": "version", - "type": "u8" - }, - { - "name": "mint", - "type": "publicKey" - }, - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "ruleset", - "type": "publicKey" - } - ] - } - }, - { - "name": "ruleset", - "type": { - "kind": "struct", - "fields": [ - { - "name": "bump", - "type": "u8" - }, - { - "name": "version", - "type": "u8" - }, - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "collector", - "type": "publicKey" - }, - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "disallowedAddresses", - "type": { - "vec": "publicKey" - } - }, - { - "name": "allowedPrograms", - "type": { - "vec": "publicKey" - } - } - ] - } - }, - { - "name": "accountBalances", - "type": { - "kind": "struct", - "fields": [ - { - "name": "balances", - "type": { - "vec": { - "defined": "AccountBalance" - } - } - } - ] - } - } - ], - "types": [ - { - "name": "UpdateMintManagerIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "publicKey" - } - ] - } - }, - { - "name": "InitRulesetIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "collector", - "type": "publicKey" - }, - { - "name": "disallowedAddresses", - "type": { - "vec": "publicKey" - } - }, - { - "name": "allowedPrograms", - "type": { - "vec": "publicKey" - } - } - ] - } - }, - { - "name": "UpdateRulesetIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "collector", - "type": "publicKey" - }, - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, - { - "name": "disallowedAddresses", - "type": { - "vec": "publicKey" - } - }, - { - "name": "allowedPrograms", - "type": { - "vec": "publicKey" - } - } - ] - } - }, - { - "name": "AccountBalance", - "type": { - "kind": "struct", - "fields": [ - { - "name": "address", - "type": "publicKey" - }, - { - "name": "mint", - "type": "publicKey" - }, - { - "name": "size", - "type": "u64" - }, - { - "name": "balance", - "type": "u64" - } - ] - } - } - ], - "errors": [ - { - "code": 6000, - "name": "InvalidMint", - "msg": "Invalid mint" - }, - { - "code": 6001, - "name": "InvalidCollector", - "msg": "Invalid collector address" - }, - { - "code": 6002, - "name": "InvalidAuthority", - "msg": "Invalid authority address" - }, - { - "code": 6003, - "name": "InvalidMintManager", - "msg": "Invalid mint manager" - }, - { - "code": 6004, - "name": "InvlaidHolderTokenAccount", - "msg": "Invalid holder token account" - }, - { - "code": 6005, - "name": "InvalidTargetTokenAccount", - "msg": "Invalid target token account" - }, - { - "code": 6006, - "name": "InvalidCloseTokenAccount", - "msg": "Invalid token account to close" - }, - { - "code": 6007, - "name": "InvalidHolderTokenAccount", - "msg": "Invalid holder token account" - }, - { - "code": 6008, - "name": "InvalidRuleset", - "msg": "Invalid ruleset" - }, - { - "code": 6009, - "name": "InvalidPreTransferInstruction", - "msg": "Invalid pre transfer instruction" - }, - { - "code": 6010, - "name": "InvalidPostTransferInstruction", - "msg": "Invalid post transfer instruction" - }, - { - "code": 6011, - "name": "ProgramDisallowed", - "msg": "Disallowed program included in transfer" - }, - { - "code": 6012, - "name": "ProgramNotAllowed", - "msg": "Program not allowed in allowed programs to transfer" - }, - { - "code": 6013, - "name": "UnknownAccount", - "msg": "Unknown account found in instruction" - }, - { - "code": 6014, - "name": "AccountNotFound", - "msg": "Account not found in instruction" - } - ] -}; - -export const IDL: CardinalCreatorStandard = { - "version": "0.1.0", - "name": "cardinal_creator_standard", - "instructions": [ - { - "name": "initMintManager", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "updateMintManager", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "ix", - "type": { - "defined": "UpdateMintManagerIx" - } - } - ] - }, - { - "name": "initRuleset", - "accounts": [ - { - "name": "ruleset", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "ix", - "type": { - "defined": "InitRulesetIx" - } - } - ] - }, - { - "name": "updateRuleset", - "accounts": [ - { - "name": "ruleset", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [ - { - "name": "ix", - "type": { - "defined": "UpdateRulesetIx" - } - } - ] - }, - { - "name": "initMint", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "targetTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "target", - "isMut": false, - "isSigner": true - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "associatedTokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "initAccount", - "accounts": [ - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenAccountOwner", - "isMut": false, - "isSigner": false - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "associatedTokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "approve", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "holderTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "holder", - "isMut": true, - "isSigner": true - }, - { - "name": "delegate", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "revoke", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "holderTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "holder", - "isMut": true, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "burn", - "accounts": [ - { - "name": "mintManager", - "isMut": true, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "holderTokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "holder", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "close", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "mint", - "isMut": true, - "isSigner": false - }, - { - "name": "tokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "owner", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "transfer", - "accounts": [ - { - "name": "mintManager", - "isMut": false, - "isSigner": false - }, - { - "name": "ruleset", - "isMut": false, - "isSigner": false - }, - { - "name": "mint", - "isMut": false, - "isSigner": false - }, - { - "name": "from", - "isMut": true, - "isSigner": false - }, - { - "name": "to", - "isMut": true, - "isSigner": false - }, - { - "name": "authority", - "isMut": false, - "isSigner": true - }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "systemProgram", - "isMut": false, - "isSigner": false - }, - { - "name": "instructions", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "preTransfer", - "accounts": [ - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, - { - "name": "payer", - "isMut": true, - "isSigner": true - }, - { - "name": "instructions", - "isMut": false, - "isSigner": false - } - ], - "args": [] - }, - { - "name": "postTransfer", - "accounts": [ - { - "name": "accountBalances", - "isMut": true, - "isSigner": false - }, - { - "name": "collector", - "isMut": true, - "isSigner": false - }, - { - "name": "instructions", - "isMut": false, - "isSigner": false - } - ], - "args": [] - } - ], - "accounts": [ - { - "name": "mintManager", - "type": { - "kind": "struct", - "fields": [ - { - "name": "bump", - "type": "u8" - }, - { - "name": "version", - "type": "u8" - }, - { - "name": "mint", - "type": "publicKey" - }, - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "ruleset", - "type": "publicKey" - } - ] - } - }, - { - "name": "ruleset", - "type": { - "kind": "struct", - "fields": [ - { - "name": "bump", - "type": "u8" - }, - { - "name": "version", - "type": "u8" - }, - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "collector", - "type": "publicKey" - }, - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "disallowedAddresses", - "type": { - "vec": "publicKey" - } - }, - { - "name": "allowedPrograms", - "type": { - "vec": "publicKey" - } - } - ] - } - }, - { - "name": "accountBalances", - "type": { - "kind": "struct", - "fields": [ - { - "name": "balances", - "type": { - "vec": { - "defined": "AccountBalance" - } - } - } - ] - } - } - ], - "types": [ - { - "name": "UpdateMintManagerIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "publicKey" - } - ] - } - }, - { - "name": "InitRulesetIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "collector", - "type": "publicKey" - }, - { - "name": "disallowedAddresses", - "type": { - "vec": "publicKey" - } - }, - { - "name": "allowedPrograms", - "type": { - "vec": "publicKey" - } - } - ] - } - }, - { - "name": "UpdateRulesetIx", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "collector", - "type": "publicKey" - }, - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, - { - "name": "disallowedAddresses", - "type": { - "vec": "publicKey" - } - }, - { - "name": "allowedPrograms", - "type": { - "vec": "publicKey" - } - } - ] - } - }, - { - "name": "AccountBalance", - "type": { - "kind": "struct", - "fields": [ - { - "name": "address", - "type": "publicKey" - }, - { - "name": "mint", - "type": "publicKey" - }, - { - "name": "size", - "type": "u64" - }, - { - "name": "balance", - "type": "u64" - } - ] - } - } - ], - "errors": [ - { - "code": 6000, - "name": "InvalidMint", - "msg": "Invalid mint" - }, - { - "code": 6001, - "name": "InvalidCollector", - "msg": "Invalid collector address" - }, - { - "code": 6002, - "name": "InvalidAuthority", - "msg": "Invalid authority address" - }, - { - "code": 6003, - "name": "InvalidMintManager", - "msg": "Invalid mint manager" - }, - { - "code": 6004, - "name": "InvlaidHolderTokenAccount", - "msg": "Invalid holder token account" - }, - { - "code": 6005, - "name": "InvalidTargetTokenAccount", - "msg": "Invalid target token account" - }, - { - "code": 6006, - "name": "InvalidCloseTokenAccount", - "msg": "Invalid token account to close" - }, - { - "code": 6007, - "name": "InvalidHolderTokenAccount", - "msg": "Invalid holder token account" - }, - { - "code": 6008, - "name": "InvalidRuleset", - "msg": "Invalid ruleset" - }, - { - "code": 6009, - "name": "InvalidPreTransferInstruction", - "msg": "Invalid pre transfer instruction" - }, - { - "code": 6010, - "name": "InvalidPostTransferInstruction", - "msg": "Invalid post transfer instruction" - }, - { - "code": 6011, - "name": "ProgramDisallowed", - "msg": "Disallowed program included in transfer" - }, - { - "code": 6012, - "name": "ProgramNotAllowed", - "msg": "Program not allowed in allowed programs to transfer" - }, - { - "code": 6013, - "name": "UnknownAccount", - "msg": "Unknown account found in instruction" - }, - { - "code": 6014, - "name": "AccountNotFound", - "msg": "Account not found in instruction" - } - ] -}; diff --git a/sdk/yarn-error.log b/sdk/yarn-error.log deleted file mode 100644 index 107a6afc..00000000 --- a/sdk/yarn-error.log +++ /dev/null @@ -1,2643 +0,0 @@ -Arguments: - /opt/homebrew/Cellar/node/18.2.0/bin/node /usr/local/bin/yarn add -D jest - -PATH: - /Users/jbogle/Code/solana/bin:/Users/jbogle/Code/solana/target/release:/opt/homebrew/opt/openssl@1.1/bin:/opt/homebrew/opt/openssl@3/bin:/Users/jbogle/.cargo/bin:/opt/homebrew/bin:/Users/jbogle/.local/share/solana/install/active_release/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - -Yarn version: - 1.22.17 - -Node version: - 18.2.0 - -Platform: - darwin arm64 - -Trace: - SyntaxError: /Users/jbogle/Code/cardinal-creator-standard/sdk/package.json: Unexpected string in JSON at position 351 - at JSON.parse (<anonymous>) - at /usr/local/lib/node_modules/yarn/lib/cli.js:1625:59 - at Generator.next (<anonymous>) - at step (/usr/local/lib/node_modules/yarn/lib/cli.js:310:30) - at /usr/local/lib/node_modules/yarn/lib/cli.js:321:13 - -npm manifest: - { - "name": "cardinal-creator-standard", - "version": "1.0.0", - "description": "SDK for cardinal-creator-standard", - "main": "index.ts", - "license": "MIT", - "scripts": { - "test": "jest" - }, - - "dependencies": { - "@metaplex-foundation/rustbin": "^0.3.1", - "@metaplex-foundation/solita": "^0.12.2", - "@solana/spl-token": "0.1.8" - } - } - - "jest": "^27.2.5", - "js-yaml": "^4.1.0", - "prettier": "2.5.1", - "ts-jest": "^27.1.2", - -yarn manifest: - No manifest - -Lockfile: - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. - # yarn lockfile v1 - - - "@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - - "@babel/compat-data@^7.19.3": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" - integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== - - "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - - "@babel/generator@^7.19.3", "@babel/generator@^7.19.4", "@babel/generator@^7.7.2": - version "7.19.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.5.tgz#da3f4b301c8086717eee9cab14da91b1fa5dcca7" - integrity sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg== - dependencies: - "@babel/types" "^7.19.4" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - - "@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== - dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - - "@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - - "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - - "@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== - - "@babel/helper-simple-access@^7.18.6": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" - integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== - dependencies: - "@babel/types" "^7.19.4" - - "@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - - "@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - - "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - - "@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - - "@babel/helpers@^7.19.0": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" - integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.4" - "@babel/types" "^7.19.4" - - "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - - "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.3", "@babel/parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.4.tgz#03c4339d2b8971eb3beca5252bafd9b9f79db3dc" - integrity sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA== - - "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - - "@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - - "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - - "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - - "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - - "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - - "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - - "@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - - "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== - dependencies: - regenerator-runtime "^0.13.4" - - "@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - - "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3", "@babel/traverse@^7.19.4", "@babel/traverse@^7.7.2": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.4.tgz#f117820e18b1e59448a6c1fa9d0ff08f7ac459a8" - integrity sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.4" - "@babel/types" "^7.19.4" - debug "^4.1.0" - globals "^11.1.0" - - "@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.19.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" - integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - - "@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - - "@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - - "@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - - "@jest/console@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.2.1.tgz#5f2c62dcdd5ce66e94b6d6729e021758bceea090" - integrity sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw== - dependencies: - "@jest/types" "^29.2.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.2.1" - jest-util "^29.2.1" - slash "^3.0.0" - - "@jest/core@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.2.1.tgz#30af794ebd73bfb87cd8ba36718738dfe38b772e" - integrity sha512-kuLKYqnqgerXkBUwlHVxeSuhSnd+JMnMCLfU98bpacBSfWEJPegytDh3P2m15/JHzet32hGGld4KR4OzMb6/Tg== - dependencies: - "@jest/console" "^29.2.1" - "@jest/reporters" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.2.1" - jest-haste-map "^29.2.1" - jest-message-util "^29.2.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.2.1" - jest-resolve-dependencies "^29.2.1" - jest-runner "^29.2.1" - jest-runtime "^29.2.1" - jest-snapshot "^29.2.1" - jest-util "^29.2.1" - jest-validate "^29.2.1" - jest-watcher "^29.2.1" - micromatch "^4.0.4" - pretty-format "^29.2.1" - slash "^3.0.0" - strip-ansi "^6.0.0" - - "@jest/environment@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.2.1.tgz#acb1994fbd5ad02819a1a34a923c531e6923b665" - integrity sha512-EutqA7T/X6zFjw6mAWRHND+ZkTPklmIEWCNbmwX6uCmOrFrWaLbDZjA+gePHJx6fFMMRvNfjXcvzXEtz54KPlg== - dependencies: - "@jest/fake-timers" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - jest-mock "^29.2.1" - - "@jest/expect-utils@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.2.1.tgz#eae61c90f2066540f60d23b8f254f03b7869b22f" - integrity sha512-yr4aHNg5Z1CjKby5ozm7sKjgBlCOorlAoFcvrOQ/4rbZRfgZQdnmh7cth192PYIgiPZo2bBXvqdOApnAMWFJZg== - dependencies: - jest-get-type "^29.2.0" - - "@jest/expect@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.2.1.tgz#8d99be3886ebfcffd6cabb2b46602a301b976ffe" - integrity sha512-o14R2t2tHHHudwji43UKkzmmH49xfF5T++FQBK2tl88qwuBWQOcx7fNUYl+mA/9TPNAN0FkQ3usnpyS8FUwsvQ== - dependencies: - expect "^29.2.1" - jest-snapshot "^29.2.1" - - "@jest/fake-timers@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.2.1.tgz#786d60e8cb60ca70c9f913cb49fcc77610c072bb" - integrity sha512-KWil+8fef7Uj/P/PTZlPKk1Pw117wAmr71VWFV8ZDtRtkwmTG8oY4IRf0Ss44J2y5CYRy8d/zLOhxyoGRENjvA== - dependencies: - "@jest/types" "^29.2.1" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^29.2.1" - jest-mock "^29.2.1" - jest-util "^29.2.1" - - "@jest/globals@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.2.1.tgz#6933beb8b4e43b990409a19c462fde7b71210e63" - integrity sha512-Z4EejYPP1OPVq2abk1+9urAwJqkgw5jB2UJGlPjb5ZwzPQF8WLMcigKEfFzZb2OHhEVPP0RZD0/DbVTY1R6iQA== - dependencies: - "@jest/environment" "^29.2.1" - "@jest/expect" "^29.2.1" - "@jest/types" "^29.2.1" - jest-mock "^29.2.1" - - "@jest/reporters@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.2.1.tgz#599e4376823751fdda50f2ca97243e013da10c4d" - integrity sha512-sCsfUKM/yIF4nNed3e/rIgVIS58EiASGMDEPWqItfLZ9UO1ALW2ASDNJzdWkxEt0T8o2Ztj619G0KKrvK+McAw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.2.1" - jest-util "^29.2.1" - jest-worker "^29.2.1" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - - "@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== - dependencies: - "@sinclair/typebox" "^0.24.1" - - "@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - - "@jest/test-result@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.2.1.tgz#f42dbf7b9ae465d0a93eee6131473b8bb3bd2edb" - integrity sha512-lS4+H+VkhbX6z64tZP7PAUwPqhwj3kbuEHcaLuaBuB+riyaX7oa1txe0tXgrFj5hRWvZKvqO7LZDlNWeJ7VTPA== - dependencies: - "@jest/console" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - - "@jest/test-sequencer@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.2.1.tgz#cafd2c5f3528c70bd4cc243800459ac366e480cc" - integrity sha512-O/pnk0/xGj3lxPVNwB6HREJ7AYvUdyP2xo/s14/9Dtf091HoOeyIhWLKQE/4HzB8lNQBMo6J5mg0bHz/uCWK7w== - dependencies: - "@jest/test-result" "^29.2.1" - graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" - slash "^3.0.0" - - "@jest/transform@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.2.1.tgz#f3d8154edd19cdbcaf1d6646bd8f4ff7812318a2" - integrity sha512-xup+iEuaIRSQabQaeqxaQyN0vg1Dctrp9oTObQsNf3sZEowTIa5cANYuoyi8Tqhg4GCqEVLTf18KW7ii0UeFVA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.2.1" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" - jest-regex-util "^29.2.0" - jest-util "^29.2.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" - - "@jest/types@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.2.1.tgz#ec9c683094d4eb754e41e2119d8bdaef01cf6da0" - integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw== - dependencies: - "@jest/schemas" "^29.0.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - - "@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - - "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - - "@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - - "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - - "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - - "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - - "@metaplex-foundation/beet-solana@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz#4b37cda5c7f32ffd2bdd8b3164edc05c6463ab35" - integrity sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g== - dependencies: - "@metaplex-foundation/beet" ">=0.1.0" - "@solana/web3.js" "^1.56.2" - bs58 "^5.0.0" - debug "^4.3.4" - - "@metaplex-foundation/beet@>=0.1.0": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.7.1.tgz#0975314211643f87b5f6f3e584fa31abcf4c612c" - integrity sha512-hNCEnS2WyCiYyko82rwuISsBY3KYpe828ubsd2ckeqZr7tl0WVLivGkoyA/qdiaaHEBGdGl71OpfWa2rqL3DiA== - dependencies: - ansicolors "^0.3.2" - bn.js "^5.2.0" - debug "^4.3.3" - - "@metaplex-foundation/beet@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.4.0.tgz#eb2a0a6eb084bb25d67dd9bed2f7387ee7e63a55" - integrity sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA== - dependencies: - ansicolors "^0.3.2" - bn.js "^5.2.0" - debug "^4.3.3" - - "@metaplex-foundation/rustbin@^0.3.0", "@metaplex-foundation/rustbin@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@metaplex-foundation/rustbin/-/rustbin-0.3.1.tgz#bbcd61e8699b73c0b062728c6f5e8d52e8145042" - integrity sha512-hWd2JPrnt2/nJzkBpZD3Y6ZfCUlJujv2K7qUfsxdS0jSwLrSrOvYwmNWFw6mc3lbULj6VP4WDyuy9W5/CHU/lQ== - dependencies: - debug "^4.3.3" - semver "^7.3.7" - text-table "^0.2.0" - toml "^3.0.0" - - "@metaplex-foundation/solita@^0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@metaplex-foundation/solita/-/solita-0.12.2.tgz#13ef213ac183c986f6d01c5d981c44e59a900834" - integrity sha512-oczMfE43NNHWweSqhXPTkQBUbap/aAiwjDQw8zLKNnd/J8sXr/0+rKcN5yJIEgcHeKRkp90eTqkmt2WepQc8yw== - dependencies: - "@metaplex-foundation/beet" "^0.4.0" - "@metaplex-foundation/beet-solana" "^0.3.0" - "@metaplex-foundation/rustbin" "^0.3.0" - "@solana/web3.js" "^1.36.0" - camelcase "^6.2.1" - debug "^4.3.3" - js-sha256 "^0.9.0" - prettier "^2.5.1" - snake-case "^3.0.4" - spok "^1.4.3" - - "@noble/ed25519@^1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.1.tgz#6899660f6fbb97798a6fbd227227c4589a454724" - integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== - - "@noble/hashes@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" - integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== - - "@noble/secp256k1@^1.6.3": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1" - integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw== - - "@sinclair/typebox@^0.24.1": - version "0.24.47" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" - integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== - - "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - - "@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - - "@solana/buffer-layout@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734" - integrity sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ== - dependencies: - buffer "~6.0.3" - - "@solana/spl-token@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.8.tgz#f06e746341ef8d04165e21fc7f555492a2a0faa6" - integrity sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ== - dependencies: - "@babel/runtime" "^7.10.5" - "@solana/web3.js" "^1.21.0" - bn.js "^5.1.0" - buffer "6.0.3" - buffer-layout "^1.2.0" - dotenv "10.0.0" - - "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.56.2": - version "1.66.1" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.66.1.tgz#f11bf657e76500780a1b94fa286e9ff9e6106c71" - integrity sha512-AAVW9vGqYo8m2kMdwQtzEFuEBT21D0Z13wCzGC0lv4vay1BaqDUGSangmakeDEirtIsaAtM0gfAPu1YNLkIy/Q== - dependencies: - "@babel/runtime" "^7.12.5" - "@noble/ed25519" "^1.7.0" - "@noble/hashes" "^1.1.2" - "@noble/secp256k1" "^1.6.3" - "@solana/buffer-layout" "^4.0.0" - bigint-buffer "^1.1.5" - bn.js "^5.0.0" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.1" - fast-stable-stringify "^1.0.0" - jayson "^3.4.4" - node-fetch "2" - rpc-websockets "^7.5.0" - superstruct "^0.14.2" - - "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - - "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - - "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - - "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== - dependencies: - "@babel/types" "^7.3.0" - - "@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/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - - "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - - "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - - "@types/node@*": - version "18.11.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.2.tgz#c59b7641832531264fda3f1ba610362dc9a7dfc8" - integrity sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw== - - "@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - - "@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - - "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - - "@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" "*" - - "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - - "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== - dependencies: - "@types/yargs-parser" "*" - - 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-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - - ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - - ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - - 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" - - ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - - ansicolors@^0.3.2, ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - - anymatch@^3.0.3: - 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@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - - babel-jest@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.2.1.tgz#213c47e28072de11bdb98c9d29b89f2ab99664f1" - integrity sha512-gQJwArok0mqoREiCYhXKWOgUhElJj9DpnssW6GL8dG7ARYqHEhrM9fmPHTjdqEGRVXZAd6+imo3/Vwa8TjLcsw== - dependencies: - "@jest/transform" "^29.2.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - - babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - - babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - - babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - - babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== - dependencies: - babel-plugin-jest-hoist "^29.2.0" - babel-preset-current-node-syntax "^1.0.0" - - balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - - base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - - base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== - - base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - - bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - - bindings@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - - bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - - borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - - brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - - braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - - browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - - bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - - bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - - bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - - buffer-from@^1.0.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: - 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, buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - - bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== - dependencies: - node-gyp-build "^4.3.0" - - callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - - 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.2.0, camelcase@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - - caniuse-lite@^1.0.30001400: - version "1.0.30001422" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz#f2d7c6202c49a8359e6e35add894d88ef93edba1" - integrity sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog== - - chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - - chalk@^4.0.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" - - char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - - ci-info@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== - - cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - - cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - - co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - - collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - - color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - - 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.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - - 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 sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - - convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - - cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - - debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - - dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - - deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - - 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== - - detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - - diff-sequences@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.2.0.tgz#4c55b5b40706c7b5d2c5c75999a50c56d214e8f6" - integrity sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw== - - 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" - - dotenv@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - - electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== - - emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - - emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - - error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - - es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - - es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - - escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - - escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - - escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - - esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - - eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - - execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - - exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - - expect@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.2.1.tgz#25752d0df92d3daa5188dc8804de1f30759658cf" - integrity sha512-BJtA754Fba0YWRWHgjKUMTA3ltWarKgITXHQnbZ2mTxTXC4yMQlR0FI7HkB3fJYkhWBf4qjNiqvg3LDtXCcVRQ== - dependencies: - "@jest/expect-utils" "^29.2.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.2.1" - jest-message-util "^29.2.1" - jest-util "^29.2.1" - - eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - - fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - - fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - - fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - - file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - - fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - - find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - - fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - - fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - - function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - - gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - - 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-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - - get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - - glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - - globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - - graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - - has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - - has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - - has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - - html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - - human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - - 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== - - import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - - imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - - inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - - inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - - is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - - is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - - is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - - is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - - 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-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - - isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - - isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - - istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - - istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - - istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - - istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - - jayson@^3.4.4: - version "3.7.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" - integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - lodash "^4.17.20" - uuid "^8.3.2" - ws "^7.4.5" - - jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - - jest-circus@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.2.1.tgz#1385353d9bca6acf58f916068bbeffcfc95bef02" - integrity sha512-W+ZQQ5ln4Db2UZNM4NJIeasnhCdDhSuYW4eLgNAUi0XiSSpF634Kc5wiPvGiHvTgXMFVn1ZgWIijqhi9+kLNLg== - dependencies: - "@jest/environment" "^29.2.1" - "@jest/expect" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.2.1" - jest-matcher-utils "^29.2.1" - jest-message-util "^29.2.1" - jest-runtime "^29.2.1" - jest-snapshot "^29.2.1" - jest-util "^29.2.1" - p-limit "^3.1.0" - pretty-format "^29.2.1" - slash "^3.0.0" - stack-utils "^2.0.3" - - jest-cli@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.2.1.tgz#fbfa90b87b27a04e1041cc9d33ee80f32e2f2528" - integrity sha512-UIMD5aNqvPKpdlJSaeUAoLfxsh9TZvOkaMETx5qXnkboc317bcbb0eLHbIj8sFBHdcJAIAM+IRKnIU7Wi61MBw== - dependencies: - "@jest/core" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/types" "^29.2.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.2.1" - jest-util "^29.2.1" - jest-validate "^29.2.1" - prompts "^2.0.1" - yargs "^17.3.1" - - jest-config@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.2.1.tgz#2182af014d6c73978208626335db5134803dd183" - integrity sha512-EV5F1tQYW/quZV2br2o88hnYEeRzG53Dfi6rSG3TZBuzGQ6luhQBux/RLlU5QrJjCdq3LXxRRM8F1LP6DN1ycA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.2.1" - "@jest/types" "^29.2.1" - babel-jest "^29.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.2.1" - jest-environment-node "^29.2.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.2.1" - jest-runner "^29.2.1" - jest-util "^29.2.1" - jest-validate "^29.2.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.2.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - - jest-diff@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.2.1.tgz#027e42f5a18b693fb2e88f81b0ccab533c08faee" - integrity sha512-gfh/SMNlQmP3MOUgdzxPOd4XETDJifADpT937fN1iUGz+9DgOu2eUPHH25JDkLVcLwwqxv3GzVyK4VBUr9fjfA== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.2.0" - jest-get-type "^29.2.0" - pretty-format "^29.2.1" - - jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== - dependencies: - detect-newline "^3.0.0" - - jest-each@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.2.1.tgz#6b0a88ee85c2ba27b571a6010c2e0c674f5c9b29" - integrity sha512-sGP86H/CpWHMyK3qGIGFCgP6mt+o5tu9qG4+tobl0LNdgny0aitLXs9/EBacLy3Bwqy+v4uXClqJgASJWcruYw== - dependencies: - "@jest/types" "^29.2.1" - chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.2.1" - pretty-format "^29.2.1" - - jest-environment-node@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.2.1.tgz#f90311d0f0e8ef720349f83c97a076e403f90665" - integrity sha512-PulFKwEMz6nTAdLUwglFKei3b/LixwlRiqTN6nvPE1JtrLtlnpd6LXnFI1NFHYJGlTmIWilMP2n9jEtPPKX50g== - dependencies: - "@jest/environment" "^29.2.1" - "@jest/fake-timers" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - jest-mock "^29.2.1" - jest-util "^29.2.1" - - jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== - - jest-haste-map@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.2.1.tgz#f803fec57f8075e6c55fb5cd551f99a72471c699" - integrity sha512-wF460rAFmYc6ARcCFNw4MbGYQjYkvjovb9GBT+W10Um8q5nHq98jD6fHZMDMO3tA56S8XnmNkM8GcA8diSZfnA== - dependencies: - "@jest/types" "^29.2.1" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.2.1" - jest-worker "^29.2.1" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - - jest-leak-detector@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.2.1.tgz#ec551686b7d512ec875616c2c3534298b1ffe2fc" - integrity sha512-1YvSqYoiurxKOJtySc+CGVmw/e1v4yNY27BjWTVzp0aTduQeA7pdieLiW05wTYG/twlKOp2xS/pWuikQEmklug== - dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.2.1" - - jest-matcher-utils@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.2.1.tgz#2bf876c5f891b33786aadf5d65d5da5970744122" - integrity sha512-hUTBh7H/Mnb6GTpihbLh8uF5rjAMdekfW/oZNXUMAXi7bbmym2HiRpzgqf/zzkjgejMrVAkPdVSQj+32enlUww== - dependencies: - chalk "^4.0.0" - jest-diff "^29.2.1" - jest-get-type "^29.2.0" - pretty-format "^29.2.1" - - jest-message-util@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.2.1.tgz#3a51357fbbe0cc34236f17a90d772746cf8d9193" - integrity sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.2.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.2.1" - slash "^3.0.0" - stack-utils "^2.0.3" - - jest-mock@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.2.1.tgz#a0d361cffcb28184fa9c5443adbf591fa5759775" - integrity sha512-NDphaY/GqyQpTfnTZiTqqpMaw4Z0I7XnB7yBgrT6IwYrLGxpOhrejYr4ANY4YvO2sEGdd8Tx/6D0+WLQy7/qDA== - dependencies: - "@jest/types" "^29.2.1" - "@types/node" "*" - jest-util "^29.2.1" - - jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - - jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== - - jest-resolve-dependencies@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.2.1.tgz#8d717dd41dc615fef1d412d395ea3deccfb1b9fa" - integrity sha512-o3mUGX2j08usj1jIAIE8KmUVpqVAn54k80kI27ldbZf2oJn6eghhB6DvJxjrcH40va9CQgWTfU5f2Ag/MoUqgQ== - dependencies: - jest-regex-util "^29.2.0" - jest-snapshot "^29.2.1" - - jest-resolve@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.2.1.tgz#a4d2f76db88aeb6ec5f5453c9a40b52483d17799" - integrity sha512-1dJTW76Z9622Viq4yRcwBuEXuzGtE9B2kdl05RC8Om/lAzac9uEgC+M8Q5osVidbuBPmxm8wSrcItYhca2ZAtQ== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" - jest-pnp-resolver "^1.2.2" - jest-util "^29.2.1" - jest-validate "^29.2.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - - jest-runner@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.2.1.tgz#885afe64661cb2f51f84c1b97afb713d1093c124" - integrity sha512-PojFI+uVhQ4u4YZKCN/a3yU0/l/pJJXhq1sW3JpCp8CyvGBYGddRFPKZ1WihApusxqWRTHjBJmGyPWv6Av2lWA== - dependencies: - "@jest/console" "^29.2.1" - "@jest/environment" "^29.2.1" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.10.2" - graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.2.1" - jest-haste-map "^29.2.1" - jest-leak-detector "^29.2.1" - jest-message-util "^29.2.1" - jest-resolve "^29.2.1" - jest-runtime "^29.2.1" - jest-util "^29.2.1" - jest-watcher "^29.2.1" - jest-worker "^29.2.1" - p-limit "^3.1.0" - source-map-support "0.5.13" - - jest-runtime@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.2.1.tgz#62e3a23c33710ae4d9c3304dda851a5fb225b574" - integrity sha512-PSQ880OoIW9y8E6/jjhGn3eQNgNc6ndMzCZaKqy357bv7FqCfSyYepu3yDC6Sp1Vkt+GhP2M/PVgldS2uZSFZg== - dependencies: - "@jest/environment" "^29.2.1" - "@jest/fake-timers" "^29.2.1" - "@jest/globals" "^29.2.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.2.1" - jest-message-util "^29.2.1" - jest-mock "^29.2.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.2.1" - jest-snapshot "^29.2.1" - jest-util "^29.2.1" - slash "^3.0.0" - strip-bom "^4.0.0" - - jest-snapshot@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.2.1.tgz#f3843b3099c8fec7e6218dea18cc506f10ea5d30" - integrity sha512-KZdLD7iEz5M4ZYd+ezZ/kk73z+DtNbk/yJ4Qx7408Vb0CCuclJIZPa/HmIwSsCfIlOBNcYTKufr7x/Yv47oYlg== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.2.1" - "@jest/transform" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.2.1" - graceful-fs "^4.2.9" - jest-diff "^29.2.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.2.1" - jest-matcher-utils "^29.2.1" - jest-message-util "^29.2.1" - jest-util "^29.2.1" - natural-compare "^1.4.0" - pretty-format "^29.2.1" - semver "^7.3.5" - - jest-util@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.2.1.tgz#f26872ba0dc8cbefaba32c34f98935f6cf5fc747" - integrity sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g== - dependencies: - "@jest/types" "^29.2.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - - jest-validate@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.2.1.tgz#db814ce12c4c7e4746044922762e56eb177d066c" - integrity sha512-DZVX5msG6J6DL5vUUw+++6LEkXUsPwB5R7fsfM7BXdz2Ipr0Ib046ak+8egrwAR++pvSM/5laxLK977ieIGxkQ== - dependencies: - "@jest/types" "^29.2.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.2.0" - leven "^3.1.0" - pretty-format "^29.2.1" - - jest-watcher@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.2.1.tgz#1cb91f8aa9e77b1332af139944ad65e51430d7c3" - integrity sha512-7jFaHUaRq50l4w/f6RuY713bvI5XskMmjWCE54NGYcY74fLkShS8LucXJke1QfGnwDSCoIqGnGGGKPwdaBYz2Q== - dependencies: - "@jest/test-result" "^29.2.1" - "@jest/types" "^29.2.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^29.2.1" - string-length "^4.0.1" - - jest-worker@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.2.1.tgz#8ba68255438252e1674f990f0180c54dfa26a3b1" - integrity sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg== - dependencies: - "@types/node" "*" - jest-util "^29.2.1" - merge-stream "^2.0.0" - supports-color "^8.0.0" - - jest@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.2.1.tgz#352ec0b81a0e436691d546d984cd7d8f72ffd26a" - integrity sha512-K0N+7rx+fv3Us3KhuwRSJt55MMpZPs9Q3WSO/spRZSnsalX8yEYOTQ1PiSN7OvqzoRX4JEUXCbOJRlP4n8m5LA== - dependencies: - "@jest/core" "^29.2.1" - "@jest/types" "^29.2.1" - import-local "^3.0.2" - jest-cli "^29.2.1" - - 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-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - - js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - - jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - - json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - - json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - - json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - - jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - - kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - - leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - - lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - - locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.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== - - 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" - - lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - - make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - - makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - - merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - - micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - - mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - - minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - - 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== - - natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - - 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-fetch@2: - 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.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== - - node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - - node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - - 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== - - npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - - once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - - onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - - p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - - p-limit@^3.1.0: - 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@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - - p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - - parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - - path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - - path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - - path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - - path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - - picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - - picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - - pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - - pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - - prettier@^2.5.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - - pretty-format@^29.2.1: - version "29.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.2.1.tgz#86e7748fe8bbc96a6a4e04fa99172630907a9611" - integrity sha512-Y41Sa4aLCtKAXvwuIpTvcFBkyeYp2gdFWzXGA+ZNES3VwURIB165XO/z7CjETwzCCS53MjW/rLMyyqEnTtaOfA== - dependencies: - "@jest/schemas" "^29.0.0" - ansi-styles "^5.0.0" - react-is "^18.0.0" - - prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - - react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - - regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - - require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - - resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - - resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - - resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - - resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - - rpc-websockets@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748" - integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ== - dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - - safe-buffer@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - - semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - - semver@^7.3.5, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - - shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - - shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - - signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - - sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - - slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - - 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.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - - source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - - spok@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/spok/-/spok-1.4.3.tgz#8516234e6bd8caf0e10567bd675e15fd03b5ceb8" - integrity sha512-5wFGctwrk638aDs+44u99kohxFNByUq2wo0uShQ9yqxSmsxqx7zKbMo1Busy4s7stZQXU+PhJ/BlVf2XWFEGIw== - dependencies: - ansicolors "~0.3.2" - - sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - - stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - - string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - 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@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - - strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - - 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@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.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" - - supports-color@^8.0.0: - 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-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - - test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - - 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== - - text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - - "through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - - tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - - to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - - 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 sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - - tslib@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - - type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - - type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - - update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - - utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== - dependencies: - node-gyp-build "^4.3.0" - - 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== - - v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - - walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - - webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - - whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - - which@^2.0.1: - 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" - - wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - - wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - - write-file-atomic@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - - ws@^7.4.5: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - - ws@^8.5.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" - integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== - - 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== - - yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - - yargs-parser@^21.0.0: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - - yargs@^17.3.1: - version "17.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" - integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - - 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== diff --git a/sdk/tests/mint.ts b/tests/mint.ts similarity index 100% rename from sdk/tests/mint.ts rename to tests/mint.ts diff --git a/sdk/tests/mintInit.test.ts b/tests/mintInit.test.ts similarity index 99% rename from sdk/tests/mintInit.test.ts rename to tests/mintInit.test.ts index a693550c..a312685e 100644 --- a/sdk/tests/mintInit.test.ts +++ b/tests/mintInit.test.ts @@ -9,7 +9,7 @@ import { findRulesetId, Ruleset, createInitMintInstruction, -} from "../src"; +} from "../sdk"; import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, diff --git a/sdk/tests/mintManagerInit.test.ts b/tests/mintManagerInit.test.ts similarity index 99% rename from sdk/tests/mintManagerInit.test.ts rename to tests/mintManagerInit.test.ts index 3bbcdf8c..10db03e9 100644 --- a/sdk/tests/mintManagerInit.test.ts +++ b/tests/mintManagerInit.test.ts @@ -10,7 +10,7 @@ import { createInitRulesetInstruction, findRulesetId, Ruleset, -} from "../src"; +} from "../sdk"; import { createMintTx } from "./mint"; let mint: PublicKey; diff --git a/sdk/tests/mintManagerInitUpdate.test.ts b/tests/mintManagerInitUpdate.test.ts similarity index 99% rename from sdk/tests/mintManagerInitUpdate.test.ts rename to tests/mintManagerInitUpdate.test.ts index 239f3fb8..0b3ef918 100644 --- a/sdk/tests/mintManagerInitUpdate.test.ts +++ b/tests/mintManagerInitUpdate.test.ts @@ -11,7 +11,7 @@ import { findRulesetId, Ruleset, createUpdateMintManagerInstruction, -} from "../src"; +} from "../sdk"; import { createMintTx } from "./mint"; let mint: PublicKey; diff --git a/sdk/tests/rulesetInitUpdate.test.ts b/tests/rulesetInitUpdate.test.ts similarity index 99% rename from sdk/tests/rulesetInitUpdate.test.ts rename to tests/rulesetInitUpdate.test.ts index db988f9d..e4f71211 100644 --- a/sdk/tests/rulesetInitUpdate.test.ts +++ b/tests/rulesetInitUpdate.test.ts @@ -7,7 +7,7 @@ import { findRulesetId, Ruleset, createUpdateRulesetInstruction, -} from "../src"; +} from "../sdk"; const RULESET_NAME = `global-${Math.random()}`; const RULESET_ID = findRulesetId(RULESET_NAME); diff --git a/sdk/tests/test-keypairs/cardinal_creator_standard-keypair.json b/tests/test-keypairs/cardinal_creator_standard-keypair.json similarity index 100% rename from sdk/tests/test-keypairs/cardinal_creator_standard-keypair.json rename to tests/test-keypairs/cardinal_creator_standard-keypair.json diff --git a/sdk/tests/test-keypairs/t1LVbNwJZT3pxFQHfY65jp6QbvcTvda6oPSbaeKbYEs.json b/tests/test-keypairs/t1LVbNwJZT3pxFQHfY65jp6QbvcTvda6oPSbaeKbYEs.json similarity index 100% rename from sdk/tests/test-keypairs/t1LVbNwJZT3pxFQHfY65jp6QbvcTvda6oPSbaeKbYEs.json rename to tests/test-keypairs/t1LVbNwJZT3pxFQHfY65jp6QbvcTvda6oPSbaeKbYEs.json diff --git a/sdk/tests/test-keypairs/test-key.json b/tests/test-keypairs/test-key.json similarity index 100% rename from sdk/tests/test-keypairs/test-key.json rename to tests/test-keypairs/test-key.json diff --git a/sdk/tests/utils.ts b/tests/utils.ts similarity index 94% rename from sdk/tests/utils.ts rename to tests/utils.ts index ccce61a9..6bfbbdc6 100644 --- a/sdk/tests/utils.ts +++ b/tests/utils.ts @@ -6,10 +6,10 @@ import { Signer, } from "@solana/web3.js"; import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; -import { PROGRAM_ADDRESS } from "../src/generated"; +import { PROGRAM_ADDRESS } from "../sdk/generated"; import { utils, Wallet } from "@project-serum/anchor"; -import { parseProgramLogs } from "../src/errors/parseTransactionLogs"; -import { formatInstructionLogsForConsole } from "../src/errors/formatLogs"; +import { parseProgramLogs } from "../sdk/errors/parseTransactionLogs"; +import { formatInstructionLogsForConsole } from "../sdk/errors/formatLogs"; export async function newAccountWithLamports( connection: Connection, diff --git a/sdk/tsconfig.cjs.json b/tsconfig.cjs.json similarity index 100% rename from sdk/tsconfig.cjs.json rename to tsconfig.cjs.json diff --git a/sdk/tsconfig.esm.json b/tsconfig.esm.json similarity index 100% rename from sdk/tsconfig.esm.json rename to tsconfig.esm.json diff --git a/sdk/tsconfig.json b/tsconfig.json similarity index 100% rename from sdk/tsconfig.json rename to tsconfig.json diff --git a/sdk/yarn.lock b/yarn.lock similarity index 100% rename from sdk/yarn.lock rename to yarn.lock From 2c8e3b7a42576710ed17d0ccafeba9156e45bbb3 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Mon, 24 Oct 2022 14:24:05 -0400 Subject: [PATCH 25/37] Fix build --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 507de200..a5fc8b0c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -116,12 +116,12 @@ jobs: - name: Setup run: mkdir -p target/deploy - name: build - run: anchor buld + run: anchor build - name: Run local validator run: solana-test-validator --url https://api.devnet.solana.com --clone metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s --clone PwDiXFxQsGra4sFFTT8r1QWRMd4vfumiWC1jfWNfdYT --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./target/deploy/cardinal_creator_standard.so --reset & echo $$! > validator.PID - run: sleep 6 - - run: solana airdrop 1000 $(solana-keygen pubkey tests/test-key.json) --url http://localhost:8899 + - run: solana airdrop 1000 $(solana-keygen pubkey tests/test-keypairs/test-key.json) --url http://localhost:8899 - run: yarn test # - uses: dorny/test-reporter@v1 From 3bd114bca7811fbc2532a9573c4167c783dd2730 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 04:30:08 +0000 Subject: [PATCH 26/37] Approve and revoke tests --- .eslintrc.js | 52 +++++ .eslintrc.json | 18 -- Makefile | 1 - .../mint_manager/init_mint_manager.rs | 29 ++- .../src/instructions/token/approve.rs | 2 +- .../src/instructions/token/init_mint.rs | 11 +- .../src/instructions/token/revoke.rs | 2 +- .../src/instructions/token/transfer.rs | 9 +- sdk/cardinal_creator_standard.json | 10 +- sdk/generated/instructions/initMintManager.ts | 7 + sdk/generated/instructions/transfer.ts | 6 - sdk/idl/cardinal_creator_standard.ts | 20 +- tests/approve.test.ts | 189 ++++++++++++++++++ tests/mintInit.test.ts | 4 + tests/mintManagerInit.test.ts | 3 + tests/mintManagerInitUpdate.test.ts | 3 + tests/revoke.test.ts | 165 +++++++++++++++ tests/transfer.test.ts | 146 ++++++++++++++ tests/utils.ts | 17 +- 19 files changed, 637 insertions(+), 57 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 .eslintrc.json create mode 100644 tests/approve.test.ts create mode 100644 tests/revoke.test.ts create mode 100644 tests/transfer.test.ts diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..50b2eb30 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,52 @@ +module.exports = { + root: true, + ignorePatterns: ["dist/", "*.js"], + parser: "@typescript-eslint/parser", + plugins: ["simple-import-sort", "import", "unused-imports"], + parserOptions: { + tsconfigRootDir: __dirname, + project: "tsconfig.json", + }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:prettier/recommended", + ], + env: { + node: true, + }, + rules: { + eqeqeq: "error", + "@typescript-eslint/explicit-member-accessibility": [ + "error", + { accessibility: "no-public" }, + ], + "import/order": "off", + "simple-import-sort/imports": "warn", + "simple-import-sort/exports": "warn", + "import/first": "warn", + "import/newline-after-import": "warn", + "import/no-duplicates": "warn", + "unused-imports/no-unused-imports": "error", + "@typescript-eslint/consistent-type-imports": "error", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + vars: "all", + varsIgnorePattern: "^_", + args: "after-used", + argsIgnorePattern: "^_", + }, + ], + "@typescript-eslint/naming-convention": [ + "error", + { + selector: "memberLike", + modifiers: ["private"], + format: ["camelCase"], + leadingUnderscore: "require", + }, + ], + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index a868a0d3..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "plugins": ["jest", "@typescript-eslint"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "rules": {}, - "env": { - "node": true, - "es6": true, - "jest/globals": true - } -} diff --git a/Makefile b/Makefile index 3c5fd8c9..72f48ad2 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,6 @@ build: yarn idl:generate && yarn solita start: - pkill solana-test-validator || true solana-test-validator --url https://api.mainnet-beta.solana.com \ --clone metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s --clone PwDiXFxQsGra4sFFTT8r1QWRMd4vfumiWC1jfWNfdYT \ --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./target/deploy/cardinal_creator_standard.so \ diff --git a/programs/cardinal-creator-standard/src/instructions/mint_manager/init_mint_manager.rs b/programs/cardinal-creator-standard/src/instructions/mint_manager/init_mint_manager.rs index 9c10b884..f120cc83 100644 --- a/programs/cardinal-creator-standard/src/instructions/mint_manager/init_mint_manager.rs +++ b/programs/cardinal-creator-standard/src/instructions/mint_manager/init_mint_manager.rs @@ -1,9 +1,11 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; +use anchor_spl::token::FreezeAccount; use anchor_spl::token::Mint; use anchor_spl::token::SetAuthority; use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; use anchor_spl::token::{self}; use solana_program::program::invoke; use solana_program::system_instruction::transfer; @@ -18,10 +20,14 @@ pub struct InitMintManagerCtx<'info> { seeds = [MINT_MANAGER_SEED.as_bytes(), mint.key().as_ref()], bump, )] - mint_manager: Account<'info, MintManager>, + mint_manager: Box<Account<'info, MintManager>>, #[account(mut)] - mint: Account<'info, Mint>, - ruleset: Account<'info, Ruleset>, + mint: Box<Account<'info, Mint>>, + ruleset: Box<Account<'info, Ruleset>>, + + /// CHECK: Account is not read from + #[account(mut, constraint = holder_token_account.mint == mint.key() @ ErrorCode::InvalidHolderTokenAccount)] + holder_token_account: Box<Account<'info, TokenAccount>>, /// CHECK: Account is not read from #[account(mut, constraint = collector.key() == ruleset.collector @ ErrorCode::InvalidCollector)] @@ -70,6 +76,23 @@ pub fn handler(ctx: Context<InitMintManagerCtx>) -> Result<()> { Some(ctx.accounts.mint_manager.key()), )?; + // freeze holder token account + let mint_manager_key = ctx.accounts.mint.key(); + let mint_manager_seeds = &[ + MINT_MANAGER_SEED.as_bytes(), + mint_manager_key.as_ref(), + &[ctx.accounts.mint_manager.bump], + ]; + let mint_manager_signer = &[&mint_manager_seeds[..]]; + let cpi_accounts = FreezeAccount { + account: ctx.accounts.holder_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::freeze_account(cpi_context)?; + // creation invoke( &transfer( diff --git a/programs/cardinal-creator-standard/src/instructions/token/approve.rs b/programs/cardinal-creator-standard/src/instructions/token/approve.rs index 8eb50008..267d6c02 100644 --- a/programs/cardinal-creator-standard/src/instructions/token/approve.rs +++ b/programs/cardinal-creator-standard/src/instructions/token/approve.rs @@ -19,7 +19,7 @@ pub struct ApproveCtx<'info> { #[account(mut, constraint = holder_token_account.owner == holder.key() && holder_token_account.mint == mint_manager.mint - && holder_token_account.amount > 1 + && holder_token_account.amount == 1 && holder_token_account.delegate.is_none() @ ErrorCode::InvalidHolderTokenAccount )] diff --git a/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs b/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs index 1f1e4812..2fb27fc2 100644 --- a/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs +++ b/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs @@ -4,9 +4,9 @@ use anchor_lang::prelude::*; use anchor_lang::solana_program::program::invoke; use anchor_spl::associated_token::AssociatedToken; use anchor_spl::associated_token::{self}; -use anchor_spl::token::MintTo; use anchor_spl::token::Token; use anchor_spl::token::{self}; +use anchor_spl::token::{FreezeAccount, MintTo}; use solana_program::program_pack::Pack; use solana_program::system_instruction::create_account; use solana_program::system_instruction::transfer; @@ -137,5 +137,14 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { ctx.accounts.system_program.to_account_info(), ], )?; + + let cpi_accounts = FreezeAccount { + account: ctx.accounts.target_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::freeze_account(cpi_context)?; Ok(()) } diff --git a/programs/cardinal-creator-standard/src/instructions/token/revoke.rs b/programs/cardinal-creator-standard/src/instructions/token/revoke.rs index 83dba0c9..b4fe2a10 100644 --- a/programs/cardinal-creator-standard/src/instructions/token/revoke.rs +++ b/programs/cardinal-creator-standard/src/instructions/token/revoke.rs @@ -20,7 +20,7 @@ pub struct RevokeCtx<'info> { #[account(mut, constraint = holder_token_account.owner == holder.key() && holder_token_account.mint == mint_manager.mint - && holder_token_account.amount > 1 + && holder_token_account.amount >= 1 && holder_token_account.delegate.is_some() @ ErrorCode::InvalidHolderTokenAccount )] diff --git a/programs/cardinal-creator-standard/src/instructions/token/transfer.rs b/programs/cardinal-creator-standard/src/instructions/token/transfer.rs index 761f3aec..d5fd5a01 100644 --- a/programs/cardinal-creator-standard/src/instructions/token/transfer.rs +++ b/programs/cardinal-creator-standard/src/instructions/token/transfer.rs @@ -31,7 +31,6 @@ pub struct TransferCtx<'info> { to: Account<'info, TokenAccount>, authority: Signer<'info>, - rent: Sysvar<'info, Rent>, token_program: Program<'info, Token>, system_program: Program<'info, System>, /// CHECK: This is not dangerous because the ID is checked with instructions sysvar @@ -52,6 +51,9 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { let first_ix = load_instruction_at_checked(0, &instructions_account_info) .expect("Failed to get first instruction"); let data: &[u8] = &first_ix.data; + if data.is_empty() { + return Err(error!(ErrorCode::InvalidPreTransferInstruction)); + } let disc_bytes = array_ref![data, 0, 8]; // check first account is account balances for this mint let mint = ctx.accounts.mint_manager.mint; @@ -75,6 +77,9 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { } // check instruction let data: &[u8] = &last_ix.data; + if data.is_empty() { + return Err(error!(ErrorCode::InvalidPostTransferInstruction)); + } let disc_bytes = array_ref![data, 0, 8]; if last_ix.program_id != *ctx.program_id || disc_bytes != &POST_TRANSFER_DISCRIMINATOR { return Err(error!(ErrorCode::InvalidPostTransferInstruction)); @@ -124,6 +129,8 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); token::thaw_account(cpi_context)?; + // todo close from token account if you are the authority? + let cpi_accounts = Transfer { from: ctx.accounts.from.to_account_info(), to: ctx.accounts.to.to_account_info(), diff --git a/sdk/cardinal_creator_standard.json b/sdk/cardinal_creator_standard.json index 84047c52..24be06ef 100644 --- a/sdk/cardinal_creator_standard.json +++ b/sdk/cardinal_creator_standard.json @@ -20,6 +20,11 @@ "isMut": false, "isSigner": false }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, { "name": "collector", "isMut": true, @@ -436,11 +441,6 @@ "isMut": false, "isSigner": true }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, { "name": "tokenProgram", "isMut": false, diff --git a/sdk/generated/instructions/initMintManager.ts b/sdk/generated/instructions/initMintManager.ts index c634c693..57e03ce9 100644 --- a/sdk/generated/instructions/initMintManager.ts +++ b/sdk/generated/instructions/initMintManager.ts @@ -26,6 +26,7 @@ export const initMintManagerStruct = new beet.BeetArgsStruct<{ * @property [_writable_] mintManager * @property [_writable_] mint * @property [] ruleset + * @property [_writable_] holderTokenAccount * @property [_writable_] collector * @property [**signer**] authority * @property [_writable_, **signer**] payer @@ -37,6 +38,7 @@ export type InitMintManagerInstructionAccounts = { mintManager: web3.PublicKey mint: web3.PublicKey ruleset: web3.PublicKey + holderTokenAccount: web3.PublicKey collector: web3.PublicKey authority: web3.PublicKey payer: web3.PublicKey @@ -79,6 +81,11 @@ export function createInitMintManagerInstruction( isWritable: false, isSigner: false, }, + { + pubkey: accounts.holderTokenAccount, + isWritable: true, + isSigner: false, + }, { pubkey: accounts.collector, isWritable: true, diff --git a/sdk/generated/instructions/transfer.ts b/sdk/generated/instructions/transfer.ts index d44c8981..7ef64279 100644 --- a/sdk/generated/instructions/transfer.ts +++ b/sdk/generated/instructions/transfer.ts @@ -41,7 +41,6 @@ export type TransferInstructionAccounts = { from: web3.PublicKey to: web3.PublicKey authority: web3.PublicKey - rent?: web3.PublicKey tokenProgram?: web3.PublicKey systemProgram?: web3.PublicKey instructions: web3.PublicKey @@ -97,11 +96,6 @@ export function createTransferInstruction( isWritable: false, isSigner: true, }, - { - pubkey: accounts.rent ?? web3.SYSVAR_RENT_PUBKEY, - isWritable: false, - isSigner: false, - }, { pubkey: accounts.tokenProgram ?? splToken.TOKEN_PROGRAM_ID, isWritable: false, diff --git a/sdk/idl/cardinal_creator_standard.ts b/sdk/idl/cardinal_creator_standard.ts index 97b114e0..83547526 100644 --- a/sdk/idl/cardinal_creator_standard.ts +++ b/sdk/idl/cardinal_creator_standard.ts @@ -20,6 +20,11 @@ export type CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, { "name": "collector", "isMut": true, @@ -436,11 +441,6 @@ export type CardinalCreatorStandard = { "isMut": false, "isSigner": true }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, { "name": "tokenProgram", "isMut": false, @@ -795,6 +795,11 @@ export const IDL: CardinalCreatorStandard = { "isMut": false, "isSigner": false }, + { + "name": "holderTokenAccount", + "isMut": true, + "isSigner": false + }, { "name": "collector", "isMut": true, @@ -1211,11 +1216,6 @@ export const IDL: CardinalCreatorStandard = { "isMut": false, "isSigner": true }, - { - "name": "rent", - "isMut": false, - "isSigner": false - }, { "name": "tokenProgram", "isMut": false, diff --git a/tests/approve.test.ts b/tests/approve.test.ts new file mode 100644 index 00000000..4c07d3ef --- /dev/null +++ b/tests/approve.test.ts @@ -0,0 +1,189 @@ +import { test, expect } from "@jest/globals"; +import { + CardinalProvider, + executeTransaction, + getProvider, + newAccountWithLamports, +} from "./utils"; +import { SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import { Keypair, Transaction } from "@solana/web3.js"; + +import { + findMintManagerId, + MintManager, + createInitRulesetInstruction, + findRulesetId, + Ruleset, + createTransferInstruction, + createApproveInstruction, + createInitMintInstruction, +} from "../sdk"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + createAssociatedTokenAccountInstruction, + getAccount, + getAssociatedTokenAddressSync, +} from "@solana/spl-token"; +import { Wallet } from "@project-serum/anchor"; +const mintKeypair = Keypair.generate(); +const mint = mintKeypair.publicKey; +let delegate: Keypair; + +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; + +beforeAll(async () => { + provider = await getProvider(); + delegate = await newAccountWithLamports(provider.connection); +}); + +test("Create ruleset", async () => { + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: false, + disallowedAddresses: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(false); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Init", async () => { + const mintManagerId = findMintManagerId(mint); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + + const tx = new Transaction(); + tx.add( + createInitMintInstruction({ + mintManager: mintManagerId, + mint: mint, + ruleset: RULESET_ID, + targetTokenAccount: getAssociatedTokenAddressSync( + mintKeypair.publicKey, + provider.wallet.publicKey + ), + target: provider.wallet.publicKey, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: ruleset.collector, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet, [ + mintKeypair, + ]); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME).toString() + ); +}); + +test("Delegate", async () => { + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + const fromAtaId = getAssociatedTokenAddressSync( + mint, + provider.wallet.publicKey + ); + const fromAta = await getAccount(provider.connection, fromAtaId); + expect(fromAta.isFrozen).toBe(true); + expect(fromAta.mint.toString()).toBe(mint.toString()); + expect(fromAta.amount.toString()).toBe("1"); + + tx.add( + createApproveInstruction({ + mintManager: mintManagerId, + mint: mint, + holderTokenAccount: fromAtaId, + holder: provider.wallet.publicKey, + delegate: delegate.publicKey, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + + const fromAtaCheck = await getAccount(provider.connection, fromAtaId); + expect(fromAtaCheck.isFrozen).toBe(true); + expect(fromAtaCheck.mint.toString()).toBe(mint.toString()); + expect(fromAtaCheck.amount.toString()).toBe("1"); + expect(fromAtaCheck.delegate?.toString()).toBe(delegate.publicKey.toString()); + expect(fromAtaCheck.delegatedAmount.toString()).toBe("1"); +}); + +test("Transfer", async () => { + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + const recipient = Keypair.generate(); + const fromAtaId = getAssociatedTokenAddressSync( + mint, + provider.wallet.publicKey + ); + const toAtaId = getAssociatedTokenAddressSync(mint, recipient.publicKey); + const fromAta = await getAccount(provider.connection, fromAtaId); + + expect(fromAta.isFrozen).toBe(true); + expect(fromAta.mint.toString()).toBe(mint.toString()); + expect(fromAta.amount.toString()).toBe("1"); + + tx.add( + createAssociatedTokenAccountInstruction( + delegate.publicKey, + toAtaId, + recipient.publicKey, + mint + ), + createTransferInstruction({ + mintManager: mintManagerId, + ruleset: RULESET_ID, + mint: mint, + from: fromAtaId, + to: toAtaId, + authority: delegate.publicKey, + instructions: SYSVAR_INSTRUCTIONS_PUBKEY, + }) + ); + await executeTransaction(provider.connection, tx, new Wallet(delegate)); + + const fromAtaCheck = await getAccount(provider.connection, fromAtaId); + expect(fromAtaCheck.isFrozen).toBe(false); + expect(fromAtaCheck.mint.toString()).toBe(mint.toString()); + expect(fromAtaCheck.amount.toString()).toBe("0"); + + const toAtaCheck = await getAccount(provider.connection, toAtaId); + expect(toAtaCheck.isFrozen).toBe(true); + expect(toAtaCheck.mint.toString()).toBe(mint.toString()); + expect(toAtaCheck.amount.toString()).toBe("1"); +}); diff --git a/tests/mintInit.test.ts b/tests/mintInit.test.ts index a312685e..28f68df7 100644 --- a/tests/mintInit.test.ts +++ b/tests/mintInit.test.ts @@ -19,6 +19,10 @@ const RULESET_NAME = `global-${Math.random()}`; const RULESET_ID = findRulesetId(RULESET_NAME); let provider: CardinalProvider; +beforeAll(async () => { + provider = await getProvider(); +}); + test("Create ruleset", async () => { provider = await getProvider(); const tx = new Transaction(); diff --git a/tests/mintManagerInit.test.ts b/tests/mintManagerInit.test.ts index 10db03e9..229250bf 100644 --- a/tests/mintManagerInit.test.ts +++ b/tests/mintManagerInit.test.ts @@ -12,6 +12,7 @@ import { Ruleset, } from "../sdk"; import { createMintTx } from "./mint"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; let mint: PublicKey; const RULESET_NAME = `global-${Math.random()}`; @@ -71,11 +72,13 @@ test("Init", async () => { RULESET_ID ); + const ata = getAssociatedTokenAddressSync(mint, provider.wallet.publicKey); tx.add( createInitMintManagerInstruction({ mint: mint, mintManager: mintManagerId, authority: provider.wallet.publicKey, + holderTokenAccount: ata, payer: provider.wallet.publicKey, collector: ruleset.collector, ruleset: RULESET_ID, diff --git a/tests/mintManagerInitUpdate.test.ts b/tests/mintManagerInitUpdate.test.ts index 0b3ef918..0fbcf852 100644 --- a/tests/mintManagerInitUpdate.test.ts +++ b/tests/mintManagerInitUpdate.test.ts @@ -13,6 +13,7 @@ import { createUpdateMintManagerInstruction, } from "../sdk"; import { createMintTx } from "./mint"; +import { getAssociatedTokenAddressSync } from "@solana/spl-token"; let mint: PublicKey; const RULESET_NAME = `global-${Math.random()}`; @@ -106,11 +107,13 @@ test("Init mint manager", async () => { RULESET_ID ); + const ata = getAssociatedTokenAddressSync(mint, provider.wallet.publicKey); tx.add( createInitMintManagerInstruction({ mint: mint, mintManager: mintManagerId, authority: provider.wallet.publicKey, + holderTokenAccount: ata, payer: provider.wallet.publicKey, collector: ruleset.collector, ruleset: RULESET_ID, diff --git a/tests/revoke.test.ts b/tests/revoke.test.ts new file mode 100644 index 00000000..2fc7b784 --- /dev/null +++ b/tests/revoke.test.ts @@ -0,0 +1,165 @@ +import { test, expect } from "@jest/globals"; +import { CardinalProvider, executeTransaction, getProvider } from "./utils"; +import { Keypair, Transaction } from "@solana/web3.js"; + +import { + findMintManagerId, + MintManager, + createInitRulesetInstruction, + findRulesetId, + Ruleset, + createApproveInstruction, + createRevokeInstruction, + createInitMintInstruction, +} from "../sdk"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + createAssociatedTokenAccountInstruction, + getAccount, + getAssociatedTokenAddressSync, +} from "@solana/spl-token"; +import { Wallet } from "@project-serum/anchor"; +const mintKeypair = Keypair.generate(); +const mint = mintKeypair.publicKey; +let delegate: Keypair; + +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; + +beforeAll(async () => { + provider = await getProvider(); +}); + +test("Create ruleset", async () => { + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: true, + disallowedAddresses: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(true); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Init", async () => { + const mintManagerId = findMintManagerId(mint); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + + const tx = new Transaction(); + tx.add( + createInitMintInstruction({ + mintManager: mintManagerId, + mint: mint, + ruleset: RULESET_ID, + targetTokenAccount: getAssociatedTokenAddressSync( + mintKeypair.publicKey, + provider.wallet.publicKey + ), + target: provider.wallet.publicKey, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: ruleset.collector, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet, [ + mintKeypair, + ]); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME).toString() + ); +}); + +test("Delegate", async () => { + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + delegate = Keypair.generate(); + const fromAtaId = getAssociatedTokenAddressSync( + mint, + provider.wallet.publicKey + ); + const fromAta = await getAccount(provider.connection, fromAtaId); + expect(fromAta.isFrozen).toBe(true); + expect(fromAta.mint.toString()).toBe(mint.toString()); + expect(fromAta.amount.toString()).toBe("1"); + tx.add( + createApproveInstruction({ + mintManager: mintManagerId, + mint: mint, + holderTokenAccount: fromAtaId, + holder: provider.wallet.publicKey, + delegate: delegate.publicKey, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const fromAtaCheck = await getAccount(provider.connection, fromAtaId); + expect(fromAtaCheck.isFrozen).toBe(true); + expect(fromAtaCheck.mint.toString()).toBe(mint.toString()); + expect(fromAtaCheck.amount.toString()).toBe("1"); + expect(fromAtaCheck.delegate?.toString()).toBe(delegate.publicKey.toString()); + expect(fromAtaCheck.delegatedAmount.toString()).toBe("1"); +}); + +test("Revoke", async () => { + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + const fromAtaId = getAssociatedTokenAddressSync( + mint, + provider.wallet.publicKey + ); + const fromAta = await getAccount(provider.connection, fromAtaId); + expect(fromAta.isFrozen).toBe(true); + expect(fromAta.mint.toString()).toBe(mint.toString()); + expect(fromAta.amount.toString()).toBe("1"); + expect(fromAta.delegate?.toString()).toBe(delegate.publicKey.toString()); + expect(fromAta.delegatedAmount.toString()).toBe("1"); + tx.add( + createRevokeInstruction({ + mintManager: mintManagerId, + mint: mint, + holderTokenAccount: fromAtaId, + holder: provider.wallet.publicKey, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const fromAtaCheck = await getAccount(provider.connection, fromAtaId); + expect(fromAtaCheck.isFrozen).toBe(true); + expect(fromAtaCheck.mint.toString()).toBe(mint.toString()); + expect(fromAtaCheck.amount.toString()).toBe("1"); + expect(fromAtaCheck.delegate).toBe(null); +}); diff --git a/tests/transfer.test.ts b/tests/transfer.test.ts new file mode 100644 index 00000000..d5341d2d --- /dev/null +++ b/tests/transfer.test.ts @@ -0,0 +1,146 @@ +import { test, expect } from "@jest/globals"; +import { CardinalProvider, executeTransaction, getProvider } from "./utils"; +import { SYSVAR_INSTRUCTIONS_PUBKEY } from "@solana/web3.js"; +import { Keypair, Transaction } from "@solana/web3.js"; + +import { + findMintManagerId, + MintManager, + createInitRulesetInstruction, + findRulesetId, + Ruleset, + createTransferInstruction, + createInitMintInstruction, +} from "../sdk"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + createAssociatedTokenAccountInstruction, + getAccount, + getAssociatedTokenAddressSync, +} from "@solana/spl-token"; +const mintKeypair = Keypair.generate(); +const mint = mintKeypair.publicKey; + +const RULESET_NAME = `global-${Math.random()}`; +const RULESET_ID = findRulesetId(RULESET_NAME); +let provider: CardinalProvider; + +beforeAll(async () => { + provider = await getProvider(); +}); + +test("Create ruleset", async () => { + const tx = new Transaction(); + tx.add( + createInitRulesetInstruction( + { + ruleset: RULESET_ID, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + }, + { + ix: { + name: RULESET_NAME, + collector: provider.wallet.publicKey, + checkSellerFeeBasisPoints: false, + disallowedAddresses: [], + allowedPrograms: [], + }, + } + ) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + expect(ruleset.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(ruleset.checkSellerFeeBasisPoints).toBe(false); + expect(ruleset.disallowedAddresses.length).toBe(0); + expect(ruleset.allowedPrograms.length).toBe(0); +}); + +test("Init", async () => { + const mintManagerId = findMintManagerId(mint); + const ruleset = await Ruleset.fromAccountAddress( + provider.connection, + RULESET_ID + ); + + const tx = new Transaction(); + tx.add( + createInitMintInstruction({ + mintManager: mintManagerId, + mint: mint, + ruleset: RULESET_ID, + targetTokenAccount: getAssociatedTokenAddressSync( + mintKeypair.publicKey, + provider.wallet.publicKey + ), + target: provider.wallet.publicKey, + authority: provider.wallet.publicKey, + payer: provider.wallet.publicKey, + collector: ruleset.collector, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet, [ + mintKeypair, + ]); + + const mintManager = await MintManager.fromAccountAddress( + provider.connection, + mintManagerId + ); + expect(mintManager.mint.toString()).toBe(mint.toString()); + expect(mintManager.authority.toString()).toBe( + provider.wallet.publicKey.toString() + ); + expect(mintManager.ruleset.toString()).toBe( + findRulesetId(RULESET_NAME).toString() + ); +}); + +test("Transfer", async () => { + const mintManagerId = findMintManagerId(mint); + const tx = new Transaction(); + const recipient = Keypair.generate(); + const fromAtaId = getAssociatedTokenAddressSync( + mint, + provider.wallet.publicKey + ); + const toAtaId = getAssociatedTokenAddressSync(mint, recipient.publicKey); + const fromAta = await getAccount(provider.connection, fromAtaId); + expect(fromAta.isFrozen).toBe(true); + expect(fromAta.mint.toString()).toBe(mint.toString()); + expect(fromAta.amount.toString()).toBe("1"); + tx.add( + createAssociatedTokenAccountInstruction( + provider.wallet.publicKey, + toAtaId, + recipient.publicKey, + mint + ), + createTransferInstruction({ + mintManager: mintManagerId, + ruleset: RULESET_ID, + mint: mint, + from: fromAtaId, + to: toAtaId, + authority: provider.wallet.publicKey, + instructions: SYSVAR_INSTRUCTIONS_PUBKEY, + }) + ); + await executeTransaction(provider.connection, tx, provider.wallet); + const fromAtaCheck = await getAccount(provider.connection, fromAtaId); + expect(fromAtaCheck.isFrozen).toBe(false); + expect(fromAtaCheck.mint.toString()).toBe(mint.toString()); + expect(fromAtaCheck.amount.toString()).toBe("0"); + + const toAtaCheck = await getAccount(provider.connection, toAtaId); + expect(toAtaCheck.isFrozen).toBe(true); + expect(toAtaCheck.mint.toString()).toBe(mint.toString()); + expect(toAtaCheck.amount.toString()).toBe("1"); +}); diff --git a/tests/utils.ts b/tests/utils.ts index 6bfbbdc6..6d932ee4 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -21,7 +21,7 @@ export async function newAccountWithLamports( account.publicKey, lamports ); - await connection.confirmTransaction(signature); + await connection.confirmTransaction(signature, "confirmed"); return account; } @@ -111,16 +111,13 @@ export const keypairFrom = (s: string, n?: string): Keypair => { export const handleError = (e: any) => { const message = (e as SendTransactionError).message ?? ""; - const logs = - (e as SendTransactionError).logs ?? [ - (e as SendTransactionError).message ?? "", - ] ?? [(e as Error).toString()] ?? - []; + const logs = (e as SendTransactionError).logs; if (logs) { - const parsed = parseProgramLogs(logs, message); - const fmt = formatInstructionLogsForConsole(parsed); - console.log(fmt); + console.log(logs); + // const parsed = parseProgramLogs(logs, message); + // const fmt = formatInstructionLogsForConsole(parsed); + // console.log(fmt); } else { - console.log(e); + console.log(e, message); } }; From f383b4bc3122c756ebb473dca734e60cf37f77c0 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 17:14:24 +0000 Subject: [PATCH 27/37] Close token account on transfer, nightly fmt --- .github/workflows/deps.yml | 43 ------------------- .github/workflows/test.yml | 2 +- .../src/instructions/ruleset/init_ruleset.rs | 2 +- .../src/instructions/token/init_mint.rs | 21 ++++----- .../src/instructions/token/transfer.rs | 28 ++++++++++-- 5 files changed, 37 insertions(+), 59 deletions(-) delete mode 100644 .github/workflows/deps.yml diff --git a/.github/workflows/deps.yml b/.github/workflows/deps.yml deleted file mode 100644 index 13729ddc..00000000 --- a/.github/workflows/deps.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Deps - -on: - workflow_dispatch: {} - -env: - CARGO_TERM_COLOR: always - SOLANA_VERSION: 1.10.30 - RUST_TOOLCHAIN: nightly - NPM_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} - ANCHOR_GIT: https://github.com/project-serum/anchor - ANCHOR_VERSION: 0.24.2 - -jobs: - test: - runs-on: ubuntu-latest - name: Build deps and cache - steps: - - uses: actions/checkout@v3 - - uses: ./.github/actions/install-linux-build-deps - - name: Install Rust nightly - uses: actions-rs/toolchain@v1 - with: - override: true - profile: minimal - toolchain: ${{ env.RUST_TOOLCHAIN }} - - uses: ./.github/actions/install-solana - with: - solana_version: ${{ env.SOLANA_VERSION }} - - uses: ./.github/actions/install-anchor - with: - anchor_git: ${{ env.ANCHOR_GIT }} - anchor_version: ${{ env.ANCHOR_VERSION }} - - - uses: actions/cache@v2 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - ./rust/target - key: ${{ env.cache_id }}-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ env.RUSTC_HASH }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a5fc8b0c..6dbbab25 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,7 +51,7 @@ jobs: - name: Run fmt uses: actions-rs/cargo@v1 with: - command: fmt + command: +nightly fmt args: --all --manifest-path ./Cargo.toml -- --check soteria-scan: diff --git a/programs/cardinal-creator-standard/src/instructions/ruleset/init_ruleset.rs b/programs/cardinal-creator-standard/src/instructions/ruleset/init_ruleset.rs index 7f1d58bd..1a77a188 100644 --- a/programs/cardinal-creator-standard/src/instructions/ruleset/init_ruleset.rs +++ b/programs/cardinal-creator-standard/src/instructions/ruleset/init_ruleset.rs @@ -3,11 +3,11 @@ use anchor_lang::prelude::*; #[derive(AnchorSerialize, AnchorDeserialize)] pub struct InitRulesetIx { - pub check_seller_fee_basis_points: bool, pub name: String, pub collector: Pubkey, pub disallowed_addresses: Vec<Pubkey>, pub allowed_programs: Vec<Pubkey>, + pub check_seller_fee_basis_points: bool, } #[derive(Accounts)] diff --git a/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs b/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs index 2fb27fc2..02be894a 100644 --- a/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs +++ b/programs/cardinal-creator-standard/src/instructions/token/init_mint.rs @@ -4,9 +4,10 @@ use anchor_lang::prelude::*; use anchor_lang::solana_program::program::invoke; use anchor_spl::associated_token::AssociatedToken; use anchor_spl::associated_token::{self}; +use anchor_spl::token::FreezeAccount; +use anchor_spl::token::MintTo; use anchor_spl::token::Token; use anchor_spl::token::{self}; -use anchor_spl::token::{FreezeAccount, MintTo}; use solana_program::program_pack::Pack; use solana_program::system_instruction::create_account; use solana_program::system_instruction::transfer; @@ -125,6 +126,15 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); token::mint_to(cpi_context, 1)?; + let cpi_accounts = FreezeAccount { + account: ctx.accounts.target_token_account.to_account_info(), + mint: ctx.accounts.mint.to_account_info(), + authority: ctx.accounts.mint_manager.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); + token::freeze_account(cpi_context)?; + invoke( &transfer( &ctx.accounts.payer.key(), @@ -137,14 +147,5 @@ pub fn handler(ctx: Context<InitMintCtx>) -> Result<()> { ctx.accounts.system_program.to_account_info(), ], )?; - - let cpi_accounts = FreezeAccount { - account: ctx.accounts.target_token_account.to_account_info(), - mint: ctx.accounts.mint.to_account_info(), - authority: ctx.accounts.mint_manager.to_account_info(), - }; - let cpi_program = ctx.accounts.token_program.to_account_info(); - let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); - token::freeze_account(cpi_context)?; Ok(()) } diff --git a/programs/cardinal-creator-standard/src/instructions/token/transfer.rs b/programs/cardinal-creator-standard/src/instructions/token/transfer.rs index d5fd5a01..6c5b53bf 100644 --- a/programs/cardinal-creator-standard/src/instructions/token/transfer.rs +++ b/programs/cardinal-creator-standard/src/instructions/token/transfer.rs @@ -1,6 +1,7 @@ use crate::errors::ErrorCode; use crate::state::*; use anchor_lang::prelude::*; +use anchor_spl::token::CloseAccount; use anchor_spl::token::FreezeAccount; use anchor_spl::token::Mint; use anchor_spl::token::ThawAccount; @@ -45,7 +46,7 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { let num_instructions = read_u16(&mut current, &instruction_sysvar).expect("Invalid instruction"); - // check pre/post + /////////////// check pre/post /////////////// if ctx.accounts.ruleset.check_seller_fee_basis_points { // check pre_transfer let first_ix = load_instruction_at_checked(0, &instructions_account_info) @@ -86,7 +87,7 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { } } - // check allowed / disallowed + /////////////// check allowed / disallowed /////////////// let mut allowed_programs = HashSet::new(); for program_id in &ctx.accounts.ruleset.allowed_programs { allowed_programs.insert(program_id); @@ -111,6 +112,7 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { } } } + //////////////////////////////////////////////////////////// let mint = ctx.accounts.mint.key(); let mint_manager_seeds = &[ @@ -129,8 +131,6 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); token::thaw_account(cpi_context)?; - // todo close from token account if you are the authority? - let cpi_accounts = Transfer { from: ctx.accounts.from.to_account_info(), to: ctx.accounts.to.to_account_info(), @@ -148,5 +148,25 @@ pub fn handler(ctx: Context<TransferCtx>) -> Result<()> { let cpi_program = ctx.accounts.token_program.to_account_info(); let cpi_context = CpiContext::new(cpi_program, cpi_accounts).with_signer(mint_manager_signer); token::freeze_account(cpi_context)?; + + // close from token account + if ctx.accounts.authority.key() == ctx.accounts.from.owner + || ctx.accounts.from.close_authority.is_some() + && ctx.accounts.authority.key() + == ctx + .accounts + .from + .close_authority + .expect("Invalid close authority") + { + let cpi_accounts = CloseAccount { + account: ctx.accounts.from.to_account_info(), + destination: ctx.accounts.authority.to_account_info(), + authority: ctx.accounts.authority.to_account_info(), + }; + let cpi_program = ctx.accounts.token_program.to_account_info(); + let cpi_context = CpiContext::new(cpi_program, cpi_accounts); + token::close_account(cpi_context)?; + } Ok(()) } From df021c8e95a43d61813ef31994d67ff87a7a842f Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 17:24:11 +0000 Subject: [PATCH 28/37] Cargo nightly in CI --- .github/workflows/test.yml | 5 +---- programs/cardinal-creator-standard/rustfmt.toml | 2 -- rustfmt.toml | 3 ++- 3 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 programs/cardinal-creator-standard/rustfmt.toml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6dbbab25..adaca3b3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,10 +49,7 @@ jobs: profile: minimal toolchain: ${{ env.RUST_TOOLCHAIN }} - name: Run fmt - uses: actions-rs/cargo@v1 - with: - command: +nightly fmt - args: --all --manifest-path ./Cargo.toml -- --check + run: cargo +nightly fmt soteria-scan: runs-on: ubuntu-latest diff --git a/programs/cardinal-creator-standard/rustfmt.toml b/programs/cardinal-creator-standard/rustfmt.toml deleted file mode 100644 index de424b95..00000000 --- a/programs/cardinal-creator-standard/rustfmt.toml +++ /dev/null @@ -1,2 +0,0 @@ -unstable_features = true -imports_granularity = "Item" diff --git a/rustfmt.toml b/rustfmt.toml index ffc467de..de424b95 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1 +1,2 @@ -max_width = 200 +unstable_features = true +imports_granularity = "Item" From 05c46c3ef5483cd61402abb1db59c4b51fd163df Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 17:27:47 +0000 Subject: [PATCH 29/37] Change order in init_ruleset --- .github/workflows/test.yml | 2 +- sdk/cardinal_creator_standard.json | 8 ++++---- sdk/generated/types/InitRulesetIx.ts | 4 ++-- sdk/idl/cardinal_creator_standard.ts | 16 ++++++++-------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index adaca3b3..d2a49b91 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -118,7 +118,7 @@ jobs: - name: Run local validator run: solana-test-validator --url https://api.devnet.solana.com --clone metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s --clone PwDiXFxQsGra4sFFTT8r1QWRMd4vfumiWC1jfWNfdYT --bpf-program creatS3mfzrTGjwuLD1Pa2HXJ1gmq6WXb4ssnwUbJez ./target/deploy/cardinal_creator_standard.so --reset & echo $$! > validator.PID - run: sleep 6 - - run: solana airdrop 1000 $(solana-keygen pubkey tests/test-keypairs/test-key.json) --url http://localhost:8899 + - run: solana airdrop 1000 $(solana-keygen pubkey ./tests/test-keypairs/test-key.json) --url http://localhost:8899 - run: yarn test # - uses: dorny/test-reporter@v1 diff --git a/sdk/cardinal_creator_standard.json b/sdk/cardinal_creator_standard.json index 24be06ef..a4aa2db3 100644 --- a/sdk/cardinal_creator_standard.json +++ b/sdk/cardinal_creator_standard.json @@ -610,10 +610,6 @@ "type": { "kind": "struct", "fields": [ - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, { "name": "name", "type": "string" @@ -633,6 +629,10 @@ "type": { "vec": "publicKey" } + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" } ] } diff --git a/sdk/generated/types/InitRulesetIx.ts b/sdk/generated/types/InitRulesetIx.ts index c427dc70..911de6a7 100644 --- a/sdk/generated/types/InitRulesetIx.ts +++ b/sdk/generated/types/InitRulesetIx.ts @@ -9,11 +9,11 @@ import * as web3 from '@solana/web3.js' import * as beet from '@metaplex-foundation/beet' import * as beetSolana from '@metaplex-foundation/beet-solana' export type InitRulesetIx = { - checkSellerFeeBasisPoints: boolean name: string collector: web3.PublicKey disallowedAddresses: web3.PublicKey[] allowedPrograms: web3.PublicKey[] + checkSellerFeeBasisPoints: boolean } /** @@ -22,11 +22,11 @@ export type InitRulesetIx = { */ export const initRulesetIxBeet = new beet.FixableBeetArgsStruct<InitRulesetIx>( [ - ['checkSellerFeeBasisPoints', beet.bool], ['name', beet.utf8String], ['collector', beetSolana.publicKey], ['disallowedAddresses', beet.array(beetSolana.publicKey)], ['allowedPrograms', beet.array(beetSolana.publicKey)], + ['checkSellerFeeBasisPoints', beet.bool], ], 'InitRulesetIx' ) diff --git a/sdk/idl/cardinal_creator_standard.ts b/sdk/idl/cardinal_creator_standard.ts index 83547526..f92b95b3 100644 --- a/sdk/idl/cardinal_creator_standard.ts +++ b/sdk/idl/cardinal_creator_standard.ts @@ -610,10 +610,6 @@ export type CardinalCreatorStandard = { "type": { "kind": "struct", "fields": [ - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, { "name": "name", "type": "string" @@ -633,6 +629,10 @@ export type CardinalCreatorStandard = { "type": { "vec": "publicKey" } + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" } ] } @@ -1385,10 +1385,6 @@ export const IDL: CardinalCreatorStandard = { "type": { "kind": "struct", "fields": [ - { - "name": "checkSellerFeeBasisPoints", - "type": "bool" - }, { "name": "name", "type": "string" @@ -1408,6 +1404,10 @@ export const IDL: CardinalCreatorStandard = { "type": { "vec": "publicKey" } + }, + { + "name": "checkSellerFeeBasisPoints", + "type": "bool" } ] } From da94dca9c0abb984023dc23638e57f64edaf54e9 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 17:40:48 +0000 Subject: [PATCH 30/37] Close tests --- tests/transfer.test.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/transfer.test.ts b/tests/transfer.test.ts index d5341d2d..6084b91c 100644 --- a/tests/transfer.test.ts +++ b/tests/transfer.test.ts @@ -134,10 +134,9 @@ test("Transfer", async () => { }) ); await executeTransaction(provider.connection, tx, provider.wallet); - const fromAtaCheck = await getAccount(provider.connection, fromAtaId); - expect(fromAtaCheck.isFrozen).toBe(false); - expect(fromAtaCheck.mint.toString()).toBe(mint.toString()); - expect(fromAtaCheck.amount.toString()).toBe("0"); + await expect(async () => { + await getAccount(provider.connection, fromAtaId); + }).rejects.toThrow(); const toAtaCheck = await getAccount(provider.connection, toAtaId); expect(toAtaCheck.isFrozen).toBe(true); From 93b948d98d32a25e40b573e0171c0363461e4118 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 17:54:19 +0000 Subject: [PATCH 31/37] Doc generation --- package.json | 5 +++-- yarn.lock | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 26571766..3f75aed9 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "cardinal-creator-standard", - "version": "1.0.0", + "version": "0.1.0", "description": "SDK for cardinal-creator-standard", "main": "index.ts", "license": "MIT", "scripts": { "test": "jest --setupFiles dotenv/config", "idl:generate": "./generate-idls.sh", - "docs:generate": "typedoc --excludePrivate --includeVersion --out site/ src/index.ts", + "docs:generate": "typedoc --excludePrivate --includeVersion --out site/ sdk/index.ts", "lint": "eslint . --ext .ts" }, "dependencies": { @@ -30,6 +30,7 @@ "jest": "^29.2.1", "lint-staged": "^13.0.3", "ts-jest": "^29.0.3", + "typedoc": "^0.23.20", "typescript": "^4.8.4" }, "lint-staged": { diff --git a/yarn.lock b/yarn.lock index e6e78278..d77b84aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1306,6 +1306,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -3056,6 +3063,11 @@ json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +jsonc-parser@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -3215,6 +3227,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -3234,6 +3251,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +marked@^4.0.19: + version "4.2.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.1.tgz#eaa32594e45b4e58c02e4d118531fd04345de3b4" + integrity sha512-VK1/jNtwqDLvPktNpL0Fdg3qoeUZhmRsuiIjPEy/lHwXW4ouLoZfO4XoWd4ClDt+hupV1VLpkZhEovjU0W/kqA== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3269,6 +3291,13 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" @@ -3718,6 +3747,15 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shiki@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.11.1.tgz#df0f719e7ab592c484d8b73ec10e215a503ab8cc" + integrity sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA== + dependencies: + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "^6.0.0" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -4051,6 +4089,16 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +typedoc@^0.23.20: + version "0.23.20" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.23.20.tgz#c6fa221762322837161932990b79416afcdc895c" + integrity sha512-nfb4Mx05ZZZXux3zPcLuc7+3TVePDW3jTdEBqXdQzJUyEILxoprgPIiTChbvci9crkqNJG9YESmfCptuh9Gn3g== + dependencies: + lunr "^2.3.9" + marked "^4.0.19" + minimatch "^5.1.0" + shiki "^0.11.1" + typescript@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" @@ -4102,6 +4150,16 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" +vscode-oniguruma@^1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" + integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== + +vscode-textmate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210" + integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ== + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" From 12aa6c77ac8df8fa8ad357c49afef4cdb7466375 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 18:13:11 +0000 Subject: [PATCH 32/37] Fix docs --- programs/cardinal-creator-standard/src/state.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/programs/cardinal-creator-standard/src/state.rs b/programs/cardinal-creator-standard/src/state.rs index c0853f3f..43fe3da5 100644 --- a/programs/cardinal-creator-standard/src/state.rs +++ b/programs/cardinal-creator-standard/src/state.rs @@ -13,6 +13,7 @@ pub struct MintManager { pub mint: Pubkey, pub authority: Pubkey, pub ruleset: Pubkey, + pub in_use_by: Pubkey, } pub const RULESET_SEED: &str = "ruleset"; From bf0f4bef81cb288f139abab753685e611bf506ef Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 18:14:10 +0000 Subject: [PATCH 33/37] Add build --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 3f75aed9..e38cb5f2 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "license": "MIT", "scripts": { "test": "jest --setupFiles dotenv/config", + "build": "rm -fr dist/ && tsc -P tsconfig.cjs.json && tsc -P tsconfig.esm.json", "idl:generate": "./generate-idls.sh", "docs:generate": "typedoc --excludePrivate --includeVersion --out site/ sdk/index.ts", "lint": "eslint . --ext .ts" From aed5c4c9eb54f74ea0aff42ab044303cc3132e6b Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 18:17:32 +0000 Subject: [PATCH 34/37] Add banner --- images/banner.png | Bin 0 -> 444475 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/banner.png diff --git a/images/banner.png b/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..6be70b35778db2361ec39a38ed420b27ba065ee2 GIT binary patch literal 444475 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ΒOq#*cNg(Q*RNQ42)Uz?wfMgArFOTns4LjMED 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⪻gSt<DLIg$!BfYlRX7C)@sn<5ESNVuHq*mi(DwYkNPU#|?r}}mDJ18) zaC7EADUO`<-o{0rf`8YWh~%b;KaQ8V4*BY8-WC1UXBGB?jM`ocREvK*7684r`>s4e zl25y@v;BBVP6|!l4;D!^RMUt(IrhPE04a6B<q+y~$ot>Pz5}wREF30#U4~~;#^>Jw zNe`jg#+%odoDt>MfHxK#p&m4_>TZoSUTrdYM8z&(J2@99VC{zIV&f2WYU{uH4J@>W z+qjf`;R(c~-<0V5FZ~rl`@^;erhdD8VB}vev(x;3DOMMCRnghpaAC@bI;`)!yu0@| ziiw<4uI0VC(t{*M_?jdYUqAr{V>~w-zfJVkGD(Wt_L>YtDlNeVaeIJKxEG68)w}44 zzLHb`ns-v4oEN79D%1N$>f|jG9vcC3d)9wUA~1<-w0FN)C_mVz!{n_qiATqPVMrAN zF#7hw)+R#l3&Yo-TH&Tv;+5@Oh85dMjyN^E(}Zd-F=Z-1TMlI`tXNF940QIenX(P* z0Yn(|rAH)I_9g4A(iMrAL4qBmUHd&+v}<mH@54$u5B5}y9NAspTe8!yP0yo@)Bi0C ziA8S|<bw$`!85iQ5%w8APR?W$8YE9>@^(~P6I$?+GN#QuTy#LT5uDu~ce<l3!1&aH zG{(X@I@#mOr&jxcg=E_3hcz&<@1v+Z;nwm!##ZhFzP_kZM{)k{wBZ7T7Od*>LVDEu z6~L-zIpj>pKXNk2Y(mm*=uaKfb0em`x@D(}*(>9mJfJX;@OQ#6W^PXee6{G?J36$S zBr{o#9rB{0+&B2y?#Im{S`j<ZCE&O4CH_X3KIW)FY?A5=@9k$%fLKz8?{nj#*jlb3 z)-hr|(8Lnc?EvyocR4e`7a*K)$=D_bOm1CPvqG3?uJ{kmXtzW4c}cGh(gfGipml;7 zhXe7-?D3%$8PP;BlNMbD%dv;_1w=zFfI5zKZQ+-cb!)HtOnm><A`FC(4(ieiv>5V{ zg1|P6wBtpL6%<8K`321lL8HG6JwSc|d~qH%&wbQWg+HSXt}O7&(UzywwLvJw6IIR4 zH$-yIWr&D<)rr@Fc3QaPTm>!clTu}kc#~rZd;e8Bkoh<M0&S&j?km%AZN3IRl}5)E zkHJb15+e#(m`pVP3l^{@E`27pxvd@Qr#64Pu*aGM+&kK=T&G0YMPgg-gTZG`UNk=S zOS1Ugf}_zx{i}rGN{JGfAV?4FDs&$m^zqb{NNL2>P2jnkQac{YAnTqrGiu{p$ai59 zxOMda@LbVR-S{=2-P)a?0qRz;Scu!CKWHr8zv9!WRy!S}4jCM*(cVL9okX^dg$DJ1 zCO!|`(UBsd&hPAyJxecLv?}=C1RYwwg)<Gl(q-5hg5v<tyaUeoCA25MJq&^xaL(`$ zy~Bs`nM6YEi&RT3ANlK+k@%S8&$Rrf=6_osl=_al?m4(Wy0~dDnbv9o<Z9=N$@g%) z%U6qV%&1<aGL<-1?p}ou=%#o_eVFUp!KeDUuJHxqQcKC?to~F4OuDE!%MlYMLwZ5R zGky`aDSY&B3#>VY#6|vK_tA#Sg}WGPEn2yjvTdJeRq<FX@r$gZ+lw3Z?%9%OoI-SQ zpHdsV-Vw`I3#)Wl_iVwZqSCl1NAsZOa}{nV)2%xC*+nwEOVLEy3M8mQeC@<bpLeHh zT&H+*P~~WBBc<7s@9LrL9h~=tC%ye~NHl-<bL$R}THO-dLRhbVRp&*L_#uXSYBP60 zr1<mzweH-|8qG{9rJN({i4s8_^i3LE(C?@<;!CdWXa(A^)P-4I4w|}}wBiehGH9Al z<c0m{sZjhfX|`l#b1(m`GBIJIw2>Z*K9-zj#~|tdcmF<m6DFAL7EkTt<ovbiL*uaI zllbXoYvba)7krc!^)sLi7Xi!0yBYG(QY{`2`e_!7XGxDa*{}M=PYYr$ZPLi1B6U?U zn}Z*<#PhE3CU(JftSWvTVo&&U_4n*fWw4XoZ?VO45epioR!>hKuz%3<S5aH*{l>_o z+ey-*y&b!X5-T^15;j9WM0viWj9*!sq}gEcPh|go@=t)?HguE9&y4>jH7<X+fc1ek ze!ILE-p|8(*XAqZwQ^k@Bz{+_!`1$K+HANIA;m%EBqd-fu$?<>ZP?PWk1NVQF0;8T zpUC*hf!p9HX{E`XGXV6`2MtKGNpM$B6xIU42WqC)7D<@5YZ2}69rVE<XSj-nnPb=H z6N-uy(C(lxh`zT9J@Ui7;Gpjwfa<LsTvy`I`}jO_4kp_Xqf7<C=rHM=zl-pT2Bi$k zoL@T`#~6;LSV-w5^i&Vp^GP|#$>gxxH!Wh{Q)=I#E5xr8z&WBBcE>645Zv}%Pdtp0 zsclz9Sz@ZTWup&~HYQY(%iqOenJ5h=>2cPpJnvIB_0SvV|MT-Y%yzozqRbqqzaOl} z6WoSqvW_k_S=h2x$%QG{8Aj*^yhI+>yh#y35X5ncz7UU7{`C~n>#l(S<o*%Y&X4@_ zMRi4&H3kk9OnixkR6^kex}t<b`lT@3)?V|J*<HVIjv><;W0>a$2^9FCZ*AqqdDnFn z4`7T70mdAulV*AmuNzk~TqfC|r$BhibT#o{>uxrc^<(&w)~%kcLw(CT>_;8&tz-ok zm$KXu^oH26$ME`y&1cMokYaQnQrOBv(uQpuv!DK%@;eb)@KNZKIA$9$sRNjOC2s|z z&~1PTcw>TQF$NpVCCRu-oFl;hKY4$zYhSaxi$PUWq!>YneU3zCG9)A)4t79*1u_vJ zkQ|W^aAQPdTmcywA|gcsaRK-OR(Y>Ax~iV%sp>h`Z}0v8bieQV%`tj(S5?<{f6Or_ zYdmS&yui(hecB0Z>hO9~l+R5!qC<|`9lU@(iC1rzciWSCt;MiQ-elti;m!VK^uE)O z*9j-&S#LWe_E-7)A{no%-_)NzO&V+8rd57G2>ewllAmiQ-yT1GU!ns+{50n8*?7y- zFQu;!(KGfYK=8jUWl$n_&a(-(En~JnE>2g-2O@)95&Pe#LPe1AVZ6I>$Z8)9o@@_* zi8#rpeKdG2F52!BjDSjgG172}zd{FneLtX220&M=4cm#f^XFX$wZ)F7d+PDB=<icl zsdc|xz?zQX&&%K1{~xpbiB;VKi7(Gnv!-e7B`(;|yOb&jBzB_RwjFb0|1&QV|46d@ z8JV-YqNHU+r(=yeQ&cvGiG%L?s&)bKt0AMEY<pv~HKUJ9i<U9BHwtzpL#-fx8NkdD z+3O>pzut_$*@+XZ)Koov<%PQ_OaSQF%#JgA&0MF!tkgue>ROClkhyJY@Ub8)NB{~p z(&s3>8M#WT(BCON`%Im`xzZeFwnH0g=DQ?A1xs}NS0&^VP+dpoz&HWWzs%#!e|vb< zC!+j0RrQmM#1+|h?^nL}>I;(#5a16OdAX}MX%6I$d_{)D*H7ng)!4MAgo0e>>2N0- zUjuvCvJdI0Q{Je0NK;odsS{b?sfAS=(7-bB`5BC#;kR50Km75bguA}Yulaq}&6|hz zVFPX(_KZ)lwK(*=9N)&a#cZEIOI;&7o=<tN45K15W?Ei`EtFG@#9<^G{|>zYN`J0> z0eatE4J$n`3=Q7)WX)eLod)N`@TM1KAE{rd#}p4iS2~apM6xsFbuhQQWXhBdJoa9f zwT&()xs38NB!+6zA8UP~G5NOXKjk29w&heCo!M`dE-o@&SAX>WW$bJKR~RkEr0f*7 z%5BPSwr4xDQtP=;nn;nZ<Npb$vzZ`+YvF<!?c*Ll`z77DaK(+ieX%PPE{!SkC-fWE zaG;fz>{%32eCV6Z{{jS;G?v{de_c-Xu-V%5_0zs)4^SZCPY@L32jdG-_RU{59y4CJ z_wu#s0eZ76I2MDNJT8!F?^h}S4Z3)M_z!OnvU(h}W9t>8Lg?Gee5mOC+DD#bEDC8> zx50qJMr?UwsuyeMC+(>nQ3%W^9%KAS-uVYi8Gl1Gb?pK^1mDrg#Gy!|?a3G3mr3^m zW#+J%ZySsxgccugjP>4*JW_?<2m{t&|Kux#{>ye-1XH8_*HAXgq^R>peetUy?@u{& zFpXQlhR^MIEaP+g$6Ap3(-Lxx9GWe@OIob41ujNIUEuHdaoL%=QRSxGHb^jb4RINV z+ub&l2;TtKXF)>8fQx)?(;PKOC0^%dFMm(rHP9fwXk9ECFGBvgjOc}fC7?`Cvot!N z&J8W~{vGGzQeSk3&BR7K27a_|nBBbu?_j;3plxtmX*3is+JBH-CS-;C*ZFb`a3+bB ztF5kNz(YFacD_z{W+=+1A6xsu_3D7##$gq~w?CP%s_dR|0Vrrb7TsYy#qJ#cq0>jU z&@WuywFhy1|GmseThba{bXTf6>>t!w>wo0*G8B}1|H7fuKW|P5k?I62;-OO1<L6_j zA`%$GI&Rk{0b!qPY(T(X$*$vVzm#hjzJ&j#=sy5Kxc#-kBV<{u@g0npHrZR^)_Ra- z>6>~VRTjNAR#38Eq`M6#lk4m0%!S-sOi_Q2BcZT&CJpuV5C=K<{KGYb`YU6H1uAb( z-X0xgtorrNclt7X{CaCkmT7yzGnE+UBVD)A!*sUpKIJ8gpsMUnFm)6OuUVhkwuv~w z;DjC<#yS*rTt;##v8RhcA5WAnpi9ByV_SokKAt)_LaOaW7d$Odyvq21V^e*(NC0BK zCbe`2YMXLboXla>>wd^5kVLZ`wedu_t&y44>o2s_!e1N_GA}6KAPP78yLsl0xqacp zL;Wgw$0HZ`2Sc2g0BTJeo-`JR1j$N)o$_=y2cJ*YpK$~hBv23Denl4*`%zA&qhO&A zaPEu1R=2nLyXl>R?zEo<9pAvh*nxKMuaTFomrTIUe1m1CgWByK?m)Idq&{@z5AF=T zTj(DVeld}Xe~#m2!1!y3bn-d4pW;YXwI5CyV_s#&*J0nU##4EX%TiQKA5vhViFm!` z!e3R~{^gXvWz2qor_yROj5l<k^7|Dw!}C&p4H*?0s!z*&d-9K8;>|reuCR@7{yV5~ z0e)#in+axb7O}8%d%ggQ<Ju#{A*tK)1;@M|NlMZmHiM%X`FM6d1{IPB*v>+wL8;2I zaDLd%FnMs-ybdZE_-*>pMKrjt2PB1tx~3fKHGz32`m&&M@O}d%d=N`TAyv|0Qg%+g z79{E5hd57w$wm&z%q+K&v(COPI4o33{@6=s!}M8R6W&VBesDp;8U`|d`r+bDejVn~ ztA{S0pooS=Yl&kdMjpo_{@`qdbpeJ`6BF<DxM;~&{7#qlA4q4OzWTD>iOpR%i7C$P zMf*>i%lf=@QmXSfWTQpthq3j5e7W}VZ(cfq<M#8q>wJBZav#l~J~D15pFQ?NzRF1{ zP~7v{0j~oODVfW~8lAO=Rg#K{B+YLYe~#l|J<43dOqW23rw)NcfacuW-Nc85y*2!^ z666RTVFMNE1M+@=g0U3#X!|N(M0_&w8@AHf<2T|=z~@GdQID`)Z#Twtd&KHQZop@N z{hRdrWIy8fENpJJ@i<nB-6v>y)HZb+^V66%8)Q;Rqi`LYuOJHys3SLR-DWOLkFqW6 z;<NN!l~a}v?H-SvIKV(7XrhmMHsu%FX<X^)0gLU9UTufZ;?NFPHKl>Y>F*aDHsj9F zfpjEh7x!+T<g8^MffFG-(zdj5DhmPw=CL_(pO8*l(0TNa?YdRA<*@p*e3ye#g!PZf z#Ei?v--viFQNO@fIH@O?s51>G=**LDkt(!W$IV;cYJJo;Z^xL9Z2T?g<XxEN%Z(zm z$3h+J_ggI_KXbv^$mz-lps<g{oj6o-0ku&VLs)WgGsJm;P>^)mP)nXV=n~rdIvSA4 zp??xZ2r0(A7Eb<Q`NUKf_TN^1A;3Rs`}d+N@u87T74*^0Y!3(Vrk?M6m+q<W)lY{{ zADH4#SowD<+lc-gNEl6q>mKUz^AA<8CIp0Uw36#s!qvTSki^i6x&z)qdfnC={Cq{f z6QuzD7^&TKjCuKm5%rhW7Bm)0TWIUE;TDfoohvS%APh3hp)gjxZ#@qfb4a`ASUOY7 zu$Hg(So`vFya&<4;^5>s>{q%+-#2&eJ{h#o1Dz3l#uVN-ZyVXZ5@OgCaI}`+>3KI) z$L((~a>qoZAYGD=R!xvkjyn^((wD!qiC5WG@x;$X5)tSlLD`5R@UWn(<7J;kpDju^ zpP^1~zr>V?zDBHYn||o~?`7yST*p!(aIQGl%Q_?5!MbR}3~;%@MVhC12=(%dbxl67 z?bvn18|*EmhsBFvpk+Z3`+KX%tw4o*qhv~n0i!+z!tj|dI7#4e1k4G$IcyM+Q(ejy zwcZV%{iTzf&^8=}IRuNmcDtSe0NAOoC0SI`rHes3#nJbUj*Ut5cPfCE^EAeV9h6fH z8ht^i&v$I|w2zZ+Eaxwf62TERJv=_s$b%L*^)qF$TAP~<4UQf2EWtiKC(MULP61=- zJ4ae%ZNs;=H|_bx!@+ZQ_`T_&eaUGE?QZJoJ4Sx?XVXubEbaktjQ^TL+w=tQpO&ao zDP*q#gCEqnFVNZm-He7EN&29QdEdHYH{}}CZ?==q7<TK&bCuHPttArc&#%=!6<<g$ zT)S-U#QFSb7W3Uo{c<8Nzt%pf#i{8(%DU{!gf>x0q-)uIv%5`j)3~=<q3jy3ez#lK zg1aaywG8-5t=SAE=VTV7l1ss?<6eAg5N4D_Mz{50$^GOv#c?4h`#Ktv($UxT3*Uw? zoZB0PNyTnxyVZLR=m*xzP-ksvBsJu|4)Ia1eg138GRS}M@+Y|dG3i2lDBc;`-uI0Q zjH^dEErLF^PABBgSIg|5v`Czm^hq0Imf@2HE>;tt0GcEb9dtg+Dog_>+17{NZW?Y; zhCZR_rAu%)4|)v2PEs5P^)Ddad@MD7uORP!`R55FZey~6$!-o;nfK10!H_-%7H^p@ z#9vWl?NyEe2pld^?-nt>HMkQ{qjoT}$0sF5x`Ie6^wnJi?{_Y)B-;D-ajCd1%;-YN ziZl7DQPEr1NnO8C{{EBXegF6TytFYNvck{t?UN)%Ed0i!17wd;=3_vnl01?*H*;y+ z>8~-6b)ivXZ~LQsk?8kVi$-pS4g+zdXkjd4p-<$Pi->tzh_qwV|4gnbDNl+nI_3Ga zJ<B*|UZ`do)V71|@(TEe#u9cNfNR__<HZ{KDwk6D!F~(f9_MKkhYX$|LHk&2uBbpr zAas^q@eda-=roMLMK{&vqdMBx5B==`GV~0ZOIJi*y3mJmI0p8-w<%R_(KGbd82BZ8 za^VasqxaVI{_Z1f?Uz2?6LC1zn&AZWdGf{bT0fN@AJ;53hWLZ0cH3Xf10YRRfMap& zasfDWs@A~<ooVxhr^yx_Ddz-!5j0!N&K2d_WgG?w9eYhfqQxxWS*-fQnuu4ZNBuQB zDGno|gu%+ks82vFK^?;Qhi>5X{qg$>uVeS2dF2b!m43n>06?sdKKMSJDPqKxU*8JT zMUhy2SirN^KGYF6_Bl2G@_1gwfx`k)_-o33XjA;y@#yKv{eC|E>%33ju}OD(J^Tv5 zM+=N@i;J4NjlW(94Trz#Cj-J-J3Wy;-DD#6hn-dTy}wFVn`?e)6SmsU9@+fbu45d~ zKQ;q#Z1^P1ByKx*Y<#g*2j$#r-@}WF+e@y4I7n~pw51&dTgJgkU#A!G<W+D?-PYdq zy@-GC4y=v2f3Fhu_bnlx+q1tPE_Qq=K~zwbM7GhZEkx`*pNXipdj7-HSn+os_up33 zTvzI18oOzb59obkneU(%-v$otBXw7lp9;$+<*AU);2egm&44}W3`Q^lZ(GURh!O!0 z?Xu`2mpY*(T|2Fo$p*m+TVa^tudICLuX62O2TfGiQU%VZ%Cl1zU%=PcfNsHQfGXV! zpmkH=0V$J-kN^d;FL_kerf&?Lhw*{_TOBQ8c3||0t}4oZg+dO{|FGOG%U-22M;N)2 zR`i@e`>-kwxbKr%-pL#!c(eoRH%G$bEfdA00mk}3@xqTkzs;rz_Fwmk6b1aWf5ER2 z;;$NFLO&M#7qApFz6bFY)YkK*$?7a{tn5$;S<2$^Z?WKiF4|swpi!%6E`;El?-Q%X z!a_cQadd*>4?Q_`U)4u3KcyG9rVgPK_v>U!PqBDrcn+<KO>A7r6JK#Zf4<;Mvf6)` z$k#edAszJ()A7JN7BCh>ZTN!P3CA%7B)Eg#Xy0(|{pOgKO)+HYO|6Z5(z{QzQQrtK zEww0YE$?cXzNkRNpy!csFI?Zh=6caVx@Q{Irg|}1mRDTR0856<%KmL)cgQ2)gYdXe zfVq$P9A-TO`qpG8A8%aS<rdIF`;L>kM`i)^c-n+-bR2kP<f>D<f6S(<4In8eCInOx z@6FasfrZOsESrtaZczbBz7=95Pq66tjqbNxGxCE!FZ%#ez(;_O^&vxXOo3nn@(-;0 z{`brJ6yAXo&<@>coJfZYNZ$76kVH5p7fI!J-1vs^!;)9&6)p<q=^T$7vl*Slvev_C z{$aWiy`P@djqEq<uU5CaTU)Pxukf#c+Sx?dmAHcISOL5=&BoqSP8%#whw0DOo=s%= z03(;*dQoJ$>50eEH@~2W3yla^X+1vUQ9QHty<w$8xY67Tyd+W00kiMVr<cQzqr(Z~ zAK)eKe@*#Q*zrqvXoVrq{uUhKKun|djiyVWS%cEVgib~$;(EerJB{^EUD^dqJ>5G< z4_ZQw3BU!3Ex=tsL#cOVpyMV$v4Z?fS$tMKN#`^dLYrpl>)h%K`2x%E5_6<)OsA1e zHWmJu2;^PL3UB~T0}jyz0VWfXRZeyxC3@WsGlfFbJ6rp(+HPXwe*gigC<h!l?MWEH z+DYGh!)_e|#M$k`H3|(_xs&@zgWW#)$LW!7HjLg08w8VnKKr~)1?bA|qF{{03HQ~j z)=0lhVsZw2_#~S!%N2tBDyv&BlmQ^d33ad3ha-ay_>)gzM)u!h!6jkbiG6QG0Z_jn zfvK<M`qE9E(;?oG!edn9mwOg1br^%%3iZxKS6ux_mlO=&kQRx1sR7Nu8-IeR%f-yq zbYWs?@Z5*8cXBm73kRe6nlZKT(m9`0So<vQ7uDx*Xqo&X@76J1Y6QKtL0a<#hUREL zK03a|(e}^H9$qiH?ml#_Y4XDcuf?D%2@Ag>r1|2rTpwJ^jpM%D-P(W-s?I@<qRS`M zyOJ4M4Ek6m?RWhFeKaDgKar^}4Zh{{nmQjCuSE?gPjj$5+VB+lLjuHW>ifvT+5>+o zIVpSJW}<O;5b+MzGae3%7%k@ZMmBZjw-ykX4|%((hN`YT`4&2Z^GS;$8@_|*$X-uY zJaQ75sQV9>2M3!sKX<lDdl*~TB?rU+KVl_UzTBB7#;8J{q|d7S!zyn6fPbNGn>Z&} z_yU_SN1gf3gT99E<eb9JqC&hk_8RjZFIB){_Dd_;BH#Wr>~<zGMyQVg&26Zfmg8R{ zwiq<Oo$(9nZyGL}3PC!Vb>PQRz^HDjhbi*XgG1S(iU{gc@vW^p3<(ZoaA<mT8-H=y z7*H-`(P=<tj3MD3{QM6VuuP%;4bT6yotC%S_c!#>X#1!5yYGG~3q$k!{&!3q7<Om7 z7yp&I{=*b-w^A>B!lMiI>1B{tz<8|=cxf}&ZbCY2yz*63ep}pH3v7~PAKl4}m9<Ny zG5qIa14mKQ&2ZP}1Af%v{PSDG0Z$n20vF@_i7+zMa=IOuM4Mb3WZZ}o-0*L9cO_8q zINwq`mjNNZ5p*2Jv@nMP_co-%i3koH()K%1^f~)p@O9r^8+_c|+e&*-w?i}~ns@@Q zWNmJon>r^@0I%mSz03260+lN@=c@sjjby1{9Q-BnvK6*D)B##74!bVI>aLeA2JH(F zx|n4);{}f23(}YfXHMiMzG87E2TtHDA0E5m_+!|AjV;byIW0k(bQ3+Qa~o|zPqaNq zlb+ykq8w4$rP~GIf`PHwn&!F<Bc;NUty3AZN&5_qm$pY4w|n$g>J1=07p#?oYLw|h zYlCsn4I}%n_Bx!3|MTRPzTYZvl4sIb*}dG8TR%5#JvYGm`Kj!3*A2+FL4=FCHRaS& zM}Kl-fDPF1%WZ@0;Bs)M<m9>ZsXC`RgnRvJA@~PCy|%#{PXf0tV2{joC;o-)9Gqxf zF)JFt2IIs<H)!Wqf}1igc!DEyg0N+QsK9`)?hT3%V8|CkeCUH}_UfyqjGMpo`})e< zD_VEV#sU<brapn>wg`a}Wd|78LTyO<`|vhqGuQzx+kRdA`^JlapOfCUc#LX}Mg%y2 zo}-@hXD+gAO$x%6oP3{NsTh1aQAI$mvcV)w%^xt!)sAo4n2)Fa$?%iOA#i-O<cjFU zz<j504^b^#LBtAjcxjD^bR|C3rmw^Nt4`G+p`^AzvzR|F%+Vs<J3Vl;3-mYnI*FwV z+KkF1`F(OmKXvVFL5m``wc@{a0n7i2=kd#Sx3<46s_@f<CN979-P&%S&vm={n2Nj9 z*isYl?}iyEzPsSP{B}p_?^SkgiTeTP@pz6iGHv9;BiRARERF^C`zq*sYthdT-ET_S zqH&Vr%e70}uy?`VIxzv-!WYsvq8)<SaUik#*rlkx-X15BwhYE9Hd9-BPLz=-7pMO` z-vPJp<CLO%b8G(~QA#HuBl?MTDyZRn-vPc+HEFts{R~3fh}YP>gT&(MCP&OxVZABa zkX`G-#w4+Sg(>P^8<;`b!HcFi?uz5Fqz}#<<pebY^UF4CE&dstcsaJ0W|TY8F^MPF zf*9EkDA)bm&l;xB0S&)P%Oh+}XvpUR{l8FIUQ}@kLMhwi5AGWGJ9C<RJVuTs^4Q$P z-8Uut<;zbR>K8~amt+z8)Cah-R`$@A_DC#Djltj88zqKe1W7ye9MM@8ki=q|iQR+l zL@CWK`~&#s*4dEG+$Mnj?&G*{5CIFr!f({og&0?)bm#q9dbT;EWmrYa2G^Fjv2iKZ z9($RVPxPCf68;R&sQ=Q!O<-=ce!|0a_I3aJ^Q4)H9a}C7jmq_auPfiED!(7>BO6%y z=yMy>mQJv+oEbUsBy3`5yPmXlACxZNW9#WFXoEoG+JGbm1MSPc(uJizb~&*;HWAv{ z`2}m&08eQ*2b(Rr;QGv)wdpS;-@nBQ_D{hy{kot{s!hlV809%harse)@1d10v!0gM z&>@(E`G=D8l&|)4KQaIG3lG^0Hp3sUDD4c+EFx{e{DaZ4UTM9W|9h`8ZOO;8c>9!l zGwjmHC-@B7vTO4nyi)*{_k&m)pjXZ@d;~-AoPizt(giKNk5K%=rN|g*dr1X6=rvbQ zz!@ul-gN9ppQ;7ZI<G}vbd?S8@hdR;u`FQyp2dG&-2QP2vCuY$bng>O9}{>cZRb<Q z$Y-Qndg3#!-%WR?-2c(|doQ?K@?Fr)Q#-u!{FDGhayZr*1Hfby7Vkf7@;fc(FJXQ{ zwL`Eq-Jp{uLe({~K&UmQn7bkITz`e}Vm1-b9;*DbLr{xb+++^Cvy^5)C%bAsy;H-S z8gLgy+7A&U{0XxV4>B>7yXg_-1b~iqJMp%`<NAft2%ATuCuiMuACNzxT#Xhbr(@x1 zMlJZF%Y}w_AvZ3S8EAM{$M~~}CyWhw8~^!X0PlB)1Pp_GPSWsw`AQ9&c4EkvpX+EL zhw<qa?>>P*D!@KCaM;6y9Z;Kz+<8e2e|gAvFoqFby;bCI7m~>~Un?mvpkEfWcdS6M zf3W}4=;uuZj-vz5zUqd?*{wX|ezd~h*!RvO#1zOI+Renp7L$oaTl38}2N{N@fX=M> zJ{D4<>ycF@jhb*;#nPK+bO88_sTX5wypUAJHU=<>HXpCu;EW?ULcAis6vhj1M61Mu zV7ozBfx*N-NFshAD?`2bO;O)9pFGzt@gK<w>aqLYcyk{EUfjCb<?E^h?$h97i4j6I zu|r}3R=bTw(N^ggAQJYRc)IEAJ<!ph5*0je-5FzYA=CGvF+kxRDK4-9&&CBm7uS$> z!k#m`JnvdUx6x)A6)zo)TH`JbHy87KE?+6;>SEUX^=AQ6?RV+=bCC;Go7p1%Am5Yr zFAm9lVsjVR9S>}^v6Mf+M){nJUhrui<OWw`!3}T6)B@tXS(pvI{Q1gX0cRb}ab=v| za<%7&X;Ocp;zXU=d2N1I;*ORrCHN*Q9(~?i#*_&9O4w|Bi)v90db}wQ@a4q!<cET8 zZHS>3Db0B*T!5@~)4$f@GF79laW>QH>Mef<Uj&0ned5kA9KX;W_}B|oAnpUGO(2ZM zSt?pk>{D@oO$$`k3w5riDnvf7`ShPd`CI5<)v#eAmk2uA2&crEsU4&WJs90E<T+6? z=?K9X(0ij|<IbO~@BTxTN_yQX1WcM$-;hI-V`Fy~!C)8b=J{OmnWfyh%dYlw32EP> z@KJB3MxJesCOM2fJ;%vXbZ36}WUr?825?Qk@&r8nH0IAdNn4qLp?L+I%2^_=+>3Z{ z(T=%X!-0#9LYKQ~V^{|{i#<nPnVxN2uT3fS4#znP>)|{7%iXn@-3rGOjDSaWFRY(f zD|m1HLu4KEnkE(Y@Vk>en2cmpv<~u53_rROQSUOYuRcWURO(8?%?WxBqT&CX8OK#g zKQK4n0xk-DT#hqyidO}7Ta?MxV4wctRWC_5(<O;saA{8UQ-6M<*m#PBEwBUXMlNQw zY9izq*Elv8m(2<i;sF63`e$o>&g*CUy2r{?w44PB+`Y_Hr@*~fja6iSszPjB6GY{G z@g1D7FLGiToac^k-SB-76<32A_CoQQ38B;ppDoBkXb7<1gac!5UfD8NOuH9f(OGa| zE|YT`u7&mXjQNby&%K|%&w_FC3C0wP-wHQ|7M^53#890JEq_=Zzt(tit75ZzwN=a+ z5TcFySn6z8KZvmC8vRI_KaZPFn~;S~t~nDD=`^4&<&%2fbozpu!a$>Wy@2-qYLv?u z9qH=CmHtv*h;#E>qr%1KAb7-k9yBe$k91Y#h!nsXAJ9sm&s7aC8Fu*2AsA?nZ82$+ zg3D8D<95)E2(W%FsTA8;FYv9=Kju(&>!$@eq_a>%3rVmMR6HN}JB~Pbg7ym8yxU@Y z<e1cY^8JG<&$kI)XA!CMgcPTHYf3$|qsM3L>@c19oi-9c;v-U6h@kPBWzMhE_d=-O z1XcqCQb9GtK9?{XHigC4f8E}J1Sl^woNv83KcE6?qS&17tb9T(9$V^`-3TC9zWQmq zt`&9_$L@}?K||H}n1C}i;PF7~Xgt^?y<GdZ2WII4#{Z(t=lGN7_MrrrVgQH|-GyIF z_D`P|-2N*m8m>+5V`*<T-H^7~T)`f|G4OFZ0#3qaP?%K47zMiAf6DSJ{PE6FZTwz7 zed)H<Vg3N|0F7X$K{*;Xupi4t*7K>8^Q8q$A`5Tr%pV#9zBAn3sP!ZGbC|(pG@P`v z&tz`6*$uP|D<|1_sslTe4d5&$0Cx<OOR)EDlnWib?S$k2a<wTrN^K(dxB4UFa<$!y z_RyI8eS>Swg$`_+8Piy}u_pFHZJ0)ufo3V`1HJKQwL?Jmen$Vs;&*-2SZCxeXNVun zFGo4^uPZ@Q<JF0a&k;7D9oM9KF@}u$-&H@~h;fHs1>_Xt=Y3pf?63M2v7k}WWYGsY z<3%v#Bg@{|Jcj+BtOjgsr~0i<X5S_2OCHuu5te;J>@O^1>>P8LUp%i5yy-_l7vudP zH1S<T2(YnhSbcZISJ3b%Xd=EXFw|Io=Puqf@`d+F5GZn;a^T14&)F-W4&kEtS&#(# zC!0|cJ{6#AU0h1J3N064))GJvS$897;U)D<)rx{ci<>JYArPKgUs|@G#UAgKz<={3 zwwCXDUd9sWS|u<!_6=I3Mf=ai7UUz+`S@S6-Y+?AztFjPfivS&qn@(hjs5PFM?LeY zGcAX(U89WcDFK}p^s9Rmj@%T#5%lFznQ7Xfw9jUkM}gDTSloG$4!{QDUOYNF?VD=h zR}=$2L?EJ`L9QlYq$0d((K*V`tA6W<e65=tZ=FJWQ}sd5@O9+*^_Tx%C;q42wrTW_ z#XJvRY%|1wwu!9%{>tD3v)?Zm*0vFeNR=d}UHM?PDO;9uWN=Z3J^D|R-}^E5eFY^g z0|@u_3qQAhHIucnz9M(kb)+q&zs2s+SU`f#LbEnUj;(hZv?c&LNS9O!bpqu06+69w z9CsN(W86w{2>dpa9ELd>@d*94H@v^{9aw)_!v2;LZ~E`ay1Jh&sF*zSrM)_-o7v&9 z)2x|0!y(t|Bm6>*UF!ZRi|90ccB5?+avuv+1*oFA6=miEnj5<``1A5BhiI6}#?sd3 zigs=<B3-x;0Sbgcy`5fyVjU!^aDgH0%?`oTzPGyQX%WGA4k&c3?8#0K7bIV;6MX`P zlheQ%rnB8TBBv3>aQeh?pzCK$sn4!(?e1Pq!!_<i3?H#g3Vx-T=sbw5^IrrFr|s-E z{YRjT=1zbtCP?y_Xz^M8`}5yRYyc7hTolV)dRhDIf5VJkQu!#P*^(g8*EgPwXBG+G z`EuNcuRZ#*MH*+`o<1=_|D2g}7GREfoFD)}6JJKzV_wA<H<;Kt*gq&Ygi)8uF>NlO zCZj|97yT|fKjTRSK{y-J?A^H86uj)V=@}|oPAAC6@+nvZ;V_oe(O9UEA@ZYs;9feL zi&qZftI3INBX3%<-Q>>V!=pz+kY(XH|B#pCJt*11@pQ+**T%Nn7qvH*z2#WiAGB$s zT&AA${Y_uu+G{RKGOnM|!N!xVTA&do7J%5!r4H{IUJNKZh6!1(Tle`X>kF6m_fBw3 z7GZp~-)v9$5c(safAlBc6uq(Kwk}wF#}%BL5vXz$mVpD<FtzA*N2(pO?QW4c_Al0d zq)T;uflDVbySgzcO~q>)Vy3T~0T%TYD@EAnV$TUNZhcRZhxuuxiNhqpxBr~BI<y~s zP|yVsAUyvboTf#6|6jJ73Xg#=z>`o-_YWPB@jq&PB|ur)uR>JK{NE4p6%>vmJ_`LT zd|K0xe1c7HHue_0qd(PxHfFIq5uo_4pPN@)LCF)a4fz}oTx=jCMx<Zx6$lNn9=h=R z-N+KojQ>8Mej2Tw{<Y7Dp}Z0hK{ZS6M*`K@n)y!j`zdL~ALQ;-l>`PMe!UqdrU093 zb@<l7=;$D?vV)&-{{ff&>f-jdlubeK+51vjZZ?b!1+XO+;0#Awe~W_`Dq^J{UDl17 zur~($k61Q(o|qqYwYAzU)n3lGw}KIC6Oq<||H9KqVYU!BbpZ|Rx4iaW^uZn7bXMuG z0!|LqPK=JJ0!UbFlet^ok{;(la4LI2BRi68DY)_|i9ew^5^HJ4mYxuz*lS#Q<IZvd z$7wGw{yfJ=prJck<I%NgGiYZ`<K`=AQ6s%=AkSnh*#`r@0F8tLiRS!@3RAS})kVvi z9eoQ4l%4zfln8>{K`+*|AvG5QY~rF#_%geoSd}6TAvObQz-cnLEKn8LYBA*D-1qJ$ z+0F4O{h#p|6S%mm2fRa-(|DHVRhcgdf4=f$tiRMWSpVqh%O<A2=5vIYb+DY<FM=;x zcj4MUj>(a++%gU{0hoxn)iHhpJ3;ad@CEbrY5P*gVJW1KiD5Z33=ROIkUed_UwmKh zAAvFG*w9`s($CTMi8mn?PY1a}do$uq|M-F!Q{BVDmA~PKgKiAH^%*>386pkW$Hcfe z0Fw&RXNLin5xe9;(eyg=v)05QekB}`aFZKD*w(&f@+$07(BYiEVLi$36I6{qpWq~q zaiWq3!MTyJJylP>VNmg5gp3u7Uomt$klAekafvksm|dtOGf(&BqW6JhI;9>%*K(o{ zwl;FZVn4<XTl}<)*=!$kjs^W?FkL!f&Ag)g1dfUPmtst59)@T@g7I!5rDv+&fm)0s z(>6&c4(HCN2QQE5xniQrUxB=^zn5N!f48FtVUS-dCD?ZQ^P!u8W9suJ8Qa+YJC}{( zMMDGk*|dC*2NvLn&TryhAh4e%{u5Z*Ers=09PQ`Y33tZ6>1T68t~Nl_)=;Mc<=-@J zGDdzNKnK1@J>R{U+b>GwTq@yPn?mYGi>^L4olbacnxCkcCuLRB$}foxc24Qsp*u>q zozq`7{SQZ@1-98GZ%AFS;$_*OvHhF<W(kv^maI~>So+L|nmU$Rdi!O6-mYr@aOKmG zeh<h0Dmsz1<f$#lZCzFQSF}Nx0t|kks1-J(_cY_K|EDhGc<F&g!gHMoCboGVLIz># zIT%3*ToD)L8G_mtu(RUtrJpw$v4q>;J7KQ`KP~yG1kcgXV~fAetgdI8xbuvVWdo)# zeYI*Sk<@Kq5*Rwsg`hV)q9X`#wiz%nfL9-f?lRUzW!UZR3*xc#>MZ2c1KG-Q8RRU$ zmz4Wlc$j^EW&f_X86;xTSL|mwwJ7*5AzrOz3&J6fAqN_|X&vNQtw495Z0wBVdH2;< zDB;b|?DDF2AVE?Ii6U_4p}&5T?w}5<P0LKGADd%txTxMEUn89;yZ`zB)xq32S$>%= zt+|oS6tq{3;&nSrjVyFzWzymGyfO;uT>sJnUQ?FirJ11;5!g<Kg)l6Pmm<``?e7pW z0BMV#HPnmaA9Y@A#e$cWt*@~o7QAOL$4}(si`aT}^`{>AP@CdOt@zejyh=#~(Bg@5 z%4Se56O&llx?V8rpGV-QaY34ziLYZq071;;zrKQ4a9W-OGcfKHIP3S`Ex3>T(%%?B ze#bj<psw#`@`aDSXv$4rTM{lU{Yp;rBi^*b_Sg$D5W(*d8>XK|h;--8&z~L#MzxBa zCiF1mL(I7kEh5`hSgziQHZ+cI9sf<LlkyFFv-sk+^FrF@qO2_BH=a!|liazOtBa)V zk%@Sw<BXBWU7VfT_U(bP3S&Z<#(6-SBEHXr_;l;TF9?;E3zPY^xQx4AXuTJ)51t2H z$cCA}@!@U%LLKO40qWME>-Xhf|8eXgNqfiP*3?|gqi+$I8%<_vPL&L>*6kmrdyh9^ zy7ILBO~;I)*1o>JZ2ih5xPndN-YvRgtMogZb%8F4eX&RUMRDkr*P`FWb9>`ki3f2< zg^W>uxYjlWKk~=!{b-=wAy25oSJC3GO*;@@hw#b#-AtSH_}UIuJ2x8E)3$uCzR&g0 z3%4jIrs3)PqS4gnZxr$$ul)7Yv~%qHPGGjyta{xyF0HZU1Nk_k3)KPt`4V_U<pk3| zeo_0%I@FR!2f^}smSDs4kw)5ZFjSDS3o+oY3ibOE3xfU0pO&Dj>C_x0AH8%D2LA-~ zIS=#HQ7FjRXn<gs$zU`v!m2xh)pbaA_pt=x0T4(-J_(?1g03<44ux+66InZrS9dSo z%kpmjYiPjTr?>hl`fiKbQi49h&9yK@T=00;p5@D*e(cAGdC4@9t~3xe!i;iO2`BO? z^`+WYHVXbVa1rOo6?}@HcS8ixZ~a-g)Tb^A2l#VAiS!nnaGbv)EiYBvi{6nNG%M?S zO#Q2ofllZ$VTkp)<&N*yX}?Vn=9n}8jU~*x<0%FlR4)Fd^0PVArzYO-isF|A2;XN^ z=0p1!Pw^V`C$_dQX8cSamY$__YmlQBA`*~=F--(Z0r1&IqXV6-G}b3c4nKmLU&^5p z#$1yqoM5Ir9A(|Ky4&KOLH6!-GNLBpAx&j$nm`W;*P^B^F4yU^)XDGMn3C(h?~5-G z45E0$3BfR-2lO|ay54X?FgL`n!l7_yy%EIz7u%j%N;Eb;`haJ4-`x1bS08qaPS#5I zZz2^H5Rzk5hQ=1P@3c2(`nJWQp{q7=KPD6%-&jFrugrx2Kj&oj4ijC?mmxQk9B(By z-!=%ix#;i#m|umgz7hL4jTcd3I0_r_GkqPmgNGKp&~?$7?%O&ZrkWjZ`{L6&<#l3t zL&o=BR*PDgYpG^}Acr9`kYK(9e%31A@eBo3zJCN}yf)%17rPGsTX4^)wp9uZOV0l3 z;rUxe^O$V2n<@Lgo_(mIcw+qmdqcm>?b-C^0DmwNIg>&LDllw>InxvFXpU>%Y3SE> z{D{?Wl)2<4;_^m}4hF0)axd&FLfQ|$1^cCKAscznyz&+EYbR(UIpkBXx8iTweCmr( z?r`Fg986aF8_MxLD;qpM2L7r1ZbkZiyWex?AE$^rxR;@jr#D*Lrb_Qr1)Wa-cmN%v zeXM{&0^Z-s=U8y4i+4?b{Fc}v?>flGJ`_9gvhmPtIocn@LLd5Vm4h#|MSt{I1Xnqq zcI-F%R28U++MvZKU_VI`P(V9WqIL`Bn;u6Y1l(qwJZ|)jGJPkL6Q!HG-e{;-h<$SO zjY?2|B7#+)b+R5!zxlfYIv7U5FcY8Cz-o~M4cZ|gI>h$ZMxkA;#Mng^PeO&D69F&9 z0RA8G@?qpOfmT811t7B_?n=1bjJ~>%6MO54gV)R2brRn;vu|=Ba}WJA!dp56<C4N( zue8>6n|3yuX62Inj?-2$l5%dbjRrt@zhe@YZ?H$JMOdHYGRcBK<cnLP#VmHk6NZ^h zAKnUI?l9PXbCK<tm|BVQVMR<NMGKtTI`)uy>BdoKmJs_-`w7Y$+ct4T)1Te26c59| zZVOO<mMQOWNW#%C`Yt!%Tl*qm@DfiQJ!GNw#DFmgRt)&m1<$@MpnBqlLt!W(*lm@; z?F286Yby?TM%&Z_b+DI>mmHh=9#{L9LX&==eKbFdobd(@qN&~e35M3@C%hp2FZ%`h zwlj6_%i*!N-7l(C@QHTvJE^@)uPkL(Kk{+Dxo24}+U)<QZ@e2--Bo)t*l6lDtL$RQ z4da4oHE{e)1!!w3S(CqTo3Rt)N_h#>IHL=Rn_c22!IwsA^hc!A2d@LX6xjDy*<V2G z0r>qx1&^qr^Z&3u(R1P;DFxiqDXnaQLL!4|7|z3JKk_E&4&jj2gh1PR&t9k2A6`84 zS4g{-cw2K>h&zeJM%_N*<r(PTIN|2f236n&Z>i_Dt*2M|!j`<x%;H9S-(Ea*l^AUi zz=>PoHl5J1MHgS^VjocQw>q2pskuOo0`W^*gyEOxx4yT!U4%a97HJejc}W_HA#5h2 z>ZJ7^-Jc2oIY7q0%?Zc9v~pAbU3oPKp|gzHJ8Ww9hHwGv00O(kHh{PK(#>|~I7=+# zq82j_zQZ9uP8QPUkU#?qPuX`R1bvS$-(5!v93L%|fBT1V+}Y-29WHUFy8_2Za^sBQ z=2I5n((K7kg8Wx5P?QG=*>8yne~T4GyV<n=;aul!$bal_Y;oZJHo)4|Uo>pLwJH`b zp+1KuTPp2=TRzjDGI(35mYtjnDdiGsrN=5UoJ%hy>@tgy0F?PWZJs#imDDtp_DT6p z2x=jj8BUmLVdQ6LxycH%brD1hoqEY8ktcAAAwcQ7ugJw(?`EQho2JV!-6}6AQ;yN4 zA=M;od3eTzzN`{{nOtn0Q7t`TQ9GSZT;L$RC8!=SE->=WACP(4SpZ)Ma#J)HdxLbO z{bbkm{16;?UW$EE(PYzROxn77!j0C!WJJj{<%9BC0m34h$j^a_lGr7{q8y5Poj|2m zUKYe}zK-M%%8GKLO&&A5FZg22QUbDOG58f0elkVv2l^RWf1JAhmm#(;+8b(otr_+b zTkF)xmpqxg=o8@Q1Le=dACpB~NQ`$uQvH*|Vuju0X}nNt#tTImlS0}X!yN7&7Xa*Y z$<r^%6V@<z*Wj)1(4~;)hD6u%;!zuixbE|i78Sn<ywUO?ARF)=$*ONMG<Sx!cUxX; z{l@-*5RO%$geXEcwDb1u-SrDzvOhMMb~Y87N4>hy*V&lMMJQK4=%A#TXh3{@<mu<y zh$iB3plqwQKab4nePSkhj5gyuPTvOlwq|n#J2ctupG`%#anae|$bwbyx$BInH$5dp z44__pe_Oy;b^=g%saax>afB_+*5~5rY{rX}<#0Fgo_`OuE>O2t?;_55MFuuX9UpL^ z(Z=kk1uRr9pRL}OSlS`HC3+1axBj1SY5SXDq;mV4wzrcFK`?@@?i8Yf`)65VzkT#* zn!@C|+m#1?{)xQF>(l!dKO{JX5SM-`{)nYPf0$(H*gln8+r2KJpYqcya8Ymi$#viD zdBIK1C~22AmjMtzAdrr@XEu_aIw3<X93}}9Y22=5f)-2L-en0=21oRR-Ure<w_6Fz zl2mUe!!{kfEWa!_1$^xXkKk@Iny&ic`U{dCMP14e^?CQO?|s|bdSEi?Q-~fWE#fAS z&rdS)82$WO*;$N;>=vLm%MMPV>=Rw(rc#f|@kB4~c>eVwsM_XB)jfn<hzgbPhT!Xw zQ6C$ci;G_d&+zoemu=D_?NPHWf%)JWR%zl9N`_fYnD9MCtG>k<FWDCe#|Aaa6`*!A zKBWYBz`eRLt{%Skpxl;4f0n{RfnmI&dTSqD67`g~5O;X@*zQ@}CA+3xHl-$XiT%fB z|2T>D70N>xOt4y)(D!&dojXyzXnh3t?Y~sh6ATRy>2u-jr6lchfj1G{dcEgxPI~r* zX1_vhjl1K;iB;nA8bxbBP%j_!H9hyz@h@A4=*&BM+qoC5Y5%r#6V~)XGZM6F0=Elk z4u6{p_esTzau2$!?C=&7edwP$Ri<Oh5mp{y$3VBR`F(`l{_LTT+m!vwk5nX{{BW=s z>>q?H7TVcPa6xXQyU`~|4L&hPNg8MY5ft7tIFEs_#3*V+tgQp+->lbt>SC&mzJHRU zwgZ-E4Wu+-)BS)z@?G^hC&Y8{>-_9oE>LA``59up+}&Bh4g<rW?!=bjLFLsf2a0QC zj(6X(d(SOyvT_W+wTc*g)RJFZG7cL$YQ@&31YO?AVL<JQh#Q6tW8reO*^O@0AoTY3 zW>jzdo0hMbdZzw5ke=rXEv4&}4!!gJ8P4~<)%1n)MrnO<+274yYlpSO<r=7<=hNW( zeuL$<N4va=g`&IhaDRn^&as^&28eg*1zvwrtbfw-n?d}vgHYwuLB9v$J7RF$S%r^H z9&7hQR)LRqDzyThPs&+cTfHyu`4JzVKA$I44q%T{35wFjrbK$YK&MkAHcKTmPImCr ze%9a)xO~!p=yR*nGX3zgPF129@caZ*SgR7&=u5v%=<QMBpEfTzfMo0fuTE4g-v=I@ z3^>9I97DjriZTlJ*60bkVZ9^hvt2>-l}@wU`;@rn?b)?1^*NT9ak7Ozt>MQ8a#6`T zQbqdc?_BPDolguJc~0-HvQ7hffx}@j>qr0=)yUtV&c&mv{JsV0gMSuf4~~@3LW@%j z5)PVL&7SxmC45?f%(RkP>8%dQtrOr{_^=iw*?;zTYaUsR^QJdeH0z>1>MtVQ`hM~* zZnTLI6L(>hfP)i2U;G%Rl@5CJkef;=zi1e(i#SIy7^*XpSx7mza^d-rQ;Bpj$ut0r zA3AD;S9<4;DnETth{_yUZHsC2^|DP@<qlBTyVkwHdxzJM;`-c|>)#~yPEh#-Ur^ob zjZ1HS#l$|Mr{zxdwqocBP^v*Kwhs=oJ>^%T3NPdbwE@tG#GgXUif-bD{s8~DFOT7T z`lbsp`cO_$bfr8dgv}gPzd9H_^fHY?f1<{X$GB0Btef^9D}PSg<RdH=O*9z`O|%Ae z3QG!jrziDbx61B6^DKyDfn#GGiU9qP<S=e1#REM#PnVz!qFdor#p&qi5hCZ^qnsF* zV-Y(jpBWb~7Qy-wPb?`BB*5?c=xwaB==A;GOX4&-f3c0$r!$SKNVgGhPj=1}jhAvY zp;nL;>Q2cH4A{2<XbN56^_?#S1kSCcLoEj(i`R+nRiP(Bpd@uP0B0L{dy;!#(N`<E zG~E5~PM5e@b~cdvEU<SM@l*X`Vl)WHm6-eWr@s1$`2F(CKzaJv9PIE2^_S*<Oa67G zf8w(h+tsH3Ih2b}h>&Xt8q{vBHCwh*sK@A58Hw%2VzX@~K<nbg%IwYXolyQYa{8T& zG32ws_VmRmC|AG&W6WPi3-v|pfhusCErD=QC4E75K`?{ayP7a8@NU8P@yZCrlygc` z?JUCr#WtXxOa}G7%jI)m)YfDN`9owFBz@^q|9;S{w=pSwl)^u-BU@>dMUbH7U)6!Q zH8Ezt#<)R!KeAp3TFw6l(J^SOtYjJ>Ij{+KJn@Ko>PkcEK<LpLg{QMp6M8W*h>hv{ z>%<q(RY^ePP!3dQw*Bk|dAr7ZA4N{^?9h!9b{vz*xNP-WZf^Ppl8a+?f#f-k5Haue zfi`(r&1gR9L{i4J7l3_!BN=z>@pR5p@v@nEd#hE^(fZJFq;=0lZb&D7O;S(&P4myY z^w}Z2L4$|%*N+UNH_t`^)X(BBV|TxE){7?84d{)0zzLI2y}1Cd62ZJF)oQdQEEivd z3m!PG$5nVQio~4;Up~wJ&BRuas87X>gmC_R!TGen+!5`S@g=t$`Y@a?YUzU_w<#bV z{Z^R1FZ*o?S$y3l*S;hm+t*AfEdZZEcIMpHai*f<bM&hk7h)O9AgSOKJ>)*Ud>d%! zJw_8i^aaj+-}u{WDE^k2t2SJGhczGSeRSCen)luW_?BV3dqEv1x+%Au9urG%SRi+& zFW_-?^YRm$m4GjksJM)UdYV<Xz_E5L20QqdNLtM3G<Rknk$M_E-wNw^mp1fu5{8in z1n|VW?(iUzIXIZAI~$uvP#pf7));Z1V*`3ZQ6u{^zsjRRu8*gl&jnRoyZDC*!wqF0 z6Ns{TQ<SmFy_Z3Pua^^FpuX*mKXcdRGxY_YaG=QqpjbWJ6*O)Njo>Q<u~If={6p9G z{0j9e=LlKhmtWNe^xsfl@7bdgb*T@z#y?v=%{26{l)W{IP0Q|zm2myEOL25i?^Q;0 zJ*xH%>GxRwxs|xE)VGEq29JwY)FIjs$=3aj3{^zX8v5|}KH~~F=(9=sld`zG54f>c z*Sf%}Nf{=7q*UTyFV49j<4U@N1rF2eAjmcpL`UcVjA;w>cx3*~ceQ)1<#AXAD~5g3 zwX|gal}zJOr}a5eWDfui^)1}?BUnRiRUVnUTr@1*e$<dtMm`3hJNZa92c5f59dVoZ zaO-(w;cocrNlmj2sLu!JEsg{DkN@VgCjpBMqV?LxH-xV-vYw1JuR3wy)3-<$Cei`V zT!kGBIjXPogu=b>_89u>RJ`!96_iFmJhNl})2HC>VlC9w7*#Qia#$pT>J3ALw@kx8 zhVLx&Au4Gq=LI9fwpXr%*?mC=1m~q5MLeDk+rBEydeZkUI9ysZ-)8#&KRhR3K!=6( zS1@1CJ?N@VE*k!K-Ak+&$6QoeGsb6Ya=*yOr+uZ|q~p<H4fRG~w%!6i%#7Z}gZ`gq zU6<kjxibLvfBq{N-5zukYE(@y7Ge9A?u;oz?$+LD;$_;=`fb$qGbj2&Xwp8@-iCg< zT49eGUnvmi=Z!@P24|y0<G#LMN=YEHmWTDo$^I!urCx^-vA<C}_6%KHpQ=&-zkG$& z(3{Sx&tKp*1vI2!Fjf!^_wy-zN2lc(PvUAW4*nw&04#un^$#x)37dZpjq%tx7yFI# zSu((2M%sz>(T~(#**EpF73CYnV+?kOHzDz@0f^0{k4&Er_J=aUmAO~G)dzHl+I9Il z3u37+^IHt<OP+Rar8lr}(k+<>c5)xm6HyB%T5n}qQEHEG57PLye!0nkPd}j-tVxr; zPt}51yxa7wbNeL;p<OcvXx;J!(#w9s-&NBaRX{TrH~L0?Z67n6!*O%`(<}aLdj@%A zWep>^lkI$lm$+lOd5c);5IldzfQ?+#y6v7N9@lmo?Rf9i-whY967sAIfiLpEV*lq< z;zHn<keMh(O|+sNiL0v0_0TRsK9DSQ*}_v~x@`~pQ;q1?e(gdF!n_yO1i$u;wpGJm zXlH}w4D=$j9_i&2p)UhKzXtvDq}K#;<5`r0iOnSt(#xYu>EqYv$f&^q&Aho!j^AVT zOKp&j+Zi%^z3tRd14<L(0@<~K<&g_BTmPDHHkMK_bnL$1Fr~-`3G=!7#H}|GXq>9K zKJL$LRm&&soG_kLIqdm4YF`u-7I5pQr7_`;L)$sQ!>ZMbZW*umog7{ZUri<l)`+fk zv)UQ9q6bec#?TeFjz1R<NNv9t=X{w+ZYNp{SVWdXiyzLEWXAgQ>7*#Mv4CC8DrV5> zi@4c@5l?Q(%DmouR*#!(75bIh1hjWEoFw20sv&D@pY3XV*+2ceCS1-orScgp!i}S% zH-sN<xcIgeoR)e0gX3d*aa0aBtf?kSaO@3eqF#Y=w#EG2S`2RZ&NOO#CN138W_%^M z4zk*0rqB`w>XR8R{2(3~scpI$qxEk}3<xY~{E-JNU6+6DQJRXd*5z544*`9ZCT?%0 zr{-`nO%qOx2|u5(DdF&-7R5mwXi;;JaJn!41a*1XxG}SuEK9rV2(wEvdA!A2*Qyo* z;pxsHlW0G*#R6#4gKp9rCx{nElX5yWKW)71S$z|WF81;Dpaw2&T#H<_Gorxy^pKMY zM~$z3%?tul{h~0)nqo-cm_+dB`gH&V!nEmi7!Hbfp0JH0$6}B7SW3~q4n4?296RvT z3$y(23y#-&40PHG^aH&4!EMc|p{uvz3s3Y}8*QVATc_>{`Ww=2uD#s+ni{#!ZhnKb z$vu5D-XTVpm}rv?wv3;e&U_J{`)w?XEYJydo&>r#e2UAc#c{!%13mGE0)3DRx@F*% zdqVqE|H}mTHI4V325qI)pWW3vZT~pTg`N<6w$!83;S*JQvLbBm0_HQstU^)j|D4N6 z`oPzRh+updJ=8-)X8@lVu!-$M(RGW0V@U7@Y(o^I<|F>)K7Q5G-}ZxfQ3Z|nT7QSf zi&wG(hw@x}HSyQ)G9)&mlDGs$>9Zxpn>V=^U#kL<oX_|GhZh65^_1Szt``yTnO$5I z8&7Or_tbw1&^37*au1SI?rwv-E$1GZu*)qeg6$g2^1~f_`w(L1_#BZ8vvj!^`H<fM z&ClwP#QHRQHjX_RB13L@xanyGp6cSLt3BF|jE8+}?iTZ}`t+{4_oAqP+a+W2^tONk zeSLJZtG^lXAy3j-;Y)OwW1NTToTfZyc6p)2FXnosybEs4gAnUf5c$2+?nei5(dxu| z-<hQwT}Y&Z)X0L5o(Jl!v41J`+}s{6B3i;)Y|SREoOZU}Q8FEf{ET4<fRs2o(3X7> zo(tSlN2svBfsZrmO$?0r2|H!@F?O=N{=9JRhw)a2$UWZUMpyJnhF!v@{>Q+$Q-tp> z+30fl?CZAwxVR%QGDsu?7oyHR`MI!>lRTfSm+af6e)ADy_^=T{F=!4Zf?NX8m2ufd zT()sP?4Ld8y>k=2FVIO!5rQ>nfYX+d2Q{2qiG~Xmqm$E>vu{lk{>x%d=;D<Cpu8m( zyTE5D{}PyA0<w+)s$2=pyDdiX{19QzuZkn*ouUITexJCba{U1+0840~l##>F%?pm1 zV-A~}pJj(3IxdSVwk?*xyKa5+Mu$h2x!G<x98Yy|p5*67;r*uyV|v)Ks5WyfBaGm| zc%_&=QKox&V;8BqlsLYF(ze7F{pnjKsZ7XQ*6*j<kNjMwev|iZt^c+{bHbz$%zi`n z;&*ip(`55=!s_@dggEg_=(Dgs@ep>A`a(M6*j0b79PhL^z-b|5@}WkFj!BbBUeq$e zt!nbmxscn%q{1r1t%>vVs5~WjiSx|eG_kbJccB{L=Y@e09|m$YmFHOqijAaqCH|-{ z>Tc_sncBvoTE^NFTRC}j7l_=omQtv3qmA)FwaXY5bQN43J4Itve@tR&0V6-&*-C78 zz&w~=K94dveG3r-vD<qJ#K$P#P~RPKTmnVm_m#3GUf7m4WDx0kH~MNp{hg;eF@00~ z(vV4uH!ZVKOkLZ^AYFp%5)JTC{Y=649bP^=hE|~!!9oAtoqQ3zuh5VV06>M1|DA}! zvVrWD_SX-KGV5RbQQzUF!5ItbROnYE-L|imy4|k#^zQrDsZh;<qfb?sjgv}sY6jq^ zEH>rw%Pkl-E+_8XKmZT^n&6ze$9MR&IqSjT*Y$Si-(M~5Uz%zeg?OXVH+N}iMw<`A zk9vPNRRNs$`>n0FGhVDl3Q&9jN(+_e^I>(`M%W14*vAzM!s!JyH}Lb5{2H7CQ5zqU zM+4bfwC5tn3j~KAUHAN_3zTk~tgf28V8TzlMn-L8))*Lr=FOs>(=I^aCOpjlYS(<~ zL7l+z&*P14@?!04M(q3mrxveo>JY7SfzKep>0wp`wvYHrF6wlmH#LHv9N;IO$byjF zG}tfqV*9xmi9l-;Wzl>Z^Mr{y^ek9@*&x`=wuO2_91tH-Ke-W+OmVaU-#nqjA5_uN zZ*DR^uOL8s#*<k4lGmfBVTl%fc2pbK*h+nK?13O12}%eLwO>&(>emujZ`gdx1~z62 z{}<2;J_O~U<I)<mi+(59UsLon{8M)bvW($L*1Eyu8*%-<uarUvmZvHBro#%Hj`89p zBXfJ>jv{ti2O|+0U-_G^{md6Di{0LW)!xfbW^X4bSjT145$=Iw7+oJTfp1el56t<I zcI>?HioR<xQzTY&vn`3**n1nOFKz7-N@I0TF`zw)it2VuyIS2?PD!QRgf{Ws;QhVJ z-vy7$%5E7b-2AjVwa$GjQOWiw;?2?)UtG_8(m-R}*)ITQxLINSVTq4VRKvIib>!!I zOH?d1`}@Md?*u*P>$^@C&Wo?v`F!Wp7K?D6qVvIg-Y9)wcqbFT(f!@;t5p&ny(u&J zzI*zvww`7JSiGD%FnwCe7<^{>>W-;pR&ICN=&1L|xF6WLu&Cw6tKD|q^KOOZ&j1{f z?u<VbEH#Yy;s7uVzZ{~fgTe*-j)HrFrpm^li!8ztPGJ5|3t=R!%><L)*HOtFvZhaq zeE<7}PY}a_^Z8^+Q2&RyHEH%8^qj+024j@G<x@y{t2x^L!P??*Gdji8oi@LOFRkt5 zSM0~L_w;=ltBcQ$^pt7>%|?ppNefKml78|@v3hQ%!6g)evg9IKFL7EEC5q%cD#9PD zuR+T2nbWuj?#0_Er-$bR+iQ3!LjiPvv1CE7(w~9trJd1&i2IesZGt>Ug-=adQKVj; z=hNr;jeESo%A>tQo#nn^aO;WO-R0Sza|!d-x~JQ>jUsP<iYuIMG@1SJOL+1ld;4WH z=sUfAap?u(zeUUP&jJ1vGzLj_o1rw36ODKx!7LWsY&Q-xM)4pQYXfZw^$Iry3|vT% zH#HyraKA2C-kV;PzhJIOF>OLqjYO;IuZ$YQ<WU?tj7yk6POWpe@wLwr!UNz=;I-MB zfglV!8;(=$IpuAp{C0qT+DCf;UBJdCEWe-;A7$SKNDI4<(*87uI97|14yUqAH`Qmp zgNp|t@dr~dbsn_n5jJwB_l13=-`bpfx9q@LHpG%Uc-!=X@&^ZI;CQRIul8<cS6?vT zewX~_>0+$g7&zAO2A;0IOn*QEPJ&pDX#(D|>vfPx5yt^M6x3MXX0PB96GyP)>1&t} z`5TasX5c%p7UMDvr?G(YYY0Vk4XD?XPBD6}@@6MzxG)o=tpO$@SWefs(^w4UpQiX9 zw%>TSwxZSjrB{hQ+Ka`4EdNwk(iT_JY3{m^cCTo_PA2u|eA=MjYBu~>LxF<G<!M;! z>T%E{EvLQ#TKSIlK)lEZzww#5mA{H|jX{!F>4I4IQ!9L5%Kl?VdGV!hWsMyDT|YS~ zB@G<@3m$C2{57V<b}CUP!IM<kiOZrwrc)a}e{;9D*ckpv1FZ(;(9p>sOmy?yxDC=B zeU9RQ9mXfdJ&lV8&h-2wdfo(}?NO5X6_teJ+8RrNX~p>)CKdc%DaF-H>Esy4&S?u5 zjd&bIt@P8#{s(G=O};zI=-8aY>`ihSP5jah<O8aOiOWcQo#S#wWHT8;0`+Yf!%&eX z{Mh&&mE`fSTN*7s(S%dUS!<(oem$9U*)1Tpc=F+Hh0R`3fWxQfGz#J{)9i4|wH}h) zwwZqJaIbpj&>fKC<TNKg@R<1l#^?<8pz-mkizTZLkaZdmzw<Yio(?py-+Y*%mK;~; z2-`1sZ*;W*_rDD96O4v~&bWQ%Zbj%+`dUpnR?dN&fOy(3eHYoF2@z_a<iL%uxvdR5 z7>8dn!8u>&a&ca_xdBrU%z4MY?8}_=rise<Go7BwaW1}KYapU?Dxj-ygyCAo0`GP1 zwKT1|0I8b4g^@kVoj%7e)2|ewYg=PZ1LYX2=b|zP=|d7deE-W<Q;@tc6K7ZFy=Y_| zGI2x!J^?jgoH)F#@R86=>;%sUJ*Tpo$bJ<-ilZQH8&^UDd4okw3#ZVydm8nK*jGz) z$xQrj+2xL9oyQt-QtQ<yY_1nBb~mwavg_9u$dEt|Hixi4jyL#r9(H7+#VhEgCqcLT zA{J~;PgX6p4N(3%cq2T_#yIbt^=%8sDE1fNd|lL~YC;CkN{eRyT!#z}4a}<_I)oT1 z;?iH_ZygT!7%bvV*qea2RdT)l=TdGw2zj2@F86g8J11z?_ERuQD7O7pa+wam2{u|^ zk8k~;@f+}zc#;q{)1Kd#sZ&|&Z(79G>G|bbvymJj?P1Vh&7vCXQ+%QJLNV|&<2{L! zR;V(e$P*Hh9BiTvCN<2K)$tire^b`on@p;hicgTPb$1^C{_6YVYirYYI_7k?_9t4X z%}Y=6xdhp?pS(fUp+@hEj-@{_#Y>)SODtMgZvv_*IZG61##y1x3a{<aS!!|uUVu`T z94Qg>!?Rxg;Fn9oSB`68%qm%4Hs+e#05r!CzGU~ge%SYFQ!0zke8%0}Goo(cW-`2{ zACof2lK{{;a6o`oV*@_U#0cOZe~?m?ts^|cM7}kS?SAqmIr1&^7t)a{iqL8=3;)CF zwA9{8cPLx`F%QEY?H^cHYV!E7zn(IThH4qp2Fk&XZmrO-NFIi~99>&}?_#+Vug+#; z1`$SPx01SAf7?y~c?nX=OMUi4BI4BWpk4aj{U}lW)~W|P9c2x1#km(Rf|L~)C;S}O z+{|>E>89h`#sRzut)D!lAFWVO7A9u?G^j}o)N!|RAJkXLQJRCPTpF^?j@T5{rsxOz zzb`hvDHsw#Ip!qVFI_R?H6-{w+D%;-3>dR392jqxY-Oy4&>|u0v=Zd<$wwNVCk~tE z0sibsg?!&PL3=%Ha%Xy;hq(9@KMPmbifs#Rfj2b1;Ma}wX+bzT#p4Qw=XSS&jKh?} zw=Vu{=)HIxKd0EutiPU(*j0ByyWoeNkes-<R$n$jc1>w+qSRelOe74u6$QrQ_?+R7 z{)A8B28?slRTJvDw#P=gqT$7Q)K2<zhrhA@R(!h&`dIqV^6P*XW^bOd6vzC?TYdAU zeq^bfOhfJkzi5HG*s`&Ge*eAD&7i7t;KTO}wXtAOZQyA7Pfa6b1Gy``5zHGiZ+$<( z{FhK92N=BS_{xqqpLx~VP!=kb_y@t{c6Kj|@@A5duVx`~2Y4NsN;@6I?7D(`Q`9N! z&QqU4fDggz)82@s=+KbRoOuRY-5md&@s$uE9oa7*0-k!&D&Pg=2f(pZeC|R`bUWtY zJ0(FFFqxJG06=Fr{`dfMUi(|e9bCaq384KJZ{H)|y!B!Z&fdL0U?yk&rh&hu^4*e@ z)6)PS{<-8t3+Ey=`J%}Q)9oj@!%0MdjTz`hQuq4#WkLR0NhOj&p%8rHnaq71x&rL_ z*u^)F*IC>lcWG_kxcL6F(`gxNgU0+ig6`cU+vX&|Z@1qpKtAv6(&OZ3e2ZR{CMJ(h z@(_nN<w+yNiL`0g?zeCIVd=-2_MC9IHa<?{;ip@ldP~EYmUPqEKpBn}IWBpU_rA1u z6B}I}foaw<P7!${(nNM7dVx1GPVm8Mo%bSe&W>i|1lpZpz4B|j4m80mJLS};4Z5Dt z%k9sE2>qX-zWOmie>)<M{#*NO)u$cibE`Jnlh!q#dDEa{Kc%k|lV0o)T`<&z_CH9` zh#^0ZSoa#z+%z_6sn!w;oLOM8#CJOgnp9`g<Fi3$8bpAv0!Mpuf9~z3?cVI6Mec76 zeEQ^a32Arh!{3*=C2y;X`nd#W;2$;<H!sXuHTBz%Z>L3m{7k$M@H*~>sU2*k^;`0u zw11Ng6Da|Dfi{UBcH#w7Atyp$V$nL-@ZXKZf8KEDHmL}{`r*wNJjWqD8!EZj+2rcN z_%~s3%-^@rH)-@q+jqm4_q*PZwNIRXKHCmsqJcar<rI)R6x_vK^!s~b_?m9G`7IsA zdkZW50{lh$>J(z&iWMg6t4$mEmEGSRk26BKx%pNG=Jp#4OdF=I<VSc&E^*Yau$@}? z`n2t=JEZwzeseHC(piM!_zwrG!m&~CYQV8Nqg3iv@>OdLcN1`NE7eIMZ+5#qyXxr$ z&cBv&d|wBmpZg$Q{<QObqF!}@5;z|@BTMcE^&sV^Kh^ak(11Up0sG!5T!5N&V%qxj zx5_#$*LSU4f?cvPmfo-!g>|*Mj6vowtgS?G#+B01Iy&I6+^q%U3g1M(IzkLShb^8# zVA<Ukc_b`NJOyK;oqd#hNU+-7>@0o<*q3h=4#Rc_@^|p&BQ+X0bp*knk_H1kqDjCl zVB^L^)~go|qy}35uAtqsE=wRvntiddEwMe5aNH%-cKFg#hdLgKQzWinT-&qHE~>CG zoA+l1)0czY<ana#F|#3!09wv-{?)ZmY=*MQm&zLSuLJ^{UTpk%2L7MgeUIS<cdih6 zG;X9%i9r2A=*3a!oKRt%L4ul#8&1$wTk@-kF35m>BHpd5z-HQPi5)=E!R1>Npl~{P zoUOKv0%8=(nBm{IYX&9P8lJecehm@^=+?mqqxiMv+#@J?j~&BLO+?kud<99WDg`Ye z<wQc2mdpqKdT+3zzKtQ9HpD7JD|%w_!o8S$dOE{zKNhr*uhcnt_MMNj*G8xPs%5p3 z83q3Wp;6uwX&Zila|k8ZkiInX-quo!^hx><9@vBGzJf&`nPUQYn?)ilU!ewlbi*+H z)kZ)~uBt0z;5?9wsTA50XK<V<7&<6_PGaMO`?#Zpgkw1Nf1NJ^Yw@di&qJ02#?Y)* zS=M6NIY|@%`#>;;p!TnJ#L84P-@mYU=yB*DAWzhQU}~zb1;_zoMEdOSx-We06!LnZ z(W+f-s<bk~xY74K|N0WI+=TaG%z!|6T&8y7-|knKs;O^7e~_MYKV|D{(@#ai(4Fdr z>gph76S%zdVwj-4b7}&2Ic#9)7lS`>5%zZl>2~r_mH)H&IM;*r4mSOxZ70vSWdXlJ zhQQ8d-&HSEX|tYM<|zq-CpaJtsJ#e=tyu5XhpW)E{8sV)wUtsA2&6x}ayA27K1b~n zO{|<^!okRRW3=1;Jos`m{68<#WvM>>wdFHCI8ZcJcBuMC59l&aJ7v%_N+25J&Ev&7 z2DB%oDPvc`frPP=l=KFj(a<mWRuEo%Y*gF!5LTYzeL0v8ZY#CSBt7Xb($9r2{CFoz zv;~}0IF7;My*_No#7Ar{vN-$?0GZBS!E7EH%=AghPJ(io1W@iLH11PjAO1b-Lcs2$ zk8XgUVfOA+1>;t5K0xCy#nk)Stoib&Ir1b=_q+&rbaRqg>*6!+m;1DSFuD+1f9$+R zMMHv(gHAmA#MaIxU$2{AK~LW4@>CUg_dz+PewLVmIKcg3a9|rbqJu+~LK1=peK`PA zn(5v;uTVN%TDtLR&X)CzE0zlazQwK{yBm%XXi~$tsXPRU(Zrc{mj_`}?t_j|Cxn%; zU|eh6sLul61`1uw>6dc@-0gbQak4x8`lZBN6rH8@EJi)*V0`G`*R?}z_KCu`&@|GF z6Bwq;#Az#=?EUIfF<ZaW(wHa3tQQRvVZ`OrBvg8BI$Y6Yr)A;hfze%1|Az0`id*L{ zSR{r>7inu9tk0P6{=GiFF$IYKja;*vMf1Fe&=sOH<4UNg#bm4!3-oSVU-MZYGrbuU zZ6mqb?RZT5uI7}7BPTZJqif70zyJD)|3&{1z}^>d{rKot)#G@P$|mO2Wp0K)$^<P< z=}3Ft=s_ZJlO^>JTr=h&nZu_)z(rwGI*dIKM*d82hKU8j;(UE-;~11}-lXsE@0O&m zCc}buHelR-_YGIN<f`nSy`8T;!!%zWg<K}`fGlXho|NrahIQ%=V_i3#hp#VtS0-Iu zlVc`NBx*aff{o$$cb}b2;4I7!f&Q{0i-~+1V?t^)0BzT89U#txz!ySp<xkY{Us{Rf z6XpCPzud*@l`MkMh6lX^0|8=V2RmkC+T5hh_jYc!J3Q?7Nzl+yssH=yfDSa4>qE<7 zQ)pKqvTd=00xl{Kw4*3<eWh@_XB{}7=MN|Rk)6{%-HcBNfS}0v3G&5)KdtA7Azlc^ zWA+&Ji*jKLU8Z3mmU<IE)c&cT1t+`2(Dy>yEO5|~GJv>}pnV1C>uv62XJUoB^2mQB z(-#!8j`_Dug|>c(MR#^<*98~Kivf?WwS^EUE17t!AH4+koZi3_3N^*^^IFFWo?$&1 zJgqv*8$Kp)FtG?AGey~BI$sxz=R5eRQ~0i}=lcEvTo^diJ(RKbqWwI7sBODGrR^Vn zVj@^Hz6c8MB)YNH_7%TuJI4njOn#u*f(^Vb_D_>nDZ0>Fx))9Bwv^`t(K&HiCc91Y z9?)trEsWF}70CwyumEv$Ez6)Cn(0&*DZ0_gL%?_V80j@NRi6xcf5|gh#!9uD)dbq+ z2IsBhsq(4Y_}<fQabFPIm>i~#pQ+ZCVIS#T=xCc#-OWoEeE_S*6-IPee#f0-;iWUx zl911aV&rw$$IQ=YItyONM5c}2sXN%8k`N6oul>OCO%abfqx3g%BeNja?f4;ny^%F- zMdDXIwyQp@8r#0mj5jhvIm~io8aLhTNYQ%A{-JarWB~_q!)_dhpE*i|_h#fdp2NEb z6!01oVNF?5F-|NEbgZ}-nr09@z8Vrv$Q^(K9lmp>>8vq7HObSNV?Ng5XPo%!e{BCO zw^mVr=`a$>8K3816yCOgNS;$H-L*D_hjPQ{ArHuy__OGjeizkEVBnkq=R3+J>T|h9 zn${La_irb3B05&s8;>>dO<Q?7_zEMW@3t;Nol=vJZqQfw#oF~+DZTlXqPJp17_D#; z(V(Yh7enT*cP}^nc7WNI^TzlFI$c$vKpOFH7O%4VE0Z!53{LiFk`pXEo@RC(er`pH zU<LVaPI;r6?PM_EOYr9%C57a|;Hh|q)qWukjN#X^p<vnc-U(pm^Y_pJu!mp3<fj$f z{nnY20zC@u3g=3nn&jP;ZT<Tb?!H0fe10Sg*@jQ`;QMh*okyrmW03!x-qV6h`qvlh zv2`>e3<_J-%GUe&H36K^<-&(=NmU7KhSW*d9_*frqc|~X46TraTpf9RP3`dKIcb7a znf=CMLXbdADITe+`xS;SiOq7869-DzV*n3XX~muVC&$BaA8LK37DkKmu-NBjBN0X0 zNF4|P<F=UO1NSQeMBFj)>qPShL{5Bg`2c|aw0)hwCZgX!viXDWCpe*!a&)E^`-0`$ zaU^I&Ij-#E3-(A~?#40=7^P1BqMsLuxkDapeDsS`Z^~o4DMP?#X5*yLA%MPSpNk-} zfbh^G_i~4R(C1^4T8|IfEM{7Ak`fGh+_~8QphukL#@!U7HzCxACJtu2*MU%?$561U zz1sij<#$>4sKV&0RWK3wtSO3X^K2<s9eRNIZ?DY=oA%@DbzCHwes1tRg+<Ipo6^k~ z#`##`%Qj1x<A1JMuOECXhlc_vPXX3(qMPeCTu?92aVK}GPod-#*h{C`n0sR0c~6BK z9v?h!C~W`tGWCQviGXmM@JOq|BsB=z{7^Dyo1CJQhI@7Kd5~u?ozroFM*uxZy|I?> zX8RqI(a@V7vvNw$2L2Zy^@Rp5w1AWRccUL$NeEu#kjJrr+HYH8IfdoH0<VR)E{NwV zz*0SJGvlOnEKWjFA?d}z;C~KJzF&FJF{sD*U0$?ka=ZXAyJBB0c0AYpjS+ljnbF{~ zP21Vz>C|$&TFqt|-P70Bj(;yV+K7e)HM`=R+Fe(%>$xv|^MP}NqGRXJ)94nxGzRT_ zXdIkh_!U@--$mcK%{!`a{SZ`3c;v%Qt#AuWjd^ag9#{Qhr!Vhcx|)d2QJ=Ms3^Mx3 z7*}$|1^nwR@ds_%fi7hzWHLWkd22!fKr?XoZxGqkT$euQy8J7QBW^INgh?o^0P)U+ z{k0{2Rd;8`bsmNFV8ImpMv@LN0qdT&d^i3on73q!$jBNDf}j=|Y^WpX&R1~o6AxN- zG&!lqP07}c3wyhw3m1Bh=h}a1it)bV&Co5}mB3FS?P25hFWSu@7HgNOyM^_QvvaI_ zqTEBZ#;cNNCmM%ChgCCho3W)$dUt!<`fP<_LDHuFhdMau-RTx~os8gu-P3k5vi}7w z02(^Y0h*V=rh9Y-Z_=Hf`w7m^ZY9Ik?l_GM`w}EA)2@3N>+JLA!*`mw$q{h%*XA(S zbV^{#{sX%w#h3>GY*Su2z;@n=U1U2?Ac4;+P%ksX$@zd{<0M%vkUrGIt<gXt^D4jU zdYtD>sN2kCd|!OY*tju(l*0kCx5G&J2n7Sl>Bouq3#l^-Da5xML}NZ>eXuOXumd{* zJ*wVm*I_mJyN!<jShw0*YH+_OUK6uTo;4JJ?~BamecMY?sBx(#t88r6UJ4ye>a%PN zk;2A8A8#ldHa8ROYT-;r!?E2CKP?2-MugeuroeKMz3d-gq)tTumCzp(Dx@bcx5T#a z?GOoJ)&n+KF*?mvU*1`!ptf6KzUM*@EpE61Z`~dC?|#vj)0$V~?!?D=`8iobT&M?I z2194<*xsia7FWh}Txq(~Z%isw+x1loWh-GePUV4qvxi~&(c?UEFXMmeQ<&xeDc9G! zkdZvI8rx|Mu^|7<;9HGd^=f|~XS|6AW#i|WF7hU=54sSW7=x+5+6ah-pG~+Em)&Ao zoAGYs_Oc07bh}NZxEmaR&^*U&%VXmMglgv|?xusUFOWt&SX#7ZDrUIK2}9|&4fU@0 z>1@k4dBmmm30c#RFx#d!EQDKJCIB8wpUqbb$k+4movXcd_0jU)_cx01ucLfY4s?@m zc@YwX-%iBAyBQz}L%p@db_m3JeIv=<lt9Eh+E~!Wa{Z@8;oP5&%z#??O|6TcaRR+_ z9;MyHPUEH+R8YA4_p3Wqz+lt5F<jKwX}vfD&znU67zpi3376g#N>DSvWU^*TdqQ1| zBYoLeP+uux&xgBD1XuL^+4KsCj<cC!+B}?JdXcUyTNtk3GZ}Fwr|&$lYkBzP_DOmP zbxyu)8G}HA$vD;3V82#6t0uVS`Gvordfb_Jhd_4%bS8o!#z-m+6RXyv2jC!2{A+-K zA2A&JxB1Sc=QC{=b>nW&?3BHU1UT6LwMj;m5HB%qTwLF_P^h;pk|PA%WrxNt3sag@ z@r_d@CYJ=)&r~QUSmzfhpPLs<f=ykW87zqAT;nI<kBuF>gz`BrSnyEXk}WRdF>%`R z($a(|vU``4C2Y20=4Dl<IR&F+^xlI&BGfpp_7CHM$@Gss=fagWZ-x(FY*x!ur!AA% zN=Bj>b!rl^;E78%fr|*~Lw&RYs2Ycq-#;L{n$n3HTExSEp+0;1@f?#AReLS+#pDTM zv4Oz`9q6<7^3X8Si(|xi(qk;Z9G!a94(!c+>XxHF?!{A{)Eo2D(`L4)*jh55*|6j4 zMe2|=<#QjlSMQ?o>??kDSVHhUi~*S(LR<Bzndp3hJK{ww`u@qPD;|HDF7|^u7e%=k zLiy~H7qVUshOrpIrv%_YzMG+La9xg;mW;hmUp+dS`qDbFE&_uNnyD_!b;Zx~`DML8 z`4@bzBUm~`br@7XdUN8-Gw!dV>;VxnN;96XNeTXQvB^zK%-&_`8-g6d68}-~J+xAC z(m}V6cy)ohdBgnN;7~j_vu$dW8#RV-!8N=;{d8=|F2#YbVpmUobZ(BCwf!>~(89uM zrelU|tQIbBHt7>V>Whi4EzOIdkUD6tYjhc@UU#Tku&Z4t$Xj-kpOUeEZAIk}QqSDk zddb7m6ydWk0I`W*;2}zv`_ncc$60J(hegQz4Wg^N{B_y*dN028+Iz;kuE&yo76#5S z-fKs3rgM_G{f#tarSJRiE4{fqc>JeWe+uv`D$o;F0n^ueDieaV)yA!pL=4tAHe^hI zcZy}F=p+h;vi>uzVck7J9u`IPs|)YG+A?6v_035KJap>mtixhMb*iLx6a#>Z{7o&6 zQ>k0KJy6dQ6J52YU(*44M^s9lo7o(AW+o}4Ojf+w=0rJlHWwUw;n8ZrGLx+O1X7Bx zN9WR8b&%|VV#4I^w*7KXj(`^1tjGUI;LG+sxmZ5cS4Puqn?wx~2DjBpYFGEb2S6@< z1iiNdA6lGK5su`Zo38*k8BC^w%&8J4tqxC#_DssdOcSYq-GSYDTPU^h;0@bh1cI4i zTw-YN#yjwfd0K7F3{MK^f<2Dk7i9A^5MG1wai-6US4b0sFS<~J>)FLOw*5u9B{$#! z@<n|DAW@xTP2BDmAXMXK^f%ka+QJ2fy}7pm3!jweW7>7wV6;xh;t!5rA*x})0X@P^ zdxK!My@gQSP;Pt{xWPTY%lB8DP{d<MMFTsVT4V^bezk!OduIad6NQECdrbKbJ_q|J znn*qSCa}$0EXMF`ahVnFoY0I-4>yQUNSM;K$9Hlq<qx_J=}Ny;C%h4WZQ6wkL6HN1 zg|G+b@cN_9r7noh;U7~$0xC1Vtg!a{`^0}ep~yLHFHrev+pZp#2!fM+Ws}G$;CJ-b z^Gok*97vFi$&41?s_|F*gdg|u1xsx-|K=Q%)o`|>7=j(naB49%So#e4Ytd9LVQiU} z<1E#IvBug_#&EMtE-vE?OaT9|I9{-MO?$VU4_s721ipQ~GPUvvE5GubzA~HMpfQ>4 z!|sKvL(kZ_!fW3En6ErN52C?1f{;&omL}uO*caZsFY)GHIO?}P|2him&I}<pJ<fY4 zI5!?~tE!6*7UjV{bsI!WTOceX@rYlE5M5-*lYpS|SNVx6Hod;r?vCL~b<D1T0a{$Y zZT&+fchib8;}O_5k}?!;J0MT6vz;l&8~i*5XX^r_{R?ZSej-I_{S_D-i80YD_U3u2 zC5jjum|BZ|Q;vKnQLsWriNta6xGVJ;wtc3>8$Kn<v5ZN~8_>W_80I`TeKun%?b1s1 z>^GzDVCZk5jr%Y%Fv+7O(jCe%c{^yIwXvs$lR2<0wTVScCF}Ezz1j`-)?a;(U0Yq0 zuHw5cQrG61Mav0KM^Msh25p2^YL6{(mu~U5p!U5E4A}t)K_?XJj(MT+;V_O{VJdJz zI*A#wcp&F=A}1O{vmFx6n7ZX=w{;aO&Yi>$Pc<m~?!i}`2u3sGVxI&h2Ef9H6Pe$| z*M`eq9qRh}NMQt=GUQg!*}+#m<D^Y}M*W^L&MV<M%I^}50(J-A_Rev~FFl+fVjs1a zw8uN%#lKkF<dy;WpiAE=6<~|!-tk_>5a2Xn0W7kv=x7?U4xynJvf=%?jwkz{i{>FY zc`9ES;DewP-C+<LdgCIg?b9a<a*eS_iNxBcs_iX$0JAT;%I6<=9>&@@@!-9q9)jxf zS7{yo6&eT+Yw-hWGG_W>u0&UkE~MoYqtA>A2+(B=aJ5W+)fU-4LHObyJMJcssk^?+ zhWivVkumDOfF6`a$uK$(4cy@;nc+*t!}2?3wXy8B&}ha|1HWwjUg~rcKh-a<u?=0h z1Qj3mKH7xJ9zSD)k^iDDCwG72MS}Vc(jENf(i64#6RxC)A|frQxXo24pH<+x2!1<3 z@M(=5^@@uNm53di`N-{(|B+vBExRMiZ2J9;646Ke+EDFEVef4$42?ZzJM2qVLSw@& zO;!;8*N*m2%V#zHmsa!_FJiYLO8DdQ_tQ?=Y)Vxv0(xga8HT+OHU01IBQdr}y!XFG z`~*C&WjD$0BmVo9JGVE?ZWnsQVfBPM-eTOa?lqi#{C0VU_<1G<zZO^NM3jnQ-khqG zBlQc2tripJYJ;%PeVu+#r{oKQm=1TxF5HC#Cx-aFo;}IYHxt?baxpEzOd0N^Vtv6n zjVP!MXvX<k_OZLZE!ZZ^4{cdbf5+$UVbr@5WO%kDt=NU?1JjU;MV7v(l^r>MU%$-o zMfXNNC%T91?v}cgyA5K3AN$959pp)@I<jBX<Iixzj_4WTT*T(FV0#}u0(x%7)3g!m z0{Ww@LSB?V%2JCHE)w_lQu8yJAbwA}o$f`y(l&gdMtoN`#|1}Ah)2-lbY<X&>RsF5 zby4T10)7Frd`&2rzQqhQj259f;ropx`xq<R)?5sXP#DoPfNsAnuD8d|f*dWkp+!4x zHffrL$KfAZW}8@H@M5rEJuLR0KGGL|1-_{IsN#a2`~X;dXU6EX9S0*gN?yDSo%lP) z+~pI;$CHSt%WcAMOaF)To)pp~-O@+SSod7^cud&v^ZC_McO((>hf^1jFE=ih4TgUi zLixjlU7IC=_P^-0*;_s#MKlH_K^C$k8C#&X?tabyIW89q6h+xT(D6H{mP{*nO84B^ z0ln<lN7{NBKYGa)>R&G1$AVzxVSon!8Ez^u{1()6^+ob~^!n8s8>aC;`QYazJ*X+D zqm23aP%m%nM$%uR&MGW2x`~4Bq3)G5hQhn6W6Q0BT8{R!4?#i{Fa@)IuYD1+&nj1w zDJV{Sq}(WSLm44Fu;&i|6u_2^c9Uxd{=B2mRxp!4>t^X#oi}hisHu0n>%tN&B7T%9 zyBpB__T@xP?0$8J$#A~Q>n#QU4KDbOBg!>wjYA}MU+Sibp#}<6P`U;pVqG1V%>cO& zn!c|>0VEE=ap6*K*1EZr$7TQ4mEEx6Uq84>VYFP~{R;Os@p%I?{~q3k%^gyHIw9bF z)?zTlnp0eCTwwe>-}DIOT}eS;&tH@gmZ{JpX-3~OxvC?>v8Y=u4&0Y<$ONM6`URFI z#t6jZ<N&;SFG|=(5aFCp@XpC+ByN5`4vZsgBr_B!!j@g;-SG!NxV397{GC;n_67HD z;(>xvb;dh3y2)1^OF>5XgptZb$-oJ!9xi=?=um%T-~*ZbJV79?S7eYAx1S!KQ2R$1 z&@Spk0%@%9O|CI{Nxm%Zoyz8>`W+F#*U`9*2a`H9pJO0Kx94K$5x}rI_0$2h&S*@< zXM86(^+HV^ZEwnIA>MGJ*>LLwjJqNLmH_M;HQu?=i_jg%p~YvsNIdSPU$nS)6fqFr z0+-}yF~wRdvONM?8@V{0vV#s6Q`Z`;fk$XMPR;653RP$bG(fxMvZ8~r0LE5+Y4;#& zZ^)K7ar%0{SPVQ5igS1hsTWfM#vVdu*mV;i+k$+J0vE*AqG`Vd2Vhz-c7D#;4o@5> zk_*fTeuO^%*bw;(16@|0<QSc5C|4ixDDB@aLrA`QemXotJ)fGWnC6ue8hngj(+v$S zo-)NM7xso=o8`DqXynin?r_sCkiG@phBtXeauNL<GF#dv!RWJ~57h?r^NtH)I>M=Z z!T*T8!^`vw3dCTy3G1hPoj=I=J!9Ns2Wkp3C}R`uG4SR9$jWo<PQ0j(U^(jgh6@d0 zHqs}&zWd7Nvkyvb?NzN{p_$_i`qW?*cCZ_>4}R)`8_0H$xGxKc&&jMN+1$!^Iru>Y zUqd*b)061t<c8M<u%SCB#6|@42Ep7*<7Yn=6{~2YDt5`13uTf4oG?)}BtdUFC_NvT zu`OWz>nri@S={Q`1Vf*}j)S^O<v&9K!Ktz_1@j&Q0sD<E&M46E(?Q{492K;hcTC%q zZ)qXa|8e=)$2U6SExh5EV|K-$WB#6wofEw)iK!6dPZyQ~WWiywfH2G!{aVJ5aB~OI zm+>N|IfCDo5Zc9NFjl4KKSke1<EtI4Qz8*tSiO6|ed;ig1@G3_#vMU1VaIrTl5&dl z`-T@m46$8x-3kVREqCMz!{5-c0Vi<K!bkl|l7--g6FlgXP?&%y?tt4)5Kx%)JFEb7 zv?XxjX3rwl;uLGaAV5cojOb)A@;>cfcob-<-tk>+;K1q0nQ~ff-iRK(zAb!eNgc^l zr{4F5XaPvbZbi-CR+kWf#AbYf^1y)?F|&d|yXSkHzQ~M#ovtp6ZmAP#S3cT2?a&Vl z+oo~2je!@hKo5%rQ9M)~Qxg0Daa@>B2jTCe+CTzK&|v|dx;w)oEi1XU-i^L<=!t$l zasK)-&%tpr!+J(8!r$w3qn@^6Z`0St{`im=JtNu%z8FxR`mG(F!sKUD7k`}8x%7?= zB{R{VfVOJ9z)Q+k!oZr!b6-jjTwJ`r_FHGT%}pdT?SEG!@K0_~2mC)eQ{M7<Xc8K0 zBP_CwjIZN;55X6DOkhE^Z6jz5sH4+=uO*oG-M*3cPy!~7zVx}5W-UZ2;t}`?cUV)O z*#v(n7sp}Xm;jan0E`tIOjzuW;g<Sj4ZcGV`RLeA<hI4o1I_fD*4Ouc@n(}aTZd8X z3e&GGJF50W-=<j3F!QrtZ2=C`SPk5suRfOD)&lei4@*3%@o%=g=sUIv(E-$8JkRFu zpp*)G#l%t_7LKrqZTqu-%cijqvEB4SW!^vkr*koJ(Z?psUN_rC6fLJPTO$t_FB)t& z|IR&7AzWdY?T0X&I=BPfDX75BKiPPzcD4-WXhhiJHITn7Rag352aJ#WU-tsmZ;VOh z$}d>GTC-`AI21AiP6ZyqY7#}Qg8*MZpufN0EmDnp`TVqknWU|-!+zrp%*5eu-9Cc( z1(qb~cdgD}?5)86%<fo~lMI}wMZBc|KP#Aee)qngwD`ilBybwE+8x`@4T^`5@O*!@ zMT3np;ZySSxjaEzC|QUzv*d^OIBNc8%wp!u*GJv*a+c6fS?l27vw^Uc-e>1`zhMJE zQieNXZTlVIznZ>|3#WIyN0Jd9clAa?7{dijjP~&hTf^Rse?{i5D*dRW@43T|%?&@< zrbmw)LBeUQNWBrA_frpv5)zR~yAz#W^k#~Lfi)*xbz09*-*Uor?9bH$<e<NdSY~G1 zNe|}7T|???T6KSuPhyI`9l%m2y|Ws3z;k${zN+~1{DWg^=3<A*11>>^T&GNqU^9d| z;@t*gV*8l<jevk@otvGLeV&go_cDh(A^8c!w5e2Pmha$;)H5V$n@|8no^Z;wfPBj| z!M7s4IS9>Lh`!Grz^?SN^n!MN)%Vf|vxsoyxbGG*wT7)Nbu{^o+eTrwz~<9BPrD#W z((kmrE?-4DImB4hOvLEa;*Bk4pK1qffvuXa_Co0$bc`n*3$Fdv2}LkLzv>?rup(Ov zN6|2!oF$HLZ+~u0>SauPGZs^h36%p0jMcfwV>BT}fXbhhw__88X<B)Y_C)bhr|wDT zWB}V#4C3}pjT5IL3ihsw7X=N`Gv_*`P;(<XJ%kGa)XPq6jgCh$hkDHF%SylwI3q@k zd~mP?zu~{Wr^ODT=DS6B$AFZc_ku^av&ta?9dk5UKV8091`uM4vL-EcDb_LjQCJ*{ z`<zG2>FnaOV{ek4@9vA4rknIV@s#}i;5J}5@@9C}gCplx?@PtZ38Lg=i#@ru8i)L3 zap!_gx|sP%`LV@sb<T=DGspCXRwviVp9c5(w>Ct;J*E;rlV#|wZe~4bBVGpZS_c5z zzv|mH);O@^(EBfX0qdRo-nFxLZNQNiyqnaHLkYYGIK0IO9?Zg4%X4}58^WpY?Al|v z_n{8xwLc+)yEMUDkKdL*@6Uliox4F5`Dba{v!OTgUa&^}%g!$+a9f{hQ&-JBhKB|m zzayxw(Hp_@Z+-oG;QJd;pD^~buah(s_|DDA|3t;Cwl%=#ZEL))?iajE9Zc><o*iMZ zP0Ik#D~_ZU<+5{Z=aUnj{wm4sD~er7rv=2W(Lc<9a0QIL7o0xT$Ixf^(nomg3*KO^ z#pc>l2i$C&$g>_}|FVi(8*0i%7OrRj{=?7w%34pFhLGDuM}M_7gfW$5;N<hC-$_hz z9G1tM189Zf_`a-^0Vjx<ZoAxT>C>V-F6vPk**712nV=1*9X!q_o?dj%IvWn7CBHnZ zXD?{o?*nX-9YUy67*&O(2|zT4;g^k2+NRqf;O7EEC!sy*%lZW4rKS}Ru>WE&{T0L1 zoP~CvMfNVI9lH39>>uqUz3@IAZu*6+a`2a>mkTe4`&b=7t7YFSoOk{$<j+UHM)_r* z7Io4Nxkll&0;=zEYx>*1@T*OyuLCn_1s3H;j?g-$sAIAgZ&DLbY1(v-19=zLV~BwS z+uQM}47cXln|tXM)8<bt^ucvf0~-vR+qQ1G+Q`<$jp;xqn+uKsEY@=+IC17pB+!G3 zS2jzS(V}-FKbNnHLn$I|`6(J$=~B?WnQqektbUwWRJyzH*mo|1{!ZH;F}^fw`rPtK z)V_hG35?zqn!+>?_1FHq?lHq|WM~ooa{|k4Au$Ot<Av6P+m8%0k74^_mBSQQO}gSM z@;G$~7pajxSPbmN6LqpS#za2zqN`g)`v{WsJB<`@D3|8J^T;QetKZi)@9;@|pg)l~ z3OsQIlD_TONiN3a34RET<XWs2P?2}Gj-gLEU8v7kyMzh_o0b`i9LcX@_h=ufy!XX) zoiLrh{P6-iV<jToaBe_64%>A+X?+=`-~XZ(ur~XX5O8g~!D;ggW++A8XpZ3ucv>BD z(~KRlfk(=O!tHZG0&jI8SfbGg_TS<0trJ(q8^~e5!1soPtuFq!=l(<kDP32xvz#XI z9d<gP&25v&R$1?W<E?fF{JS*E^3@3dAI(QR+=o=xa%}v0E4331f#}3=28jB<14^<x zQGl|lrgU~`92+}->@SQG+zj?NM`C!!>>W3j7xEWF?2K#c1=p3xe2sRvn1n3#D>c&p zLyOHc9$9)XzQxqXhpk08^A;178xF&B5f4=8`m{LyHcwI&m)%PL`~<~1iEwCl@YPT7 z^W)Ne#MBfOCI~M2<ks-2>%q?x*?uW|!;D5GS<&;N*lFj;@!kHLQT6rLa}C5WFzboc z6Z<yVpdouTcoqYnF+?Db5%%T)w$e$u*Pj^5&)ZwUzc7)V{Ne+@S%oySJ%iBRwVPc= z=R7%zu=~WXubS4o?V$%5F9kldV1;XraQ=LC0A4vu+6##Gy@NtyiKRjGbJvBjibdXC zJV9n3Bvt*t>eG!#CKr45q+fg33J?EF%)VkUWB=vTm>g}&jxQCIl}}D;XwlKk)>(w5 z{U^Omu^FP{MRN8ysdsZRodyFq=>($0|JV{S^jC&oscjXFFjJ=$Ccc_r2%cr~H+(AQ z?qQes-~2$`!`yG2up`PskXo@YuD&9QrkhW}O&eci9Kh#>5yZDP=l7P-B=A>d=Ym#m z5S5mwuR{B;7_#Ve7;7)aDua`G>`uz(q@CpgV#X;M)=$Z=-}yFh@;vP0F)vCR*cZpq zPrxZKQOKAb>zRFh87e7SMzQjTmtU5P1=D^Pz|ma(X&>)&L49)T1!!*7e1vcS%uqe! zK|flJ)TXt6C`2gelxdV`pH$}WVDsntJ6$K2f$kJlK63_}^m6|I#6Tvt%tcc+u@!K6 zQ1A()gPWVTGfsb5FMiKvP5{1f1i(lew}Gf~<{YOh95L?b5QuT$j~B2ihgp2{KX{3K z2_=m6X6-uqu{%zqpI^&CuMfc+m(4pGfU*Y%4m1K=t}iI5PK1|T|JZ;P4;W_`O#tpE zivC*pBkiB$*FEgo5{EJLG;RdI3zj1$QPRAx8?Z|qI=!Fxvr?Ho(RF6=foX^b!HF`( zfD@Jr0O`J}#T!4i+8Qx-IyU4z28eP{i?VV)zw@Dn$u-qRk3TC1*JLf3>KkvT!uT$M z!jY|19$jy%9yUv(5-$MU{yfqSU3AU~&&_>&D$KJM-%lX>N+N(^0lHp3(N^2p$|KWf z_o{x)3Kv7o+8-~lp8$xbU^*fG`Z{0L{Capw?>0zKzDui9I^fMP4*9B4Y#Q7XjfdKo zU^z7BSggn8G+3Av*relDo@6!|S(UOlxY!#`NRx*2m6gn}HzW{o#_-eL2{!p2q;sP` z6E4q0CkQ3Y_tmFZ_r3W|wWZnH_!Dy~=VXj@)V8sRZv=v4V4rt*iXbN`)tM6NjSL50 zj08Pe6#!-wu)~z;VL-<Ka0}V?Hzg;Q8l!tbDC4B~P#jlvY^&`B7>voEzi!e{AtwNe zqHsa%D++)YIKcdS!1O)w5Ux`YbuWfns4<>|8E{~Z2kG`@tl7#<z1JvY|Ic6hXu;be zL_*kq|M>jZU|j<^9nt=SN09j0qFi9?<4D77(M%qFEP|tG(Xj{MHHh4Sy5t0hTRwLj zr^`TFf@$k$pT$Eai756S54x$eBgq_zLNkMf%R}$t2RawaO(-{xG1l_1!7?k2b)X@0 zh{Wy9(=WPb{dP0*5lPhxd`Y*hz;?_u%y9AbGS(m30{D9J6%=B*aNr}oD={lE072ip z(nU0)C0AJvY#P196d&+I?ss1(=KZF``PyTN6il}L8oqm}d$vb^XQeKmgk57NK^Gv- z_c8iKt??lFXc}()V3$uY&Xfh%LHknBkwcIp|9r~NQFjc!0V3n;HKVlM)Oo-&yO|LG ztCG6yYUoI7tJZZ><W~z=<cAj}|3vm@g}(P=+?%q6^q4T7i&&MXzmF@uFu5RYREG-; z5k<1wK(LLXSjv{eph6kzXBS6=8{iF5P-o>DyR5&y{9@Q|dLG)OGp$A|KU5y4t`<JR z*!lRxdaLR6dw3ek$*p&%)v>}|NfAJAWJ}32P6`-@)*{`g1$pYF`Rio@S=Y}RZ<2D0 zDjld%yTT}dOTTJ?iRgJy^b{GXFHr+7dIOpfekY1P6$gW+DX|0|vUxLJyjl_zz0L_o zyAWk+tnOx(U8AQd1Oygn70cdlj=>ic7bR}ldhGzxf@mdNEjxd;R%Rgo`H$*P+VEnf z$)JyV-=Yy_-+Z>Uifd5!#fkKU{7V1=th$P&_MVs;Q*4^-Rkj8T7Neh|{+qqq>Ey3; z0)W$?Cl^uen#roz>if9VSNWsmtWs*FaFL_f6HX+Kj^d)BZ7|ISyKX!AH5vto3$iH! znItC{oFT0=Ir%vscnTLjm&u!FUGxuD4B7_?UVO~<V=+=(vEoJbcECY-jCHhG{V6sS zFW4s`pEhAlqmRC`pzTgA>#zD^Es=i9vhx|rJ=CveyG01P5`@EF?aGAqtl!6u3wF)> zODX%ef~PhynrlF66+Rc~eI)Y4mrVFuj{-;MZv3qY;8#F~g}Rq*jy`9^?>^{95w5@C zj_8^Lu|QkDkL}?7QH?JJ!;rn>LSMbN|7XF(?3N>Hj#LYHVaxcFi*1+u=`>Fnj&SoQ zTb1a_A<cNP%a7<z-LZQ=U%kYE{VYboWSmviO}&kot@6bU(46Y2pK$PBgynHgoYw%a zQgs~_+nXMLy==a>Os)@oDz_+Dt%r}Uffl{kAY*Yg)s~+4z&ZM;tuIhXm8vTKvI!{! zxfA9Im!XR)ko^}0F_$U(5i{c1f^>n`Iw9u3#FT`0{}D^hF+jNLh_8d~{SiN3IEi{* zUC_?(vtYk$jXC#<y<S680DJOuy_<D@YE6gtSWN6C+g%s1;!e`=hc|ml-|4qD5o<pa z+#%S|p-!XP)uVz5wY9EK4IC?Thm*y$AZAwdqn)&c1eZS{W77xqS-2h%-hP>a6k2Q` zk_%t1*E5mXApE8bo%mJjtvA=vhNSkqAjL^hYzZXvpY$To=BZy$YA-Cf%lvW4!7p$m zu?wUKoI<|va7#>Ynz7UBjTZxDa6l+t8}e9``Ly*5#@$#9f)E4_?3S0rvxhS}-|P6} zvMXg5x^_w*3~}5?d+B%{Oy2{p$HB)Co33g(wNdYU?YB{VdoDVRzE8A$Oi*rPhzYmG zfAk<vVvTuV`PN77@%3eVMu`!ouC~wY{<RZ%)RY4H`K%pQq@n!m>7KitaqzhV2$4+B zC~)M~cFWU(t@xrpErXs6{qWMg7yhKJUU%}0$RNqe3Bpgi<FB>^ppqr14&b+?MEbgy z@3--`->GB=7K3`<2=oyb(%i?;9V&dmX6omlZ`yFEwrRfLav34G4?nrN;Q}~7?{@SO z;kKJ?(WHC|EhxuIbJ{>`4giPcD%;k*LS<pJ+xuo=!^}R){@zM;xt$B@RJ*3T*Stf| ze^2Z%7s;cIoPSjLf2t`EbsZ(_(3X52bs9n{uOYDxwfMaR8V*>R^jczt#(&!u8Nv7Z z*53>lids8m%p)H+GWF6Fh#RG_-F!MZ2Y`tt7s7y|*pSbWn(Cx$d&eR9*;hb+CiXvg zhOier(OD$hzuDv~@MIu3K3+ziwex8LI(Fi18)W`uEZ{o`gZQOOZGUx7fd|ML^WI}C zf9dcQxJ}B7(ip#U<E~<}quyt35v{}S{ktrw_oe0_i_$f#+#}e9$whN$$Pn}YLmzJ5 zz0#(so9L-q`Au}&!?%Ila0c!+z3UB~=IT6eu!>Vo?O6kq4`L=zJD>Ql|Ey>4XBYa% zZJQp~>9~4ugC5Qc2IvCO%kZ)LC~zB({K7OIk-6EVSup|%y)?E^^ylR22LIYGfdODU z2x%S=BAtd(`RxlUl{BzH!hsCf;sVxDOg1j=^X0*=G?=<nY*DVsnBizfyYjG*8Ws&Y z0AARX8KSAWuq_S`wBmD<42bQVG{yp_Xg^5EZf``Wi+Q)S@z<63W!<f|pP?3<+SRe& zou-M=)(i4{0SK%_QP1M%Utg)#z`NP#jqCj!?!zG1ZHsTgh(K9>CXiytq;F=|5zbv% z@Gi!x)@qm@JPqIPLUUVwV-Os*E%a5;h#G?qCdiDxX?a-*)!5D+lW&eci*9D`b+cvk zC6#@I9qIKQfZ1Fi!RNrI_I(`8L$n1?93TlkkiWNY)!o4lqUk(WeFQYYx8z#y*roB0 zOux*0zHjQ`-`CGBEPlPk&vRUaMKk%arDD(-(b3%ul9Q$<aF#C-8N6U$sCI^L1L_gf zr^++{eJ3Ulfi+qA%jYW>njq00sERA;OHLg=kLZP1g7sXFujOU3kQ2aoz81v%YrMdj zMH79u`$zaTSPphv11bM#iyV>Y>>6-&e4S79ouGMFec>b$*kNrSzRcuy@3Pl2jX-}U z2tQ2ZMT_~>P_KLoe^8=CEMp!NgMase6-O*-H|OQ^w8Dr$taPPfSXDE<Jl@+imz<CW zao_AZIT?^kVn;8R1<fXr7wb@yYldolf6=EA8_jIYh;*ix6V;)258hr5e|K7lb&B(m z_xyHQ97>*-U4VLR695N3&97cTd_&hO0R-baxq=G*!So8v1;k9!|J!t&b!yh2*E-Ys z5Qkva_7(^mX(!SIW5NdfxoYC7sjsZ2zKP!n@$@gggy4jMK9FE~$CYQui{4w*!e)Gh z-LTa74!p$m#CUD%H3nCma;8_8D!w-T&bB}Adwg|kZ=K7yUK?2^`UZXI>*gR|5O=B2 z58u9w;GsdKUj6X+#Xok`?-hCs<@s9We4lEz{r>y{U-Iy;(di-xd(_FVe99M~`oXTy zJEiFUH0j-(=B(Lj$FG;Kpwj*qJtPr&cPUs=aZJPe32|gIgm%zj<l~goAC3oZGJs5g z0j_*JmHnPV8-5fVrvQ=oUA5)dc?@L#NJqDEXw&ge=mC)E>&fYX9lj8e@>0j#&;vit zHBE8Hr@D9yB13)B0cs$pqEOE#HIq?O9X|32Heu-?c8l3jV0)-T;Z(D*88meG!>*;1 zDkD{f)HE=3KQW&Fc^S6xv8A@Y%S&}~9WGq=i7SJoIn3Uu7R-IhP?)ylP&)p%B&?rX zxh-iq=wQDf_dxUZ1vHo(1O`vSWz(dDmRs7NxV~aA8+=1gg2{mb@9K8I4+z9c*U?SS zB*S;(LExB3<|o*Y?r5MdwCb|+f@<;WAHKs$a>nlA34}Mh!w~v?{eS+y{$K3>@PGP0 z8YPl8b?9z`vEu--3|ER3U)<hq)B@}M-jpq#GHfHc<>VRZqKPM+_<@s${;jWlbRKuU zT!?7hHOnANFQ@%W#n;jGw0{fqSV_;zLiJtb#eO+}o^D6>pU+ge0{ScOe80tosLpqA z*S2{O=ULvvM^m5n?>LFBQHTxgr?0Z-D}9F<Q4MQ%C#Pro_gt(7=mF5p=5mH6;3a_s z6NU)6?do@)XRi_*L(hdUti8clX{?2-WQ5UJX;CtE>(BZe7M|otI6!e-TgB6UZ_41O z*iLt@1`-q4@9{#^=xlcN#k`P`u%e=PT>Cj_8pFU?-%y+X2ub3Nft+YDBL+XJpM!nl z^VGqjlX(!L<yZeM<DS<yZA4s2ZreC6NR~-vV~4*;9gQpGnt<~xux-)Ue+Sx=BeEjY z)>1yBrEF&8b9%x!{fSDTX@8#9``xqy@QqfgToBYv&^6hH`)HXt?$3W;VVf?*7zA#f z>@35{GcAmW%GALGkzX%#AKP~!C}MzYA1nSnpieY?&x_0-Y<}z%^%Z5D(e@>Fz<GVo z9gwd4dh6>b4~w+zz?A)`u10k0SMl8?#vPwab%4YfRm&_5@<=&a7DrgamEGf{`cqj% zmT|eK%#B>+Xq&l~!T5xNcLlB9KeWwUy>JakR(wu<7!cjfSDWRSvOsRx=iq@~JH5$| zZjUNKG@NFS?tZZkGH8=}<TY5}`E&rZ4GZ?*?ju|!h?s85QilgU**2Jz-2W{-!f5p$ z|9AgQExXc*C`bxNdB^OfABKQB{wd%T206i`e(Mn?qqU`g<y<lQgu6ADX1^{N)aAZV zsm&7Oj1`rX7I;Knp@F;=nf=3+`1r&>w!Ff+im#`Fy(_aq_&u%<eK&QPZ8j-%-3`N| z7ws^zalBFG$IiarF8DR<kxXjSudBWsI-_~|yz{0NHx}Yuk-zoVoIo&UYo7q}Zuu(A zDHSr2dh%HZF_8^`&;1)_K=oW8N!~N>*2!=fE!uv=`Var@zp?+@|MUND|JDEhzq0@F z|KNWJSOve_bBoW#S6u}NKY$%7%x=lr&2>7q^R@#YbOh*awhMUPHd63jZxwC0&8J%@ z@*_$C_|kt@En_E*NneM?$yd~OoG9cX!QIyxC5Cor<8g~{gpV1Q`~I7j?}@;xl#k9z zflk^&7Q)35DTlYQrO$qylXR-Hw3xR9PKTd_H&IQbWZolf#`KxNxNl<vm^7yITqYcD z3g^4SYoSfwvvSvI9?9X4Gmo1Vpw)Pc8{a0bZd7=-ve1g`QQ73;wU4Lo3r*^w?zes4 zJBln~bmRbT48^X}rs`5g!LX_AH5wXnl=2?qQAK^WZ>d;I$*I|%|GQys5F7pwl81gl z4E5$gP?In`;Ya8b$LW>+1{co(68tM<Frc4LT9Er$pqV<Q@Crk9Z9Y)X?`P+SP?CcW z&!clwuuGOz5*b1hP*-E<C(2Wl1+NVRTqzE26+CKF9SrHAYY?0En9{k`!@oseP~a#& z!uhYGXUNwWaM2$joi0z11`ub-8e>i^oH>sTV@eDnV5122`RD#DM7Xc?lHMG9c=;2@ zjiT=yV{t6>nG8V5wXkVzOYw_;&}L|dny7!U!-DbV*#rQ1h&iAoo_<mglfSmb*x%FJ z3y^kM<ayw<981H@)P_QI@6?qpp>jAv?|%awh`0UNx$0If6z&CFJNei{6cE_-UQ?T) z3te7m5RYR8qBL*@t3H0v^Cf@>PHvCj;?%EnxhPBxxLxSOY=cC?SZ}Tx9Pqc$Pk7(J zx=9YZxGf69==Sk%z|Lp#pdw_5ta@zfa0!h4eai-Wh6<72=z;Yc45@S*Jbvn(R+c|4 zUd4sNPs)Vtx6$M^ocmay%oAKUouQrOPm$vUJxYeHO~w_0Gq`u^4dDoSG+MpsoiBFS zY6Hy&nl5+x77e3OoE=zCbnj_WR^>P};oC~Q;mYD2t@jEb(3$ZBH$M0wSH6V(yZ`im z@^kke{CEBX`*;7@|I~hCGfr1=dDi#7q&tcuZi){>xw&K)z1w!dFd45tKl<|pt+GXw z&Ho(z&li(AjtRyJF$49m-_0Z^03*Mm*E;=!_avHqYUyc=AwU1slYS<nn6Av#0gP+# z2xsi@oD3}r!w+x7PI2+-`Tx~0zU}v&!|@Fcj;PPT^g_cjK`n5PP}Z++o?$o|Q*Mf7 z;)O{O6G%9&R&(OUFbpE{Cd;m>ok`@68T)ZYYUyQs)Sssn|Bc+rO6p3YHxK>Z$8Fcr z#uY{DA*?^~x}5h83z4Rc_?`H*E_-*+Dcu{4)=s~+scQ$Oscm6B_<^2?LVuk2U@&kI ziVEl|u(6bHIqBNv_|}owT{(h21OkzW6IGJG!{P|e3kD24RmE@|$@V^hwS86hX?oKI z?;&mTn-3)}ZPVjZp7jtrT6OoU6&q$00a)XLHx!2jsaZ5QW~Slw%{#{UH|yg7r`J0; zQ}Sty%Ci`~&ME8EQD9rL_b0r4>xKK(hL8o5k9q<$T_$_KXN=9?KzqlIX97SQnI@cg zoFD6Ienl{H^9yjhyixKSf5ok5(c`NYucF4)2K3NFUx5P$Ki<h^Ncxl{sc~ID{Kr=n z;DX->xv15kJ2#ENXYZ`X-}Np*&JOOEIO2=!3{@={kkI(p;<OR!T5X*ol`_w5aVv+w z#^W|Z*`Uw2k8>RbXB)Rk9g&DC6qCl`&yk)mUh-M+z6!ofa!KRR^M!C&HB(?U4C`m^ zvz`cyrLTSl<3Clqw#Jp&jptII&q8o)ZL|y6B9gF?V$lBD5GAc0-QSXgtN{*QY59|~ zk-Ni1r+DSU)K?YXk_Y4^*|{v}?bvp4a*Ms7(^Qw0v`m#`n!Yyr0^qoHLeL@TEgS3T zy^}kr`NVI^ZZ1)a&L~ObKj(oMVxdaRznv*_bI`D=eh|9Z)9sd<@(GW7;R&Z|I|K`f zrv0*7C;CDsJ=MvMAGJ4X>-L}j7ypa8`%lhd7Sr^u>>9b>``V(0nY1p%Zgz#qDbI0v z5%<wmPP)xhuUpbBkyCeeEA=brL?ulWZRfcgReVV_&96e#2>>@ra*aT_G4ENA#$7Ic zJOdiedn7KPrGYWIlKcn1SJL3sWW;oYib)wcA1F!Q$Tn1y_$yv|!imx&%qL9JfB>W+ zyh^8Qwj`9`D~zXlj?O4-Nj=41MN*6c$q?Q4-t;hT=pvX<Pq(**QN=J`hqn7DfX*h! zHrKIfaXUIM`=8z2IL~XG6Q-?s2|j)Io+NCKx@B*BJT=IxSec-D9*aYB)>T^IV(C%; zTduss?&9UJJ@qN4xg{^KJ>MC$iQ)8O)rW*lKcTiY1=A$34WKH0(TlVjVxfF?o96q4 zWQ#XX5+;64t*!Ig16p|D&)WQNZ1Cj8k+HjsJTw;E=r-Fnx~%e<C`ypKW7<_JALMg3 z;p6C7813s=hS50AMGtrCEDcTXLpVWmQn);J6ICDm>1UL|(rrpKRw*sty}!uiJ{v*L zUyVQC1E@n?T*=SpSL+}M-e&xRP2F;<>fgOsQ(t@Y?w^FvS1I$9x)PTI0zb5IXtRBS zQ}pB58Vs>!%gLx>mS53yDFOD6G{r9fL^`>QZQg*~w!u>8!d3Ygnp8I1;vV@whBXlw z+se=dXbr2{<Vk}DSYSjoc9beZcN<Cl#vZWQvRf>uCjaq&@88A>!To*R)@Ia48zVP@ z`ZLn%2O~$}XfW{QGoP95`mXx)sjUfqy_V;jx-PzG?fbU=1SjxZfS{EVgGhV;|EFcs z$KUt-JGR_p=&W{Zke@-t^@-Vys!z}-1pIPR;#KAC-t<DuoBl{$q@G|Bos*37Z2g*A zQDv6Q)X8zEeJ+UrG>6Kk-$&h1e=wd03Cm00HF3qneStOXKZbLjWj{<_$FE88j1mm| zYF6sycyCwo@**3g<NMUr|KtDt|Eik*-~Z?TYyY$V(Z7Gw<NhSMGh`Djv-fb-NnNFP zhXXw5g&^nTZ^V>5*^;~OAcs=VcF6QqwZ(U^4*SmwGlvaX80}aFXoVyMlPk9;m^9q^ zGA6}h2Q<!GT(%@t`U5Gx;YsS+m8|lu1n#^@e>^{$=2W+}+7=<2|Ba8wib-Q8?oBH{ zW86*@)>sx>CcM}K6v&ajQ>U5Uqyb0D^n_CA*jD5bAcym$Y)a@Q`@(B*1e+SUP#QSi zh}rRj3+}}uTOeQb7}~^}_U{(7%r+g^isW6fFp6O4b1_z!C=k5rE<7Y~DzFC*jx*Lg zV;ReUw!yYJhS6T?G2ZP?@NwY-9$$qLiMfm=E2Cln5MZ?`77Vq&nh0$#V~R-$!?HnO z=W52}Ae;K@QSB_YZ=&4r^VbJOx?=&%_!-h+Oh29!-o|V4lrWt!J{z27_4Q9`a+9|W zIhAY|-!QBSbfED*r?jx`z-jv!XFYEsd~afXulexVCL9W!-c~m#E;8Z`H5C8*Qk$8V zr+?_P_<5&S{QM;F!DXAi_I<{PX&3GHWH@H;<azuVz0>R37GqJ=!t^Y=9kLIPp&ums zbzNg4ges_6yXm$kK9$e(tmO#5eNhatv_GGOQp~J=qFf2{M_GeVClmz0^Sey~&gig2 zx#k}dXifB;(V6BACOQq{y5zK-X+FzdM)$bPCzCB6MM(c>N|M0X6@#j9#rzmSJuD#s z3e}OYyY6fIymxpmT|~z40PcNZi8ILQs6sA<ca*T$w5jALI{w(n`=CGnfCVY>U-hV# z@c~@klf0wU=N1`MJF%{7w^kFzr-F&$#({ENw<pm@vD5!VjAlSJ=z}D|V`1ySUrQ!I z2+sIxIqKwA^*-p*L9M~}l(#z;tG_W=ykeQLOIW_1d6c9AkiXZ>fPb;zqDdZ+CZA!< zH+&&&pqwcAwvP(-@94yp{k#wB-~DI*{@Qh;T(1Uy9H-cC?6-U%z;uTBj=O%0{RhMA zdEb)544|~Z9bh>G%al&r3=&sgBLpjPj3NG$Gj+%@2`SNEivV|TwX^BI`j5yqru<(F z*nE*l>dOPEL#q>kW4{OEb%8wc3uEErm?$PT&TQ9<bV^~9>_RU+9OIAq*ztM3ABT0S zzY-2@-3P4wJ!&a?m4^#$2r~BE02YJF-mwkpFcPsjZ?jRSt$b;du&<K}@M}4-%f&B8 zCa9=DuZXp2e=Y($exetSeK>#;TWl!HqUpbF<VO7-E4%VX;D4$!vk^zImiYbvIiIRO zhoa)YXq@Um#^jBp00CoeUCeCw8H<|Q^gz`?2!Gm4w16kD&!(@9`yrQ^Q|>0|UqNjC zA))x%7F`vt0`v*Wa)ws%zgP{Yv2kI*Oti@t{xE*>GDL&-)7ZzBxbZ~$JD<>Z0rc|o znmQ33-4ac={1*6$yR{)#e1EdU|Kb0vk&cn3-*8-T_X|#|@n#HQz3=+;O=#KMCSl8; z;q;;&=;crUSC0qhtkEan6pc3`pdTNagrl&|#ZUgMohVld!xNPr>9a{oNN;MfZ$WR+ z?ywVUwpLt|amU$x>2P((C3oK~E^CHrjaFg->1%bOycVZsD=yd}%iO->SNqIWd%^xU zLgwO?&}Pv*bu$g#WzpX>eszq=%`Nszm~RE)PYGqNqw)d}U|%^#s2DyVA03<y<EW~G z+Y#t2FNW(tx9<Ul2m}GJrSS7XM1Vz`QGjy-z|R8)>-OH7^fTMzr@=E{`Yg`^@E}QG zd!is)0l`t-`J~KLlpGhWw5y5H{tYFT>-gA%LdCCo=;ynIjszd&08Vu>->n_h8!$U1 z{;|b7KCpYut4=QSe)PReY;s7b3Oaw7NB^ztHWQ=P5hq-?Uw|U}@;2iN0%l|jlNUiy zNj8_Jp+b&D=gDDXKOZ17h~rmvkcqkQ^qZpo*g%#^8U|f8gAhmF?|3m1Xid;D#>S-N zKmRZOm!{=E`A`2nw9p=Vx$5E>1TThg%Z{0c+tKhY>y0}Nhj+DD8&jk4Yo3|J<t``U zc|uGXhUKpWdB(Al6EDW5en0GQ=I4&o_Zrv>J2-Hq=s1Z>U=yZu2ArlR;F_Mh<A<7f zu|LP|)%c}MHcU`fpmu;#4v;XAPAT!gs#8}!9#*B(wGD^rcoW?>z$Ii-ywZW)gxJLW zTIAtre+dTyYb~A`z~9DT28;FRyUssl-fo+9{Je9_`s|Dga7qVk0TCu+06$FmgsuE} z>Vp=C$H`K_{S1|39ZtG72QW!iz<RxxN5qT%f?Q(ZUFug)G*aAQI`N=oXjQl(TNnZm z+ZnjcTpDZ*c~<@x44vwr9ynoUri+2)kFWd$ov!;Ej;(NRgNs9{@{9Hgi0JkN8R!<a zI<Ss%;Wg=Q7{to*5v?!1a2odh9MV$ncz5F1Q0WJL#`(u29h9^EZhWu-zt*1xAZz_C zVJu{$W9=w3<-SV^>oR_`NnDT`Z|$)D<NGa}F4>6Oa(rjsikpNkF^O`pQ}+U&keE|1 z-1=*Q_4T_rJTCiw5sgu}#m>YH#O!2fgHLz`n=AupzwQtxYtd-6s?F!w&mzZ^u2Xw8 z$M=O}sY}O!Ytzv{SR{S)Qlm>~_v-YrvcIq)2lgkrVad8j_7Gq*u2hK3OMW&9ED&z* zeRjU@PdX0e0vN$xCm%XV7$$L7o>m|0VMmgp4DN<}(jWR(XK?$m%R1{`>OjD|+gwdh z)p3<q3ugp<7$Fk9+8L^kTz=x_pyTok@kxD>Fy_&=mm(=XlXVA($lNdzWN1;tDAWE0 zjek-I_Mdbl{Xjv9L4cA{(t}_Y)x%_|>S|_Vq{rBOUT>~$j`UB)|7ExbV%EDM;J=VR z>2S!L9tQ`0^qLoQf`@jsj69az)&nDOaY(yvgLg;BP>;1i3E3vk@b+1K(QL65euHL9 z;Hy=V$+N(t=Jr;=u^}G~7C2|jPoUv<G6W`Hm{Et(S_8SkXoUas|J7W;`rrJQ|GR5I zzt#HIqv(1TB(A6QmgF%%TwL}$`@u=Nk9w4IF3vpss+YAxSbo?Wm0;$(sVwV{K(d`x z@`utr@XZWQ4x%2o8TcVPbD%iy$FlNMNdr&P)tJ4<RyG4(V{=hp=H1)*fl{mq3{aAj z7$*f}T*+%UTQiGi(gBhV#^P_afI2-Cx5KRZUQ3Cof6x|n2ObcPsrxZ>HxmHzoCmcF zyg>>qMvuh@vp2Td^zq`S895c8#lUCSXrIs)WYE_ZUVWcl#1oD^*_NeahdWuQArw;# zc0X-3Iphof<}@_wU$$%g?1`}tI9a1c5OY)xG6@L);Ipm#jf20B){hzxQtW`wnih$d zT6FTW`gwsma&wa0rJ%V}!eTZ|6zsU-umU?P&nUb4dda3Dy7)yh*vDL$f7<#_JgHHO z{cID-nBagMxN$Liu&*F3R9JCX$S>&Li$lN0!|wls41f9|u?zekFlqza?E`1XooqcL zT`>KaE1L0wjX@nINZ`aeBs~jY1-;^v(NOT~h3y5>&uzXV$dAR*^V+ofuKD_!>~<%; zz~4?m^Y8XJHnTl%=V$oCFuAD^=pT@9>%{|Futimhmd&SyR0MAtXUVTkatak;@+Nh` z@Y`CHUw_7D_eRO91H^V=neVN*V^IME-Tz^C`?*_jeIBjrgdOG%xo}x-Fxp-m{uPQr z-+Sh2)&7GQ3a;<<IpBWH&mEvHr~f^vXq_JUO)xFrpD*&ZXkAEUea5Ww%V<<Y8wZB* zLf;S=N|M{KnH5i5@M*IUURpY<eunz3_g$Nx$gdlL+J@VPz`Q~HhbX^;t<2rVy|i{{ z<??XIG$;t>qDy~eCEEsdQ?RqR{WYVsH}G`zI)IumktbSYKK&loS5V+B9=X*ojRY!R zuvI_$8m37}@2DUCxiO=hNs&Ro=bMulf{&j01W6NB=deRTST37I%tLhvgxphqM4mod z<D;kj?p){vnBSLY^DtEtzXqC4+_OO;O#PVp%lY{CuMhtFpLbws`H%kXzxm7Ge>Cdv zitF(2R-RF_f5V^>06T-E*Kky2-WMm`trHLBa}RI4cSs`<Ej}@K*ziS_-`6iUBiqXb z3a}}M_SvkNl(;)3$-4%b=O3EZ{#UvEy(9Q#tz9|hFKQc??nzs7K!VnR8Dbv<(+n2+ z76aWRh{g+ea`(R%Is$MuKg{fs3cRc>&Sjv6W?VMIv7&d@eI<CqoOzG4t@)w(=z71) z!*|+}@;EQ~Z3kcv4^&HUeyU-P33R?VI~QI(ZB3oEH>_Zo)q?!4rEAJzi{^q%!)U_9 z0|Ge_NsA9B(WT!Q0vKhl4S3!IQca+w+9rR;iJx(k3_#R!FELD<L-)zL+B|ZKuQ)Mb zy-<24NBoQhPh#ClY76T%2r%CC^ls3@g!4N?Exm1666f;y*3#iTMzANmEg=WGLg`mn zk((7uTQl{-EP6A;uL?gW(7p=qWBO6gLv&}nCoD0zdcdI1J}VXU)S}%YZO-{JF7R<l z#BN(it9N|1JF_zHX%f)>8-f!t>SK-Stdjvj3L8ukAKW<xQ%p~vQ@V~Py?EomPq1W9 z()}I%=c|3?a0`j)4C(ug3F`*o*O!jah7fBpT>WPE`uQbh>(QY*8NQHg?=(XCP0K=e zwIoF-w~2cF^9OG3;g_=uvd!w+J57pPx3q0hM+;Q)xs8Fz0rm5;d9N0}%BpFI@_lZx zxwSzB5Z+Xw8!4Ls8~CY^k^3)jtPJrxn-ms`eRBRhv>J;(%CWrMNrh5x5C@hQB|Bsb zYBb|wY6xrBe5QT2zFP0{mvwPzr?%yH{1sn91<>|~Fd_uhuwxfuZiIBl=_+u#+;BEl z{yj_BWa;0tXMF04vXkA+ab))osM?>ny`%Rxd}wvzgo5jy@)e6>FTv}?%4&uy>ZCF3 zW2z59#7UG)V9FCB4DIjRnBs#T%JXG4<IL%LK8EBbCuKL2F=(LOgH3nO!6Eg4C+=Fp zb~vHaLgM%3nS<wIMhPcSTW;8V1R_=S|LuSIzqecYU*|Jqolh^Mx;h8+bc|M%11LI} z_@$rOg;P)*KFZM=%mwjiJiz;clNHfj5$EX*@!>DaL0@<h@*E>qVgkKvCe8=j5lB97 znx3ogw*UQq^B?`???1Hv_FonkS%(w;S5e1-3KzTLKxG=&U_VO64Q0r~sAqB|i31v* zi$8RSL_ew-msqfGXDb3e-)Uct--kZ+{u-V}7C>V{IAgJ|){s1cszXES<TDu%9%Wmw zv7fI|=7OMe?Dnhh(95`p!G*4%ar$Y)PWLOpRf63waW`88RPfOE<RmbSqvVi~QlA3; z3W+6K_eldGfBu|w@XKc5GgJGf0@nrVl%@XY*N-2(zUmZ!b*P|)li2&9|4`=Uiix9> zlV_9Z0QX&Svd66B&kfenb~p^>uNmeS6;6HW5~yhLmVREiH6n@9nJrIPCiE(zzKIf# zd*9ba=>X2<aTVwQ&ewp8W{fm`5uJ<y^aOnddI>C~F5lO<0Fo*VD8|Mhz~8*Hs&+@= zV3?)8PMz_cgsA6v8a{<n;|QzR*|vWAjd2*M>9aB0U!kn`i#<-z>T9mv<MCy*Xg5)d z0gDbKt<D^J@`A4ZlJM_EKM+#S;RW!Xv0LON@x`2}E?yiSm)yWNMQr}T<i2I6ixPaN zwX6dVJ*qW{;_&OVb?&y(r&iJ0vf1fwyF{+p+BdEc&}Lf>w9KjQ({b5z1BDBtS<{Uw zmiZH{O0m!82iidDQEg66K`lisy=zywVKeILz}KjIvNclF?ABQFmpQf1W`+N)r#6(^ z#%u)bgQP}@7y;h}q!z#Qz1_zz>WpcCIT==u7#bVQ?S3s`bMR*NHer~(I&ks*->clH z{2i8e&Mtn{Q?H2tdBEvIpTc;b{3u27hF%H6@bot#?>5g>C&y3y3t<l3Z^LefHlylF zLuCKH-<=EaDqtEJK#vTR<M4k?-M_}&a}{;sXw@^mIRbHBh;m6#=kEoQ@E-`bBt$__ za{*D9ganVy2q7@u2^mFn#KBR~kp#qHR7em7B_R<IAs5CQw*&|hK0^`^{f`QPc*GY& z0=zrB&eOYBReh^gt?qt)0p(Qk{C4l|wW?~>s#{mDUVAuev8`R7gDP9n05>=|o<>ub zE!%@xPIF!;rvz#^hdh{RKD-s$!M-=?dUgsuNeC&uQ^&^Y7VR2?zUrq?!3p36B@BDe zG<ftGr_%_g)mguh&Si^r`EfX3K_Fe-C}2DgBD^ugW*uH~b7vqH+BccaEA3k1+3aEp zZuZ3R!1sD%<;Czfd8=NvS4O7K{UIeC)OjQ=B+gj0|5TuQ^cknpH=lGOJ@7%t(}N#+ z;=XWI!QG#|i$49yJLuD&_!QlI<NN93AGw`we((FJnh7!gf#*32i=x1==EQ2NJo63; zNWlwooC9pZ#ZBMi&i)R%_gCGA(7z#k{I-wL-`x69<E?-8sXDfn1i&>;j)BzO`8+V# z{Cp(zu+tw+_dDSMKoOiAI6PjYUtgcj{C__A>HX2?@4EZ&_)hx5;U^ANNcYwd^JPAU zHM_{a*a)!%bQS0G<Wo<f`<`%r!U*J!lsb2vS50B8qCrM5wfW2)|FA#%h0lJD{^^c8 z56Azx7(0Svk3KTjcuXXL!E6tlJ}L1V=U(By$KQ`0a@xZ}4-~=|?)p6a<qhv{{VII~ zd4wmKOjsc}<;*kaUdP>ws#*NdJKjT||Lol`(B%6yI4EvnDw9wbRJumx+-CUd<G=P$ z77vF`6gp0G_?I`lr=7)B16eM)Z*)dxeV})q(g<})k3gKG`SMpE&fAHnK0KVq!A`v1 ze8amyjs=aWU>jtu7{uae7@Jgr6e}pGPsy_QnnQa#`Lt7P^wmWC$s7MTnn7}j0{)mn zd?E{qYN7d2K%A?#N*4+pE|UKBB#V<)!~y;#dY7&*@S8c(;sf;&oiHJi0mh_K>71Bc zd=)lgnXVq}=ifsH+8)STun$?hg6K%dC60M|pya;N+v|#<@W4cMktn=^4Iz4NmT=id z+dBI}kAWe}BV&7~<3iNPGZo<Mn`Hm2xzVnRP}u?~@Z5Xu*jHlA;xO8T)a@F_9A`xO z{(wKmGsFSKKSoT6hkfCbIw(%f=WQ+`H7qj418h|j8F}A)4&N|9ol<>AZ#^u2)T5%2 zrOKc+e#tK1^EHYXP;ml3lKLVpqGbMt>?>RXiIANJDm)lYuQ_AL1EAD5A6K(kwI7kw z$(5oT4`>aAOaq#{z#zKANMcQCzu3UV@t9^7#7Lcc45-XfHO+(VbV3pZal{Lp_E$$z zJ({uh^eQEvd+sW}n!^c-$mwRsQH0KO|1`qn?CXJGRA??fI|1>yNZO@Cs{LUeI+_|- z(WlSJt>Tlc_-&rGy>K!9AxPkjsJ6ff`$0=Ua(AwbVF=NND?}#8PM{q07EK^ffM#qb z9O?8+gXL?24d&}7&>f%nWY8VsEz=9b$bqiiE^=*A0jbgA{$`<o?nxX|y!j``wSR(? zbV66Q?WycMVVvF(+!wbFd?kzSS1{8QOWbGt6pExC>RQ-6JpPu$BGnVl`7Zk2XPi4M zR#h;q#QK)6I+4ER<P+)J&-u>%xv8l2!S}wO{_NU!&|9y36QNz<OobclWcGy9)UKI4 zWqxhI+xdpUdl^d|%1qbD6>#GJ=U(xW{pScibmIr;N1pocfgxb9Of_8gJqX2wkSNQC z!}<Ah*3knx>-?wCndg5G{d2)o$ok*6ew_Z-O@B$Z9{zpg@XvHpdMEDF=to^q3+K7n z)2x?$a{ld4Kj-l8N%YSRUpOo%{M~JTO}D@A7P|eWTj-<j`!FfLL^yv@)8frZUTwAP zGu*r8w%%tdUOng17Y=d!(_tZQE?}X40<OJ%L>_GB)CV8V>sc3`OAk5qVI_?luDFI? z|Ki^$eQEif()rvrBvESYGz2a1O~tF{T>8_)cAweH;yqNSU*o){|1Ld(@rjUFXijwQ z#m}P0op%l`!Hb{%V|3e1A2J-XYtx4ov(GcW6HA(3MUl5F!B(RL<}-RjI-mKP<L^&D z@v@(%CHRv!zO5AufF7#a4(KvPF)3R_?O98F{Tq3-&(3k=_RZ_GJs0f8(E3r6rBKF1 z0i#gNfiRfp4?o~ap=?_&**Q)nLR#n-jnOebC>5XEE1ON8yno=eBYkyndKEvrV}ZC> zy?V#RnDv!@d_cF;9D*no*BbskTL(m_mKtL12BAHy+4FeN+qU(AxNL=R&5tO~xIU;A z%)J91^%FQokFN78uo`iRoEn~qJZ2fjZ=)9Eva;)O9*P+s0K>m{ww(`!zTB-@IWuhr z6FBM*#w0(V$(38TP#k+E#tDz90#Qu6TF!t!USK&Dx&w+Dk3NoQn;f_}GuxVw)`&RB zg`C7r&^66&>_BrJ3hleJvI99RV3jS_zEd{|FqZK(S!f@9q?3?^z6Gg(CJCj?F9RRo zaS+=`fY>K%3H6L~`b4!EvGv7(9R9`*0$T>jjhj^%JT|WDK~sEvqA_3J?!uPG14If5 zZ|j?TRn&V`3ZEeeqi_hG5O9Z6^8|dF)e-4*7_PwxrD&sbB^giRRSKdr3Li_xZ%G0s zkjN5KFApvp8TDZ^-p<Al+Y^G`ICi1_!9=I80}ZiufJoqZ13Y<)gLgKFTnn|JVk0t@ znDEX?+IOCFCau8}&pwlW_qQ%5G$rJh$)zXAUw3oG=_!&#wQTci$fflmcKa79-9)%I z+ZR3OOwUCcb$vcB6e2$h<^54`DgS;iBA%blDrcrx;z_)rNILtdGaf@f{8P`PM?Lmb z`eMOU44R5r)87yM)KBb-SZ}@Z8v4{HK1D?7iDeb|vl?oGnv)XgSMF7F;pln?@VK*| zxLCZJ;FQxJz5n~rjW-hqCUFdv$E;Q)9XQ|FDKXbdMDg{we@?j9ardEzp8kma-vm=Z z>!$1fg5G-h8|ZHj3p{%WPK8MALysJUa`8^bbkJ_n;8vs(=|3BM<#G3>6Aud{(;r<t zpZnlD-c2_j7Kh$-^>x9HCcsss@upFYTPRdx$z_v^cJ8%Mw?HnNAg(+!T?`45G~1f} z%uF)+nhMT5EN*@99q*x!9TxVSoZ^-;4j4UcJGy4hJ2>(*vh2ghfLVddJGZF730J;- zZ1vti+uZkr`>htQCV13$eXAF+l#Af^cLa(TRLguLTZp3I`~y;|A95cFpf~`+@PZH6 zLOU1vQgxGnQ+1UHe73f0H%Q?jCkC~^45F3hPQ0K~jahSs=%6UXY12}bp*={6c5Ou$ z&3#EIZ_YknkMzuIfIqR-WG${^L252uv2ERfHN&~khFF0X`-8JiJ%9#71{b%xX#Edn zf_y;TgEF56&0{!?(iskXV&Wv8E3x#Js}HX5b~gTEY>fX_R0QABYm6*>D<BHJcG<0f zN8(K*?ns4;BMBBk@x0>KnFpDeUtWSBC^7LE58#u#)mJ&MX86j>B$2q!O|u~a9zcch z;W3A#mdeSJjG#M;-(_&DXWWl5X`$Tgm5s@$7mZiD|2G^3BLg^~V+AE--X(ozP^R>c zTrWZ!s>GVm0}jp&3zY5v^VQ5>F@0!olsJ*lnbwTF5?9skiv^k9+7!h}t^S~y;u2^f ziB|SVHgC~exxy30ceA&FtX^4fv4&r|)_O)tYD2uq1}xcVD#R9fK!zgGHYCb>#K7Fm zCkXs4Wn05W8WM!^T<8@J*9FH0c*C9po%*CfVDd@ZfhpJeC5=il`%UK%N77dxL5JD; zN<!pOCiTkv_WTDQlW*7?-tRc)Y+8fweA1c0x1t@^I!s9rZ1lsEoTOLS#dRh6S(RQU z5x;Zv<3u5mp2Y!jJvi7u;no70K3!w-;()XPYf$v~kOCx8(Dmv6N1px|`kl94Nx$<) zSAJ28R~a7gpyTO3{?w1t<!||eeK9MB7^c$yb!I5_91;4`0*xds=oFIag6I4P+5+Ep z))UDSxP}ah6tQ4~zM}%@s|gM#+rvalW{u;O!ooiXOa-m)c=~tKE8g)3^vl=$7X6!( zz8P3$>I-%V>Pw009|1@P@-IK!0FOK@F#OP^KSQs$@oM^a&wJ*+Fk$u&PYC9lRq~q% zVwhi?XN)M>lVU=FrI#%cBgvC`*-F0KoCiT$;klRo^r0@?TamSaLLA}rM}WV(;ekGc z_MMKyCvDOXrb=Q`w5r<h5XYQf4Ccaa;^r~otAk7MxTl}9FP!2~F}hp)Z25z^LJ*~d zU??F*0xIeX%LIsyV0ad8nz%ex#a5l4H+2jNLF(s&u{=b;)-2f11NWFLE(bv656|-G z<Jyey$<bctjsmV<f<Bu?!*J#_BaTgkLjIpKJLUt!#+WxxXPXXqp-%$dUSAcr>vSxz zH#*Q0uS=Cj2^0fW?+OSW=zt8r`h~EsRw{znc$FWnY*~5rInR*=J!rp5@hI93<6@Az ziq*y2`FjClM$aBc#NC-dlj0qK>#P>X+L=5b-0KAQ$o-Q!oj^w;sXr6m&oD>+GXE9H zK(>8D^Fq0LK1>uI^o)d709pePdH|0=aKD*~X9tVr<P9Z^n;auUBXXY@79<FT^e>>` zPC8z|l8SSrM}zNNeDXp&iD+cucz6!yhba_M7QrG5@X3j(ti>Aiq(nyDz=#N|!j%#n zL9dP(WcA9}B^<?lbviXdDY28@s0!h;rFF?H8P>Am_WjrB_@^6P2zb=be%6W#t0fbv zyr6$Zmo)%+@ZZy8;GJt4b`#JXxZ{LY$T+fKH@KC?W)}yLctO5RQ2W0&??HItc9yWm zGsv6Y>Qp{ND#n6pN2gf<8<j%l=t~4B3(=NUA)!SmM6|*SyN;ds(32KlA5@rLBg9`R zWW=p!Ow?l@I}vgElgR55j=4C^@nk{T5-n3ThPh-I3!5#>Dt<sQo$URv(N=^>jqh_< zfcVAVc<H`)^`$IaWza&_wI6yXJ@SyQTN%@mcg8Q_rdx&5Ix~zD=Of^;KJ#j|Z$9b4 z^vx$fn6|)^E_kY~)be5g7aR*|s+mE;zo2lX0KiW+*I8@dzZ^XDv`5gdzvK7mc`y5U z`r6|kK<KS{@TK>&s|LS~I?7+Bg9VuOp*r{Z&!V4u<8RQvyZD)%o_a8-Z|19G3EC0c z<8AIXki}1(gK+7H#nEX`r;9Foq4%{r5b3ji@%Y?2#DQ9pn@1lMgVeVAhfT}iu2>-S z0&Yp4iT03^j$4ZJ;Dpb8{)My!rh?$(&pRi@%f>k-M98NkzmI>ANcrn#d5qXG>&psY z{BO2B{q10Lb=;4N6A9_&R^?skfr}N@D7Ue(vJoNGN$L9J-Vw2%Yu3m9kf^qKjST`k zr-DhvGf~iKeORTBrRJ4)yJ%jf2b?hVvnMI?5O@<S=;=zbCaCb8T0{1Bh;jdW9<j9@ z?*zE$^wwjXpCgC?{TmG&MpWqva3?-ajr+RFM+;EE1yS)W1H&~A-)Nv)vtP@3js%QH zvAf8lJ2VNCfHf#BdMy=@YC36FIdcempEYF?nCGYqqkJe|;}D;MD`i&=C*ZtU8=^Eb zXeSJms5@pF%LNPPRz&L>yQ9&2n;|};P_qR>)G0o}3as#;Cv%MY!3o7k&oYNXUTBi? zatE1YKM6Fr50m1%)TeB~BZNB9l8$>iQk?rzLKs5vJ)TwIg=;m2jIC=aOBcz+rh&VB zm0$(7OO=PMk2*6_>XCn<R)iKdEDsv0_q~&Lt(F1@8Z`KU;b2^pxv|)<J4kFu!O;(4 z#=%RMfniT5{JO8MNy~W$Hwx7dqy0z6>rc#9fPHSW`QtzYze_xv52W<&ORGXqOr_AZ zaMffreS7rjr_olJevPoxQnWYrB(jvS1z#RtZew<=eM6~mQj$08D+3UBA@;T=VVOLe z$aTgA0wUW}TCy7icJ;=&YM+lf<5argmiO%Ux%!uasgQN~AN~Hmm^DLTXH5Pi51w3U z0mN<`TU+c$8hb&GLg;mP{$1}wxZt_}fwscE4~tjlod49~3a3QYDOD|r*x5Jz^bTQj zUMSY(%|5@J;E7LvvaQBaeXYDg4t;u4?T!K+<pwwXFAQ49`t=*Hrf)s>Y_Q{&*yq9w z20QXw8Xii_b>F{j0Umr3c_AL159ffr2_ErXXV94!p4afUf5hoHJ8h25rmcgYQ(F(k zF!*fDO7j;-(G3Z?heU%TN@5a<!5kkbD8AUOV@CX8+(S-%_+C%8!lTaoHfKxu5pv(B z1lx^xkWXfvASV-FWz#YwikU?}zC|!I#k@rQo5yvsVp3EI(e|hd#DPc5fW-Vd;0U?3 zSl(qAA(_m+2fxPR0v@?93VCiel}wiy@_$N%#Z3V?nArunk<SYjjl7?~l4#Gm%w(cM z9>8~#d&kz!`16)FXn4ptpU<8}yY0}`F@;q%(f+C61P5_oaZg(c@Q+%jIGN(>p&CvE zV=G5FEcp_Ke-+Gj%%w#A@P^U<361V2B+=wJt_9%Ghavaz8S;Xv&fSPIbvmBOSFs&+ zO><MLv(q@XMUO0z$Cm4K+mJUq3+gRB;?6&V3~11`7%l*J?XZLz9g~>i>B_(%(TrZu zQF8jruMh^~0^F(#z>{Q&#C*U$U3p@=isum&?xScizUoA!XrKCWrQCU1=WDqY7aV;t zV14{cwA>`>^J|!EKEg>(7Xh^`bIr-yvL9Nce+2IA%-ZN=FxwU0k+zvBaKszl^REh| z?9V;2Gitw*>V%1w2V)6T=8!#cvZ(KE%Bp#BybF@*hoTNOoUr3|)J`+@YkYg_v8DI? z$)2y=ZxoCuPlXH|JKQ)zPT={a6?sy-1&EfoBPk3Bi!#&Mr+wdfv=yekvN%mUq5hFj z+_MN8i_{Dg*;Lxti75UuTq5a6BR(N7#ArZc@)d#1)cvr52ETSaB*u-eow)rd4Uav^ zN4Gvd@>9>F*Z$F!Vb$8dBuoXY%YN@S<Ni}Y&B2$7H<+8i2!nmMvrJuL6_on$pZoml z<M#Vs9R<Ga9BeO(ZC72sJ!Nhm?0$*6rkw2d%MYesE}K?kO~tI9PoJNB&G(Lg<O-&f zzpO_+!&IR7q04@Te&9tvZpp0|7ZxU#s;A=P@h)pz0nGvAtSzrQ=qH6X!_zMQ!ToA1 zL$nnCo4%XEm$4I0sr?V~oGljNKHFum+>4FX@M=;KHHT3f2t4k*_1EDMPCD)3bkgY$ zS4<YuTvS3`CCFkFK@1bp8|TPf<h&Zk)(2x5thk~4!W_#WLD{l`n}~{>t>BYA78=p^ z3(5Y&LQCq62|z|nR*;k2#pt%Ofr!PR_)4Wv5L}2;TnMSpEcOz%oIpbO^E!F6j&{Kc zI0;uCgzB3BuhKS)xBddkW=yfU?Slh1a|(3Ds$1?Jijs=BUQ8r*z&s<nL_sQ=`^@b) z6i@TMXWb9x6d?8oc|{}ag=OHE()4jeHh82%m0#Hs0o-oE8=;IO`#o8v11A_`7B&$b zOnn`Ftl`-Jv1kXngZ`|a{0dRH9A_@)juG`br*Tg%HhXQd(74vlo82=<!(*Vy(N03a zyt7i73s@l^rrMcld^Of{T&8%<IZA(VJ}XMJ3{td10z@_P%m8A6)fN)*3-z)w2bs7L zTIc?#pwoxCE40<9CAF5~FZG1^RK3W>)K2t7y`eOZU2TZiDcoQL{Y>Pmy)KNetU-1y zve2>y<#YOP2RCB7P`t~n$%36;Gh0JDU!HIZuMn8RaH3RKz;%wPJ6jzuL%l(vjO||o zK(adqp7Z=txHh*w2*Tk&!oD!5o|#0Or%H2*v3TLWafn6|8SDV<SRHd-UZ49<zbts- zLr<oyFug|DZNLq>pkISuu!>?eU<y3hS34+H!LX8?h0aN@WkAnXXSUZZ7;gH6ea#ga z4zjtMQE4(&1lGp0^7_lKeCd9p_AfV>HhF*bAN~Hmn6!sz7NC}>FHBbHZa#N|!{}`A zac6(W>gMekrj6Vme)vbo695mcbcvkQ9jn+eo2@Jk@5>2(;$<(QCma^B9NgwjJ`5|b zdSMOC^UEF1diHtr%h$c;u%LDS{rBaYb16JNUg_azB5?=cue{P;u%jCky}sz!6HI$H zJ?EuAP2F+_A_~s1vw_qu7xLR@&Ql_HN6mOzUa+BG^syA;xvWsqWahpPy#J=n+cQj? zxzB{8r3<^r7~B+vqE%plJBKnJ_jWlByQ^;|@}e~4g*^=RKO|0WfzwqdDv(PF7*kN; zmapi>&q8%h=(>??5^_l2hcb1xUmMdR5Q8ZQ_;29e=62)-2>5YZ4i9}5tqQC&vHXZL z7R-fxOv)W6;n`|ZJqr&qEgW01snw`Bj>hvyQqxcrVEasXqiuN&V}9)8b(FZi5@U=L z)>S=b#v-V$E5P>WIzc`V`0HG%PHPwbCFpT~#9jNWA6k-eKb3qu%%g;U(KI^fawUQ} zGbIeoE7<m!pg%JgAA7&1tLL`l1#tzZYEM5Ai*hLO4nXErlC}bk+(u^q&?9JWshib! z9OwNjtYAi9K;-)9+VAJEUE?*J4{?H1BkWWr+H12>T^AVK=yM5Mt<+13En8>!h>&@p zB_6tOnPbGTjbX<5g}EOx#gW|H7mWEB1SRD$&gXb$R-I8t%LlrY#2xiYc)(mRC5eNK zrmKf!HE!R-9yr#a>9bb7TUAMm2XP7Q(zv)d!^4(l{}g{cgNTD3XdI20W(;VLnMQ7l zS1MZw79g>AjOrukqO2!^+@xU>jh?rc9U_sD57R`2eC{6e*zK<mDm?A`o=(5}o3D;a zs88RzF`@qWFZ-}{q+ojUuo;p}$7kUsI1sUmOau=r6*u;8v%lBbW|<Ht{HLK0+8%MO zJwDxO0aB9-FJ6f`x7Xgoy{<m}$vf!g_q=caIsNU=ed5!H#h?4^3qTJz;eqrmC!a(Q ze9-iHA{`Z`KCgbu>*<2WKP8-ZttKc0f=xC73n)FlBA`g@T$m@OCtvVXIu@8VbHC-r z4=6(7B5;Jc(C--k?dGnqjo|lMI&_4%^0~Y2rq6%&ZaP-D_u;%w8@1mPn2K0`d)vqN ze_=pY<e-$FWm#kij$!&$#LwULxjgNg`XWqY{z~1H{2sv9o%BugpWpZj`o*XJIQ`Qd zcP_N#VFoiN;9DiogXGu}oE7(ZYW{vic*toFqwjywkJ9U3{2LVfpcL5+>b>N4+_l#@ z>^E_oF)l*?+&zQpqsIm7Yiu^2Ik?t<BBuMZQ$F!fF2@3ofBKW?>X*G{uh)qsPbL~o z!PCLd_26>MXgL$1HK<%t#%`$tfu6}2JKi7*-hd0XacV9EkL7dw!q2uC&hT%<ifgr9 z_Z){>RqG2ke!>J=mg1A?mc$lX?CQp*(Oe^y|N0=o*bi7uy2z=M9cyuEYKc2rNjo=> zWj9nEECvCKA*~E%O|=)9RTq2`UNGA8sC`Qk3PrRyOPr|5q9&v5BF-_#TwDi3bM>Q9 z0J88Fu#SqiV-7OJm8E_UVntJ;m=Y7l7sUZ|7&g=wiXFve1`HI;L5CsdM*#iNRU(p{ zH>AO!2KWPWY>M9`oT(x6A92o2qT<_}7&GnQAQH-|GO!k)H{<;ZbD(LG%sw$N$;!AI z<6R)bMhxFkqe|S#NP@tZj0+LU5F62W!nT>xJ%_B;$dAyPLQ(2DqOg&dkwsTR3ku>6 z!`aE-X%j25cx8;_p3T=f)$tYcCa%)trzT(!(;TR2QQteCG-$6kf#H%8Kj8N3-D>n= zK?9#&je$GPz#YYw>Lbj#N*D_g;}W|%JAY2F4bVwuh@6@{J@*18B=yuj%`pPgc1>LV z{Y^>54F(P8$b(>$nbP2S?w<CHr_)hkdX4aRfAjK2SSV*v_B2=(LPxb9ZVots-5G_9 zZP4{LZf0p=j#C)5!rI~Cl!5Mcp}1A8)|!{_AM95)`sTE>-zfJ0l8*V9z=-CRSI1Jk zy7|5Dqd&jyf6^cQ!8LUEU3b~}7&f_+$OBF|e!oHc^lO6;*su}5!c@e1@o)Sp{rr!; zz^Fw10ewPWO!NB+zIO=4I*87{VVL{h|FGzGimjwN8cdtHzviX?gYN$9|2d@fuSoU! zAdroE&z?2=wW4?x{2%5gMcWbFc-^1VOP}}iiI1QbO~rgRL%T+6+Rth#>iplQJ%Ua> z^YQd=PX1;(3jE9!zedmduJ5<v(tb$rI*QRULz2B8pZ)6g(#_4+znfn9{9hzp{mjAU zDY&TYAyqH1p7Ql4f75>D%!#Ky?65HNaQgbgg49uAdZlnGV*S!#5$iK|{6nCL(v~8< z*5k^bw@$0TaiXKM3Ib_9DFh3m#os<3z?m1GOCNm4yXj*$eVD?-T0|8p5fa-u^Whv9 z<3c&D!TOCN^5~KdH8qf-*SVy$VUIJkdGq!R(`N3|FBjf?!@Fi%fOzC=_a}q@5Ay9e z1les+r~)d~l47p1qN^$_{t3j*lx@jCu0cIp4{G>buPF{k@KbX%p?=I@FQ#MAS#6@} zrr2P~Y)2&FQTF(NaO(u9r6oSNQI*6IuEJ%LS-xKlMOCoh1I--_zq74#rSZTDe-w4c za(it9%@Cl@8+FVS0Xj?-wdsAsoy3NqKRPZFlnHnCf56n$z@$@;nK{K27aJ6VF>FlH zKlO2iDET4|!}0e0VWKqhXmB2KNJj?qq%=(*dk>gcZ+)dF7i4J0?US7Gn2d*ytrvav zzR<eMdPA<CEZ&eteyw;dH3p$blS)pCew=#y^;zC{4+i`d#VaZN4Gr+l-{zx(XuW=n zb{lZyKX6RmA3AZxkGRLe<L-|O<`}M1@mU)~AWt=0|D1p$!0%GD8-1(gu+%=D?s{f% zXB|L#;(kI36X_#4m7M3lUMfZB0?!t}#6bUBZXZ7*pdL!+Pjf8Ti;{5}=K!ZBgj}>j z4=qITDQu#@)8*ve83R~`Uj8Vn`KVaGGxtMt<@U<t;UM%i%8pj23qr6kyyVSCfeWN* zVGd(Dnnwi@&Aw(j3C-M25D(&_MMdP?2i&mTFa;)=j{mv`(Wz$~eFfJ3*9i3$G$<6z zq;vpcbhI5GaJZQc^=TN}lGXUkxE|{hun7*jpaMtxNX@`E{9HC+5NER|J4LNv)y`Y- z3dsEMPd<;n=Ypec);<-kp7lM?pl3ei0(#wVy@u|B;uWAC2K`Te@>BHIE8j$CpYm;V z;rDzW{nf3v(^h!oV;_@V>2pOBnA3UC2ZRZ6agWw+c5sQk!$m*&qqGDcdhZ8@*QOOp z=Uni;LB}vnjFkG|6ZiBY>tnMHS*UH&o7!%NS($?fRL{-Fv5f_bKL7jHkJCqP{7d@% zOJ7Ale&+Ylg^zg({plOuMq6Rp6YD2l{vsnev(Q$^nvF>`ATTJAqpU!J*A66(qin6R zHNQ%B)AV<@{`I~P^LsCT1-<aBXVQ<Ke%}7r3sKu(Dq{WYVG(QpI-vy)XA7SaW1>2W zS6x!S0^x?kkoa8B=YqiDQ|MUWxtG3>?saG%U2zAKgyf^`X2_?5g6+5eFaz1H6>Dv! z{Iq*Cjx5DjvLK!@QLK2;z5unfdHdhp_SduoPkQ$Gqz^URWnl33oP}^&!}P&Cay)c7 zR#IA*undC%Q+Vx6Q1w~UIp^JbkzlTpikP85ks}erZDAbYAk)IQZ=X8~MV@2^!`!RN z`HalLzG%Pq;rrJ>1<2zAy>`>jWBYe|Y3snu*FgaXc#f;lgd|vw#xB$1RL~K^dsSV< z9N#SHeXQj`6y3VxB+F;!&9Z1_J}7VG$sY{H{KqxnF!$cIG1_DbHuV1aULD6vStr_H z)CaVfnf+tP8;jYKQjel8F^oB%kL_h>nkZ&x8dvgVykzme%l|u`@glo<W)7H#V<D<N zja{42?p)TnW5}DNmmiV(5CS`vG$3p_=4Aw2eJhbPUJsmfUmuh~cTVTs*BvZ!EXAkf z^I)_L6KWbRWC5+?x|o$9MhVQuV+!BhC4nJzt>Vynv-#419P#@$45)lEXxGlB)585V zsn9B*=hd4ObCySw;&N*#j;nE2-`3~~;nS^q2K6Y+F{&M_X_&#r0IEH(pqA?k-OM%u z;{qH<6YAz`S^j?O$;sJO2~LRuIl<oy_VZxMs6W|(j(E+^n5hbXMPE*VQI#I;AsqD= z`a&&*IL3(^_e%vc6^LIw?zm&$T>OD2oDh)$pCKT^lRUx9S~?Z#-E|qhiqW#`^R9c! zH}_#B;N<PQ>V*`vs&7P~c8$ajJoj1jBQMy#=hde_amT)JHT_LREZw6B`KV$|XC30l zA3Vf!{^P%!Ui4!>wa33k|Dx~xf79Kcy^DfUFcH2g>11b3)75jB%qytXKqnLIDUThm zzPj@hpQ4xl+)HQ)zV+-UkR=+-#O16xCzv|ql{L}Zw?TyPAD`=O1)o8*e+qVC+-66N zcv{1MyyMgK@{3<g7oPe(`@+^1c+8oPqlcb;N=h3YmTD#VO3)&ho-~}<DHriSe_@!Q z@Vf8e-&DA|?ux7Tg{<Ft{x2V?kTn%BE`IedlIIdRIaQwVsGsGLW{n{|0oQyqHgR1e z<nJh27Gc`V{i)CU!G>R`V*;0-1phl9`!BqS@l~xp+$sxMZ415y3NBdxj57khmobvh zpI+eN)xEEN_r<?Xx83xi;q{Z+>c2RCaCXLPa(a8&NzgZKn`JTb=v(YA)f|A%&TCJF zDvdCAISuHn>O<EComz<Ty&bKOD|y*m>@AIO)?3D}EiQ#u)G$Ug<%y9Aw^9I79K|?` zgngKeW{&^!Ap`DuGPoPJQU)2QZFKXTyq2Qb`8hHX%{ci0k|T8f?YgE90`qDQ!X;~~ zbI;~0;^^(I3{f5r7My~>zhR(FEa^c|QjOUxcQGZBDD{qSLbV#{CK_5>fhUPKPIEwR zfV_a&TMHr26?MJNDc**QMD_zyBOFrn(bdzrVJNQR(*&+@dslxr7j<8TeH>d)B=$~c zWdV)q0Jl1A*>H%t9ebOD&@N0i(ZI$NjAl5Umts^R16*tBMTN8D;q{|o{^A4QWBO=v zapWT?#Z7L;<<lZg4T->?N-Dt62HglK7S13+9$fGI;0C&Vzx6&DzZ8G5Ll9Sz>--c6 zaUu8(2|5)_7{h{;b}h(1`HZkhyG1`=UcDrQ@U$%xph2m!z?W}$Z~_ESOGjhLP8hCt zx8cdP4vKq1eNZ3@_YHlYCO`DN<io3F8o6Oeoiew;8pvi&^ltyiZS?EEdMO<hUhpFq zANIYKx<?#Bo^W_PhbA26Cpa$3GOEYmqm?)?Zu-T^w)AOhvKxK<Y`-{#lU~#Oog?#s zE0g!({||i7@kiRQ{q?{78ans!=j;ntZf}zY>?qP;7;%;dI#WC*dg~khke<C?jrGxz zz80@OeONdmpkcz4hQC-6Ax_3*t>^Hyz4`k5{mIXG>VDs@5xncVKcSBw^7^40$E&cW z*AGuQ{ZURB{_VY<rwELzO=w{E;<}?SGS?-@&)nO|;FLl*ED8l26m0(TkDvTB{mgkk zL~pqC)wBgJc>c2;1;w#&XOmU(wlew_D9ZFI;G(`508JSa1*tvqJFmHpe*Coa=nr4^ z8rlleo>)Kd^FIm{eP&R+k((HqYA-s5*<@7Lk{#efR=Y8U&tuXyhv`+qN1S;EFaq%# zZs^0P+jrZj7qunm>rtfOy%r(F2J@sr9I{Lxejbi-DqJr8`rtp_aVOpOzFX+#8{SPz zu;0u*>*7u<W?F4O=zkkb8R)CLMv9|#P`8W_esNDCJ3Swj!J>{X5F%KauB)4Zk+9)Y zAELPlG8cRi;R^rC4m8(F=k(@V<Gx@kUCkxn^BccJ<iA|#LUNN7(>;L^h5aD1SVYa; zxjbmEFt*IY8!9g;&u9weGC&j61646R-&nTLB`#xIakdlpO@yqpIa2#)-%cUs|0V^; zsTZLDEp0!qy=)KIi-J(_$-3Z-CxH@2o^xCYeVUF8d<G}Xu4UY{<3aBbtD0{|+h=w@ zD(tRLKK?#7Qr9ocdAR1jJlfbAI2YyXi`J&*4Vy}NUOHMi%1ViC9sdk&!vWN6TvgjC zw?K^ld4`;3KdOVk3I@}_sTyrG_9z5#93yRwv`cr5pHy5&2P2`64Eubk0r}1<5(C0k zOk2;VRxkzGw?MoIPbxZw@d9+vrM$tgR@jo2@0H0cA!XV=pK1gUG8TIatx@K>5BhlZ zpD+&xoZl^vS{qzTm;5Lm45|`s6Ha$UD(-Rh0bYPJ89H1}E+67UL`PtsxzO3gJL$fS zZDi~nxWK}N%f|kq`wXb9020nv2f;#c2<;Ek;od*>LAgfkZC~-LmmR5yH5IS^@DJWd z_H(tMj5^NB{w0TyRYQ}NYaE`2_jt3iHyO1i_9G<|-{N!9TarGhCF*ZZ=3c+^M_1Bu z8-HEzKmX`Y(y#vPFVfw*SuoEwybqOGk%{Z159gZaHPdsu1GA0k)xz^1|73dWm46uM zPb;pT{~vy6E?zP9$)KT@INmnbTuOjkzAh}|`^gtPjh5ibSN+}||2wb!lf`!5cJ_Br zv_$p75k&bV>gKF;UyPxt#<>MJBx_*o>|WStW8vKqXy@n;n<MyxOJB9Ah;{O5k2w50 zg;bx5{IuYmsMkLlHnzRtl-G~|WP)6rOLRi9hdNXK!<YTe{`JDGtFg|y@H~3RsSl&L z8bZvbr5sk2f@|@*HgK8zv=8-_8Vr~yKHcsN@yPI;OJ7L$J>h;71P6ZJ=LhT>c`nEg z9w}`ASw0TQLXt2O#P?;f*y@?Xf2P+5m*ASqUb83l&a1DbFWfc$!G-BH!mkWJs30w- zdCXP)59T5uEvA8np*)A4bPVafr_bBC4^cz>sbL-usH^LZ_w!fWC^b$68nlBzy>foj zpBF-CbdwEw!Hst>hWR;VIlQ`T^VsWlUV%CfSKPl5^<rx{gYO3#<xRBOzcG7|Y=VO> z8Qo^4J6&-l{#KyzFL7M;!|m8ci?O~37K0zwhic-*C>*@83=)u{4cNK|MS%y4y-y%0 zew856pY$3o-8{!OoZ6#aq-%K7MaeFJXRyWrzuG?Ew|NZqT!ca_lyG53_1ddAE%^%0 zLU)zDjgN^JFoDinAO9BhOcp&HxSWOS#hoKl>96K`f~5FQrPuM}<YZ{SB?<dP+v5wO z?r8-Ceo5bhLT>=|vrIt;x;Dv->B}9mc=M$9Bgj{hH(Y^A+;c!k)7Kc0%qS<4<PJyY zSS;|$<{5})G5_1o<JkDBmTMA`?s!YD&61|lw2~j!W4{rHrzI3`=Opk6WDt*df7X*l zmk>yiMhkq4`_D2PcW#eacKL@HDuhCDHJQ+Oqvd>y5@&1-GCW&R;z3{C+a(nI0Ex6V zGZMgJH?{pdL{;W+N|H6Wl%obP;(+6+i1msMMXY`C>J3*zf-~E${t2KCe5)>7LIQ$- z4ok@eo(<z6^+#g9$#ppf*zjZ+oSXe%y10J%&v(PBBTi2i58->CaqfNv)*4KOqh~(l z8T6Jz`OPb>8ZDXA5M6yGX{4Tn_32rRUefqI2(4c9qd#?6#Ja}5Pn)*?)ki*RD6j~O zd#E@IlBh=KfSh$J#SSmt|4=qdo3~G^uI@Z6woP=dedAl&D~&arbN=_zy^lLC(TkwB zGFDJ+d<1bx-mu<Ze;_O@Ejx<>+}@D0?ug;nhltG<LwxUU-e#TrgUen`AGvA$b;9XY zLe+IcV@2o0wK@2W0~U`T=0}1b3q*}%^xs5ff&r@y6qTa;``iB}ZPLCB&%Nx0@avAQ zsc8)-<u$=LdrVsa^&YK4-1p%pLe7Pc0j6Jbyy&Gbq`nxI<BTV3_^Qv$1_rEJBerlE z+n^CTMu9k2sO0{{n(Q^kPJEyH{AVq;z3rx3_Mg)a9O!Wc`_0^^Uoz}`A8KMP7knUy zt+?xPjFJsS53<6H*{{HlS4i^JM1{}uJkD9bF$z4mfq7)I^Ncx3WzH1!5w&osj2sGt z#+xFLpg;2~l)H$g<tFHRf?Fc;upqdx1w@rLsX~JsieQGV3p}Kt{7N<(YZUVCmJf)} z1<qr*0dTfF1;cSL6aK(T@N66<03x&;%4O%Ygkn*pX`SO2<m<rQoIp;{<zsVaEc}PG zaDzEuhssy*;OzKJ<Pj&Hp`lNSDnk%-#^RnMgowyAxAAl~%N`PmBSs#KC3>GkBll?? zDvuN<z3Un8$7)&oH5FyW0}qaSWLbxSy~Moz00S@0w|1}n&~)WMBt%FGu8T{t^?s|; zDefmqsA$(QTc6uvFZUEiiY18;N$0pYN3_IuRF^`cs~7?{fqB4VE>Kb;iBCNA35}i8 zCflW7w;Y+k^7xpx&HHHH9Ls$5Xp;3Xr_MgkYwWE7+XL}vHN-+8umyiRX0Rm*NII<H zkTF=&BKVE<$kGdb8G0vOne}hh?M1yQE*&g3mQwE6V)+~-X&@AHc`34>BllMmqSjcl zl!PZ8zvJMcczDTH58>BWidZlBk>~G=SNW+I-h8F_3VgTg2b_m!D2OW7`o;p|n!k(5 z*j<i9T?bq7pDyOPh;{gRAQ+E`{K+=%snLeh>~z926|R0{<Ew+e^0WVyK6s<<b>%Ci zX1t&~Y1~X`*V(VfpIfP(uTAG(^rJ7>uf%%k&;BC)`L+L(5;4;~On$>_y4Id8(W=!B z=W7<&+UD(Vzw*s?{JGEGO>e*IEyK3Dnfro=bJ}}$K<S$e%u|laIqR>bV~|L%`L;;W zXDZl%sP-}W4JHT=6Ud<MiMaTvfBoWLIJ^-buOgY?3Fkiv=5X2mnFkj}(C~#Dy?EIr zA%3%IH&&SysUyQYHSyZ?D%dYQ{l_*Hv8LC`&bshi@*C4SQ^0bS`c$2v6n(~Eye5aO zIW83XeX{9jO11(IIV`-K`K)tGc~UB>sNYf9%sS}vqw_bqG1(5_4+iHlx2PxSJ}<Z! zEj*lf+VbY@AGqP&hx&4-eSiBEZ=@x7^0b-z?BpY1bg!Pg2A=aVdS{jF_=af(0&RFa z1-V=(#xgz_j2eycgc+QW2{-a2I0Or}JTMKn18M#>UzgOn7+~|ANda2SR(|JcI*75! zSVy1EM4bm{XV~q)9_oUQA^$QOv--Fo<7i{%fx>;S<{UHcb7+;2AGj=BE%#!`2`%fd zC8|y)1|hZx358!lG&N!!C5(W=_X&0_jxter<`C}pl^^AqB*q#>H<;|F|1~3*Q|?@V zP+vOqf+BZq@td~q)J3RLA!V9IT?}Khov<nql7+7D4dK;?IvwPPor#r%I>h5npuwEl zsc1t)rPa_lHsm!=VrR`~0Y|_Js%Se23l&7lIX62{^CC)x{DhL?JXI^N^vc0}O5hR- zq@DuFpNRto-IYNfX#QmZS)l~}kk3k#V>6|d7UqR1sYl-unqt99KLdlAvC;guV55l! zCgDegn)`fqd5qX%y`=-{s+2Ub-BIQ%;S!63os2!H<_=Sjjnf}#bn#>5Ir}t8@-c-F zqO>YN2BVt0Nq4@MOK+vw?(=G;uvsU}i-g{Yd*p3m+j>Pu&#w^bL6p7*n`}4Xp0x#Y zl4@BtxPIw<pYwoWN=nXAj^XBbaMLtei8Y=7!#BLKb>+wy1R5Q?fwSk|sb4P^p5k_$ zqg8RZUi;MY9eL`DsM7REa{FK(T%MnfzxRT3=>Z#7U;U5&_Hz28E3Y=an4cDN(sQ5B zEJ8gOLw+0$7g2=a^XCtXSik?<ul370mcqk@=o7M2(i;U$6f&<A5}#8Z`xqL*w0Zm6 zuX^*0tKoU~b!)E?K7p!29S}}mIWXym$)`{(#`6g00LsV)CZa{ta0BKdojGU%Wt;$s zW0?N^$4}l#e|pv1X$hv4N7JU%dq2HbyjqVX9pqO~s2*(XW{ZaEFSJO~h(!4oO60?a z<h7BSidRz+>z_6hv8GoE?**@fg`2~`sRYZSaJ)qad_S4F3l{-W{4@K}FA_ZM;vd}a z0Tv2o%8vpJw2vEcrSv_^*pL{WL%-S=7QxxgUo#7;)2->+=IzsKg9x|ZbPIh!U*Rs` zq|;8JuRr;lX6(b*AQ04rbTzvB%Q&1Et9uhVI%FR~gzBf~y&zJr2D0v8|M`JXN2CQZ z3220}PqpG`!U9o*h@@!YzmC|ipkV(HjivAdN|1+0@H1j@sWVIahdeg6KYabL2`H=Q zAXcEf@kfyk|K06~f|U{Z>x&$DNv8sh9Z{$k>A%3UwZ@nNa@}w84sx&uckRq{v<tc2 z+zJa(el3$1z}%v?P~a=<;bvow62_vHjVeC`0w~-CoagQuKENmuCPe)TVlUJUyFuK~ ztJE=WXbzy)?DoJXl18PY-jmO*^IJMq`tPAxDBpDS5|hv;W8#dHh7ygKyHLS%aXK{M zh-?R!nsbph4lI7J%q(Rq(xZc_nf*y{d!5~O{YDzH!qS%uj3%^_!8U|hV!iSaOyY<a z0d(14ca0Er*3@=RpJGTu%DLZ0kku>7tgN;^sxG*m3OK&8DWYDFF%re6IcBGEC`rE6 z6M|xv)0sfQ0<Rrwq9O&Cs1W<DdEC2tAm*TMbF$!42v1sov#57c-Y{{)*AFG@GDA>J zUW0w^;ygNa4LmWy;9ed|i^wq6Rr?lPQamQ=hoVmn^@K?w&BwaQ;5hnz##vxMN=2Pc zz2aA2MnCl<7u&hHsC8LvWslr&pfM=-{({^8F<ppb?mCs<tyC$IWIraRE@(6-$1oO# zgf2Dqf{x;Edi{VCj;HT=#<{cxZ+XKt`vR8V>$o@ZB+gTXxSxh{sXsT4y(E3l(%Yw= z!2&|V&g{gPkzh_tSmfz?6ndoRo_xXb=I#4U+XEl6KlkxlKQ`?1@M$ym$3Cj@6QO&F zReehijp9A*3172`es3zFEdZ%?@aOJ2Q;D&=+pO_X;Y%iX{|$dZYw!&xee<6EgT1c- zBuyScdz9Qk)Tse;S@i<ol!}0D!2^gH4SUNz#3h9WJ(szNb=gHfLu)X-S~so2B8%en zV~PV@6&YCR3}qPvl}*&yQz%+#JCqCaD(Wo-yJ@`7dFfB@KfOT49zX3^c_7N;n_KxD z^(#cTK#o9^XtZc5g@l9KmL)WF-{bGUvU&SI(9Jizi&82?Z@c^|T7pMUo4L2f^Ay5L zd7V>b4Bbw$>yf;+%dze>PoLO%+s;9vVb5Qy8{TAariur|=qtGBmwa2#oC~|kOME5F zoJmD~ASZ)Z8OQE+#ZWAx76CjxNvmC`E;1bCwmJp@87B~O@kqez;}+yt3$Bu0yQJt3 z_00x?CgPzv%xj1*)Q>Ktc>xKTuJ{kgxU4k?Q9VCsG4X(VAy~nKQ@Di~L*n}B^2t14 zSoT2&Qv*FkJQ;FEB!kuveZbFi-?I5?xBs*%2xQmug257O0^I}_!i0lAVd}?NYh=8p zbmvuXzQ5``zlOd`3-<A!F#`=*OZem=50YAEN`wA_sYUXyQPJ(#>RW<b`hOzvve1a{ zLb(Zaeo5&0I`CJwT|@TI1eIb*Iu@$Oc5FjPy{e>#2W^SMWHLo3Y>si%JzEkC&I=LI z;p?6ol^nLha=++w3f4;59}SYl<RC#u!7H_$;9vBrgyZWt$#WJE4mmJ?5bo9Rc>iXS zga)DkUYf?VpvCj==6cK#qFk6JDkO*}h(pm+(325-8h#-yJP;{evEw*;PY$>{4*`XU zc<6EFP(Wckg?+g}z&VP=i*^D7w>9)0ePkh`@hg*3s1?{DknUuPUz;sYuL}Oh@4t|K z@n`<aT)e`YE@en43fqn)A$2K7{z^6$&-ztY4!jR61HRoH@{pz#+Z$)$hV6hczp#Tx zKlaqsy|1QU`}@sbdpQt7e*B~rS_NL`pqu~%B-E#0>1p#G4#0Et6OQ-Q)&>)7Rf=RM zq`XFSiAP%9y#1<I{qEcse8)7_wN+SWob^PaLAt2)<Leq!EJpD`>T47XZSNVd8Jl!T z6c7Bp+gL2#*S`POn?7`SbN=ZiCg>YZ{AT|GK9ZP<g(Zwry$+$R1pb5TX7sO>k7btw zoMNI-?+I?D&EMbO_Sf{f7r%nmU|NN>FX)g^eG8ihjtTtu#q$VYOrbE9>409MU)_+@ zzU%7i>7zG&c(vVwPWs0EN-X1HIH?Ri9XZ6C`H{?)Aj-153h^kp8Dl%zY3!&gH>TGI zm*Dn8J25t3TCQ7pjqpj&z94Mo9$a_ORSwgcV{{e!@|jJm9<dWs_t1s&LnQ%>47rIR zg1*+svac?OX^e)GuC_Twprtb<bOHKkr#<HzZ-1pv0v%Tx<kDY@o9{`;cuDThd&#`Q z2+?4E5mrWV=8-J!;_GStvS6AY`()tR8MD1paiRriseVnmf8h4xxg<M2BLhlrNZhuN zW1WkA&NCBk&D*i^BM`n04&dR8&rhhqF$Md}x}e43=r)*ai;}FmDgVz1Ykw6Dm*G=_ zJ@mP>>RR07-uWb=z7KGtLJKLfpsyv$fzGB&rw^>jZ6>i8M$xZql;mIiKphx_q)HA$ zD~`6wi8Ie|@$49r+a9!pd#8>pj-H*~h}$(l+dUWwnidDpAAh-k6rVC^b9Ah06uG!2 zw3#9o{G(B&wpIV+Tfsm2-ZEb0Ps#WZ1S5-QdUO3^!C0Ce+*hS8Qeq7Gs$PzM)ni(t zrfGo%7sMz_BbS1M$YS@z1Uq0NVCdMR7b`Dpx{w3aB6N39;HZ!f<42o$yP#XitB*&o z5|yM;%S<D_VOyJD3Ex}%b9=#Lvy7GuxBzE}*vm7IJlfO|b)pEYvS0X<Yj2>}{?_FI zZ`d;-n;-`FWR{%AL~**dhPFynmP=sa9Qye8HduRNJ71ZTvluWjf$ThPqw~WX_P%=M ze|tII@%MKaZhdkbZ*sh}>cy*BUc0vP3P<7N0;8b5JUb^KlExEJNN_@8Jm3mTzs`L^ z4z_OGG$*jOdHb}=YWhp+vzN_P)2|XPfNtjA4+(s2R<@$G3V|u=tkjCR3}JejUlNsR z#K%=1J;e-9OnqLeVSMDq5782Q!}KZ{^1}r|Q7unT{?`EJem0?|!|e&KS)G6twLs$f zoE&zDD~${z$<FD}^;cZ8FJvvjRJ{7Own~Q=2ILwp-L-YVv4H)AB0tUX6Ma!x6&cfb z)g`~O`1+f|v=`Qcr_IQrZ+|yfjTH99qNAArV(G#C+N_G)cVU7Dp+w0|wok|t4*$+R zEKV-L)zhyJW;SHnZ*SVneQZC|X6`2i`6*cpm_)czL~TgYxi311Tal}lco0v{!qX%! zQ0c9zWMd2dH2M#W|9V|1U}=Xa#$b?B;-b<?i_P)L1L11cy1?z!vd5slImH#By=>JZ zu|(cHhbVB1w#j~hQo)kJE>T)MziP<7UzKq(<-YJsgbZ_I4}m3dB`9AXh;KCoURl%+ z6oZ=dg6DpFo_4VEkJySkSab^qDNhU!jg)xvkG^V)$Pzs)&`LG0mA&yoR_VUZS1mQX zdFrxEb0fo<HJX!tk{6(LI1N`YvyM;4KL#&K`j~WXv;{@~m3?dI2YL!#ggdHSo+pYw zj4+yqNY}a!+l=ItacDcHHMvzF^(%z`{{X!b&VUY)Q~Py{Yv-llfTNerPa;+b%cvRZ zrCDszrn;tVkl2lN_yvm*t!<~vP!<{LXGd0W(h99=u17Rhp^L75Uhq01Wxp;RBA<q8 zoMWf3UWX1FL7HciUUAHywF7W~`t&{&<}w|kL9rAZC3<MoJ=0OR884G5Dum%lNj=A8 z*SCQt_}Ew3v&a;$wq($fTYQ?ZLe>f&%B5`Mvm1}elF5^SaS-r+k^&o1e^bUpvSj39 zhgpveXE?64T#|qEWNW@2%`V!`+{BYS<%Yq(=DpTBt&y3^qc*O-nqD9Dq@gXvCnDVc zWobo7yqO$Z{JbfAJkMY_At?YGu_P+=26`NEmNP6Nr?h|9HgDI}R{}#*`}y2mch9dE z4q)EQ{d;^oHY}#-1f*9s)eQjyz&2_gf_>MFgj^2jmxu!GazC|Dut#Ty){+P{_}kk) zPD@~WKV|y`vYh!n3aBq*jyIB0^RBBR^i`S8Ww4`F+s12g#i}2_?#2I|*5DEQSHea~ zj#@e>0Y!aYhvZB(mU1w*{y36crSVU9+(~bG*=x5nrsrPzLi)=4+>1hT!Kh<I)vaCj zH^-nE09^vn$u&$f7rx5kKQ`w5USD6YMcM+Uy{`6~{iE8LUlY3a^0m#}FQD$m5$^)q zJj#goVsasx%-=W0a{~S~q{^VhjMv-uvl&+l`S}d&@iohkfQe+RvJlm@gLJt}%$cMO z!t#ywDb06xp_-LnT#dw`mK^zjb6PA3&RQ?IFWb@5T*>}5Wbe;pxiK}H3dxoQ8nWn> z3e1`>S`NtmFw0C?yq(z!fixxgpvH?)Jz!`L#T(Omjg!urb0~8$OY;br3+2b_PQi-8 zVX%o{Ula>lDlaA)hb>OuX2!Fop|3}O<m4tg63!EjgL_(t-=+e_h#QN$5<&w&siAer zcTns?hzNB%I8e-Yx_gzNLLCKk#R42@o;m`dBBSXBqZ6JwGG6zGjk8&%_Dmr@Fyf)n zY(>azwywYaXNS&-!FSXpoUrO|JMe%qstmRP>Rg~1d>6?MA@P|#IqEl_E85Mto2q65 zM#GjuV+Pve<fJo<q>;nE`2AQw7S3#%XAItOGmJh;78J;88i`Q0<*Ye1U(vPLx$Gz# z>~<2`STjyIrKh7of0u%1MaOl9Tt{R@y3t!we$^}Jnw~BAB#KG13`kY8Edj%Vrf8C} zlOD6Qq`@C2MO<JyA?m54w&Z|mZIy&%q?AZ*N|@p48$9t2^3U^)Pm^$%dcg4%dO8Vo zCGg>`LP#QlBo044;g%vmHnzDMfKWF8MT%+A;lcNQ-}>HH)9NeZbFUV@V$jr|VsR=z z%Z)2SY7fBad^|!Q3icm{x(gEUqzQRZ{wSVnW6<2vB+Sd3w@>h)_r8DTUm{{XyyDkh zx!C_(&wgTLGZl^PRSgtb<CChV(;%jKJgBhiHp6INK!cOs+ZUS$c3v6y0sTZxMH`ql zb6<k5IpO}qX)4V=^!tXf4Iw4K+|HS`g0aU}XlQ@qRJt;0TnV5yS>}9Wo~)0)?-u&# zVX<NfreEm$>Jz?}vKHs3wa&zBeMgcG260LDW7jyg<<xHj+;GL!^p`ihd$rwHAAdi3 z&S4P??O&2}&JP7-DaIWM#&}F6mk^`gN`c_;%h}IbUVZf!`_0><-^0DEZhPOfnfv(H zJg3dvzvlP{G_%IJC1WVu2n$hN_^xCDF=i#EBXBlo#IKh)`U_magSwzxFyhGc?8@9P z6rHTPfF8<NpmA|@`aJNQY2QhVBP^~5jbyOM=Gu2)Q&TJp4`o<7(MDg|Xk<1qRw&PK zj4Qyr1MOE#?^;fq?Pv#aHay6*F-uZ!G2PfV-J$LJ!#m>(WZ7wm-C)=(La0ghFP=Gg zdhU3A5YZgGtp~iQgL5OXzJjP~=<HwIeU<~I?!>x3n;FN|cQbC#6alNT!S<NSGtE~q zXIblYro455PdyuNy_Es_?i}c+S2@Y!5aZD8upUYDVbW1&qnUfo87+4<m%3W7&b8T( zY_~bu3#I9zHr@e3DMpa!40Wx%#$TEOmJE)U+AUp|g|^@$jsUW9tXPG5>I+=8Q)ma6 zFUg3D%HB|;WFf#(^h;jB6;r0blt-_j7$gMFC0LumqqOS#NcRoT$~Ha2Cj&%OZopW3 znFSt{ehO+7#oNc-`Kkm(f!68nMF=)q2R=Q=<w!)^0!Ig2--zHsEx~R;9fL&9?~!J9 zL>LINwZ!{a=e3eo;)Z6~MZ7LOMwWVixzj`k<lN*HXHv0qCQhy}ex8$)m*fD%$x|F{ zKx}gn2hlD`;W_dR7zWvF+cOe7$01^IN5kd{SiztdXG)4A3JH?3%Sbz*Nw(GY)(FTl z1$~05{A;_zgGZfyDlI`=eU&zCg~Eo9zwPxwocwO~0KIYO^L1|R9Vgc^4f7uTRY?AW z6KB(T3OLDDm0_@%_P$!$y#4K0zM1a)<fq9ek=q<f<4fq48$UpIfA+2+j)$NAsQrfS zVK8kFRVt;XNj}in3KY^4Db&zqkj}hwv6+j86vnM{xO77++U5{Gzu{G~5%1x7Q}3LQ z28o2l1R=<qqh7}fRpN{L{Y~&yh(NeC{KJ>Ome$~rx-mCEp0@bCTKzZzaieBXB%wG? zK_^K=ISgsEzOTCES2u0y{)jWrpffK#*YqY@2R=P_+2W1xJqMMa^pfP{>B0Vofp|J~ z_>kx;zv@2psI$IpM09T(H(&p*$Of46WSgJ+?A`R|Z@iY4;M<=*|H5ItdeZ;2crx>! z+67SA`mg34#R74!Q2lO1tB^(#+a()fq9UIXE3kNKqVeDTJwp!)k!lw9sCY0Hb9R(h z2D@Bvk%-ZO99w`7f92iJ3FK2E$fNV%56okZggT-tx#oFtUzzhITxErREAXa_;eA4* z#~2$-h>hBAzC-7<gSv+>FZj(lXd12lC<o&Y#6&yKGe;;-bX{#AEOG38ZUBAu`iegl z2lC>mL9rr+M8kkd2F5bBqNwk@)LsfBW++-}d@>w8B?**TZj<RWeO5a|yJ}quf8FDe z!DrVa3k~xhsb1;L<I=gKL0d^}y}e%LA$r)OjuYx;6Abnr?qk7@GIQ*qXBD_SBVW7% zR^^+kNrRYDo?9BvnsU@Vt8*y1BS>)s;*&c&??ftp4y{Uhb}WHHw@zlPy6V7|(t;Bn zSdH^LY=VyK=yE!WG=)a<UkNGp*#uCqu;gONt7QL}sAb-`<C{`jpS8|;=6OBP0HCef zCc}U*6ez+Z3Wa35>Eccbz66-pa~vBeS40wX`qVckwR8Mv36fp&E<uvXE3M5b767z8 z>L^IEpW_3d&g@BeadRTd><}1ZA9-TKp3Hg6&UZ`DhywTA$UeBZ!HU1K;=v=#?Z_Pp z%4a@Ny{v#D^cyMa5mz^On8-sS7cB>lLCJM*3C4)ZDf+>9k^F=I?-N&FAN;_3--jY= zLui>FYp`~0+W*QRHwj2~7rGx(Jd5W966pRDWQr<EMd7)dPuC%dUwsZUTZi!E^Pfsf zFcq)@iKKIC-*0@?>lX2xan`p-;!NgSOm8`o3hnhMsk&bt=wku~9Ec25j)HI4xo=`j zjtSGm$ak$18v%j{7d|nZ5}_kQ>SC|)B(;tEo^Y?yHg^$U_$loH;b{fd+TKu)NCm9u zlQivCeJ>Py5!n4SCfXrxGWAss>YdC6_`=<v+wX_91)g^CGwHr3+>i2WJnA3f!x^{t zW6%V^Uymmi)>8~<zR?STsiB(mVXU2sk@Lp<HB7%e`1!j(r$h~h)0>YzaKpQ338u~5 zm3+|Iq#pBz<1_E3_EO0KS7H<SP5pMzjkCQw2bo!l&MsGHx_?N5DFMEI7ZNfk9x1~) z2f~O{6$g}y=~q$v@#;ey3G)Plq>y?@{MG9S@XNAAOx+JzK;}Xr2dauxN*^Py`U}+! zD+u8YHr_AkShT3aWCb40>-O1zkmtJx2iDF|w10fBwU$90crK+y7nFf*&K~R^br1ZI zfDc3w3t0Ca{Vw?Is9UWORuY7$dI0UT#f2Q~f0kp2wUQ}SR<v$entKWXU4QaIRY85J z$e%qZ%BQ1jMM5_s&jnm=QqVvV^?l$h%qbACQ>w$<>Al7WN+VhVrpo>q4~lRe9)u<$ zv3Sd7LjjV09zYXW;FQC+jBw)$EZKNn7TQC6EBoFvhzhaXF1M8xoK@fAEKZ1MupyhU zk~E%IqYP0;+@Vr*CKk*vh*gONV9RW*k5JNaEni80TR=8nl}$am{uY=d%*{%#7#Ipz z)0(O+1-Dg=XEu7@AAovg!o)|BYjrye0-wrdKH_;DFNX;P*Pnt}H7#+;e7oTn*90uM z1q}k{C5sYwrqx}e9pG%~jg-W0t*LkdMjjL^#bDxcg2lrKsFw$}nFh8W+glgRnf!?$ zB%>~`F!6p43YN@iWyFFX;LwIkelzqXu68VSFHO)a4P)|6Nz=`P;MkZbO0Cg=xx^9a zJ`@wIt-hMz^}qcZbghWWY+!b!ec|GOb8^y`r_rf<yU{)bAX6#)t+_CUp{tynrp+Mg zBT{JJ?|;Jai?0vf`H4@3{jCB=$yTnt>MgVc=NuNw?)_EAfvpjR*E@0?%mAvO4|utx zRG$r?e!baD&j*`JwS<hx{F!?ioaYe-YnFsfeZEv5dq0t4{1L%)!xWyQk8AR<8v!&; za5wR_O~391`82MiitoJoI$DCSJLwyJU$96bFeQ;K+9c;i+ru_!LtHo81hW4{!W*u* zX0_#1=y}ddUr6CcSqw{xI{*hk_`W2a|Dn`=9kStZh~U)G_v0ZdHPn_foc-+O*9YH; zE2{+51&if}f43bLK36w$KlS0QkK&t?8VUF@H=+1&Bpt<l=fr)-3aF2>n`+Gy!T{Zu zQHX^zy{>pgu??;*>3*;UEyB!&i&65J|Kd}xqWuSwP`vPQ;BF1kS~b^2y;IJVZjd%p zS#XcN{F{VhU;A!_fL5TB#!E0Lv2s&mH9nN&_RGO@uEwM}pT#Ma9r{)s)y~I56pIlI zGI2%JA;bNj&AD-6yi5DzAQlc&&X7}R-p0mMielJK8qz3S%JC@Nqxk5kj1h$%`uw4H zPpbiem#AV)Q3I&w%^T-H>nPG9fVvhF=~R)VA6Lzr&HF*00C2)+1#z1-4sBCtChm+z z>`KYaSbPyNxvb*r+fuh@Cq4CpXM|C9#g`oa5e|^=4D}?8uj9Fq4Ax|GbijdC9FNX# z2}nH#EKY@cO8x9LD7KLTIRv=qxVZ?psZFRp3pkd7Ob62ATkItp&d?$?fp4-%!wpZ; z-&nbl=hr7gweFWxCD0biyl4G)cMzvL>&;G9oa+81df*v@HWgz~B{cnF(whnM&F#8K z)Y||p=<R#9$6m}zfC!z46y(cMvH#*_2rychnSws%GsJ7tLv3WK9XdE_Ps#vSH)-(9 zq*97?CTLEGKtF8K*;Z>HI$j)2I6-*hB$Q+xDpN`u_z?1hD0eQ#nspg@uFqwSu6l)3 zs}+`T1)<No>zG(V=>6we^x-uAVR-0Q@d@^{f%_6nuMd9g*4v$PS018P0JIf^#*0r4 z23{Y1cJeX#nm>0`uO9K1=C?>~R+17)kelB$i0PofG&yauWb~q+{4rXBw_o+<@V#HT z<h<PZ$xp3r=6?41-$OA0?Z@84-D@a1*Lw=w=E<J03tsYr!okO1m}>TKH<aV>zm0K5 z6AryNKb$%Wq<q1jRk{v}`4G4=o~DjJ?8l*%K>YPM|Izn-n3iBF<b3t<U)yl{*ker2 zR0}^|0SAZSDD;|0R7CbU4!(JrNb5(&>a?Nz-{1Z>t39VZz^0X09J~aMJkoa(SuR_l zp3U$|j8q<NfK6Iy?ePC;<MyvValCo^Ki=^V`~9tes26nrpE7Xs$||g<U-E3@*Y(ak zqoq}-G1UW<evIOsH-Op?dX|y@l=8_5o=Ge3nqKL{GejAjK7lHW<3=qJ%prz=`T>Qt z_(8Tyc!M2L`*q&7YC{-`dF^2n;T%wSFd=QMmN(c0#?SthQMHD#cWN4Hyp+D0qaH|` ze}9``M==+3UJecj7!?f|EnEoTOnSA)zjJQcc?`UT!<cLBWhT8mqCO%Yx@Qqlez42< z)H(P_>zV`<fpM;=_g!fq_D$!;Em!B03-3oJzwkB!FWgNq=!e~(2<X<VuVHK=-Mu## zTo<I$cV9ysbOisE)DuL`g%28x5_m-8!M_C@>4ZKMuWpw-Jx#bp(su&C7j1o}LETAv z=-G`7J003w_76zUbQg&wRF!J3!#(T04Sy0M6*E9I6p=d5EEghlGBh4a7AAV*cAS&Q z;9$v}&3sHf4D3fq)htOuAjRK0Y;PH<Y2Rqb5u^S)q%pEwxH-`qK*`FTz+Lxt87!Dp z=)D8%;o$)AH+K?<;u7rM$5s#wfmIV5rtohzT&@|$_ucX7ktUbDL{yi>@nXzNiM;U( zC&K*!t%E*6t2iMDbY^PFhjJ>Yb!uV!^m-r^J2K}<ik#i&xZ~)V|M4Pv!yo@4{oF7A z0@WbhH@s)9ZJvjU!Ih3!8=*7=Zwfc`FL~u<^yeSGiGJn3Uq+94?AmIke&)g)<)<?( z)J4_lw?>y_l{q2VuaE(^;R!v{15a3feQ+vXS%Oc2wazYafik!3@L%yk@?Vj6V+uZX z3=*znBaD+0ipY}jJAJcxyBUbDT?KrH|D5tz*q5pRe0|WK_BEyS<@7%GcVG8si}<F^ z+>H;r2~(acx5h}E`q@850ORsPGtl6oJyn|wNB)-l*0f3c64)MDz)E)$pAy>55Y3%z z6$s(#!sZv${;{w#pv9|aIr&6KHmyingJ~5Ok;mmIfi{2lNF&7Kt)L^q?@EqSvbPO= z3#j|gX%q67Kl^7_U!R=dX&3(>J@~MY6+$Mt|H$5DK2AEanaSi+%|Ah;<H*AjKEKfs zI{U(>FSfqsvdgubV~|EU-;^FwpZ398+RXjr(@u#i_nHs)hY=L@yWyqut@F<&rmZq& zFFIS%CL;C%RNmW6bsL8v8NJ)A+FA3*Iad(XL&N15yBkjG^(eoXWN{ty9+8g50lAN# z+Y8ibI6Mp>h`~XpwV)#X_(>m%N#cdT&kaBeNA_TCqO*eslIXX9LCmWU4!WNOC%h{U zI<x~ZaY{H_UL?vFyoT+?Ld=5nqVtNmmbB$=toasW?$U<DOktJ2jsc54&4#@rBA~1` z`Ad|(EYC;or}4k+)6w<Q=&zS_fcpf?btfPq!&19`h@EMMY9CFD-vVEtUZ7T#i$Z0( z(s83L)w6G%jmSes(3v8)6}>j_la2L*QHqiMSH~%*znN~g0xJt%2Ir0rQXB@0?i}Ja zoLObYsxuPHsC9Yc&ghg1HZtPy8IuHmEkvw|5S4~Hgi66^$!K_?BQKJvB)rC&n+{4} z3XE(=_}L+(r3<jKXEd?wro0&J2FDp<nD-vIClm(aUc)_DWuod+1v|p{eDg(UfU&sQ zx*!XRLr*fuBGb?yE9f@HQp1820sZ-!>$m|{YiM1sdby$9EYGF25y#{O;|NuP7oDwG z5=4%U?(<b%wEACv|5x;)m;3^qddBJWtRK3Fe(jYnAJA|D_|&uys7{+WNlj?cXLL6? z+9kwure8TMUOnv@=k529dfNA$N3Z+itLcM(dmFvvu$cA4Cw<r9`0hisqmytP#>Oo{ zQeBj0qiwwXJN+Y%BotSeG2zN94IK}D=!vuhH&6Rtk*Ri&iSBbXFSDPdwoCTy=kVsE zDtJ~S;PO1oP3!J?<AJ*eY!H|xs1-{Wvp_`j<O`m<xOw}unrd2A<u;3U8+p{@so=G? znft>Y`zVu?>jgD^pngo0_R=Wy!mlhSer!mp_!x&U7sC~=vs@2){&+N>J^Y&!zj^Wc zKkhfmPb?alD5qrfM*{Oz-20r49u7FfP$}uhsBOq1ziqX{RD}4<%EsmoI`JC;H%I#~ z9bJqeL(qh+s$7Ss2GCws9BTy_JKKqAGxupF))si~r9ZuYElyEEW>bt3%M3@kJz?vE zpZWTHtt07&=|)$-KkCeWGk%2I^cN}f)Y(nF7PDr8Q=#_**DwF7<CCBLbimifB`G$E z6gdPOi4^%s-*yNX&%lpRGCTBfS-+gyLhq9A5_9%(rE~UBuEn*t6u2U^E3Ir-1x!0c zIm+H|G6bUdkX6dJ5g2i4-?a3_SM>{_q@>3JX6X5?`al7m;_4mfjm3U;Ts!m+6m!6x zNN4_BxhuSYiMhmFjg$W2Y9TGa%`Z)`y*_B;BQbJbpNA{VDfjX*a#y6p>uDUxhWg>= zY;NRF1^(3c$NBG@H(d$tdt|3+Oe*WCyE+?*&FWQ8?r}$~0W}**&pfv4$DzKj#yF<O zq&(_iWXK119o=RbikcFq##Z{7|3V#6yRF=pP@i`bm0{M$QTbp|WnbF^3mrvuZRvZy zRwquOZw?rO^cNiHB1mYhQ(FDS9#kaP1?ntc(;IQ8Yse%um9DEb-2zBo@;FM1r$mYB zk@vmEEoilmLuaAk{3`C0Pz%abB#XEs;RTEi8I54Y9S-%z0-pvC>=c~8pR}iQ67ezi z>y*SdsWe>Z(2<u!w$nK-*dlC;dJ|Z0bdV6vi;%w}MzsenPDhQMiwB51aYF=>Ak0fF zcoPku5OkCmG!n9u<Noz=hXtzV(3OAuCi-80=S8aw=YHS$T@fpj6tH364<Ye@PcYLw z$iVQ}Mk67#8HU3zzw*jU_r<FW#~l{srefCrc-<BIV%95Pe>pw16}hMih=x_t@Wg_f zCJZ_^*lWJRF$lK_<+c$&H~(r+9b19yfe#uNXB0mAk=u>gTp$rli1q>efbd}hgVeM4 z8mAS~ogtJ-_Cu-%(!MiUVU0?k#gRV&vrKk5{rcb%*y^h^FJTm#ST&pe{9#ezx|O}K z&N%A{vB-uOxj1C_$$Pvx>Z?h#319%2n5F3_{3V_F6;_EW1`<7?We&dK<Zq%SuwoAQ zYQru1Q|#d7z{RgZh=Ytul@dnKeQjI8ASu=OBj(tVUxv@Q^G9#Gg_hvH$KRibFxh7E zbk^~EnPY7hfPWe|$lMP9s*HOH!X2LbuxT%>Ei2Hz`uO|NQ!jpI;B-8?-v4e@5AW^r z%r|E;?i6oy$@S-P=bf{-dHY{neQhXWh98e<I)*C)b$b8&>bKJpJbBv8-BiKH;m<sT z#?=I;Z!5vN*t;&-Q0#B40|OnNB0`dDc6176UdTsvKh&8+Kg)eygEVJ5i}xnD5>-H! zvyHeFqTF}Uui|GUZ66wc=V7YvpnwPUPV;~C3K^WHt_I(AexH=y4s~QEY^&2jFL5;= z-h;HOhHn4-Nye_T(@92|<7j*gDrw0@L-Ejz@oksw)DFaCo*yE5d?@6J%)vtz{EFSA z8%3v}8T-sblXKA3ol9l52QC;J;T1o`36V5_V8hw|ivhw|xID9*vw&H}rfnYU#}+lz z=bdke%#p6qSKVcEy(KzwjSPrTJkobN=s0TM^Yr8voFvO0A5sBJ#vHGnAGOnKS$tK9 zmiTE;@>-v0Jq4Z~ByliqIba(RNkKlhX9`aWbR~t`Jku8gY%DoG24;>t;*Q2q+l|ew zw@`tj&0Io2_nV@W2xW2>3w>Xk5vM|(7S?P~Ke9d67VHdEeT9k}hwOm4!xy|FjK>`~ zdKxi0fj^;`SH}orG$MaKL+bOp1W=$Kr5Oc!p@38%Sn@C`kyzC5>(ccYP_d^<yZ&0$ zo?KsMS^DUXKj8$r_^1C9UHP`DX!Y@7(JDhMVig`fd}o)r^pm=JPsLe}H8JhwHoY$R zv}Zh>w!n9s^IiL5*Png(Mta>_uWH4t6YP4&R!{^2eG|+VptnofN*x+ph2p?c*mwZ& zF@nFk^>&PZu3wmaHGDhqeXHi7WY4gyJ@^?{6+i-@AKYC`z=LxV0ztNW<@^38Jb+F) zef;|1wDRh0SH8((m{REYZGY^(^j#~j5uS7Y_tL%Zb04$dvT7N|M6G_{uO-c<5FIO1 zJp&yCAGZsq+etvnO{DlsS*n6#Z^Mb;*Br|G<kKEOOYpb1ecU?t?v<Ml;5eyUq3|at z+n|g@bzU+YZ{N1>p7g)T{hwA=VC{d6Psvlv7wlgiB)Usr4+N-=W7VnyxKX8}=53q_ z2)*i(muz~K@T?2ZrAMB5M(Evxl>cs16ZcWGRNP1LMtKI?u;S-o0qf~!FZR3n`naDJ zi?0X?hHB^b1onGoExks#-^~5=hZl*Hvc{p<&=AAFNK^b+V%sfX1&%#0aTP79S?@v8 z_!|%E-jV;zIYy*dfRKVl1xPo}D<@v|>mG8Rn^Blfx$hKl9F~*18WC<|5$>R4h%3qY z$ohXZkIRKLPlnoo9k<@Qoj>r%#S|!>5zrz?Q>ck(|0-b?d(cr11;Y3lI)t`)9KOOz z=Z}c7aBt%yi!JzCXCMRLhpt^fv4M}+bWust8Arq|{)P4jt{-ug*noJz>%L_EklGX& zR`?|!E}bn6UU#(X#rTt`&G&JQf*0k5++~X!+d5Z>xHy+=e9xviG3j)833d`^ND>*x zpvsLpOVBI+=)l4Xtjdt2XjA=-a1Fi>@5ZF(Luwr1>1Ap*($yma+EX%GNx|ITv(A%s z&p1K#^zTwIb<b&RZA-)Ua*X{JfGId=Lo)LBM7`=1RF6esb3DL(%Op7bvT$UC{PjOu zd6jVYKB#y)7oJq<J_V^SYhSV_jFJroSXA6rz|p5PiAm|%BV9QZ_SB+f7(Hc()*m${ z3=L0ElDjzo58Mi)dlI}g)&O$SLr<pX9~P~yIxJef_kZ0?&pSNcQnbpTMXYYb^Q45B zpfa!8a-rV@eN`oJ40>5((1d;}Uj4i8+g7~F@aQv6vtrg;-gQ0w=nF2UhdlJ8*a)js z;&v-dQ8|oNxy^}zghZ>4CbND{`;M)_UHZBkQ+i@3UMyhv?hP!N)j}Y_3N09L;LP=? z{WN*|nIL<(0r_Q^J1!Cf$u!(Xt>8(0UNZfyZQlN&_kMuNCHs<XFZ%$YTW-9WK6Lmu zg8gRh7kqDhagg7ljvza0-B%&lKgc-wONRE`wO`|b_xtj!!EHC*5~o)Z&dPbNIn$Cq z4nAJc0f-F8H7?pD+f3B_5)7az``Rmnx_W11S2&j7<knzxlc0D)EM@<m@3OZMbG&AO z^Q(lfy5v_jVR+7^FQl(NEar850u3SGo5&yV93Ap%oB0#3kNQ!_Bkuda`_YN*7Xd4n zHgCWA9r0B_0X+<PTJnh#owr^7Mp}aNpZ{!Y8#4#|9_J>HldVnbb3~EG{GSN#&Zd17 zWBwnHD>+NLY9oQ0d%Mq+9MgO>j>8=t=8^)VH%VbJuU+B&RPD$J!+3CPhRKnE^C64B zf^$qX6o3x5dKenrWHn|027Gu98DS`R3AKmg&B9t9GP}@&_Btd7T%F2H=MDmsWDmOc zjO_NS$?<i@^2M{@PZ5W*4F&0xPnZvDbBe2*)byg+xG_pFOiB}#<lB8MXLX?q=6?db zNIul&pwd#}4(eh>OwH#g(W&FP$u(jQEM&^rdXR=<7(LA6)OHOx92L1EoRM(gw7po{ z<a1Ez5m9&;l=XkW+rdJsAU_`Hn%PR+@9%&*=bj=*cW$6TL+>NB=$RG867Z;PoN?m} zWxxxxrA8IoB!^+R)d_&DXUBS^q-PA3S;`SwZ@;>JeYvmBz%qA7r{P7E&QE1kh4az{ z>U%yPK0+^8N#Xd+uCwvCi>_WUfTXJ-xMQ#~b7d+Mh<&+RJgdO~Hh}60x+XP?lCv?Q zV{Q_%$VdYlXUgusr=_7I@>8O+_C=yIM=a{%VgafxQ-NwKRNZ)3u)6Nue|pSCs|@*d zLVSJ4^jnh+hE*#t#!$SC%y)iI!hcGW_Iq9(Yw;?>Lry+vU%-0HJFlld{qRlueX}0@ z*wbR8HU?W+299_NmYOhYQiv+E|3QRZTs=3dgC~{K>yAtCsZZPyiagOq*<~lX5&`3) zl8m=|QF95}BXZFZkP~T#W#yWzoqrXI6)&QA^Xeuqg-<x;v5%o8xcsI6opL<&PafKe z(th`Ke@aVm#@SDZh=qDG>Z64GMxhm0a5e_cWEJu)0s7uNJ^@3qR^5%$Kq!asj7u(} zHTc`x|5_2LDo5Pt8pEe7BbFQrW7Mj~f_*FC#Ut!2evP?rzry-dz!K1J$DHF!)T31Z zAKM9AV?ziGOkGiH3z&%lk0kc*U*7N@y8eo5R?$pyc<xJIm}DH~QN8N5RUnc)84oFS z9o=>rZ|H^2eg3m(32wjXLlF;wp0wB?vr~+6Y&70>`IU?Kr=l^wz9``cO9DC{(zUgj zGF3Q=Oy?0{jKzyk6G;8UI24j7<JKm;erJWFo;Ty4!#9d!MrWdUnSy^Xz%43>LLP!V zQIw$&kid9{r_tOf#k$Cz=l{i2SQg1>A37>FonoSpM+OW~Jkp}R`CywjX_x&Wu;!T^ zTR2cf8)l*%=&#zEyK!F7O-(coT7f|<UT_fh{^Ri6E~W`43E~`WeO2QAO!bbJlE?!z zb>N}1h*GH=`AD&sL?#aA<GIKe=h<)!9ag#|Lj6O0*X`amwS@|__ZcIq%hwxDG-C^C z(&;Eu%qEvX2K0c8Bu-T4n(s9i)7r8d8JrxG4S9BIlC4kmb~YyL0kkwPY~PzksLJ+} zQ-c)8QVd2S6WsSNo&12(==vxi^wOcIC>3z^eV#c~^ch8)0tUH(<5@DMqd;ZW;{nLZ zcUPQBBwJ>mihl9z`1?`tWB(8wc<?Fl)91)PM-+~YuhavAl(tac<o{%|EqK#Hm?m=M zg}Z=CX}07pI%A?P**0Cy=i+7H-majiv);rn?4;580i7^fkPBDWllCJw*1nrK2@eNC zvZZq5IDgqxrvlZ_zvRCj7Og(GUu`wLDtP>cSJRFPQxWUGz4B#^3AholAi)$8x%e1~ ziX7CA<9zC+IMOd>@hZc#Kh{&f?>zdww_ZhmddrRbUpCZV2Mqeu^hR{T?CDsq5&LO7 z@I+$|2ki5@5kg>Y-zPG=_C!*jVg_4F;3Ch$M+?E2I=AD({_UI!L@3=$qc@{qSbnn+ z6MIgpj2?f^cP?(;{_$HsMt6SVQ{;xDYN&koE(Mc`>A!2QdJBE-u9eN)Pk&@*aC5$t zl09~R7RCbqD&5T>jx+j7_&}cs@!y<Eay;qzt-(~h`kLdHe}V7=H@u5J|Jl0(f6kIW z32i4*P~k<~W=@oK)#Zsd9+f=CAPdd>Y-N+veErj>wynUzUYVZTOz$TaA>8;E=fMa0 zlVG9E#Vdl~gSlb5rdZzmvfo*Km2!fIoc1s}^TKmm@0icnYf)f@jd9unTv$`zW{gdX z37(%Yow%~<@aoH66LB;=!HUpzDi`he3wM8>Zo?v20Z)GR`2;=fX!H=X3Zr;I-=f$8 z>O=AkcAahXlC}9PiUI<;UMxhg)nv^@q0chR6yims8ubdV5mC^v{U+~ej-s2wycI9> zxgKM_(oXg{u^;LRsC=KLGRgZw*_>OR(c(P%0BOAG!?E_m9fI*U@aZzK=-BuOkJs2y z+bPcTFWvW$>r<5Bp8tJJn&mhjlW(6gU-JB~k(kwCXMWCfNrZ4kng0{xUFioJW4bL> z)|&buL=SaAH7kF+$~6y5c>rU_kocu**gkycp>O4q+F&JYn-m)<7D%xfw_ozK$uo8r z=$6Df!0;BENGysHLBWd9jZl~jp@DKFy+``gYkuT#4CXJu4<3v=3T;8!^^$lTo^k|Z z_Rr`}+j;8rE&OStRqjy01N-O)AR$0AXD%uR(d*G>5E_ilu4m)v1I!x!rOz#ZePnoL z-1lf2L>7E4c=SSvpETmDN)nENpHaVb0{7t(fq(}AH$LO4=2FZ!<5Oaa#~5I-d$6}% z9|#MGV~Z=Ujv}jxUE4G=do4Y7GC;qg!h|jl)6cQ}`;&w)fL8dhe+M@tCqDEfdgI&P zOc(ypbG{@+s|-^S>pRamt8jFMkKq{5Qv3mZh%{7!{=|OXnEgASbQb+{z*Nk7;yGv1 zLmqmf4aX8l(~F+@J*N;bg^PA3Ch!$U01V~_@HDx9eJ|=yvQ&yr%9Wk-RiojrBNzzw zHAYC4eE*AtOaUXKjff1B%qN}yR9b?oUiG^`6KNP@)Mr}J_NHRYU*Gyyv;@;;?%03- z!LFNV?+pA`(>hCV<u_=ou_k5lHIR@F<eXXjz+a_trekxL#5bJu&2+)@*H>S?|N3|4 zt|dOzi*EmxjR4Vr7;f@#HF<uLA37HNad|1(O!mXnW_4pgiTY4=J7R>&@w8D1*Q?{| z4q{BiKd|rxpOdbC;jYhbewFZP7e90VDq(d~gex$Q2JX*fa7{s~%Z&3g!{g68o9=u3 z{b&TY-*gLo=96~@JhR=g6~OvD58_12udll73R;5izUYF&Rrz>3Jw<ZxFSR&zl(^z9 z1L8MjIdh^WfzMoI6SPsHGIbGT8}38AXy^EABlqt@F|PHii`X7)j2|Jeo15~3g%Y41 zQUG+sF&x-AX^pe>cbl3M_?uSMQBM*c8tLZ&YzM&cwQ*MbU13rnzoLj!)uwfu$CvXI zH6}^Yh{)8&Inbsezo4*yMY@(`^PqW7wa;1Z9UCNc6v6Lq*uIYph@sb_k*Odl6JIk- zP@X1#V(M3Mp^hbu4i6c-YZ+v4o=gwORyws~jE{_V&=`}%9!0h@?GY%sDr|DM>HzZ} z!rvBfMmyv^Us-BOKI<+kLCHwcoCn_LFPkzz>?hTCbDr^2orbo-oTj_clESqzg}P86 zPP8^>-DF|%=1b*-LeWZDXILIB=+uuLDmhjzD-W}mdiA+Z_t+tnAqSrnS_mDTZg`cd zDqbxjm4V#qZ(DhbPwr&U5jWa|zT!(&h4BfIbX4Nk8BzDzAavh<9RwA{$Yww_nTm&4 zCi0HUC}uu)_Ebjakzzpays#!hqvf{v<dmp(67W@U#af#TCeq(NmRu;JILg~TavMGU z$xo%L|KLix;}f5xFEzaUS1+aidF}NrVQQ1yWhKh*JfkRz&WT9)DA7#cr+uKl|GUrg z{h+=CFyVglA6!lU{wYtVCqDdi`jczlVLlxn8H**i$;;TdEEOei&XgY|ZN52X$Di*_ zETPk+P7{juY*ku}P?>sqiBN13PW@|Jixy>bE3g=E2MkNE8(i4X;ko;r@IZRpIp0A` zFztWU(RX1twlntrN#kpN?Ul3yXHT2C>po>k_L%50i6z<?lk@95{;Q-+iy*!I&%a<< ztgf)R_hMH&L%DH&$~+aXe(9Ruq&4`*JMN@Ef8*QDKZZpG@UR1UvXv@Zbe#GmvN23~ z^-`C}w|1%7A`PNVjaHj_lW1XnE+I09vH?OON#H;cB_^Eg8Gm*ZYjpB4<eKU;rh?9! zU-sHnbkmBoi(mDNhoASFSu_llFWCwL|JK*S5xT18m)tkcr>0*YT!QJ>2T_Jn#cn)- zaYDSXa_fyBTHnn5)KeN?&BnXjW<Jib(dN3*w+C^X#p|nEs(v~K{Kn}zrQ3RP5zOa` zNnz{;pUe@TH{f)J;V34R9B#5D99u7TJwTn1E`MoaaS_`Xx!FfUNPx;{2<V>r!qO~} zO}pom{g1L}5!uZj=Y#igcFz}kKCm;{OUxk)FKgR_A!Z?81;sfbmYG<mFaq(#a}OO` z%#~#SV+ckVxng#@%wY_=0!w)vJsjy=<=nV$2b^R65U<A8RdEQ?KJ&*uU6l_XIcJaw z>X+#e_c{QI!^E`qaDYeWq8YWR#-J)eMD~1|33A_Mh!WetXHZ?uwfvJqaV@&wf~bGz z{yZ1WN}d8g=osRdEGGcoCPoj?e2e?Lp1<Bs%*h%b3=WqfPAqN(9|A;5ACVz5Hj+>y zpyrbI2Z0!AdNA9JxYI!VW^Wb2$eygQSDlxxH!rjv)0EZLV;qhvKVy(p+S{=A->slX zSg@c?7;{okx7p+qTKmAopbdczyWzRPgL}cK-D4r^47_&99(PTX(e>A*UE6ohzc;$e zTv9ROYQKO2!1?GehZU&GnbDvWN1v=l1(Ho6_zai>O6`D$*$Ij@%A$PVdv2sle)z}f z^#A)&bpDf{MpyjiZ+}UOSug*UOX(Gde>(n|84!{tYM9J*H_-85q+wMM{^((`?u%W- znsEKzZ(Xr3T7AdEPNNt8*d=uHd*4TQBMtFs!}M?0&hH<Vim!SVOj6KU>v`_&Wfd@w zuxtbE!IA1sz})lz+Gsx<4HI>@06@@0fU9~nbHVG>*+1S$=xYngYuFzp(f;mdJdKv% z?N`2e{|kghxHETw8=-7~#=-t`+RT0FHNt5#_p{D_O0TbyFoR8paf6?WPewO@W@CH% zSC=VqI7Gn)T^x{I63)2Of5OwByf0qe>$v;S8eDbh<>5P$&P5L;$b4+83=IK%DE|B_ zR{b#)&N_VgEc$Ifg$eRBXaBG66~QH*GfwH790jaW7z9hz%~<fsd=x#)*3Xph0#w9r zdfD&LM{oM@D$1`r>6_?j7eCATBA%Jb(Un5dukm)*$-^az%lstV)qc$h_oow2Ti(2V zU%>M2ohM1mnV%O<{`T<yKVI3){enxLP4xo;4o7|N!$qP*;A_{wf|luzOR0KH$AL@F zfv8UxnZW+z*gR#xIHVV{9A=KfDl0->{h`2q1^>SI(XOWbX|mghd0ZPadtBVLLIk=U zLf)&D9l;%fW9G^`i1|ux{O`|ds?g^4z@HX?KX6YaiMeU>eO=68bOKfJ=wAil5bLQu zP{o*nG1ljifr75K)bSlO`=FK^2oUbxfB+V{*IVKKw%cRW`rtV9zPM^BmMI}kD!+j& zyRhN*kG98%COovOm;u4tbaPf1M=D8B9Rx0d?nj!`>ksKv30z}m(Gm@KSSSO1TI8*q zlzK>_uPgV1vHH8l{}9q7c1XyvZ5U>r$H1M+UmXJ~FaAhcJ0~ujgEp2RtX#8^OwVyA zZfSg<jzO^K*NrKEPrf;SW~H%L0GWb&&NL+RGU5%#Jy5DzeU^q>U6D;#t5%zIeSk-( z;()s|eZZs8dL)C6u1L61=@9ZVul~7AaZS}|b8j-fq`1T(_~=PJM;mZU>?ZM3MPnjD z`Cw5t@xXdrA|Lh+Hsw-XWqc$4rL!Zc1}hf(uxFE_BogS=F<vzdUvQY#pA)*sO6ZjB z5ev3Az3093;upT?u$c8oI{RC{V}E@6M{cEi3NQbam(s8Q>P!14j;2^*BIt{`Vw~n+ zvFu{wtD#e)FGdk->ifHgMXMh;ELuJ48&0NQ{+a(mA9&AAhI5}16*{2>1P(=k#$)!) zIM4$ar5Xkk<<&VA*e36ta4^YblPy}t^fK;_;x7fkXb2Te2IqAsb8=0wKg@4<U8M1p z$Ho+&T~;;h>HL!}STA51Zg!f08IJM0euJd#5Z?IPucIaSR^7}U&9vZsKJX+-BwxiR zq|5WJ400em5LnWuQM#%#`_R))*%z*U;$<(|RJ{7fPu@v?uB%a8?8c+}cMirXns9Cy zDpBv(DD`E08ejNJZf*JvbD8Fw+=`K2rs}uVlJ2!qz?%1l+Av5Sei^i9i-SS%STMAp z+d$h2(IANTU^F<<@bB}~&*xrs$xG-9cYSUZ?O7L|OAkKnVLqH-hes^t?h#bF6!R4v zMoc_7;5ql=BW&KTdapL!iXMF&pXVZP2{3(I+Xrjf%stv-$T$YTp^ZMkRz9~#SHg`H zM<18vM*ZG880%3UjJQSnT2rH~F?If_K#D8$skh@mllrz{zbPFIbBMJ<5PR9jr2fO( zN)W$fn^OC<i|%>tvK|1JXazca&1*4^cCSw>_Qs#B0Avd7W;Pja<{9i4)>}7bIxSPT zgW^AkKS`*o%Txph2i07`{A=SDtn)*Lc|{hPolWg@@2~FugoDFZ0Vd6KaS^9gNoJk` zpROB}ju2;f@ZSX?p+G(Rp7wE2S|$hG3U6hYI!C|KJ0KZyjo<tl=q3ASJZ9gcOi_uu z3o4>^X`WPFNb*`}IrF3Ampru4reBqJ&@mQ7it0tlq~S`|kQsIZMyTl>kyY0k)dLJB z=2MW7N=}B9++sPk$wCR14WkNkFH|N9Re=L9=@=~dBzznLuHn*gj3AGxIv!pgX`U<) zA8KpYq7wId?|NFLyjlpmUE@K2S)~jPm(^is9f*je`)mPcf!a2Hu(dm1sfc$iBfpkl zV1Tq_f(A6lxX~76)Fs(moUM4Yw12`9Z&K<&)WGT{s9GsdnSU7&6YuB_!~{bgI8E%J zm03B#7g_odhPAFKw|(Rz`_))yed`nVtFtco;h)&A);cOo#j9!c)gD42ZQvIKd~!(M zI1IO*+bG+R5;mM4z4hotths1)c`I6-WJN2Yz7(oK2a~Kyt8}0?R7jXP*w!wz*Uzc_ zr#|s1T7vr=7O;++USX?Z6C@C(Nsy?!B-NHG-!1*v159%Un=cpB?XNMa{i9Bc{!h73 zTosPL{haSu+`N6-xcx70d_O@JiuVqR7)E2M3aLc!hGl}QU%gzwdf2p?`(q#Js7Y<I zP+*uJ=6KRmk9FIPn(uy#&^ll)Y@aNu9p-d%{FI9>I4oTK*8cD0(;h)v;pfi#VH|iF z$3Yd_1>9F~!+32heUZ;|B<aVPLLdJ5`AK(il?ta%yuvWXnbub??2|MB7IS((0XO}4 z6S_$Uq?cdLt~(dpjE%EVEYJwF^xQ1}8Ku9HI*sKshXuPgZFrS%g6CfPLMs5qRUf?3 z4jkYfAn@PC5|l^qk#0vPLSe0fYjwqx02P4~OfhFCOAZNFR%<?R>tO-w)|DdGcel;l zla*77f^eKP4Q!*V^$md`E(MJsDX5|+3n)TA^82=S2Ip^|ZXGaagzHC63>>eN=YwZO zCcqom>wJ0K6ivy_b6c$i4|Mg0KK5=s8F_@+VPAzBOg0Ctxv}Ys`3(l*Fgco=Sjx^> zN8;SThdob&6otxZMi#@XgpN-d?OlrhdVe7(8?%d9zB{Ca;o8loHLv|W%Gn+u5<zYa z_#kd+N}gk7=UT!z@jlCS76{rLK`0~Y9CW;26C&y+h$t1o-M6@mqW!VuH$B9bk+SkB z&0c1maK(_+9}8TB`a{Ev2-GP%>3%n;IX2)4^=It*sK=n6oo%DYX9I!n-C;NxJ+Bvk z=c5CnN)Pt=SIvWjm@V`bRAo>Sa4iE&Kt-@@YYgP;9Is>f5>MN)m~+&2t||jsnQq1B zmTQB{!EvwlW?ChZ0DIu^8Wz*nbgoyR3VZHDQAdW<;JZ3wG!kCGCCEiq%;iz9Ngj!6 z(6B&JH!FO-n70y-4vjuU*OKnsY74kSEKp>oq;=2;ZwZ4M4MzhSaN^V96VwGMF6J=z zOJ-Lmg8k%&0+>xZ?1RJ+r+19n68ckOi(UV>uHw*T+@Jd7C+X@xxQebh{F^p=pMJUU z%qN{q-?g$a`n2cORKN-W1O?NL*}u-;qY%-ivyQ|-fg?p9JAZuiBexzFqt2t(z4dBe zrIg@PpSXkG^oFbH1Mj`@uvqmzz}?eL=t*zD(RVQ8K<8s_1JMLPlNKCXxfc%2`ts>J z?w~c8HkH5YBez>uwSS)nF<q0=US>O+R%0C$Pp90Iw6?}0k?!cmII+;g)B$^Syfr*2 z`Il_5hi#v9{_^UpD_`}yy*!PHIU(}I5wRy84TL`T*}M0z5>CH5ID#|IdLn)Jy&nwy z5aV7(0;}DUF>`mk4FBe&Z>I0R<hf0DJk(u;eD!NjcmUn&tM0SMwe|~xBe?3a%jb=( zlL>a5fInb~-v^cIj`?}oT7D#$_Ok1p2!t{YzMQ%DrRYgSip}j46XDgDhU>m71+35S z3s^eCXh-Rs`9UVyq6MbHOyMRe*?kNu>S)nWmw@~E5$AuFz>cyV-EhU#^x#wfEj{wg zZ(YPb$!;oQz3if&H5`Wi2(Z+AHh+*oKLr8i&D+QJFugwbcenj@#6?hWbNAiOv?Cet z*8I`*E1oAW{OaMfnfsN8_U2mb3?S;9QQ{TNZ)B@{8*j>}TU}2{jI(XXtyNA48RiTc z`YXrro+!SU){ewq^%Kk^8Rkg)75Sr&OsqDf52qO(Ug4Z;h|#Sqe6<(&s*t~O%Ofc1 zOT$O;HM^i+0Jsv%9<1#d8P9}0r~%cS*#1`sX)5&kfeS{mpg?}en!h!rg-4H3yCzV^ zzEBJ_+AY3?dlCyI?YtIKBpI|QO)|arX%|Cdy<iMlXv;$l^eLEsWG$R;LfrW^iM<J0 zb?2&YSOjk;EPe=K9CNm)JTuBUAj>vmNMk188O83bc)L6}_>QsIVN$q0u1IbtlI}fx zbetH?_7%@a#KF{0NcwL6fxrvfz$M6x;FR)hc#;6Vq9eKmk^stnX6*g1C1En2E3O{V zV9y6|${tuac>o#nat|RZLLRoP_RgS#TJBlVmvnw>zuH83ffp%`wovQM9~sF8Ji;_S zD;wJ{5zxTyuL|w|PmZ-SY=vgf;fYAY+c}?(Q%opIH`B$H95gh-bVWC{CytCe1u118 z^%-4_Uy1rx&#iss9(O?qWH-2>49YG<5VU#Fwmi>{0%cH7ZGScg8G&(3`(s_xido0~ z>*MIOGagIdb<SD)q89#=p%$-7kQgAd!3UX2p)WMlB$5<-Lkq*nbo)nc>xx((J3RM4 zuYCu-e_yn^iPmoVDNq1y0zc1i<EhgzpC|M8?G1>euH26p@J=6h{h#$!WZ!b~iH8Nd z+uc-nCNzsxfDd+lGi9z;=cr|5Po3@Xz^n^h8ivGqXoVwT-P=POCPg8?X?nodov^xj z`#Z1ulewo3x6zfvaUMtXDE%70t6%kdiv_H+&;K5J?Mr|2uvl?dN5$2YV=Vz_#E~-5 zieCO-Cx6TS?_U!B_|;d%y{}SC45LWbF!9_{zd{<mLXLaAWA5}2J6nVT|L5~m<qn07 z!hoi4_dQ{``1c7dc94`ffIS*~83QNZhq<UaS|W;7<f8~YgLoc0kdel|=~oHA{-keO zU7_}fGtbz+PI%oF*K8ei2iZgQc9s+~@Y`&!Da6|5?bloub>6cc56Twb{Ngek29)VX z5YB)8g~Qi&r}HPDehPi$#t#MVx5})As6O9W>ogokJ~2A(sYym?#Rx>*u5%)9y662n zpTNGI1kREB;b;%lYF|mka*h5X{do4*4#*!KIT9F8JJn*+PQ17>vPd6SmToU!E%f-S z)H~8WvLq|MCL}E>nfm-I7V1|)Q>cBHYH-j7E`5%TkG{fpMXV3jB>57Y^EThC4|ACd z?d9aUcb#u6!Y&N7(d?&d5jtDae4c80vVcj-v$bw;U{WBrqpnBHe|idN-X=5DaSkNP z0u=$Xs?!8MwNo4v8I9ypTZQz_q%q8>K7Og9vFE418uFF0V?37^K%@h}+pp{oxZvbL z*T1qlK?4r7_JqQcKz14JCrArTmI0~MqVa|Ij-{!nB}o(=r<J<NoB=Uyx1<%Q%tMN6 zQ6!asWJqDlS)r)ITZfkQsqf3_YK^13ipclhlhPEO1e+De&8Dc5=Xlgdnre6oEjeZu zdTmacvN4PQ!Koa$Do$ry86$Tsv(s^BC=tK7?1F6xFh-HLC2;=qo4+R1@m<MG?Oh~1 z#R;`$t_kY~pOQsm=I@SWf2cT<{mX&_ZHSC$94nrc9)~pmnM%ZY_h;{>cf9?2`cFUd zJUZjwK6<|i{8ZTbg`as5{kj&fa>51z>Jr0+`C3cGB{0u$oEwTo(U0znSWl;4{@MRR zPx!Z|(Ni9GCjG{*UPd>+=Y51yn=x^slWF7X3$_Gof2ECe|I!1qKc(gLvIpaVMB`vG z!_y@A?!$t}r#`v73hTiqKg2|W_pa0N0db#Hm*Z0%!FIYF+WnzWzt72h)Z-6{PN&13 z4Y~ZCzRTE=J?`w4;?=c(LjUl|PY3j~h_wjs8?s8ll)zYXvaw||_p>i}O6!v}Neays z{WjBM>q$h}FMS!ppB>(8|IUkF7EN&v5>CZ9Lxmn}94Y!^!k1q`2gB-y)CcThZflp| z1~phJ*(fBA&Cktx@{m)PUpM<q+XE|(GYby<HWSrBrGOB(-KOmO=*f#f`(*+NC(5gb zc~r9{Pp?k?_9ZW&E%3C9pLtjaydMQQ45=(~I``s;DHN0TCna>6-LUM7kxQGmPjK6` zNxe=VdrF_5qzmLMiCp(N^_f=c?SIL00WNs{vm+78S|s7q&SxDtf?Q2*r6cc~I{u!= zVQ;B27Yccwy%q=dAq5A5LM3YPlt?!~C&STXB_6Y9f23{ZL8HoGjT=zRX1K%QEEgo; zUfa%V4&k)pbv@#wV503q&gHLY`^qG=VKNb^?uVS8LWoXdD;mHlkFl_=KoAB~NDP!c zHBv3cNW;ZVHca6+db5P$)-BxK;s?E`a&z$Wk~BH+Zm|cCsQVUP4HN9mG@9KE-Bu)} zTl6>;_Gb&&$20^vZ(X|@tWC9)MKVf5o!cD5a3*8=`Dhs$xBAdkb*EQHYFtF-2#s&n z1yetYJ{d(m%OyXC1+NtpO2TkrKAB_(Xr}H5p1~7*)`LKYk7+CW<6ECJ4!USXF8fcU z6JBQ^m_^}55gK~D4IoIOIJY-w%BoF4tPulfZP#m^KH8aV!mtjGqoURuZGEMHtWQ<a z2Ywh0y2NFM&`Wv*)x50&Lu+aDB=Vr&Rplc~LKwBg{>hdc`SfGS%ygYPQ3d<<cj0lh zN+&iPPe?o>@@4rka4lV*QS<3zE<~|EOi(}2>3{^^5(p$i5W}m1R7@t4P*OogebM|~ z!n}>fKa@{Z+-Q2C@4G9B_rLe1{a#tG`OR0yq3PTiffy8AHcnE~K-XU1!?yTYj;ATd z^zZaK;cI{M3c6!o2%0BC7HIIoQT0n#`=Lt=PGQB9@|18|0jztpC4?&+KBlh+4&c#` zJ<Z*Kl5Hq;lXgx1sdQ}&=Wy9}G(MFmu3hBL!%G-mC}QpTL*D`ynMsONQ9Dj!xZt_} zftKK1*ZoPHS+(I{8#9kQ%&KsYC5O-5bvIpm<y&Y8&N%A{z3&37T3EHya96AIE%fCN zS6=#R`i+bK>-+^x5huC<YF0SU@bGTSpuv8s)e<uvX)RJ4arP=#$7nDOL-+*4QID-R zm=8I1x!5tm-{1cKB-|DMN{ih#jtXYbXyopP@`?nK?KH%2xko_nP)FB8-+R+7bo~`q zuj2p8<L*t*ed$lrSUy|$^J7Uo3N|!lm`|XspL<wHTY~AA2S0PiolX~N8WWs|6{aCM ze$QXtf5W?I38ua2<~_qCQBWx23<-QaMh_!462d~iUzWbZkVh?Sv{)*AJnmkRYFdUx zo*7T1t*$<<5OiF&I>{*+|C&EDIO&vHSw3X*iKdl(3ywj&T_^x?+_P}r_e<hyh=lov zqeOe|U!(IlJ3lDh5x%}Y^DpGDT7nK|UFCG{0GQ!CWbuc2P>>SFc@i@d4*O?<wW7hc zIbp$Kq7W8kLrfL7IUAUc!-W$0rZET#A)yk=dX{7YMYYNfGKQXJJToOTf{u>TkT~a1 zl|P7QOvAXqr(aC(VFe=SbjByB@6a~Wj&Oh&LR<6Y?9A20N9sbG9a;jA1xJy${2g0c zp*N4f9RcQ+S{OI&0h_SA0tVO~IyYyxkRZ;+>&J1pzS_bagS)!yaP#D><^^h}Yarv( z`7bw*=LR!fVj+qubL>zV=27|yjf}qL4cl)K@0bD5lI+Yg`NRtN&%{+Cv3PaJnDa#` zjmUmV(sv?Au-X@nZrHE(9M$s74mLXZPA`qLbOBQGq+!Gs4_GMQ%F&GHUKYL$nsY%b znU5v`7*pn-Y6hmTA2|CQYU~KdKHxOuDTZv&cJWxsYeqzqECyBQ0zYPOoblDyjO8Mk z2)f<Df^QPQX_1TzY%<XGtkXUE*qS}LYXb_!JkoVd0x=8uPYwf*TekbLTbB!1-}2BC z_pf>;lg=WiX#QeLm8E_6S*m1PTa~wF>auw8IcBB7C?5~{fr9iie9B`Vy}Eh(+pc;` z#hBmpaG*kzyoGPaso!JM_gw$yv;@;;?%#OwgZ(C=6PX8-JWufz&fYtGIlw<2-njqg zbAM>R@6`;zFZ-IP9!Ak)mIrSdsypQHdQhfd^5vv_wN@{COd0a6TC%p;_XP7Rgn51o zuN(%kK`5L9W??uZJhD~rP3FOIGg3@B7k6=O+R%OeCB|iV$Y~F!voAc?=_<k1gxdYE z_Dmi&rYFGo{Nec5R$smIjn~?-fG<_Tg5LqUxWVZ{J8|ocAELj#?c=lr-~H?h98XCD zZ9^XuDsQw|z1AV?U#ENl&{{<eKNUfuRb##f2^P?i5<l#JrT1^-pZ>f^pdiHiKw-Xx zgQ{zz_Q@%hrhEq5Vqb>Qw}DNc;gML<2j6RpOjdRit?k7hQU$xg`QUgzyxWPz9F=kQ zp(xyJ(~;kK)_l(|Oa*2hu>TH->Fbmtj@QjcbA^`sGY9=(Fd}B)s?iQPxFlPFoIQ?c z-FAVy)S&4c{-AA&J(z7ERO%9A96B!oJK%V#<FPs;#Wk?b*%V+{Ok5Rza!6q3+O7yu zwfeu7sgzfPjVrM#CV;38QurT2bU1!4b>b}JtXyzjGQ&7mg#2^7-i+n|U;o1Zg)Tj@ z6S*|Ll6%bGY5a8+WYeh>ijGP~7LJQq>aLG5Ry-Y51T|F|aJ3-&;*1=b86oPzCz+Te zH?<%bPe)utm5h%jFDZ<LR}t7~grGPi(fFlUMoS*dvWAGwP_`%zZLmef(;U|#h5$(1 z93xyy!!LDmm_%afub`WFFq{H6-Y6LJJ6iOXh^}ysD8*7|vfu}rMJWh7T@JlC;h=Ed zuW@m4c7rfil2%HAoP&I-iA7((9DhQWZ7tI^dtwxS-r2{BH{4v{&Y+1Ir!nt>ief@+ z_{FD6tPun+Nc<wJvwqyX|24#A_}&Z79SY7@jQG=5F9OU7wXZ_q1=Fa!Gpxcghl!s( zL*=g>3fKZuOsEeJo_xXb=ItN4@dLEvn9&x+ctwTm`OH^tdG81IuM#f78E1bx^hR0w zD(;be$WZtGW#RL8-Az|sdO2PEoj=fiDQ#et8eaM<^9M{QzV5LpR)fjUlFfFj1knD; z8RFVJIQI)z$7j^KPg&Wd{1dnTP20qM<P^!73&D7UP*mUz#e6Q0MPOo}{lLx(A~jvd zl4R3A7?@rqyzHW%4Zp@Xg75$NAEU23>6<9n@`gfNwjCMW;Iuy>0rc~Y@#8jZ-hSKr zZV9@G&cCM#kr&;O6gn^7|NYl5ufm#sEtF`aQDTfq@^Nhc(8jr^0=o>5%-nG4Q_1O5 zl1FIX_yk5VG|suzc+}3{R3w?J2vhu*)Ub<Utg>$_l7Lf>=Mf15zVhK-FB*tH(f{DQ zbdQp!0#{<fUkxORt4DhuCKTr^{Cc;_f+akALbq9hq=7;1GOZlj|4D2T;{Ws?+5^&J zr7iZw^4V6*V|$1J>=Z69$69IrHQOmS87-Sc)H}%tjDVh#*iZ;!R;|O7xZ)x}#=={n zP_1v)*m!Mxg^gEoyf~Rclz;V6+lo}XhZ0dCZ=^Shws?KkNd}tic2oG0X#wNp0S-Dn zmPmu$7Q(a?Qv|L)<**CKp&cq>`$VKoaR<M>NXrl=ifEWs0j<UB8zB2QL@mYjbu88S z5f(1`E>n>O%*P5fmsyLXyHZ^Zzzf8>ljtDQnM%1+(Dh4t#1yYql(vE!ftOxlK+7O` zno+ldlcgbOs~wFCQrJ2MN_0C;Q<r~Qz*({-4Y1fa+h}YW&vBhe$jEIbM<^aYsjRkZ z!n31PM`Hg-Bq}#PoPwZ$MJscB67XqPp{TkcJE87y{+^ACJaB06pWFEpL}bm_=~$M* zB*iZ{V{2|UBb37Si2PTJ92rCVWeNzv0#da~f~<)A*UrS`=TAGuUp+nW#B3jNRmX7z zhy6Zw+ehiH&n|D~{)BVBtIng+Wa#r=AxHuUr6T>@kwhIb%<<QtD75hc*^JYdpL-Wg z(3*@83p>^aoN)YV0qfPj_8SeGI08zCtQ1ksY@>;1Bw5r9@45a@X$j7K&JWPN_nR<t zplQ0O{ID~JPoQ~&=KpiT`)_zBJ?Ak`r7JIc^}di5Ap2tOEzqwq;pB&8bm#<Af0F3G zFtN9Pqed(KF1@4dF_)Q;O#AS^snGKECw}8%zuRxR1#A%aUSwcVdRfv2p%g1v$~Nht zm7(7vcLP~Dn|(yI|4-cZH}s~L{SIw`i(maqZ6ou0U;|vlclgVN{ONOT^Y(Y@{!|)z zASOn-()pL<I-{C02fzEa%dey**l*^3+9Rl?QwcnAvO<73yJ7xiyL@HgThxMaKY#5@ zVu0rqg~WSS_v_lWqUCN?z4(r>05Tuy{*(zXgPhul5b7Zhl$7TP(Lh~6-bAT*(pD4| zMHPjEg9H0z;Q94?4ukc40+lL^Ae`HY#(!>hU=2-AP&G8oE9W1C<IfA&{`56S%^*-; zZLWmO{vvAEV`;Q}pRf2M5?t99#(Z|~i;ZHlHD{O|ri70O;NPb?vNQ+jN6a;jC}+X( zV&#Q%ESo?3bAH^@<S-<GxM>e<#jjyE{bZuS2>X#Ob5k#3k$mquascA9HJdydF*Z)X z{dZJLweh&xu^0_|4}4G;;xH412OkaJ^lx9lS^&>LFu%(URwOTYelU3*o&g92)f^tL zBC<Bz^*p*7jazKtVhi-ThPRNip~no>Xg3pPJn2Cr%!z3}4T*>-|MkpOq>lyANe3CF zsm{TMz<~TDxsT$)5hXx(T{#&&7e|hQ6Yrxp^!bLP-%cpTh2VF<nfq|COF$ywN)%XU z71{o?JoUU@W8eki2<69CAObwKS%c9L66k;pT%4xhEUZlI!byQsGuq^E8N52u&Pf=^ zFe3J^eyz40)Ilm+r0e140ki|hP<mJyU@xe)aSB#ARUF0#LEse7W$|PKOl1H4KzT=- znd#kqSiD->2kTLfJ$3(QDk0fV`G%@mdg=?#nAUM|4UbC4nqZcX{#ZeHrQha7!dMm1 zbWS<_(X<59>Z?0H`RUS6IWq2bv|Utb%*QY>VJP$Hue<Us%bU3$-dsNH4F9!44%VpS z3|}36@SR^CaPn!V5b8!q^wAFqd;&xp2kn8jvT3+;e-4F7PM3Muv$~w;rDi-f#@7eW zde(Wg27mdE_q2|xUzmn~#`@jDa2!34@QIE#%S9kwA?<shX3`yVkyfKm5xVY*tM_|i zt-*bdzu$gS_mbEVd5ae+{haOps~`BatFI6K#WmLj8d03$H+q$gK)*tG;dolHH?MRY z!!s^<HpCUr5I|7_4<4JW1C9Om7~(94tc3DIBpj<W+8irF?QrBYAa+o;9_hG<z80Y+ znyjz>)o&hH>d<0UcxZ)3dQ+N#DdtOhz#fYuIq*PGP}R>p4?DDHiIG=a#)2o=3*{XR zA%DQOXR7_ki?tz7Ymyq<>N-X)+Lg|?_$Kn6#|!z=D=|~y_C!xOO$f8E&Vtx&w${k! zx<u)^+0DP2x~#j{cWfo>xu)e9wA30o8iHE}$F@-w2=jl*LI@POq~T+5Sz0dJbXhQV z1pB49AW|aEYJ@SHL|&Gq><E&cCGiltU(Wcaa|d`b{^_~o-q5V<aFDRXhoD`yR4As; zGJ)NHMTuRRLx%BMbqw7oDgXXh{4@7OazwqX*C9~a*uI#71<2!BYIhXq<OIjdEo)pv z#~?rT?B-P55HZIX;vDJ9CN5-2rHbZ47%c>xzf>4NWZ~%rL2yaRhp}VJ4a0u(XF@a( z!0i)n{<5}fOL$#GAV6Z5<ZQw#a7>+iTrPo3K&IWI>2Pe0{fA%S^{OeEIGBYw+r0)< z=(*Q7Pr7s}N<sx>z9O%nv=DP<Vfw3bK0n%K;6H@g9t534$fwMno%sbK%CFMtN|HKD zh;xT(8ki}PhXO;<1~&mE%8!UFL1Vw{>QrN1^1i%qgBgnx67`%o%DNrK7!qYVCvHT4 zbk#NV=rc~GCHR5oK8tRC@B6H)xjb_K>`&zh^+I_nGJ=J;g0`Ba#2^rC=bO^9`&Y1M z^?gY7qM!URT7tK|;Z1QE%D^uAM#cmND7c1?=GAe0?(pXFmiK;;zV+-U&<M`G==<rt z*Zmpb?q!HNS=#st{6DvToZffCUnpDUH1#v$^FAF-E2^enPkhGnFB*~AulBg$k_+jI zpMRP2PHq1*0V>?^3WcY)lI=`Yk$mOLwh<3}cRN`Y58|+48u1mB0d*{tO}wU8!>3ox zzU{oTXbGl$pFVoihnp=b|6(_i1UKi=PY7)T&uMgAp6_tHUKO#n3BCkWxA}9DC;k8g za_Khk+n4+b{qpr!>^E&+g0n6>_fU2pq7NPx0A-^*`nWD>yxj3c%^#lk{AbY;Oe^U= z^NBmbSGm`i=Tz}EiL`l?B6SN>T)5n+&-BXfFJALMM(niB-0!ouVV8eUqS?JR+Ypt9 zjh!~hwZb{DLc#|DMA`mRKju{Q%Ua*E4@{!q2UMh_ovw=zhM8~;<qmV9*YxJxU7R_t z@OD`6b=I~g$OR991#Q#vr`bI;{o2hJ4-Vtkj=;e}vCR6m^G$lBTSD(de^iI<*RgeF z7fX@_xKc*>>4ajQwMS0#56-n>uqPi0nKFCWmUq7TY<|rXSBB%ikTEgtX-1tigKrIu zW<K{D<O{86eRUOb2*Tow1pMBVgYHoq#~S5GjT28Cb*s&VP6<9(Q7pZ!4(KPhrNt{> zY2+6KPzuGoh1u<uYcgHj@T0M8)E4HVG8gv_gd&HIFfaIB#Bo&l0f=krVy__v@v^lk z8LmKW7Vpt1>iqQWD`*58^k+2PQe0POmgPVT{nx3jeXnp-pLHvo;O!=L&!BQS`Rdx) zqx0#?YpDh}z&(tVIQoHM#dSdS=)icRLzYwx2?Rrf*QDksW`+`)HrrX|-EZXV1_MH2 z(0%BWh33wWtYGE*l0AI0YZm9k`gaVsAn03s;8Pgo!FfdokvVqf?rdSKD?tO2#0?`+ z<Q}o2T}PD5R+nYWWgiawP#X~@i(KI>kTbM~xHvoS{q=(+1NI5rcbyxn<g>`b98>({ z)G)t8pU2UIYir+n9*qTIrWm|ZJH#m@pq5egjEQ%}5xX2TZ<|YtGCyg=1k23b=d-&R zZSwuoYu`aH_{F>ExUV{nMliibIIY6E`MvL_PQW}T_&(oxoD<1iD)Ph#CeCewG@xeO zHUv~m@pxdb@~OYj!j%@=XkLBwfCr5?Z=XQ-zhca6nylmOYOv0Z-&1Cv^E^bc&ud=& zy2S$4elz!z9!!68+g~;G5v%)(U6Y#5IZ;S17T|y1_Az?>OMjcZH51h8z_yLxTyO`6 ztk)lU+9~@R;t@=nMo;_l+}2iwbgQrgOq>aRkuy`G;AnAm#jyg%fd-!N&}A+z4`V3F zI<#q85u7N|Q!oBOT7&uZLE7u07wdorfibwlrM0;?u)9mJzbbZGTTqNG2|))gD*>CI zxsShI%E6jE-cCim-@4=_^!!)<(kiv*UiLHecV|6|mL3=&z_hm$JRE^#39ZA4`;~@c z`17l;wfUb5n(Q>DTnmja2hv2_#RT(_;^VD1{pG$mHNQ$(!&46J@(q{03cJlCgPSB~ z;0YYV-bOdbHLq%FSi3Wga_B1sHkUizASZR?cD+N!1zzZ6->2hU8!FF5A03PAdh<Fk zS3LJ@IYOwrnEwa*Okuk1I>)#fbDJWwXFp&4Kt*t-JB^L4sNM=nhSe%zPTwT5+qK-a z$r0?IiMo4h5f~)x5k#9Z(aT<bR&blfdN992$ejFZ^H;l;7wDXLo)+(0?4H0G3dAMF z6G?WY=lxvH2*y6J(lbf@-RD9xmR=pHW30pE-!VUFx*<}~WGfiS(3G8#Oi$wnb8ISl zjWDNz;#Er#^CE<`aFWOn6@G*V{iFqPuDaqW&h7jB-v>z;5KI<0j)UZvye~+Taf*eC z$)}vp2Pwb`sEOYLp{RV-cOvRkS2i4n{xZU~rT3n7>S2xhZ6GVyjt#5!Lu1BklJsFa zC6%Qt5nk$SNHBm$2N;(3DzRRldaqJm=-E3KdCq;M1wsr&6h9LS^H7B_*|zJL6j)o@ z$cyul!)-l!2yjH?dkaWRL_k2CabdC$Zs6PZ_G#0^M59ggMq=|b+;QKZ?OW*6T6J&& zWAgE3>!^e-9p+3e+iogFdJB~&^RRg3jM8wBk|!rS`Op~V+WzH0CbO7zubQJtPk!PB zm(Xv${xzXUGoH`Pzfm)u2yK4)vO_(kl%RRg$vWW}xMalKNnqBqfl!>T)DR6q8AG3T zc=4|Pa~Hkk%4=v1e)y-JN0NwC?hIEs>T84jzHwP$DviZ<>UY@eLKBG?u+@&6JUQJY zfo*^HGnV(hdi#}crhmBO(*vsp2t(5O4x=CS^gM-U8Qt>Un-^aroZyU6fy-1>I=T2E z*y9kKUwc)f!$an*W_cfkCQ9Mu7ym-Pzg2<@UwpA~7XEFb)MNF}(Qc*Y-+VsZ1IWoe zfnOv`@aOYFp5RJ<gJ!IaBHes``n9}oJMU~-gEznYwaQ`dI|PGAK0o(b1$+|ZMnxf6 z<^r#PfHpw(CsIxv*f;s=Ht94$=r3=0_x^RlHJDau{l`mRNM96?l%urym_+dS^Um47 zwm5=m^Y(XI0Sk-bFo!wG(xL*oaVcU1+(fw5&;P#l)ysQf&6~ORbBL=EP0vGar7mcL zjseX42^>i`zvDjS@(^D!tt{;z?n!~ek0r?7$AQwD_r3Dsvp!IQJuC2+;>2C!9FEwg zXFeJ21>H1*KN)e259WltAnsNrKuU7=a7|aN?%FS1N84<Fjd{-evP%tDLhGujkb+oy zWCY_p19M7Od`^YDpo9#l9_lcsy)pL{#QE|;JH~q(EBq72I_G7cuYu3j0`txv!0Eq5 zNyorF96RrXS(CT4d&@L;I5Y7m%}eB%&{xj!O~;bC(-b0SKOq4yeBItkFjwlExSdD8 z<U!L>vVc7^cg4^Oq~i#C2+^?Le4RnWC1SQ=xvv(WrtzQS(1IF>t7skvW2I00oVx${ zN)Zz+*Q-Z2^Xakm0Qr*C6orWAa=YzNwdSIYtXyLnPyI6WJgz*(F9sl&WXGInsaxn( zbQLehb6ulhq8B@x<CT=yX7O{vZ8|>p!~c3D@!PTL%c#VW`OLmi$LPU8Jy7_ljlHAj z<K*OOU1T8qbhFvHBG#pzWU@7Wt4~Ku)(PiE6EPz68-a5w=4u?4WW!kjK71^a8#1K; zJ)gwXU=0NR)uUQONl~GJ;7w`<Z8OlcjFs(QAAcj#8i0;;9-a!X4>$^XD$<|$>Hl>2 zcL{yxlg^~y|KqEzh?V0@4HZ#IlPZMCmOTtf90|-wKR1QNqMvE_6)y%n8*g|zSI^1Z zg+1^!#rv~s-$83It-$*C&wZA0tbF^t`dIYLtUv!>8aqdySo9E8u=b(>oW;AgJ}XFg z9qxa^16Mb1f7_LBB3)V@w5m{vQPI-pnY%vFAjFfaU-f!gf`9j%@89o-6_QRAB|9Iu zQYFfK3B>(jp+~+t6<20OtJBk;`Q)9eH_P8}(l^nQFFL=ycA_?vvb=(29(v*&&{kk* zD@@%=6381ZMz-_joB1Fnq(eGr+p=E~^PCMum8nScPoMk;n^_%b*gLNu3a!t3?!zua z3%bgBQ+R3ZKqofI+}PscT=e63UQ%D77!@a&Hgum>W39ndEZnl!SWu&CY<iQ`ZenmB zqsOfjBX6Hp9!_0%j$geeJ|78cM1Edf4x`Z6ugwp~IO!wP2X0vYHNtr__kQJ=wDB4t zS3keLQ2``<VvNAm*#oPg+Pg!%6{2qCwUDnw;+iW#>?!}(!WHh{W4N>!auC_lxg8b5 zoiUI}c3}dmN<$2UJ*mW39)~?2CD{n@rmy^I9^o+zZBsxt=xbaKOl)*qHuLpeTiFGu z2}EWmyf{Vs<tfq@Ub^Zs=$W9pcpf4Iai7UnEJ<sFb1teUp37L_PC}FJmXO;-_?X-X zTz`5y=yly4Y;5iF^zla>3CD#sMQqVI*!?xfR(N8EH;2Rn?DP2@^?1r6wiYvSE+dIH z=Zsy#<(^W*Lls2(m#()^RXh$&692|@7ymVPNqCYi@5RcIhJ=%Bu@yo|7?bH7=lp`Z zV}^M@K)#kiR=#fqNq>}%u^km{N9~t;ezCY;qNm3md(lzq=ZK>k=V<i)MdESRj!@CW zf)hoC7nlgaM}VJUrL;tIB$>O@L<g*agh~MgeGiO_GtaTxHcljQgmX*7^D)_oveIOv z^JY3kM)p0hcEv_*+?-E*y3vQ1qrp<I<fU^&q}u;P*5{LDv133@+vjUT`yiy>7x#{$ zlit2rcjZ(t5ZIgn59GSo1v)Uw#%>2w;p!(|@O=Az;zLh9EMi@=FJg^NnY#-(j__!S zaE=82&EG717$*FjkJAlvJ3g?)HI#-z@t|9YwMBu!o~He+bdRegc)>5dh#q|MiH?FQ zUGjh9Q#@>mGIVcW2J6;dhRWCWx=_EhKjlt1+y6x45s!TgEy10i_*8p+kW)_%ZdGaQ zzcZc{OBD%{$J_@o>k89rRti{C@#^0`_K~r76s7raf3-xYFq{E!Q*#cdjP-PL6!ncm z<LS~LUw$S1;~k%-CAi@E7qyitFbE8uL*LBlDAL~)au3ohabG|SMKKhk1XUx=8G6g; znQ_gY{p>}D#jB;&Ittgn<{DtbGbB^LY-SorW+kJ|(an7GOedUo<h|aZP_~e<&-y_Z zjx&P~*W=t5?)n`4)+N78Tj1+X`bIhu@Y*$x<<nkfYn!*f{qn2bt%Q6OlnQO2n~U&a z0*N-di{B6b``@>He0?+bY5zJvEP<g&KOROKT!Q!j#5F;EmUIJ5{UxqOLwitL?l++p z&;1xy;7}}x>X=dVcAdfZ$-GJ@JX{58iq2o*GxTJ|-vw8pzmTW;v44dw$O`&!bO1^p zi!^#6ZdV|ne?9KVv@uU^ojMHEJD&HXs?;H*!Hu_Fd{uAX4=W>DAkI3`;@pm$fAb0Z zIoX+5#1L2UjZ<xwqsuls%~s$tiIFdU0~85qY!kkPoF;y5wKBCP^rTWb4w(C>8yH(F z?CFZ?yC3YKl8EX}7q_VKDY6(!a2~4FVOrqrImcJ;iBg&t(I6o)<>;BP*heK;N-=#( z(jTE<QYsVUEhEY|i<Zk5f&?FUFyzig0!(cJoB~OIT;SSDe;ZXfa?fJ}De2?C6Kox4 zFR`x2Nb4D{!3u=t(ZSg-6s=^Lr@D#IT2d!;gn57h4UwvCDr^i?DbNurb>6xU+0NX$ z1!gVIy{b<g171<*C0$EGuN9nuy;jJ5;l|mP=4Vh=(&PZ^zonj!dXB0>kyOoqao=px zu7S{O6%ULBOBh?hp0*_J{CfPZ4zzoENh7*Ez&vPX0j+nmhC|?MOUy7glceT)fO<6- zuP&hsCqDF~P{is%0#d)Ra^f~k42cj-BYq-Y4W=dC+@T3!2Z^Ppo7zE03typ_Alw_^ z;BH=*!oTuYUrt-#6~Ff?dcg6=XJ!d+1^nMUBnf=a?GD-}2H@n&l74>QbAOP&<)J5% z-hkM?C)ywtx-%~q{nYa2?QeM1YeONzd=S_wikBg7cqT$r&2&hZLYw)-=RSKEefY+k zX$j7~=m)G1KE)2ohrY(>Z1Wtrzgv}@&bnU<H~aMI6~bSC-Y?J+-0Qe|(~rIE=iJ|@ z187s3ZA?nn&i=1RzLy(=K$v9k$KnsrY`>0xQ|$gz@x=M4XhnuJZvVTBpGl8A^9)*p zcU^rQee9+W6GlaQRcB6KBCVj4ZGfAEl9J<6vC!cOZL1bWh?u(!fGBtYS-=vnO&i>A zd6n?Uu#i{cD<zXC&VAl9X$k)Jw!fyozy0GR;f|dsyqZT6<SP<wIMi9eH^npq<_mnq z`>y{BT7rk3{s_9)SKY_^HiVr@bkNVo5(xZ@y@Ot-oI#6499eT5qMP66YfvEBPuf)W z*pbJZSRB$hMgQ&(Mcw{6jiw_jgU^{+{0OJR16YPe66K^Q1vcCgsI){qp<u$(p>4z- z>>E3H?n3r0#%G@|WkKTVvo;=L4*G3BWOTskmjT;+OZEgQ?&w$D53ucjMYbmy`<R1! z6o_Mfk(-=#MOF~QuFX4T;J~4GsM^Igh5EMe$G{&2_wE_iNb@2^^sJm3b0lgp*Y1f* zLtk(JQeWZFjZNe@etb5pg<>l*(P&)GQM}Gn*`p|VTfjhZND|Cr?uWUKI>3gAc{%2z z-R((eS4%jEdIa3_RUx)H(+0Y1kqB!WDnodi8UGL}PnD0WzLomP!nN(NMD<Gr=x`wY zCn?nID4eZH%+d0=1?P6$op%Mp6E#0!hNV19BRJMMF-Om{OhZLIDf}GRfIk~@Yb@q5 ztl>I8==5=(WwqCqS@x%9LVZ&1my9mnSaRhV31dIH^56+=vq)NpvBe_cbQPY2dEN@` zLK4<Kce7L4tow;(w7-H7f+dRN1vC`@kVZs-I%i6UMx_L>aZbRczh;sRBI7`Ng6F-U zE?y~E5$j(cSB|GNBy!?tLivUxs%K6x^7k>!;zIq8M(um>C7RY;!hD8cX9WRI;%>h2 zeVg{edccE@r`NvqN_xNv#{<=RrC;<DafO-lj2pnmd8VAD9>Q~f^2g~v{nCG?SH0!+ zhdewm&_#Eyvdgc5o$}a6@B1ymyRQ3FlTk>Ns$ymPhwa^wD2LM0f-&|5=Br=zI$DB< zo&HGrzfOK|WTbms?8Kscnbu%_I;qEmlNIx&j&mtf^l7!n`)~LQT7v17rISuS1v{Gi z5usq^Rl+#WQyXcxNm_<p!`y3nQB*G=BOKjRw*Sh&i&a=t@#<-Ze_KHJzCxYp<8C!@ z2!30Hg7~`lr1&w;GHn+4ChA#uF%c8^Zv?M@@hc7sS+~$Vg)kzhiiAQ2#hdpDPCR{i z^Y&}6cw>h%K#(iVzN}~>$XjcN4Y06=`!@dB8?Rm6pKjXB-BGGP1>*f7RsO67Sve!1 z+bJTn9IsbrwEyI!S+CAIE9Sg)pCb;GCpZZ9&&~g}xo!^@cUWXX?j^Fd$H}Qdk#Bp7 z3lC%UBv<z;(GJi$9j6!ku$ZNJsM6U<@6QpNv_7iuPPy+Z)UPO?R*%`ZV7y>d_%YLE zwjvkmp~VMrJz(<WQ8&Er#ulqUvlkO6R-v3TR55WQBn=*1i)ZJd#0RFtt{*->W121n zm@jr+ppLI7A0naAefyFKy0BnEW1B)dFWqJTE}5T5gFC+FPl1uw%z?h7fhfrX4$VO~ zK+i<#SWn>EGZTym(`gyB<pPf>L+~K6vHciBu~(UQ$Otmh^<G;+3LF)#W5vIfc7Ls} zCcE3LxMo@pVzI~mSXMe<r6Qb@q>0TPtAjwJT7j`_Yv$HiUZ;k1lOy&E5jcKI7Wu$Q zZ{w{GnrnTRSe(x9U>>>#C9ghVbH6%3LH<S<7eiq{R1Y||*$gfL-wL$1%<v5v14nLw zmFHwBE=9^mTe#x#Y}vkvl!K0J)Cick5FFJjhm%s}oh}E)KNvSxwiH(;?Tc4GJuY4; z?2A}$y@u{H?TIyHCV#TK5y%9&CBt}st6HEu;_wh_7>mHlBq%mD^nTOCSr)2CGAHKN zfjrha5n!4LGG_XfpZx{8>$A(7h)*yTv3}=|uA~PZeqt(v$uyo1Ji>QRgeTYqJ~_3W z;JH8b<NLn}rg_^Ju^x0hG~wvq;6_GQXMXp}-d7)b?+574Pkt&<hJ>Jf#T+EsG>(ZD zBmkK8hD>I@rxjSMo4KF$?M6~M$BC>W?^`{GaYkmlf$Mg}`9eQys?Wdvy#Km-!~A2H z{TzMe^y_G9TO4Bq7pqV<x~Cza=XQJXA{p-a75o>wpX_S~>E^ANn`xh+i(maqn~PV| z-cFxsdtcRK$Tt+|L}{oWC7|<$G5H+l_@A|Xo1S4SDX%h(CV2c@-j9F#l9%jXDZD2z zygAY9M8U^Q7an=$x30bpI{oq{7Fpc4qrL$(_SNkrlbH8Fp`(AmGq;;;@lUUMJ1xQY zT=WdGqLo1YQciD-|Ld^SN`|w(gS;uM6p@r~1-+e_-!-4*4?VqoECjiv;uNF@HErJ- z4Y$~x;e8zu^n?v_E@tcWrDYQFp=VtzBS@T(Ut-TqOf2TJ*zm@xWR6m~fD!ir<2JrI z9}&3yY8h}DC{+Z`x9o(_$EX@(&Jz%ze-7_twfv|(<=-`4O%6mM_h})wO0$Q+!*-SY z@Yr<@i-(-CD}f>olC}5wlL06FsyON$2+Vz0k(7C&zB3o?u)Y(f4g3;5Aj4s*sg7>< zkgiZPxnbjUw%gaTlgEHQ@IQZb9pxOVT)m7&pe@iSnO^v@Zu4u}2K+qUsHu?&Xj2m? z1K)!J)^><)pgxZ#u;rMFzV-ASJ19;jG{1_T3{1FEH7RLO!YjFXRxVCh&=F~nf^!}2 zC1a7EKPelpOFZ}AHb*%%G*1wbaMvwzWd<hxDPD~iJw*e2B}d1mYm)GE`%qOkMd7@p zd6Y$m$5hNSRvP9=3c+-J0QDR~AfV!DY2hgC+Rh`H{;J6=mh2f;S%c%snv}2~<JI6x zt;vEi7(TK&iI+IG0mR*nC^-|T5;{L#pllz7ZEh`IDa<ReuBQ7Ocif;wmcRIDn!(tO zZ_+~<V4J5o@3%p1nDb9Rcm2>XImI=5BHWTTByN!&GYSTzZG}>6clZCfi~h%d+x9Bq zRJ{6~w_Hize$IEz^koW=^-BoBXO(dvd$-({=_h~bKhu9~#VduWcr_KV=GQ^fT-lto zbnozU)8_40y{S<Qvkh@bf)B9Sv@8tmpRGj?e$Mt|X>;_s!<+8wulyrgg8gRht@vui zZsbRCQ;yba0D9f<1%0Aqn_)P$N1WjEhhuufrI*tZe9Z~>r|-V#{OkbiMke6T4=NHb zvnV%?m!T86Z<5N%G=@UF6r@|kk>o?Cy^((D`YZN@jx8{4O8%yoy;ez}=77EM(E2>f z-Xag^69%m|DnLtl;9x69p(7n;#e*@b%?J5B%Yq+K_{^c){_th5p?d^2B&TbuKIRk9 zZq}K{pS!$y`(IprZQE$R`4(xfc`#GRg)~Mog@OT+HR9M;tzLxU!v)1K%j*3%ymN`o zeUWu~mC$Hsl}I2*ns*60RL`dZceWhopwJ11UkYP3-HKZyuxW3MP!f(>D2bLJsJVgF z?7qN9CElPY$&iQRu%z|ZRY+(bK?XoUB3aVcoHYDnZh6pn$@vzt&hW3z8+%;D7^{V% z;0L*5kwURcApRTbSkMixmy_$d`D&dYQS4+n(R?cTzjhDMt-cB)$3wAh(zOvP{cZ_9 zgPmRkJ(pM{>~KhdHG|7&zZV{M)i2_D#7qmrFbksE&LdBV&qfT&9%L?VV;JkVN;Dv% zPWu9n;==#~=`q#)RiE8vLR!KU<ja9F?7N4t*j-edo0bbE_R&DR9Xzl=J~1Plj*q#3 zg=3WBT5dxN$6pGN4d+#L<MayEBa#J7@r=;M@huuwK6J;aK_Mtx#a_w`ylF1k5Y-&_ zp=9&e20drCn55GnA0K|Tt#8mkF`9xSF1|(<3VzHX(osgCCz3N3xCS;!xrk+h11}+N zlwA`XJ5zMpXzY4k`P_7~L#4CJQpu_+cv2Q{3Q_->70llPihRAlX|96pj&fRSU$~Ho zRDMYU{-CKlupBHVr(z`1gcy<7=Xjpur4t@>!jXzs3e(2!k2&MC;);$=NGb=>3KqU> zy}%$8<g1JiZ^ERS+mr|j>Um2*$P*&||55j@!Pj-kT~POtFKP&W!7FO1RUjlNS4|KN zsD%)OAetM&3y=h(f)G+zk|;!CsuUB2cp>B>1;S(|Gf0RtOh{=GnaoT~0w~EKXnDy@ z5(Ph)OrY=sr+v=ZtGj={?q2(x|MR{xA?tnr&)$3OwfeUDw$@&IpVH;t`1TsA6~dec zL+@tt2Y>I^${&5p<5vl9<+gzIyZ^xNlYi?={vG-8f6K=Pr?;bjS0m(D7a&9+n)u+e z=ezygaD3gj{IUCYuXZ$i<u@FQSn=HplN=i;&wRZ7{_BJ5+9~2EhARD4V@y1Ga*t(J z6X)Kj(R<$gEpk?FA9Mc)KJKTCn5z9p0?AgsFPglQy{+uMuW4)iq3r5tf8$rb<>AMp zKmGGRTmHU}|H+4(5ra?QU>p)VKWUEfSCvO4cRW(17))?{vV-tFkL*c51fk+TZy)yl z^<Vbe<O|>WyPx`C`>os-I{y7n|BVD4HElndmPgw;)m>M%0OYAgC)BRjE4T>9HpOT8 zoxL*J&<c27<=tQNcKNPv`jheo$fKO(2wxq)+y8Bhf6hPiPn?4Mwy*!=10LJtAa?(Z zfbM8>qRN<6-JfLkJ@5N&`QN|yFUVQ>%+LSah}mYd{|>w+!=lQ*&?33?*V2R;kXCKG zWNJb1)6(t=Uk8WQ1Uxb$%%5S_ojatZsa{x(Z6^CReIz?k;Lbc1mTBf(TE;l(KPJlz zFLO{8%xCU#S`+dyjwzpv$D9Q<mL$SMz{Q&}hoOLF;7gZ&!lI)9U9p%IGKc)j7qc{d zHcMvtuDVDJ1g5{2o~2xqbKKE_GMmQPhz0=<S8X$>h%pZsC5$LQJ{ymggTU6F-~se% zij`>>5YvR!U82UvB5Nq+D?06M)a$~>I3#U0U#D&yD-@a<b_+kXer|yU2kepD1?UcA zTK|~q(iH#m+Dcu-xZsgU=S~KKA$<iqDtgFL@Qn}_zU*QZ{tj=V8Ps}T|IscJKTLO> zYN59thx=)~czn4qssvNX$Z`AaNx=pXV1K1??Z`AdGv+TVDwq(of(R9Gl3-0_T7WR7 z^D(Wu)%jf+Z38ELme(j=avJE06lpok5mSS7!qIHt%@Fw@*XO?7u$P6=*;c-!Lb#YA zkf<Cz75kjf;^#fEaBCxM2L_)6rNkZmfK=tASZl(;9tkuER?>*pjceJ-{wB8%e%}Y> z{qK3NyiWOZfA)KmzEXHs1K5IjAY&UPS(0v7Pg;@~%_NJNzCv<WXw>=VwZ(C}on2IT z=T$HfdWQl0_A22IeBX!U+48IZ)n6-b|CV>jFaOMcK2TpMvX?FVNr3dk<Iwvb{}X<^ z{QBSe8|0mT>RXQwwx5)r^6@`Se#ck*2jEkBdUGp}KHmP_@BI#W#@O=7XzGQI%})(x zwez?IugASQ-d-bo^fC8;`3pX8@MCA*`WX+$G#l!iDvV<_Qfsx^;HrGxmw%N!D!=A; z{3gaPo)Ax7uD@EPBJ<pKQ>OMfPoh|rL)7QBBH&-s=6>oY{!IB7fBSEcFMapd$UpI^ zzgS*UZm+@pr4Rn!<Glk5CNp*HU0#?`KdA#PsEYJ)7h#WQ@{G<irmjb4#iT}mhQ`OE z++}#*@$?!cT^RXGo7%jp{iIJl-+lELU(xYB@6APA+<mgAVe<{lP+Tw)@f{`B+FOzD z?d<*U{x&%)_m8>XUh7>kJ5)f62Us!W+2Q9G>aIXvEuo0wyMNf{Y3Ykb3G@msm-z&b zVf%k7Kp)z^rVsLOU*V+Pu}99TAgsb0>QUuJAyx;CLsDTPkS{DBtV)Y9&Vti<jm4?t z{z^`s&-t}&6Zf}l^CG_Z=-&;jZbMUmf;+2n6#(r@i!hO-wPUE*4Ggo;!oH^5a3OD* zbIL|w+zgSUT#^PRYW9k<X*GE-3)*F%y|=9%zQL-b-fEk9>896lZ{|*0O#=z0mkW`S za`$tHr3bBR^r!S<wL@)ZgeH5E3NI7!#$%ApgAws<k{W(D`_j2pwo~^|b!^gabQyP| ztQZsUVK_>~c6^*Pzs`E8^qO>K!sCy2vCa8(oplp8XvFNeW*D-CH1;~Pqb&xep^bw+ z0HL)i1Am8FN1DqSs^^Lk4Z8%5lwX7mVt|K>M%I_{_x-Y$RINDcX{YV7g{s8@fI&xX z?ZJ-4M+OoKC?3bhMG=pv?s!xpFw=YAPS1{dtL~vA>aKoh=82GED-)b}cPCweJP2HZ z67-;hThI#}6%L$&$xFv$ttOL@Tuff)7<nSz)ZHBkG(cF=lHVDTO)>e7_q<PDT0Zb< z@#_2Ui#4|XciTz0UTZMEl<w&fBFs1$8l()=775a%D0MSzH=Z~OEpoMqgC({1h!rc= zCcMDor?8`FEn0r~hkjW8l~4JM7cFAlc0zs0SNuov?mzV>UoB+)3-{OcQVOiUtc6B* zZi`X3?_9m}Pko#GtH1T%lxNHR!|bS-#uj?pef8+$?O*-7zCt*w5Tdu%mqrnIe4>S% z_hOVhi@>j4u1Ub3eD{ARXXW-W_xm^8Mq-e59CwvRMd_?t`s4wkwk+n>7Pra!H-6RE z$yvF5(EXqN>`y0^>+q6Fz;+X6a+4VtAmjL5&l{+wt}tub=t}KjZ#^_Ah$d@0Krm z>+hCd{OdmTRsF}vOUiBG#Xm%Tj70VDNYpg8;8@M%>Edz*ofbGG?!?<4Cp}k8=2*oo zs*T)g;Dv~hH`i3VfA8rlf6JH3YZvX(A5h)PFZi@yDre=}-uA9z9&}A#xYOolPm_q< zrgw>lqV9A|f9$KzZSht<<+DFi3TYlLvm)$t_6@aIO^C`})Cv<{EL#0=Aq{oW(~Tp+ zV^9sZ4s<vV4jOWSSTw=dCAq*~L#v?=ntZ6Vx*M!3cvzn>2Yc82mF&!)`I7^<^9g;Y zQ9Z|p%kAa=(YId2zaOPim;(q$jRF4MexxP&OZEsp1b$K3?`rFQP`q*$%*U$=-TUXy z8q%&K#}j<$%7aA6{|922M|G~cg7tPNx75ofP2d6NMeKL?S>@C`b_%W=p}ls{4(o@B zmvB{XY~&5?f!q}2|Kz`n)6v{D$8*97tv0M>@TFH9RunpFcsr`J;6M1#3FTn(xqd!; zE(H4Bc|m?jc%`7Cgq_tmVkzGO_Q%Ozr=_bk-<!@KLqg^4O1#5ajq+?f7$gLyf{U6g zB<@(P`chPaYJVG+tZ^{AUzNRCzpM-n4=18XKQwoKIXMT<R1&#q%XdGSl848;k#-`k zAf2q6BlYddCPOSF%iqbF13(}UX5AMe?*T020?HCkVl)Dr2gWmA6E#dWxy8A?k+VGd z=ToxIt&R%ZKy9qiT7O@FL8nIm3AyGI#)6YX8kD&nDzt^j&<0fDiOcZR4n!NL13eD@ zR^I-Wx4rl^!awqsw-FSr`W3kB{*5PG#B!Pr9wd{%BAW!*wFVO~e^P^sN`d`)&7|!P z<Z_RE0b}{Z`z{$Y3U?Y8cOG2t_{8|NhTEdvzw#?SLw^4s{kr^6`V-~W_IG~8@4BD= z`S1CFeAl<XU%vCz--mzbM_$4F;Qa&XZa=pLrP~6`Px<LT_0_`F$H_1J<bN7|-SGKx zTWI?&|MI_9YST(@<(GZNKX(e__VM-~_}~wetjcBWtv0^$wo4AIQ3w3JpzjgUni;*S z{-(EngZ!E=_&oWT?Kj#)e&y%<YWV|S_Ft5IYVrpnobm6;0)-MSlc=QKMt`Yf{|Gdt z@pWJR)$))2l24Mq^(XxuvMaY&3BTp7@07p%;UCFwl|uYyo>V${CeOS=_;H{3Gv)KX z><hb(%Hag&WN_+Pe&XN#x8Gk4{D~)gJzIY7tHrDLeEqwF5cH@1uSt&syle^#sh-k4 z7SK<R2eRnEiCf3`SniKe<F~a8aOV9ey2})@-=BNmpOHWQHD52k<kdpr%ZW)Je_XP5 zJ1sx=7d`%X`|bNz2+Y9#jb?Zf{@zOrp;q$BuZB|4q?YaMwz&6a-}l|}(?9WN%dXr$ z=KhDi?DsXC)5P9i^?g*n;6M4|=v%Xtso19Vwm{RW8DIM!{pa$3y^2FBJO+3AU;TGg z*oU?H$L=DlzSTN8CEcXDxHi7$__h3^pQE~hKhx^0j)wH`&C_4aT<yS>uW9*<lD7wN z=R0}z{_EbpSeCDPTA?6!VP&ozjO8MQWxi_$K0|#h6#Tm9l@fJ^@>AZOet(V7G{!1k zG1Mf+=OOed07E=3!`!Rq5<{7{TrlLo=OVxtj#1#2<kg^6X>Rmy_wrd%PsmRO3Fyz* zp0bWQ$Xq%FOKfFvQ8NS~`y?b?)3u9;?eH-xZkdQ%Hk2!lEi|ayxsNp(2*0P~Yk`nf zLR|%8m!=HPl_iN0Aze?x!J#PXkx(o^UHOPFU=6OZ@pq<DHeRXhvAv{zrth^2POfkn zcr7mUS7}m#XwWKwA}OHh`i|02Q-!s9F8WlfU8#~ow+L0kIphf~CPZU!N-v|WIv}U( zF%(DH-ZTSR1cGtM4u@Spr@?7;Iam2XvB8<U6AoR`XqR+??ycTF={d6i{LMQYn`Azy z;I3pimVr3vWk$4MYe7ON>_D5mo~F=7{g+d%bRGjzt{Fq3#EBv{tk7Z5$>tc`<k<c6 z0tx-34Ilcx?|b$4A^Ax!Sa7-R+Uf~Pr|iC&iK7`T{`4S7W$9oMWoc8EAxXIu=ATt= ztIc&noQVwAS-`(v-IC)AI-R50_y3=-7O_6%)8+Sn!&_gph~?$Bo9g!WS-<|*%15f) z7Oy_{SN!Vx_p7`dNmN?U-}TJL+rRFQ49<41Z#b5;P%A3Dz^z-HY|-5OM#hJK=)>}- z-}9aFkALz%wT1D|f9_|=AAGfdRjHeo&r}{JhbDtxli~-^f9;p)auI3Ca`APWG=I&% z`yb1{{k8w0?8@K#u^%J9=8J!m{AZv4C4oC&A%T1V`KibQR&V9D;PB|Rua9QA{c7HA z=hb(A(|cCUtV8K0^Iq3E^u1E*PKsr_@Zpv?aN_Fvn^XScCm*2!EJ7F$NGi_^<J8~4 zUmjQQ`0}rL>K6hTv<;^jUs0aF;L|?&43d1{eScd1(uaPq>~cWh49{Q|Xw@j;9=ojM z7h`?W&C<NJddru6mHhO#?-#IcuMqx2KksMD|McGP&PrH-AR3?1uUF+4eflq#AFcAP zw|&E_1*{*qpGUTP&t*Li&=rsEh$GAQ@B-r`OBu}-ryECz(3P6b!NuDg513ZPMKece zJ{)Ya;6jq~H(ua1N#g64<&^JVx!RS*YqZS!qTk9WkESajx=8#$k?%5b*AhDr7yg^< z^TFFy*oS5OaKdmd$h<0#mF7Y?N{zgv^2fb{2bY16Rjz+$&$RPbDm<^y+6m$s(t@^C z=O&qdOvQBv#wlRJJX);9`u-r~AhIsl;rQoOl8*WD!Gi!l87tI^&y$%aSmPt@Ywef5 zwLE5!D{(W`!#pu}i4E{74CB~%=w+b^1%~jn5H(FG*5(ZMD+!YHdmUfvBkt}X5ir(a znB^myh_!o&f$OSN66?;iq(Q6n_UpOq?{u`0l}fJ6@aVcjS_gSHF>1{$Ac8|blL>cy z-0D%uCl*1+4$(TdVie>~tx#rf292nV^WAoAcI81stM7}B_z($U+|KVCq?PH(P6o7C z8mn^a2(~cuJd(dbDNy$o9z*n%uW~~tC%7!vDjT8VxOKWBVw4;-^Xe)SJ=|tmxZ)Px zt}(z)-WJWX2m}{d1Z_*pE~3~*QShtoSO~D*j*>B%B&YI@Km7QW2rnP{z7O7CArv`# z;S0uFFahnai~2;b(&bMi(Wf`sU0$kvvLc{@CBf-QFcV<Ys&{!<a3sgj9@>8Yt0&bj zeVy>5RgT50&!WYvTgg{f53&5L2On?0m2dmw|1HVf{p~TXUDHxktt1_+%p2>z|Emz& z$aWSFH*((b)qhCN%I#zB|M1WIIjz3$-b|Vvm7K6>`Y7lMt`+Qt@!f0CH~7D+$?X@= zZXc08EC1xD{Zje3PyAU)Q`7b1f?|oGt;mn5a{FNWZ~G;`?$zSe?W5!Da6{LmE}Iw~ z`-od<_e`<$yD`nk-Mc#IHIDwv#g1N4gYJY^b`mt66t100ymMUrl@I@A`SQ>HZSvAG z#~LA=&wRZ7TfY8XD>cD{fDQq#uBB^RywYgrRY$IKT$8;JY%Vw1-hNo&wy1noe%0+` z?g0gKt<LE5C3^OwS4>J4uJMngPp6rvgr8H~?F2cO&X{ts<>+(uTtIn@{lxRbar6ux zx7lF(FiB2tvF@5tYVLTF0ZX|o!gTR!7?;Y-)L(QUf?;~6$y$6%JbwtmfV`{U40`<< z7e`St$HEs$=#Z~U=%T;Y81z&b_^*IN4pco17TeyLEw0V?(B^IEkNNjOkc_*XMNa6{ zb|)9K)_s)*_dv^#S&tY;dw2!<r<Y5TQOJpE@@tt%AiSfU@SK<cLmsu@*wANJ!qgS< zLr$}FRpX}06aZsxYgrjP62;OkmpT%oG~QB~l@KfjHp@){4pKz6k&?cFH9D8pDXCJK zlxzj70>K>=hv7%$)#FaJ^Bx-48PwBagV$=1u<gPMgMkjae(MHT!W)_mf#8M{{sXS6 z<W9gpRd}%~pDv7!pbT?9DG{)vs^LiQGn87P&Vahd{O+A)ALAUe9AFI8{ugYCP%v-S zZA>{n5#}wO3$LapqQow|5Wp-BT-ynHo$l=M+;(ul7m`QT6ifr(95(7S(=pjU>K~Gl zbZTiify*RD3vJnUEpDNA4xV!S#pGcyaWHr!RnWqSbe(<wx4&PWE#LgkcME$#Aa<~q zxI>8**!ogx)NAjJuU6<8QFZ0o%h*ZR&qRZr#kj5(7iCzGNK=FlwN&437BGL{gU9QH z&;B~$N27e#w||Fx<}du^uNJYszstsxk+mTGxeq?xe%pQZ;UE6t)zy;~OpNB_k<N^3 zT}idI&nu1#!cOo;`}O#k`;RQzcI99CEuTl%sjVuTY0zmYDj}Hhr))symu2YIKUNz% z%J2Ejzw_b5`QP}Dzv#XLgnM%47cQr}=pQrX-Cy(d@`b<n*UA6$!5@^+J8^wf@Y$&^ znGNI>zREg{$ur}h33}?0FI28nywGJYf<DuOydmAw;?)oc%F(H<G3WpM!2c?L;ER8c zyrk&x1ibS3(?0QM%2~O6y!~6>_O1o*pwI+d3&hRk$mM!XL$on0ExRhj+<$q>(Eh6> zCKvwSH$3<*U4G0xwLllHSd_c1PP|+JKI&z35eE5@N$PdWU5pofa2^BI*Yd>g_L`o; zqR@g){qErybJW|xe}KjCwKq$GWfpl@)$-km%Q?eEaiH`5p@d6mx4t`d1XZ&CI}Tg0 z6#11F4)5x5mCzRxco^q=`vBmI0?6Lwko3#qFKs1KYrA+AEdt~BMLD*wo#?8_$~L5M z&-tF7btESayOpX-Q}_UVg=+=3C4T|KpwGIesO+WK;7bW-X&WdO%!IvuoWYD9D)Ab( zl6SI>V9}kbP^?E(^3_y9T7<{E!j02q-ySc_dIJMrKnW6_I;|?rP2(F5s(sApoa{zX zfmvUHw`q(jDEbvba3eI_)5Nh1GqkSfR{nIrSkE698(LT9L^crZSv*}5d~Rg8?w^{< z7N<wX&UUq-;E~+telL^g<5Hhe;v|!B8ylRVmExq+J44WVJ$kzfc&5i_aJ0&hlBQK= zXi5tq3VcU<Bk*14Gif&9rLQfq!z56cC=R-PWiZKK^N^(pR)}!GF}Q|+6=WGZU}Txu z@PD5jxwCP0q3Je2AFbAZCi{o0Xs0mviaK1|t%{7Z7CB5bh4yu4kSHC*2l)N(`S$y3 zgwK?3e%Cii%2Xe=uR(&o;kCpW6FrPGFk+9F$`Bzuxvg>(Oym^$+oD4RlWQWLAMJ~j zgojWqySeRl`l8?P1@~Vl{NW!uUr_l-mfHvBf7cg&iG1#-eAfLO7qc_4NYwqDf9xN5 z`0@64zV*MBgs=v3+5LUwrVyoIi^BjKcqlx!GWq#+@Z{_5zwdk()@=vY@trIc^piQo zFo5^Go=1Ex;afoG5+=iKF1bLz{d@amxNrRGx5`<$eJAUm{p?R`{qwR!ZXCWJ1LXtn z|1<I>pZ;&kfAz)x>8r)O9})Ls`KnHLdpV|S5v1CGw4BQ0@kggIJ&n)v=|!6T$Umls zq4%9vwY^^>PSki(+Q?FFi-jLpAIE>HSf{}kp&at3e*UjJ1@Qs@<v~q4j-CrX_<@kV zrmYB?nd^MqNG-|uIY%^QF5>Jv-u<oesC>$2f5xKk@Ux!5&?4Mw@z--HZZ=|OP>l|7 zO&~F>jJr+{zDVEMV(@?-77(ufwwy{#qC25$d_m1U-!L1jO(Fg}LHBy}*`YDww(P%( zjb4X+iwODv`rtg!d@KZ55O+VlE?6i}kgNAC3JSS>DE6WHE)Gk%B|k2M2&4<V<=A-M zQ$C+?|4_b`MH%3~dRMF?F(j!}R_eyEeX)7t>M-9x_}Jz+)tqB#y$3K9K7XOi2Y1sg zf4PHBD`~<Hc#UYMrr`5D=4m&rR&3LPXf?@&QX6)#O=*PJS0a^FkOtpR$;MQ0_xWAb zmYtgwd{v<o;E+EpQPy%Nq%VlMzEu{y=LG>70k+cAhVBE`<MnjUHZULeFzLo-51~NO zL513CrtPh`Hd{?;?IUnWXA=nC(OaGFqcTbIxt@DyHvBh2g#Z*z%##{g*)^f$9CqqF zPis+nSx-HlfIxDw>25B__;@03UX<dowH$|dUKXxIffo7^K+4A=SX$Q?E8xm%HZL|o zXRS^n`3#=Ppp1_oBl>;|&_&;kKo2C{mJ#MozgV{|z{<Au-f}!qbs(`bu-U)lQ;X1B z56Idb5aD<5N)G<OBW3O8OmFkvJO1$br1(~DuMZx-S_lHCq63E1Ob&=$N2hT(T57|R zd5o<J4)_PY3pvi?=^|)FS+Q-RMqgr9&IOWMD>ln;{;RM2TKN}#!6(Zf{ko6-Zmip` ztIzm_zf9ipmA_xu!Yp;Q5d6y?eEaJ5`r&uK2X^h1ger=b`^%RZ-uG2r8}bp^Xzww& zt5Iem3aH-k`~ILjD!=k`K1<yG(%i1(0c@P@aH;-U!Tx({giQ1&#LTZ!t-Fi==BvL> z{^EyzP|nIPeKm2uEo6m{A=K!v<;P4p7OsAyeCenCM){xDVoF_nQkqIAwZUC5z257v zJQw$CTif(9ICA3r5<CvU0)jpC@ix?HIp&?(%3J*2-}0sR?~OfI{QD)j(C-uU+u^5u z!q0s8U9ES%S~NTC^N<nGk=R?HtKs-3f{PiHb4j634*SQFQqF5X``^Cz&&!{E@A)ge zpZH6DVa8~iVoxw6KNiZ3%41&H?JNq&)9>4qqzPPxe9|{5PD};FSNv`C@jM{%<MkCz z|8|sze+8UC<E`0s)!Xvj_gD0MQ6Z>xZt8Bm^f#FwqsCxP!*P(7xlMAjf~7afFzQM! zK${XjNNtYCT0Ga|>Z-%5jn4myds>G~Rq*xB`pP?>5!9gJtk|xinujkW>CoP6i>G@+ z9II@gn71pu4%Z@t6OkUGON2TsxD}tSv4lpoEwm5ZJ!z1+IcHVXuSq?xD?HfSWRuHp zbU-^YN|BZi#tjQ7pWK}W@VY~0!1wd@0wCn;*0}DV5afkJVC~$2G1wO>`-X^mZ7*#9 zrj(c{n2^p_VqiXj4sJVO4+zZ->o{$BjyoHUuO}CFU>Mk5R8WmVor+w=V8PGir6_Em z^I1KtK`9$p3A)10VUGU*AA*>a?`deB7zWTb%En$Jf|J(Rw`VW{X)0<2Mc^@mpyZkt z1_t(&i#CCs3AWdNa8R++K_^;w6?)3z&djDB6Qqzut*<+Hid<Y^`V;{m9g}gr99z;! zJua%>|LyOSN99<&I@+U08L-XXzC_~s)6~1Nb9ug4fRh`1V(3qa7lP>P6RSu71l_V0 z26RhM_!wckn%du9Dg2^;;|t^${fwXgQF*QK_DhDJ^C_PtpZzJn>b?`qWg?Qv5-+se zZ`^<3@X^QHzv_4W9?98&2!3?@R;J|4t1g!^6<vwaZdXzexO|oGpd-b`v0b$v{^1YH zpLy?h$yxc8pZi$>o^Xxl`x3sxWjgvGg|<a0TPv)=XnEZI%RlrZ@)f`Ncgk70ebD{( zDq;9|v;~M0aQP&+AKh|WFuCpixh-7%`>z(RZoiC&UZzhXMO<zkn=%XHU7eH9dHg!z zzQFT!7;Ud(4Z!gKvVvN|{xc(IX+BU|`=gdk7;oja`|rQ_{4bS<6t2ABnENYF9M*1! zPkQk2_W$F1|Cd*Pe?bI&w6F}t@*GYpG2#=$aOXZLE%t!_HZTYey1oCKzE#f3-~Vwx zSw8*~es=gkT%2I|FV}=0jgophEZ1846U=ex0V<0x&s8E81Pn)r5Q>;?JAvxrVB%U^ zIKZT-84%#Fh{f9qhW2mqv3jS5ZC7bfF|R<MbH6H!dzl9*kwuGjSCLpOx+~D-=<j|T z7IO?4z1P(T!V)xU{Nnf;Dgs*k({2^ThAK-BoSrWi{iZUQMBb<c)omARpD-sKU~&Ux ze<M45pzL(UCoxT}%x3aB__yBP9{D_>?yLB=MQgH-#ZuHK8R(Prp+^p;Yy$!_P#l{< zM=G9p-FCH$c_a4I4r8o~AxVD}2jloF1w}2i18Z)&>-vNSmH<ycu)mhm(T3}K{-zh# zRC3%_9Hx-14U6bUse_1U2m^-`gLCfjT(KATm|*P3dR$1`3}lG&R<tyrr&`i!c#?s- zNOa!zT(@c~tF-6<@T6!7Zg)qqR;=;qN+0oJrc3FLZnngCv{xOvDcpcScU))SwQx2@ zJmT6SB{ej@%Ujv)3D~vK8tq7kE&I#E93P>nVV4GGSI<S|Y+@64GLnNHYTolpcfu~O zyG#l&tGM%ZnMe9FiL2`B```24hp)N4<1KG%fH{B(U12a*?SYXOB82Q+$H+9B4n9Fs zctVKVvhUx$T1lvx3Po|$&kG_l9w%37&oFJlc2dEok3_$^_k$n$ko-Hp;S1!S`B^{z zzBB91{LuUD^}s*$mH*|dg{xn6U%a|4Vok4C+@C6k4_E{*en07x|LKQ#zWcrZgB)zp z2&c-rj2x|Cj#iz3hzroR&e}jXbbR_(6UN)&9ba|63+wop`_FClig@Ahuvm!(Lq9#a z*6~hp0LzZP_kDj_zU6K2l(TaCnETKDMV~bIM7K$Op0|%;`9D7JzZ{EJuNJI+)6e@f z`Ga5l759a!TdBLHav`ejMB>SWZZqBKoZ-K$bnki&3m4j+DM~#>@<Z_>r8;^{Nqaja zqy!T&DaGsW`V)Ur{`l9tP0mSN&Nb&F>*T<9`*`~=_|)?StarY`;e3hJxLxCj%<=<! z#OFs6@j=4xP2*FwBlC;2&Hwh54L<rN-LLqZ&kWelJ)rvQuvAxJ<rwwIr)6h=6LTIB zPV?3r$wMpVtI_>}s4PDwt|EPP%X2C1?zHe>3s3jDiywo)629gNh*E?0QOrUCZ0Y2k z*E<jS;Jwj#ahwUs`6pR~K%=t#TAi(&#*UPG;acADUdR4O9gp^31k8o$yMX9sM&<M| zNqH}aG;O@mYA0jY2lqE{IX~k2-sbr3SjJyJ$=z3e!^#<TAT<<7yF$j2{;tsqrlk6k z-^R-bh&4`6)z|IAa8&;r=T1NAo7?RP9B;aG74hf1$7M0VVc}+-lzPRs5dF3059j5_ z?QoqHEA8w-+edA-fbVs#n9opl2G|P(ZY%fJz?$`5EkI15Wy69P9XW7pQ=1XZq#tjj z*h@wTe1R*kJI@3Gj>J+P(O%A}VPy8E@;c!exqlL=4UIir&0lHrQb(>{cg^u{hna2i z+&h@fB8jd3D}kWzkcqTh!gdO_vPhHu%M*J!p*I&=44w;nIGZ7DLFk48-M~3cG-Olh z9T@}N*Fs<}5Q^X{O7;2BRs_)iLbfM-u#@KPfB3EPYd`OECJ6V%t?ziX$W;OR4hY>0 z7PGPfyw(uUyQSg@4~z<?LeWqCqrRPMC7<DmK`NHw&j7_PK%E_m_k)CQ5zay{M3Nq_ zfO<c*<NH|u;TQf+`47JE-;;mv<3CP*?$7^6<>&moPk43y)8y~`dw!BUQ*H}ZfBt(u z@apf+$+y1io8>#}f|a1Tu{_g<0HLprw{Ks4<6Hh~rW<(t3$Jkf;0M3|u9U~mrI)AN zUN*Mti;KJ?acR;T4}P(s0@avk;AGI?+F}2hZ~snt_glZA(*S4xz{mY$`5)i=ox{Dn z`k&tSU9#PL{_6kZHKL?D<Y5922(b6ou?@xbALVtNf9-GoPfmN@`h46c{tWrfKk?t+ zuMU5tl75qSK{|!s`yGFJNQc};{9HO4S^!PXwbb2yMewh@S^)SfKlCH_kA>f^|1!O% zR_)(_JN7OYnZ1y~zYNhwjqfD<qwcoz=)ZsayJc5yv}dWz8q`(+G3MJZDc*3&hKHMc zl4iDShP#8nj*32RJy_gs2m9N<{J)gHX?>i$mVCv~7l^Ep^*4R&-z?wu_3vt=fg8Gi zZ!4*?&Py>TTWmE8v*b7RxA3?rU0tn0f2FHGEMN88zg#~4{>z^_()c4k^kJ-(njGCi z(f|FyACzx?>mM69HNiMPdB;<4f@6rxh@9GImHCJN-|}!P{J3Q2x;ob$G}sVRjzK5? z?GRLXkp@6VL*mnO8CR&)!K~+>?!qvp-xqeY3p7_cV?k&y^K4sXc=J#Eg1YP%Gz$wk zj-DTDlD2I5YDTf`{%eD_Jf(r&xSV0E-52=3R*h1MoNRpuYbE};zLQ?>R5M$dVqA|Y zD+dtRK@US7u|j(!hhYp^UX6F+r%jYNQ2a(Sn8Ir`FAF@fQLoek&Cp;So?#9@lyi^H zFaL(WCHk}@ZI>3Wq2{i@!~RoN9ecp3yeYgoxoE&xFmA4x;73E>Z6=hec)o*bAabsy z`uF}Ve|x*%bW+|xu>s&y{i<Z@J&`cr`>8t&qxF;?<O*%FyEzmc`T!hWuGoF7^RYDF z6uEC<zaI3x3_UnXjM-Vz@hrBNLU^uyI@hL`PxZ!EA}AC+38Hy(f;|~WI0@O&B(&&y z1i;I_(<$Hn%PYEa83X6l>3eL-E8K!@h7*0wqC`m=x^8?-okk%XY^x|l&m-D`i2%Mi z0H;$QDQ!}0yDS2?G>Sjr=YOKS<s082Q+dZ9ew+N(fBiSh&Qg`?_!q&V9r@HbG05-K ztT7cMC{<Jx<?4joXh|X3<HSr$Mge)tzC^O@*Ag^q4;cY&3OV@Nk=y^reC)@(TEzOh z<zs)s$I9Qe7PFk^+d|^)R|Id9q96F+2SXy~TAyQplJvxl7ut%vM0kC#=^pI7noxK5 z&5Mhm1Qj#UKy;Tne}e4r5yH9=a(4b$i3%sxiq<bpDeF|oM)+B*41R3){WrYo^6R6T zd@M5YT3GkkYAT>Z?_K=8B`7PLp1lGxK?yRe56w>Uve)!7PKwCj9lTa#r&l$P61XF! z?Np5HZAw6`P&@HZ>)ig+=gpX<_{N#SDvQbYn6NyJdbCFUD0x27VvcyVi^-Qljx_b5 zYnxk`!<1l^7b%iq{(ez@bbHRBnTFt@7+CH+5eZhbk_Zp~6y=cuG{V&BF>1klcukU5 zcCk}z%>69}vO`L&;KgBXGQmEiuC8zC_-)#yfe;`Gbs6O=msK7Td0srZtTSTQN1_XE z$9RDsvE-Qy#c_y)%qIJchjWrU<I|?{UxjNR_x{6){(Ry7O>_~^>)Xkdd#XdnkAB~X zyVYJLV!Igm7T2-(C1%Q(MEE1_#_D>*S?0!}_skM-76c3XO=<F@s6jT<V+W0Z0s}$& zgMy9&{F(~-5seEnf9TfvnD6C0r=v|A&_<XZjtjfj->bwWv=YyV)^)4SC#s5T!^HHU z^V0xMs7Lx1<I^<%fM&yRQUe+7Ur3L&$<NOw)kTheoD9V_=dV?Ca~{ASN<&&?2Im;^ zk)p`!9|OELfhAhb3r!@XDy|TnbMkVIgw^cLDPtmlkx?J@XW~-#03KNJbBkAl^}I%T zy`CFu#nSA}!(HDd%xBdMdl=1j73HwdlKwgLyu>G(kn`*uuwKJYbW)OR5vKvhH-}RL zMe9G5QMGg+z$#FE0&W?g=3`Lbt;sf;Us8z2#8+tSV+Vv0@=8o&!zbzWS?t7J;2kuD z5(dfF2yY7~wY>k^-z%A<C4^hug`lE_x_`jiCVG-!c>60nC@9`J3+m(G7jU;vs4eJp z{RULh>CR|%x+oin^mr0Dra<g<8L<yJ2y&fgzO(99zVq8@xrAh&*IY|7aNWEopCK6f z{)LCPwmV9SNs*?fP34okVZlX(!m7(H?d-Vb?{ich7J>C%HPfb6cF+6c7n4RKJ-3W# z5j+%F)@9UBtJLypWA4IQ&#kN8Mt|3F6~P73%8D#KRe&*A5Bnbo)LJHZ+GZDNWWKWw zx|jCTxyY2O@xz_|%HVEc%HUs6$Dtf|YEDx}Nqayj=jr>VVq;xW$x<;IOAY$YN~LKS zBf&U_lVBc^Euzp1lYL2;w4iaTrx}Zok62+snxsf4CVwv!1`HQCjP-!W%IF+SBmqmw zdy1-e&fUWuhIVxVJTPzzpbhCkT4v{UEL6Z4x=e#O2|ILc!o@?2`-wlX4}1~BH@RM= zP9VqEp+Kqq`6n*Cpw8dQl@ilLhyErl+G#QN0m?oh$CFR2wzq4u|7wR-Hn?z=mSqhG zFp~8KACHGt`CvE4^$@`tMHe4U<}H7$#)M;r2~d~1cW<hm=CBdnzcF@YnYaA-D(vHl z<D+%`@PGAksL{;7t4LlnmlGkO&?SS*(2l*r@;qpo>-a)(w@0HZE`{bL^g9j56FrGf zUTDT$wF=$Gjem@&Q&9U@Yhln%)E6~nBNU;9%p_5ZKghO<h*m$eGhEF}J=eCl-pDzG z#*ONI5vg-Qw8RrO3B>LAl9x4~09n9uwA%F5yibMz=Y}wkqamh+$|R3lDNsi_DX2`K zYVjn()}0OSPn6g1xr63Tx4J3_Hn*bX=<Pt<0S){34eaN}Ehj_V3VJN0lZR(lPTN>@ zkO?(>-XkO-E*xJgTGyHjyD^dRn?leMAsRu-@zRpVO;0-V!oACt+W4353Yl<iMAgt> zZvL>O)8nn?0H7p0FVp`jPnL(S)2gzEt}bN=Zx4%ixDpj~3XFj^<E=^ZEg{B`RF7QX z6}_=RR=$1nYlMH|o$p?d`eI!jU6u1)Iq|&)M$Htvh#*-gBFW&1i%2+TRu{{ZeUl2S zqZYq(Sy^2$S}BltTv~6z9DWmp(?)v(4&AteptqkS41E`t<4vB$or6G7p{4`8Xor5l zyXiQA!>-{jp!+fLN<LY92%q`t4@y@5ozuWEZez$WYqUiWG07{gCG<rH-{O3VO%P{1 zL^ReE4}%jtk<n-F5_G?5#n+z<W5V?0J}Wxk7*x{z!T4w7Gaj4)29oZ6cYc7U@ZYYm zxubGaALAdp<u=@k<9GdgMxIltOV&7fE+#9TyL!$3@Hh_bTP{&9Nc}9~=}ZO6@%SaT zb;l&_RvBdaUIVnsG#ZQ*sEy}{XyZQJ6O&P2Y?Rl)dnEm{osl>R*T4tJG8eDBlI<R~ zsq6Gn>&uz83#dRGx0{;l2!kv{`QaS~xeychbppLui%nwQcRAKvZ-l-VkcB0U90%eb z$scvW1*Mtg{?JMJwK|8h$hqReoCuxQd0LLCkqEet$YjvE{_({rXWJJ!6mrT$8H7u! znvsw9?_1g6nA~hQb5I}9A~S29CpmlZT(x5i(wfcX2gOBTrLHV&pbo%5B9=|6ME%i^ zNVng6?qo=-6-&W?2R^k>6}&<25{oj@+E1SAtVZGAtl{|r(tp>fs!u8niqlLB)XRoF zM^Y)~&n6(wZ%Wu2LPZ)d{1QP1u+gci$VR{Gc_nS=)*jC9%XZdk<*4B>a}+Es5dJb@ z&%U<W8yPw^;g#RwT$*N`U2i$61DM;Iot@VyR{lf==kS`46E4ylx2G;7dWb!J+~QoR zlN;BwG*&`vbAHzQwB0me(!3>;z6e}v#q&s6*vYr^vM|I?^BVC&MlMXZf2ty!_%tp8 zhGCKm5nz6W?2N`T-7NI!21aXX#U&dslQxuEgvZCl23l2kc=HB?LY&y+jBSzWPg^j- zHja#eKc;tUd~os)Ac?-Dzw<+{%ALseo8Q&H^>W*p_2Kxy`=i&@66bN`qDA*2-k>WO z;9yO_av)%r`AUG%(UG8^rEKU127f{Q0<h81(bG=7{j6TV+AZX0{9BT%_21~@%oAv7 ziI;)0AV;&ekZ2b#%3%`9S!?zVzh<oCx6_LfTsy(*M7y{m!ExLo(pUNv{$<KyLLY!E zfbT+uOKW;^&Sbj84X&NUJ{D9D_S>;ne!%{*rCEz$eS!os10dyrBlq0Qx+zhVLVkc} zAJ`X#k$#3Bw29yxgbZCHFtP@p72D`{omlSt2+NXpJy$=Pa5Qwt^B)oLH|r|l@vb|S zZvPW)39GkpI3_3R){18T2>%au+0cdccs@;>1?>!>K+LNSfDvVyvD(!K60S_fv)Giq z`)kRu!=i1mb+2#1hceGc>XSGa1k0*T)FRe!eeTz}Lao95f^*Sc7m^I{Vs2<t@}S6R z;(V-A7Jk5p=QaA4&{_fa?leYDB>5mDzDsn2bG?$D@Zve(zYaET>0_^GFg`!L;=<}$ zXm!v__pTv7k2^~GUl*I53jChy0WbMhVbzb}3fZyl<RX>^U8V|r7Fk0QeaEG#XB^?8 zS$Zz(p7PGJFP^z<%;6(UE0A-*?UAQJW76(s+z+8GP#_U!+a~BEN?Pmy(@5}#PWm@! z-Tzm2NL{2C9|N@iWUKFv^(NJa?Y)(ZaSN}uFsya#_uv?D1mm?z_p8`9n`H>_TdI`G zxH{966FbyFbtg@EdM{Uy`L((bAhniDZ&|3o8E_N&qP_$=Y+JY81$1<ll1|~?C!C42 zg)8i9wjpT}s=>8@0<m9*QUZ_^9v_s6w3n5AkGh*B&8qe-Fo1tqhVQM8AsgIS4Yu++ z{IJ#4DV06w^%O3!Dns29BEJK_l@+)$7d+!qAJ*`-tpGRalg_;gTD1Mpf0N>!^Wx5n zdn0rP6QPC|vJF1K%2eF|Grh|A%!6)1cr<xs=zR>j`MU$aj(L68jSD&zI37r(eose` zhXoJU!R}R;r03x4I6mTyl8eI`ijjjmAWgqUh`&B)@NX@wZCdUXU5sS4s2Aa>rTQDq zKg&ej6HVNn?Xo|fvR(##une@fepfI657;pg^Dah5T*SsXTl#u{x#+<J#*;$K-dsn} z95ZEfo-QCh<)gBm@-GL8&{J@Og)pF9C;}9P3|>Ueetvl{>jnBMJHxMM{nZB}k@CE_ z=%1$us@;Fmc>**%H*TUJ*RaJ)$;5QRk>g`hs8n7K@sZ9+?yX5KnAW)IdPlC_MO(*g z>0a<7sMaZ0|K=yHS;$;;c!KNgbx@n6d?%~cxMB<#XcH(el%$mNY2<O3(cXL^;ecMf zVEP@W%F39d|Fr@`N#BGhsl2347F!F<LR>Qjqy-9w1?f6j%P!jJ(tG?ccKRA+B#XS9 zsB6okc;O`}!`)1-p8>F*!7rlp#REIJf^!oQh%KSeS~`M~^TL0Z7k*5*E{0b7$H|vU z>Os(3z$<WI%g<O<2}2!ATosrVn9&Pm9*t_OV4^V3bYF3eg`>p}%Fj4n(c%>utKDas z{*W&7fOM0bs%q2gHuiw)qOc1R^EtBT^%~%Ez^>P^aCKd={vvI$DpDAdrv?MAMQF`h zc}ZuL)zKd0<Ok(NR9_TBHCF7iV$+ot9<euj8H|nE?zskooVDKV*BO?IHU`})GWx|v zRtmh>PRwfx7?hO^w4Ie0Z)oTXoRTg>XwZTTw#hT@9&n!Y2-B>nLx@g`z3NeEP8`8l zZQM4>P_X@pWL{-8jdrzSf~8jCeM=+Sw8@7TdY_i<TXMNTG%7f|;?6`GB{$^5mUV<P zhk>^l?Tn&w0|U4%t_3P>u((-s69C}lWisxUL%0<cA$p)FyCv?|!MV=Hc$jd&6cPUL zqKHs{7aG6UDb+_j1L|3WcPAP8hvRMq(5b#vnNCejYU|2VO@OVfwCdPv##hdxt4V!Q zkgPBI?=o;FY@`d>$0A%=<8ugj*6GsLFR!#R;|YTaEuhwBXQk8HN9^9_Okq{Bm(zhi zFK7v8QU~H6gS+vF8X}OrD^hguD$*w=DZKg`;di{}eHEId|6p2tvS(uBxW&_R>pPYn z+bnYzPnyy3?*Mu5wbV$Q2zi7J=&=}4j@aH8x^BnIk}bHmKr46)wMm7(O>qYSPvMuW zY}w*<^|@Wcv*JNp;Yf0}n8XE5#@bD(A*yR68b!F~-xxE}O(a2EFZd42J)>9Brl~z} zK(Iynm@6R%Sxak5cPjSryIk&HK$hw^jG^9P8ub?P&sLW?DqY_C5`F>`zHGSH`{3aM zwo_N6wE7#g3lw#5%4O8;gnhqb!uh44e0v-iI4QSqT=_L)1^={zCW0D~=SWeG)U+Tb zgjWYG@?yePS*D)^GjZ{&ty~adtw*TV?x0^jY~0A`$@a*txV{2Snw=;f;vz&XZa-FR zOoia~oi<B4u9M+gh?{7SJYcS2wJr3X&Y9-p!kkW42JTA_AOK~Eh-U+5w9u|)k?sQ( z>S*#^e3{2MkA*U8kqq@af9#me|Iu8$!R8odZuhU(Yqx)lRcXTMcl@CgwF`%w2i2{O z8J@uWLt~ICf4qBxn37!Bx`cijwcsQtzwzU{KrVGb%YV6g(Sy3?u&-c;)LD>GiSL_X zfngBGprF^fzV~@_)p+=!IHvB%t$J9a<4(6i4#(*_V7!#U32D7C;N=?K+@4;6qzhl9 zlk-xs_Vz;zf?=DcZAx%+(dC(vJP(vKU3U!Hn*$Ll0@DU}ti|UVoNsawNc+V%TTDB- zb-F-XC*QXIv@?JYsFmQ_XyrQ8-O9yG1h<=FLPwMJ$p%emeu9%*JBc_}t#m45f9n<= zce*3+fsW+ez~KzXXUVDc`1kr{aw_SBo$fhVdH@x4iLR?RLM>kP=@jM3QpdsMnc<$G zY-LIbm`}`#WUBrQ){r=`fy&O|cE`m9(h>1-!~P@uHc6OuGAL|`<8c=rxb)WxAsI*v z6?*4|gHx42m7k2<vOY0cek+}s0dCn+snU754(*!*21gaLBnS2kjN@>Dg^hA6`wpCp zI(;9a>kzn6CsN{n0$wA$?a2Dj_kD1SrK>$oz<SA7E47k1@>0i+bi|W#Pi*C|S$sv# z13LOP{^d(RuI#@f9-vUcChkBW;S2mhpT{bT<fPhXo3NFI1-JDZ%@?4pz65mLc#QZk zyVS9c7D*3HK6ruAw|X1TM8tPlsO~>^Iq4(mu2$bSe=}o@quLS0!;&)Du`w~7G|vNj z15FqG8-&@l>4^-nSG%WSITV{J>MGSos1)}N#8~$X@l@5SR!X6iCmbyn?i^|<hBRu& zA{!k}+NY88#d0kn`Dow0M(UnX-)W5I2rI2l<EmPxw?nnCV*d(UU_HWqSV*YYR|9{x zlcvKM%HuvccL=D2QstS+UUo`&G>Khf9KPF=4Jr7<n1!PAM?0fM8U+a_W7<d(AgA)# zbhe7yB>WERj6tli_Why0te)|6r*ol8^`VNa1r%c)yS2Mo_e1s7CF--mE(8G@9{}^9 zy}4$SR|_|n?hmJOtG)v5mZM1bGT6GL0jV@U8H5?Ux+<_ZDMP%`PMiB3!-pL>EVsPt zieoF`Z||r00d$m`L7is~5zkgbFa+EX5_2Mx$aM}n^>~O1;~wAqT8mWIs|BU*4`OGQ zAYZwww9gx>USTnAB5wZqz)m7$S+Q+{Bl4R(9LEG>fXi|0a_;D%!!4k7s-NpXSCM9H zO^Y(A%Brcu)tux6_heJ_$p}fc(Yn}V`IkA<?H}ApTgO?8!Nd4gr3svv&!~uO<m&wm zi~$GK3AD<6ji%bP(<+JyzxXSJDqYb)b{-t80@BiVa3FL($nj-m1v+w;X`EIRFrVfN z)jwN6U)r_F>#$&(^IL&!u!4N;hHfCVRzp|w3jB*Y0As-48M)h1>3`gPlJCBwNlwZR zeA~7g`hCGGE6+^iG3$p~*D)(0qb)|Pa}$w9iv+|<Mf|I5m*J>9X*iJ5aYx%@?o4Dz zDzoO~+Z9%P#Uck^O`DzsPb%${Tt|EF0AdGF9emWA5}>5gU^dcsH6z+>tF-eu(QX1` zCDIp=mHPg<Kl?rL8sRs;^WD-Dl)^(fw<2Al5OG`H-T4CdSy@yX&nsy~Ao#?|e=b`| zPj4qTy}AMu8E9g1)-ujP4qzkqU+r<bF{B0cdo3&-XGCuRME(Rwv~0r(&eR`bSzyZr zqCQEs;5UDfPzdgQp(?t0c<=N|p+=E^lVa}v3K;gNW|Q=T7?W(zrR0$1@$D4XE%KB} z;S#7dJSHh$C)N-|1h77NW>EE;DFn+9L!BhB52~r~NU{M9Rv+!uq>o8r+)S#`SNO}= z7&T==Mp)U;#9$17f+oaECzh~)B8Y^3tLPwC9`T)TvjVqrHF-E!>7B0x>j%2}lj4ed zTWGa%6aU3XJ>pf0<)2U$ygpUFa-2IxZ@1%9csH2KR|YP!?=A#Rtt@=4FX#s`no@~; z%=J|zV@NoF<9LO*+!y!vwv?eD1(alhvP0vPviq7<<3xfS)T$og=%?SoS%=gb!iy~c zrrVd`tBOE(&?<qm$^o&@dT6|`y>c0|j^juhVSywbs5vtLKPCx_1Ni2ms&-mDMjs6l zC%O}5x{rf`toUB$9s77;W748Df4o2VS??^x2wx;$CDg%>>9QZZi4T`Bria>Vj6r;V zD}Kf<&u_mz?2DXIZFJer@y#d5OFa*8AHF^)<~fV|GnYc@Vu=;Pwi0y)aWaJq<gw=@ zIW3^EJJ0LURHvM+Rvn20%UjM$zdO4-J#U0#VZskRH+c5=tR3AnwDmz=rJ-5gUh<bY zXE7e*WZ9{@3QPP~;0yg5#!Ng<LePOK6QX!u3x}NVlB&yd<x&}Gy_<89>OK1yVxLEC zWv>EhY*s+eswhMIGc4x@@Me}t6BX`a@Uz~nUc<3E*<7E3MlIQS^UJho^;|zbwgN+4 zU#DR{r8|6?^k-wi16><+ZSbze1ZjkE6@5%%nQ*2y!vQ*u2nv$JdheGra`&?9=8ltR zinVi`v?WEo9qOewasBM;0Vxwd+gbUA?xtgH4Jqg?q%f1tg_5Kf`(juwoZZWHYg0^H z;DO{$yP_s3QxXVpZi`p`tAn@QSUo}E-ufUM?C%~U5oTwu(^EUdu5oUp_njYw?g@J> z(7dv&`%g|Q*5hUMl`8ZRGB*$yUvi6@bR@lCW0hW>-6x)FJ}E`nD5ZGExe;-~_mzLn zJ>-!NAp0zS`((s`2Hw4rbmaY{0RZ8k(0Eq8<`Noc$yLY|deT!?%)Hm&Dg!LEqfC<$ zdRiH5DU5kfl3YLeRYTxYS@hj1O}Za1HsZ2Wq2~#=g~r4;6qRx9olq?wAG_-ydF+es zD$f)YBhtY;0c)>f|893s&t95$2N1qS^)qy%X7u)$nb-*wD}P?6K=Wz5Yh>vOCI#w2 z&uEcfa(xArPb>Tk9_|K-2V7AhGB)F>edLJdI5qaKz@Fko;93hPGVRC%<gIRVjpR7Z zR`}GZ=W)Z3et&qP^Q$x1$F>xqPXjtv0L}UPS~Q_}fH2QBm9@vO`mVw{uoGAH)g}7g zBRVoIqSd1V>a3wGt6ros9&xUzjumIS9$rB}z=u2ua^(<_*In|S=3-+Q2KXIa-$2EO zkam^6F6=6Ny{2pol-wW2EQ4(^iHa^(Ro2(r?~7I*|Br>NCHz}G{M_GxGIz%)tN`BV zzS8TBYdo~?Zeix|%DuEsBm)2|qA`Fy>n?f`XHP3`*T1g1M9Xuf>%Ns5(mfX(%GG;< zS+i~ojEq#+Km{)LRgdxjpsU`}UBy6Q?)*2SuD#k#=OPp4@|vU;{Xp^~|5Tw>{3dzy zUZ_D_CJwZm{|!IkZ~U0wQJ~L$d8)%d8!)-y4^1Y5XVRbR@j4}ZWx@QkjXYJ7do<ot zqUw1WNe&`I{}o)Gk=e_oIxSJXxe{Y+lEGq<M<v6!cb(in#Pz~*kj1OWI<~49l#bJr zzHT`W3i#m&ruNV!HcG20i{P#huc@v?%6SPORc{Sisf>MUP2@%*;U^JbpS&2r?_-cp z3w7(`vreUgQiP*(UxmI^vgpR6PB-!cJ-(F>eegr_|NYg!D)0Ow-%z0BfAd&X>N++$ z2N|KbWYeA~)`U?PEsg-p_frPPH-!`yAdUo2X`<ragNT3`dgTeAfI;dC{DCy^Uo@xZ z3IiN`xr$5)Y1mqoVeY8)W~Z)y@u1N=$1{{&89wRa66o$#!K4GJ=(OR2mm=^bU*$Wa zmLlcuhwinJ<M&=i8<Qq`!d7jGrR$S`z_Aeem^Rz=9crqLkDaadc6bly3^G-CRmdnw z*8)rEsd+)AgZ^lz$e(tj&DC8+RM1YquO2F=8{gI_k@+?N9>;Ou^%<}Qp2_*FM~Ay} zK6+}UTljOSk#rx&Gd6ZuMt)3AV3^E{Cxwimf@NVj_YjeMrMq@b#W0=&f=nkIyH`S` zwWVuZXtHT>LpuLNZ(iKmU-Tkmh+vmVU2<YUy9g~{lr{ka;#=H@eoh<DHI?oWZ>3cE zw)}FpK#6!&VgcX4{%3u(5fkZVunG=K;UU<%b!mM7PfIi)9_b;EYNbcMAn~w5pl9Yn zWgI;>Mjnf-SZ%r=b7stAk3h~@7C7($v$w%8ap%FHeH@n$zwgwNW*lgzaa8oL+%9V| znpy{ld>03xIDX*YQ9`T+I`}c;p*M~YB3;@jOKrNTGKfcjjA(iA0Mtf<wJQ%D8B(Pk zqROLkAsQ=Pbglbred^SGb0k?uK8f^C>brs2D(9wLk%~`sJ}R6WrtDrC|H;e!JwM@Z zv#~{MS(Ii4ICL7cdVgAMgKVdMFE14;)+6ROuT+Q2uaMNUhhQduLiHvs*?A!NH^y&D z&R%n@ULt$LCppsqKEO09bv>`Wo-H}nHjHdHMs59&Moj2xdwqlQCWrgjFi(6OE@HVW zLZ{@-5KnQ|5q#j9knJVs{PcPq+os->B?Jhf$Lj(rEq?*uRx`Ca&KN+3xrZDWE_5yA z$VIB==%Dx2#ou~d3N=PBM;A`;Fby0@cUlUJ9n7gV*Aa3;eTM<bV?2>JScKGt%N9q~ zgu?w5;jdT}S&<6qWdAOS#6%qzoN~ctCmAT_3u}ksT=YU}P5Rf4h<jbp_)j*W4UDr{ zj9#?aN4IWm=USSq#Sgnm?i?EWIsxW-e8}e5o(9hwee5F1QpPQ8)m3k0bItiIe2Zk! zrdD#&(4i_N8*rIS+Q9fz2g!E;e`f6Wx<`>Fmu%aRlMdHVIW4$W=_34;$Bw?C@59pd zK2fm$snN07<fimCdwMf+bxS}v9G&IK7;NF|x~+?J4wJ&G%{w+4HnXbe;qodvD{bwG z_+N42Vz&7QfmS1Ws6}{ZXjWiWTxVA{P#G-8&a*TE-mQPgAzz7GV?5-RCUs<14f40{ zqj*u)v`^3AyJ2(}&<^st3Tj)IOVvhhm-M+TCe5|g$P{&a)k!ZQad+{Uql@t3ir<HF zg_vq6Q)1@0xbMDF&Iu-2Bq!M>W2po&p~vbAkXK4mZ#Zr{nDR$t!RdP3h;wwhD3|p! zF8=G*@DSyIDeMZ?$sP9!PO;!nWb5Y`QtBHiMHEs*AoW#!k?#Lm3C0hZ;lrqelRm<4 z8s1X&@%~TdeonR)At4Ho!=_9+j`xC{S_46kcw6I(J+;X3`K6aVO%6TkAy*cYnTgd- zq?uVX$b3wsrWw^d@ms7m&>3>ug*HS@`KQ}spP#g`FL9x{li~d025;gHcL6Zo<eifc z9zYZVe=i1)^-qR2B75~aFFWYdeXM(<Wm<ILX9HEiYzHWAO;VeSmj2eNYm?V4q#rLB ztICUvJ<s6T3}9@D%C9F0ZO8rucu6VT3K}RIt8RL_N#g4ae81xgdE3<Haq;-)Hfv9D znMb2*OoIIP*06^+>@vcHZ=|3)AAqo<*m`HjvN|85L7@{(Gg?|#!R6qE=<VDlR`a}0 zrdM~2B&iL;X|Y+(9vHBpHobT5bpShCVQaU1I=xy4@;c*ya}DG83%f*IzwsLh0(kD* z>T6t4x+?xp*%&<;1bl>tE|;AsH{jSNQ^!O4+FuK~ih*`kWpmrg#35qu`o{*_2r*P% zTyYyd;iSBS;`3sxI6k;&PjK#i6z*x59wm@CE`Bf>60xr3y#OtsjI?+aiE$g&c=*=w zYSHb<vk#=;q<HC^7=GBfg0lxOZI5~lr=R;yw!rOeq>M=<c}$BAxdY~ZQDa?)dnrZ? z#7>b2SrMZ4k=$+Yj|zV|idt~1OkP!Fit{2fl~VdoPp>nY@8W;v)_(1AJ1-n;@kvt9 zDflW#0M2$|8Tj$=8s5heSA7D7@*|o{VLRgbin+F*?|>JzAqFg+SFl4f9`)4gBsv#4 z9N;xEfjv~+&Uj(vvjQ1&I7<|eEAXaHx{~%xI#*>cLyPzxnkwlD+H*Wm!kgeboygFI zI5!4Vi}9)J_^n(qRvQRHnX~l++BD*+dCaTJE$=Ge&fMs}2<zVrq+HPDuX4O82;;Qq z^j{#1M=>jQ_)c-XT;O|Pd5rIlIlnZdYZ1q~U0-8iaOtluueNO5`vMb(zQJX1NBYn5 z>mEr4BXoa~pV(yqt#d1oV2o?MwfJuXZ2~$8Xrz~oCJtVl?YG85A5RJcs=1!1XE9)p zcUNp^PjRmd8Ke~nLAf38DpZDJ98TO)at9yNQit0Dfb|B;57tPZHt4o&)Md)@?1}SB zg78}zY>Ng<KEbF&*ar1ZrOwMvIc>P^D*r~YS71BdYAp{I$!Dj@pt%%aY|}85#=sfk zm<T5$*5!6y$mPlC*dF%eYkR6!F4oXQ@l5nZrdpi&OBQSPcUiVd326Q|B@@}R2hwM- zlh4wP3L&x<)BCo6nk0)n#6O|QyYn=*YETfT8(NiVzBe&$dg!td(b}k0q7BE5Iu>SP za%*5SqxzZD^_94SXrd*_&-PWKI?#Ufzm`exkuY#d>q%Sj&|>sSTxNDR=Fe&5(1CMY zs6@&%7ZWg<2YGp-eYbrzUexl$)BT-R5;PNTOpIBq<R{T!W3z-9bk8x&NsaQ3n1IVw zHAX7HOCN&1K^sUF(4&<&2|SH6@|!mM228*g#(erLB#RzDP2`E)Ad|k>THHQR7}-IK zYbz5|skVa{+$Zd{Q>!Uix7`Ld`mTp^g8mBrnjN1Ni*e!w1AcLH-~i1<#I7{{Vz%!K z`seYp!E^pC>6zfz=~xM}(<`@mQpdI1Bbq*}`zssH5{5Qdz0G{L>ps?+bj#f9;n9O_ zll`_m)FE=C@mK5ueOV<@mL1_j7l6zP&}(J5$6R#?c5V{E4TUMvHGwt`#)?ePH$E)W z1pH2D*}2yAz4{=eDSaY6uqSyM@k<5lAl4<8>ETD}1<oi(tpl^{{A%DsM;n=n(J^GL zY1b}}P$?M8@YM=(6YL;@36PS0iu482#p&Q{@T2cXg$4hpBUkZ=nR3YGwjn<G!W0me zmW;ZmQr0u``qjzh;<DlSk1rh6Sd?nUzi245DCZ5~98_79j7#uQq{2dv>*~Qn?pzOE z1iuLeXpz}cOEg*1*7VP)b%WV-(@GzZx#u`2p8854YJJtOI{J^i$ZU<^C)XmQ=K_;V z4Esh-yTfO4R&+Q&{6{WU#!YsqOIO{aN;;iGInuc6SR>m2(=caIZaNViJMFSUq%7R$ zr)#D-l!_1PM(S75Dw7b$OViqh?ooNR9ru{b$Trt!ZA4y&g69jqnvL$PFIE+TDwD=z zY*u8T=?EFn=Gu&F9$E0VRMQ^#c_Adjim_E5%N!@mGahNIHhH8G&v57FXToE>OSssu zFytEDNqxEuy)i%uIMgDi$->=ym0`^Eos0Ka2HD@uf2HY44Q}C8fIgY*U^#A2y1eAm zIt~_w0K&MeBN`G81QJPJzXkcJCMu~Wx^QYb<Om{`dc&51LBHq+PFBGopk6yBl^PWI z%+^&`m!2qKpVul(w75`l2bXV)zApLju0VzVBm(4pK}-AzrAmCHQiui5h@|>lihd%2 z*MqL>-W|VksPyZ3GOtBR9K1p^-O7`md#iSj5kA0Jb%<#xcA?T3RzA^s1N;ktHX(U( z%F&aOfQsMX3Q=l+lZI=-)3Q5`?n~SKMWh;-ii0a{n&W}H^TM<QT{6|z8ijA;h)*o; zzw5(ei9}(bBm-3PTj4!M@|`=)V}rF&l&9Dz5?>^(Im%r0i7J)!$waW&XuznU?88{& zrt#R_JNInou`6pZ>+A4q53~~Y(0tq!RA~Hjx%oniE4*$%*7(0%CsImW;iO5H?%~7; z;t+CmwW7+ZTei@LByNK?HjWa)t@)jq+m%6cjIU+<nu-`=0XkUgq_pzgrucvZo5jLH zSv*tB6GYfQtCA%I4_2`Y$&WqzP9X-LsIp?P9^Y|N&?`rbKE&bZp!v13IQv*Qy#3RZ zCMgUrmf@*rMRFcq0%aKG8e`apyu6;Z9ug_-vVoXm`7NQ?ouk0hLhU=SCB#<0`($Z{ zy7)2?!3TVj_sIMKPcD{f(2vq_KOr*NB_06_sJr_YRe%8ZiZtb60ltnd7J8OLfUo$X z?Qv}AG3jW3J)r}kwL2)M6$6O`1<{cj4n|4%RC?S<Uh25gcPl4hvm4A@!gzdya!EL% z{Yt9c@eIILKYznc_C-7B$>-?cB+~O8e=5`ce(t^M@z&-tH+y+Oz*X)xAeN!c1n;9& zY9NiHrI}A{$D+~)TBRrOKE`!)n#A&GGRxE+3T$#c=p-L<HA0-mE{fKcfZ2qd`wNjH z&5st{20u_*SM5E6Wt;lyo+cbB^D30VinWl#k9diG2=vNm_9l>k03NdkTrrhB=##6B z7O3J?g1uj_0yE&G0+f0CgccXJT#pDcdhD7=0OEjQoUh|CI@_KnyoHH{qNKFo_eB!h zvWMU>1Yk|ovpNQSG`qK*^t#SPj-h!*i&k<}{9gOU3kA7l#cLv^4(7O(VArwHa_v0j zsR`%0IX*toF!F{B=QM$l!KrV;ucwT)-0)weJ~>@l0}1mAMvTY0Z{?%JQ^noLxqlgV zT^z<aN=64r_-(TtLf-L_W2uv%RZ1AeHgkKfNqN)>PfS*#*)VRFQ(1;tY|3!_bm{&2 zU7um1k=4ju5)&9Kx89F>SQn)h&8cZ7)3=p;T$BFJ{Y9HF3jyf(2H8z`3C7V+N6R?t zi!ekc?ZyR&c`+h&X=nL5ob6hiTi4Mda9O1ld|4PHbO${#Xwm}Kf)ljB1ltA%i7Q&H zuZmWW0y;f48GM|a=OFlSklSjZd9^7EZq-7o6Qjij;KA0h-Eumt>yP;kNwsW;G~b3L zohsv-NL=9Y)m)tX>H|~2ELa2|7&+Shdg{Rk=*jh(#5lg&R-}uP-)qsvWDI>Y5yz1X zl|@LCV-wNSF_l=f;0IwxJA?j*ZgDa9Pnxgz-H%sftWalQyM_$e{g(*MWv2-uSg@qa z<9NI_c&8s;Yqa!=TBTz`3u|a@sioM%fS76l0DaUkfMcb%ZaY!e=o6u0QK@_n^`+~F zgimY>I5gJ#VnA5)>vVuYU&74=%#>w5bnK<UFUL{qmm&Fg!NB}krx0{oP_U4tlzAcZ zl;IzBTa?@DrE|c>FFB@~NOZyDhq<MTupB1stSEJ;zf2A5vC(^SUE96{{+nBvnz}%h zF5exT7TVGsba)$#)+um3ilg70Mx!Xun=P-(^~?MBF@L(RF`S2@9pV<_eVJ6wY4$)@ z_4zSu@Cnh!rbhR2l}d%Tj;-wXN{C2sdG}d->*%M8b`Mf6;Cz%MQ<>~j$2&Uqu0Ga8 zhLi=KM4%^v4i?whfb7JIAOsNs&nB6G8`D|?6WOJ~FWPOnwz0P2Xm{7ICDD_vU>v}n z>6#_sn2gy;hjS{Y(tB8C+3a*-B4Ha<91nOh=@QE6;e(aF*ylel4Q+xTSLddpdg2l^ z7P#0(tOZ(30S&I}DJB(OVaRmFFMWzFnjf~jXujS@9=gpCjugSFF&V@x%cJkeiJfgH zg<n52@*j2Ap8u<b$2QKiN+i;PB+1)tlm%_9RfG@gtzAG%zX{nAFB0p3!DTlU6Y^8o z8?(L1cQxPSv{f$})MwLr8=+|WHPq?c(Th%Rbtouttu14dd;|*6H;gR$Fg+Q8v{D>D zKC<;0^t1xshzgsOX;auHD<*#3I~Gm^O&gOO0~_>4;P;D3#kl(f2-HQl`YSj`U)NX8 zK|?Q;X<nUi-o$$3pIY$SiDg%hyH$rhGeIwSxwL73R+f@PSn`se3@}&#n0MBr@1%O& zeDJuc$sNyixl{{UY_ef{tYa004gLxjtw?SfYLrlxa+sg{5tK7ti5twzCO731aiGwa z9IeFt#8>&iDh1nSdo{9P1*u%4g~Q9&GL3Zf_*VQ7<CWviU4$3(S+aBk<Rf6i1S>G} zJp~SYXSs!z0B#p}Y7v1})_%%e6nB<Sc4d5->_e`mb623T6?62UctNzu+;O&naD@h0 z&-gUwxniJCL0XI-$cc0TOFpQpMF(uVc2-+y*?~2Xf<D%1BilvW-jIUx$p8rtPM6x; zU6&y!^z#Tn8OdD-m62AQc$_4Jb#<iCA79d~a--`0E5Mhl%}2YS3(c}iN=$|{*$ub~ zpq!%-_<V!r91W$Bvrl7UhbdFnr%H$LdT_Xpo;I?vSIBiaS+fH01h|3nTY>p(v4?kG zcR4R1?61*LyY-i3h(fKT$5_on1^s#j!=sKDUxlKZZ3k>8ateF|kQH7Ljcin01aw<F z0q6|ZpV4jt%O?q&WQQin6niS~;N&euJb?7pL8i2GYggE_$2Em9(gKk+&t~mu3DD%o zcYf|nueJ2p+IOffzJ4b=0c}9!Vo{w$-0!cX*H&_K)AMW9suiGf0x*meBpnOzQ3nf@ z7_1{vvntO77b;o@*M0cXw;C6DOeSlSNWJkXpEhmL6<;)T!IS!6Gw>ICksb+=53TYN zgJkZwj(VqauPHe;s?B~)yq<ahm(wekY&(;uj*sYyP+o_=Cw8nj&IPisTUC3^-5W|w zdRv@E<voi3I3|dxvT{YI2=u7(1F+H7iX5*7s5j#^Iqm_rg>B#~PQ>6aE_O;I2LPwK zl9ChQebMo*7P@qx+3z1uym5p#__m7-D3!|N@uwm)1>?}9e+nJEUuF!8q(Bi@`qA)5 z<9IH5wT8*Wn?X6WF8eC%5clQ+G!<pyJr4jIX_B*&HryAvml3<KQy$xF<Nn1+mh|8d zXgun!!SmIwMF#BtQJoJP1>9$9V@c^*7HXwaYMd}#j?%J@bWJmsk$wapjL93R3Xiil z(1Kf3P$U3JGTy@&pn@v*;~b{iEbA2#bm-&-+Uot6fddWsLnC{r_Jl33SEMHfIwJXE zF?)j3HqSL~cPs^|FeZK+UBaCu@R1n9B|GOrI?6n$M&7V@J&j9iYSFqhUluyCP?cP4 zoExu-$pRGrp$6T*$gY1Q419{=J(1?3XhMH9^2P01n$DL-x@|8)4^xY5`Vd-&V4$;@ zr|$|b%%NLlx0!yxF9!Rsc#2tvGF3I&s8w?{9GTLml~)L#D<(fW<;=bB{=<G_fUqYp z;NVHoYgtC1!Z{Fu1eb0zE*ooKQqbZ!%-I`++M!D)RM~MNe(HlBulm%c&00pVp6}_j zv1PA)UCHd6=IpNK^d7$r)L4Y<!gnaeuad033Ll$nvK^>FIwsK@wL@iA*~xB}vv*5^ zFh*b;$+<Qdm>zxUW3(|Dc4*p?jb>s&Ljj>|!wM5bfX1xIGv&H%i2kVGbB=Vh843o< z&l;N<ZuPQ-@zPi6-ss0*!qhNN0e79<htuUORwhAfjCJX>`GVi=>5ArXJ5;A*sQ|s+ z2{w~`v=1z(cJ$ViCq40G;R756dy6cn1mV5bxEv@>^`VyldPjjD_qBMs=@W1ZoCd9U ziS%Hj*aRRi!wBuT@7}kj?CK0T%zyGxsyHm|J}*SzJ!QKu!>`N)J00hXm8@a!->p&M zv>0gI_#{e#iytIp(>T-xM+Mr6Kk%c<yL>W*F_{+AwloEdD@=ybE>Q1b{AVa9*TtJ@ zw;!@i!DJQ}dh8TC-qlGtLy@KqlT#GHtMZ7390%dW51Z&^8I#OSAds=#M5Or=qCv}O zVGdH^9UbBoGcAh_)Y7c5QhkMzwh#({H~E%`8!_r&YhYV_XM_?IUyQLqrk0q*7qMa& zmh!GLMV}x3*&-}d>VwRzZ2XS9_$+A*dR&8sLH1lG<2dht$KB2@O%jz3PD$@?$PqeU z%n<|Ht;ez*ZpB6d_TV5@WYUwWA7mq*5X0D@KC_MsjPV-x+wH6Wl4R9g3FF0>fSTLg zsy5=&&Dip(Kx!XOAqq@r%=~+z2D;#L0oUa%ER>tWzWt&9Q0Y3-N!naUkJYhgEIAIE zyvShrY2sjO?e2LgS|)9G;zhb>R!*>e_#@KDwUKhXW4o?L4^^2Tk|s!A;F|4!B15N8 zx9S!1v>c`|!6gb-268eJJxRE2x}0fehr(_A_*x5CZ>&6TRGfPA`{n}Y_M{?@1tX^j zCl#8pF?=5wHc^eE<kVReKNzWI-)Z2UFI}E?a`zc%__r;j)wRFv`&127tb*}2gg-mC z9q73@9DPLPQ{@WA$$wV(;iVvwSWMoFcX1MzqxBysiODJGCb7oAr5B|$lx~)zMqzqT zVI=2|ih-Ua>4_yjU1YQxY+M%;KLs8wf^K?gNrx+`Lsln_$PG6}%G-6;%|SwHa&J>F z;H4Gb-9mvRTG-Hw@Arw{w2UE*F4W(iOlId}n6w)m_%u)QZr=g2#Z2sUqMbpV82)8A zM669Hlt|hJ>Rr*~h<3U-4IQ#O*o)-%u>6QSm=wq$ot7mmf07>y5Gn@$b&@)rN*RO5 z_|33D&5N%2{W$z3Cd9MRSwU5VNsY3vz#R{)Z`eu&Uonlz7TJW15hIMbIr8d1YfLaQ z|H>wg$yD|WatE-dq6FB#f&b<28ZEsZx>31kjG0botk7N^>N=sF7t1S@CZIeCVqO$G zctdp4YqxoB@+kh~HR~t3V;^ZGxxPNDgmwDv&e6;7dAsUeLh5e!{yJS_qX}FnA1(F= z+D+HcgpV;6@H(!}6!_w`$3O~|V|yupjQkua7%p;we`{b0%<8jJG679aJb<t@mbR)f z>5s8$x~7Ep_J_NtqKz@VHPgX`(V)TwtaaCxMoi>IoT6iuO!c0OlPF!bH=3-n?j5f7 zdhdg~mk~qSi7fqrF@yMlIz|pwT?9N*>4z0~#n+*fCg=t^T~$kUwC&Cjr@1X$ug^6c z{f^Id_>S)@E!>&lMDO<RWqt7HetsDi5}aT6OV@lQ(Zc6S%QX`N*fGT0AU$Z^m)JEY zCi&?FAu-`16hfErJTDJD5H^1^Dc~E-HbScd`8b!g8K>C*+;=(4kf($v*VPUd>$-;Q zN|&tjtmruLrs$YEoNr#3WZiS89$N5I8crPiS;ja>DA>7c+FIwO603sASmgU<VcO=w zADmgK)5<ICKrHM{WuqoiP3R-IfVERCWvA=Ij*e3D>4!l(9K1KOOk<lmoU~2f8K3~~ zMp-Q!D)5%`VSwvpR7-;<B}ie-OQDW^H^5LX$(L1<W+YW!D^TGWTcgGrsCs;k@6@K( zk&{E1O8T1a-kOTI-rP@JkJ8DzOi-jj^(4d5BTRz<$rV%6YOGkGBg!fHS*S&nPFNmd zo@&;fUZzcfGr#xM?AQ_k5uEXas=4Eb1g)$wf&L2Jn8r{wd(aJo3$5RwU|dA+P{=nr z6IE_7jvPjmFrDf7-nyLjRH@#%@Q;8DMPiU-Sw8InB$(tY#R7@J%EZsg;C0R2mS%*D zyTxc|H7%~0)C4=?j%6!Ruz#2kIZtE4!zLk~z!=!QRC1l9%fU>}JN^1b$OV|i6c6+Y z;jMEcV%*j=eNiE#o1np&^I@s9-oDzbrp+imp#{0%2#}6X_B9CZE-!^0f0M$D2{cdm z{2Z_y^tif~9fP#IVqN`4y}kOPMB0EqF*Y==aB_)4KvMnHsA4PVOASB>?%cBG064oT zuwww4u>rxmIwRbP!CH?z_dZs%kEj~%I5wqw7CJSK%vh@Ls^4aD5oe7^A&`%wZZbaK z4FnEA+#l!}C@uHaqU3~>7Pg@K2mnPuy1&yTCZL%^+aUh|2l6E-HP<6v;!#*=K>lrj z={RXjwBWT_Kls|nw=ael?lKp_1^lw;-|XMIH<|J?Z*hgipX+fVxS)HSWBf`ommm_4 z=Vf<!-~u1?$DFLfQ(`4ge1Xr>HjjSSoS+XeoH-TX$K`RryOL&AOTYbhP25&J%(}vr zq&0r`Mb1|pZr`o1e$N)2<c}~`;sF-}#Wi@vXLBm9E_zs;Ub#+CoIdpsD=b<`{*p7{ zL}w#=S3>oh_BnpFsR>9@RAwAyXo9v-r)A=~XlIRzY^!183i0rKxlbD9e#SPxFU_v? z8GPs^^#pe1G{?6RwL*J5sK5n5e6SccJ0Pi{JpDT?ggT#=XaIbnez;zA<pVe+zh)vb z?W*1t9j<HplLf5Fv7Di+Z8iGff32NmVn(l2pfNX#usp@1$heToE+N}R{m#<y!a!jn z`AcQ0T(aYQ-D2h36WOe(d_4>GVc$UKjx_o7j}O|$NyWLyL*h*E8z*+su8>vg=N`S) z>yJg^-rqM#%zo}kMM-qx<Cu$gTYtLx!bIAWJBJ-Nu#k6>?M*#zIP!znyWIh@M=2o@ zD-JOhFjf%uZ@?H}w7$3mAj5Cednm7XRZ|EwlN$lb2z<~X5I`y&egYGA)B$W*C0=dN zleT-3vS=4{J<tx}b$k=HM|Z);;Ns8*jOA>_iONJna>%SWUVMsnlY8ub(t}stsdDgn zz2A#0F^-MrT}I^zRQ2mgmXK%Bz7r-VF<KH>Ezlkpk}sUa_-octLJj(!$KysWPC3KT z1<t$uR~oX3EgQ|<Y3G*judgiGm1Lf}yS**_)*_Q?dle4?%w2D*wMoVla~mqkSb<U^ zjo23qaW$$582fxf@}N~VvNC_O>Hrow8h$V5%F4FZ%3}@0*X^X>MiXe0K&z7$Ym=P) zuB@{<uLs+sG3bdzpV)TD?0I)>PUQ8}WCf|4z3H|S*@6so!ETkpYum+wV$;W35HvR* z<PFfifUYgz-04!GRcj(<Rbx@+R)1{?WzGehd-8Fve^(0|6=6-WusLtjt-NYS8_Q)6 z?uYN7LPVDKfqq7CzEh1Xr*o5hTuOP*b0=T8T=%s+T(K+Rwax@BAen!q8SW=ftXoTr zO(q_v%>Dfe{O#A&L<X7`$Kfx#)oO5LV8@qrOo;BAbEij<y<(isG2@|8sX1!gj`Umu zRL1Dp=<awl_3NJB90QkmuLXGVybnQzUBTF!NG#$U|Jwt*M@a#FR_(LW-}%}5a0%P+ zb5WGF$do?Z77o+?ipDxmHAaFjINuGG?NLu;3ZvTN41?G((0X<2eOyw9a>t@{+jD)> z)j)Sq&uY>~r*10-g9THUz^4S#IzTJB4>p$bm;{p6$JDBvY8925DO_rBtV3I!M;1Hz zFYhBP#1qc#ET_TqNgvSB_yDLhP5}8bhyp)=<G|Mu6v4%-2#oT)n!c<YM0T0x-DjcT z`O~zjK+=jl%YGaXNkMFQUu58FPnm6w`<4e$26eAHPL&-$ukO|t^blu%n#;)>>y|`t z!>#CnxB9hijsqITG0Sf+8I_&v^@Z|;G~dS`4AK3uCqJ<(Loz2CK`sKd*=)+ln_<8w zl2*H1RMAFtr+_7M{HM)dD7j{TdR8IlLW%26CNm-oaa~*5j5fNa@qKA|Nl2NSk{yVo zCPQ1Jg!yRhA9432)Q9c<;Zr5$N#thiUr?7Er#bwL{{cbe{wsjpqVtIG^NDrplgEPt zw2H`P=T#{<>GuiX?R5tCwN}~y8R9!AJduvkR}@4Y1tSgJCMLzEj<KlPJ5mK;+yFtg zVK&e<+B8a}r#;x{fQxp5JK!v2f%yj`Fp;t#z&5Lrve@w*wpt8U@gGfR1rIsb?l59X zgpxl1I9>%4B14{4V~kZ?Dl=nsJRq?$YJ)zlM#<@XD%{3>qJb~Ob~%w{2t+T?GcQd_ z>v2w-5d}h&td?bkr>Mh>&dFTkkam_hXwh*3q}{AWPONf*G#fXR>J4QpBDW!v?)AG4 zLmOkCf{XT&+$DeHs#NNvUJMuhE#rp@F9=IjZysZOh-8hJH02nfy0TMzPTn#AaJ1E7 z5~?5{?3Q4R?%!#_l^1gz1&z-@;Z0<hgHH3}W@~G}j1<Fy7P442lB|cS)Nc!7d<>E} zzgu6^HBlJz`v_`zxK$S*maRFz?Yl@KlSv#HU~xam06hpjQDkSy#sMq!Jx)FTYuJ>; z(Mo?ZhSBc3?MbhxporiKPq+6DI_oX#EkU+MFd6QBOu|q}cmq8HEz+qUDzk0T4;yWB zetcz(&%F#=?b=bs5B8-wU!C|sMXkc$_Ge3KA^{aPJb{I8_G32WScg>V`#V-xM3mFe zRF8md4;Z(l>~J1w{&?&_YZ5FQ)MwX{oK&g`x8S3rJqF@fH1Gt#Y>!b_2NfO+R8%YC zR0UkQnyexZWbmjUqgCoT9#fBJA>WG1UO`$va1iu9?imu3a}5MKjw*Yaj{@QeLh^{o z)a&502Q8+N!6!d=xnDidc>qEaHUg5ngsdgPjv{!ew&EZI7SffWT_l}tTwCV@uULLc zwfpcf5FgnQ(!5-$mEdnFE3<4z{-Qv~?XWe@y6tk(fTSss1N31d9Cwp$7$%j-GQEMM z$|xbKI(0zTMoNtvKDHtV3;U?FCwlVc6iTi(Mn+sga-FY=aZtPma)WlF>suaHa_yq* zni?JUVT_ZAf;b{zcht7vQc3^MuR+?PT?Aj-LK_=}gY-u$16>6;A);)1S;?`x7J40O zNc7SxX`#(A+45IqF)#!wjjKtQbnT)W?(`0xoUU=0^RH{+1C$M8b&RPMGuM$6q*47B zs&q=1(4HqirFpxA<QvD#IjNuLAq@f;K3P=Oi9kUUuv}21-Hf2qxwu!*ilqFs_{2e! z;{pf)4FaVJz7${hMJ+Uz;sD)RU1}-An(4zo8IDQ+87=pE)xoMZAP2N<XO*DND=P~u z)VfdY;|%C%oQx;w;DcHFB=hSIu#z$s<fN6l*i8M7>)4@z{vl$HaZ08BQR{oekVY@) zHO?#gB1!7r#9G+lm@h0F2Y!s=kqIsEtX)&6&1t5Y&nV1oj@OnAfCt)u5uJcpeA}hb z4f6C|r{S7qBZGV6ML*_m-eA&0Y(pgAi$~E?{u<aEwsvT3j27D4N9MII1l|9+=0nkC za|a7m|I&7SSf%Eu6mxXF+8?BY&0U3JRSI0tXg&9j59BWx3Qs($&iSvBH(y@l)v7jw z+Wlp>%jQoN#uex!70^EH7Z}HZ6tMfH1CZx=ujl8;AS22Tmd0sT5DaC(GJJ@+EndhO zC2(PqyF*RL0qbz?e3X1C6k19jEqFC6wF*M`Qj5GgE(5(DzB4FBWTdpR1(G=WT7uTg zWiRW!D!k#s8c5E!HVI#?;bXa+>x#r=I5K?@MI@EB>AG1=ke5owHa%R^xJKl8_&d3o z?6Gd)gaO-<yD^YvFy*>vr%C-Y*{k9sx_9!MYOUJt(*>zB_!nC!V8T|xoh@@#4?x0@ za3&(fDLx=NCKc0|Sg{p{Zt2l@Yp0whpA|go>vPg=!3LSVqD=}j2F{xnrK-s&U{W3( z#P3%MxkKWy%u>+d2f3(CJKcqaN{7{`IEXiqwk8*(#L;?BZ6>zRX~QG{W1^(izqqVG z$iIprgLpEK-TkSLr-;x~<F&YV+kthobJ`DukGAn>ZgH~-zEO-xW_2ln+ywZ6Zwg>A z(peUs*y#e~iwM>f_N?%e<J_HKlCnPNx-MN)kjD`p@yVgrU&+LfPRdg5;4erH=`yE| zb4gc&i;nyF>b7UVX_d*6jP%4A?9$akI3;qM408`7LfZgcYyQKi{w%pKBxjpqbc+5# zPXJWIRgkaWuOy)VH(V(9`=gPLbZlCZi>B}Vm~6(+POcGbMlCTb?C)L|(E-lx-gI5Z zT<PfALkkijBhK{QC~xU#t&?DzF-g4@a$vcbo?}fg5uN43NEO_zQS3j-VZ5za#_C0f z^I)SwvL@jI(c~Y~7Z~~D#Z0zWZ81^82V{)N$*?S6Erhw#tm3}N(y`<;V!<M=TpSRS z=$?05F-(C^8U0Qks~zSioHS(bvZ*$dJR7t_$l79L_~fdmKwP+9AD4^2hGYXfIc5&N z7K8t;a(v?p_b~ftp;g}FA7DsXWX{bCt$N5`gyUqj7nRJjb<$}G7za)z-LRrv=u4!W zIRRmBmweb%zo+SK6TinrBuYsCns1oU7mulhHUX}BJ==uevuf6Z2(N;#4>IV^Q-AB@ zpmnB}I@iT^HxH^<oQFzOgLmkik)&g1FkI7pYWij*`#4Ox2R_@3?1cIo<2y`)rKo3Q zH-V#Lb9uSOTnNa{W<dP(C(_3pb<wS#_0!5Xux6akl_&bvWGW3T@ACvlg#3UAL|B{u z95OCg;moBbb!MYLUnYu2t*aBjseru(z8U*VVPGOr>+Yp$kWptoE!Vq+zn4&HPu`tm z_)?kf+n2<`jNE-Zlrd0Kbz@UlAJuq*Afe;y`&e~>=8Vq4*^oYOoTInc1)=CK+hK+p zZO|sNtz2oX9i9*#*_jJf!i35G2PF5;U>GZ5j0NoYx$feDCx6y&5u!Fw%GKzbq7_Gl z4GUu#1JfGQSZE$#syr^UubW4_S1vzh;4?V7NNkM;`IAcqUmwoj6J0A=*y5AgSA?*D z*m%2vA9uS*e0wWe8%)LEskz&2AJgENc$Yb~keLc65<?aEHJF8&Lylw|VCbY>m~4XH zmZysuH$jEbT;td*nXlGZW)eHgK>c6Kek!^6$Iy-Y0IlJV0$<vm{}Sdw27LEHlLw!8 z?UF@YoP1_H8yHne{!Cc(+fXSyg{vS}liH>A%*hycZr@PSi2~XBb}~ibkBBqCjn6zQ z+8Ns=#Y|PB60WcEOn=M>b<<`lTF!N<L>-OzU0+v88_aVfnICRdPjm;+qV5^*&g0ym zON`;;T@wt~?KL_{Pc=nRF2+Z*p?$SmBiiyCRO_B3?+O9O+f*Oc7pB>tnH8IriH&?v zbH|PC6#aP3xNQe97rP<;__^;UvUGfs-)O`@9RC~`X-HC`jN&oVUGq-EpaZcfS5$?5 zH27EuI=3G5t++6geXe4IZecsmwWXfRZD&*d!lH>#Oo_e_TChLosFL;*#o*s%S6VqB z2LQBP19s|JiAOkIkWU%G6FE&wY(TF`mx*k~$hH7?cEHNtp&ewXbO{PghZ5bn_MBMI zt3|>5W*V+3IM`$Cmu{K!Wdo%A7i;YSH7I@&8GN=e@i?5gaE}ir6?_5?s=^<Fa{mX7 z4!(`sp{n{{CA^J?b$;&uDgoM!o^C5^A8S1>J4hx^oEscVUmMQDiHmFkuO%=PlED!j zcujIpQ`EaHSLIzZmecWZu_xQ`U;fu|K99Tis|NcLST%gQ(Fy{u=O=}9oV;X}N2P<& z*oNAv<*xn9<WT$ALmDu+#H7|+K<9WR&_v>!RygT)$73&{*kMcil}ui|sW3U3<dwBn z0YY*V2MXGi4lSDFb}W@voZz{0jt;(%Ak%<F{iP=4VgD(c7FP+5O4`9*R|99S<q3rX ze}lX_IHh};QZQ^!T41eago*a}8XERQ4VHc2K!1PN2@g!`hOWe!c2?c%Z1wj+%kjxX zvnaylSP+izAfQ$kX~K#G)i@EnpMgQ!BGea+yjAG4Ec%Fb^!&nzlVX`H(BQI8zy#SK zJ39W+A;I#tFs&<o-(j;IYIFxVY!eZt?cV>P4Pesc36=1~pe|C0<X9<ii=;>U)fy&c z`7InFV^iFDb`k}iDKz4MJIJmbkO`p4sv@In#LzJimJ6*$X_MbWeQF*87Z9ve0S!`* zBEv#PAN#Rb_h6`XSTAFJA*9u*%uy=;*!S*A$6*B;owG6kIa*?qHL7CVGi6|^UywV{ zPQ>Lq&1qWnkiQi4*CL%bk@O3^0GCaau2?gcF%XTQ^G-AR4#Ni~8s_3YLyM23Hz-QL z^b9h!gTFVMv?|aeayp06%A>UL@1NzEC-F{yAi94S(NZ7GiVj%%4DaLh)&JrgOND)` zf$mlMWsP+kyJMV>9OX*PG;)UGn#nQPKS*CAi$NUX_?m7q<AdM0Kg4ieW1$i7m$B{g zlJJ?Hd*69QTS5w#$eot704*(#y8HKh;DJ<8!tfQxE05Pjt94p;#fFxI!=>B@-ZsE! zdB6CL+G+C46LfprVcphpJ^5``z6u*{&Ex-BwrqieXSq8Hz0cX`&})3krbr5Urw=ju zy{(}h2XI!0Yvotrk%MYsX&CDmG-=}krQ>`tW$0@;Dx<zs>!>VQxubvQ$NoeUrk*un zs@DQ_s;>oU>6&)Zn9-bFx1wh^Us}!>?_zs1u!&5n@kU@ih$4vaDR{M`Jl)xzYQe;O zBxF3pJJT+AVQ@A06->e|EBT-`5(Rj;vi$<)Ff{f|b1vg375altc@#(VVU3NwlpQqi zoj(=4ZWOvs{m|+!3$%{RR<}*nNgn{#9iIwg=htE#Lm8r5mq=DR`VwTcA&%|JCN%EV zRkIs^?4*<K{pgRqb+a$UX$7=7?6p#Iht}=#_6nMRalMeE1OBbuR6WpACnvPi(DDKz zOWg)I`1P6-nHSyfd?>fAJOO=(x%;f6<NY@uRiy3`pqE;L4$U0^#7X^XOr=;ynWLUe zcCM>0?ntS2!TepM+NU-<wvloe{w*G?!8W_mM5z#b>u{@l$o9gosNnZcY<<_I$+l1- zlkXrs6M+B)x(#4#;!k7(S-W-H*tM2z&yk?w@183Y&RtzSdk*q>DhmNsp$^8{N*uIJ zM)Hu55j_S@CTq%F4b@MCX@((;3IAqgqDs>Se}s!w0uk@FFc98z(T?a5PAp-d3>P$i zU2>WT$tdG;2VffV?Y9-$L^jr;8_!C`7yN89*0*x4xe>}*E8K)nG_8TOfk&udSfPVm z2M*of=(k#mdv9OB!j1Iyz@jkMv7vQcr0OtN%<wtB-#6a1>2bxjbo4Vqy!?-WG9J77 zYmR6{yYD7Tkr;qe;cwo_DSd=x;deYE4DvhWT;{Qv@`pO=JBPDG#1%tHwa$O>M#j(d z6)op+KT_ZVCF|6rbw(2*isUrD*Co|SH%};m+j@LHRfhRO*t$}lD))s;6`Dw_TRWNw zvK2fs$S%aN8#q0|qfOrrNCx-3uBqZlL`EE3F0EEKEy0oUq-}$)JUPkx)~<6s(<lH~ zfsA#ocqSWB>)Fk-V#B!&_e5&2dNHa8*miXfVfxcH!+ij@2gLDp510OIpwzaY@%)?@ z42XMOc%x+x4{=-3P7&W#MdH*B*WcESZN3VAA(Xes>`CS#2&$w*+rqNex1lNa{~Q_G z&N#TvY2$I`K0xa&;nyjw6I_sClI0U~%Gnz;B@nBy-cwS2G-&!B!*^wZ%*H@MlTMLM zAkOW*?C1v#HGdL)v`EfMyLPVfD4BdM3p0^v9)o+8{As$YzYYs;cR05Mc`aV`p)<BS zAG|AAC?<oNO%M^R&m0N4zyAyO?>JOqcbF}EJAQh+NYONC+CAOc76@p(ORCbm{D~B` zR>>#JGQ6e>lpX(@)NSJm|0oG;GQ9J0kZH%qlzp&=(q0o>Lw7~{AC!s{+qB0>;;L^J zd=_}rR=wz{YfXr(wcz_A+eJ!S_8$Ze;1@yRPb?cn48OryzgP&`J|hhNt@$mEd<Mxf z2@Pn=5L3j+kN`#ZJF=}E=|6-fjZ;1AGo9}`ol~i&)N$rB`lty%nbd)wLiQqQvj6m% zObMZ|N`^64%f50~l2P|KCmjVYb@f*%>u+pdF=By(rD>8noiW@Op$`9w-vLCsi!<K| zvwWE@!gFVg<tykV*6haDC#H1YeZQNA-_+Iq%Em(Tfgu0TW&Bnl=M)epE&FE*WFSuw zn)ncI*j4NFUahMmh}FX>?fwH0&E|3O%ExyJ<<KkG8DvgsvyeiD^Q`ghE1`SVYLIW2 z`yJO+;)jz$Ph^ch=)pMtDxA^s&>sAuuMC|i^!W}nO@OS)#^!45NZW9c%@&WSAQeL@ zDqRUXO}{D8Vs*BT;`*_}C{TRWa)NhswWJ?zrK@x+u?7bhuR3kupze*ev#OX=Y4(}b zHRw^HtX4Aq7vS3~h8Ofn`WK5{mU8q-4bJsk%{$=!C+Rb>Nhd0ORN#xh3S0<^!Fb{r zy1W#6=s<%F(D%|?azA!pff^`c0PspT5(6fZR{BftQmc{pH@%RjkPYT~PvSnVj@p|{ zVeyYIhaR(Zhn9jTho)yRhPusgzL62Kr&_Q!d?fV4wnDL??Q0?Eg@y>6kBCr4`UFBN zSDIO5wy*)`2}#*bW`sJqW0d5Xf}I!bU`svPVF?t<CeYTML~>_=bj*4}RNG4vzL4#$ zP$V8yTKzEGot9j<(!t+ED_5a_cL>g(dUWXh>TJaHiJGVlm!qtPLtB>~?vP6!@LD6m z!rdoPEM;(?&|fFvLMO~&;9LjllBZOBe5%xYh&1^`*VL8M9a!t1Lr)7W_w$P&8Wld? z+uk4LsdRUc7fb_BIkQ>aIRr8hExO4|T@DMS!sFL<ge2<xneznqDLtwDr2bd9iQa9; zcYP_PEiBt<|JAGm`?JA^AVE+$ji(@O6<Vs**4}Cf+}^J>I24c;*;d<5OLjpzP?SZi z+uDw3S689eqZHU^|0d|HY>?ZdT&!Xg8AZ}N1b(nKvrU(LN{w~1yv~a)yb=D3IF576 zJg?H2#3oQ6gBDr@Cq>hk;1p)hJ6y>A(HCC(PE8SfU6$}G?`}D+ufPy3ISsh->S_s@ z=nHhP<W`2wU@T%WOwM!8`bsG!NAYkVuPd)Mn48fJfNNl3i^eL4?3S_(L<+l-1jplX zu@kLv26VKE<H(C;E{@da<GWW1eB}d@Y%ggO8H^o0E!d(jNduFRMHRaNaj0?R7jE*q zUPT9o9=pa2bsD-(KEuH7A-F9y73J2g=wPqt%TXUOUqij$Erj7nd*qgp2BxsertbEU z4Xrt*e0k=_b*!mcs->-sP;3h``DiFa%De>yi@LXmTU}I5v~9>UP_+XHIxQl6h_%A{ zxTS3-QyO~dQm%I|qa?zrOE7Z_Ft82uc3P+ae}K0QjwZ7by(z^W-L`T>+OY1;p%D4q z4atjO(HO0Nhn4qstU@ouusg)YDv#9i`LV5pvCN-?@mygTJJ<D$xeZ-6L`L;WHjcnj z<Y>=xM#H7x9%)f*uw$9&x?;uNyAHy)IN+A=Q|WDXQrG}CZqns)W3GOy^R)PZA8el{ zD~z&w@2YtY|KQMe){A}7`2*}uhX!ZpWBgnjtxikj+iB}#u)E%A-7G2_sGf*opHv}x z5cS<8>92q%Wh9so;VTZ&emxcK;|2lsA{>KS&>w=WKd}wu>z@_t%n)1FJ0KOL>A}Mf z$Y1;)Ob1Zkky?U|EbH>xMX2n_4gOo~LNYDNy6MFPrB$9JCj+dXDuPc8E4%?X<!A}p zDcWnPqMa$)gatt=Xp2VRtQ@m`*_hdQSD{tXnMEC`6QsfmXd*N=-CtVy@N%&8WYJ@1 zLUB=`vO?eHu>pw+J&Z+Do0<!Os{a~DYpW5%wNqOZp6W{<<>&mWvkpzHPn6h68zvD4 zH+{s2U2%t=5}>pAwWV|6hBZrG<Z(adO;3<mXF(#~X!UIqoV1%3(*T|z{8Og=-Zggk zgdY2Mj+{0KmM(*YVJ*(upo<3Pcy+%@PJ`RgVh7;F?_(ZKrYHn`mOUD)gW$sz?-;yQ zu{AoXai+s{yT(v<j7e#8`yh5SOv}<5r%#HNzoV}B%)&yBbFu$8%`r8g<)An5T>J+; zgv7(tRo5a!sKl?qcn)GFxT~2xQI8u=E`A>|zpd%COXi&=k)<`WHm1Uh)>?Hxq$IO< zedGz(y+w1zc7<ncRkzXZ2+CM;Bt>N7uMdsUM!UArJ@IYUY2CCG))s|3vlL})jZJDW zPk-ztek^_h4`Kh==b2)#07{y81PhKy6(%LlcLyLcJ^h0$2;p^)T4;bWnO)I_N}OCU zsCnY+!Oj4N`O!L2E_mb_+fzIFXcQZ+nd-CPWp9wm-JoIRLkyM@i*bSTOinD7|5j0) zSCm;h8r?~+J!o;(_pG4er*YQB#5bcbwbgu78pk$pI57n>oN_JZAa^drT?IhZct+Hz z3x^N0Ow1{`b>oDzl>t}(vn$2sF`-Mq7C(p!l>kGbv&guWd*h>{5@Kb|Au)L}NGL^i zqILVnM6hcL@u4}ALNZl$^5WmNPymas2MR3U^u<5dlk0|Nhl!ID8OC@H`6Fkib@eW_ zX&Kj1nR8xc%I|HK%<Bw3z*w}yiL#<1g4rC&;H}~+oxn2wATyI@DpDsf_g|*De~$&= z=yC7<*5RVdTEu2O(FaLXhz=$Mg)m~FCL<aIF8w#9C!<c>kt7?zs_JibVgiI5y{{sZ ztsC=n;A6WuRWP?NnCSIVN6qUr#wdN21=ZCWj06XjCbA>)P}vUa=n<ZPuBo>x>rz}3 zIq|)NZGdk(eCS#K1qI^5eYYaujIl+%O~YlMrjCEGf7_E@wM4-WYD-iGog$z?WH~=z z@B%H4L|JGR@S_!46}h1GoD>_CpXC|2Me1&++wKd`>qI#BwiBJS!A;bi8W}4$Txf@p zSEZ{;<e?&dKKV|D>2_lUX<JARRX{3~>@MY0zMFIJc1@a26M)phlylcVFt=p}I>as5 zaj>yT{?3t0YnIoYW4AY#uCC+qA-P~w3=NJt=^Q9?UGO6F*SvppQ;{my)zH=Rin*8U z3tPNVPK9#-gIes38Pg$$!<QVd_AlOr{d!z2*<G7zxO@w(SLwf8tN|z$L(Y7E&l??O z#@_3lmg^eg92;Fp2K(*?UzKq$5mo!wxVbMm%S8H7wTvps?^tO={EN4g(;ewL^dFn= z;xNy6s*lL{=W=5k+EJFH%+lZ;aO?o~TsjEd;1PB{sGk@%@pgr+>;rtUF?}h}tP>G< zU%^<=R#+BN&e(EgjQCpG7-3HM><hBjMM|e~KMcWb7RxT+Q@@W`L2M?S{cM+aSgEn@ zjZ%{EhVzQzfo2~ouPf-gL#|`uaBLs~k1`Nct4&@cg-Pnq7k1?Kri=g=8*7%?G{L0| znl+su@JY}WowyijTVlenFc{KCA=qfM=E!f{<CaJw7`X6>gh>6yf}IT>+~dWPBxNrm z2v~^ZJ_JXd$qX$0M-MLdQ}Czz9F+q;k2Drg{P7WF!ZS=L2^JE!?t{ZWPW|Vb>kg1< zmkXw7-b$qENa*Xv$qdvLj$T?okJ`y<q4{^*K8VC$hg!<J<e)e|UKV<^y?+a<nTsaR zRtQjh)vk}TUI35EkQAAey!ZY@pUn?spz9AuD-zH2YTbspDE!60E)=cFQXvEFJ<u<V zWrA|FJ7}GC!)W(X=rPKKMq+@2<FD(xEHvRkTPYf4MNU3gP{GS-h7AjC%$HN>3;(ol zBurLgj@L&lzqgYudfB?twzxW3bcK|%Z@Z&Z#N-(pE)E=Jq$Mt}W9kKHpjbI|(W%N~ z7kf6|6@&VYJj@6Uu2u5+d({Pt`v<SQjGH|1dgjtLdm=y4!TxPM((#2PL08T6wbx_X zIPAs+BGS^$aF4^{nLzxnwD1B85+^-3Dm2sxMt8;}!xux17d_1VfP~yccwz6j<=<Qa zV;IJKrbr9b%Y);@E=9HQNzj`F3eD+q93*_1^LD((_FOU7O<gwQ7fv_g*8IMzu&d<x z?{tQXf>y^&z!$Dp)SJHmFG_yud`}CzG2GQIqU0BOsVcJrU#w=G!bQ^14Tat@pTal? zN8{^b_m)Vr2b7Zt<#tYSYAe_l_>l|)CEiQ=0}?s;NG^)}f;m_!QPONC=OumVR9MAy zs!T7edz{lkMAGQDQmLo>o)_9C3kUcnXz)ab4NZGNool1mA`+sU>4$!Z_cnGbe$clC z^}-D&z3ncxT%#VRa=HGTP`FNu@@qAkYQN~UI>`uXz_#wCJu&p`b&;u53=tLOygbw9 zO)KmQt&qU0u~}Z1yvo|fCeBIS0tc!+02)8(Iz^76nD7~*O36&F<q=oie9v0-I&?a3 zma5dTM{L~6BEiI3bR<zGiz}jG=VwF5<dV0yLKE@}MtYkeocpnl2TnEX{Yi$ENuWRg z*GHL#4h}{EZ<!>USk~8K$xFx_?*W@i?F0C6&%l4K`j(LRK((=&<;ZQd@hwO(t$y%S ziPS?u*EJIZRwWzsR9cNy8n6)WwuLc4+uc2<W>cfm{1tACS0A*csJ7bqFo&6W@`&Tm zY|)0q%sPdbn7jTcs4m(8!j}B*MEvR?*qYms6tYa~f~1am*X35cW4K`uj+9Ba9eIrb zet)8fuhO#afJYf8$!u?v9ctL{Rhmwk2=0O;KTz$t+88V#=eX2?w?c=^w2M^W;&M4A z61iimHdpv}2Bs4>;iZ#Fw$k)?6qCT1#eHyk-6d{I+=qpAU#yBns~8rO-2EsrJ+(lt z&gMe<Ny{+#tUh~dE2!xevJnofwbrV>_IA`M*rD4}_-@;fgGZ6DQ(67BDw*s!ODiS& zIqPGo&)(O4MEEm`(`ds;Gw_*!C=U&N0cVU8cH~58e2r?^{>{<n!n?w^=746MY?~5* z<R!66IiCg$wF6}$WUIlt^Y4pmOD;hUh=^#$$#@_DDroW0qR#4IkmD(OQcS}b!9m-N z-Yek3_-a+n-Jjj?ApNcn@EYCXvCX-FUdL1S?;;Si1KgvDHrwVxl8ePAtmm{aM?Mf$ zXvNDq6TWCH5~iBq7)rWz&7EYaHpx7ujJfDHIP#l()MD%nVy5Rxys)bIYn6`2!2W~g zF7c_PMcKo4p`XS4oBvuee%^^%9yI0GX{hlZT%M%Q0hcT-wAfA)&uYjBrFy$bc71-r zV{bwL7HO6@ZCMSC>j2w2`1_@+k;nh_YZn>*cm8!4v#^QoEo8|%ZCuChyMnZ&HNm%@ zrPFkgXUcQ>|3n`XR%Q$!sCEXm+{UD)ChYhglJJ0J+ni5rYTp-OS%!Z9^W+H?5XVe} z6;}t4yKAj{RKRsi8l|HgdP_X2Jd)(=sMIr<x#;!|QB?=H9*eI8e;{tO&9gi*RZkjd zBJ59?M07LIM5+x(Ee=sd+P3eh-!xp(N792=55N)4A!rHfZ>0n8LuP{(AF=|{6hSNV z(WKseC>4^Z8OIjmmWia=&vDG0!SV^1`zD+Hl#S!O(_HJ9CZ}_x4(EYDPRoIiLpa|) z;+vLnU*4ONa*<5V<k(rqf|2s$fH^*}@)Y=5(H4Y@YBxJTT?*T|gYlIj1s&l9X>{3s zw_+u?tc4}$XN3)PR3rTYc3F;CFQTKSr5vh2Dgln~_FCnIYT^isXEc)r`?toR96u4= z=y%Y`=xh@%UmR-#*I~s@4m~8!too0Vh%Zt}hlvWKF}Ef&ptZW3;z~H42vl~OIwhr> zR=r!vYmAYQEizuF_ZW|Alx4i6+avpPu0MaVrNS|)=LZ6;16mOkki2LJlubIiaWC6@ zR!@!Ph1x*zUu2xE71|mav>WnaXh)=hajw}wc%Y?)xLlyH;@`0F(!*i;OJT?_Da6Rz zPWHq8-CtP-jukr&x{iGLpd;o{0JrJ`YFAQ^vxxAXRVheL3Cz+4p#7C>+GL)SFvOr& zGY$qSRUDw~=3|@;@t_WH$c<u5tN{dp3<gAtM{S|V!2V?}c9!XMNd;Na%71{P*gxh0 zKtzR1<G6Gw^bL^RMU2QVz;lz;q1(GTsN)e~e;4<FVYS;geIRzaUZ~`PIDt0dowTVU zDc3L(c~o`_S6qAkZQ0`!NhRn2&q;|gOerzb?aL-YIMTCycU2~RcSCSncp{!Uz1p#m z7d($;OuxwR2!M1K^dS7Fba~+4P{#NVl<!QHkW3TBV*f}&?iXX57>9DgN9Q_RXWeD) z_`0P^vq~5SLogh2Yl*uesodw7-po?s*y}>s)>+ukl%&c$(p9WeQ4vbyOftBH;>iGT zkE-6AYjsm^@`R0@mdRf0`My`mTb}9%jWU0V#fRhELe8;6V+;`WX$;@X;o#us&T?|l z&^zzq91;96$FOw+#@+zf6mNENI^bd;hdUS?s6)byYO@S9Dx)V=Bt}ZA14F#iKBi?J zb>2^L$jNEbErD9Fl<}!EQXo<r?mVxq8jm|%*dd-=KLN+<cD7(+jVEi+cM}0)ao*~L zXQtvVQBPVHT=!hw3U$E^lT~m~JXG#Fgfj3Ms*r{h-m}W~{(UTby{xof0PEK30hG`V z35AoeTO(eKRS=@8xEf3TkO5gv`mS}Q7lrEuNOU{C>9aatN6e``R@*hH82tt%R$5No z!HG=NY?H|)2W#W6*-jbdLH{wXHQBqLY4run<*pn<s6rD+of>Uy&qP4vtJ-@1rlY;7 zPcU+!UBs&G82CLJ8U@&v@ce#4*p{@J_3bC&mqQT>?n0<-a*?8s2gkEcjc)C~@N()v ztG~%t&3OS#i>>z8ufpDlmVyg+82MO3><<SJda&en@|c?9dBK|#@8+!1AJeF~$F3u~ zl-F%p^VK(=xK=v{#uQ#5Hl$se9U0Jw!*?{Ty2PDtEML=I9lt)fu~T0-S*JsTnXYJ6 zC(z5!TUprfL-^d*C(p02!|LFrD6nQHOk2@MQal6d+4WhofB%<gw-U19>PjD&;ytWh zuDA$$J8BZ@-=_?8l;|G=hcZ?tLTt2uf+hVT*HgkkB1999xFEb}FoeH49N!j$uuzdX zEb`G%FNOFqHYDacqRisX)_Y6Q4J?zGD={n^$V7=$%kai!(N2YITIOEi7h-|aAb^Dr z%JHd?*tgkQB&nLh55RW*q*Lcs!ULulTgzOn#rfS3folj2H0**tpxR?882`P4FRGG0 z-Zm@txl0}SM_Q$=ooh+=Ls%}%8Y-SWRB8@B{a!-k_V$FCV6Qj3Q~@`m&?h=hx6#2! z<=0Z7LV>Eb6<kh>%5%lsFbeztG#G=t5ed5qBj3pX^Q1q6!OKqL`Y|VAZRjSus6KT? zJgo^l$k1#jJx@23?5OF3u+7cpUm+I~*M;*+{8TUy%xnI14?ZeoGCryd+?0q5<9624 zWi+BDbCg5}RJCq50t|nbR9b7SS|<}pNoqF&S02k2MUv+0hKBkXe1!g}(Dw9AhmxjK z{X_ZHehO}>nO#}F(On=)3KR^~ypJuu%x%~P{>n#q+e~BmyD3{Wj>lFMiRK8dx31*= zO_Nx>hD7-;n+x&#DB9K0hzU#_*S%#Q{)E_s^$KO@a8O>kyK~Wt36szeO301~w1Ka| z0iX|YP-}3VW-8;jF$qD$k~ezLqYU=rq&53@DG1qUlB12&Agjo#BHY{SN}2~f#YHxD z9iVel9?%}iLtDRg)Ua@tuRYZlF?8gqo+{vX+F5tFr!|PSy7RNz9EMDsoo*AfBUm^P zt;09q9^@VUWz+$wdZ!hDl>iFg*C`84xDdqIFGl?$xcFOrQ70{JNu>BMg+8daBBPwp z_BsArlO6Z(5OYVIp5{e@aP80ow>fNw4?tqK%<5`EFw3IjNo+x_O?)It6cgfTp*N}P zM!P5ZRlxk$Vql=w+s5uI16(rFBw!184?*AM2>AfoYBFvi$0MwiF@aL^`79c`ZJT`9 z29UT+bwQuBWTaC35XKS~zTg6)m9MSaqUCB9`CP;`NmIcEsP?I{Vv@N?{MQz3`AW9u z`3FoD{ACy38SVD$Y3ZTEWKEi%SWwUp%%$*$0SpaXX9mJG$i5u(<Cs(^=LN%2&3QVk z9(k;GFp<fP=m4>4uz@%rSv7K$B`!$yb|NOzXCR6WMY~5{$RR4s1J>AIg?x81q&@yu z($W5*3fG``C#LJH41O1YDgaFb0-waO`&O>R>Eu!7VuV?vw+?r)Tm%g7AjCEZ_`ms{ z5IQ_QYXl#uLJmSsjM+{A-2IYU6*{E^I?8aPAKP)!(k66zPJ!xz$UKI#aqY%zF4nG5 zu9K5|Bjb)RU(^XM$kwX@)b`q8(P9S9G(`HmYak{Q0G5Qxqi`}8g_FpitB|bIac=;R z6VV@`qdQ=ya6AAs87R|lGT^rz@p=2+<O=sUBEfX}d8v6OmzEKj748>IBMh0{sgY9E zt~%(HmA(@mgg;Se4WzY-2aXJ`<fP?TYu%qlDRQ-O!Q3)95*(NBu`}cT%SLLD)GFI= zB<iv;#@Yy~rNm?p^y2ERR8Ji)mjcTd*K#5ANK$h0vWu&kTN!0r5yGd%i$bg5ZHh;S zgK*hi*Muvqz)~0RDZ0kB7T~gY;bI{hVFQiHx3gBp+w}<aHRV+>9D^)U5-#w@ohBS- z0h<6(+ld8e1y~mRM7n+xJP16dX*bO_LA6yy@LOhNWb1t1@mpwZ*CA|}6tOua{h;u) zNMj5hJEI*H8utEd=3~k=T{~@P8*xfHKT&UaR2{HSHiisUyDE#dzL*gUD^Q<wB9TgH zs5mXCb8su{U)^?OjICOD%vYvB4_5`UgnZkmOq1^ANV$KXTdlUBeE#c!A}6n6xebZX zLc~HjV9|<EP=8hEc0CQas@YqYtYTa>f5gYz2M*&;OXOnWl9K0@aP3Fl(FpRm<CVs0 zU06$>593^HI8ZOSySuLoP&vWXSwMa;lo#q;C3oSIo#h{|lZK415CaF)7XDBLb6b}^ z$3>R4B>PAGrNGC(&{>Oy>01sz6+7U={+C{B&avHx9pM1zc6|Xo2vRT~M<bo=pPX|p zdczR4l9pS&=5#gNbz<Dt?|eVf_)M8RL}S0GOg^-ceQGS72Yo=HwLV6DC)dROXPsSE z*GqYQ&;|!pkXi|PJtq`)mn*MuH>#p11E;CavS|b8FY^32?h3DEIOI0M_qxk2U>E?~ zA(`vnyaM^=7XEZS{XJ!bw!K5n!eFA}NpP%!Z~BUr^D{;u*5yE2185JWu`kcH>=x5g z%h!SXJmz}7A90rn>rGsv5}bHo4@NPr6#PqbcNC`<%WkYLg1p3aquPuQ66`^51)3HB zqTQtFW+XW+6FCBNWW*ww{L~20=vtMYQ0r!d4M&yb*1#1e49-1CpjU#(*1fe+wGr<5 zRc1Z8&cw=Nz_h!I=@vP64Ov$rM<t>trH!~w73QSa7WHx4+70|}#q_G<aqp0q+GVL$ zeiP0}7xq*gZEdQJ%Y549c!hi}^3jt!Y4*Ucf(oR8`1+u3#!+&-LT=RnCG~Zn6BCs> zGWe~U*x4rjs!6vgmZ6dV>|Yg;VrP~<3GW$ESv;awR!4MTj~tHkb~v|kWzv`tDHB6~ zg$?ARjJv@KKgYVQZGoYDa9CGoljVZ|&tT}NzcwYW4sLG-QV442_=*dL4g<M+9j*L0 zVpIW~8CBg3ewc(uq%+Cg!`K4|Rct}}a9@gU5pN`OwtxDr94rWWovR7@fVdYqW06I{ z%WV!};!YiNx=5$2flC%Z*FiT8;hB*RCLQzcLIXNectswD2Ll;MiTy?_L>@LNyLR6d zeTbImAg+C?K#NxN1;Ub(uJhndxx2+bzJNFQqLqh;NXwNx*NlZ5P~3zK?LpMtbApfc zlbR10?iuNMZs-CIqWc}g#T<4KPIk*aLiN%Ecsy^~<G%XV;G%_h3wqHy=(|gXrv|oi z9Q`%Rsv&6uiOQ_&nDd`Qs%4k9Bu##v+v4yL<8W(tg}Ma*_!L^KJNltMRXVjCWwhU2 zK^s6pjq{;F?o{83LK8b_!mntu32eBr{0kG3)G61mT`?dabyMYR!-4B@UX`11uFVd? zE%^W^B|gVmmknmB3Ek6ru6~X_a~Q)W7BnRIZsC}GlIW>U<ayoG_E(stmd}2~{i9GS z(}$u#9XOYrpzKNbe1iwW+-X1{4`)^T*a@<;duOHTt83O2rk*QEjy-HC1^aTC@=~nN zm-BJ7&7Hh9%XaZ33A>{BswGh}nZeMi!=OnEgE*f|AmqfApwTg&OBhXAD~ftv`E}=M zn2y4CZYDKTuCtn%Ou?-7H8`3u2P*R<(lX(|N~5F5EH8F@f!u5$)d;Tlq=n0Szv;Jg zl!9Haa}?>g>ev?w2~xd(S|*^jx1<+=IqRUq{f#QS>R_P9*P2*@?sFiSmrNxB{!aC1 z*Mvv!mG;~p5wXv|8v6?m^M*_+G+4TuEMGG&8K>iZb){P2{zpfkVQ@A+30Wdjv`d+U zuwZ(7@HCkh8S#sKbHOnud^R|mv`(PY7)CHTg-xVI!6%8qVy~r-H)|S$z;eM*h@Ob& zK>=%H4z0pOL8QJSBci9_A4lK&M?K9l2CLTUe!(HC%n2soI4e&yk-GaLkLaJZ#f7HJ zNVCYv10J?C#0{L&aiqIIOnrq)Ait4d!W}ktg%eBn2VFm$9|I3y<?imAfDWI@i?hWX zEezfNtl5@Mbo>3bf+w6ONZM|tocrYqHfa~&(?LH%{|Sz<+rh;+6T#PBoXxm0v|<5T zyP;IeCoZfEKji<hn0MvrY17Z}U%(SCJ{8Qqz%^-i`t{OAi#}=+)1gTEFj@@Db~%|B zst@{*Swd@I{~Bx?;3XJAd`cO(6&3BiiS+v#yH}e`E5i;o^kzM&QV64}q$2Tv1YuVH zVRgKYjz@l?hkjtnVJHFC`TOmPzc@<HU!*%Yh)uOjIHzK=&qq<e-DgH?Tu>n)Ilj?( zk^RUCUD?5;Edbzg2L)nNsHowB=eFm)_(mw6WnATy)X|s6%{<m|tZft@cBsHgyPTr1 z4$IADsp6rd#<-fR#K58e5OPrUzNK`poAp4}Y0($;JeYaY7qIL#?(fDpeAcZzp(Bq= zw>nd-T@Igu$aF4JZIx(*;1Yj2^+6+9|Ct+4lZ3pqRMDNAFA^z@wzHmZMoA8z!C_>m z_hY%fmzf>uNd3w9F>vh_je2Qvl9Y2dzFGllxGQky3=WQx;mv8VC+D=Bq>?W8;1H94 z_kt>YVbAetwzoPEI-P5@R|WmDyzQi28)Fr@6jAQ<=RnT3rEn+v$5V5~Zv|;F>&ld^ zE2U$=U76Cv1^d6}ZETwO3F3RGPfB&V#dCh6-Jga<b8Nj_jTa?@|B#h7qPU%$7x&xu zgXO`Lf;-NeB4@B-r=*y-n-?5hT7=OS2=L5^tfW=>6m7Hqd7J=e5ax}-hr}ag?QEz_ z-!Qn}w)OE`Sj@@1)sTw>=y%ZmZT&<!H7g&BSAo3A0&;xgW8Lij7MQ2nL0c8z0f`}G z?O;6~v{!nxM$?Y0?zy@1<P#pnIA_&;3^sG!p^04K5H*i)ZHv5B`;X_$A#*9zXDm2! zB)TchrE0<+LvT6K;)ke-%#yYT*HZ_RO(!jXozT{C+EHo1PrGLZ5U1TaM}5a6VHby; z`@<9zx?{JhP77>#00}WIs4A1Z{J=IZIM75KVEV(Yc`<d-4)<;F@5e+lP~{>_q9>R! zR3;m$Qr^i)lTOmV<e;DnZt|hh?gy=^2@tpBi#r`@rDXZWOuLNr168BiV)%KcfpFa< zdyxzz(-T*7pTxRxmg`%RF6i@H53qlfH_~e28e7N<Jp%fHvUsQ^h=XaEax+?3JJ>(I z8)*gq#d$2c;=vYn@x-qrdyE6!$?hCGj!z<J@OhAv3)%*9h+iJW#Rik+CX5vk&boXg zB-5Oo(4vijjxD}42L=I=-PdoCRgd;ue(UxFzwXIO;;niCC8VzC7*9yBO2-h*=U%9* zRkE_;ZnbfPE~vSqRWZ79YK4r8N{m_i9E26rK_gI&J`Id?H-1R54#!6lWEfR?y8(mW z!nOy1Us7x&syZ2Vz+;06;7$^DhBX~~UYS^Hqvzcxx~A)iUI1Tjc87}q_vM+Ew!PO4 zWRl27qMYNXfv-AQ_Mr;hYyv##3s_dT3<?5|&25`k1r#?$h2w4{Y^+6U&e(|?Q^Q~< z1;mNuanG=m2TiIvfa}gHL6&DColvCBqoerLNLxZ^qholcCKD^J$8p7ICP72W0TcOy zm|R@0Sgl-LTm2DS`1=LZctW}*P3NVSK@%Ervy^fuI-ci?jaLRpBHt>>JK9FwBJ4?$ z{})^D5mU=L{T6U#Clb>ksCpuX4L!m19b3WB?Ra%&?iEI&%p@CAnyq{Re2k0@KOV9E zVgb7L)q!t<o#krzu!PMxpUmsfu`kW6f3+lfkl5y;WO9g;Hq{0#KEB(E*3<6vVkp4O z&3#wM6$Z?N6~ZJYFto$Qm0KB?6p7SHVCbW2*SpG>xon&U6-LB<j`}X_#U&A&_vR|a z	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%0A<`!tyr)~kj1mHjX;R4+EfVQCw}rzLZ!KN@+g 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 C72;<A literal 0 HcmV?d00001 From 7e1bd841fef0887e853ce57b8fd4dc3a4af446cd Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 18:18:34 +0000 Subject: [PATCH 35/37] Add banner --- README.md | 6 +++++- {images => doc-assets}/banner.png | Bin 2 files changed, 5 insertions(+), 1 deletion(-) rename {images => doc-assets}/banner.png (100%) diff --git a/README.md b/README.md index 074b8892..71893776 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # Cardinal Creator Standard -## Spec outlining [details](https://cardinal-labs.notion.site/The-Creator-Standard-v1-5fce56a1d8bb440f849205e9fb5befc2) \ No newline at end of file +<div style="text-align: center; width: 100%;"> + <img style="height: 450px" src="./doc-assets/banner.png" /> +</div> + +## Spec outlining [details](https://cardinal-labs.notion.site/The-Creator-Standard-v1-5fce56a1d8bb440f849205e9fb5befc2) diff --git a/images/banner.png b/doc-assets/banner.png similarity index 100% rename from images/banner.png rename to doc-assets/banner.png From 68422033f5789b3aff75ca43cc9d4d2baf5e9219 Mon Sep 17 00:00:00 2001 From: jpbogle <jpbogle22@gmail.com> Date: Thu, 3 Nov 2022 18:22:44 +0000 Subject: [PATCH 36/37] Fix docs --- .github/workflows/publish-docs.yml | 2 +- .github/workflows/publish-js.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 07e3a46c..64c57619 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -31,7 +31,7 @@ jobs: - name: Install Yarn dependencies run: yarn install - run: yarn docs:generate - - run: cp -R images/ site/ + - run: cp -R doc-assets/ site/ - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@v4.2.5 diff --git a/.github/workflows/publish-js.yml b/.github/workflows/publish-js.yml index 8ff3e5b0..0dea4908 100644 --- a/.github/workflows/publish-js.yml +++ b/.github/workflows/publish-js.yml @@ -52,7 +52,7 @@ jobs: - name: Install Yarn dependencies run: yarn install - run: yarn docs:generate - - run: cp -R images/ site/ + - run: cp -R doc-assets/ site/ - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@v4.2.5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7bd51295..5ce83529 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -109,7 +109,7 @@ jobs: - name: Install Yarn dependencies run: yarn install - run: yarn docs:generate - - run: cp -R images/ site/ + - run: cp -R doc-assets/ site/ - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@v4.3.0 From 6a0633e6b22590db392e8fb1f112f9b471146c58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 18:23:28 +0000 Subject: [PATCH 37/37] Bump JamesIves/github-pages-deploy-action from 4.2.5 to 4.4.1 Bumps [JamesIves/github-pages-deploy-action](https://github.com/JamesIves/github-pages-deploy-action) from 4.2.5 to 4.4.1. - [Release notes](https://github.com/JamesIves/github-pages-deploy-action/releases) - [Commits](https://github.com/JamesIves/github-pages-deploy-action/compare/v4.2.5...v4.4.1) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- .github/workflows/publish-docs.yml | 2 +- .github/workflows/publish-js.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 64c57619..bcbaf880 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -34,7 +34,7 @@ jobs: - run: cp -R doc-assets/ site/ - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.2.5 + uses: JamesIves/github-pages-deploy-action@v4.4.1 with: branch: gh-pages folder: site diff --git a/.github/workflows/publish-js.yml b/.github/workflows/publish-js.yml index 0dea4908..0ed5717f 100644 --- a/.github/workflows/publish-js.yml +++ b/.github/workflows/publish-js.yml @@ -55,7 +55,7 @@ jobs: - run: cp -R doc-assets/ site/ - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.2.5 + uses: JamesIves/github-pages-deploy-action@v4.4.1 with: branch: gh-pages folder: site diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5ce83529..92f9ec35 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -112,7 +112,7 @@ jobs: - run: cp -R doc-assets/ site/ - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4.3.0 + uses: JamesIves/github-pages-deploy-action@v4.4.1 with: branch: gh-pages folder: site